Ответ 1
Вам нужно получить доступ к совпадениям, чтобы получить номер SDI. Вот функция, которая сделает это (при условии, что на ячейку всего 1 номер SDI).
Для регулярного выражения я использовал "sdi, за которым следует пробел и одно или несколько чисел". У вас было "sdi, а затем пробел и ноль или более чисел". Вы можете просто изменить + на * в моем шаблоне, чтобы вернуться к тому, что у вас было.
Function ExtractSDI(ByVal text As String) As String
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.pattern = "(sdi \d+)"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(text)
If allMatches.count <> 0 Then
result = allMatches.Item(0).submatches.Item(0)
End If
ExtractSDI = result
End Function
Если ячейка может содержать более одного номера SDI, который вы хотите извлечь, вот моя функция RegexExtract. Вы можете передать третий параметр для разделения каждого матча (например, разделять запятыми), и вы вручную вводите шаблон в фактический вызов функции:
Ex) =RegexExtract(A1, "(sdi \d+)", ", ")
Вот:
Function RegexExtract(ByVal text As String, _
ByVal extract_what As String, _
Optional seperator As String = "") As String
Dim i As Long, j As Long
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
For i = 0 To allMatches.count - 1
For j = 0 To allMatches.Item(i).submatches.count - 1
result = result & seperator & allMatches.Item(i).submatches.Item(j)
Next
Next
If Len(result) <> 0 Then
result = Right(result, Len(result) - Len(seperator))
End If
RegexExtract = result
End Function
* Обратите внимание, что я взял "RE.IgnoreCase = True" из моего RegexExtract, но вы можете добавить его обратно или даже добавить в качестве необязательного 4-го параметра, если хотите.