Kurs VBA – cz. 6 – Funkcje i procedury

W poprzednich częściach kursu tworzyliśmy pierwsze procedury przy pomocy nagrywarki. Zatrzymajmy się na chwilę, żeby omówić czym właściwie są te procedury, żeby lepiej zrozumieć omawiany w przyszłości kod i model obiektowy Excela.

Zasadniczo odróżniamy dwa rodzaje procedur.

  1. sub – są to podprogramy, najczęściej jednak mówi się na nie po prostu „procedury”. Podprogramy przyjmują argumenty ale nie zwracają wartości.
  2. function – jest to funkcja, czyli odmiana procedury, która zwraca wartość

Zarówno funkcje, jak i procedury mogą przyjmować argumenty wejściowe, różnią się tylko tym, czy zwracają jakąś wartość, czy nie. Wbrew pozorom nie jest to błaha sprawa.Wywołaniem nazywamy przejście przez Excela do wykonania danej procedury lub funkcji. Wywołanie jednej procedury musi być umieszczone w innej. Wyjątkiem są procedury zdarzeń (uruchamia je sam Excel w odpowiednich momentach) lub makra uruchamiane przez okno MakroDefinicja funkcji lub procedury pisana jest tylko raz, czyli tylko raz opisujemy jak działa. Wywoływać ją można dowolną ilość razy. Programista ma dostęp do wielu procedur i funkcji wbudowanych. Są to procedury, których definicje są już schowane w Excelu i można je używać w dowolnej chwili.

Poniżej opisałem jak definiować własne procedury. Definicje własnych procedur najczęściej umieszczamy w standardowych modułach kodu, możemy jednak umieścić je też w modułach arkuszy lub skoroszytu. Niezależnie gdzie umieścimy definicję, możemy wywoływać naszą procedurę w dowolnym module.

Poniżej często będzie pojawiać się termin zmienna, zostanie on dokładniej wytłumaczony w kolejnych częściach. Na ten moment należy tylko wiedzieć, że jest to swego rodzaju pojemnik przechowujący jakąś wartość.

Sub

Są to najczęściej wykorzystywane procedury i mogą być tworzone przy pomocy nagrywarki, oczywiście można je też napisać bezpośrednio w edytorze. Wykonują zawarte w sobie instrukcje jedna po drugiej. Schemat definicji procedury wygląda następująco:

 

Możemy definiować argumenty lub nie. Dzięki nim możemy przekazywać do procedury pewne wartości i używać je w środku. Procedury stworzone przy pomocy nagrywarki nie mają argumentów, więc nawiasy są puste. Jeżeli chcemy udostępnić użytkownikowi uruchamianie procedury przez okno Makro, procedura nie może mieć argumentów.

Procedury mogą wywoływać inne. Napiszę więc prostą procedurę, która używa wbudowaną funkcję MsgBox to pokazania małego okienka pop-up.

Argument zaznaczony na czerwono musi być zawsze podany przy wywołaniu. Zaznaczone na zielono są opcjonalne, czyli nie muszą być podawane, przyjmują wtedy wartości podane po znaku równa się.
Wywołanie składa się z dwóch części, nazwy procedury i argumentów. Argumentem jest tekst „Czy chcesz kontynuować?”. Przekazujemy w ten sposób procedurze, co ma się wyświetlić w okienku, czyli co ma być pod argumentem pytanie.
To wywołanie procedury wyświetli okno:

Kolejne argumenty możemy przekazywać po przecinku:
Przekazujemy teraz jakie przyciski mają znaleźć się na okienku i jaki ma być jego tytuł.

Jeżeli jakaś procedura nie ma argumentów lub ich nie wymaga (wszystkie są opcjonalne) wystarczy napisać jej nazwę aby ją wywołać. Naturalnie nie można podać więcej argumentów niż w definicji.

 

Procedury można też wywołać przy pomocy słowa kluczowego Call, argumenty trzeba jednak wtedy zawrzeć w nawiasach:
 

Więcej o wbudowanych procedurach Excela i gdzie znaleźć informacje na ich temat w kolejnych częściach kursu.

Function

Jak napisałem wyżej funkcje różnią się od procedur tym, że mogą zwracać wartości. Można więc je używać w równaniach. Schemat definicji funkcji:

 

Część As typ odpowiada za typ zmiennej zwracanej przez funkcję. O typach nauczymy się później.Instrukcja NazwaFunkcji = ? odpowiada za wartość zwracaną przez funkcję.Najprostsza funkcja może wyglądać tak:
 

lub z argumentami:

 

Funkcje możemy wywoływać jak zwykłe procedury, wtedy nie zwracają wartości.
 

Częściej jednak będziemy chcieli gdzieś wstawić wynik działania, musimy wtedy użyć nawiasów.

 

Funkcja może być nawet argumentem innej funkcji, lub procedury. Poniżej wyświetlam w okienku pop-up wynik działania funkcji.

 

 

 

Sens tworzenia procedur i funkcji

Idea procedur pozwala nam zamykać logikę kodu w funkcjonalnych częściach. Umiejętność dzielenia kodu na procedury jest jedną z podstawowych dla programisty i nie da się jej przecenić. Jeżeli piszemy program, który obsługuje samochód możemy stworzyć osobne procedury na:

  • Przyspieszanie, procedura przyjmująca jako argument prędkość do jakiej przyspieszyć,
  • Hamowanie, procedura z argumentem określającym jak mocno naciskać pedał gazu,
  • Włączenie świateł mijania, procedura bez argumentów, po prostu włącza światła,
  • Sprawdzenie poziomu oleju, funkcja bez argumentów, która zwraca poziom oleju,
  • itp.
Możemy wtedy napisać procedurę „Jade_do_sklepu” i wywoływać powyższe kiedy uznamy za stosowne. Dzięki takiemu podejściu wiemy gdzie szukać logiki dla każdego z tych działań, kiedy chcemy je zmodyfikować lub poprawić błędy. Na przykład jeżeli będziemy chcieli zmienić działanie procedury przyspieszanie , aby nie pozwalała przyspieszyć ponad 120 Km na godzinę.
Załóżmy, że zadajemy użytkownikowi jakieś pytanie. Na przykład „Czy chcesz kontynuować?”. Możemy je zapisać w formie:
 

Jeżeli zadam to pytanie w programie dziesięć razy i ostatecznie zechcę zmienić tekst pytania to czeka mnie przeglądanie kodu i poprawki w dziesięciu miejscach. Jeżeli natomiast napiszę funkcję:
 

 

to ostatecznie czeka mnie zmiana tylko w tej funkcji. Po takiej drobnej zmianie program zacznie działać inaczej wszędzie, gdzie użyłem tą funkcję.

Trudno jednoznacznie zdecydować ile linii kodu maksymalnie powinna mieć jedna procedura. Zależy to od indywidualnych upodobań programisty. Z reguły jednak, jeżeli procedura osiąga około 200 linii kodu, dobrze jest pomyśleć nad podzieleniem jej na kilka mniejszych.


Subskrybuj RSS, lub polub blog na Facebooku aby otrzymywać najnowsze informacje o rozwoju kursu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *