| Termin | Definicja |
|---|---|
| Function | Function to słowo kluczowe VBA rozpoczynające definicję procedury zwracającej wartość. Function w VBA, czyli początek procedury zwracającej wynikFunction w języku VBA służy do definiowania procedury, której działanie kończy się przekazaniem określonej wartości. Taki element programu może przyjmować dane wejściowe, wykonywać obliczenia, sprawdzać warunki, korzystać z innych procedur, a następnie zwracać rezultat do miejsca, z którego został wywołany. Dzięki temu powtarzalną operację można opisać raz, nadać jej nazwę i używać jej w wielu częściach projektu. Procedura Function przypomina pod względem organizacji kodu zwykłą procedurę Sub, jednak występuje między nimi istotna różnica. Sub wykonuje zestaw poleceń, lecz nie jest przeznaczona do zwracania pojedynczego wyniku w taki sposób, jak funkcja. Function może zostać użyta w instrukcji przypisania, w warunku, w obliczeniu albo bezpośrednio w formule arkusza, jeżeli została przygotowana z myślą o użyciu w Excelu. Wartość jest przekazywana przez przypisanie jej do nazwy funkcji. Najprostszy schemat może wyglądać następująco:
W tym przykładzie nazwa Podwoj jest jednocześnie nazwą procedury oraz miejscem, do którego wpisywany jest wynik. Po wywołaniu funkcji z argumentem pięć otrzymuje się wartość dziesięć. Deklaracja typu Double wskazuje, jakiego rodzaju dane funkcja przyjmuje i jaki typ wyniku zwraca. Jawne określanie typów pomaga ograniczyć nieoczekiwane konwersje oraz ułatwia analizowanie kodu. Function a Sub i formuła arkusza w porównaniu zastosowańWybór między Function a Sub zależy od tego, czy potrzebny jest wynik, czy jedynie wykonanie działań. Funkcja pasuje do obliczeń, walidacji, przekształcania tekstu, wyszukiwania informacji oraz innych operacji, których rezultatem jest konkretna wartość. Sub sprawdza się wtedy, gdy wykonywane są czynności takie jak formatowanie zakresu, otwieranie formularza, czyszczenie danych albo tworzenie raportu bez konieczności przekazania jednego wyniku do wywołującego kodu. Przykładowo funkcja może określać, czy liczba jest dodatnia:
Rezultat typu Boolean może być następnie wykorzystany w instrukcji warunkowej:
Funkcja użytkownika może również działać podobnie do funkcji wbudowanej i zostać wpisana w komórkę arkusza. Należy jednak pamiętać, że użycie funkcji z poziomu arkusza podlega ograniczeniom. Kod wywoływany jako formuła powinien przede wszystkim obliczać i zwracać wynik, a nie zmieniać zawartość innych komórek, otwierać okien ani wykonywać działań ubocznych. Rozdzielenie logiki obliczeniowej od operacji zmieniających środowisko zwiększa przewidywalność działania skoroszytu. Function może także zwracać tekst, datę, wartość logiczną, liczbę, obiekt albo tablicę. W przypadku bardziej złożonych rezultatów wskazane jest określenie typu zwracanego wyniku oraz opisanie zasad jego tworzenia. Jeżeli typ nie zostanie podany, VBA może przyjąć typ Variant, który jest elastyczny, ale może utrudniać wykrywanie pomyłek i powodować dodatkowe konwersje. Function i parametry, typy danych oraz zakres działaniaParametry funkcji opisują dane, które muszą albo mogą zostać przekazane podczas wywołania. Parametr może mieć określony typ, wartość domyślną oraz sposób przekazywania. Najczęściej stosuje się przekazywanie przez wartość, zapisywane jako ByVal, gdy funkcja ma otrzymać kopię danych. Przy przekazywaniu przez referencję, czyli ByRef, procedura może pracować bezpośrednio na zmiennej przekazanej przez wywołujący kod. Ten drugi wariant powinien być stosowany świadomie, ponieważ zmiana parametru wewnątrz funkcji może wpłynąć na wartość poza funkcją. Przykład funkcji z parametrem opcjonalnym:
Parametr stawka nie musi być podawany przy każdym wywołaniu. Jeżeli zostanie pominięty, zostanie zastosowana wartość domyślna. W rzeczywistym projekcie trzeba jednak ustalić, czy wartość domyślna rzeczywiście odpowiada regułom obowiązującym w danym zastosowaniu. Wartości stałe zapisane w kodzie mogą po pewnym czasie stać się nieaktualne, dlatego w wielu projektach lepiej przechowywać ustawienia w jednym, łatwym do zmiany miejscu. Znaczenie ma również zasięg funkcji. Słowo kluczowe Private ogranicza dostęp do modułu, w którym funkcja została zadeklarowana. Public pozwala korzystać z niej w szerszym zakresie projektu, o ile pozostałe warunki środowiska na to pozwalają. Funkcja umieszczona w module standardowym może być używana inaczej niż funkcja należąca do modułu arkusza, formularza lub obiektu skoroszytu. Przy projektowaniu większego rozwiązania warto ustalić, gdzie dana funkcja ma być dostępna, aby nie tworzyć nadmiarowych zależności. W nazwach funkcji i parametrów przydatne są określenia opisujące działanie, takie jak ObliczSume, ZnajdzKod, CzyPoprawny lub FormatujDate. Nazwa powinna wskazywać rezultat albo główną czynność. Unikanie nazw ogólnych, takich jak Dane, Wynik czy Test, ułatwia późniejsze czytanie kodu i ogranicza ryzyko pomylenia kilku podobnych procedur. Function w praktyce, typowe problemy i sposoby diagnozyJednym z częstych błędów jest brak przypisania wyniku do nazwy funkcji. Samo wykonanie obliczenia nie wystarczy, ponieważ VBA musi otrzymać instrukcję określającą, co ma zostać zwrócone. W kodzie należy umieścić przypisanie w rodzaju Problem może pojawić się także wtedy, gdy nie wszystkie ścieżki warunkowe ustawiają wynik. Przykład funkcji sprawdzającej kilka przypadków powinien przewidywać sytuację standardową oraz dane puste, niepoprawne lub spoza zakresu. Przydatne bywa zastosowanie instrukcji Select Case, wcześniejsze sprawdzenie wartości wejściowych oraz jawne ustawienie wartości zwracanej w każdej gałęzi. Drugą grupę problemów stanowią niezgodności typów. Próba zapisania tekstu do funkcji zadeklarowanej jako Long może zakończyć się błędem albo niepożądaną konwersją. Szczególną ostrożność trzeba zachować przy danych pochodzących z komórek, ponieważ pusta komórka, tekst wyglądający jak liczba, data i błąd arkusza mogą wymagać odmiennych reakcji. Przed obliczeniem można użyć funkcji sprawdzających, takich jak IsNumeric, IsDate lub IsError, a następnie zadecydować, czy dane należy przekształcić, pominąć czy zgłosić problem. Warto również rozróżniać błędy składni, błędy wykonania i błędy logiczne. Błąd składni jest sygnalizowany przed uruchomieniem procedury, na przykład przez brakujące End Function lub nieprawidłową deklarację. Błąd wykonania pojawia się w trakcie działania, gdy program napotyka niedozwoloną operację. Błąd logiczny jest trudniejszy do zauważenia, ponieważ kod działa, lecz zwraca nieprawidłowy rezultat. W takim przypadku pomocne jest przejście przez kod krok po kroku, obserwowanie wartości parametrów i sprawdzenie przypadków granicznych. Nie powinno się też nadużywać funkcji wykonujących wiele niezależnych zadań. Funkcja, która jednocześnie pobiera dane, modyfikuje arkusz, zapisuje pliki i oblicza wynik, staje się trudna do przetestowania. Lepszy podział polega na wydzieleniu mniejszych procedur, z których każda ma jedno jasno określone zadanie. Taka konstrukcja ułatwia ponowne użycie kodu i zmniejsza ryzyko, że zmiana jednej reguły wpłynie na odległą część projektu. Function w codziennej pracy i wskazówki przed zgłoszeniem problemuPrzy pracy z kodem VBA warto rozpocząć od odtworzenia problemu na prostym przykładzie. Należy zapisać nazwę funkcji, przekazywane argumenty, oczekiwany wynik oraz rezultat rzeczywisty. Pomocne jest także wskazanie, czy funkcja jest uruchamiana z innej procedury, z formularza, czy bezpośrednio z komórki arkusza. Takie informacje pozwalają szybciej rozdzielić problem dotyczący samej logiki od problemu wynikającego z kontekstu wywołania. Przed przekazaniem pliku do analizy można sprawdzić, czy wszystkie wymagane moduły są obecne, czy nazwy funkcji nie kolidują z nazwami zmiennych oraz czy projekt nie zawiera odwołań do brakujących bibliotek. Warto zachować kopię pliku i opisać ostatnią zmianę, po której pojawił się błąd. Jeżeli funkcja zależy od danych w konkretnych komórkach, należy zanotować ich przykładową zawartość bez ujawniania informacji, które nie są potrzebne do diagnozy. W przypadku problemów z działaniem programu VBA, uruchamianiem procedur lub nieprawidłowymi wynikami można zgłosić się do Warszawskiego Pogotowia Komputerowego 24/7. Przydatne będzie przekazanie krótkiego opisu objawów, komunikatu błędu oraz informacji o tym, czy problem występuje zawsze, czy tylko dla wybranych danych. Na tej podstawie można ocenić, czy przyczyną jest deklaracja Function, typ parametru, błąd w warunku, konflikt nazw albo problem z samym środowiskiem uruchomieniowym. Najważniejszą zasadą pozostaje traktowanie funkcji jako małego, przewidywalnego elementu programu. Powinna otrzymywać jasno określone dane, wykonywać opisane działanie i zwracać wynik w ustalonym typie. Czytelne nazwy, jawne deklaracje, kontrola danych wejściowych oraz testy dla wartości typowych i granicznych sprawiają, że kod VBA staje się łatwiejszy do utrzymania. Dzięki temu słowo kluczowe Function nie jest jedynie elementem składni, lecz podstawą uporządkowanego sposobu budowania powtarzalnych operacji w projekcie. |