Algorytmika i Programowanie VBA 1

Transkrypt

Algorytmika i Programowanie VBA 1
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
logiczny
True, False
Byte
mała liczba całkowita
0..255
Integer
liczba całkowita 16-bit
-32768..32767
Long
liczba całkowita 32-bit
-231..231-1
Single
liczba rzeczywista
ok. 7 cyfr znacz.
Double
liczba rzeczywista
15 cyfr znaczących
String
łańcuchy znakowe
"napis"
Variant
uniwersalny
Wyrażenia i operatory
• Formalnie wyrażenie to:
•
•
•
•
Zmienna, Stała lub Funkcja()
Oper1 Wyrażenie
(operator jednoargumentowy)
Wyr_A Oper2 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
•
•
•
•
•
•
^
–
*/
\
Mod
+–
potęgowanie
negacja (jednoargumentowy)
mnożenie i dzielenie
dzielenie całkowitoliczbowe
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