Jak używać wyrażeń regularnych (Regex) w programie Microsoft Excel zarówno wewnątrz komórki, jak i pętli
Jak mogę używać wyrażeń regularnych w Excelu i skorzystać z potężnej konfiguracji siatki Excela do manipulacji danymi?
- w komórce funkcja zwracająca dopasowany wzorzec lub zamienioną wartość w łańcuchu znaków.
- Sub do pętli przez kolumnę danych i wyodrębnić dopasowania do sąsiednich komórek.
- jaka konfiguracja jest konieczna?
- jakie są znaki specjalne Excela dla wyrażeń regularnych?
Rozumiem, że Regex nie jest idealny dla wielu situations ( to use or not to use regular expressions?) ponieważ excel może używać Left
, Mid
, Right
, Instr
polecenia typu do podobnych manipulacji.
9 answers
Wyrażenia regularne są używane do dopasowywania wzorców.
Aby użyć w Excelu wykonaj następujące kroki:
Krok 1 : Dodaj odniesienie VBA do "Microsoft VBScript Regular Expressions 5.5"
- wybierz zakładkę " deweloper "(nie mam tej zakładki co mam zrobić?)
- wybierz ikonę "Visual Basic" z sekcji wstążki " Kod "
- w oknie " Microsoft Visual Basic for Applications "wybierz" Narzędzia " z górnego menu.
- Wybierz "Referencje"
- zaznacz pole obok "Microsoft VBScript Regular Expressions 5.5", aby włączyć je do skoroszytu.
- Kliknij " OK "
Krok 2 : zdefiniuj swój wzór
podstawowe definicje:
-
zasięg.
- np.
a-z
dopasowuje małe litery od a do z - np.
0-5
pasuje do dowolnej liczby od 0 do 5
[]
dopasować dokładnie jeden z obiektów wewnątrz tych nawiasy.
- np.
[a]
pasuje do litery a - np.
[abc]
pasuje do pojedynczej litery, która może być a, b lub c - np.
[a-z]
pasuje do każdej małej litery alfabetu.
()
grupuje różne mecze w celu powrotu. Zobacz przykłady poniżej.
{}
mnożnik dla powtarzających się kopii wzoru zdefiniowanego przed nim.
- np.
[a]{2}
pasuje do dwóch kolejnych małych liter a:aa
- np.
[a]{1,3}
pasuje do co najmniej jednej i maksymalnie trzech małych litera
,aa
,aaa
+
Dopasuj co najmniej jeden lub więcej wzorców zdefiniowanych przed nim.
- np.
a+
dopasuje kolejne aa
,aa
,aaa
, i tak dalej
?
Dopasuj zero lub jeden ze wzorców zdefiniowanych przed nim.
- np. wzór może być obecny lub nie, ale może być dopasowany tylko raz.
- np.
[a-z]?
pasuje do pustego łańcucha lub dowolnego dolnego case letter.
*
Dopasuj zero lub więcej wzorca zdefiniowanego przed nim.
- np. symbol wieloznaczny dla wzoru, który może być obecny lub nie.
- np.
[a-z]*
dopasowuje pusty łańcuch lub łańcuch małych liter.
.
pasuje do dowolnego znaku z wyjątkiem newline \n
- np.
a.
dopasowuje dwuznakowy ciąg znaków zaczynający się od a i kończący się czymkolwiek poza\n
|
lub operator
- np.
a|b
oznacza, że można dopasować alboa
, albob
. - np.
red|white|orange
pasuje dokładnie do jednego z kolorów.
^
nie operator
- np.
[^0-9]
znak nie może zawierać liczby - np.
[^aA]
znak nie może być małą literąa
lub wielką literąA
\
ucieka znak specjalny, który następuje (nadpisuje powyższe zachowanie)
- E. g.
\.
,\\
,\(
,\?
,\$
,\^
Wzory Zakotwiczenia:
^
dopasowanie musi nastąpić na początku łańcucha
- np.
^a
pierwszy znak musi być małą literąa
- np.
^[0-9]
pierwszy znak musi być liczbą.
$
dopasowanie musi nastąpić na końcu łańcucha
- np.
a$
ostatni znak musi być małą literąa
pierwszeństwo tabela:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
Predefiniowane Skróty Znaków:
abr same as meaning
\d [0-9] Any single digit
\D [^0-9] Any single character that's not a digit
\w [a-zA-Z0-9_] Any word character
\W [^a-zA-Z0-9_] Any non-word character
\s [ \r\t\n\f] Any space character
\S [^ \r\t\n\f] Any non-space character
\n [\n] New line
Przykład 1: Uruchom jako makro
Poniższe przykładowe makro patrzy na wartość w komórce A1
, aby sprawdzić, czy pierwsze 1 lub 2 znaki są cyframi. Jeśli tak, są one usuwane, a reszta łańcucha jest wyświetlana. Jeśli nie, pojawi się okno informujące, że nie znaleziono dopasowania. Komórka A1
wartości 12abc
zwróci abc
, wartość 1abc
zwróci abc
, wartość abc123
zwróci "Not Matched", ponieważ cyfry nie były na początku łańcucha.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1")
If strPattern <> "" Then
strInput = Myrange.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
End Sub
Przykład 2: Uruchom jako funkcję wewnątrz komórki
Ten przykład jest taki sam jak przykład 1, ale jest ustawiony tak, aby działał jako funkcja wewnątrz komórki. Aby użyć, Zmień kod na ten:
Function simpleCellRegex(Myrange As Range) As String
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim strOutput As String
strPattern = "^[0-9]{1,3}"
If strPattern <> "" Then
strInput = Myrange.Value
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
simpleCellRegex = regEx.Replace(strInput, strReplace)
Else
simpleCellRegex = "Not matched"
End If
End If
End Function
Umieść swoje stringi ("12abc") w komórce A1
. Wprowadź tę formułę =simpleCellRegex(A1)
w komórce B1
, a wynik będzie "abc"
Przykład 3: Loop Through Range
Ten przykład jest taki sam jak przykład 1, ale pętli przez zakres komórek.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A5")
For Each cell In Myrange
If strPattern <> "" Then
strInput = cell.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
Next
End Sub
Przykład 4 : rozdzielanie różnych wzorów
Ten przykład pętli przez zakres (A1
, A2
& A3
) i szuka łańcucha zaczynającego się od trzech cyfr, po których następuje pojedynczy znak alfa, a następnie 4 cyfry numeryczne. Wyjście dzieli wzór dopasowuje do sąsiednich komórek za pomocą ()
. $1
przedstawia pierwszy wzór dopasowany W pierwszym zbiorze ()
.
Private Sub splitUpRegexPattern()
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A3")
For Each C In Myrange
strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
If strPattern <> "" Then
strInput = C.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
C.Offset(0, 1) = regEx.Replace(strInput, "$1")
C.Offset(0, 2) = regEx.Replace(strInput, "$2")
C.Offset(0, 3) = regEx.Replace(strInput, "$3")
Else
C.Offset(0, 1) = "(Not matched)"
End If
End If
Next
End Sub
Wyniki:
Dodatkowe Przykłady Wzorów
String Regex Pattern Explanation
a1aaa [a-zA-Z][0-9][a-zA-Z]{3} Single alpha, single digit, three alpha characters
a1aaa [a-zA-Z]?[0-9][a-zA-Z]{3} May or may not have preceding alpha character
a1aaa [a-zA-Z][0-9][a-zA-Z]{0,3} Single alpha, single digit, 0 to 3 alpha characters
a1aaa [a-zA-Z][0-9][a-zA-Z]* Single alpha, single digit, followed by any number of alpha characters
</i8> \<\/[a-zA-Z][0-9]\> Exact non-word character except any single alpha followed by any single digit
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:32:45
Aby używać wyrażeń regularnych bezpośrednio w formułach programu Excel, pomocna może być następująca funkcja UDF (user defined function). Mniej lub bardziej bezpośrednio eksponuje funkcje wyrażeń regularnych jako funkcję Excela.
Jak to działa
Zajmuje 2-3 parametry.
- tekst do użycia wyrażenia regularnego.
- Wyrażenie regularne.
- łańcuch formatu określający, jak powinien wyglądać wynik. Może zawierać
$0
,$1
,$2
, i tak dalej.$0
jest Cały Mecz,$1
i do góry odpowiadają odpowiednim grupom meczów w wyrażeniu regularnym. Domyślnie$0
.
Niektóre przykłady
Wyodrębnianie adresu e-mail:
=regex("Peter Gordon: [email protected], 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: [email protected], 47", "\w+@\w+\.\w+", "$0")
Wyniki w: [email protected]
Wydobywanie kilku podciągów:
=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")
Wyniki w: E-Mail: [email protected], Name: Peter Gordon
Aby rozdzielić połączony ciąg w pojedynczej komórce na jego składniki w wielu komórkach:
=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "$" & 2)
Wyniki w: Peter Gordon
[email protected]
...
Jak użycie
Aby użyć tego UDF, wykonaj następujące czynności (w przybliżeniu na podstawie tej strony Microsoftu . Mają tam dobre dodatkowe informacje!):
- w Excelu w pliku z włączonym makrem (".xlsm') naciśnij
ALT+F11
, aby otworzyć Edytor Microsoft Visual Basic for Applications. - dodanie referencji VBA do biblioteki wyrażeń regularnych (bezwstydnie skopiowanych z Portland Runners++ answer ):
- Kliknij na narzędzia -> Referencje (proszę przepraszam za Niemiecki zrzut ekranu)
- Znajdź wyrażenia regularne Microsoft VBScript 5.5 na liście i zaznacz pole wyboru obok.
- kliknij OK .
-
Kliknij na Wstaw moduł. Jeśli nadasz modułowi inną nazwę, upewnij się, że moduł nie ma taką samą nazwę jak poniższy UDF (np. nazwanie modułu
Regex
i funkcjaregex
powoduje #NAME! błędy). -
W dużym oknie tekstowym na środku wpisz:
Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object Dim replaceNumber As Integer With inputRegexObj .Global = True .MultiLine = True .IgnoreCase = False .Pattern = matchPattern End With With outputRegexObj .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "\$(\d+)" End With With outReplaceRegexObj .Global = True .MultiLine = True .IgnoreCase = False End With Set inputMatches = inputRegexObj.Execute(strInput) If inputMatches.Count = 0 Then regex = False Else Set replaceMatches = outputRegexObj.Execute(outputPattern) For Each replaceMatch In replaceMatches replaceNumber = replaceMatch.SubMatches(0) outReplaceRegexObj.Pattern = "\$" & replaceNumber If replaceNumber = 0 Then outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value) Else If replaceNumber > inputMatches(0).SubMatches.Count Then 'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "." regex = CVErr(xlErrValue) Exit Function Else outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1)) End If End If Next regex = outputPattern End If End Function
Zapisz i zamknij okno edytora Microsoft Visual Basic for Applications .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 15:17:43
Rozszerzenie na patszim 'S odpowiedź dla tych, którzy się spieszą.
- otwórz skoroszyt programu Excel.
- Alt+F11 aby otworzyć okno VBA / makra.
- Dodaj odwołanie do wyrażenia regularnego w sekcji narzędzia wtedy linki
- i wybranie Microsoft VBScript Wyrażenie regularne 5.5
- wstaw nowy moduł (kod musi znajdować się w module w przeciwnym razie nie działa).
- w nowo wstawionym module,
-
Dodać następujący kod:
Function RegxFunc(strInput As String, regexPattern As String) As String Dim regEx As New RegExp With regEx .Global = True .MultiLine = True .IgnoreCase = False .pattern = regexPattern End With If regEx.Test(strInput) Then Set matches = regEx.Execute(strInput) RegxFunc = matches(0).Value Else RegxFunc = "not matched" End If End Function
Wzór regex jest umieszczony w jednej z komórek i absolute reference jest na nim używany. Funkcja zostanie powiązana ze skoroszytem, w którym została utworzona.
Jeśli istnieje potrzeba, aby była używana w różnych skoroszytach, Zapisz tę funkcję w Personal.XLSB
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38
Oto moja próba:
Function RegParse(ByVal pattern As String, ByVal html As String)
Dim regex As RegExp
Set regex = New RegExp
With regex
.IgnoreCase = True 'ignoring cases while regex engine performs the search.
.pattern = pattern 'declaring regex pattern.
.Global = False 'restricting regex to find only first match.
If .Test(html) Then 'Testing if the pattern matches or not
mStr = .Execute(html)(0) '.Execute(html)(0) will provide the String which matches with Regex
RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
Else
RegParse = "#N/A"
End If
End With
End Function
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 16:10:59
To nie jest bezpośrednia odpowiedź, ale może stanowić bardziej skuteczną alternatywę dla twojej uwagi. Co oznacza, że Arkusze Google mają kilka wbudowanych funkcji Regex , które mogą być bardzo wygodne i pomagają obejść niektóre procedury techniczne w programie Excel. Oczywiście istnieją pewne zalety korzystania z programu Excel na komputerze, ale dla znacznej większości użytkowników Arkusze Google oferują identyczne wrażenia i mogą oferować pewne korzyści w zakresie przenośności i udostępniania dokumentów.
Oferują
REGEXEXTRACT: wyciąga pasujące podłańcuchy zgodnie z wyrażeniem regularnym.
REGEXREPLACE: zastępuje część ciągu tekstowego innym ciągiem tekstowym za pomocą wyrażeń regularnych.
SUBSTITUTE: zastępuje istniejący tekst nowym tekstem w ciągu znaków.
REPLACE: zastępuje część ciągu tekstowego innym ciągiem tekstowym.
Możesz wpisać je bezpośrednio do komórki jak tak i będzie produkować co chcesz
=REGEXMATCH(A2, "[0-9]+")
Oni działa również całkiem dobrze w kombinacjach z innymi funkcjami, takimi jak IF , Jak Tak:
=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")
Miejmy nadzieję, że zapewnia to proste obejście dla użytkowników, którzy czują się wyśmiewani przez komponent VBS Excela.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-26 20:20:20
Musiałem użyć tego jako funkcji komórki (jak SUM
lub VLOOKUP
) i stwierdziłem, że łatwo jest:
- upewnij się, że jesteś w pliku Excel z włączonym makrem (Zapisz jako xlsm).
- Otwórz Narzędzia programistyczne Alt + F11
- Dodaj wyrażenia regularne Microsoft VBScript 5.5 jak w innych odpowiedziach
-
Utwórz następującą funkcję w skoroszycie lub we własnym module:
Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant Dim regex As New VBScript_RegExp_55.RegExp Dim strInput As String strInput = myRange.Value With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = matchPattern End With REGPLACE = regex.Replace(strInput, outputPattern) End Function
Następnie możesz użyć w komórce z
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(np: "A 243 "do " A243")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 16:10:14
Oto regex_subst()
funkcja. Przykłady:
=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo
Oto kod uproszczony(dla mnie prostszy). Nie mogłem dowiedzieć się, jak zbudować odpowiedni wzór wyjściowy, używając powyższego, aby działał jak moje przykłady:
Function regex_subst( _
strInput As String _
, matchPattern As String _
, Optional ByVal replacePattern As String = "" _
) As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp
With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 16:09:43
Aby dodać do wartościowej treści, Chciałbym stworzyć przypomnienie, dlaczego czasami RegEx w VBA nie jest idealny. Nie wszystkie wyrażenia są obsługiwane, ale zamiast tego może rzucić Error 5017
i może pozostawić autora zgadywania(co jestem ofiarą siebie).
Chociaż możemy znaleźć źródła na temat tego, co jest wspierane, pomocne byłoby wiedzieć, które metacharaktery itp. są Nie obsługiwane. Bardziej szczegółowe wyjaśnienie można znaleźć tutaj . Wymienione w tym źródle:
"chociaż" Wyrażenie regularne VBScript ... Wersja 5.5 implementuje sporo podstawowych funkcji regex, których brakowało w poprzednich wersjach VBScript. ... JavaScript i VBScript implementują wyrażenia regularne W Stylu Perla. Brakuje im jednak sporej liczby zaawansowanych funkcji dostępnych w Perlu i innych nowoczesnych smakach wyrażeń regularnych:"
Więc Nie obsługiwane są:
- początek Łańcuch ancor
\A
, alternatywnie użyj karetki^
, aby dopasować pozycję przed pierwszym znakiem w łańcuchu - koniec łańcucha ancor
\Z
, alternatywnie użyj znaku dolara$
, aby dopasować pozycję po ostatnim znaku w łańcuchu
W przypadku, gdy nie jest to możliwe, nie jest to możliwe.]}
Nie jest to jednak możliwe w przypadku, gdy nie jest to możliwe.]}
- Grupowanie Atomowe
- zaborczy Kwantyfikatory
- Unicode np.:
\{uFFFF}
- Nazwane Grupy Przechwytywania . Alternatywnie użyj numerowanych grup przechwytywania
- modyfikatory liniowe, np.:
/i
(wielkość liter) lub/g
(globalny) itp. Ustaw je za pomocąRegExp
Właściwości obiektu >RegExp.Global = True
iRegExp.IgnoreCase = True
, jeśli są dostępne. - Conditionals
-
Komentarze Wyrażeń Regularnych . Dodaj je za pomocą zwykłych komentarzy
'
w skrypcie
Już hit ściany więcej niż raz za pomocą wyrażeń regularnych w VBA. Zazwyczaj z LookBehind
, ale czasami nawet zapominam o modyfikatorach. Sam nie doświadczyłem tych wszystkich wyżej wymienionych tła, ale pomyślałem, że postaram się być obszerny, odnosząc się do bardziej dogłębnych informacji. Zapraszam do komentowania / poprawiania / dodawania. Big shout out to regular-expressions.info dla bogactwa informacji.
P. S. wspomniałeś o zwykłych metodach i funkcjach VBA i mogę potwierdzić one (przynajmniej dla mnie) były pomocne na swój własny sposób, gdzie RegEx zawiedzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-06 09:47:03
nie chcę włączać biblioteki referencyjnej, ponieważ moje Skrypty muszą być przenośne. Linia Dim foo As New VBScript_RegExp_55.RegExp
spowodowała User Defined Type Not Defined
błędy, ale znalazłem rozwiązanie, które zadziałało dla mnie.
Update re comments w / @ chrisneilsen:
Miałem wrażenie, że włączenie biblioteki referencyjnej jest związane z ustawieniami lokalnych komputerów, ale w rzeczywistości jest bezpośrednio związane ze skoroszytem. możesz więc włączyć bibliotekę referencyjną, udostępnić skoroszyt z makrami i użytkownik końcowy nie musiałby również włączać biblioteki. Zastrzeżenie: zaletą późnego wiązania jest to, że programista nie musi się martwić o niewłaściwą wersję biblioteki obiektowej zainstalowanej na komputerze użytkownika. prawdopodobnie nie byłoby to problemem w/ VBScript_RegExp_55.RegExp
bibliotece, ale nie jestem sprzedawany, że" wydajność " benifit jest tego warta dla mnie w tym momencie, ponieważ mówimy o niezauważalnych milisekundach w moim kodzie. Uznałem, że zasługuje to na aktualizację, aby pomóc innym zrozumieć. Jeśli włącz bibliotekę referencyjną, możesz użyć "early bind", ale jeśli tego nie zrobisz, o ile mogę powiedzieć, kod będzie działał dobrze, ale musisz "late bind"{[13] } i stracić na niektórych funkcjach wydajności / debugowania.
Źródło: https://peltiertech.com/Excel/EarlyLateBinding.html
To, co chcesz zrobić, to umieścić przykładowy łańcuch w komórce A1
, a następnie przetestować swój strPattern
. Gdy to działa, dostosuj rng
zgodnie z życzeniem.
Public Sub RegExSearch()
'https://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
Dim regexp As Object
'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
Dim rng As Range, rcell As Range
Dim strInput As String, strPattern As String
Set regexp = CreateObject("vbscript.regexp")
Set rng = ActiveSheet.Range("A1:A1")
strPattern = "([a-z]{2})([0-9]{8})"
'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched
With regexp
.Global = False
.MultiLine = False
.ignoreCase = True
.Pattern = strPattern
End With
For Each rcell In rng.Cells
If strPattern <> "" Then
strInput = rcell.Value
If regexp.test(strInput) Then
MsgBox rcell & " Matched in Cell " & rcell.Address
Else
MsgBox "No Matches!"
End If
End If
Next
End Sub
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-20 01:41:31