Jak korzystać z wyrażeń regularnych w programie Excel i korzystać z rozbudowanej konfiguracji Excela do manipulacji danymi?
- Funkcja w komórce, aby zwrócić dopasowany wzór lub zastąpioną wartość w ciągu.
- Sub, aby przejść 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 Regex nie jest idealnym rozwiązaniem dla wielu sytuacjach ( do wykorzystania lub nie używać wyrażeń regularnych? ), Ponieważ Excel można użyć Left
, Mid
, Right
, Instr
polecenia typu podobnych manipulacji.
Like
operatorze , który zapewnia rodzaj lekkiej wersji funkcjonalności w stylu wyrażenia regularnego. Zazwyczaj jest znacznie szybszy niż wyrażenie regularne, nawet jeśli jest zawarty w procedurze podrzędnej lub funkcji.Odpowiedzi:
Wyrażenia regularne są używane do dopasowania wzorca.
Aby użyć w programie Excel, wykonaj następujące kroki:
Krok 1 : Dodaj odniesienie VBA do „Wyrażeń regularnych Microsoft VBScript 5.5”
Krok 2 : Zdefiniuj swój wzór
Podstawowe definicje:
-
Zasięg.a-z
Dopasowuje małe litery od a do z0-5
Pasuje do dowolnej liczby od 0 do 5[]
Dopasuj dokładnie jeden z obiektów w tych nawiasach.[a]
Pasuje do litery a[abc]
Pasuje do jednej litery, która może być a, b lub c[a-z]
Pasuje do dowolnej małej litery alfabetu.()
Grupuje różne dopasowania do celów zwrotu. Zobacz przykłady poniżej.{}
Mnożnik dla powtarzających się kopii zdefiniowanego wcześniej wzoru.[a]{2}
Pasuje do dwóch kolejnych małych liter a:aa
[a]{1,3}
pasuje co najmniej jeden, a maksymalnie trzy niższe literęa
,aa
,aaa
+
Dopasuj co najmniej jeden lub więcej wcześniej zdefiniowanych wzorów.a+
dopasuje rzędu A wa
,aa
,aaa
, i tak dalej?
Dopasuj zero lub jeden ze zdefiniowanych wcześniej wzorców.[a-z]?
Dopasowuje pusty ciąg lub dowolną małą literę.*
Dopasuj zero lub więcej wzorca zdefiniowanego przed nim. - Np. Symbol wieloznaczny dla wzoru, który może, ale nie musi być obecny. - Np.[a-z]*
Dopasowuje pusty ciąg lub ciąg małych liter..
Pasuje do dowolnego znaku z wyjątkiem znaku nowej linii\n
a.
Dopasowuje ciąg dwóch znaków rozpoczynający się od a, a kończący na czymkolwiek oprócz\n
|
LUB operatora|b
Oznacza alboa
albob
można je dopasować.red|white|orange
Pasuje dokładnie do jednego z kolorów.^
NIE operator[^0-9]
Znak nie może zawierać liczby[^aA]
Znak nie może być małymia
lub dużymi literamiA
\
Ucieka specjalnemu znakowi, który następuje (przesłania powyższe zachowanie)\.
,\\
,\(
,\?
,\$
,\^
Wzory kotwiczenia:
^
Dopasowanie musi nastąpić na początku łańcucha^a
Pierwszy znak musi być małą literąa
^[0-9]
Pierwszy znak musi być liczbą.$
Dopasowanie musi nastąpić na końcu ciągua$
Ostatni znak musi być małą literąa
Tabela pierwszeństwa:
Predefiniowane skróty postaci:
Przykład 1 : Uruchom jako makro
Poniższe przykładowe makro sprawdza 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 z informacją, że nie znaleziono dopasowania.A1
Wartości komórek12abc
zwrócąabc
, wartość1abc
zwrócąabc
, wartośćabc123
zwrócą „Niepasujące”, ponieważ cyfry nie były na początku łańcucha.Przykład 2 : Uruchom jako funkcję w komórce
Ten przykład jest taki sam jak w przykładzie 1, ale jest skonfigurowany do działania jako funkcja w komórce. Aby użyć, zmień kod na ten:
Umieść swoje ciągi („12abc”) w komórce
A1
. Wprowadź tę formułę=simpleCellRegex(A1)
w komórce,B1
a wynikiem będzie „abc”.Przykład 3 : Pętla przez zakres
Ten przykład jest taki sam jak w przykładzie 1, ale przechodzi przez szereg komórek.
Przykład 4 : Rozdzielanie różnych wzorów
W tym przykładzie pętla przechodzi przez zakres (
A1
,A2
&A3
) i wyszukuje ciąg rozpoczynający się od trzech cyfr, po których następuje pojedynczy znak alfa, a następnie 4 cyfry. Dane wyjściowe dzielą dopasowania wzorca na sąsiednie komórki za pomocą()
.$1
reprezentuje pierwszy wzór dopasowany w pierwszym zestawie()
.Wyniki:
Dodatkowe przykłady wzorów
źródło
Set regEx = Nothing
. Dostaniesz wyjątki Out Of Memory, gdy ten Sub jest wykonywany wystarczająco często.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Spróbuj przenieść kod do osobnegoModule
.Aby skorzystać z wyrażeń regularnych bezpośrednio w formułach programu Excel, pomocne może być następujące UDF (funkcja zdefiniowana przez użytkownika). Mniej więcej bezpośrednio eksponuje funkcjonalność wyrażeń regularnych jako funkcję programu Excel.
Jak to działa
Zajmuje 2-3 parametry.
$0
,$1
,$2
, i tak dalej.$0
jest całym dopasowaniem,$1
a wartość w górę odpowiada odpowiednim grupom dopasowania w wyrażeniu regularnym. Domyślnie to$0
.Kilka przykładów
Wyodrębnianie adresu e-mail:
Prowadzi do:
[email protected]
Wyodrębnianie kilku podciągów:
Prowadzi do:
E-Mail: [email protected], Name: Peter Gordon
Aby rozdzielić połączony ciąg w jednej komórce na jego składniki w wielu komórkach:
Wyniki w:
Peter Gordon
[email protected]
...Jak używać
Aby użyć tego UDF, wykonaj następujące czynności (w przybliżeniu na podstawie tej strony Microsoft . Mają tam kilka dobrych dodatkowych informacji!):
ALT+F11
aby otworzyć edytor Microsoft Visual Basic for Applications .Kliknij Wstaw moduł . Jeśli nadasz swojemu modułowi inną nazwę, upewnij się, że moduł nie ma takiej samej nazwy jak UDF poniżej (np. Nazwij moduł,
Regex
a funkcjaregex
spowoduje błędy # NAZWA! ).W dużym oknie tekstowym na środku wstaw następujące informacje:
Zapisz i zamknij okno edytora Microsoft Visual Basic for Applications .
źródło
Function foo() As Variant \n foo="Hello World" \n End Function
UDF, aby zobaczyć, czy to działa. Jeśli tak, przejdź do pełnej powyższej kwestii, jeśli nic nie jest zepsute (makra wyłączone?).Rozszerzając patszim jest odpowiedzią dla tych w pośpiechu.
dodaj następujący kod:
Wzorzec wyrażenia regularnego jest umieszczany w jednej z komórek i jest na nim stosowane odwołanie bezwzględne . Funkcja zostanie powiązana ze skoroszytem, w którym została utworzona.
Jeśli zachodzi potrzeba użycia jej w różnych skoroszytach, zapisz funkcję w Personal.XLSB
źródło
Oto moja próba:
źródło
Musiałem użyć tego jako funkcji komórki (jak
SUM
lubVLOOKUP
) i stwierdziłem, że łatwo było:Utwórz następującą funkcję w skoroszycie lub we własnym module:
Następnie możesz użyć w komórce za pomocą
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(np. „A 243” do „A243”)źródło
To nie jest bezpośrednia odpowiedź, ale może stanowić bardziej efektywną alternatywę dla twojego rozważania. Arkusze Google mają kilka wbudowanych funkcji Regex, które mogą być bardzo wygodne i mogą pomóc ominąć niektóre procedury techniczne w Excelu. Oczywiście korzystanie z programu Excel na komputerze ma pewne zalety, ale dla znacznej większości użytkowników Arkusze Google oferują identyczne funkcje i mogą oferować pewne korzyści w zakresie przenoszenia i udostępniania dokumentów.
Oni oferują
REGEXEXTRACT: Wyodrębnia pasujące podciągi zgodnie z wyrażeniem regularnym.
REGEXREPLACE: Zamienia część ciągu tekstowego na inny ciąg tekstowy przy użyciu wyrażeń regularnych.
SUBSTITUTE: Zamienia istniejący tekst na nowy tekst w ciągu.
REPLACE: Zamienia część ciągu tekstowego na inny ciąg tekstowy.
Możesz wpisać je bezpośrednio do takiej komórki i wyprodukować, co chcesz
Działają również całkiem dobrze w połączeniu z innymi funkcjami, takimi jak instrukcje IF , takie jak:
Mamy nadzieję, że zapewnia to proste obejście dla użytkowników, którzy czują się wyśmiewani przez składnik VBS programu Excel.
źródło
Oto
regex_subst()
funkcja. Przykłady:Oto uproszczony kod (w każdym razie prostszy dla mnie). Nie mogłem wymyślić, jak zbudować odpowiedni wzorzec wyjściowy, używając powyższego, aby działał jak moje przykłady:
źródło
Nie chcę włączać biblioteki referencyjnej, ponieważ potrzebuję przenośnych skryptów.
Dim foo As New VBScript_RegExp_55.RegExp
Linia spowodowaneUser Defined Type Not Defined
błędy, ale znalazłem rozwiązanie, które pracowały dla mnie.To, co chcesz zrobić, to wstawić ciąg znaków do komórki
A1
, a następnie przetestowaćstrPattern
. Gdy to zadziała, dostosuj odpowiedniorng
do potrzeb.źródło
VBScript_RegExp_55
biblioteka jest dość wszechobecna, więc niesie ze sobą bardzo małe ryzyko, że nie będzie na konkretnej maszynie docelowej. Zresztą przejście z Early Bound na Late Bound nie rozwiązuje problemu przenośności (kod nadal będzie występował błąd, tylko w czasie wykonywania, a nie w czasie kompilacji)Aby dodać do cennej treści, chciałbym przypomnieć, dlaczego czasami RegEx w VBA nie jest idealny. Nie wszystkie wyrażenia są obsługiwane, ale zamiast tego mogą rzucić
Error 5017
i mogą pozostawić zgadywanie autora (co jest moją ofiarą).Chociaż możemy znaleźć źródła na temat tego, co jest obsługiwane, dobrze byłoby wiedzieć, które metaznaki itp. Nie są obsługiwane. Bardziej szczegółowe wyjaśnienie można znaleźć tutaj . Wspomniane w tym źródle:
Tak więc nie są obsługiwane:
\A
, alternatywnie użyj^
karetki, aby dopasować pozycję przed 1. char w łańcuchu\Z
, alternatywnie użyj$
znaku dolara, aby dopasować pozycję po ostatnim znaku w łańcuchu(?<=a)b
(gdy obsługiwany jest postive LookAhead )(?<!a)b
(podczas gdy negatywne LookAhead jest obsługiwane)\{uFFFF}
/i
(rozróżnianie wielkości 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.'
komentarzami w skrypcieJuż kilkakrotnie uderzyłem w ścianę, używając wyrażeń regularnych w VBA. Zwykle z,
LookBehind
ale czasem nawet zapominam o modyfikatorach. Nie doświadczyłem tych wszystkich wyżej wymienionych środowisk, ale pomyślałem, że staram się być obszerny, odnosząc się do bardziej szczegółowych informacji. Skomentuj / popraw / dodaj. Duże brawa dla regular-expressions.info za bogactwo informacji.PS Wspomniałeś o zwykłych metodach i funkcjach VBA, i mogę potwierdzić, że (przynajmniej dla mnie) były pomocne na własne sposoby, w których RegEx zawiódłby.
źródło