Professional Documents
Culture Documents
Access. Programowanie W VBA
Access. Programowanie W VBA
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Access.
Programowanie w VBA
Autor: Charles E. Brown
Tumaczenie: Krzysztof Masowski (wstp, rozdz. 1 8),
Grzegorz Werner (rozdz. 9 21, dod. A)
ISBN: 83-7361-807-4
Tytu oryginau: Access VBA Programming
Format: B5, stron: 408
Spis treci
O Autorach ........................................................................................ 9
Wstp ............................................................................................. 11
Cz I
Cz II
Spis treci
5
Uywanie opcji edytora VBA........................................................................................ 125
Karta Editor............................................................................................................. 126
Karta Editor Format ................................................................................................ 129
Karty General i Docking ......................................................................................... 130
Siganie po pomoc ........................................................................................................ 131
Rozpoczynanie nowej procedury w VBA ..................................................................... 133
Podsumowanie .............................................................................................................. 134
Spis treci
7
Bezpieczestwo i Access 2003...................................................................................... 268
Jet Sandbox ............................................................................................................. 269
Zabezpieczenia makr............................................................................................... 269
Podsumowanie .............................................................................................................. 273
Cz V
Tworzenie aplikacji.......................................................315
Dodatki .......................................................................................351
Dodatek A Obiekt DoCmd ............................................................................... 353
AddMenu ...................................................................................................................... 354
ApplyFilter .................................................................................................................... 354
Beep .............................................................................................................................. 355
CancelEvent .................................................................................................................. 356
Close.............................................................................................................................. 356
CopyDatabaseFile ......................................................................................................... 358
CopyObject ................................................................................................................... 358
DeleteObject.................................................................................................................. 359
DoMenuItem ................................................................................................................. 360
Echo .............................................................................................................................. 360
FindNext........................................................................................................................ 361
FindRecord.................................................................................................................... 362
GoToControl ................................................................................................................. 364
GoToPage...................................................................................................................... 364
GoToRecord.................................................................................................................. 365
Hourglass....................................................................................................................... 366
Maximize....................................................................................................................... 366
Minimize ....................................................................................................................... 367
MoveSize....................................................................................................................... 367
OpenDataAccessPage.................................................................................................... 368
OpenDiagram ................................................................................................................ 369
OpenForm ..................................................................................................................... 369
OpenFunction................................................................................................................ 371
OpenModule.................................................................................................................. 371
OpenQuery .................................................................................................................... 372
OpenReport ................................................................................................................... 373
OpenStoredProcedure.................................................................................................... 374
OpenTable ..................................................................................................................... 375
OpenView ..................................................................................................................... 376
OutputTo ....................................................................................................................... 377
PrintOut......................................................................................................................... 379
Quit ............................................................................................................................... 380
Rename.......................................................................................................................... 380
RepaintObject................................................................................................................ 382
Requery ......................................................................................................................... 382
Restore .......................................................................................................................... 382
RunCommand ............................................................................................................... 383
RunMacro...................................................................................................................... 383
RunSQL ........................................................................................................................ 384
Save............................................................................................................................... 385
SelectObject .................................................................................................................. 386
SendObject .................................................................................................................... 387
SetMenuItem ................................................................................................................. 388
SetWarnings .................................................................................................................. 389
ShowAllRecords............................................................................................................ 389
ShowToolbar ................................................................................................................. 390
TransferDatabase........................................................................................................... 391
TransferSpreadsheet ...................................................................................................... 391
TransferSQLDatabase ................................................................................................... 391
TransferText .................................................................................................................. 391
Skorowidz...................................................................................... 393
Rozdzia 6.
Podstawy
programowania w VBA
W rozdziale 5 poznae rodowisko VBA, jego struktur, koncepcj i edytor. Teraz
zamierzamy przedstawi podstawy programowania oraz specyficzn skadni jzyka
VBA. Wrcimy do koncepcji omwionych w rozdziale 5 i przyjrzymy si im dokadniej,
zaczynajc od przegldu miejsc, gdzie kod jest przechowywany, oraz typw blokw,
na jakie jest dzielony. Czynic to, szczegowo zajmiemy si rwnie problemem
zmiennych. Trudno jest mwi o zmiennych, pomijajc ich szczeglny typ nazywany
tablic (array).
Zamierzamy take przyjrze si kilku wbudowanym narzdziom VBA, znacznie uatwiajcym wykonywanie zada. Zakoczymy nasze rozwaania, przygldajc si rnym
typom struktur programistycznych i ich stosowaniu w rodowisku VBA.
Podstawy programowania
Jak ju powiedzielimy w rozdziale 5, kod VBA jest zapisywany i przechowywany
w moduach. Zapewne pamitasz, e istniej dwa podstawowe typy moduw: powizane
z raportami i formularzami oraz oglne, przechowujce procedury uywane w caym
projekcie.
Istnieje jeszcze jeden typ zwany moduem klasy, ktry zawiera kod powizany z obiektem. O moduach bdziemy jeszcze mwi w pozostaej czci ksiki.
Zanim zaczniesz pisa kod VBA, musisz stworzy modu. Poniewa moduy dla formularzy i raportw s tworzone wraz z formularzami i raportami, tutaj skupimy si na
tworzeniu moduu standardowego.
86
87
O tym, e nazwa zostaa zmieniona, moesz si teraz upewni w oknie Project (rysunek 6.4) i w oknie Baza danych (rysunek 6.5).
Rysunek 6.4.
Okno Project
po zmianie
nazwy moduu
Nazw moduu moesz rwnie zmieni, klikajc j prawym przyciskiem myszy w oknie
dialogowym Baza danych i wybierajc z menu podrcznego polecenie Zmie nazw.
88
Rysunek 6.5.
Okno Baza danych
po zmianie nazwy
moduu
Tworzenie procedur
Przypominam z rozdziau 5, e wikszo kodu VBA jest zapisywana w blokach zwanych procedurami. Dzielimy je na dwa rodzaje: procedury typu (podprogramy)
i procedury typu (funkcje). Podprogramy wykonuj zadania, ale nie zwracaj
adnej wartoci, za funkcje zwracaj wartoci.
W wikszoci przypadkw na grze moduu bdziesz widzie dwie nastpujce linie:
S to tak zwane deklaracje oglne moduu. Wszelki kod wpisany w tej sekcji bdzie
wpywa na wszystkie procedury w caym module.
Linia umoliwia wybranie jednego z trzech sposobw sortowania
acuchw znakowych wewntrz kodu:
powoduje sortowanie w takim samym porzdku
89
Rysunek 6.6.
Opcja Require
Variable Declaration
Zauwa, e edytor VBA nakreli poziom lini oddzielajc now procedur od deklaracji oglnych. Pomaga to wyrnia i oddziela procedury i nie ma adnego wpywu
na ich dziaanie.
Jest wane, aby deklarujc procedur, zaczyna od sowa i koczy deklaracj
nawiasami. Podkrelam, e to wane, bo uwaam, i od pocztku naley stosowa
waciw skadni. Jeeli pominiesz nawiasy, edytor VBA wstawi je za Ciebie, gdy
tylko naciniesz Enter.
Zwykle w nawiasach umieszcza si wszelkie argumenty, jakich oczekuje procedura,
ale nawet gdy nie ma adnych argumentw, puste nawiasy musz pozosta.
Zaraz po naciniciu klawisza Enter edytor VBA doda, zamykajc procedur, lini
. Cay napisany przez Ciebie kod musisz umieci midzy wyraeniem otwierajcym i zamykajcym.
Na kolejnych kartach ksiki bd robi uwagi o tym, jakie zwyczaje i praktyki programistyczne uwaam za dobre. Cho nie s one bezwzgldnie obowizujce, s akceptowane przez wielu programistw i stay si standardami przemysowymi.
90
Zgodnie z pierwszym zwyczajem, nazwa nadawana procedurze musi opisywa jej dziaanie, np. # (dodaj liczby). Kady programista od razu rozpozna, do czego ta
procedura suy. Dodatkowo, cho VBA nie rozrnia liter wielkich i maych, czasami
musi wspdziaa z programami, ktre to robi. Oglna konwencja nazw, wspomniana
w rozdziale 4, nakazuje rozpoczynanie nazwy od maej litery, wyrnianie wielkimi
literami pocztkw wyrazw w zbitkach sownych, niestosowanie spacji i zaczynanie
nazw raczej od liter ni cyfr. Rozpoczynanie nazw od liter, a nie od cyfr to w wielu
jzykach, rwnie w VBA, wicej ni zwyczaj to obowizujca zasada, narzucona
przez reguy jzyka VBA.
Drugi zwyczaj to zalecenie wcinania kodu procedury. Dziki temu atwo odszuka, gdzie
si procedura rozpoczyna, a gdzie koczy. Aby zrobi wcicie, zwykle trzykrotnie
naciskam klawisz spacji lub uywam klawisza Tab. Edytor VBA zapamita wcicie
i automatycznie bdzie je stosowa do nastpnych linii.
Trzecim zwyczajem jest staranne komentowanie kodu. Moesz to z atwoci robi,
wpisujc pojedynczy apostrof na pocztku linii. Dziki temu VBA zignoruje t lini,
traktujc j jako komentarz.
Poniszy przykad pokazuje wcicie i komentarz:
'Deklaracja zmiennych
Deklarowanie zmiennych
Dwoma zasadniczymi skadnikami procedur s zmienne i metody. Mwic po prostu,
zmienna to kawaek informacji przechowywanej gdzie w pamici komputera. Moe
to by liczba, litera lub cae zdanie. Okrelenie miejsca przechowywanej informacji
jest moliwe dziki nadanej nazwie. Powiedzmy, e w kodzie mamy tak lini:
91
Opis
Zmienna
zwraca wartoci lub
(
!
lub
"#). Mona je rwnie
wyrazi liczbowo: $
, %&.
'
'
)(
*(
+
(
(
Pamitaj, e VBA nie odrnia liter wielkich i maych. Nazwy zmiennej , #
i bd rozpoznawane jako ta sama nazwa.
Nadajc zmiennej warto, musisz zdawa sobie spraw z wielu rzeczy. Po pierwsze,
warto nadawana zmiennej typu $ musi by wzita w cudzysw1. Prawidowe
przypisanie wartoci zmiennej typu $ moe wyglda nastpujco:
,(
-.!
/-
92
Ponadto musisz pamita, e warto nadawana zmiennej typu musi by ujta
w znaki %. Prawidowe przypisanie wartoci zmiennej typu moe wyglda
nastpujco2:
0
,
0
1&$2$32$1
Przedrostek
'
'
'
)(
*(
(
+
+
(
(
(
Dobrym pomysem jest, aby przy nadawaniu nazw obiektom jakiegokolwiek typu
stosowa nazwy opisowe. W ten sposb kod staje si samoopisujcym.
Oto przykad prawidowego zadeklarowania zmiennej daty:
0
,
93
Variant
Typ zmiennej, o jakim jeszcze nie mwilimy, to '. Zalenie od tego, z jakim
programist rozmawiasz, dowiesz si albo e jest to potne narzdzie programistyczne,
albo e to rozwizanie dla niechlujnych programistw.
' pozwala VBA na samodzielne okrelanie, jaki typ danych jest zapamitywany.
VBA przeksztaci wwczas typ ( na $. Jeeli potem dokonasz kolejnego
przypisania wartoci:
4
5'
&
powoduje zbdne zajmowanie pamici i spowalnia dziaanie kodu. Zanim wic zdecydujesz si na uywanie zmiennych ', rozwa dobrze wszystkie za i przeciw.
Najlepiej, aby jako pocztkujcy traktowa zmienne ' z wielk ostronoci
i stosowa przede wszystkim jawne deklaracje typw podstawowych.
Constant
Wielokrotnie chcesz zadeklarowa wartoci, ktre nie bd si zmienia. Uywamy
do tego typu , deklarowanego za pomoc sowa kluczowego , zamiast
, stosowanego w normalnych deklaracjach.
Oto przykad:
&,)(&
,
122$$71
94
Wejcie i wyjcie
Zatem wiesz ju, jak za pomoc zmiennych zachowywa dane. Ale w jaki sposb wprowadzi informacj, jaka ma by zapamitana przez zmienn? Albo jak odczyta informacje zapamitane przez zmienne? Pod wieloma wzgldami wanie tego bdziemy
si uczy w pozostaej czci ksiki. Ale dla przetestowania naszego kodu zacznijmy
od paru najprostszych technik.
Jednym z najprostszych sposobw pobrania informacji od uytkownika i podstawienia
jej pod zmienn jest uycie wbudowanej funkcji !. Spowoduje to wywietlenie
prostego okna dialogowego z wezwaniem.
Kod naszego prostego przykadu uzupenij pokazanymi niej liniami, napisanymi pismem
pogrubionym:
'Deklaracja zmiennych
&,)(
,)(
,)(
'Uycie InputBox do wprowadzenia liczb
Spowoduje to wywietlenie pokazanego tu okna dialogowego do wprowadzenia pierwszej liczby (do wprowadzenia drugiej liczby zostanie wywietlone oddzielne okno).
95
'Deklaracja zmiennych
&,)(
,)(
,)(
'Uycie InputBox do wprowadzenia liczb
&)-8#!#9#:-
)-8#(9#:-
'Dodanie obu liczb
&;
'Wyjcie informacji
!"
"# $%
%%&
Jeeli teraz uruchomisz kod, ponownie zostan wywietlone dwa okienka, te same co
poprzednio, za komunikat wyjciowy pojawi si w oknie Immediate widocznym na
dole okna edytora VBA.
To okno suy nam jako tymczasowe i przydatne jest w pocztkowej fazie testowania kodu.
Warto tu omwi kilka spraw. Po pierwsze linia:
!"
"# $%
%%&
jest przykadem konkatenacji, gdy czy w cao rne skadniki. Tekst znakowy jest
ujty w cudzysowy, za zmienne nie. Oba typy s oddzielone znakiem *.
Zauwa, e linia zostaa podzielona spacj i znakiem podkrelenia. VBA wymaga
tego, jeeli jedno wyraenie jest dzielone na wiele linii. W ksice bdziemy tak robili
z powodu wymaga typograficznych. Jeeli chcesz, moesz zapisywa wyraenia kodu
w jednej linii.
Innym sposobem formatowania wyjcia danych jest technika, z ktr ju si spotkalimy w rozdziale 4. Moesz uy okna komunikatw, jeeli poprzedni lini wyjcia
zastpisz nastpujc:
5(-
#'-< &<--<
96
Struktury sterujce
Komputer dziaa sekwencyjnie. Wykonuje pierwsze polecenie i jeeli nie ma adnego
bdu, przechodzi do nastpnego. Nazywamy to struktur sekwencyjn. Ale co masz
zrobi, jeeli nie chcesz, aby kolejnym krokiem byo wykonanie nastpnej linii kodu?
W pewnych sytuacjach moesz zechcie przekaza sterowanie programem do innego
bloku linii kodu. Albo zechcesz, aby pewien blok linii kodu by powtarzany wielokrotnie, a do wystpienia okrelonej sytuacji (albo okrelon liczb razy).
Mechanizmy suce realizacji tych zada nazywamy strukturami sterujcymi. Struktury
te dzielimy na dwie bardzo szerokie kategorie: struktury decyzyjne i struktury powtarzajce. Jak si zaraz przekonasz, struktury decyzyjne pozwalaj programowi na podejmowanie decyzji. Najpopularniejsz z nich jest struktura !"+++,. Ale VBA ma ich
wicej: !"+++,+++ , !", i !!".
Struktury powtarzajce powoduj wielokrotne wykonanie bloku linii albo okrelon
liczb razy, albo do zaistnienia sytuacji, ktra spowoduje przerwanie ptli.
W VBA mamy dwie gwne struktury powtarzajce: +++# i +++-. W ramach
tych dwch struktur zasadniczych istnieje wiele wariacji.
Struktury decyzyjne
Rozwamy pseudokod dla porannych czynnoci. Dla okrelenia dziaania w pewnym
momencie moesz napisa:
'( )
##
*+ !# :
, #
$$#-=+:
0
jest rwne
jest rne
jest wiksze od
jest mniejsze od
jest wiksze lub rwne
jest mniejsze lub rwne
97
&
)> ?&$0
5
(-*#
+=!
-<
)>
(@ 5
(
W tym kodzie naley zauway kilka rzeczy. Linia zawierajca wyraenie warunkowe
rozpoczyna si od !" i koczy na ,. Ponadto, tak jak wszystkie struktury w VBA,
rwnie struktura warunkowa !" musi si koczy instrukcj . W tym przypadku
jest to !".
Jeeli uruchomisz t przykadow procedur, w oknie Immediate zobaczysz wynik
pokazany na rysunku poniej:
Rozwamy kilka problemw. Kod dziaa dobrze, ale co by si stao, gdyby liczba nie
bya wiksza od 10? A co waniejsze, skoro warto zmiennej jest sztywno ustalona,
bdzie ona zawsze wiksza od 10. Przyjrzyjmy si temu bliej.
Za pomoc polecenia moesz wewntrz struktury !" umieci ciek alternatywn.
Zmodyfikujmy nieco nasz kod:
>
,)(
5
(,(
A
)> ?&$0
5
(-*#
+!:/#
&$
5
(-*#
+ +#
=!
&$)>
(@ 5
(
Zauwa, e teraz nadalimy zmiennej # now warto oraz dodalimy instrukcj
. Poniewa instrukcja jest czci instrukcji !", nie potrzeba dodatkowej
instrukcji .
Poniewa warto # jest mniejsza od 10, po uruchomieniu procedury zostanie
wczona instrukcja , dajc wynik pokazany na rysunku na nastpnej stronie.
98
Wynik
True
True
True
True
False
False
False
True
False
False
False
False
Jeeli zostanie uyty operator 0, tylko jeden argument logiczny musi by prawdziwy,
aby warunek !" zosta speniony. Nastpna tabela podaje wszystkie moliwe wyniki
logiczne dla operatora 0.
Pierwszy argument logiczny
Wynik
True
True
True
True
False
True
False
True
True
False
False
False
99
Struktura ElseIf
Za pomoc !" moesz poczy kilka struktur !". Na przykad:
>
,)(
&
100
)> &0
(@ -+
+ +#
#
)> &B0
(@ -+
+!:/#
#
(@ -
#
+!:/#
& +#
&B)>
Moesz uywa tylu polece !", ilu potrzebujesz do sprawdzenia potrzebnej liczby
warunkw.
lub
&7
IIf
Przyjrzymy si jeszcze szybko strukturze !!", ktrej nazwa pochodzi od Immediate If3.
!!" jest przydatne, gdy chcemy nada ostateczn warto zmiennej, gdy jego skadnia
jest samo wystarczalna. Prawidowa skadnia wyglda tak:
3
101
))>!
/C!
GF
C!
GF
Struktura !!" dziaa do wolno i dlatego nie jest zbyt czsto uywana w duych programach.
Teraz zwrmy uwag na struktury sterujce drugiego rodzaju, czyli ptle.
Ptle
Ptli uywamy, gdy pewien blok instrukcji kodu ma by wykonywany albo okrelon
liczb razy, albo dopty, dopki co si nie zdarzy. Jeeli liczba wykona ptli jest
okrelona, ptla jest sterowana przez licznik. Mwimy wwczas o powtarzaniu sterowanym licznikiem. Drugim rodzajem s ptle wykonywane tak dugo, jak dugo warunek
jest speniony. Mwimy wwczas o powtarzaniu sterowanym warunkiem. Przyjrzymy
si obu typom.
Ptla For...Next
+++# jest przykadem ptli sterowanej licznikiem. Za pomoc rzeczywistych liczb
Pamitaj, e i mog by zmiennymi. Zauwa, e ostatni lini ptli jest #,
a nie , jak w strukturach, z jakimi dotychczas mielimy do czynienia. Jest to instrukcja
zwikszenia wartoci licznika o jeden krok.
Do zadeklarowania ptli moemy uy rwnie takiej skadni:
&BB
102
Ju sysz mojego wydawc pojkujcego, e wprowadziem tu kilka rzeczy dodatkowych. Zatem przyjrzyjmy si dokadniej uytemu kodowi.
Jest to ptla +++# majca wykona 10 powtrze. Zadaniem instrukcji wewntrz
ptli jest sprawdzenie, czy jest to przebieg parzysty, czy nieparzysty. Do tego celu
posuya mi struktura !"+++,+++ . Mamy zatem struktur !"+++,+++
wewntrz struktury +++#. Jeeli jedna struktura wystpuje wewntrz innej, mwimy
o strukturach zagniedonych, ktre s w programowaniu powszechnie stosowane.
Uyte wyraenie warunkowe wykonuje specyficzne dzielenie. Uyem sowa kluczowego , ktre jest skrtem od modulus. 2 zwraca reszt z dzielenia liczby A
przez liczb B. Jeeli liczb parzyst podzielimy przez 2, reszt z dzielenia bdzie 0.
Zatem jeeli licznik zostanie podzielony przez 2 i reszt z dzielenia bdzie 0, warunek
!" zostanie speniony i kolejna instrukcja wykonana. Jeeli reszta z dzielenia bdzie
rna od zera, zostanie wykona instrukcja z czci .
# po prostu zwiksza warto licznika.
103
Ptla Do
jest ptl z powtarzaniem sterowanym warunkiem. Innymi sowy ptl dziaajc
dopty, dopki okrelony warunek jest speniony (na przykad co jest czemu rwne
lub od czego wiksze).
Do While
Ptla 4, sprawdza, czy warunek jest speniony. Jeeli tak, instrukcje ptli s
wykonywane. Dla przykadu przyjrzyjmy si poniszej procedurze.
,)(
,)(
&
&
80&
(@ -+:
-<
)>?B0
$
)>
;&
*
Jak widzisz, inaczej ni omawiana wczeniej +++#, ptla 4, nie jest samowystarczalna. W tym przypadku musiae nada wartoci dwm zmiennym jedna
posuya jako licznik, za druga jako zmienna testowa. W tym przypadku chciaem,
aby procedura zakoczya dziaanie po wykonaniu pitego powtrzenia ptli.
Przeciwnie ni w ptli , tutaj przebieg nie jest sterowany licznikiem, a powtarzanie
ptli trwa, dopki warto jest rwna 1. Wewntrz ptli zagniedziem struktur
!"+++,, sprawdzajc warto licznika. Po osigniciu przez ni wartoci 5 struktura !" spowodowaa zmian wartoci na 0, co zakoczyo dziaanie ptli.
Poniewa sprawdzany jest warunek, a nie liczba iteracji, w ptlach nie musisz uywa
licznika. W tym przypadku wprowadziem go, dodajc zmienn i podnoszc jej warto w ostatniej linii. Mona to zastpi wieloma innymi rozwizaniami.
Zauwa, e ta struktura koczy si sowem -. Pamitaj, e stosowanie licznika nie
jest tu wymagane.
Jeeli uruchomisz ptl 4,, wyniki otrzymane w oknie Immediate powinny wyglda jak na rysunku na nastpnej stronie.
104
Powstaje pytanie, co si stanie, jeeli z jakiego powodu warto zmiennej nigdy
nie bdzie rwna 1. Czy ptla w ogle zostanie wykonana? Odpowied brzmi: nie.
Nie zostanie wykonana. Co zatem pocz, aby ptla zostaa wykonana cho jeden raz?
>
5
(,(
)-8##:&&B-CD
-!
/')>-
)> ?&, E&B0
>
5(-*#
'F###
"&&B)>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
)> ?&$0
5( <-+#9!:/#9&$
5( <-+#9 +#9&$)>
105
Zauwa, e nie uylimy licznika w adnej postaci. Zamiast tego jest sprawdzana
warto zmiennej . Interesujce, gdzie to sprawdzanie si odbywa. Inaczej ni
w poprzednim przykadzie, moemy sprawdzanie warunku umieci na kocu ptli,
a nie na pocztku. Dziki temu ptla zawsze zostanie wykonana przynajmniej jeden
raz, co okazuje si bardzo przydatne w sytuacjach podobnych do zilustrowanej.
Do Until
Jest to ptla nieznacznie rnic si od poprzednio omwionej. W 4, ptla jest
wykonywana, dopki warunek jest speniony, za ptla 5 dziaa, dopki warunek nie zostanie speniony.
Podana poprzednio procedura, pokazujca dziaanie ptli 4,, po niewielkich
zmianach moe korzysta z ptli 5:
,)(
,)(
&
&
HE?&
(@ -+:
-<
)>?B0
$
)>
;&
*
Zauwa, e teraz ptla bdzie dziaa dopty, dopki warto bdzie rna
od 1. Poza tym wszystko w tym przykadzie jest takie samo jak w poprzednim. Wynik
dziaania powinien by taki sam jak w przykadzie z ptl 4,.
Podobnie jak w ptli 4, moesz sprawdzanie warunku umieci na kocu, dziki
czemu ptla bdzie zawsze wykonywana przynajmniej jeden raz.
W dalszej czci ksiki bdziemy czsto uywa ptli. Tak jak zmienne s one integraln czci wikszoci programw.
106
Tablice
Na wiele sposobw dyskusja o tablicach cile dotyczy zmiennych. Tablica to zmienna
zawierajca wiele wartoci. Liczba wartoci przechowywanych przez tablic musi by
z gry okrelona i zadeklarowana. Musisz si take nauczy odwoywania do wartoci
wewntrz tablicy.
Gdy to pisaem, wydawca spyta: A co z tablicami dynamicznymi? Jak si potem
przekonasz, tablice dynamiczne s poniekd oszustwem. Nadal musisz z gry zadeklarowa liczb wartoci zapamitywanych wewntrz tablicy. Jedyn rnic jest to, e
deklaracj robisz przed uyciem, podczas dziaania programu, a nie przy pisaniu kodu.
Dowiesz si take, jak waciwie rezerwowa (alokowa) pami tak, aby Twoje tablice
nie zajmoway zbyt wiele pamici.
Skadniki tablicy
Kada wartoci w tablicy jest jej elementem. Poniewa zmienna tablicowa zawiera
wiele elementw, musisz wiedzie, jak poszczeglne z nich wybiera i jak si do nich
odwoywa. Moesz to robi za pomoc liczby zwanej indeksem. Najczciej pierwszy
element tablicy ma indeks rwny 0.
Gdyby mg zajrze za kulisy tablicy # zawierajcej nazwiska, zobaczyby
mniej wicej taki obraz:
$-I
.!
/&-I
/
'#/-J#
/
-,
*
/
7-0
K
!/-
Anita jest na pozycji odpowiadajcej indeksowi 3, co aby nie byo zbyt prosto
oznacza czwarty element tablicy. Jest to przyczyn wielu problemw programistycznych i nieco dalej poznamy sposb korygowania tej komplikacji.
W VBA mamy dwa typy tablic:
Tablice statyczne w ktrych liczba elementw, zwana dugoci tablicy,
107
Widzc co takiego, musisz by ostrony. Zapewne mylisz, e w ten sposb deklarujesz 10-elementow tablic. W rzeczywistoci tak zadeklarowana tablica ma 11 elementw o indeksach od 0 do 10 (indeks o najmniejszej wartoci nazywamy doln granic,
a indeks o najwikszej wartoci grn granic).
W przypadku naszej tablicy dolna granica, czyli najmniejszy indeks, wynosi 0.
Musisz o tym pamita, aby waciwie alokowa pami potrzebn do przechowywania
tablicy.
Jeeli chcesz, moesz w procedurze zadeklarowa wiele tablic:
L,(C5'&$,)(
Domylnie najmniejszy indeks jest rwny 0, acuchy znakw s inicjowane jako puste,
a zmienne cakowite z wartoci zero.
Zobaczmy przykad. W tej procedurze stworzysz dwie ptle +++#. Pierwsza
spowoduje wypenienie tablicy, za druga wydrukowanie jej zawartoci. Kod tej procedury jest nastpujcy:
'
,)(
5'&$,)(
$&$
5')-8#!
GF -<CD
-
'
'#+-
$&$
(@ -8
GF
'#/ -<<-#
-<D
5'
Programici lubi uywa maej litery jako zmiennej reprezentujcej indeks tablicy.
To tylko przyjta konwencja. Tutaj uylimy jej w podwjnej roli: licznika ptli
+++# oraz indeksu tablicy. Zauwa, e do elementu tablicy zawsze odwoujemy
si przez jej nazw z numerem elementu, czyli indeksem ujtym w nawiasy. W podanym
przykadzie jako indeksu uywamy licznika ptli , co pozwala nam na wypenienie
tablicy.
Maym przyjemnym dodatkiem jest konkatenacja tekstu objaniajcego i indeksu
w komunikacie wzywajcym do podania liczby, dziki czemu wiadomo, ktry element
tablicy wypeniamy.
108
Tablice dynamiczne
Wielu programistw uwaa tablice dynamiczne VBA poniekd za fikcj. W zasadzie
s to nadal tablice statyczne, ale ich rozmiary nie s deklarowane przed uruchomieniem
programu. Tak wic jedyn rnic jest to, kiedy rozmiary tablic s deklarowane.
Zaczynasz od zadeklarowanie pustej tablicy, na przykad:
'
,)(
5',)(
,
'#,)(
,
'#)-)!'/=!#
#
#!
FM-C-J#
'-
109
Jeeli uruchomisz ten kod, w oknie Immediate zobaczysz wyniki wywietlone jak na
pierwszym rysunku na nastpnej stronie.
2 jest teraz grn granic tablicy, za 1 granic doln. Potem mamy dwie
ptle +++# startujce od 1 (pamitaj, e teraz nie istnieje element 0).
110
Poza granicami
Co si stanie, jeeli programujc, zrobisz bd, w wyniku ktrego nastpi prba uzyskania
dostpu do wikszej liczby elementw tablicy, ni zostao zadeklarowane w instrukcji
lub 0?
VBA nie odkryje tego bdu, dopki program nie zostanie uruchomiony. Tego rodzaju
bd jest nazywany bdem wykonania (runtime error). Jeeli nastpi, zostanie wywietlony komunikat podobny do pokazanego poniej:
Kliknicie przycisku Debug spowoduje pokazanie linii kodu uznanej przez program
za bdn.
Bd jednak ostrony! Wskazana linia jest t, na ktrej program si zaama, jednake
zablokowanie wykonania programu moe by wynikiem bdu popenionego o wiele
wczeniej. Moge zmiennej okrelajcej wielko nada z warto lub pomyli si
w deklaracji lub 0. Znalezienie przyczyny bdu moe wymaga nieco pracy
detektywistycznej.
Zmniejszanie tablicy
Co si stanie, jeeli zadeklarowae grn granic tablicy rwn 10, ale nadae warto
jedynie czterem elementom?
111
Sowo kluczowe
( powoduje ponown alokacj pamici, pozostawiajc jej
elementy nietknite.
Czyszczenie tablic
Czasami bdziesz chcia zachowa deklaracj tablicy, ale wyczyci jej elementy.
Moesz to zrobi z atwoci za pomoc sowa kluczowego 8 tak jak to zostao
pokazane poniej:
5'
IsArray
Jak mona sprawdzi, czy zmienna jest tablic? VBA posiada ma wygodn funkcj
do testowania zmiennych. Przyjrzyj si poniszemu kodowi.
'
&,)(
7,)(
112
Jak widzisz, !2 jest funkcj typu . Zwraca warto lub . W pierwszym przypadku powyej wynikiem jest , gdy pierwsza zmienna nie zostaa
zadeklarowana jako tablica. W drugim przypadku wynikiem jest , gdy druga
zmienna jest tablic.
Podsumowanie
Wiele si nauczylimy w tym rozdziale. Poznalimy zmienne oraz rne struktury VBA.
Pomimo to nasza znajomo podstaw VBA jest wci dalece niepena. Podczas dalszej
lektury ksiki poznamy kolejne elementy.
W pozostaych rozdziaach tej czci z jeszcze wiksz uwag i bardziej szczegowo
przyjrzymy si edytorowi VBA i poznanym ju strukturom.