Pchełki VBA, odcinek 20: polskie znaczki

https://xpil.eu/IEAD7

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.

https://xpil.eu/IEAD7

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.