przez:
admin
czytany 25876 razy.
Z poprzedniej części kursu wiemy już jak zorganizowany jest edytor VBA, wiemy
też, że moduły są to miejsca, w których umieszczamy kod źródłowy.
Ale w jaki sposób? Instrukcje w modułach są pogrupowane w procedury i funkcje.
Ciąg instrukcji, zawarty pomiędzy słowami kluczowymi Sub a End Sub to
procedura.
Przykładowa procedura, obliczającą sumę dwu liczb, przedstawiona jest poniżej:
Sub Oblicz()
Dim liczba1 As Double
Dim liczba2 As Double
Dim wynik As Double
liczba1 = 10
liczba2 = 2.56
wynik = liczba1 + liczba2
MsgBox "Wynik:" & wynik
End Sub
Po słowie kluczowym Sub występuje nazwa
procedury i dwa nawiasy. W nawiasach mogą występować argumenty, czyli dane,
przekazywane do procedury przez inna procedurę. Następny blok instrukcji (trzy
wiersze, zaczynające się od słowa kluczowego Dim) to deklaracja zmiennych -
czyli zarezerwowanie w pamięci komputera miejsca na dane. W Visual Basicu
deklaracja zmiennych nie jest co prawda niezbędna, gdyż kompilator sam
niezadeklarowane zmienne określa jako typ Variant. Jest to jednak bardzo
rozbudowany typ danych i zajmuje dużo miejsca w pamięci. Dlatego też
deklarowanie zmiennych jest dobrym sposobem na optymalizowanie zużycia zasobów
komputera.
Następne wiersze to już instrukcje podstawienia, do zmiennych liczba1 i liczba2
są przypisane odpowiednie wartości, a do zmiennej wynik - ich suma. Ostatni
wiersz służy do wypisania na ekranie wyniku dodawania. Jest to standardowe
okienko komunikatu systemu Windows.
Funkcja - jest ciąg instrukcji, występujący pomiędzy słowami
kluczowymi Function a End Function. Od procedury różni się tym, że funkcja
zwraca wynik swoich działań. Przeanalizujmy przykład:
Function Suma(a As Double, b As Double) As Double
Suma = a + b
End Function
Sub Oblicz()
Dim liczba1 As Double
Dim liczba2 As Double
liczba1 = 10
liczba2 = 2.56
MsgBox "Wynik:" & Suma(liczba1, liczba2)
End Sub
Analizę zaczynamy od procedury Oblicz - wszystko jest tak, jak w
poprzednim przypadku, aż do instrukcji MsgBox. Nie występuje tutaj zmienna
reprezentująca wynik, jest natomiast wywołanie funkcji Suma. Funkcja Suma
posiada 2 argumenty, a i b określone jako typ Double (liczba rzeczywista),
wynik działania, czyli wartość zwracana przez ta funkcję, również jest
określony jako Double. Wynik tej funkcji to suma argumentów a i b. Stosowanie
funkcji to bardzo efektywne rozwiązanie w przypadku, gdy mamy do zachodzi
potrzeba wielokrotnego dokonywania jakichś operacji. Zamiast za każdym razem
wypisywać w procedurze skomplikowane wzory piszemy funkcję wykonującą tę
operacje, a w procedurze odwołujemy się do tej funkcji.
Taki sposób programowania nazywamy programowaniem modułowym.
Zanim przejdziemy do dalszej części kilka słów o podstawowych instrukcjach w
VBA.
Instrukcja warunkowa If.
Jeżeli chcemy by procedura wykonała różne zadania w zależności od np. wartości
jakiej zmienne używamy instrukcji If. Poniżej przedstawiono kilka podstawowych
składni tej instrukcji w VBA:
If wyrazenie_logiczne Then {ciag
instrukcji}
If wyrazenie_logiczne Then {ciag instrukcji} Else
{inny_ciag_instrukcji}
If wyrazenie_logiczne Then
{ciag instrukcji}
Else
{inny_ciag_instrukcji}
End If
wyrazenie_logiczne to takie wyrażenie które może przyjąć tylko jedna w dwu
wartości: True (Prawda) albo False (Fałsz). Wyrażeniem logicznym może być np.
wynik porównania dwu liczb (np. A<B).
Wyrażenie {ciag_instrukcji) występujące po słowie kluczowym Then reprezentuje
instrukcje wykonywane w przypadku, gdy wyrażenie logiczne posiada wartość True.
Jeżeli wartość wyrażenia wynosi False, realizowane są instrukcje po słowie
kluczowym Else.
Instrukcja wyboru Select Case.
W przypadku instrukcji If...Then...Else mamy do wybory tylko dwie sytuacje.
Jeżeli chcemy sterować przebiegiem programu w zależności od większej ilosci
warunków, stosujemy Instrukcje Select Case. Jej składnia wygląda następująco:
Select Case wartosc_badana
Case wartosc_1
{ciag_instrukcji_1}
Case wartosc_2
{ciag_instrukcji_2}
....
Case wartosc_n
{ciag_instrukcji _n}
Case Else
{ciag_instrukcji}
End Select
W zależności od wartości wyrażenia wartosc_badana wykonywane będą
odpowiednie instrukcje. W przypadku, gdy wartosc_badana będzie równa wartosc_1
to wykonywany będzie ciag_instrukcji_1, analogiczne dla pozostałych przypadków.
W przypadku, gdy wartosc_badana nie będzie równa żadnej z wymienionych wartości
, wykonywany będzie ciąg instrukcji po wierszy Case Else.
To tyle tytułem wstępu. W dalszej części kursu napiszemy pierwszy
program. Będzie prosty, czterodziałaniowy kalkulator.
Wstawiamy do projektu formularz, nazywamy go frmKalkulator. Etykietę ustawiamy
na "Kalkulator", następnie dodajemy do projektu moduł i nazywamy go
modKalkulator (patrz rysunek).
Na formularzu osadzamy (wykorzystując paletę Toolbox):
- trzy pola tekstowe (nazwane odpowiednio txtS1, txtS2 i txtWynik),
Polom tekstowym txtS1 i txtS2 ustawiamy właściwości MaxLength (maksymalna
długość) na 6 znaków. Pole txtWynik ma właściwość MaxLength ustawiona na 12,
dodatkowo, żeby użytkownik nic nie mógł wpisać ustawiamy właściwość Locked na
True.
- cztery przyciski opcji (Option Buttons) nazwane optDodawanie, optOdejmowanie,
optMnozenie i optDzielenie,
- przycisk polecenia (Command Button), nazwany cmdKoniec z właściwością Caption
(etykieta) ustawiona na "koniec",
- etykiety ze znakiem działania (lblDzialanie) i ze znakiem równości (nazwa
dowolna)
Całość powinna wyglądać jak na rysunku:
A teraz uwaga, dodajemy kod!
W oknie modułu modKalkulator wpisujemy wpisujemy procedurę, która oblicza wynik
działania.
Sub Oblicz()
Dim dblS1 As Double
Dim dblS2 As Double
Dim dblWynik As Double
'Konwersja danych na typ Double
dblS1 = CDbl(frmKalkulator.txtS1.Text)
dblS2 = CDbl(frmKalkulator.txtS2.Text)
Select Case frmKalkulator.lblDzialanie.Caption
Case "+"
dblWynik = dblS1 + dblS2
Case "-"
dblWynik = dblS1 - dblS2
Case "x"
dblWynik = dblS1 * dblS2
Case ":"
dblWynik = dblS1 / dblS2
End Select
'Wyświetlenie wyniku
frmKalkulator.txtWynik.Text = dblWynik
End Sub
oraz funkcję, która sprawdza poprawność wpisanych danych.
Function SprawdzDane() As Boolean
Dim objKontrolka As Control
SprawdzDane = True
'Jeżeli zawartość pola tekstowego nie jest liczbą
'idĽ do etykiety koniec
Set objKontrolka = frmKalkulator.txtS1
If Not IsNumeric(objKontrolka.Text) Then GoTo koniec
Set objKontrolka = frmKalkulator.txtS2
If Not IsNumeric(objKontrolka.Text) Then GoTo koniec
Set objKontrolka = Nothing
Exit Function
koniec:
MsgBox "Wpisz prawidłowe dane!", vbCritical
'Ustawienie fokusa na polu tekstowym z nieprawidłowymi danymi
objKontrolka.SetFocus
'zaznaczenie tekstu
objKontrolka.SelStart = 0
objKontrolka.SelLength = objKontrolka.TextLength
Set objKontrolka = Nothing
SprawdzDane = False
End Function
W oknie kodu formularza wpisujemy przedstawione poniżej procedury. Procedury
te, zwane zdarzeniowymi są uruchamiane w wyniku operacji użytkownika,
podejmowanych na elementach formularza (np. gdy użytkownik kliknie przycisk
cmdOblicz, uruchomiona zostanie procedura cmdOblicz_Click.)
Private Sub cmdOblicz_Click()
'Procedura wywołuje funkcje SprawdzDane
'z modułu modKalkulator.
'Instrukcja warunkowa If... Then sprawdza
'wartosc tej funkcji i jeżeli ma ona wartosc TRUE,
'to uruchamia procedurę Oblicz
If SprawdzDane Then Oblicz
End Sub
Private Sub optDodawanie_Click()
'Znak działania to etykieta lblDzialanie
'Gdy użytkownik kliknie na przycisk opcji
'znak działania zostanie odpowiednio zmieniony,
'a wynik poprzedniego działania skasowany.
lblDzialanie.Caption = "+"
txtWynik.Text = ""
End Sub
Private Sub optDzielenie_Click()
lblDzialanie.Caption = ":"
txtWynik.Text = ""
End Sub
Private Sub optMnozenie_Click()
lblDzialanie.Caption = "x"
txtWynik.Text = ""
End Sub
Private Sub optOdejmowanie_Click()
lblDzialanie.Caption = "-"
txtWynik.Text = ""
End Sub
To w zasadzie wszystko. Pozostaje jeszcze sprawa uruchamiania
programu, zależy ono od aplikacji macierzystej. Jeżeli wpisaliście ten kod do
edytora VBA w AutoCADzie, zajrzyjcie tutaj.
We wszystkich aplikacjach do uruchamiania procedur VBA służy przycisk F5,
należy tylko kursor ustawić w oknie formularza i jazda.
Cóż, tyle tym razem. Czytajcie i analizujcie przedstawiony kod, a
niebawem zabierzemy się do tworzenia naprawdę profesjonalnych makr.
wstecz