Podstawy Visual Basic for Applications (cz. II) 16 XII
Podstawy Visual Basic for Applications (cz. II) Podstawy Visual Basic for Applications (cz. II). Tworzenie własnych aplikacji Podstawy Visual Basic for Applications (cz. II) • tworzenie i wykorzystywanie własnych funkcji arkusza • przekazywanie argumentów przez zmienne • obsługa błędów • manipulowanie obiektami z poziomu VBA Tworzenie własnych aplikacji • tworzenie okien dialogowych • procedury zdarzeń • automatyczne importowanie, uzupełnianie danych
Funkcje niestandardowe Aby skrócić i uprościć formuły, można za pomocą edytora VBA tworzyć własne funkcje Funkcja: może zwracać tylko wartość nie może przeprowadzać żadnych operacji na obiektach nie może zmieniać zawartości arkusza
wynik sektora GG (po uwzględnieniu kosztów reformy emerytalnej) w t-1 < -3% PKB? Początek Koniec tak nie korekta -2 p.p. państwowy dług publiczny w t-1 > 55% PKB? tak korekta -1,5 p.p. nie nie państwowy dług publiczny w t-1 > 50% PKB? złe czasy? tak brak korekty w t+1 tak nie skumulowane odchylenia wyniku GG od celu? złe czasy? < -6% PKB > +6% PKB od -6% do +6% PKB nie dobre czasy? tak tak nie bonus +1,5 p.p. brak korekty w t+1 korekta -1,5 p.p.
Własna funkcja: korekta SRW Function Korekta(Wynik, Dlug, Suma_roznic, Dynamika_PKB, Srednia_PKB) 'Podaje wielkość korekty zgodnie ze stabilizującą regułą wydatkową If (Wynik < -0.03 Or Dlug > 0.55) Then Korekta = -0.02 ElseIf (Dlug > 0.5 Or Suma_roznic < -0.06) Then If (Dynamika_PKB - Srednia_PKB) >= -0.02 Then Korekta = -0.015 Else Korekta = 0 End If ElseIf Suma_roznic > 0.06 Then If (Dynamika_PKB - Srednia_PKB) <= 0.02 Then Korekta = 0.015 End Function
Elementy funkcji [Public | Private] Function nazwa ([lista_argumentow]) [As typ] [instrukcje] [Exit Function] [nazwa = wyrażenie] End Function Public – funkcja osiągalna dla wszystkich innych procedur zawartych we wszystkich modułach w skoroszycie Private – funkcja osiąalna wyłącznie dla procedur znajdujących się w tym samym module Nazwa może zawierać litery, cyfry i niektóre znaki interpunkcyjne (bez spacji, kropek, $, %, !, #, &), pierwszy znak musi być literą Exit function – natychmiastowe wyjście z funkcji Po zakończeniu funkcja zwraca wynik przypisany do nazwy
Przekazywanie argumentów przez zmienne Sub LiczbaLiter() Dim i As Integer Dim n As Integer i = Len(InputBox("Wpisz swoje imię:")) n = Len(InputBox("Wpisz swoje nazwisko:")) MsgBox WszystkoRazem(i, n) End Sub Function WszystkoRazem(i, n) As Integer WszystkoRazem = i + n End Function
Przekazywanie argumentów – rola ByVal Sub LiczbaLiter() Dim i As Integer Dim n As Integer i = Len(InputBox("Wpisz swoje imię:")) n = Len(InputBox("Wpisz swoje nazwisko:")) MsgBox WszystkoRazem(i, n) MsgBox (i) MsgBox (n) End Sub Function WszystkoRazem(ByVal i, n) As Integer WszystkoRazem = i + n i = i + 10 n = n + 10 End Function
Argumenty opcjonalne Sub LiczbaLiter() Dim i As Integer Dim n As Integer i = Len(InputBox("Wpisz swoje pierwsze imię:")) j = Len(InputBox("Wpisz ewentualnie swoje drugie imię:")) n = Len(InputBox("Wpisz swoje nazwisko:")) MsgBox WszystkoRazem(i, n) MsgBox (i) MsgBox (n) End Sub Function WszystkoRazem(ByVal i, n, Optional j) As Integer If IsMissing(j) Then WszystkoRazem = i + n Else WszystkoRazem = i + n + j End If i = i + 10 n = n + 10 End Function
Rodzaje błędów Błąd synktatyczny – występuje w chwili pisania kodu, Excel automatycznie wyszukuje błędy i stara się pomóc (patrz alt+F11/Tools/Options/Editor) Błąd wykonania – występuje w chwili wykonania procedury, np. odwołanie do nieistniejącego pliku lub obiektu w bieżącym arkuszu Błąd logiczny – wszystko się wykonuje, nie ma żadnych komunikatów o błędzie, ale rezultat procedury nie jest poprawny
Jak sprawdzić poprawność kodu? Można sprawdzać kod krok po kroku, czyli linijka po linijce (Debug/Step into albo F8) Można wykonywać kod do miejsca określonego kursorem (Debug/ Run to cursor albo ctrl+F8) Można wstawić w danym miejscu tzw. punkt przerwania (Debug/Toggle Breakpoint albo F9), jeśli podejrzewa się, że w danej linijce jest błąd Można wstawić czujkę, która obserwuje na bieżąco wartość danej zmiennej (Debug/Add Watch albo shift+F9) lub okno zmienne lokalne (View/Locals Window) Można zatrzymać program poprzez: Ctrl+Break Ustawienie punktów przerwania Wpisanie instrukcji stop Ustawienie czujek (przerywa, gdy spełnione są zdefiniowane warunki)
Co zrobić po wychwyceniu błędu? Sposób I Sub Iloraz() Dim a As Single Dim b As Single Dim c As Single a = InputBox("Wpisz dzielną:") b = InputBox("Wpisz dzielnik:") On Error GoTo Uwaga c = a / b MsgBox (a / b) Exit Sub Uwaga: MsgBox ("Pamiętaj użytkowniku, nie dziel przez zero!") End Sub
Co zrobić po wychwyceniu błędu? Sposób nr 2 Sub Iloraz1() Dim a As Single Dim b As Single Dim c As Single a = InputBox("Wpisz dzielną:") b = InputBox("Wpisz dzielnik:") On Error Resume Next c = a / b If Err = 0 Then MsgBox (CStr(a) + " / " + CStr(b) + " = " + CStr(a / b)) Else MsgBox ("Pamiętaj użytkowniku, nie dziel przez zero!") End If On Error GoTo 0 End Sub
Okno wprowadzania danych Przykładowe okno dialogowe to okno wprowadzania danych (Input Box), służące do wprowadzania: tekstu, liczb lub zakresu Oprócz komunikatu, okno może zawierać: tytuł, wartość domyślną, współrzędne położenia typ danych zwracanej wartości
Okno wprowadzania danych - przykład Sub Iloraz2() Dim a As Single Dim b As Single Dim c As Single a = InputBox("Wpisz dzielną:", "Program Iloraz", "250416") b = InputBox("Wpisz dzielnik:", "Program Iloraz", "376") On Error Resume Next c = a / b If Err = 0 Then MsgBox (CStr(a) + " / " + CStr(b) + " = " + CStr(a / b)) Else MsgBox ("Pamiętaj użytkowniku, nie dziel przez zero!") End If On Error GoTo 0 End Sub
Okno komunikatu Okno komunikatu (MsgBox) wyświetla komunikat lub pobiera prostą odpowiedź od użytkownika Podczas zajęć korzystaliśmy z tego okna wielokrotnie, lecz bez tytułu i przycisków Można określić, które przyciski pojawią się na oknie (patrz slajd 17) Następnie można pobrać odpowiedź użytkownika (patrz slajd 18)
Stałe odpowiadające przyciskom obsługiwanym przez funkcję MsgBox Stała Wartość Opis vbOKOnly Wyświetl tylko przycisk OK. VbOKCancel 1 Wyświetl przycisk OK i Anuluj. VbAbortRetrylgnore 2 Wyświetl przycisk Przerwij, Ponów i Ignoruj. VbYesNoCancel 3 Wyświetl przyciski Tak, Nie i Anuluj. VbYesNo 4 Wyświetl przycisk Tak i Nie. VbRetryCancel 5 Wyświetl przyciski Ponów i Anuluj. VbCritical 16 Wyświetl ikonę Komunikat krytyczny. VbQuestion 32 Wyświetl ikonę Pytanie ostrzegawcze. VbExclamation 48 Wyświetl ikonę Komunikat ostrzegawczy. VbInformation 64 Wyświetl ikonę Komunikat informacyjny. VbDefaultButton1 Domyślny jest przycisk pierwszy. VbDefaultButton2 256 Domyślny jest przycisk drugi. VbDefaultButton3 512 Domyślny jest przycisk trzeci. VbDefaultButton4 768 Domyślnym przycisk jest przycisk czwarty. VbSystemModal 4096 Okno modalne w systemie; działanie wszystkich aplikacji zostanie wstrzymane, dopóki użytkownik nie odpowie na wyświetlony komunikat. (Może nie działać w każdej sytuacji).
Wartości zwracane przez funkcję MsgBox Stała Wartość Opis vbOK 1 Naciśnięto przycisk OK. vbCancel 2 Naciśnięto przycisk Anuluj. vbAbort 3 Naciśnięto przycisk Przerwij. vbRetry 4 Naciśnięto przycisk Ponów. vbIgnore 5 Naciśnięto przycisk Ignoruj. vbYes 6 Naciśnięto przycisk Tak. vbNo 7 Naciśnięto przycisk Nie.
Okno komunikatu - przykład Sub Iloraz3() Dim a As Single Dim b As Single Dim c As Single a = InputBox("Wpisz dzielną:", "Program Iloraz", "250416") b = InputBox("Wpisz dzielnik:", "Program Iloraz", "376") On Error Resume Next c = a / b If Err = 0 Then MsgBox (CStr(a) + " / " + CStr(b) + " = " + CStr(a / b)) Else Ans = MsgBox("Czy będziesz pamiętał(-a) Szanowny(-a) Użytkowniku(-czko), żeby nie dzielić przez zero?", vbYesNo + vbQuestion + vbDefaultButton2) Select Case Ans Case vbYes Iloraz3 Case No Exit Sub End Select End If On Error GoTo 0 End Sub
Ćwiczenie – projektowanie własnego okna dialogowego i procedur zdarzeń Zadanie polega na utworzeniu formularza, który będzie zawierał: - listę makr - przycisk wykonujący zaznaczone makro - kontrolkę edycji zakresu komórek - pole wyboru określające, czy wypełnienie zakresu ma być jasne czy nie - trzy przyciski opcji określające kolor wypełnienia - przycisk przełączający wypełnienie zakresu lub jego brak
Ćwiczenie - ściągawka Obiekt Name Caption/Text UserForm usfCwiczeniowy ListBox lstLista CommandButton cmdWykonaj Wykonaj Makro RefEdit refZakres a1 Frame frmWypelnienie Jakie wypełnienie? frmKolor Jaki kolor? CheckBox chkJasne jasne OptionButton OptionButton1 żółty OptionButton2 czerwony OptionButton3 niebieski ToggleButton tglWypelnienie Wypełnienie zakresu
Procedura zdarzeń Initialize() Private Sub UserForm_Initialize() With lstLista .AddItem "Iloraz" .AddItem "Iloraz1" .AddItem "Iloraz2" .AddItem "Iloraz3" .AddItem "LiczbaLiter" End With OptionButton1.Value = True End Sub
Procedura zdarzeń Click() Private Sub cmdWykonaj_Click() Select Case lstLista.ListIndex Case -1 MsgBox "Wybierz makro z listy" Exit Sub Case 0: Call Iloraz Case 1: Call Iloraz1 Case 2: Call Iloraz2 Case 3: Call Iloraz3 Case 4: Call LiczbaLiter End Select End Sub
Procedury zdarzeń AfterUpdate() i Change() Private Sub tglWypelnienie_AfterUpdate() Call Wypelnienie End Sub Private Sub OptionButton1_Change() Private Sub OptionButton2_Change() Private Sub OptionButton3_Change() Private Sub chkJasne_Change()
Procedura zmieniająca wypełnienie komórki If OptionButton1.Value = True Then .ColorIndex = 6 ElseIf OptionButton2.Value = True Then .ColorIndex = 3 Else .ColorIndex = 5 End If .TintAndShade = 0 .PatternTintAndShade = 0 End With With Range(refZakres.Text).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ColorIndex = 0 End Sub Private Sub Wypelnienie() If tglWypelnienie.Value = True Then With Range(refZakres.Text).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic If chkJasne.Value = True Then If OptionButton1.Value = True Then .ColorIndex = 19 ElseIf OptionButton2.Value = True Then .ColorIndex = 22 Else .ColorIndex = 23 End If
Uzupełnianie danych po imporcie z internetu Zarejestrujmy makro polegające na pobraniu danych z internetu (Dane/Z sieci Web) Dodajmy w makrze przejście do właściwej komórki za pomocą instrukcji: Range(„A1”).Select Selection.End(xlDown).Select Cells(ActiveCell.Row + 1, 1).Select Wklejmy wektor bieżących danych za pomocą Możemy usunąć zakres skojarzony z kwerendą internetową