35
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE Access. Programowanie w VBA Wykorzystaj ca³¹ moc Accessa • Poznaj rodowisko VBA • Naucz siê wykorzystywaæ mo¿liwoci Accessa w VBA • Stwórz wydajne i szybkie aplikacje MS Access jest jednym z najczêciej wykorzystywanych systemów zarz¹dzania bazami danych. Jest ³atwy w obs³udze, posiada spore mo¿liwoci i nie wymaga poznawania z³o¿onych jêzyków manipulacji danymi. Czasem jednak jego podstawowe mo¿liwoci nie wystarczaj¹ do realizacji niektórych zadañ. W takich sytuacjach nale¿y siêgn¹æ po VBA (Visual Basic for Applications), czyli narzêdzie programistyczne pozwalaj¹ce na tworzenie „aplikacji dla aplikacji” — programów integruj¹cych siê z Accessem i wykorzystuj¹cych jego funkcje, ale w sposób dok³adnie taki, jaki jest potrzebny w okrelonym przypadku. Ksi¹¿ka „Access. Programowanie w VBA” opisuje zasady programowania w Accessie z wykorzystaniem VBA. Przedstawia zasady projektowania aplikacji i pracy ze rodowiskiem programistycznym VBA, korzystania z elementów i funkcji Accessa oraz tworzenia formularzy i raportów. Znajdziesz w niej tak¿e bardziej zaawansowane techniki — tworzenie aplikacji klient-serwer, mechanizmy wymiany danych pomiêdzy aplikacjami pakietu MS Office oraz ³¹czenie Accessa z SQL Serverem. • Projektowanie aplikacji • Dostosowanie Accessa do w³asnych potrzeb • rodowisko programistyczne VBA oraz jêzyk Visual Basic for Applications • Tworzenie formularzy, raportów, menu i pasków narzêdziowych • Bezpieczeñstwo baz danych • Aplikacje WWW i zastosowanie jêzyka XML • Tworzenie aplikacji wielodostêpnych Jeli nie wystarczaj¹ Ci standardowe mo¿liwoci Accessa, siêgnij po VBA — w ten sposób wykorzystasz prawdziwe bogactwo Accessa. Autor: Charles E. Brown T³umaczenie: Krzysztof Mas³owski (wstêp, rozdz. 1 – 8), Grzegorz Werner (rozdz. 9 – 21, dod. A) ISBN: 83-7361-807-4 Tytu³ orygina³u: Access VBA Programming Format: B5, stron: 408

Access. Programowanie w VBA

Embed Size (px)

DESCRIPTION

Wykorzystaj całą moc Accessa * Poznaj środowisko VBA* Naucz się wykorzystywać możliwości Accessa w VBA* Stwórz wydajne i szybkie aplikacje MS Access jest jednym z najczęściej wykorzystywanych systemów zarządzania bazami danych. Jest łatwy w obsłudze, posiada spore możliwości i nie wymaga poznawania złożonych języków manipulacji danymi. Czasem jednak jego podstawowe możliwości nie wystarczają do realizacji niektórych zadań. W takich sytuacjach należy sięgnąć po VBA (Visual Basic for Applications), czyli narzędzie programistyczne pozwalające na tworzenie "aplikacji dla aplikacji" -- programów integrujących się z Accessem i wykorzystujących jego funkcje, ale w sposób dokładnie taki, jaki jest potrzebny w określonym przypadku. Książka "Access. Programowanie w VBA" opisuje zasady programowania w Accessie z wykorzystaniem VBA. Przedstawia zasady projektowania aplikacji i pracy ze środowiskiem programistycznym VBA, korzystania z elementów i funkcji Accessa oraz tworzenia formularzy i raportów. Znajdziesz w niej także bardziej zaawansowane techniki -- tworzenie aplikacji klient-serwer, mechanizmy wymiany danych pomiędzy aplikacjami pakietu MS Office oraz łączenie Accessa z SQL Serverem. * Projektowanie aplikacji* Dostosowanie Accessa do własnych potrzeb* Środowisko programistyczne VBA oraz język Visual Basic for Applications* Tworzenie formularzy, raportów, menu i pasków narzędziowych* Bezpieczeństwo baz danych* Aplikacje WWW i zastosowanie języka XML* Tworzenie aplikacji wielodostępnych Jeśli nie wystarczają Ci standardowe możliwości Accessa, sięgnij po VBA -- w ten sposób wykorzystasz prawdziwe bogactwo Accessa.

Citation preview

Page 1: Access. Programowanie w VBA

Wydawnictwo Helionul. Chopina 644-100 Gliwicetel. (32)230-98-63e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

Access.Programowanie w VBA

Wykorzystaj ca³¹ moc Accessa

• Poznaj �rodowisko VBA• Naucz siê wykorzystywaæ mo¿liwo�ci Accessa w VBA• Stwórz wydajne i szybkie aplikacje

MS Access jest jednym z najczê�ciej wykorzystywanych systemów zarz¹dzania bazami danych. Jest ³atwy w obs³udze, posiada spore mo¿liwo�ci i nie wymaga poznawania z³o¿onych jêzyków manipulacji danymi. Czasem jednak jego podstawowe mo¿liwo�ci nie wystarczaj¹ do realizacji niektórych zadañ. W takich sytuacjach nale¿y siêgn¹æpo VBA (Visual Basic for Applications), czyli narzêdzie programistyczne pozwalaj¹cena tworzenie „aplikacji dla aplikacji” — programów integruj¹cych siê z Accessemi wykorzystuj¹cych jego funkcje, ale w sposób dok³adnie taki, jaki jest potrzebnyw okre�lonym przypadku.

Ksi¹¿ka „Access. Programowanie w VBA” opisuje zasady programowania w Accessiez wykorzystaniem VBA. Przedstawia zasady projektowania aplikacji i pracyze �rodowiskiem programistycznym VBA, korzystania z elementów i funkcji Accessa oraz tworzenia formularzy i raportów. Znajdziesz w niej tak¿e bardziej zaawansowane techniki — tworzenie aplikacji klient-serwer, mechanizmy wymiany danych pomiêdzy aplikacjami pakietu MS Office oraz ³¹czenie Accessa z SQL Serverem.

• Projektowanie aplikacji• Dostosowanie Accessa do w³asnych potrzeb• �rodowisko programistyczne VBA oraz jêzyk Visual Basic for Applications• Tworzenie formularzy, raportów, menu i pasków narzêdziowych• Bezpieczeñstwo baz danych• Aplikacje WWW i zastosowanie jêzyka XML• Tworzenie aplikacji wielodostêpnych

Je�li nie wystarczaj¹ Ci standardowe mo¿liwo�ci Accessa, siêgnij po VBA — w ten sposób wykorzystasz prawdziwe bogactwo Accessa.

Autor: Charles E. BrownT³umaczenie: Krzysztof Mas³owski (wstêp, rozdz. 1 – 8),Grzegorz Werner (rozdz. 9 – 21, dod. A)ISBN: 83-7361-807-4Tytu³ orygina³u: Access VBA ProgrammingFormat: B5, stron: 408

Page 2: Access. Programowanie w VBA

Spis treści

O Autorach ........................................................................................ 9

Wstęp ............................................................................................. 11

Część I Poznanie środowiska MS Accessa ..................................15

Rozdział 1. Wstęp do VBA for Applications......................................................... 17Historia Microsoft Accessa ............................................................................................. 17Tworzenie aplikacji w Accessie ...................................................................................... 19

Okno Baza danych .................................................................................................... 19Makra ........................................................................................................................ 21

Moduły...................................................................................................................... 22Przyszłość Microsoft Accessa ......................................................................................... 23

Podsumowanie ................................................................................................................ 24

Rozdział 2. Projektowanie aplikacji Accessa ...................................................... 25Etapy procesu tworzenia aplikacji ................................................................................... 26

Określanie i analizowanie wymagań ............................................................................... 26Analizowanie wymagań ............................................................................................ 27

Ocena i oszacowanie wymagań....................................................................................... 28Projektowanie i tworzenie programu............................................................................... 29

Model encja-relacja................................................................................................... 30Tłumaczenie modelu E-R na accessową bazę danych............................................... 31

Wdrażanie i testowanie.................................................................................................... 34

Przygotowanie dokumentacji .......................................................................................... 35Utrzymanie systemu ........................................................................................................ 36

Podsumowanie ................................................................................................................ 37

Rozdział 3. Używanie Accessa bez VBA.............................................................. 39Architektura systemu....................................................................................................... 40

Rozumienie aplikacji bazodanowej ................................................................................. 41Praca bez VBA................................................................................................................ 42

Relacje....................................................................................................................... 43Zdarzenia......................................................................................................................... 45

Stwórz makro ............................................................................................................ 46Przekształcanie makr w kod VBA............................................................................. 49

Konwencje nazw ............................................................................................................. 50Szablony predefiniowane ................................................................................................ 50Menadżer panelu przełączania......................................................................................... 51

Podsumowanie ................................................................................................................ 55

Page 3: Access. Programowanie w VBA

4 Access. Programowanie w VBA

Rozdział 4. Przystosowywanie środowiska Accessa do własnych potrzeb ............ 57Interakcja z Accessem ..................................................................................................... 57

Dostosowywanie paska poleceń................................................................................ 59

Tworzenie własnego paska narzędziowego............................................................... 62

Dostosowywanie menu podręcznych .............................................................................. 63

Tworzenie menu.............................................................................................................. 64

Przypisywanie kodu do elementu dostosowanego menu ................................................. 65

Podsumowanie ................................................................................................................ 68

Część II Poznanie środowiska VBA...............................................69

Rozdział 5. Wprowadzenie do środowiska programistycznego VBA ...................... 71Wprowadzenie do VBA .................................................................................................. 71

Historia VBA ............................................................................................................ 72

Model VBA..................................................................................................................... 72

