Opracowała Joanna Kisielińska 1 Składnia instrukcji GoTo GoTo etykieta INSTRUKCJA SKOKU GOTO etykieta musi zostać umieszczone w programie: etykieta: Instrukcja lub etykieta: Instrukcja Przykład Sub ocena() Dim odp As String, i As Integer, c As Integer Start: i = 0 kom = "Najdłuższą rzeką świata jest?" & vbcrlf & "a - Amazonka" & vbcrlf kom = kom & "b - Nil" & vbcrlf & "c - Kongo" odp = InputBox(kom) Select Case odp Case "a", "A": MsgBox "źle" i = 1 Case "b", "B": MsgBox "dobrze" Case "c", "C": MsgBox "źle" i = 1 Case Else: MsgBox "zła litera" i = 1 End Select If i = 1 Then c = MsgBox("czy próbujesz jeszcze raz", vbyesno) If c = vbyes Then GoTo Start End If
Opracowała Joanna Kisielińska 2 Składnia pętli For PĘTLA FOR For licznik = początek To koniec [Step krok] [instrukcje] [Exit For] [instrukcje] Next [licznik] gdzie: licznik zmienna sterująca pętli, musi być zmienną liczbową (zalecane całkowite) początek wartość początkowa licznika koniec wartość końcowa licznika krok wartość kroku instrukcje jedna lub więcej instrukcji, które zostaną wykonane, w każdym kroku pętli Step jeśli nie występuje krok jest równy 1 Exit For instrukcja ta może wystąpić raz lub kilka razy, powoduje bezwarunkowe opuszczenie pętli Next licznik powiększany jest o krok (lub o 1) Wykonanie pętli For 1) licznik = początek 2) dla krok >= 0 jeżeli licznik <= koniec idź do punku 3 w przeciwnym wypadku koniec pętli dla krok < 0 jeżeli licznik >= koniec idź do punku 3 w przeciwnym wypadku koniec pętli 3) wykonaj instrukcje, jeśli napotkasz Exit For wyjdź bezwarunkowo z pętli 4) licznik = licznik + krok, idź do punktu 2 Przykłady Sprawdzić, gdzie sprawdzany jest warunek: Sub num() Dim z As Integer For z = 0 To -2 MsgBox z Next z Warunek sprawdzany jest na początku, na ekranie nie pojawi się żaden komunikat.
Opracowała Joanna Kisielińska 3 Wypełnianie kolejnych komórek arkusza Sub num() Dim z As Integer For z = 0 To 5 ActiveSheet.Range("a1").Offset(z, 0).Value = z Next z MsgBox z Sub num() Dim z As Integer For z = 5 To 0 Step -1 ActiveSheet.Range("a1").Offset(z, 0).Value = z Next z MsgBox z Sub num() Dim z As Integer Dim z As Integer For z = 0 To 100 B = ActiveSheet.Range("a1").Offset(z, 0).Value If B = "koniec" Then Exit For ActiveSheet.Range("a1").Offset(z, 1).Value = B + 1 Next z MsgBox z
Opracowała Joanna Kisielińska 4 Sub wypelnienie() x = 1 lw = InputBox("liczba wierszy") lk = InputBox("liczba kolumn") la = InputBox("liczba arkuszy") For i = 1 To la For j = 0 To lw - 1 For k = 0 To lk - 1 ActiveWorkbook.Worksheets(i).Range("a1").Offset(j, k).value = x x = x + 1 Next k Next j Next i MsgBox "zrobione" Sumuje liczby w wierszach i oblicza sumę całkowitą Sub suma_liczb() Dim l As Integer, x As Integer, s As Integer x = 0 lw = 5 'liczba wierszy lk = 4 'liczba kolumn 'wypełnienie tabeli danymi Randomize For j = 0 To lw - 1 For k = 0 To lk - 1 l = Rnd * 100 + 1 ActiveSheet.Range("a1").Offset(j, k).value = l Next k Next j 'obliczanie sum s = 0 For j = 0 To lw - 1 x = 0 For k = 0 To lk - 1 x = x + ActiveSheet.Range("a1").Offset(j, k).value Next k ActiveSheet.Range("a1").Offset(j, lk).value = x s = s + x Next j MsgBox ("suma całkowita" & s)
Opracowała Joanna Kisielińska 5 Składnia pętli warukowych PĘTLE WARUNKOWE Do [While warunek1 Until warunek2] [instrukcje] Loop [While warunek3 Until warunek4] gdzie: waruneki warunki logiczne instrukcje jedna lub więcej instrukcji, które zostaną wykonane, w każdym kroku pętli Postacie pętli warunkowych Warunek jest sprawdzany na początku pętli Pętla wykonuje się dopóki warunek jest prawdziwy Pętla wykonuje się aż warunek stanie się prawdziwy Do While warunek [instrukcje] Loop Do Until warunek [instrukcje] Loop Warunek jest sprawdzany na końcu pętli Do [instrukcje] Loop While warunek Do [instrukcje] Loop Until warunek Uwaga: Pętle, w których warunek jest sprawdzany na końcu przynajmniej raz wykonują instrukcje w nich zapisane. Pętle, w których warunek jest sprawdzany na początku mogą ani razu nie wykonać instrukcji w nich zapisanych. W tym sensie pętle nie są sobie równoważne.
Opracowała Joanna Kisielińska 6 Wykonanie pętli Do While... Loop 1) sprawdź, czy warunek jest prawdziwy jeżeli nie koniec pętli jeżeli tak idź do następnego kroku 2) wykonaj instrukcje 3) wróć do punktu 1 Sub whilep() Dim i As Integer, k As Integer k = InputBox("podaj ile wierszy chcesz wypełnićdanymi") wczytano 5 i = 1 Do While i <= k ActiveSheet.Range("a1").Offset(i - 1, 0).Value = i i = i + 1 Loop MsgBox "i=" & Str(i) & " " & "k=" & " " & Str(k) A 1 2 3 4 5 Wykonanie pętli Do... Loop While 1) wykonaj instrukcje 2) sprawdź, czy warunek jest prawdziwy jeżeli nie koniec pętli jeżeli tak idź do punktu 1 Sub whilek() Dim i As Integer, k As Integer k = InputBox("podaj ile wierszy chcesz wypełnić danymi") wczytano 5 i = 1 Do ActiveSheet.Range("a1").Offset(i - 1, 0).Value = i i = i + 1 Loop While i <= k MsgBox "i=" & Str(i) & " " & "k=" & " " & Str(k) A 1 2 3 4 5
Opracowała Joanna Kisielińska 7 Uwaga: Różnica, jeśli k=0 Do While i <= k... Loop A Do... Loop While i <= k A 1 Wykonanie pętli Do Until... Loop 1) sprawdź, czy warunek jest prawdziwy jeżeli tak koniec pętli jeżeli nie idź do następnego kroku 2) wykonaj instrukcje 3) wróć do punktu 1 Sub whilep() Dim i As Integer, k As Integer k = InputBox("podaj ile wierszy chcesz wypełnićdanymi") wczytano 5 i = 1 Do Until i >= k ActiveSheet.Range("a1").Offset(i - 1, 0).Value = i i = i + 1 Loop MsgBox "i=" & Str(i) & " " & "k=" & " " & Str(k) A 1 2 3 4
Opracowała Joanna Kisielińska 8 Wykonanie pętli Do... Loop Until 1) wykonaj instrukcje 2) sprawdź, czy warunek jest prawdziwy jeżeli tak koniec pętli jeżeli nie idź do punktu 1 Sub whilep() Dim i As Integer, k As Integer k = InputBox("podaj ile wierszy chcesz wypełnićdanymi") wczytano 5 i = 1 Do ActiveSheet.Range("a1").Offset(i - 1, 0).Value = i i = i + 1 Loop Until i >= k MsgBox "i=" & Str(i) & " " & "k=" & " " & Str(k) A 1 2 3 4 Uwaga: Różnica, jeśli k=0 Do Until i >= k... Loop A Do... Loop Until i >= k A 1
Opracowała Joanna Kisielińska 9 Pętla While Sub ocena() Dim odp As String, i As Integer, c As Integer Do i = 0 kom = "Najdłuższą rzeką świata jest?" & vbcrlf & "a Amazonka kom = kom & vbcrlf & "b - Nil" & vbcrlf & "c - Kongo" odp = InputBox(kom) Select Case odp Case "a", "A": MsgBox "źle" : i = 1 Case "b", "B": MsgBox "dobrze" Case "c", "C": MsgBox "źle": i = 1 Case Else: MsgBox "zła litera" : i = 1 End Select Loop While i = 1 Uwaga: Aby warunek był sprawdzany na początku konieczne jest: i = 1 Do While i = 1 i = 0 Pętla Until Sub ocena() Dim odp As String, i As Integer, c As Integer Do i = 0 kom = "Najdłuższą rzeką świata jest?" & vbcrlf & "a - Amazonka" & vbcrlf kom = kom & "b - Nil" & vbcrlf & "c - Kongo" odp = InputBox(kom) Select Case odp Case "a", "A": MsgBox "źle" : i = 1 Case "b", "B": MsgBox "dobrze" Case "c", "C": MsgBox "źle" : i = 1 Case Else: MsgBox "zła litera" : i = 1 End Select Loop Until i = 0 Uwaga: Aby warunek był sprawdzany na początku konieczne jest: i = 1 Do Until i = 0 i = 0
Opracowała Joanna Kisielińska 10 Dodatkowe wyjście z pytaniem o koniec Sub ocena() Dim odp As String, i As Integer, c As Integer Do i = 0 kom = "Najdłuższą rzeką świata jest?" & vbcrlf & "a - Amazonka" & vbcrlf kom = kom & "b - Nil" & vbcrlf & "c - Kongo" odp = InputBox(kom) Select Case odp Case "a", "A": MsgBox "źle" i = 1 Case "b", "B": MsgBox "dobrze" Case "c", "C": MsgBox "źle" i = 1 Case Else: MsgBox "zła litera" i = 1 End Select If i = 1 Then c = MsgBox("czy próbujesz jeszcze raz", vbyesno) Loop While i = 1 And c = vbyes Zliczanie niepustych komórek Oblicz ile krajów jest wpisanych na arkuszu w 1 kolumnie Sub zlicz() Dim i As Integer i = 0 Do i = i + 1 Loop Until ActiveSheet.Range("a1").Offset(i - 1, 0).Value = "" MsgBox "liczba wpisanych państw=" & Str(i - 1)
Opracowała Joanna Kisielińska 11 Inne rozwiązania: Sub zlicz() Dim i As Integer i = 0 Do i = i + 1 Loop While ActiveSheet.Range("a1").Offset(i - 1, 0).Value <> "" MsgBox "liczba wpisanych państw=" & Str(i - 1) Sub zlicz() Dim i As Integer i = 0 Do While ActiveSheet.Range("a1").Offset(i, 0).Value <> "" i = i + 1 Loop MsgBox "liczba wpisanych państw=" & Str(i) Sub zlicz() Dim i As Integer i = 0 Do Until ActiveSheet.Range("a1").Offset(i, 0).Value = "" i = i + 1 Loop MsgBox "liczba wpisanych państw=" & Str(i)
Opracowała Joanna Kisielińska 12 ZMIENNE TABLICOWE Zmienna tablicowa reprezentuje grupę uporządkowanych elementów tego samego typu Zmienna tablicowa może mieć jeden lub wiele wymiarów (maksymalnie 60) Typ tablicowy zapewnia swobodny dostęp do każdego elementu tablicy przy pomocy indeksu (lub indeksów), określającego położenie elementu w tablicy Odwołanie do elementu tablicy wymaga podania nazwy tablicy oraz indeksu (lub indeksów) DEKLARACJA ZMIENNYCH TABLICOWYCH Zmienne tablicowe mogą być deklarowane przy pomocy słów kluczowych Dim lub Public Tablica jednowymiarowa Dim nazwa_tablicy(wymiar) As typ_elementów wymiar: indeks_początkowy To indeks_końcowy indeks_końcowy Elementy tablicy domyślnie numerowane są od 0 Jeśli użytkownik chce, aby wszystkie tablice numerowane były od jedynki, w obszarze declarations powinien użyć instrukcji: Option Base 1 Uwaga: Excel kontroluje zakres indeksów. Jeśli w programie następuje przekroczenie zakresu tablicy pojawia się błąd:
Opracowała Joanna Kisielińska 13 Przykłady: Dim tab(100) As Integer istnieje element tab(0), tab(100), nie ma elementu tab(101) Dim tab(1 To 100) As Integer istnieje element tab(1), tab(100), nie ma elementu tab(101), czy tab(0) Option Base 1... Dim tab(100) As Integer Tablice wielowymiarowe Deklaracja tablicy dwuwymiarowej: Dim nazwa_tablicy(wymiar1,wymiar2) As typ_elementów wymiarn: indeks_początkowyn To indeks_końcowyn indeks_końcowyn Przykłady: Dim tab(5, 4) As Double Dim tab(1 To 10, 1 To 2) As String * 5 Option Base 1... Dim tab(13, 4) As Integer Dim tab(5, 6, 7) As Long
Opracowała Joanna Kisielińska 14 WYKORZYSTANIE ZMIENNYCH TABLICOWYCH Sub num() Dim A(2) As Integer A(0) = 1 A(1) = 3 A(2) = 19 MsgBox "wartości elementów tablicy" & vbcrlf _ & A(0) & "," & A(1)& "," & A(2) Sub wek() Dim A(1 To 5) As Integer For i = 1 To 5 A(i) = i Next kom = "tablica=" For i = 1 To 5 kom = kom & A(i) & "," Next MsgBox kom Sub naj() Dim A(1 To 5) As Integer For i = 1 To 5 A(i) = Worksheets("Arkusz1").Range("A1").Offset(i - 1, 0) Next Max = A(1): j = 1 For i = 2 To 5 If A(i) > Max Then Max = A(i): j = i Next MsgBox "Największy element zapisany jest w " & j & "-tym wierszu i _ jest równy " & Max
Opracowała Joanna Kisielińska 15 Sub iloczyn() 'oblicza iloczyn macierzy Dim A(1 To 3, 1 To 4) As Integer, B(1 To 4, 1 To 2) As Integer Dim C(1 To 3, 1 To 2) As Integer ' wczytanie macierzy A For i = 1 To 3 For j = 1 To 4 A(i, j) = Worksheets("Arkusz1").Range("A1").Offset(i - 1, j - 1) Next j Next i ' wczytanie macierzy B For i = 1 To 4 For j = 1 To 2 B(i, j) = Worksheets("Arkusz1").Range("F1").Offset(i - 1, j - 1) Next j Next i ' mnożenie For i = 1 To 3 For j = 1 To 2 C(i, j) = 0 For k = 1 To 4 C(i, j) = C(i, j) + A(i, k) * B(k, j) Next k Next j Next i ' wyniki kom = "Iloczyn macierzy" & vbcrlf For i = 1 To 3 kom = kom & C(i, 1) & "," & C(i, 2) & vbcrlf Next i MsgBox kom
Opracowała Joanna Kisielińska 16 TABLICE DYNAMICZNE Tablica dynamiczna nie ma z góry określonej liczby elementów. Dim nazwa_tablicy() As typ_elementów Przed użyciem tablicy musi zostać określony jej rozmiar ReDim nazwa_tablicy(wymiary) [As typ_elementów] Sub tabl_dyn() Dim A() As Integer i = 2 j = 3 ReDim A(1 To i, 1 To j) A(2, 2) = 7 MsgBox A(2, 2) k = 11 ReDim A(1 To k) A(7) = 8 MsgBox A(7) Rozmiar tabeli może być określony przez użytkownika programu: Sub tabl_dyn() Dim A() As Integer i = InputBox("podaj liczbę wierszy tabeli") j = InputBox("podaj liczbę kolumn tabeli") ReDim A(1 To i, 1 To j) MsgBox "Macierz ma wierszy - " & i & " i kolumn - " & j
Opracowała Joanna Kisielińska 17 SORTOWANIE WEKTORA Sub sort1() Dim x() As Integer, y() As Integer m = 4 ReDim x(1 To m), y(1 To m) For i = 1 To m x(i) = ActiveSheet.Range("a1").Offset(i - 1, 0) Next i For i = 1 To m Min = x(1): k = 1 For j = 2 To m If x(j) < Min Then Min = x(j): k = j Next j x(k) = 1000 y(i) = Min Next i For i = 1 To m ActiveSheet.Range("a1").Offset(i - 1, 1).Value = y(i) Next i Sub sort2() Dim x() As Integer m = 5 ReDim x(1 To m) For i = 1 To m x(i) = ActiveSheet.Range("a1").Offset(i - 1, 0) Next i If x(1) > x(2) Then pom = x(1): x(1) = x(2): x(2) = pom For i = 3 To m j = i - 1 b = x(i) Do Until (j = 1 Or b > x(j)) x(j + 1) = x(j) x(j) = b j = j - 1 Loop If x(1) > b Then x(2) = x(1): x(1) = b Next i For i = 1 To m ActiveSheet.Range("a1").Offset(i - 1, 1).Value = x(i) Next i
Opracowała Joanna Kisielińska 18 ZMIENNE OBIEKTOWE OBIEKTY I KOLEKCJE Zmienna obiektowa reprezentuje obiekt Microsoft Excel. upraszczają zapis kodu skracają czas wykonania kodu Deklaracja Dim lub Public Przykłady WorkSheets( Arkusz1 ).Range( A1 ).Value = 567 WorkSheets( Arkusz1 ).Range( A1 ).Font.Bold = True WorkSheets( Arkusz1 ).Range( A1 ).Font.Italic = True Wykorzystanie zmiennej obiektowej: Dim Kom As Range Set Kom = WorkSheets( Arkusz1 ).Range( A1 ) Kom.Value = 567 Kom.Font.Bold = True Kom.Font.Italic = True Dim ark As Worksheet Set ark = Application.ActiveSheet ark.range("a1:c3").interior.colorindex = 2 ark.range("a1:c3").borders.colorindex = 6 ark.range("a1:c3").font.colorindex = 7 Przykładowe kody kolorów: 1-black 2-white 3-red 4-green 5-blue 6-yellow predefiniowane stałe vbblack vbwhite
Opracowała Joanna Kisielińska 19 INSTRUKCJA WITH Składnia: With obiekt instrukcje wykonywane na obiekcie (nazwy metod i właściwości poprzedzone kropką) End With With WorkSheets( Arkusz1 ).Range( A1 ).Value = 567.Font.Bold = True.Font.Italic = True End With With Application.ActiveSheet.Range("A1:C3").Interior.ColorIndex = 2.Range("A1:C3").Borders.ColorIndex = 6.Range("A1:C3").Font.ColorIndex = 7 End With INSTRUKCJA FOR EACH-NEXT Składnia: For Each element In grupa [instrukcje] [Exit For] [instrukcje] Next [element] Pętla wykonuje operacje dla wszystkich elementów grupy Wypełnienie tablicy wartościami losowymi z przedziału 0-1 i wypisanie ich w oknach dialogowych: Dim Tabl(5) As Single Randomize For i = 0 to 5 Tabl(i) = Rnd Next i For Each t In Tabl MsgBox t Next t lub Next
Opracowała Joanna Kisielińska 20 Wypisanie w oknach dialogowych nazw arkuszy w aktywnym skoroszycie: Dim ark As Worksheet For Each ark In ActiveWorkbook.Worksheets MsgBox ark.name Next ark Zamykanie nieaktywnych skoroszytów: Dim SK As Workbook For Each SK In Workbooks If SK.Name <> ActiveWorkbook.Name Then SK.Close Next SK Zamiana we wszystkich komórkach zaznaczonego obszaru liter na duże: Dim kom As Range For Each kom In Selection kom.value = UCase(kom.Value) Next kom TYPY DANYCH UŻYTKOWNIKA Typy użytkownika definiowane są w obszarze declaration Składnia: Type nazwa_typu nazwa_zm1 As type_zm1 nazwa_zm21 As type_zm2... End Type Odwołanie do elementów Dim nazwa_zmiennej As nazwa_typu nazwa_zmiennej.nazwa_zm1 nazwa_zmiennej.nazwa_zm2
Opracowała Joanna Kisielińska 21 Przykład Type rach cena As Currency ilosc As Single wartosc As Currency End Type Sub rachunek() Dim dane As rach, i As Integer, ob As Range Set ob = ActiveSheet.Range("a1") i = 1 Do Until ob.offset(i, 0).Value = "" dane.cena = ob.offset(i, 1).Value dane.ilosc = ob.offset(i, 2).Value ob.offset(i, 3).Value = dane.cena * dane.ilosc ob.offset(i, 3).NumberFormat = "#0.00 zł" i = i + 1 Loop Inne rozwiązanie: Range("D2").Value = "=B2*C2" Range("D2").Copy Destination:=Range("D3:D5") Range("D2:D5").NumberFormat = "#0.00 zł" Metoda Copy obiektu Range zakres_kopiowany.copy Destination := zakres_docelowy gdzie: zakres_kopiowany zakres, którego zawartość zostanie skopiowana Destination parametr zawierający obszar, do którego kopiowany jest zakres_kopiowany zakres_docelowy zakres ten musi być zgodny z zakresem kopiowanym
Opracowała Joanna Kisielińska 22 FUNKCJE I PROCEDURY WBUDOWANE Funkcje wbudowane: mogą być wywoływane bezpośrednio w kodzie VBA wymagają odwołania do obiektu Application.WorksheetFunction Lista funkcji wywoływanych bezpośrednio w kodzie VBA: napisać VBA i kropkę (musi być aktywna opcja Auto List Members (Tools Options zakładka Editor) Lista funkcji obiektu Application.WorksheetFunction: napisać Application.WorksheetFunction i kropkę (musi być aktywna opcja Auto List Members (Tools Options zakładka Editor) Uwaga: Pomoc na temat określonej funkcji podświetlić nazwę i F1 W przypadku funkcji obiektu Application.WorksheetFunction po kliknięciu F1 należy kliknąć List of Worksheet Functions Available to Visual Basic i wybrać funkcję z listy. Przykłady dzis = VBA.Now kom = "numer miesiąca -" & VBA.Month(dzis) MsgBox kom kom = "rok -" & VBA.Year(dzis) MsgBox kom sss = "suma w obszarze jest równa =" sss = sss & Application.WorksheetFunction.Sum(Range("b7:d9")) MsgBox sss sss = "średnia w obszarze jest równa =" sss = sss & Application.WorksheetFunction.Average(Range("b7:d9")) MsgBox sss x = Application.WorksheetFunction.Pi() MsgBox x lub x = Application.WorksheetFunction.Pi i = Application.WorksheetFunction.CountBlank(Range("a1:b10")) MsgBox i
Opracowała Joanna Kisielińska 23 PROCEDURY UŻYTKOWNIKA Procedura jest ciągiem instrukcji, którym nadawana jest nazwa. Procedury napisane przez użytkownika mogą być wywoływane z innych procedur (również z poziomu arkusza). Procedury mogą mieć parametry (argumenty), których wartość musi być określona w chwili wykonywania procedury. DEKLARACJA PROCEDURY [Private Public Static] Sub nazwa_procedury [(lista_param_form)] [instrukcje] [Exit Sub] [instrukcje] gdzie: Private procedura jest dostępna tylko w obrębie danego modułu Public procedura jest dostępna we wszystkich otwartych skoroszytach (jeśli moduł zawiera instrukcję Option Private w obszarze Declaration, dostęp zostaje ograniczony do projektu) Public jest zakresem domyślnym Static zmienne lokalne procedury zachowują wartości po jej zakończeniu nazwa_procedury nazwa musi spełniać warunki jak nazwy zmiennych. Dodatkowo musi być różna od adresów komórek (np. A3, B11, AA28) Exit Sub instrukcja powodująca natychmiastowe wyjście z procedury lista_param_form (lista parametrów formalnych) lista zmiennych oddzielonych przecinkami nazwa_par nazwa par As typ_parametru ByVal nazwa_par ByVal nazwa_par As typ_parametru Jeśli typ parametru nie został określony, ma on typ Variant
Opracowała Joanna Kisielińska 24 WYWOŁANIE PROCEDURY Wywołanie procedury w innej procedurze Call nazwa_procedury [(lista_parametrów_aktualnych)] lub nazwa_procedury [(lista_parametrów_aktualnych)] gdzie: parametr_aktualny zmienna, tablica, wyrażenie Wywołanie procedury z innego modułu Application.Run ("Skoroszyt!Moduł.nazwa_procedury") Przykład Skoroszyt Zeszyt2: Sub wywolanie() Application.Run ("Zeszyt1.xls!Module1.proc1") MsgBox "procedura wywołująca" Skoroszyt Zeszyt1, Module1: Sub proc1() MsgBox "procedura" Wywołanie procedury z poziomu arkusza Narzędzia Makro Makra
Opracowała Joanna Kisielińska 25 PRZEKAZYWANIE PARAMETRÓW DO PROCEDURY Parametry mogą być przekazywane do procedury na dwa sposoby: przez referencje (przez zmienną) - domyślnie przez wartość trzeba poprzedzić parametr ByVal Przykłady Parametry przekazywane przez referencje i przez wartość Sub p1(a As Integer, ByVal b As Integer) MsgBox a & " " & b '1 1 a = 15 b = 20 Sub p2() Dim w As Integer, z As Integer w = 1 z = 1 Call p1(w, z) MsgBox w '15 MsgBox z '1 Wyrażenie jako parametr aktualny Sub p1(a As Integer, ByVal b As Integer) MsgBox a & " " & b '3 4 a = 15 b = 20 Sub p2() Dim w As Integer, z As Integer w = 1 z = 1 Call p1(w + 2, z + 3) MsgBox w '1 MsgBox z '1
Opracowała Joanna Kisielińska 26 Parametr w postaci tablicy (musi być ostatnim parametrem) Sub p1(tabl() As Integer) Sum = 0 For Each t In Tabl Sum = Sum + t Next t MsgBox "Suma elementów tablicy " & Sum '10 Sub p2() Dim a(1 To 4) As Integer a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4 Call p1(a) Tablica jest przekazywana przez zmienną Sub p1(tabl() As Integer) Sum = 0 i = 0 For Each t In Tabl i = i + 1 Sum = Sum + t Next t MsgBox "Suma elementów tablicy " & Sum '10 For j = 1 To i Tabl(j) = Tabl(j) + 1 Next Sub p2() Dim a(1 To 4) As Integer a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4 Call p1(a) MsgBox "Tablica " & a(1) & "," & a(2) & "," & a(3) & "," & a(4) '2,3,4,5
Opracowała Joanna Kisielińska 27 WYKORZYSTANIE ZMIENNYCH GLOBALNYCH Dim agl As Integer Sub p1() Dim a As Integer a = 15 MsgBox "procedura p1, zmienna lokalna a=" & a & " zmienna globalna agl=" & agl agl = 1000 Sub p2() a = 2: agl = 7 Call p1 MsgBox "procedura p2, zmienna lokalna a=" & a & " zmienna globalna agl=" & agl Przykład Jakie komunikaty pojawią się na ekranie? Dim glo As Integer Sub p1(a As Integer, ByVal b As Integer) a = 1: b = 20: glo = 300 MsgBox "W a=" & a & " b=" & b & " glo=" & glo Sub p2() Dim i As Integer, j As Integer i = 12: j = 14: glo = 123 MsgBox "Z i=" & i & " j=" & j & " glo=" & glo Call p1(i, j) MsgBox "Z i=" & i & " j=" & j & " glo=" & glo
Opracowała Joanna Kisielińska 28 FUNKCJE UŻYTKOWNIKA Funkcje zwracają wartość. Tak jak procedury mogą mieć parametry. DEKLARACJA FUNKCJI [Private Public Static] Function nazwa_f [(lista_pf)][as typ] [instrukcje] [Exit Function] [instrukcje] End Function gdzie: nazwa_f nazwa funkcji musi spełniać takie same warunki jak nazwa procedury Exit Function instrukcja powodująca natychmiastowe wyjście z funkcji lista_pf (lista parametrów formalnych) lista zmiennych oddzielonych przecinkami nazwa_par nazwa par As typ_parametru ByVal nazwa_par ByVal nazwa_par As typ_parametru typ opcjonalny, typ wartości zwracanych przez funkcję End Function koniec funkcji WYWOŁANIE FUNKCJI zmienna = nazwa_f [(lista_pa)] Uwaga: Typ zmiennej musi się zgadzać z typem określonym w deklaracji zmienna = Skoroszyt!nazwa_f [(lista_pa)]
Opracowała Joanna Kisielińska 29 Przykład Funkcja zwracająca łańcuch w odwrotnej kolejności Function odw(a As String) As String Dim j As Long n = Len(a) odw = "" For i = 0 To n - 1 j = n - i p = VBA.Mid(a, j, 1) odw = odw & p Next i End Function Sub zew() Dim a As String, b As String a = "zajęcia z VBA" b = odw(a) MsgBox b ABV z aicęjaz Funkcja VBA Mid Mid (łańcuch, numer_poczatkowy, długość) Zwraca łańcuch o długości długość, pobrany z łańcucha począwszy od znaku numer_poczatkowy gdzie: numer_poczatkowy musi być typu long długość - jeśli pominięty wycina znaki do końca łańcucha