/ / Zwracanie dopasowania regex w VBA (excel) - regex, excel, vba

Zwracanie dopasowania regex w VBA (excel) - regex, excel, vba

Próbuję napisać funkcję dla programu Excel 2010to zajmie komórkę o nieustrukturyzowanym tekście, poszukaj czegoś zwanego wartością sdi i, jeśli zostanie znaleziona, zwróć tę liczbę. Wartość sdi pojawi się jako sdi ####. Potrzebuję zwrócić sdi i kolejne numery, które go śledzą, więc jeśli komórka zawiera "jakiś tekst sdi 1234 trochę więcej tekstu", funkcja zwróci sdi 1234.

To jest moja funkcja:

Function SdiTest(LookIn As String) As String
Dim temp As String
Dim STA As Object
temp = ""

Set SDI = CreateObject("VBScript.RegExp")
SDI.IgnoreCase = True
SDI.Pattern = "sdi [1-9]*"
SDI.Global = True

If SDI.Test(LookIn) Then
temp = SDI.Execute(LookIn)
End If

SdiTest = temp
End Function

Jeśli nie ma numeru sdi, nigdy nie wchodzi do instrukcji if i sumiennie zwraca pusty łańcuch. Jeśli istnieje numer SDA, otrzymam #VALUE!

czego mi brakuje?

Tak, VBScript jest włączony. Dodatkowo, stwierdzam, że frustrujące jest używanie regex w VBA i ciężko znaleźć użyteczne informacje w Internecie. Zostaną docenione linki do dobrych zasobów internetowych.

Dziękuję Ci

Odpowiedzi:

67 dla odpowiedzi № 1

Musisz uzyskać dostęp do meczów, aby uzyskać numer SDI. Oto funkcja, która to zrobi (zakładając, że istnieje tylko 1 numer SDI na komórkę).

W przypadku wyrażenia regularnego użyłem słowa "sdi", po którym następuje spacjai jedna lub więcej liczb. "Masz" sdi, po którym następuje spacja i zero lub więcej liczb. "Możesz po prostu zmienić + na * w moim wzorze, aby wrócić do tego, co miałeś.

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

Jeśli komórka może mieć więcej niż jeden numer SDIchcę wyodrębnić, oto moja funkcja RegexExtract. Możesz przekazać trzeci parametr, aby oddzielić poszczególne dopasowania (jak oddzielone przecinkami) i ręcznie wprowadzić wzorzec w faktycznym wywołaniu funkcji:

Ex) =RegexExtract(A1, "(sdi d+)", ", ")

Tutaj jest:

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

* Proszę zauważyć, że wziąłem "RE.IgnoreCase = True" z mojego RegexExtract, ale możesz dodać go z powrotem, lub nawet dodać jako opcjonalny czwarty parametr, jeśli chcesz.