Algorytmika i Programowanie VBA 1 - podstawy Tomasz Sokół ZZI, IL, PW Czas START uruchamianie środowiska VBA w Excelu Alt-F11 lub Narzędzia / Makra / Edytor Visual Basic konfiguracja środowiska VBA przy pierwszym uruchomieniu należy wymusić jawne deklaracje zmiennych menu Tools / Options... Option Explicit wstawianie modułów menu Insert / Module kody swoich programów piszemy tylko w modułach!!! 1
Program program to ciąg instrukcji podany w odpowiedniej kolejności (algorytm), instrukcje mogą być grupowane w jednym lub kilku podprogramach instrukcje dzielimy na: instrukcje wykonywalne deklaracje / definicje oprócz instrukcji program może też zawierać komentarze i specjalne dyrektywy kompilatora w VBA komentarz zaczyna się znakiem apostrofu ' i wszystkie znaki po nim do końca danej linii są ignorowane przez kompilator (służą tylko programiście) Program w VBA w VBA programem może być dowolna bezparametrowa procedura Sub Nazwa() 'kod programu End Sub uruchamianie programu może odbywać się: z poziomu Excela (Alt-F8) lub z poziomu edytora VBA (F5) uwaga: w VBA można też uruchamiać programy w trybie debugowania (krokowo), posługując się klawiszem F8 2
Deklaracje zmiennych Dim Nazwa_Zmiennej As Typ Dim i As to słowa kluczowe deklaracji deklaracje mogą być w dowolnym miejscu programu, ale przed użyciem zmiennej!!! deklaracje można grupować w jednej linii, ale typ każdej zmiennej należy w VBA definiować niezależnie!!! Dim x1, x2, x3 As Double (tu x1 i x2 przyjmą domyślny typ Variant) Dim x1 as Double, x2 as Double,... (tak jest OK) Typ określa rodzaj możliwych do przechowywania danych liczbowe, logiczne, łańcuchy znakowe, itp Nazwa_Zmiennej to unikalny identyfikator określany przez programistę Nazwy zmiennych Nazwa zmiennej to unikalny identyfikator nie może kolidować z innymi nazwami używanymi w programie (a ściślej w zakresie widzialności) zmienne, procedury, funkcje, obiekty, predefiniowane typy danych (Double, Integer,...) słowa kluczowe (zarezerwowane identyfikatory składniowe języka), m.in. Sub, Dim, End, If, Then, Else,... składa się z ciągu liter, cyfr i znaku podkreślenia _, a pierwszy znak musi być literą, nie może zawierać znaków specjalnych, interpunkcyjnych, spacji, itp., nie powinno się też używać znaków narodowych (ąćęłńóśżź) w VBA duże i małe litery nie są rozróżniane MojaZmienna == MOJAzmienna == mojazmienna ==... 3
Podstawowe typy danych Boolean Byte Integer Long Single Double String Variant logiczny mała liczba całkowita liczba całkowita 16-bit liczba całkowita 32-bit liczba rzeczywista liczba rzeczywista łańcuchy znakowe uniwersalny True, False 0..255-32768..32767-2 31..2 31-1 ok. 7 cyfr znacz. 15 cyfr znaczących "napis" Wyrażenia i operatory Formalnie wyrażenie to: Zmienna, Stała lub Funkcja() Oper1 Wyrażenie (operator jednoargumentowy) Wyr_AOper2 Wyr_B (operator dwuargumentowy) (Wyrażenie) grupowanie wyrażeń w nawiasach () Wyrażenia/operatory dzielimy na: arytmetyczne działania na liczbach +-*/... konkatenacji łączenie (sklejanie) łańcuchów znakowych porównania sprawdzanie: mniejsze, równe, logiczne zdania logiczne: negacja, alternatywa,... Istotną rolę odgrywają priorytet operatorów i automatyczne konwersje typów danych 4
Operatory arytmetyczne Wg priorytetu ^ potęgowanie negacja (jednoargumentowy) */ mnożenie i dzielenie \ dzielenie całkowitoliczbowe Mod reszta z dzielenia (całkowitego) + dodawanie i odejmowanie Przykłady: a + b * c ^ d == a + (b * (c ^ d)) uwaga: 1 / a*b == (1/a) * b == b / a (gdyż * ma taki sam priorytet jak /) w wątpliwych sytuacjach używaj nawiasów 1 / (a*b) lub 1 / a / b Pozostałe operatory (również wg priorytetu cd.) & konkatenacja: "abc" & "xyz" = "abcxyz" operatory porównania: =, <>, <, >, <=, >= operatory logiczne: Not negacja (jednoargumentowy) And koniunkcja Or alternatywa Xor, Eqv, Imp Uwagi: domyślną kolejność operacji możemy zmienić stosując nawiasy () należy unikać budowania zbyt złożonych wyrażeń, czytelniejsze i efektywniejsze może być składanie podwyrażeń w kolejnych instrukcjach przypisania!!! 5
Funkcje matematyczne standardowy zestaw funkcji wbudowanych w VBA jest bardzo skromny!!! wykaz dostępnych funkcji można znaleźć w helpie lub poprzez kwalifikator Math (obiekt), np. Math.Sin(x) można go poszerzyć pisząc własne funkcje, np. Log2(x) = Ln(x) / Ln(2) lepiej jednak skorzystać z funkcji wbudowanych w Excela, za pośrednictwem obiektu WorksheetFunction, np. WorksheetFunction.Asinh(x) Area Sinus Hiperboliczny WorksheetFunction.Pi() liczba π WorksheetFunction.Log(x,2) logarytm o podstawie 2 Instrukcje - podział instrukcja przypisania: Zmienna = Wyrażenie instrukcje sterujące warunkowe (If..Then..Else..) pętli (For..Next, Do...Loop) skoku (GoTo, Exit For/Do/Sub/...) instrukcja wywołania procedury [Call] Nazwa_Proc Par1, Par2,... uwaga: w VBA parametry procedury podajemy bez nawiasów, natomiast przy wywoływaniu funkcji parametry podajemy w nawiasach, np. Sin(x), ale MsgBox "Komunikat" 6
Instrukcja If...Then...Else If...Then...Else to podstawowa instrukcja sterująca, umożliwia rozwidlanie algorytmu w zależności od spełnienia (bądź nie) badanego warunku logicznego składnia If ma dwie postaci: jednowierszową blokową w danym If'ie wykonywana jest tylko jedna gałąź instrukcji gdy kolejne warunki logiczne się zawierają sprawdzany jest tylko pierwszy!!! If "jednowierszowy" If WarLog Then Instrukcja1 [Else Instrukcja2] Instrukcja1 jest wykonywana gdy spełniony jest warunek logiczny WarLog, w przeciwnym wypadku wykonywana jest Instrukcja2 (jeśli ją podano) tą postać If'a należy stosować tylko w wyjątkowych przypadkach (jedna instrukcja) i z dużą rozwagą pomimo, że VBA dopuszcza grupowanie instrukcji w jednym wierszu (poprzez operator dwukropka :) to należy tego bezwzględnie unikać, np. If x > 0 Then a = 1 : b = 2 Else a = 2 : b = 1 formalnie poprawnie, ale lepszy jest tu If blokowy 7
If blokowy If WarLog Then ciąg instrukcji 1 [ElseIf WarLog2 Then ciąg instrukcji 2]... [Else ciąg instrukcji "else"] End If blok główny (wymagany) blok opcjonalny ElseIf może ich być więcej niż 1 opcjonalny blok Else wykonywany tylko wtedy gdy żaden z podanych wyżej warunków nie był spełniony obejmuje wszystkie "pozostałe przypadki" 8