Moduły...................................................................................................................... 73

Procedury .................................................................................................................. 73

Koncepcja obiektów........................................................................................................ 74

Obiekty ADO ............................................................................................................ 76

Obiekty VBA ............................................................................................................ 77

Obiekty Accessa........................................................................................................ 77

Edytor VBA .................................................................................................................... 78

Zaprzęgnięcie edytora VBA do pracy ....................................................................... 80

Podsumowanie ................................................................................................................ 84

Rozdział 6. Podstawy programowania w VBA...................................................... 85Podstawy programowania ............................................................................................... 85

Tworzenie modułów standardowych......................................................................... 86

Tworzenie procedur .................................................................................................. 88

Wejście i wyjście....................................................................................................... 94

Struktury sterujące........................................................................................................... 96

Struktury decyzyjne .................................................................................................. 96

Pętle ........................................................................................................................ 101

Tablice........................................................................................................................... 106

Składniki tablicy ..................................................................................................... 106

Czyszczenie tablic................................................................................................... 111

IsArray .................................................................................................................... 111

Podsumowanie .............................................................................................................. 112

Rozdział 7. Zrozumienie działania edytora VBA................................................. 113Otwieranie edytora VBA............................................................................................... 113

Najważniejsze elementy i cechy systemu menu ............................................................ 115

Menu Edit ............................................................................................................... 115

Menu View.............................................................................................................. 115

Menu Tools ............................................................................................................. 116

Menu podręczne (Shortcut)..................................................................................... 116

Paski narzędziowe Debug, Edit i UserForm.................................................................. 117

Eksplorator projektu...................................................................................................... 118

Zarządzanie modułami .................................................................................................. 119

Wstawianie i kasowanie modułów .......................................................................... 119

Importowanie i eksportowanie modułów ................................................................ 120

Okno Properties............................................................................................................. 121

Przeglądarka obiektów .................................................................................................. 121

Biblioteki................................................................................................................. 124

Referencje ..................................................................................................................... 125

Page 4: Access. Programowanie w VBA

Spis treści 5

Używanie opcji edytora VBA........................................................................................ 125Karta Editor............................................................................................................. 126Karta Editor Format ................................................................................................ 129Karty General i Docking ......................................................................................... 130

Sięganie po pomoc ........................................................................................................ 131Rozpoczynanie nowej procedury w VBA ..................................................................... 133Podsumowanie .............................................................................................................. 134

Rozdział 8. Składniki języka VBA ..................................................................... 135Obiekty w VBA............................................................................................................. 135Stałe wewnętrzne........................................................................................................... 136Podstawowe programy VBA używające formularzy..................................................... 137

Ustawianie ogniska ................................................................................................. 138Znajdowanie rekordu .............................................................................................. 141Obiekt Me ............................................................................................................... 143Sprawdzanie poprawności rekordu ......................................................................... 144

Łączenie z Accessem..................................................................................................... 145SQL (strukturalny język zapytań).................................................................................. 146

SQL — podstawy.................................................................................................... 147SQL i VBA.................................................................................................................... 150Prezentacja wyników..................................................................................................... 153Podsumowanie .............................................................................................................. 155

Rozdział 9. Procedury ...................................................................................... 157Deklarowanie procedury ............................................................................................... 157Funkcje.......................................................................................................................... 159Parametry ...................................................................................................................... 160

Parametry opcjonalne.............................................................................................. 162Parametry nazwane ................................................................................................. 163

Projekt i zasięg .............................................................................................................. 164Zmienne globalne i statyczne ........................................................................................ 165

Zmienne globalne.................................................................................................... 165Zmienne statyczne................................................................................................... 166

Zmiana struktury bazy danych za pomocą procedury.................................................... 167Konstruowanie tabeli .............................................................................................. 167

Podsumowanie .............................................................................................................. 169

Rozdział 10. Usuwanie usterek z kodu VBA........................................................ 171Podstawowe informacje o obsłudze błędów.................................................................. 171

Błędy wykonania..................................................................................................... 172Obiekt Err...................................................................................................................... 176Kolekcja Errors ............................................................................................................. 177Narzędzia do usuwania usterek z kodu.......................................................................... 180

Okno Immediate i punkty wstrzymania................................................................... 181Asercje .................................................................................................................... 183Okno Locals ............................................................................................................ 184Okno Watch ............................................................................................................ 185

Podsumowanie .............................................................................................................. 186

Rozdział 11. Funkcje ......................................................................................... 187Podprogramy i funkcje .................................................................................................. 187Funkcje wbudowane...................................................................................................... 188

MsgBox................................................................................................................... 188InputBox ................................................................................................................. 192

Funkcje daty i czasu ...................................................................................................... 193Funkcje finansowe......................................................................................................... 195Podsumowanie .............................................................................................................. 197

Page 5: Access. Programowanie w VBA

6 Access. Programowanie w VBA

Część III Interakcja z VBA ..........................................................199

Rozdział 12. Formularze..................................................................................... 201Formularze i dane.......................................................................................................... 201Dynamiczne przypisywanie zestawów rekordów.......................................................... 205

Dołączanie i edytowanie danych ................................................................................... 207Sterowanie formantami na formularzach....................................................................... 208Podsumowanie .............................................................................................................. 214

Rozdział 13. Raporty ......................................................................................... 215Anatomia raportu........................................................................................................... 215

Kreator raportów ........................................................................................................... 218Raporty specjalne .......................................................................................................... 220

Wykresy .................................................................................................................. 221Etykiety adresowe ................................................................................................... 224

Wywoływanie raportu z kodu VBA .............................................................................. 226Tworzenie raportu metodą programową........................................................................ 226

Tworzenie pustego raportu...................................................................................... 226Dodawanie formantów do raportu........................................................................... 228

Podsumowanie .............................................................................................................. 231

Rozdział 14.Menu i paski narzędzi .................................................................... 233Paski poleceń................................................................................................................. 233

Tworzenie paska narzędzi ............................................................................................. 235Menu ............................................................................................................................. 240

Podmenu........................................................................................................................ 243Podsumowanie .............................................................................................................. 244

Rozdział 15.Modyfikowanie środowiska Accessa............................................... 245Właściwości startowe .................................................................................................... 245

Modyfikowanie opcji .................................................................................................... 247Karta Widok............................................................................................................ 249

Karta Ogólne ........................................................................................................... 249Karta Edytowanie/Znajdowanie .............................................................................. 250

Karta Klawiatura ..................................................................................................... 250Karta Arkusz danych............................................................................................... 251Karta Formularze/Raporty....................................................................................... 251

Karta Strony ............................................................................................................ 252Karta Zaawansowane .............................................................................................. 252

Karta Międzynarodowe ........................................................................................... 253Karta Sprawdzanie błędów...................................................................................... 253

Karta Pisownia ........................................................................................................ 253Karta Tabele/Kwerendy .......................................................................................... 254

Podsumowanie .............................................................................................................. 255

Część IV Zaawansowane techniki programowania .......................257

Rozdział 16. Bezpieczeństwo bazy danych.......................................................... 259Access i bezpieczeństwo ............................................................................................... 259

Interfejs użytkownika.............................................................................................. 259Ustawianie hasła ..................................................................................................... 260

Programowe tworzenie hasła................................................................................... 261Ochrona kodu VBA................................................................................................. 262

Kompilowanie kodu do pliku .mde ......................................................................... 263Zabezpieczenia na poziomie użytkownika .................................................................... 263

Modyfikowanie kont użytkowników metodą programową ..................................... 266

Page 6: Access. Programowanie w VBA

Spis treści 7

Bezpieczeństwo i Access 2003...................................................................................... 268Jet Sandbox ............................................................................................................. 269Zabezpieczenia makr............................................................................................... 269

Podsumowanie .............................................................................................................. 273

Rozdział 17. Access i środowisko Microsoft Office ............................................. 275Współdzielone obiekty .................................................................................................. 275

Obiekt FileSearch.................................................................................................... 276Obiekt CommandBar .............................................................................................. 277

Łączenie Accessa z innymi programami pakietu Microsoft Office ............................... 280Łączenie się z Excelem ........................................................................................... 281Łączenie się z Outlookiem ...................................................................................... 283Łączenie się z Wordem ........................................................................................... 284

Podsumowanie .............................................................................................................. 286

Rozdział 18. Access i sieć WWW....................................................................... 287Mechanika sieci WWW................................................................................................. 287Strony dostępu do danych ............................................................................................. 288

Generowanie strony dostępu do danych.................................................................. 289Zapisywanie strony DAP ........................................................................................ 293Tworzenie strony dostępu do danych w widoku projektu ....................................... 295Strony dostępu do danych i VBA............................................................................ 297

XML (Extensible Markup Language) ........................................................................... 298Podsumowanie .............................................................................................................. 301

Rozdział 19. Rozbudowa.................................................................................... 303Microsoft Access i SQL Server ..................................................................................... 304Access Data Projects ..................................................................................................... 304

Rozbudowa bazy danych Accessa........................................................................... 306Praca z plikiem ADP ..................................................................................................... 310

Procedury przechowywane ..................................................................................... 311Widoki .................................................................................................................... 311

Podsumowanie .............................................................................................................. 313

Część V Tworzenie aplikacji.......................................................315

Rozdział 20. Aplikacje wielodostępne ................................................................ 317Współdzielenie bazy danych ......................................................................................... 317Obsługa współzawodnictwa i konfliktów...................................................................... 318

Ustawianie interwału odświeżania .......................................................................... 319Ustawianie interwału aktualizacji............................................................................ 319Blokowanie rekordów w interfejsie Accessa........................................................... 320Ustawianie opcji sposobem programowym............................................................. 322Blokowanie rekordów w ADO................................................................................ 323

