13 stycznia 2009

Wyszukiwanie słów w tekście - Excel VBA

Jak w prosty sposób sprawdzić, czy tekst zawiera podane słowo? Można narzeźbić tak:

Option Explicit Function isSubString(Text As String, Pattern As String, _ Optional isCaseSensitive As Boolean = True) Const SPACE As String = " " '' spacja Dim startPos As Long Dim patternLen As Long Dim textLen As Long Dim nextChar As String Dim prevChar As String Dim comparisonType As VbCompareMethod textLen = Len(Text) patternLen = Len(Pattern) comparisonType = vbBinaryCompare If Not isCaseSensitive Then comparisonType = vbTextCompare End If startPos = InStr(1, Text, Pattern, comparisonType) isSubString = False If startPos > 0 Then '' pattern found -> check if it is a full blown word '' check previous character If startPos > 1 Then '' there is a previous character prevChar = Mid(Text, startPos - 1, 1) Else '' there is no previous character / '' pattern begins the text prevChar = SPACE End If If startPos + patternLen - 1 < textLen Then '' there is a next character nextChar = Mid(Text, startPos + patternLen, 1) Else '' there is no next character / '' pattern ends the text nextChar = SPACE End If If Not (inWord(prevChar) Or inWord(nextChar)) Then isSubString = True End If End If End Function Private Function inWord(character As String) As Boolean Select Case Asc(character) '' see www.asciitable.com/ Case 9, 32 To 47, 58 To 64, 91 To 96, 123 To 127 inWord = False Case Else inWord = True End Select End Function

Można również wykorzystać dodatek do obsługi wyrażeń regularnych w Excelu:

=xlReMatch(TEKST, "\bslowo\b", False)

Patrz również tutaj.

Słowa kluczowe: excel, vba, wyrażenia regularne, regexp, Microsoft VBScript Regular Expressions


24 czerwca 2008

Funkcja LICZ.JEŻELI i wyrażenia regularne.

Zliczanie napisów pasujących do skomplikowanych wzorców można wykonać wykorzystując odmianę funkcji LICZ.JEŻELI (ang. COUNTIF), która zlicza komórki w oparciu o dopasowanie do wzorca opisanego wyrażeniem regularnym.

Function COUNTIFRE(Rng As Range, Pattern As String, _ Optional IgnoreCase As Boolean = True, _ Optional GlobalSearch As Boolean = False) As Long Dim i As Long, j As Long Dim xlRegExp As RegExp Dim xlREMatches As MatchCollection COUNTIFRE = 0 Set xlRegExp = New RegExp With xlRegExp .Global = GlobalSearch .IgnoreCase = IgnoreCase .Pattern = Pattern End With For i = 1 To Rng.Rows.Count For j = 1 To Rng.Columns.Count Set xlREMatches = xlRegExp.Execute(Rng(i, j).Value) COUNTIFRE = COUNTIFRE + xlREMatches.Count Next j Next i Set xlRegExp = Nothing End Function

Zamieszczona poniżej funkcja wymaga dodania do listy referencji biblioteki Microsoft VBScript Regular Expressions.

Słowa kluczowe: excel, vba, wyrażenia regularne, regexp, Microsoft VBScript Regular Expressions


14 maja 2008

Excel -- wyrażenia regularne.

Wyrażenia regularne pozwalają na wyszukiwanie, podstawianie lub usuwanie skomplikowanych wzorców w tekście. Excel domyślnie nie udostępnia wyrażeń regularnych. Nie znajdziemy ich także wśród opcji zaawansowanych.

Przy odrobinie dobrych chęci można jednak rozszerzyć możliwości Excela o ich obsługę. W tym celu można się posłużyć językiem makr wzbogaconym o funkje zawarte w bibliotece VbScript Regular Expressions (np. w wersji 5.5).

Podobnie jak w przypadku innych bibliotek, zanim zaczniemy z nią pracę, należy ją dodać do przygotowywanego projektu:

VbSript RegExp reference

Aby dodatkowo ułatwić sobie pracę z wyrażeniami regularnymi w Excelu napisałem (znowu) dodatek zawierający kilka podstawowych funkcji:

  • xlREFirst -- zwraca pozycję początkową (domyślnie pierwszego) łańcucha znaków w źródłowym napisie pasującego do zadanego wzorca
  • xlRELast -- zwraca pozycję końcową (domyślnie pierwszego) łańcucha znaków w źródłowym napisie pasującego do zadanego wzorca
  • xlREMatch -- sprawdza, czy w źródłowym napisie istnieje dopasowanie do zadanego wzorca
  • xlREMatchCount -- zwraca liczbę dopasowań wzorca w źródłowym napisie
  • xlREReplace -- podmienia łańcuch(y) znaków w źródłowym napisie pasujące do zadanego wzorca
  • xlRESubString -- zwraca (domyślnie pierwszy) łańcuch znaków w źródłowym napisie pasujący do zadanego wzorca
  • xlREMatchLen -- zwraca długość (domyślnie pierwszego) łańcucha znaków w źródłowym napisie pasującego do zadanego wzorca

Po zainstalowaniu dodatku Excel wzbogacony zostaje o wymienione funkcje dostępne w menu "wstaw funkcję":

Excel - wstaw funkcję

w kategorii "Użytkownika":

Excel - wstaw funkcję użytkownika

Słowa kluczowe: excel, vba, addin, makra, wyrażenia regularne, regexp, Microsoft VBScript Regular Expressions