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.
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.