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.

Author: Andrei Konstantinov, 2014-03-20

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 liter a, aa, aaa

+ Dopasuj co najmniej jeden lub więcej wzorców zdefiniowanych przed nim.

  • np. a+ dopasuje kolejne a a, 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ć albo a, albo b.
  • 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"

zdjęcie wyników


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:

zdjęcie wyników


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
 1012
Author: Automate This,
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.

  1. tekst do użycia wyrażenia regularnego.
  2. Wyrażenie regularne.
  3. ł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!):

  1. w Excelu w pliku z włączonym makrem (".xlsm') naciśnij ALT+F11, aby otworzyć Edytor Microsoft Visual Basic for Applications.
  2. dodanie referencji VBA do biblioteki wyrażeń regularnych (bezwstydnie skopiowanych z Portland Runners++ answer ):
    1. Kliknij na narzędzia -> Referencje (proszę przepraszam za Niemiecki zrzut ekranu) Narzędzia - > Referencje
    2. Znajdź wyrażenia regularne Microsoft VBScript 5.5 na liście i zaznacz pole wyboru obok.
    3. kliknij OK .
  3. 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 funkcja regex powoduje #NAME! błędy).

    Druga ikona w wierszu ikona - > moduł

  4. 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
    
  5. Zapisz i zamknij okno edytora Microsoft Visual Basic for Applications .

 212
Author: Patrick Böker,
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ą.

  1. otwórz skoroszyt programu Excel.
  2. Alt+F11 aby otworzyć okno VBA / makra.
  3. Dodaj odwołanie do wyrażenia regularnego w sekcji narzędzia wtedy linki
    ![Excel formularz VBA dodaj referencje
  4. i wybranie Microsoft VBScript Wyrażenie regularne 5.5
    ![Excel VBA add regex reference
  5. wstaw nowy moduł (kod musi znajdować się w module w przeciwnym razie nie działa).
    ![Excel VBA insert code module
  6. w nowo wstawionym module,
    ![Excel VBA wstaw kod do modułu
  7. 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
    
  8. Wzór regex jest umieszczony w jednej z komórek i absolute reference jest na nim używany. ![Funkcja regex Excel w użyciu komórki 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

 73
Author: SAm,
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
 28
Author: Vikas Gautam,
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*"),"")

Tutaj wpisz opis obrazka

Miejmy nadzieję, że zapewnia to proste obejście dla użytkowników, którzy czują się wyśmiewani przez komponent VBS Excela.

 11
Author: Alex Roseland,
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:

  1. upewnij się, że jesteś w pliku Excel z włączonym makrem (Zapisz jako xlsm).
  2. Otwórz Narzędzia programistyczne Alt + F11
  3. Dodaj wyrażenia regularne Microsoft VBScript 5.5 jak w innych odpowiedziach
  4. 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
    
  5. Następnie możesz użyć w komórce z =REGPLACE(B1, "(\w) (\d+)", "$1$2") (np: "A 243 "do " A243")

 9
Author: DeezCashews,
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
 5
Author: jgreve,
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 i RegExp.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.

 4
Author: JvdV,
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
 2
Author: FreeSoftwareServers,
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