Zwiększanie wydajności aplikacji ................................................................................. 324Oddzielanie danych od innych obiektów Accessa................................................... 325Centralizacja i decentralizacja................................................................................. 329Kompilowanie kodu................................................................................................ 329Optymalizowanie kodu VBA.................................................................................. 331

Podsumowanie .............................................................................................................. 333

Rozdział 21. Nie tylko Microsoft Access ............................................................ 335VBA i Microsoft Office................................................................................................. 335Visual Basic .................................................................................................................. 340VBScript........................................................................................................................ 347Platforma Microsoft .NET............................................................................................. 349Podsumowanie .............................................................................................................. 350

Page 7: Access. Programowanie w VBA

8 Access. Programowanie w VBA

Dodatki .......................................................................................351

Dodatek A Obiekt DoCmd ............................................................................... 353AddMenu ...................................................................................................................... 354ApplyFilter .................................................................................................................... 354

Beep .............................................................................................................................. 355CancelEvent .................................................................................................................. 356Close.............................................................................................................................. 356

CopyDatabaseFile ......................................................................................................... 358CopyObject ................................................................................................................... 358

DeleteObject.................................................................................................................. 359DoMenuItem ................................................................................................................. 360

Echo .............................................................................................................................. 360FindNext........................................................................................................................ 361

FindRecord.................................................................................................................... 362GoToControl ................................................................................................................. 364GoToPage...................................................................................................................... 364

GoToRecord.................................................................................................................. 365Hourglass....................................................................................................................... 366

Maximize....................................................................................................................... 366Minimize ....................................................................................................................... 367

MoveSize....................................................................................................................... 367OpenDataAccessPage.................................................................................................... 368

OpenDiagram ................................................................................................................ 369OpenForm ..................................................................................................................... 369

OpenFunction................................................................................................................ 371OpenModule.................................................................................................................. 371OpenQuery .................................................................................................................... 372

OpenReport ................................................................................................................... 373OpenStoredProcedure.................................................................................................... 374

OpenTable ..................................................................................................................... 375OpenView ..................................................................................................................... 376

OutputTo ....................................................................................................................... 377PrintOut......................................................................................................................... 379

Quit ............................................................................................................................... 380Rename.......................................................................................................................... 380RepaintObject................................................................................................................ 382

Requery ......................................................................................................................... 382Restore .......................................................................................................................... 382

RunCommand ............................................................................................................... 383RunMacro...................................................................................................................... 383

RunSQL ........................................................................................................................ 384Save............................................................................................................................... 385

SelectObject .................................................................................................................. 386SendObject .................................................................................................................... 387SetMenuItem ................................................................................................................. 388

SetWarnings .................................................................................................................. 389ShowAllRecords............................................................................................................ 389

ShowToolbar ................................................................................................................. 390TransferDatabase........................................................................................................... 391

TransferSpreadsheet ...................................................................................................... 391TransferSQLDatabase ................................................................................................... 391

TransferText .................................................................................................................. 391

Skorowidz...................................................................................... 393

Page 8: Access. Programowanie w VBA

Rozdział 6.

Podstawy

programowania w VBA

W rozdziale 5 poznałeś środowisko VBA, jego strukturę, koncepcję i edytor. Terazzamierzamy przedstawić podstawy programowania oraz specyficzną składnię językaVBA. Wrócimy do koncepcji omówionych w rozdziale 5 i przyjrzymy się im dokładniej,zaczynając od przeglądu miejsc, gdzie kod jest przechowywany, oraz typów bloków,na jakie jest dzielony. Czyniąc to, szczegółowo zajmiemy się również problememzmiennych. Trudno jest mówić o zmiennych, pomijając ich szczególny typ nazywanytablicą (array).

Zamierzamy także przyjrzeć się kilku wbudowanym narzędziom VBA, znacznie ułatwia-jącym wykonywanie zadań. Zakończymy nasze rozważania, przyglądając się różnymtypom struktur programistycznych i ich stosowaniu w środowisku VBA.

Podstawy programowania

Jak już powiedzieliśmy w rozdziale 5, kod VBA jest zapisywany i przechowywanyw modułach. Zapewne pamiętasz, że istnieją dwa podstawowe typy modułów: powiązanez raportami i formularzami oraz ogólne, przechowujące procedury używane w całymprojekcie.

Istnieje jeszcze jeden typ zwany modułem klasy, który zawiera kod powiązany z obiek-tem. O modułach będziemy jeszcze mówić w pozostałej części książki.

Zanim zaczniesz pisać kod VBA, musisz stworzyć moduł. Ponieważ moduły dla for-mularzy i raportów są tworzone wraz z formularzami i raportami, tutaj skupimy się natworzeniu modułu standardowego.

Page 9: Access. Programowanie w VBA

86 Część II ♦ Poznanie środowiska VBA

Tworzenie modułów standardowych

Istnieje kilka różnych sposobów tworzenia modułów standardowych. Najłatwiej przejśćdo kategorii Moduły w oknie dialogowym Baza danych, jak to zostało pokazane narysunku 6.1. Wystarczy wówczas jedynie kliknąć przycisk Nowy, aby zostać przenie-sionym do edytora VBA, a w nim do wnętrza stworzonego modułu, co zostało pokazanena rysunki 6.2.

Rysunek 6.1.Okno Baza danych

po wybraniu

kategorii Moduły

Rysunek 6.2. Edytor VBA z otwartym modułem Module1

Page 10: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 87

VBA nada nowemu modułowi tymczasową nazwę �������. Zapewne zachcesz użyćnazwy bardziej opisowej. Możesz ją nadać w oknie Properties edytora VBA lub bez-pośrednio w oknie Baza danych.

Możesz zaznaczyć nazwę ������� w oknie Properties tak, jak to widać na rysunku 6.3,i wpisać inną nazwę, powiedzmy ����� �������� Gdy dokonasz zmiany w oknieProperties, nazwa zostanie zmieniona również w oknie Project w edytorze VBAi w oknie Baza danych w Accessie (w kategorii Moduły).

Rysunek 6.3.Property Name

(czyli Właściwość

Nazwa)

Dodatkowo powinieneś na pasku narzędziowym kliknąć przycisk Save. Zostanieszpoproszony o potwierdzenie nazwy:

O tym, że nazwa została zmieniona, możesz się teraz upewnić w oknie Project (rysu-nek 6.4) i w oknie Baza danych (rysunek 6.5).

Rysunek 6.4.Okno Project

po zmianie

nazwy modułu

Nazwę modułu możesz również zmienić, klikając ją prawym przyciskiem myszy w okniedialogowym Baza danych i wybierając z menu podręcznego polecenie Zmień nazwę.

Page 11: Access. Programowanie w VBA

88 Część II ♦ Poznanie środowiska VBA

Rysunek 6.5.Okno Baza danych

po zmianie nazwy

modułu

Tworzenie procedur

Przypominam z rozdziału 5, że większość kodu VBA jest zapisywana w blokach zwa-nych procedurami. Dzielimy je na dwa rodzaje: procedury typu ��� (podprogramy)i procedury typu �������� (funkcje). Podprogramy wykonują zadania, ale nie zwracajążadnej wartości, zaś funkcje zwracają wartości.

W większości przypadków na górze modułu będziesz widzieć dwie następujące linie:

������������� �������������������

Są to tak zwane deklaracje ogólne modułu. Wszelki kod wpisany w tej sekcji będziewpływał na wszystkie procedury w całym module.

Linia �������������� umożliwia wybranie jednego z trzech sposobów sortowaniałańcuchów znakowych wewnątrz kodu:

� ����������������������� — powoduje sortowanie w takim samym porządkujak sortowanie rekordów bazy danych i jest opcją najczęściej stosowaną.

� ��������������������� — powoduje sortowanie oparte na binarnychwartościach znaków. Wielkie litery są wtedy ustawiane przed małymi.

� ���������������� �� — powoduje sortowanie rozpoznające wielkiei małe litery z uwzględnieniem języka lokalnego.

W tej książce będziemy stosowali domyślne ustawienie �����������������������.

Linia ������� ������� jest, moim zdaniem, bardzo ważna. Wkrótce przekonasz się,że może ochronić Cię przed wieloma błędami kodowania, zmuszając do jawnegodeklarowania zmiennych przed użyciem.

Jeżeli ta opcja nie pojawia się automatycznie wraz z tworzeniem modułu, wymuś to,wydając polecenie Tools/Options i na karcie Editor zaznaczając opcję Require Variable

Declaration, tak jak na rysunku 6.6.

Page 12: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 89

Rysunek 6.6.Opcja Require

Variable Declaration

O procedurze myśl jak o miniprogramie mającym wykonać jedno wybrane zadanie.Na przykład zadaniem procedury może być dodanie do siebie dwóch liczb. Zawsze,gdy zechcesz dodać te dwie liczby, będziesz mógł wywołać tę procedurę. Nie mającprocedury, za każdym razem, gdy należałoby wykonać to samo zadanie, musiałbyśpisać kod, w którym powtarzałby się ten sam ciąg poleceń.

Wewnątrz procedury deklarujesz zmienne, używasz pętli i poleceń !", a nawet wywo-łujesz inne procedury. Omówimy po kolei te wszystkie przypadki.

Na początku deklarujesz procedurę w sposób pokazany poniżej. Oczywiście, jej nazwęwybierasz wedle własnej woli.

���������������������

Zauważ, że edytor VBA nakreśli poziomą linię oddzielającą nową procedurę od dekla-racji ogólnych. Pomaga to wyróżniać i oddzielać procedury i nie ma żadnego wpływuna ich działanie.

Jest ważne, abyś deklarując procedurę, zaczynał od słowa ��� i kończył deklaracjęnawiasami. Podkreślam, że to ważne, bo uważam, iż od początku należy stosowaćwłaściwą składnię. Jeżeli pominiesz nawiasy, edytor VBA wstawi je za Ciebie, gdytylko naciśniesz Enter.

