Kodowanie (proceduralne)
Transkrypt
Kodowanie (proceduralne)
(C)2005 RoG@j 2005-04-07 Kodowanie (proceduralne) Przekazywanie danych Lokalne kontra globalne ByVal kontra ByRef Kodowanie Sub i Function Przekazywanie argumentów (danych) ! Najprostszym i chyba najgorszym, bo najmniej uniwersalnym sposobem przekazywania argumentów (danych) to przekazywanie przez zmienne globalne w obrębie modułu ! ! Do tej pory deklarowaliśmy zmienne w Sub – były to zmienne lokalne Zmienne zadeklarowane w sekcji General modułu – zmienne globalne ByVal kontra ByRef ! VBA pozwala na przekazywanie argumentów ! ! ! Przekazywanie ByRef polega na wskazaniu fizycznego adresu, pod którym znajduje się zmienna – wywołana procedura pracuje bezpośrednio na tej zmiennej i może ją zmienić ! VBA 26 Przez referencję (ByRef) – sposób domyślny Przez wartość (ByVal) Funkcje ! ! ! Function działa podobnie jak Sub – podstawowa różnica polega na tym, że Function zwraca wartość Wywołując funkcję trzeba zadbać, by „odebrać” od niej zwracaną wartość Najprostsze funkcje to funkcje będące kombinacjami funkcji wbudowanych, np. postaci x*sin(2*x-1) Lokalne kontra globalne ! Jeśli będziemy używać jedynie zmiennych lokalnych części programu nie będą mogły wymieniać między sobą danych ! ! ! Zmienne lokalne są widoczne jedynie wewnątrz procedury (podprogramu), gdzie zostały zadeklarowane Zmienne globalne pozwalają na wymianę danych, ale „usztywniają” program Będziemy więc wykorzystywać… argumenty (parametry) ByVal kontra ByRef ! ! Przekazywanie ByVal uniemożliwia zmianę wartości przekazywanych wartości Sprowadza się do przekazaniu konkretnych wartości i niejako pracy na lokalnych kopiach tych zmiennych ! ! Jest to sposób bardziej bezpieczny Czasami jednak chcemy z premedytacją zmienić wartości parametrów (argumentów) Czasami tak musi być, czasami jest to groźne… 1 (C)2005 RoG@j Czytanie danych ! Argumenty, które powinny zostać zmienione ! ! Wektor a, do którego czytamy dane Argumenty, które nie powinny się zmienić ! ! Liczba elementów wektora n Numer kolumny k Liczenie minimum w wektorze ! ! Wynikiem jest jedna wartość – czyli najwygodniej jest zakodować funkcję Argumenty (oddzielane przecinkami) ! ! ! Zwracana wartość ! ! Liczba wyrazów w wektorze Wektor Najmniejszy wyraz w wektorze Ta funkcja nie może i nie powinna zmieniać argumentów!!! Kilka uwag… ! ! ! VBA 26 Zadeklarowane w Sub i Function zmienne (indeksy pętli) są lokalne i będą widoczne jedynie wewnątrz Sub i Function Jeśli argumentem jest tablica „sygnalizujemy” to za pomocą nawiasów () – nie podajemy wymiarów tablicy Jeśli jesteśmy pewni, że nie zmieniamy wartości argumentów możemy pominąć ByVal (domyślnie będzie ByRef), ale… 2005-04-07 Kodowanie Sub Sub Czytaj (ByVal n As Long, ByVal k As Long, ByRef a() As Double) Dim i As Long For i = 1 To n a(i) = Cells(i, k) Next i End Sub Function Min Function Min(ByVal n As Long, ByRef a() As Double) As Double Dim i As Long Min = a(1) For i = 2 To n If a(i) < Min Then Min = a(i) Next i End Function ByRef kontra ByVal Sub Zmiany() Dim k As Long k = 7 Call BezZmiany(k) MsgBox k Call ZeZmiana(k) MsgBox k End Sub Sub n n End ZeZmiana(ByRef As Long) = 2 * n Sub Sub n n End BezZmiany(ByVal As Long) = 2 * n Sub 2