Sprawdzenie czy wpis w komórce jest liczbą, na ogół sprowadza się do zastosowania funkcji Excelowej CZY.LICZBA. Oprócz tej opcji, VBA oferuje nam również wbudowaną funkcję VBA IsNumeric. Czym one się różnią? Tego dowiesz się z poniższego artykułu.
Funkcje Excela i funkcje VBA
Obie funkcje mają identyczną i bardzo prostą budowę – jeden argument. Obie zwracają również w wyniku wartość logiczną PRAWDA/FAŁSZ..
Wydawać by się mogło, że mamy do czynienia z rozwiązaniami które wzajemnie się dublują. Funkcje VBA mają jednak to do siebie, że różnią się od 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 od nazw i niefortunnych spolszczeń, 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.
Funkcja oparta o IsNumeric
1 2 3 4 5 6 |
Function bIsNumeric(vWpis As Variant) As Boolean Application.Volatile bIsNumeric = CBool(IsNumeric(vWpis)) End Function |
Funkcja oparta o CZY.LICZBA
1 2 3 4 5 6 |
Function bIsNumber(vWpis As Variant) As Boolean Application.Volatile bIsNumber = CBool(WorksheetFunction.IsNumber(vWpis)) End Function |
Wnioski z porównania
Jak widać, obie funkcje inaczej interpretują niektóre wpisy.
- 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, zaś funkcja CZY.LICZBA zachowuje się w tym temacie inaczej – prawidłowo.
- 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 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 CZY.LICZBA jest wrażliwa na apostrof, ale nie na format komórki (i słusznie).
- 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ą.