Pchełki VBA, odcinek 20: polskie znaczki

In Pchełki VBA by xpil0 Comments

Niedawno jakaś zbłąkana dusza trafiła na mego bloga w poszukiwaniu metody na znalezienie w tekście, za pomocą VBA, polskich znaków. Z kontekstu domyśliłem się, że nie chodzi o znaki drogowe. Drogą intensywnej dedukcji wykoncypowałem nawet, że chodzi o polskie znaki diakrytyczne, czyli tzw. „ogonki”.

W dzisiejszym odcinku „Pchełek” pokażę w jaki sposób wyłuskać polskie literki z tekstu.

Zadanie: napisać funkcję, która z zadanego tekstu zwróci wyłącznie polskie znaki diakrytyczne (żźćńąśłęó – zarówno wielkie jak i małe litery). Na przykład ze słowa „ugrzęźliśmy” zwróci „ęźś”, a ze zdania „pójdźże między grząskie kłódki” zwróci „óźżęąłó”.

Tradycyjnie, najpierw rozwiązanie:

Option Explicit

Const C_POLSKIE As String = "ŻŹĆŃĄŚŁĘÓżźćńąśłęó"

Public Function PolskieZnaki(ByVal strTekst As String) As String
  Dim strWynik As String
  Dim i As Long
  strWynik = ""
  For i = 1 To Len(strTekst)
    If InStr(1, C_POLSKIE, Mid(strTekst, i, 1)) > 0 Then
      strWynik = strWynik & Mid(strTekst, i, 1)
    End If
  Next i
  PolskieZnaki = strWynik
End Function

Teraz odrobina objaśnień:

Option Explicit

Wiadomo. Było ze sto razy, proszę sobie poszukać w poprzednich pchełkach.

Const C_POLSKIE As String = "ŻŹĆŃĄŚŁĘÓżźćńąśłęó"

Tutaj definiujemy stałą o nazwie C_POLSKIE i przypisujemy jej wartość ŻŹĆŃĄŚŁĘÓżźćńąśłęó (czyli wszystkie polskie literki, każda raz).

Public Function PolskieZnaki(ByVal strTekst As String) As String

Nagłówek funkcji.

  Dim strWynik As String

Tymczasowa zmienna, na początku pusta, w trakcie działania funkcji będzie przechowywać wszystkie dotychczas znalezione polskie litery.

  Dim i As Long

Zmienna pętli, będziemy iterować od pierwszej do ostatniej litery tekstu wejściowego, sprawdzając każdą jego literkę pod względem „polskości”.

  strWynik = ""

Zerujemy wynik (w zasadzie niepotrzebnie, bo zmienne typu String są domyślnie wyzerowane, ale warto mieć taki odruch na przyszłość).

  For i = 1 To Len(strTekst)

Początek pętli. Startujemy od i=1 (pierwszy znak tekstu wejściowego).

    If InStr(1, C_POLSKIE, Mid(strTekst, i, 1)) > 0 Then

Wbudowana funkcja InStr zwraca pozycję, na której w zadanym łańcuchu tekstowym odnaleziono poszukiwany inny łańcuch tekstowy (lub zero jeżeli takowy nie występuje). W tym przypadku poszukiwane jest Mid(strTekst, i, 1) (czyli i-ta litera z tekstu wejściowego), a przeszukiwanym łańcuchem jest C_POLSKIE. Jeżeli funkcja InStr zwróci wartość większą od zera, to znaczy, że literka jest polska i trzeba ją dodać do wyniku.

      strWynik = strWynik & Mid(strTekst, i, 1)

… i trzeba ją dodać do wyniku.

    End If
  Next i

Koniec warunku, koniec pętli.

  PolskieZnaki = strWynik

Zwracamy wartość

End Function

Koniec funkcji.

Sprawdzamy czy działa: Ctrl-G, i piszemy:

? PolskieZnaki("ęąnazdjyhsadfółśasdfasdfĆŃĄŚÓ")
ęąółśĆŃĄŚÓ

? PolskieZnaki("Zażółć gęślą jaźń")
żółćęśąźń

? PolskieZnaki("Ósmą klątwę źdźblarze długo przeżuwali")
Óąąęźźłż

? PolskieZnaki("Jaźń ma błąka się wśród żałobnych marć")
źńłąęśóżłć

? PolskieZnaki("żółć")
żółć

Przypuszczam, że istnieją bardziej zaawansowane (i prawdopodobnie sporo szybsze) metody na wyszukiwanie polskich liter. Tutaj, żeby zmieścić się w kategorii „pchełki”, uprościłem zagadnienie do minimum.

Dodaj komentarz

Bądź pierwszy!

Powiadom o
avatar
wpDiscuz