W dzisiejszej notce podejmę bardzo łatwy z pozoru temat. Sprawdzenie bowiem tego, czy dany wpis w komórce jest liczbą, na ogół ogranicza się do zastosowania funkcji Excelowej CZY.LICZBA. Oprócz tej opcji, biblioteka VBA oferuje nam również wbudowaną funkcję VBA IsNumeric.
Funkcje Excela vs. Funkcje VBA
Obie funkcje mają identyczną i bardzo prostą budowę – jeden argument i wartość typu PRAWDA/FAŁSZ zwracaną w wyniku działania.
Wydawać by się mogło, że mamy do czynienia z rozwiązaniami które wzajemnie się dublują. Programiści Microsoftu jednak zdecydowali, że funkcje VBA docelowo będą się nieco różnić od wbudowanych funkcji Excela.
Doskonałym przykładem jest np. funkcja TRIM znana jako USUŃ.ZBĘDNE.ODSTĘPY, funkcja MID znana jako FRAGMENT.TEKSTU czy też funkcja IsEmpty znana w Excelu jako CZY.PUSTA.
Jak widać, mimo pewnych różnic w działaniu, nazwy funkcji właściwie są takie same w Excelu i VBA! Abstrahując jednak od nazw i niefortunnych spolszczeń, dodam, że podobne różnice występują pomiędzy IsNumeric i CZY.LICZBA, o czym przekonamy się analizując przykłady.
Kody VBA Dla Obu Funkcji
Za punkt wyjścia postanowiłem przyjąć bardzo dobry tekst znaleziony w sieci. Autor w sprytny sposób przedstawił różnice pomiędzy obiema funkcjami. Na potrzeby własnego opracowania skróciłem kod dla obu rozwiązań zyskując podobne wyniki.
W swoich testach bazowałem na tych dwóch kodach.
Function bIsNumeric(vWpis As Variant) As Boolean
Application.Volatile
bIsNumeric = CBool(IsNumeric(vWpis))
End Function
Function bIsNumber(vWpis As Variant) As Boolean
Application.Volatile
bIsNumber = CBool(WorksheetFunction.IsNumber(vWpis))
End Function
Porównanie Obu Rozwiązań
Jak widać, obie funkcje inaczej interpretują niektóre wpisy.
Najważniejsze wnioski są takie:
- IsNumeric traktuje pustą komórkę jak liczbę! Ale nie dotyczy to formuły zwracającej w wyniku pusty ciąg.
- IsNumeric nie traktuje daty jako liczby, natomiast funkcja CZY.LICZBA prawidłowo interpretuje datę jako liczbę (mamy wyrównanie do prawej strony).
- Oczywiście, jeżeli datę wyświetlimy w formacie ogólnym, funkcja IsNumeric zinterpretuje wpis jako liczbę. Czyli jak widać jest ona wrażliwa na format komórki, autor tekstu pisze nawet, że ta funkcja “zgaduje, próbuje sama oszacować” jej wartość.
- Zaskakująca jest niekonsekwencja IsNumeric. Data nie jest liczbą, ale jest nią czas…
- Data połączona z czasem jest jednak podobnie jak sama data, traktowana jako “nie-liczba”.
- Na uwagę zasługują również trzy ostatnie wpisy. IsNumeric traktuje jak liczbę tekst, który zaczyna się i kończy cyfrą, zaś w środku ma pojedynczą literę e lub d. Jest to świadomy zabieg zakładający wsparcie dla naukowej notacji. Jeżeli w Excelu wpiszemy np. 2e3, to program od razu zamieni nam tą wartość na 2000.
- Zaskakujące nieco może być to, że dla IsNumeric nie ma znaczenia czy wpis ten został poprzedzony apostrofem (więc, jest to tekst).
- Funkcja arkuszowa ISNUMBER jest wrażliwa na apostrof, ale nie na format komórki (i słusznie).
Reasumując.
Możemy powiedzieć, że obie funkcje dobrze się uzupełniają. CZY.LICZBA wydaje się być bardziej restrykcyjną i odporną na format, IsNumeric bardziej elastyczną ale niekonsekwentną.