Друзья, прошу помочь! Имеется столбец, в каждой ячейке содержится информация примерно такая: "МЕШКИ "ГОЛЬДБАНД ШИРИНА У ОСНОВАНИЯ 13 СМ - 6608 ШТ. МЕШКИ БУМАЖНЫЕ КЛЕЕНЫЕ КЛАПАННЫЕ МНОГОСЛОЙНОГО ТИПА I-5 (ГОСТ 2226-2013)"
Вопрос, как вытащить из ячейки только цифру, которая стоит перед " ШТ." и перенести это значение в соседний столбец? То есть, если смотреть приложенный файл, как автоматизировать проставление информации в столбец B, который я начал заполнять вручную? Таблица имеет огромное количество строк...
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
Пытливый, можно поправить Вашу гениальную формулу, чтобы в случае отрицательного чисел, умножало ячейку на -1? То есть, чтобы в столбце были всегда положительные числа (см. ячейка В5 и С5 в Пример2). Так же обнаружилась проблема - если перед искомым числом стоит пробел и другое число, то формула сцепляет эти два числа в одно (ячейки В4 и С4 в Пример2).
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
Вы вторую формулу из сообщения №3 пробовали применять? Добавим к ней перевод в положительные: =ЕСЛИОШИБКА(ABS(--ПРАВБ(ПОДСТАВИТЬ(ЛЕВБ(A2;ПОИСК(" шт. ";A2)-1);" ";ПОВТОР(" ";50));50));"")
А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
Прошу помощи. 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