'********************************************************************************************************** ' Nazwa: tylkoCyfry ' Autor: mielk | 2011-07-15 ' ' Opis: Funkcja usuwająca z podanego tekst bazowego wszystkie znaki niebędące cyframi lub ' znakami typowymi dla opisu liczb (minus, kropka i przecinek).' ' Argumenty: ' tekst Tekst bazowy, który ma zostać przerobiony przez tę funkcję. ' W rzeczywistości funkcja może też przyjmować argumenty o innych typach danych niż ' String - jeżeli jest to możliwe argument zostaje przekonwertowany do typu String, ' w przeciwnym razie zwracany jest wyjątek NiedozwolonyTypZmiennej. ' pozostawZnakiSpecjalne ' Opcjonalny argument typu Boolean, określający czy znaki specjalne powszechnie ' stosowane do opisywania liczb (np. minus, kropka czy przecinek) mają być traktowane ' jak cyfry i zwrócone w wyniku funkcji. ' * Jeżeli wartość tego argumentu ustawiona jest na True - zwracany ciąg znaków ' zawiera znaki specjalne. ' * Jeżeli argument ustawiony jest na False, funkcja zwróci tylko cyfry usuwając bez ' wyjątku wszystkie inne znaki. ' * Domyślnie parametr ten ustawiony jest jako True. ' ' Zwraca: ' String Tekst bazowy przetworzony tak, że usunięto z niego wszystkie znaki oprócz cyfr ' (oraz ewentualnie znaków specjalnych - w zależności od podanej wartości argumentu ' pozostawZnakiSpecjalne). ' ' ' ' Wyjątki: ' NiedozwolonyTypZmiennej Zwracany, kiedy parametr podany do tej funkcji nie może zostać ' przekonwertowany do typu String. ' ' ' --- Zmiany ---------------------------------------------------------------------------------------------- ' 2011-07-15 mielk Utworzenie funkcji. ' 2013-05-17 mielk Funkcja akceptuje teraz tylko jeden minus oraz jeden separator ' dziesiętny oraz sprawdza czy są one położone w odpowiednich miejscach ' (np. minus na początku liczby). ' 2013-06-04 mielk Separator dziesiętny nie jest już więcej pobierany z ustawień ' systemowych, ponieważ różnią się one od wewnętrznych ustawień MS Office ' i nie można na nich w tej sytuacji polegać. '********************************************************************************************************** Public Function tylkoCyfry(ByVal text As Variant, _ Optional ByVal pozostawZnakiSpecjalne As Boolean = True) As String Const NAZWA_METODY As String = "tylkoCyfry" '------------------------------------------------------------------------------------------------------ Const MINUS As String = "-" Const PRZECINEK As String = "," Const KROPKA As String = "." '------------------------------------------------------------------------------------------------------ Dim sTekst As String Dim iZnak As Integer Dim sZnak As String Dim iAscii As Integer Dim bPrzecinek As Boolean '------------------------------------------------------------------------------------------------------ 'Funkcja próbuje przekonwertować podany argument do typu String. Jeżeli nie jest to możliwe ---------| '(np. podany argument jest tablicą lub obiektem), wykonywanie kodu przenoszone jest do '| 'wyjątku NiedozwolonyTypZmiennej. '| On Error GoTo NiedozwolonyTypZmiennej '| sTekst = VBA.CStr(text) '| '----------------------------------------------------------------------------------------------------| 'Analizuje kolejno każdy pojedynczy znak tekstu bazowego. For iZnak = 1 To VBA.Len(sTekst) 'Przypisuje do zmiennej [sZnak] pojedynczy znak z tekstu bazowego. sZnak = VBA.Mid$(sTekst, iZnak, 1) 'Sprawdź czy znak analizowany w tym momencie przez pętlę jest cyfrą. ----------------------------| If czyCyfra(sZnak) Then '| '| tylkoCyfry = tylkoCyfry & sZnak '| '| Else '| '| 'Jeżeli parametr [pozostawZnakiSpecjalne] jest ustawiony na, funkcja mus sprawdzić ------| '| 'czy analizowany znak jest minusem, kropką lub przecinkiem. '| '| If pozostawZnakiSpecjalne Then '| '| '| '| '--------------------------------------------------------------------------------| '| '| If sZnak = MINUS Then '| '| '| '| '| '| 'Minus może zostać dodany tylko na początku liczby. Dlatego -------------| '| '| '| 'przed jego dodaniem trzeba sprawdzić czy wynik funkcji nadal jest '| '| '| '| 'pusty. '| '| '| '| If VBA.Len(tylkoCyfry) = 0 Then '| '| '| '| '| '| '| '| 'Co więcej, interesuje nas tylko taki minus, które w tekście ----| '| '| '| '| 'źródłowym poprzedzał bezpośrednio cyfrę (a więc jest pewność, '| '| '| '| '| 'że odnosił się do tej cyfry). '| '| '| '| '| If iZnak < VBA.Len(sTekst) Then '| '| '| '| '| If czyCyfra(VBA.Mid$(sTekst, iZnak + 1, 1)) Then '| '| '| '| '| tylkoCyfry = MINUS '| '| '| '| '| End If '| '| '| '| '| End If '| '| '| '| '| '----------------------------------------------------------------| '| '| '| '| '| '| '| '| End If '| '| '| '| '------------------------------------------------------------------------| '| '| '| '| '| '| 'Liczba może zawierać tylko jeden separator dziesiętny, więc przed dodaniem '| '| '| 'separatora trzeba sprawdzić czy nie został on już dodany wcześniej. '| '| '| ElseIf Not bPrzecinek And (sZnak = PRZECINEK Or sZnak = KROPKA) Then '| '| '| '| '| '| 'Separator dziesiętny nie może znajdować się na początku liczby, musi ---| '| '| '| 'być poprzedziony przynajmniej jedną cyfrą. Dlatego przed dodaniem '| '| '| '| 'separatora trzeba jeszcze sprawdzić czy wynik funkcji posiada już '| '| '| '| 'jakąś cyfrę. '| '| '| '| If VBA.Len(tylkoCyfry) Then '| '| '| '| If VBA.right$(tylkoCyfry, 1) <> MINUS Then '| '| '| '| '| '| '| '| tylkoCyfry = tylkoCyfry & Application.decimalSeparator '| '| '| '| bPrzecinek = True '| '| '| '| '| '| '| '| End If '| '| '| '| End If '| '| '| '| '------------------------------------------------------------------------| '| '| '| '| '| '| '| '| '| End If '| '| '| '--------------------------------------------------------------------------------| '| '| '| '| End If '| '| '-------- [If pozostawZnakiSpecjalne Then] ----------------------------------------------| '| '| End If '| '------------ [If isDigit(sZnak) Then] ----------------------------------------------------------| Next iZnak '========================================================================================================== PunktWyjscia: Exit Function '---------------------------------------------------------------------------------------------------------- NiedozwolonyTypZmiennej: '(...) 'Obsługa błędów dla sytuacji, kiedy parametr podany do funkcji nie może zostać przekonwertowany do typu 'Strign GoTo PunktWyjscia End Function '********************************************************************************************************** ' Nazwa: czyCyfra ' Autor: mielk | 2012-02-19 ' ' Opis: Funkcja sprawdzajšca czy podany znak jest cyfrą. ' ' Argumenty: ' znak Sprawdzany znak. ' Powinien to być tekst składający się z jednego znaku. Jeśli do funkcji zostanie ' przekazany dłuższy tekst, tylko pierwszy znak tego tekstu będzie analizowany, ' pozostałe zostaną zignorowane. ' ' Zwraca: ' Boolean True - jeżeli podany znak jest cyfrą. ' False - jeżeli podany znak nie jest cyfrą. ' ' ' --- Zmiany ---------------------------------------------------------------------------------------------- ' 2012-02-19 mielk Utworzenie funkcji. '********************************************************************************************************** Public Function czyCyfra(ByVal znak As String) As Boolean Const NAZWA_METODY As String = "czyCyfra" '------------------------------------------------------------------------------------------------------ Dim iAscii As Integer '------------------------------------------------------------------------------------------------------ 'Wykorzystuje funkcję Asc pobierajšca kod ASCII danego znaku. iAscii = VBA.Asc(znak) 'Cyfry posiadają kody ASCII od 48 do 57. Jeżeli kod ASCII analizowanego znaku zawiera się w tym 'przedziale, oznacza to, że znak ten jest cyfrą. If iAscii >= 48 And iAscii <= 57 Then czyCyfra = True End If End Function