Zwykle w nawiasach umieszcza się wszelkie argumenty, jakich oczekuje procedura,ale nawet gdy nie ma żadnych argumentów, puste nawiasy muszą pozostać.

Zaraz po naciśnięciu klawisza Enter edytor VBA doda, zamykającą procedurę, linię ������. Cały napisany przez Ciebie kod musisz umieścić między wyrażeniem otwie-rającym i zamykającym.

Na kolejnych kartach książki będę robił uwagi o tym, jakie zwyczaje i praktyki progra-mistyczne uważam za dobre. Choć nie są one bezwzględnie obowiązujące, są akcep-towane przez wielu programistów i stały się standardami przemysłowymi.

Page 13: Access. Programowanie w VBA

90 Część II ♦ Poznanie środowiska VBA

Zgodnie z pierwszym zwyczajem, nazwa nadawana procedurze musi opisywać jej dzia-łanie, np. ���#������ (dodaj liczby). Każdy programista od razu rozpozna, do czego taprocedura służy. Dodatkowo, choć VBA nie rozróżnia liter wielkich i małych, czasamimusi współdziałać z programami, które to robią. Ogólna konwencja nazw, wspomnianaw rozdziale 4, nakazuje rozpoczynanie nazwy od małej litery, wyróżnianie wielkimiliterami początków wyrazów w zbitkach słownych, niestosowanie spacji i zaczynanienazw raczej od liter niż cyfr. Rozpoczynanie nazw od liter, a nie od cyfr to w wielujęzykach, również w VBA, więcej niż zwyczaj — to obowiązująca zasada, narzuconaprzez reguły języka VBA.

Drugi zwyczaj to zalecenie wcinania kodu procedury. Dzięki temu łatwo odszukać, gdziesię procedura rozpoczyna, a gdzie kończy. Aby zrobić wcięcie, zwykle trzykrotnienaciskam klawisz spacji lub używam klawisza Tab. Edytor VBA zapamięta wcięciei automatycznie będzie je stosował do następnych linii.

Trzecim zwyczajem jest staranne komentowanie kodu. Możesz to z łatwością robić,wpisując pojedynczy apostrof na początku linii. Dzięki temu VBA zignoruje tę linię,traktując ją jako komentarz.

Poniższy przykład pokazuje wcięcie i komentarz:

�������������������'Deklaracja zmiennych�������

Zauważ kolor, jakiego VBA używa do wyróżnienia komentarza. Rozumienie znaczeniakolorów używanych przez edytor VBA podczas kodowania pomoże Ci śledzić, co sięz kodem dzieje. Na przykład wyświetlenie tekstu na czerwono oznacza błąd składni.

Co oznaczają poszczególne kolory, możesz zobaczyć, wydając polecenie Tools/Options.Po otwarciu okna dialogowego Options karta Editor Format pokaże znaczenie poszcze-gólnych kolorów, a ponadto pozwoli na dokonanie zmian schematu.

Deklarowanie zmiennych

Dwoma zasadniczymi składnikami procedur są zmienne i metody. Mówiąc po prostu,zmienna to „kawałek” informacji przechowywanej gdzieś w pamięci komputera. Możeto być liczba, litera lub całe zdanie. Określenie miejsca przechowywanej informacjijest możliwe dzięki nadanej nazwie. Powiedzmy, że w kodzie mamy taką linię:

����������

Od tego momentu, jeżeli kod gdziekolwiek odwoła się do nazwy ������, w to miejscezostanie wstawiona liczba 23. Oczywiście, później możesz zmiennej o nazwie ������nadać inną wartość.

Aby zmienna działała prawidłowo, powinieneś zadeklarować, jakiego typu informacjęma przechowywać (w miarę uczenia się przyczyny tego staną się dla Ciebie oczywiste).W tabeli 6.1 zostały podane typy zmiennych i ich zastosowanie.

Page 14: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 91

Tabela 6.1. Typy zmiennych

Typ zmiennej Opis

