FunctionDeklaruje nazwę, argumenty i kod, który tworzy procdurę Function.Składnia rozkazu Function, Private Function, Public Function, Friend Function: [Static] Function NazwaFun [(ListaArg)] [As typ] [rozkazy] [NazwaFun=Wartość] [Exit Function] [rozkazy] [NazwaFun=Wartość] End Function Private [Static] Function NazwaFun [(ListaArg)] [As typ] [rozkazy] [NazwaFun=Wartość] [Exit Function] [rozkazy] [NazwaFun=Wartość] End Function Public [Static] Function NazwaFun [(ListaArg)] [As typ] [rozkazy] [NazwaFun=Wartość] [Exit Function] [rozkazy] [NazwaFun=Wartość] End Function Friend [Static] Function NazwaFun [(ListaArg)] [As typ] [rozkazy] [NazwaFun=Wartość] [Exit Function] [rozkazy] [NazwaFun=Wartość] End Function Składnia instrukcji Function, Private Function, Public Function i Friend Function składa się z części:
Argument ListaArg składa się z części: [Optional] [ByVal | ByRef] [ParamArray] NazwaArg[()] [As typ] [=DomyślnaWartość]
Procedura Function jest dostępna dla wszystkich procedur modułu. Procedura Private Function jest dostępna tylko w module, w którym została zadeklarowana. Procedura Public Function jest dostępna we wszystkich procedurach i we wszystkich modułach w aplikacji, chyba że zostało użyte Option Private, które powoduje, że procedury są publiczne tylko wewnątrz projektu, w którym rezydują. Procedura Friend Function (tylko w modułach klas) jest dostępna tylko w projekcie ale nie jest widziana przez kontroler instancji obiektu. Procedury Function mogą być rekurencyjne. Oznacza to, że mogą wywoływać siebie. Jednak rekurnecja może powodować błędy (stack overflow). Słowo Static zwykle nie jest używane w procedurach rekurencyjnych. Cały wykonywalny kod musi być umieszczony wewnątrze procedur. Nie można stworzyć procedury Function wewnątrz innej procedury Function, Function lub Property. Słowo kluczowe Exit Function jest używane do bezwarunkowego zakończenia wykonywania procedury Function. Wykonywanie programu jest kontynuowane od rozkazu następnego za wywołaniem procedury Function. Dowolna liczba rozkazów Exit Function może znajdować się w dowolnych miejscach wewnątrz procedury. Podobnie jak procedura Sub, procedura Function jest oddzielną częścią programu, która może pobrać argumenty, wykonać wiele rozkazów i zmieniać wartość argumentów. Jednak w przeciwieństwie do procedury Sub, która nie zwraca wartości, procedura Function może być używana po prawej stronie wyrażenia. Procedurę Function wywołuje się przez podanie jej nazwy z listą argumentów do przekazania. Procedury Function można wywoływać również przez użycie rozkazu Call. Aby zwrócić wartość z funkcji, należy podstawić tę wartość pod nazwę funkcji. Dowolna liczba takich podstawień może się znajdować w dowolnych miejscach funkcji. Jeżeli żadna wartość nie zostanie podstawiona pod NazwaFun, funkcja zwróci wartość domyślną: funkcje numeryczne zwracają 0, funkcje łańcuchowe zwracają łańcuch zerowej długości ("") funkcje Variant zwracają Empty. Funkcje, które zwracają odowłanie do obiektu zwracają Nothing, jeżeli żadne odwołanie do obiektu nie zostanie skojarzone z nazwą funkcji (przez użycie Set) wewnątrz funkcji. Poniższy przykład pokazuje jak zwracać wartość funkcji: Function Razy2(intA As Integer) As Integer ... Razy2=intA*2 'pomnóż argument przez 2 i zwróć ... End Function Zmienne używane wewnątrz procedur Function dzielą się na dwie kategorie: lokalne - zadeklarowane wewnątrz procedury i zewnętrzne - zadeklarowana poza procedurą. Zmienne, które są zadeklarowane wewnątrz procedury (przy użyciu Dim lub równoważnego) są zawsze lokalne dla procedury. Zmienne, które są używane w procedurze a nie są w niej zadeklarowane są również lokalne, z wyjątkiem tych, które zostały zadeklarowane poza procedurą (na wyższym poziomie). Procedury mogą korzystać ze zmiennych, które nie są zadeklarowane w procedurze, ale może powstać kofilkt nazw, jeżeli jest coś zdefiniowane na poziomie modułu, co ma taką samą nazwę. Jeżeli procedura odnosi się do niezadeklarowanej zmiennej, która ma taką samą nazwę jak inna procedura, zmienna lub stała, to zostanie przyjęte, że procedura odwołuje się do nazwy na poziomie modułu. Aby uniknąć takich konfliktów należy deklarować zmienne. Można użyć rozkazu Option Explicit aby wymusić deklaracje zmiennych. Przykład użycia rozkazu Function: Function Przyklad(intI As Integer) 'początek procedury If intI=0 Then 'sprawdzenie czy intI=0 Exit Function 'jeżeli tak to opuść procedurę Else Przyklad=intI*3 'jeżeli nie to wykonaj obliczenie i zwróć wartość End If End Function 'koniec procedury (Zmienne, typy zmiennych i rozkaz If Else zostały opisane w innych częściach kursu.) na górę strony... |