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:

Sub NazwaProcedury([Argumenty])  
  Pierwsza instrukcja ‘komentarze
  Druga instrukcja    ‘komentarze
  ..........

End Sub

 

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.
PokazOkienko "Czy chcesz kontynuować?"

To wywołanie procedury wyświetli okno:

Kolejne argumenty możemy przekazywać po przecinku:
PokazOkienko "Czy chcesz kontynuować?", vbOKCancel, "Proszę odpowiedzieć"

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.

NaszaProcedura

 

Procedury można też wywołać przy pomocy słowa kluczowego Call, argumenty trzeba jednak wtedy zawrzeć w nawiasach:
Call MsgBox("Czy chcesz kontynuować?", vbYesNo, "Mój program")

 

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:

Function NazwaFunkcji([argumenty]) [As typ] 
     instrukcje
     NazwaFunkcji = Jakaś wartość 
     instrukcje
End Function

 

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:

Function podaj_szesc() As Integer
    podaj_szesc = 6
End Function

 

lub z argumentami:

Function zsumuj(a As Integer, b As Integer) As Integer
    zsumuj = a + b
End Function

 

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

zsumuj 1, 2

 

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

Dim moja_zmienna As Integer
moja_zmienna = zsumuj(1, 2)

 

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

MsgBox zsumuj(1, 2), vbOKOnly

 

 

 

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:
answer = MsgBox("Czy chcesz kontynuować?", vbYesNo Or vbQuestion Or _
 vbDefaultButton1, Application.Name)

 

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ę:
Function continue_question() As Integer
    continue_question = MsgBox("Czy chcesz kontynuować?", vbYesNo _
      Or vbQuestion Or vbDefaultButton1, Application.Name)
End Function

 

 

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 e-mail nie zostanie opublikowany.