������ Zmienna ������ zwraca wartości ���� lub ���� ( �!� lub �"�#). Można je również

wyrazić liczbowo: $�������, %&�������.

�'�� To jeden z najrzadziej używanych typów zmiennych. Może przechowywać tylko

pojedynczą wartość od 0 do 255.

�������' Robi to, co opisuje nazwa (waluta). Przechowuje wartości walutowe z czterema

miejscami po przecinku, od –922 337 203 685 477,5808 do 922 337 203 685 477,5807.

�� Przechowuje daty i czas. Ciekawe, że dopuszczalne lata to od 100 do 9999.

����� To jeden z dwóch typów zmiennych zmiennoprzecinkowych. Drugi to ���(��.Zmienne ����� służą do przechowywania bardzo długich liczb w zakresieod –1.79769313486231 * 10308 do –4.94065645841247 * 10–324 dla wartości

ujemnych i od 4.94065645841247 * 10–324 do 1.79769313486232* 10308

dla wartości dodatnich.

)���(�� To jeden z dwóch typów zmiennych całkowitych. Drugi to *��(. Zmienne )���(��przechowują liczby z zakresu od –32 768 do 32 767.

*��( *��( to drugi to zmiennych całkowitych. Pierwszy to )���(��. Zmienne *��(przechowują liczby z zakresu od –2 147 483 648 do 2 147 483 657.

��+��� Służy do przechowywania obiektów, które mają być później użyte.

���(�� To drugi typ liczb zmiennoprzecinkowych. Pierwszym był �����.

�����( To najczęściej używany typ zmiennych. Zmienna typu �����( może przechowywaćdo 2 miliardów znaków.

Do deklarowania zmiennych służy słowo kluczowe ���. Na przykład:

��������,��)���(��

Ta deklaracja oznacza, że zmienna o nazwie ������ będzie przechowywała wyłączniedane typu !���$��. Zauważ, że jeszcze nie nadaliśmy zmiennej żadnej wartości (i edytorby nam na to nie pozwolił). Jedynie zadeklarowaliśmy nazwę i typ zmiennej. Gdzieśw dalszej części kodu umieścimy linię w rodzaju:

����������

Pamiętaj, że VBA nie odróżnia liter wielkich i małych. Nazwy zmiennej ������, #�����i ������ będą rozpoznawane jako ta sama nazwa.

Nadając zmiennej wartość, musisz zdawać sobie sprawę z wielu rzeczy. Po pierwsze,wartość nadawana zmiennej typu �����$ musi być wzięta w cudzysłów1. Prawidłoweprzypisanie wartości zmiennej typu �����$ może wyglądać następująco:

��������,�������(��������-.�!��/�-

1 Nie stosujemy cudzysłowów drukarskich — przyp. tłum.

Page 15: Access. Programowanie w VBA

92 Część II ♦ Poznanie środowiska VBA

Ponadto musisz pamiętać, że wartość nadawana zmiennej typu ���� musi być ujętaw znaki %. Prawidłowe przypisanie wartości zmiennej typu ���� może wyglądaćnastępująco2:

���0�� ���,�� ���0�� �����1&$2$32$�1

W rozdziale 5 omówiliśmy konwencję nazw połączonych z obiektami bazy danych.Te same zasady odnoszą się do zmiennych. Pamiętaj, że nie są to zasady obowiązujące,lecz tylko konwencje przyjęte przez większość programistów. Przedrostki nazw są podanew tabeli 6.2.

Tabela 6.2. Przedrostki zmiennych

Typ zmiennej Przedrostek

������ ���

�'�� �'�

�������' ���

�� ��

����� ���

)���(�� ���

*��( ��(

��+��� ��+

���(�� ��(

�����( ���

Dobrym pomysłem jest, aby przy nadawaniu nazw obiektom jakiegokolwiek typustosować nazwy opisowe. W ten sposób kod staje się „samoopisującym”.

Oto przykład prawidłowego zadeklarowania zmiennej daty:

�����0�� ���,�� ��

Wróćmy do procedury ���#������, dodając deklaracje trzech zmiennych:

�������������������'Deklaracja zmiennych����� ����������&�,��)���(������� ������������,��)���(������� ��������,��)���(���������

Powinieneś już rozumieć znaczenie tych deklaracji. W zmiennych ���#������ i ����#�����& zostaną zapamiętane dwie liczby. Po dodaniu ich suma zostanie zapamiętanaw zmiennej ������.

2 Data podawana w stylu amerykańskim: miesiąc, dzień, rok — przyp. tłum.

Page 16: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 93

Variant

Typ zmiennej, o jakim jeszcze nie mówiliśmy, to '������. Zależnie od tego, z jakimprogramistą rozmawiasz, dowiesz się albo że jest to potężne narzędzie programistyczne,albo że to rozwiązanie dla niechlujnych programistów.

'������ pozwala VBA na samodzielne określanie, jaki typ danych jest zapamiętywany.Jest to domyślny typ zmiennych, używany, jeżeli w deklaracji zmiennej pominieszklauzulę ������������. Przedrostkiem oznaczającym ten typ zmiennej jest (��.

Przykładowa deklaracja zmiennej typu '������ może mieć postać:

��4�5' �

Ponieważ pominęliśmy parametr ������������, zostanie użyty domyślny typ '������.Taki sam efekt dałoby użycie deklaracji:

��4�5' ��,��6����

Powiedzmy, że tej zmiennej przypiszesz wartość w następujący sposób:

4�5' ����-���+����#�����6����-

VBA przekształci wówczas typ (�������� na �����$. Jeżeli potem dokonasz kolejnegoprzypisania wartości:

4�5' ����&�

VBA zmieni typ (�������� na !���$��.

Jak się przekonamy w trakcie dalszej nauki, czasem prowadzi to do sytuacji, gdy zmienna'������ staje się zmienną nieoczekiwanego typu lub, co gorsza, końcowym rezultatemjest błąd. Wielu programistów uważa, że użycie zbyt wielu zmiennych typu '������powoduje zbędne zajmowanie pamięci i spowalnia działanie kodu. Zanim więc zdecy-dujesz się na używanie zmiennych '������, rozważ dobrze wszystkie „za” i „przeciw”.

Najlepiej, abyś jako początkujący traktował zmienne '������ z wielką ostrożnościąi stosował przede wszystkim jawne deklaracje typów podstawowych.

Constant

Wielokrotnie chcesz zadeklarować wartości, które nie będą się zmieniać. Używamydo tego typu ��������, deklarowanego za pomocą słowa kluczowego �����, zamiast���, stosowanego w normalnych deklaracjach.

Oto przykład:

��������������&�,��)���(�����&���������� ���,�� �����1�2�2�$$71

Zauważ użycie przedrostka ��� zamiast standardowego przedrostka typu. Pamiętajtakże, że deklarując stałą, musisz przypisać jej wartość, gdyż jeżeli tego nie zrobisz,przy opuszczaniu linii zostanie zgłoszony błąd składni.

Page 17: Access. Programowanie w VBA

94 Część II ♦ Poznanie środowiska VBA

Wejście i wyjście

Zatem wiesz już, jak za pomocą zmiennych zachowywać dane. Ale w jaki sposób wpro-wadzić informację, jaka ma być zapamiętana przez zmienną? Albo jak odczytać infor-macje zapamiętane przez zmienne? Pod wieloma względami właśnie tego będziemysię uczyć w pozostałej części książki. Ale dla przetestowania naszego kodu zacznijmyod paru najprostszych technik.

Jednym z najprostszych sposobów pobrania informacji od użytkownika i podstawieniajej pod zmienną jest użycie wbudowanej funkcji !�������. Spowoduje to wyświetlenieprostego okna dialogowego z wezwaniem.

Kod naszego prostego przykładu uzupełnij pokazanymi niżej liniami, napisanymi pismempogrubionym:

�������������������'Deklaracja zmiennych����� ����������&�,��)���(������� ������������,��)���(������� ��������,��)���(��

�����'Użycie InputBox do wprowadzenia liczb���������������� ���������������������������������������������� �����������������������������������

Zauważ, że dla jasności dodałem komentarz informujący, co robię.

Wyrażenie ���#�������)�!������� jest nazywane wyrażeniem przypisania, gdyż przy-pisuje do zmiennej wartość podaną przez użytkownika. W tym przypadku zostały stwo-rzone dwa przypisania — jedno dla ���#������, a drugie dla ���#�����&.

Możesz uruchomić kod, klikając przycisk Run:

Spowoduje to wyświetlenie pokazanego tu okna dialogowego do wprowadzenia pierw-szej liczby (do wprowadzenia drugiej liczby zostanie wyświetlone oddzielne okno).

Jeżeli wykonałeś poprzednie kroki, kod powinien działać, zapamiętując w zmiennychpodane liczby. Jednakże w żaden sposób nie informuje nas o tym. Są dwa sposobystworzenia wyjścia. Pierwszy to dopisanie dwóch linii, napisanych poniżej pismempogrubionym:

Page 18: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 95

�������������������'Deklaracja zmiennych����� ����������&�,��)���(������� ������������,��)���(������� ��������,��)���(��

�����'Użycie InputBox do wprowadzenia liczb�������������&���)��������-8���#�����!�#9����#�:-������������������)��������-8���#����(9����#�:-�

�����'Dodanie obu liczb���������������������&�;����������

�����'Wyjście informacji

����� ���!"�����"��#�������$������%����������%�������%�&�����������������������

Jeżeli teraz uruchomisz kod, ponownie zostaną wyświetlone dwa okienka, te same copoprzednio, zaś komunikat wyjściowy pojawi się w oknie Immediate widocznym nadole okna edytora VBA.

To okno służy nam jako tymczasowe i przydatne jest w początkowej fazie testowania kodu.

Warto tu omówić kilka spraw. Po pierwsze linia:

���!"�����"��#�������$������%����������%�������%�&����������

jest przykładem konkatenacji, gdyż łączy w całość różne składniki. Tekst znakowy jestujęty w cudzysłowy, zaś zmienne nie. Oba typy są oddzielone znakiem *.

Zauważ, że linia została podzielona spacją i znakiem podkreślenia. VBA wymagatego, jeżeli jedno wyrażenie jest dzielone na wiele linii. W książce będziemy tak robiliz powodu wymagań typograficznych. Jeżeli chcesz, możesz zapisywać wyrażenia koduw jednej linii.

Innym sposobem formatowania wyjścia danych jest technika, z którą już się spotkali-śmy w rozdziale 4. Możesz użyć okna komunikatów, jeżeli poprzednią linię wyjściazastąpisz następującą:

5�(����- ��������#�'����-�<���������&�<�-���-�<����������

Spowoduje to wyświetlenie okna komunikatu:

A więc masz już swój pierwszy działający program napisany w VBA.

Page 19: Access. Programowanie w VBA

96 Część II ♦ Poznanie środowiska VBA

Struktury sterujące

Komputer działa sekwencyjnie. Wykonuje pierwsze polecenie i jeżeli nie ma żadnegobłędu, przechodzi do następnego. Nazywamy to strukturą sekwencyjną. Ale co maszzrobić, jeżeli nie chcesz, aby kolejnym krokiem było wykonanie następnej linii kodu?W pewnych sytuacjach możesz zechcieć przekazać sterowanie programem do innegobloku linii kodu. Albo zechcesz, aby pewien blok linii kodu był powtarzany wielo-krotnie, aż do wystąpienia określonej sytuacji (albo określoną liczbę razy).

Mechanizmy służące realizacji tych zadań nazywamy strukturami sterującymi. Strukturyte dzielimy na dwie bardzo szerokie kategorie: struktury decyzyjne i struktury powta-rzające. Jak się zaraz przekonasz, struktury decyzyjne pozwalają programowi na podej-mowanie decyzji. Najpopularniejszą z nich jest struktura !"+++�,��. Ale VBA ma ichwięcej: !"+++�,��+++ ���, ���!", ����������� i !!".

Struktury powtarzające powodują wielokrotne wykonanie bloku linii — albo określonąliczbę razy, albo do zaistnienia sytuacji, która spowoduje przerwanie pętli.

W VBA mamy dwie główne struktury powtarzające: ���+++#��� i ��+++-���. W ramachtych dwóch struktur zasadniczych istnieje wiele wariacji.

Struktury decyzyjne

Rozważmy pseudokod dla porannych czynności. Dla określenia działania w pewnymmomencie możesz napisać:

'�()����������#�#*+������!�#:������,���#���������$���$�#�-��������������=+�:�������0���

Wyrazy pogrubione to słowa kluczowe konieczne do podjęcia decyzji.

Rozpoczynamy strukturę decyzyjną od porównania dwóch wartości. Czy A jest równe B?Czy A jest większe od B? Czy B jest prawdziwe? Są to tak zwane wyrażenia warunkowe.Symbole używane w tych wyrażeniach są podane w tabeli poniżej.

) jest równe

./ jest różne

/ jest większe od

. jest mniejsze od

/) jest większe lub równe

.) jest mniejsze lub równe

Zobaczmy, jak prosta struktura decyzyjna działa w procedurze:

�����>����������� ��������,��)���(������� �����5���(��,�������(

Page 20: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 97

�������������&�

�����)>�������?�&$��0���������������5���(����-*��#��+�����=!��-�<���������������)>

����� ���(@ ��������5���(�

�������

W tym kodzie należy zauważyć kilka rzeczy. Linia zawierająca wyrażenie warunkowerozpoczyna się od !" i kończy na �,��. Ponadto, tak jak wszystkie struktury w VBA,również struktura warunkowa !" musi się kończyć instrukcją ��. W tym przypadkujest to ���!".

Jeżeli uruchomisz tę przykładową procedurę, w oknie Immediate zobaczysz wynikpokazany na rysunku poniżej:

Rozważmy kilka problemów. Kod działa dobrze, ale co by się stało, gdyby liczba niebyła większa od 10? A co ważniejsze, skoro wartość zmiennej jest sztywno ustalona,będzie ona zawsze większa od 10. Przyjrzyjmy się temu bliżej.

Za pomocą polecenia ��� możesz wewnątrz struktury !" umieścić ścieżkę alternatywną.Zmodyfikujmy nieco nasz kod:

�����>����������� ��������,��)���(������� �����5���(��,�������(

�������������A

�����)>�������?�&$��0���������������5���(����-*��#��+����!�:/�#����&$-����������������������5���(����-*��#��+�������+�#������=!��&$-���������)>

����� ���(@ ��������5���(�

�������

Zauważ, że teraz nadaliśmy zmiennej ���#�� nową wartość oraz dodaliśmy instrukcję ���. Ponieważ instrukcja ��� jest częścią instrukcji !", nie potrzeba dodatkowejinstrukcji ��.

Ponieważ wartość ���#�� jest mniejsza od 10, po uruchomieniu procedury zostaniewłączona instrukcja ���, dając wynik pokazany na rysunku na następnej stronie.

Page 21: Access. Programowanie w VBA

98 Część II ♦ Poznanie środowiska VBA

Oczywiście, tak jak poprzednio możesz użyć funkcji wbudowanych !������� i ��$���do wprowadzania liczby i wyświetlania wyjściowego komunikatu.

AND, OR, NOT

W niektórych przypadkach zechcesz sprawdzić spełnienie warunków złożonych. Czy���#���.���0����#���/)��1? Słowa kluczowe 2#�, �0 i #�� są nazywane operatoramilogicznymi i służą do sprawdzania warunków złożonych.

W przypadku operatora logicznego 2#� oba wyrażenia logiczne muszą być prawdziwe,aby warunek !" był spełniony.

Poniżej została podana tabela wszystkich możliwych wyników logicznych dla opera-tora 2#�.

Pierwszy argument logiczny Drugi argument logiczny Wynik

True True True

True False False

False True False

False False False

Jeżeli zostanie użyty operator �0, tylko jeden argument logiczny musi być prawdziwy,aby warunek !" został spełniony. Następna tabela podaje wszystkie możliwe wynikilogiczne dla operatora �0.

Pierwszy argument logiczny Drugi argument logiczny Wynik

True True True

True False True

False True True

False False False

Ostatni operator logiczny #�� zwraca — zgodnie z oczekiwaniami — wartość przeciwną.Jeżeli wyrażenie warunkowe (A NIE jest równe B) jest prawdziwe, to jego zaprze-czenie #�� (A NIE jest równe B) jest fałszywe i odwrotnie — jeżeli A jest równe B,wyrażenie jest fałszywe, a wynik ostateczny prawdziwy. Nie przejmuj się, jeżeli potrze-bujesz nieco czasu, aby sobie to wszystko wyobrazić.

Będziemy nadal zajmować się tą samą co poprzednio procedurą �"���� i użyjemy jejdo wyjaśnienia wielokrotnego użycia instrukcji !"3 ���. Chcemy również ograniczyćwprowadzanie przez użytkownika liczb do zakresu od 1 do 15.

Page 22: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 99

Zmień swój kod, aby wyglądał tak jak pokazany poniżej.

������������� ������������������� ��4���������,��)���(��%%%%%%%%%%%%%%%%%%%%%%%%%%%%

�����>����������� �����5���(��,�������(

�������������)��������-8���#����#�:����&����&B-C�D������-�����!��������/���'�)>-�

����)>�������?��&�,���������E��&B��0�����������>���������������������5�(����-*��#�������'F�#���#��#�"�����&����&B-��������)>

�������%%%%%%%%%%%%%%%%%%%%%%%%%%%%�����>�����������)>�������?�&$��0����������5�(����������<�-�+�������#�9�!�:/�#9����&$-����������������5�(����������<�-�+�������#�9����+�#9������=!�9�&$-��������)>�������

Zauważ, że musiałeś przedefiniować ���#�� na zmienną globalną. Jeszcze o tym niemówiliśmy, ale przypomnij sobie z początku tej części, że wszystko, co jest umiesz-czone w części deklaracji globalnych, obowiązuje dla całego modułu.

Procedura �"���� sprawdza, czy wartość ���#�� zawiera się w zakresie od 1 do 15. Jeżelitak, wywołuje procedurę �"����& zawierającą kod, którego używaliśmy poprzednio,a jeżeli nie — wyświetla komunikat dla użytkownika. Jeżeli jedna procedura uruchamiainną, nazywamy to wywołaniem procedury.

Spróbuj uruchomić ten kod wielokrotnie. Jeżeli wprowadzisz liczbę z przedziałuod 1 do 15, otrzymasz komunikat, że jest ona większa albo mniejsza lub równa 10.Jeżeli wprowadzona liczba będzie spoza przedziału od 1 do 15, zostanie wyświetlonykomunikat pokazany poniżej.

Struktura ElseIf

Za pomocą ���!" możesz połączyć kilka struktur !". Na przykład:

�����>���������� ��������,��)���(��������������&�

Page 23: Access. Programowanie w VBA

100 Część II ♦ Poznanie środowiska VBA

����)>���������&��0���������� ���(@ �����-���+�����+���+�#����#�-��������)>���������&B��0���������� ���(@ �����-���+�����+!�:/�#����#�-���������������� ���(@ �����-�����#��+����!�:/�#����&������+�#����&B-��������)>�������

Możesz używać tylu poleceń ���!", ilu potrzebujesz do sprawdzenia potrzebnej liczbywarunków.

Struktura Select Case

Jeżeli będziesz musiał wielokrotnie stosować ���!", powinieneś zastanowić się nadużyciem struktury �����������. Dzięki temu kod stanie się czytelniejszy. Użycie ���!"z poprzedniego przykładu można w następujący sposób zastąpić kodem korzystającymz �����������:

�����>���������� ��������,��)���(�������������������������������������������&�������� ���(@ �����-���+�����+���+�#����#�-��������&B�������� ���(@ �����-���+�����+!�:/�#����#�-�������������������� ���(@ �����-�����#��+����!�:/�#����&������+�#����&B-���������������������

Oczywiście, możesz dodać więcej przypadków, zależnie od potrzeby. VBA będziebadać wszystkie przypadki, aż znajdzie ten, który odpowiada wartości ���#�� i wykonazapisane w nim instrukcje. Jeżeli żaden przypadek nie będzie odpowiadał wartości���#��, wykonane zostaną instrukcje domyślnego przypadku ����� ���. Użycie ���� ��� jest opcjonalne, ale bardzo zalecane, aby struktura zawsze obejmowała wszystkiemożliwe przypadki.

Jeżeli te same instrukcje mają być wykonane dla wielu przypadków, możesz użyćnastępującej składni:

����&C��C��@@@

lub

����&����7

IIf

Przyjrzymy się jeszcze szybko strukturze !!", której nazwa pochodzi od Immediate If3.!!" jest przydatne, gdy chcemy nadać ostateczną wartość zmiennej, gdyż jego składniajest samo wystarczalna. Prawidłowa składnia wygląda tak:

3 Natychmiastowe (bezpośrednie) jeżeli — przyp. tłum.

Page 24: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 101

))>�!����/C�!���GF��������C�!���GF���������

Kod roboczy może wyglądać mniej więcej tak:

���5���(����))>�������?�&$C�-*��#��+����!�:/�#����&$-C�D-*��#������+����!�:/�#����&$-�

Struktura !!" działa dość wolno i dlatego nie jest zbyt często używana w dużych pro-gramach.

Teraz zwróćmy uwagę na struktury sterujące drugiego rodzaju, czyli pętle.

Pętle

Pętli używamy, gdy pewien blok instrukcji kodu ma być wykonywany albo określonąliczbę razy, albo dopóty, dopóki coś się nie zdarzy. Jeżeli liczba wykonań pętli jestokreślona, pętla jest sterowana przez licznik. Mówimy wówczas o powtarzaniu stero-

wanym licznikiem. Drugim rodzajem są pętle wykonywane tak długo, jak długo warunekjest spełniony. Mówimy wówczas o powtarzaniu sterowanym warunkiem. Przyjrzymysię obu typom.

Pętla For...Next

���+++#��� jest przykładem pętli sterowanej licznikiem. Za pomocą rzeczywistych liczblub zmiennych możesz sterować następującymi elementami pętli:

� Counter (licznik) to serce pętli. Śledzi liczbę powtórzeń wykonanych przez pętlę.

� Start to wartość początkowa licznika. Rzadko się zdarza ustawianie innejwartości startowej niż 1 (czasami robi się to w przypadku różnych obliczeńmatematycznych).

� End (koniec) to liczba wyznaczająca koniec pętli. Gdy licznik przekroczy tęwartość, wykonywanie pętli kończy się.

� Step (krok) wyznacza, o ile wartość licznika zwiększa się przy każdymwykonaniu pętli. Użycie kroku jest opcjonalne.

Oto przykład składni pętli ���+++#���:

�������������,��)���(�������������������&�����B����@@@����

Pamiętaj, że ����� i �� mogą być zmiennymi. Zauważ, że ostatnią linią pętli jest #���,a nie ��, jak w strukturach, z jakimi dotychczas mieliśmy do czynienia. Jest to instrukcjazwiększenia wartości licznika o jeden krok.

Do zadeklarowania pętli możemy użyć również takiej składni:

�����������������&�����B������B

Page 25: Access. Programowanie w VBA

102 Część II ♦ Poznanie środowiska VBA

Taka definicja powoduje zwiększenie licznika pętli, w tym przypadku intCounter,o pięć po każdym wykonaniu pętli. W rezultacie tego pętla ta wykona się pięć razy(intCounter będzie miał kolejne wartości 1, 6, 11, 16, 21).

Nie jest rzeczą niezwykłą użycie struktury If … Then wewnątrz petli, tak jak w poniż-szym przykładzie:

����>������������ �������������,��)���(��

���������������������&����&$��������)>�������������5��������$��0�������������� ���(@ ����������������<�-�+�������#�9���#'��9-������������������������ ���(@ ����������������<�-�+�������#�9������#'��9-������������)>���������������

Już słyszę mojego wydawcę pojękującego, że wprowadziłem tu kilka rzeczy dodat-kowych. Zatem przyjrzyjmy się dokładniej użytemu kodowi.

Jest to pętla ���+++#��� mająca wykonać 10 powtórzeń. Zadaniem instrukcji wewnątrzpętli jest sprawdzenie, czy jest to przebieg parzysty, czy nieparzysty. Do tego celuposłużyła mi struktura !"+++�,��+++ ���. Mamy zatem strukturę !"+++�,��+++ ���wewnątrz struktury ���+++#���. Jeżeli jedna struktura występuje wewnątrz innej, mówimyo strukturach zagnieżdżonych, które są w programowaniu powszechnie stosowane.

Użyte wyrażenie warunkowe wykonuje specyficzne dzielenie. Użyłem słowa kluczo-wego ���, które jest skrótem od modulus. 2 ����� zwraca resztę z dzielenia liczby Aprzez liczbę B. Jeżeli liczbę parzystą podzielimy przez 2, resztą z dzielenia będzie 0.Zatem jeżeli licznik zostanie podzielony przez 2 i resztą z dzielenia będzie 0, warunek!" zostanie spełniony i kolejna instrukcja wykonana. Jeżeli reszta z dzielenia będzieróżna od zera, zostanie wykona instrukcja z części ���.

#��� po prostu zwiększa wartość licznika.

Gdy uruchomisz tę procedurę, w oknie Immediate pojawią się następujące wyniki:

Zajmijmy się teraz innym rodzajem pętli.

Page 26: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 103

Pętla Do

�� jest pętlą z powtarzaniem sterowanym warunkiem. Innymi słowy — pętlą działającądopóty, dopóki określony warunek jest spełniony (na przykład coś jest czemuś równelub od czegoś większe).

Istnieją dwa rodzaje pętli �� — ���4,��� i ���5����. Przyjrzyjmy się im.

Do While

Pętla ���4,��� sprawdza, czy warunek jest spełniony. Jeżeli tak, instrukcje pętli sąwykonywane. Dla przykładu przyjrzyjmy się poniższej procedurze.

���������������� �������������,��)���(������ ����������,��)���(��

��������������&�����������������&

���� ��80��������������&�������� ���(@ �����-���+�����:��������-�<�����������

��������)>������������?��B��0������������������������$������������)>

��������������������������������;�&����*����������

Jak widzisz, inaczej niż omawiana wcześniej ���+++#���, pętla ���4,��� nie jest samo-wystarczalna. W tym przypadku musiałeś nadać wartości dwóm zmiennym — jednaposłużyła jako licznik, zaś druga jako zmienna testowa. W tym przypadku chciałem,aby procedura zakończyła działanie po wykonaniu piątego powtórzenia pętli.

Przeciwnie niż w pętli ���, tutaj przebieg nie jest sterowany licznikiem, a powtarzaniepętli trwa, dopóki wartość ������� jest równa 1. Wewnątrz pętli zagnieździłem strukturę!"+++�,��, sprawdzającą wartość licznika. Po osiągnięciu przez nią wartości 5 struk-tura !" spowodowała zmianę wartości ������� na 0, co zakończyło działanie pętli.

Ponieważ sprawdzany jest warunek, a nie liczba iteracji, w pętlach �� nie musisz używaćlicznika. W tym przypadku wprowadziłem go, dodając zmienną ���������� i podno-sząc jej wartość w ostatniej linii. Można to zastąpić wieloma innymi rozwiązaniami.

Zauważ, że ta struktura kończy się słowem -���. Pamiętaj, że stosowanie licznika niejest tu wymagane.

Jeżeli uruchomisz pętlę ���4,���, wyniki otrzymane w oknie Immediate powinny wyglą-dać jak na rysunku na następnej stronie.

Page 27: Access. Programowanie w VBA

104 Część II ♦ Poznanie środowiska VBA

Powstaje pytanie, co się stanie, jeżeli z jakiegoś powodu wartość zmiennej ������ nigdynie będzie równa 1. Czy pętla �� w ogóle zostanie wykonana? Odpowiedź brzmi: nie.Nie zostanie wykonana. Co zatem począć, aby pętla została wykonana choć jeden raz?

�����>���������� �����5���(��,�������(

������������)��������-8���#����#�:����&����&B-C�D������-�����!��������/���'�)>-�

����)>�������?��&�,���������E��&B��0�����������>���������������������5�(����-*��#�������'F�#���#��#�"�����&����&B-��������)>

�������%%%%%%%%%%%%%%%%%%%%%%%%%%%%�����>�����������)>�������?�&$��0����������5�(����������<�-�+�������#�9�!�:/�#9����&$-����������������5�(����������<�-�+�������#�9����+�#9����&$-��������)>�������

Zauważ, że procedura �"���� zawiera sprawdzenie, czy użytkownik wprowadził liczbęz przedziału od 1 do 15, a jeżeli wprowadzona liczba będzie spoza tego zakresu, programpo prostu zostanie zakończony i będziesz musiał uruchomić go ponownie. Chcemy,aby prośba o wprowadzenie liczby była ponawiana do czasu, aż zostanie wpisana liczbaspełniająca ustalone kryteria.

Zmień procedurę �"���� w następujący sposób:

�����>���������� �����5���(��,�������(���� ����������,��)���(��

��������������&

���� �����������������)��������-8���#����#�:����&����&B-C�D����������-�����!��������/���'�)>-�

Page 28: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 105

��������)>�������?��&�,���������E��&B��0������������������������$�������������>�����������������������������5�(����-*��#�������'F�#���#��#�"�����&����&B-������������)>����*����80��������������&

�������

Zauważ, że nie użyliśmy licznika w żadnej postaci. Zamiast tego jest sprawdzanawartość zmiennej �������. Interesujące, gdzie to sprawdzanie się odbywa. Inaczej niżw poprzednim przykładzie, możemy sprawdzanie warunku umieścić na końcu pętli,a nie na początku. Dzięki temu pętla zawsze zostanie wykonana przynajmniej jedenraz, co okazuje się bardzo przydatne w sytuacjach podobnych do zilustrowanej.

Do Until

Jest to pętla nieznacznie różniącą się od poprzednio omówionej. W ���4,��� pętla jestwykonywana, dopóki warunek jest spełniony, zaś pętla ���5���� działa, dopóki waru-nek nie zostanie spełniony.

Podana poprzednio procedura, pokazująca działanie pętli ���4,���, po niewielkichzmianach może korzystać z pętli ���5����:

���������������� �������������,��)���(������ ����������,��)���(��

��������������&�����������������&

���� ��H�������������E?�&�������� ���(@ �����-���+�����:��������-�<�����������

��������)>������������?��B��0������������������������$������������)>

��������������������������������;�&����*����������

Zauważ, że teraz pętla będzie działać dopóty, dopóki wartość ������� będzie różnaod 1. Poza tym wszystko w tym przykładzie jest takie samo jak w poprzednim. Wynikdziałania powinien być taki sam jak w przykładzie z pętlą ���4,���.

Podobnie jak w pętli ���4,��� możesz sprawdzanie warunku umieścić na końcu, dziękiczemu pętla będzie zawsze wykonywana przynajmniej jeden raz.

W dalszej części książki będziemy często używać pętli. Tak jak zmienne są one inte-gralną częścią większości programów.

Page 29: Access. Programowanie w VBA

106 Część II ♦ Poznanie środowiska VBA

Tablice

Na wiele sposobów dyskusja o tablicach ściśle dotyczy zmiennych. Tablica to zmiennazawierająca wiele wartości. Liczba wartości przechowywanych przez tablicę musi byćz góry określona i zadeklarowana. Musisz się także nauczyć odwoływania do wartościwewnątrz tablicy.

Gdy to pisałem, wydawca spytał: „A co z tablicami dynamicznymi?” Jak się potemprzekonasz, tablice dynamiczne są poniekąd oszustwem. Nadal musisz z góry zade-klarować liczbę wartości zapamiętywanych wewnątrz tablicy. Jedyną różnicą jest to, żedeklarację robisz przed użyciem, podczas działania programu, a nie przy pisaniu kodu.

Dowiesz się także, jak właściwie rezerwować (alokować) pamięć tak, aby Twoje tablicenie zajmowały zbyt wiele pamięci.

Składniki tablicy

Każda wartości w tablicy jest jej elementem. Ponieważ zmienna tablicowa zawierawiele elementów, musisz wiedzieć, jak poszczególne z nich wybierać i jak się do nichodwoływać. Możesz to robić za pomocą liczby zwanej indeksem. Najczęściej pierwszyelement tablicy ma indeks równy 0.

Gdybyś mógł zajrzeć „za kulisy” tablicy ���#��� zawierającej nazwiska, zobaczyłbyśmniej więcej taki obraz:

����� �$���-I��.�!��/�-�&���-I��/� '�#��/-�����-J�#��������/-�����-,����*����/-�7���-��0���K!���/�-

Zauważ, że tablica zawiera pięć elementów, choć największą wartością indeksu jest 4.Powtarzam, że zwykle indeks pierwszego elementu jest równy 0 (w dalszej części tegorozdziału poznasz kilka odstępstw od tej zasady).

Jeżeli chcesz pobrać z tablicy i wydrukować imię i nazwisko Anity Leparskiej, musiszużyć instrukcji

�������������

Anita jest na pozycji odpowiadającej indeksowi 3, co — aby nie było zbyt prosto— oznacza czwarty element tablicy. Jest to przyczyną wielu problemów programi-stycznych i nieco dalej poznamy sposób korygowania tej komplikacji.

W VBA mamy dwa typy tablic:

� Tablice statyczne — w których liczba elementów, zwana długością tablicy,jest z góry określona i pozostaje niezmienna.

� Tablice dynamiczne — których zmienna długość nie jest ustalana z góry.

Page 30: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 107

Tablice statyczne deklaruje się podobnie jak zmienne — z jedną niewielką różnicą:

�����5'�������&$��,��)���(��

Widząc coś takiego, musisz być ostrożny. Zapewne myślisz, że w ten sposób deklaru-jesz 10-elementową tablicę. W rzeczywistości tak zadeklarowana tablica ma 11 elemen-tów o indeksach od 0 do 10 (indeks o najmniejszej wartości nazywamy dolną granicą,a indeks o największej wartości górną granicą).

W przypadku naszej tablicy dolna granica, czyli najmniejszy indeks, wynosi 0.

Musisz o tym pamiętać, aby właściwie alokować pamięć potrzebną do przechowywaniatablicy.

Jeżeli chcesz, możesz w procedurze zadeklarować wiele tablic:

��������L��,�������(C����5'�������&$��,��)���(��

Domyślnie najmniejszy indeks jest równy 0, łańcuchy znaków są inicjowane jako puste,a zmienne całkowite z wartością zero.

Zobaczmy przykład. W tej procedurze stworzysz dwie pętle ���+++#���. Pierwszaspowoduje wypełnienie tablicy, zaś druga wydrukowanie jej zawartości. Kod tej pro-cedury jest następujący:

������'���������� ����,��)���(������ �����5'�������&$��,��)���(��

������������$����&$�����������5'������������)��������-8���#�!���GF���������-�<��C�D����������-����������'����'�#��+-���������

������������$����&$�������� ���(@ �����-8���GF��������������'�#�����/���-�<���<�-�������#��-�<�D�������������5'������������������������

Programiści lubią używać małej litery � jako zmiennej reprezentującej indeks tablicy.To tylko przyjęta konwencja. Tutaj użyliśmy jej w podwójnej roli: licznika pętli���+++#��� oraz indeksu tablicy. Zauważ, że do elementu tablicy zawsze odwołujemysię przez jej nazwę z numerem elementu, czyli indeksem ujętym w nawiasy. W podanymprzykładzie jako indeksu używamy licznika pętli �, co pozwala nam na wypełnienietablicy.

Małym przyjemnym dodatkiem jest konkatenacja tekstu objaśniającego i indeksuw komunikacie wzywającym do podania liczby, dzięki czemu wiadomo, który elementtablicy wypełniamy.

Page 31: Access. Programowanie w VBA

108 Część II ♦ Poznanie środowiska VBA

Okno wprowadzania wartości powinno wyglądać mniej więcej tak:

Po wprowadzeniu elementów zostaje uruchomiona druga pętla ���, wyświetlającawartości w oknie Immediate.

Rozmiar tablicy statycznej jest deklarowany bezpośrednio w kodzie. Mówiąc inaczej,jest to robione w czasie projektowania.

W podanym przykładzie jest jeden problem. Jeżeli błędnie zadeklarujesz dolną lubgórną granicę, może to doprowadzić do błędu wykonania. VBA częściowo pomagaCi tego uniknąć za pomocą dwóch wbudowanych funkcji: -�����6����� ���7 i 5������6����� ���7, które zwracają granice tablicy.

Składnię pętli z poprzedniego przykładu możesz zmienić następująco:

��������*���������5'�����������H���������5'��������������5'������������)��������-8���#�!���GF���������-�<��C�D������-����������'����'�#��+-�����

Tablice dynamiczne

Wielu programistów uważa tablice dynamiczne VBA poniekąd za fikcję. W zasadziesą to nadal tablice statyczne, ale ich rozmiary nie są deklarowane przed uruchomieniemprogramu. Tak więc jedyną różnicą jest to, kiedy rozmiary tablic są deklarowane.

Zaczynasz od zadeklarowanie pustej tablicy, na przykład:

������'���������� ����,��)���(������ �����5'���������,��)���(������ �����,��'��#��,��)���(��

�������,��'��#����)��������-)���!'��/=!�#���#�#�!���FM-C�-J�#��������'-�

Page 32: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 109

����J� �����5'����������,��'��#��

������������$�������,��'��#������������5'������������)��������-8���#�!���GF���������-�<��C�D����������-����������'����'�#��+-���������

������������$�������,��'��#��������� ���(@ �����-8���GF��������������'�#�����/���-�<���<�-�������#��-�<�D�������������5'������������������������

Zauważ, że najpierw zadeklarowaliśmy ����������� jako pustą tablicę. Potem za pomocąsłowa kluczowego 0���� zadeklarowaliśmy tablicę statyczną z górną granicą określonąprzez zmienną ���2��������, której wartość została wprowadzona przez użytkownika.

Następnie zmienna ���2�������� posłużyła do sterowania pętlą.

Śledząc ten przykład, dostrzeżesz sprzeczność. Jeżeli wpiszesz, że chcesz wprowa-dzić 5 wyników, skończy się na wprowadzeniu 6, gdyż wartość indeksu rozpoczynasię od 0. To częsty błąd początkujących programistów.

Poprawiając nieco kod, możesz pierwszemu elementowi tablicy przypisać indeks 1 za-miast 0. To ułatwi koordynację działań. Przyjrzyjmy się następującemu kodowi:

������'���������� ����,��)���(������ �����5'���������,��)���(������ �����,��'��#��,��)���(��

�������,��'��#����)��������-)���!'��/=!�#���#�#�!���FM-C�-J�#��������'-�

����J� �����5'�������&�������,��'��#��

������������&�������,��'��#������������5'������������)��������-8���#�!���GF���������-�<��C�D����������-����������'����'�#��+-���������

������������&�������,��'��#��������� ���(@ �����-8���GF��������������'�#�����/���-�<���<�-�������#��-�<�D�������������5'������������������������

Jeżeli uruchomisz ten kod, w oknie Immediate zobaczysz wyniki wyświetlone jak napierwszym rysunku na następnej stronie.

���2�������� jest teraz górną granicą tablicy, zaś 1 — granicą dolną. Potem mamy dwiepętle ���+++#��� startujące od 1 (pamiętaj, że teraz nie istnieje element 0).

Page 33: Access. Programowanie w VBA

110 Część II ♦ Poznanie środowiska VBA

Istnieje również inna technika pozwalająca na rozpoczęcie indeksowania od 1. W sekcjideklaracji ogólnej możesz napisać ������������1 lub �������������. W ten sposób usta-lisz dolną granicę tablic w danym module. Masz do wyboru tylko dwie wartości: 0 i 1.

Poza granicami

Co się stanie, jeżeli programując, zrobisz błąd, w wyniku którego nastąpi próba uzyskaniadostępu do większej liczby elementów tablicy, niż zostało zadeklarowane w instrukcji��� lub 0����?

VBA nie odkryje tego błędu, dopóki program nie zostanie uruchomiony. Tego rodzajubłąd jest nazywany błędem wykonania (runtime error). Jeżeli nastąpi, zostanie wyświe-tlony komunikat podobny do pokazanego poniżej:

Kliknięcie przycisku Debug spowoduje pokazanie linii kodu uznanej przez programza błędną.

Bądź jednak ostrożny! Wskazana linia jest tą, na której program się załamał, jednakżezablokowanie wykonania programu może być wynikiem błędu popełnionego o wielewcześniej. Mogłeś zmiennej określającej wielkość nadać złą wartość lub pomylić sięw deklaracji ��� lub 0����. Znalezienie przyczyny błędu może wymagać nieco pracydetektywistycznej.

Zmniejszanie tablicy

Co się stanie, jeżeli zadeklarowałeś górną granicę tablicy równą 10, ale nadałeś wartośćjedynie czterem elementom?

Page 34: Access. Programowanie w VBA

Rozdział 6. ♦ Podstawy programowania w VBA 111

Pamiętaj, że 10 określa pozycję ostatniego elementu tablicy. Jednakże w przeciwieństwiedo przekroczenia wielkości tablicy, nie ma żadnych zasad nakazujących wykorzystaniewszystkich jej elementów. Użycie jedynie czterech z nich nie spowoduje żadnych pro-blemów. Ale „za kulisami” tkwi pewien problem.

Jako początkujący nie musisz się tym przejmować, ale ważnym zagadnieniem w pro-gramowaniu jest kontrola wykorzystania zasobów. Pojemność pamięci komputera jestskończona. Jeżeli deklarujesz, że Twoja tablica będzie miała 10 elementów, VBArezerwuje pamięć odpowiedniej wielkości. Oznacza to, że część pamięci pozostanieniewykorzystana. Jest to straszne marnowanie zasobów.

Zapewne Twoim pierwszym odruchem będzie próba użycia 0���� do zmiany wielko-ści deklaracji, ale to spowoduje inny, raczej poważny problem. Gdy w poprzednimprzykładzie użyliśmy deklaracji 0����, tablica nadal nie miała żadnych elementów.Jeżeli użyjesz 0���� przy wypełnionej tablicy, zostanie ona wymazana i stworzona odnowa. Istnieje spore prawdopodobieństwo, że nie będziesz z tego zadowolony.

VBA pozwala nam na wyjście z kłopotu przez połączenie 0���� z innym słowemkluczowym, jak to zostało pokazane poniżej:

J� �� �����4����5'�������7�

Słowo kluczowe �����(� powoduje ponowną alokację pamięci, pozostawiając jejelementy nietknięte.

Czyszczenie tablic

Czasami będziesz chciał zachować deklarację tablicy, ale wyczyścić jej elementy.Możesz to zrobić z łatwością za pomocą słowa kluczowego ����8 tak jak to zostałopokazane poniżej:

��������5'������

Powoduje to wyczyszczenie zawartości tablicy z zachowaniem jej deklaracji.

Różne rzeczy mogą się zdarzyć, zależnie od typu tablicy. Jeżeli jest to tablica nume-ryczna, jej elementom zostanie nadana wartość 0. Jeżeli jest to tablica tekstowa (łań-cuchów znaków), jej elementom zostanie nadana wartość "". Jest to pusty łańcuchznaków. W przypadku tablicy typu ������� jej elementy zostaną ustawione na �����.

IsArray

Jak można sprawdzić, czy zmienna jest tablicą? VBA posiada małą wygodną funkcjędo testowania zmiennych. Przyjrzyj się poniższemu kodowi.

������'���������� �����������&�,��)���(������ �������������7��,��)���(��

Page 35: Access. Programowanie w VBA

112 Część II ♦ Poznanie środowiska VBA

���� ���(@ �����-�#'����������&�+���������9M�-�<�)�,��'����������&����� ���(@ �����-�#'������������+���������9M�-�<�)�,��'������������

�������

Rezultat działania tego kodu będzie następujący:

Jak widzisz, !�2���� jest funkcją typu �������. Zwraca wartość ���� lub �����. W pierw-szym przypadku powyżej wynikiem jest �����, gdyż pierwsza zmienna nie zostałazadeklarowana jako tablica. W drugim przypadku wynikiem jest ����, gdyż drugazmienna jest tablicą.

Podsumowanie

Wiele się nauczyliśmy w tym rozdziale. Poznaliśmy zmienne oraz różne struktury VBA.Pomimo to nasza znajomość podstaw VBA jest wciąż dalece niepełna. Podczas dalszejlektury książki poznamy kolejne elementy.

W pozostałych rozdziałach tej części z jeszcze większą uwagą i bardziej szczegółowoprzyjrzymy się edytorowi VBA i poznanym już strukturom.