Страницы: 1 2 След.
RSS
Как из текста в ячейке найти информацию по заданной маске?
 
Друзья, прошу помочь!
Имеется столбец, в каждой ячейке содержится информация примерно такая:
"МЕШКИ "ГОЛЬДБАНД ШИРИНА У ОСНОВАНИЯ 13 СМ - 6608 ШТ. МЕШКИ БУМАЖНЫЕ КЛЕЕНЫЕ КЛАПАННЫЕ МНОГОСЛОЙНОГО ТИПА I-5 (ГОСТ 2226-2013)"

Вопрос, как вытащить из ячейки только цифру, которая стоит перед " ШТ." и перенести это значение в соседний столбец?
То есть, если смотреть приложенный файл, как автоматизировать проставление информации в столбец B, который я начал заполнять вручную? Таблица имеет огромное количество строк...
Изменено: 4danila - 20.06.2017 17:58:31 (Добавил файл)
 
Прикрепил файл с примером. Информацию в профиле изменил.
 
=ЕСЛИОШИБКА(--ПСТР(ПСТР(A2;ПОИСК(" шт. ";A2)-6;6);ПОИСК(" ";ПСТР(A2;ПОИСК(" шт. ";A2)-6;6));6);)
Надежнее:
=ЕСЛИОШИБКА(--ПРАВБ(ПОДСТАВИТЬ(ЛЕВБ(A2;ПОИСК(" шт. ";A2)-1);" ";ПОВТОР(" ";50));50);"")
 
Здрасьте.
Под конец рабочего дня - родился монстр:
Код
=ЗНАЧЕН(СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";"\";ДЛСТР(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1))-ДЛСТР(ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";""))-1);ДЛСТР(ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";"\";ДЛСТР(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1))-ДЛСТР(ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";""))-1))-ПОИСК("\";ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";"\";ДЛСТР(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1))-ДЛСТР(ПОДСТАВИТЬ(ЛЕВСИМВ(A2;ПОИСК("ШТ.";A2)-1);" ";""))-1)))))

Вставить в В2 и тянуть вниз. Там, где вылезет #Знач - в этой строке в исходном значении нет "ШТ."
Кому решение нужно - тот пример и рисует.
 
Большое спасибо! Нереально помогли!
 
UDF
Код
Function iKol_vo(cell As String)
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+ (?=ШТ)"
     If .test(cell) Then
       iKol_vo = .Execute(cell)(0)
     Else
       iKol_vo = "Нет количества в ШТ"
     End If
 End With
End Function
 
Kuzmich спасибо Вам тоже!
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

Пытливый, можно поправить Вашу гениальную формулу, чтобы в случае отрицательного чисел, умножало ячейку на -1? То есть, чтобы в столбце были всегда положительные числа (см. ячейка В5 и С5 в Пример2). Так же обнаружилась проблема - если перед искомым числом стоит пробел и другое число, то формула сцепляет эти два числа в одно (ячейки В4 и С4 в Пример2).
 
=ЕСЛИОШИБКА(--ПРАВБ(ПОДСТАВИТЬ(ЛЕВБ(A2;ПОИСК("?шт";A2));"- ";"000000");7);"")
Алексей М.
 
Огромное спасибо, АlехМ !
Формула красивая и работает супер! Только опять те же проблемы, что я описывал в Пример2. Поправить бы их как-нибудь...
 
=ЕСЛИОШИБКА(ABS(-ПРАВБ(ПОДСТАВИТЬ(ЛЕВБ(A2;ПОИСК("?шт";A2));"- ";"000000");7));"")
Алексей М.
 
Цитата
Поправить бы их как-нибудь...
Код
Function iKol_vo(cell As String) As Double
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+ ?(?=ШТ)"
     If .test(cell) Then
       iKol_vo = .Execute(cell)(0)
     Else
       iKol_vo = "Нет количества в ШТ"
     End If
 End With
End Function
 
АlехМ, почти идеально!
Еще бы, чтобы ячейку В4 корректно считала (Пример2), было бы совсем супер.
 
Цитата
Еще бы, чтобы ячейку В4 корректно считала
А вы попробовали последнюю UDF?
 
Цитата
Kuzmich написал:
А вы попробовали последнюю UDF?
Спасибо! Читаю как раз об этом в учебнике для чайников.. Ни разу сам не использовал.
 
Цитата
danil77 написал:
Еще бы, чтобы ячейку В4 корректно считала
А что там не получилось?
В В4 = 133250 без минуса.
PS. понял. там 250 должно быть.
Изменено: АlехМ - 20.06.2017 19:36:59
Алексей М.
 
danil77, не цитируйте без необходимости.

Вы вторую формулу из сообщения №3 пробовали применять? Добавим к ней перевод в положительные:
=ЕСЛИОШИБКА(ABS(--ПРАВБ(ПОДСТАВИТЬ(ЛЕВБ(A2;ПОИСК(" шт. ";A2)-1);" ";ПОВТОР(" ";50));50));"")
 
=ЕСЛИОШИБКА(ABS(-ПРАВБ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ЛЕВБ(A2;ПОИСК("?шт";A2)));" ";"000000");7));"")
Алексей М.
 
