Niektóre funkcje obliczeniowe w Excelu posiadają swoje odpowiedniki w VBA. Pomimo takiej samej nazwy, mają nieco inną budowę lub zwracają inny wynik. Jedną z nich jest funkcja TRIM, która służy do usuwania zbędnych spacji z tekstu. Okazuje się, że nawet tak błaha czynność może być wykonywana na różne sposoby.
Funkcje z taką samą nazwą
VBA posiada w swojej kolekcji funkcję TRIM, która służy do usuwania z tekstu zbędnych spacji. Ma ona w Excelu swój odpowiednik pod taką samą nazwą. Mowa tutaj oczywiście o anglojęzycznej wersji Excela, ponieważ w wersji polskiej, ta funkcja nazywa się USUŃ.ZBĘDNE.ODSTĘPY.
Nie chcę się pastwić nad tym niefortunnym spolszczeniem, chociaż USUŃ.ZBĘDNE.ODSTĘPY stanowi chyba najbardziej jaskrawy przykład złego tłumaczenia.
Pomimo takiej samej nazwy – funkcje Excela często różnią się nieznacznie od funkcji VBA.
Widać to nie tylko na przykładzie funkcji tekstowych, ale także w funkcjach zaokrąglających. Dla przykładu, funkcje ROUND – pomimo tej samej nazwy – stosują nieco inne algorytmy zaokrąglające. ROUND w wersji arkuszowej zaokrągla cyfrę 5 w górę, natomiast ROUND w wersji VBA stosuje tzw. algorytm bankierski. Polega on na tym, że funkcja zaokrągla cyfrę 5 w górę lub dół, zależnie od tego czy cyfra poprzedzająca piątkę jest parzysta lub nieparzysta.
Zamierzona niekonsekwencja?
Różnice pomiędzy funkcjami Excela, a funkcjami VBA możemy postrzegać jako pewną niekonsekwencję programistów Microsoftu,. Możemy sądzić, że skoro funkcja nazywa się tak samo, to powinna również działać tak samo.
Prawda jest jednak taka, że funkcje te mają inną genezę i nie powinniśmy ich ze sobą porównywać. Lepiej potraktować je jako wzajemnie się uzupełniające.
Porównanie rozwiązań
W naszych makrach możemy wykorzystać zarówno wbudowaną funkcję VBA, jak i funkcję Excela. Jakie są między nimi różnice?
Funkcja arkuszowa TRIM jest lepsza ponieważ usuwa wszystkie nadmiarowe spacje. Nie ma więc znaczenia gdzie się one znajdują – na początku, końcu czy też między wyrazami. Funkcja VBA usuwa zbędne spacje tylko na początku i na końcu ciągu tekstowego.
Aby lepiej zobrazować problem napisałem dwie bardzo proste funkcje. Pierwsza działa w oparciu o wbudowaną funkcję VBA, druga o funkcję arkuszową USUŃ.ZBĘDNE.ODSTĘPY.
1 2 3 4 5 |
Function Odstepy_VBA(sTekst As String) As String Odstepy_VBA = Trim(sTekst) End Function |
1 2 3 4 5 |
Function Odstepy_Excel(sTekst As String) As String Odstepy_Excel = WorksheetFunction.Trim(sTekst) End Function |
Różnice między działaniem obu funkcji pokazuje poniższy screen