АlехМ, теперь вроде идеально работает! Спасибо Вам большое!
vikttur, спасибо Вам тоже! Ваша формула почему то у меня в Примере2 вообще пустые ячейки выдала в В4 и В5.
 
Во втором примере другие данные, без  пробела перед "шт."
Формулу нужно доработать, но уже неинтересно.  Нужно сразу показывать разные исходные данные, а не догонять дополнениями.
 
vikttur, я конечно был неправ, что не выложил весь массив.
Вылезли новые проблемы с исходной базой. Проанализировал всю базу, обнаружил последний обидный но часто повторяющийся косяк с исходными данными. В одной и той же ячейке может быть записано несколько раз "шт". То есть в данном случае нужно либо подсчитывать сумму по каждому повторению "шт" (см строку 65 Пример_мес05_2017) и записать это значение в столбец "Количество шт". Либо видимо что гораздо проще для этих случаев создать новый столбец, в котором подсчитывалось бы количество повторений "шт" в одной ячейке. Как бы это сделать теперь, хотя бы формулу для количества повторений "шт" в одной ячейке...
 
Цитата
подсчитывать сумму по каждому повторению "шт"
Код
Function iKol_vo(cell As String) As Double
Dim mo As Object
Dim n As Integer
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+ ?(?=ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
       For n = 0 To mo.Count - 1
         iKol_vo = iKol_vo + mo.Item(n)
       Next
     Else
       iKol_vo = 0
     End If
 End With
End Function
 
Цитата
для количества повторений "шт" в одной ячейке...
Код
Function iKol_vo_repeat(cell As String) As Double
Dim mo As Object
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+ ?(?=ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
         iKol_vo_repeat = mo.Count
     Else
       iKol_vo_repeat = 0
     End If
 End With
End Function
 
Kuzmich, спасибо Вам огромное! Золотой Вы человек!!!
 
Прошу помощи.
UDF "iKol_vo", которую сделал уважаемый Kuzmich работает почти идеально.
Осталось 2 случая, когда UDF считает не так как надо. (см Пример4.xlsx)
1. Иногда в исходной базе под "ШТ" подразумевается тысячи штук изделия. В таком случае стоит какая-то цифра (иногда целое, иногда дробь) потом всегда пробел и всегда "1000".
2. Вторая проблема связана с тем, что в исходной базе иногда требуемое число разделяет пробел, который нужно удалить, чтобы суммы всех чисел считались правильно.

Понимаю, что исходную UDF допилить нереально, чтобы она учитывала еще и эти два случая. Но я бы мог выделить в базе только строки с проблемой 1 и строки с проблемой 2. А потом их как-то отдельно обработать.
Можно сделать еще 2 UDF для случая 1 и случая 2 ?
 
Цитата
Иногда в исходной базе под "ШТ" подразумевается тысячи штук изделия
Попробуйте такую UDF
Код
Function iKol_vo_1(cell As String) As Double
Dim mo As Object
Dim n As Integer
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+,?\d?\d?(?= 1000 ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
       For n = 0 To mo.Count - 1
         iKol_vo_1 = iKol_vo_1 + mo.Item(n) * 1000
       Next
     Else
       iKol_vo_1 = 0
     End If
 End With
End Function
Цитата
Вторая проблема связана с тем, что в исходной базе иногда требуемое число разделяет пробел
Код
Function iKol_vo(cell As String) As Double
Dim mo As Object
Dim n As Integer
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
     .Pattern = "\d+ ?\d+ ?(?=ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
       For n = 0 To mo.Count - 1
         iKol_vo = iKol_vo + mo.Item(n)
       Next
     Else
       iKol_vo = 0
     End If
 End With
End Function
 
Цитата
Понимаю, что исходную UDF допилить нереально, чтобы она учитывала еще и эти два случая.
Попробуйте так
Код
Function iSumma(cell As String) As Double
Dim mo As Object
Dim n As Integer
 With CreateObject("VBScript.RegExp")
     .Global = True
     .IgnoreCase = True
  If InStr(1, cell, " 1000 ШТ") Then
     .Pattern = "\d+,?\d?\d?(?= 1000 ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
       For n = 0 To mo.Count - 1
         iSumma = iSumma + mo.Item(n) * 1000
       Next
     Else
       iSumma = 0
     End If
  Else
       .Pattern = "\d+ ?\d+ ?(?=ШТ)"
     If .test(cell) Then
       Set mo = .Execute(cell)
       For n = 0 To mo.Count - 1
         iSumma = iSumma + mo.Item(n)
       Next
     Else
       iSumma = 0
     End If
  End If
 End With
End Function
Только у меня по третьей строке получилась сумма 207450 в отличии от вашей 206550
 
Это невероятно, Kuzmich!!! Спасибо Вам огромное!!!
 
Иногда UDF iSumma выдаёт неверное значение. Выделил жёлтым цветом (первые три строки Примера).
Подскажите, пожалуйста, в чём причина?
 
Цитата
в чём причина?
В ваших прошлых примерах было два знака после запятой, а в этом три
Измените строчку
Код
     .Pattern = "\d+,?\d?\d?\d?(?= 1000 ШТ)"
Страницы: 1 2 След.
Наверх