IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI
KATALOG KSI¥¯EK KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK DODAJ DO KOSZYKA
CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWO CIACH ZAMÓW CENNIK
CZYTELNIA FRAGMENTY KSI¥¯EK 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 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
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.
Spis treści O Autorach ........................................................................................ 9 Wstęp ............................................................................................. 11
Część I
Poznanie środowiska MS Accessa ..................................15
Rozdział 1. Wstęp do VBA for Applications......................................................... 17 Historia Microsoft Accessa ............................................................................................. 17 Tworzenie aplikacji w Accessie ...................................................................................... 19 Okno Baza danych .................................................................................................... 19 Makra ........................................................................................................................ 21 Moduły...................................................................................................................... 22 Przyszłość Microsoft Accessa ......................................................................................... 23 Podsumowanie ................................................................................................................ 24
Rozdział 2. Projektowanie aplikacji Accessa ...................................................... 25 Etapy procesu tworzenia aplikacji ................................................................................... 26 Określanie i analizowanie wymagań ............................................................................... 26 Analizowanie wymagań ............................................................................................ 27 Ocena i oszacowanie wymagań....................................................................................... 28 Projektowanie i tworzenie programu............................................................................... 29 Model encja-relacja................................................................................................... 30 Tłumaczenie modelu E-R na accessową bazę danych............................................... 31 Wdrażanie i testowanie.................................................................................................... 34 Przygotowanie dokumentacji .......................................................................................... 35 Utrzymanie systemu ........................................................................................................ 36 Podsumowanie ................................................................................................................ 37
Rozdział 3. Używanie Accessa bez VBA.............................................................. 39 Architektura systemu....................................................................................................... 40 Rozumienie aplikacji bazodanowej ................................................................................. 41 Praca bez VBA ................................................................................................................ 42 Relacje....................................................................................................................... 43 Zdarzenia......................................................................................................................... 45 Stwórz makro ............................................................................................................ 46 Przekształcanie makr w kod VBA............................................................................. 49 Konwencje nazw ............................................................................................................. 50 Szablony predefiniowane ................................................................................................ 50 Menadżer panelu przełączania......................................................................................... 51 Podsumowanie ................................................................................................................ 55
4
Access. Programowanie w VBA
Rozdział 4. Przystosowywanie środowiska Accessa do własnych potrzeb ............ 57 Interakcja 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 ...................... 71 Wprowadzenie 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...................................................... 85 Podstawy 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 ................................................. 113 Otwieranie 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
Spis treści
5 Używanie opcji edytora VBA........................................................................................ 125 Karta Editor............................................................................................................. 126 Karta Editor Format ................................................................................................ 129 Karty General i Docking ......................................................................................... 130 Sięganie po pomoc ........................................................................................................ 131 Rozpoczynanie nowej procedury w VBA ..................................................................... 133 Podsumowanie .............................................................................................................. 134
Rozdział 8. Składniki języka VBA ..................................................................... 135 Obiekty w VBA............................................................................................................. 135 Stałe wewnętrzne........................................................................................................... 136 Podstawowe programy VBA używające formularzy..................................................... 137 Ustawianie ogniska ................................................................................................. 138 Znajdowanie rekordu .............................................................................................. 141 Obiekt Me ............................................................................................................... 143 Sprawdzanie poprawności rekordu ......................................................................... 144 Łączenie z Accessem..................................................................................................... 145 SQL (strukturalny język zapytań).................................................................................. 146 SQL — podstawy.................................................................................................... 147 SQL i VBA.................................................................................................................... 150 Prezentacja wyników..................................................................................................... 153 Podsumowanie .............................................................................................................. 155
Rozdział 9. Procedury ...................................................................................... 157 Deklarowanie procedury ............................................................................................... 157 Funkcje.......................................................................................................................... 159 Parametry ...................................................................................................................... 160 Parametry opcjonalne.............................................................................................. 162 Parametry nazwane ................................................................................................. 163 Projekt i zasięg .............................................................................................................. 164 Zmienne globalne i statyczne ........................................................................................ 165 Zmienne globalne.................................................................................................... 165 Zmienne statyczne................................................................................................... 166 Zmiana struktury bazy danych za pomocą procedury.................................................... 167 Konstruowanie tabeli .............................................................................................. 167 Podsumowanie .............................................................................................................. 169
Rozdział 10. Usuwanie usterek z kodu VBA........................................................ 171 Podstawowe informacje o obsłudze błędów .................................................................. 171 Błędy wykonania..................................................................................................... 172 Obiekt Err...................................................................................................................... 176 Kolekcja Errors ............................................................................................................. 177 Narzędzia do usuwania usterek z kodu.......................................................................... 180 Okno Immediate i punkty wstrzymania................................................................... 181 Asercje .................................................................................................................... 183 Okno Locals ............................................................................................................ 184 Okno Watch ............................................................................................................ 185 Podsumowanie .............................................................................................................. 186
Rozdział 11. Funkcje ......................................................................................... 187 Podprogramy i funkcje .................................................................................................. 187 Funkcje wbudowane...................................................................................................... 188 MsgBox................................................................................................................... 188 InputBox ................................................................................................................. 192 Funkcje daty i czasu ...................................................................................................... 193 Funkcje finansowe......................................................................................................... 195 Podsumowanie .............................................................................................................. 197
6
Access. Programowanie w VBA
Część III Interakcja z VBA ..........................................................199 Rozdział 12. Formularze..................................................................................... 201 Formularze i dane.......................................................................................................... 201 Dynamiczne przypisywanie zestawów rekordów .......................................................... 205 Dołączanie i edytowanie danych ................................................................................... 207 Sterowanie formantami na formularzach....................................................................... 208 Podsumowanie .............................................................................................................. 214
Rozdział 13. Raporty ......................................................................................... 215 Anatomia raportu........................................................................................................... 215 Kreator raportów ........................................................................................................... 218 Raporty specjalne .......................................................................................................... 220 Wykresy .................................................................................................................. 221 Etykiety adresowe ................................................................................................... 224 Wywoływanie raportu z kodu VBA .............................................................................. 226 Tworzenie raportu metodą programową........................................................................ 226 Tworzenie pustego raportu...................................................................................... 226 Dodawanie formantów do raportu........................................................................... 228 Podsumowanie .............................................................................................................. 231
Rozdział 14. Menu i paski narzędzi .................................................................... 233 Paski poleceń................................................................................................................. 233 Tworzenie paska narzędzi ............................................................................................. 235 Menu ............................................................................................................................. 240 Podmenu........................................................................................................................ 243 Podsumowanie .............................................................................................................. 244
Rozdział 15. Modyfikowanie środowiska Accessa............................................... 245 Właściwości startowe .................................................................................................... 245 Modyfikowanie opcji .................................................................................................... 247 Karta Widok............................................................................................................ 249 Karta Ogólne ........................................................................................................... 249 Karta Edytowanie/Znajdowanie .............................................................................. 250 Karta Klawiatura ..................................................................................................... 250 Karta Arkusz danych............................................................................................... 251 Karta Formularze/Raporty....................................................................................... 251 Karta Strony ............................................................................................................ 252 Karta Zaawansowane .............................................................................................. 252 Karta Międzynarodowe ........................................................................................... 253 Karta Sprawdzanie błędów...................................................................................... 253 Karta Pisownia ........................................................................................................ 253 Karta Tabele/Kwerendy .......................................................................................... 254 Podsumowanie .............................................................................................................. 255
Część IV Zaawansowane techniki programowania .......................257 Rozdział 16. Bezpieczeństwo bazy danych.......................................................... 259 Access i bezpieczeństwo ............................................................................................... 259 Interfejs użytkownika.............................................................................................. 259 Ustawianie hasła ..................................................................................................... 260 Programowe tworzenie hasła................................................................................... 261 Ochrona kodu VBA................................................................................................. 262 Kompilowanie kodu do pliku .mde ......................................................................... 263 Zabezpieczenia na poziomie użytkownika .................................................................... 263 Modyfikowanie kont użytkowników metodą programową ..................................... 266
Spis treści
7 Bezpieczeństwo i Access 2003...................................................................................... 268 Jet Sandbox ............................................................................................................. 269 Zabezpieczenia makr............................................................................................... 269 Podsumowanie .............................................................................................................. 273
Rozdział 17. Access i środowisko Microsoft Office ............................................. 275 Współdzielone obiekty .................................................................................................. 275 Obiekt FileSearch.................................................................................................... 276 Obiekt 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....................................................................... 287 Mechanika sieci WWW................................................................................................. 287 Strony dostępu do danych ............................................................................................. 288 Generowanie strony dostępu do danych.................................................................. 289 Zapisywanie strony DAP ........................................................................................ 293 Tworzenie strony dostępu do danych w widoku projektu ....................................... 295 Strony dostępu do danych i VBA............................................................................ 297 XML (Extensible Markup Language) ........................................................................... 298 Podsumowanie .............................................................................................................. 301
Rozdział 19. Rozbudowa .................................................................................... 303 Microsoft Access i SQL Server ..................................................................................... 304 Access Data Projects ..................................................................................................... 304 Rozbudowa bazy danych Accessa........................................................................... 306 Praca z plikiem ADP ..................................................................................................... 310 Procedury przechowywane ..................................................................................... 311 Widoki .................................................................................................................... 311 Podsumowanie .............................................................................................................. 313
Część V
Tworzenie aplikacji.......................................................315
Rozdział 20. Aplikacje wielodostępne ................................................................ 317 Współdzielenie bazy danych ......................................................................................... 317 Obsługa współzawodnictwa i konfliktów...................................................................... 318 Ustawianie interwału odświeżania .......................................................................... 319 Ustawianie interwału aktualizacji............................................................................ 319 Blokowanie rekordów w interfejsie Accessa........................................................... 320 Ustawianie opcji sposobem programowym............................................................. 322 Blokowanie rekordów w ADO................................................................................ 323 Zwiększanie wydajności aplikacji ................................................................................. 324 Oddzielanie danych od innych obiektów Accessa................................................... 325 Centralizacja i decentralizacja................................................................................. 329 Kompilowanie kodu ................................................................................................ 329 Optymalizowanie kodu VBA .................................................................................. 331 Podsumowanie .............................................................................................................. 333
Rozdział 21. Nie tylko Microsoft Access ............................................................ 335 VBA i Microsoft Office................................................................................................. 335 Visual Basic .................................................................................................................. 340 VBScript........................................................................................................................ 347 Platforma Microsoft .NET............................................................................................. 349 Podsumowanie .............................................................................................................. 350
8
Access. Programowanie w VBA
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 poznałeś środowisko VBA, jego strukturę, koncepcję i edytor. Teraz zamierzamy przedstawić podstawy programowania oraz specyficzną składnię języka VBA. 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ż problemem zmiennych. Trudno jest mówić o zmiennych, pomijając ich szczególny typ nazywany tablicą (array). Zamierzamy także przyjrzeć się kilku wbudowanym narzędziom VBA, znacznie ułatwiającym wykonywanie zadań. Zakończymy nasze rozważania, przyglądając się różnym typom struktur programistycznych i ich stosowaniu w środowisku VBA.
Podstawy programowania Jak już powiedzieliśmy w rozdziale 5, kod VBA jest zapisywany i przechowywany w modułach. Zapewne pamiętasz, że istnieją dwa podstawowe typy modułów: powiązane z raportami i formularzami oraz ogólne, przechowujące procedury używane w całym projekcie. Istnieje jeszcze jeden typ zwany modułem klasy, który zawiera kod powiązany z obiektem. 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 formularzy i raportów są tworzone wraz z formularzami i raportami, tutaj skupimy się na tworzeniu modułu standardowego.
Część II ♦ Poznanie środowiska VBA
86
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 na rysunku 6.1. Wystarczy wówczas jedynie kliknąć przycisk Nowy, aby zostać przeniesionym do edytora VBA, a w nim do wnętrza stworzonego modułu, co zostało pokazane na rysunki 6.2. Rysunek 6.1. Okno Baza danych po wybraniu kategorii Moduły
Rysunek 6.2. Edytor VBA z otwartym modułem Module1
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 bezpoś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 oknie Properties, nazwa zostanie zmieniona równieş w oknie Project w edytorze VBA i 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. Zostaniesz poproszony o potwierdzenie nazwy:
O tym, şe nazwa została zmieniona, moşesz 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 modułu
Nazwę modułu moşesz równieş zmienić, klikając ją prawym przyciskiem myszy w oknie dialogowym Baza danych i wybierając z menu podręcznego polecenie Zmień nazwę.
Część II ♌ Poznanie środowiska VBA
88 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 zwanych 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ędzie wpł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ądku
jak sortowanie rekordów bazy danych i jest opcją najczęściej stosowaną. — powoduje sortowanie oparte na binarnych
wartościach znaków. Wielkie litery są wtedy ustawiane przed małymi. — powoduje sortowanie rozpoznające wielkie
i 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 jawnego deklarowania 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.
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ąc procedury, 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 deklaracji ogólnych. Pomaga to wyróşniać i oddzielać procedury i nie ma şadnego wpływu na 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, gdy tylko 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 otwierającym i zamykającym. Na kolejnych kartach ksiąşki będę robił uwagi o tym, jakie zwyczaje i praktyki programistyczne uwaşam za dobre. Choć nie są one bezwzględnie obowiązujące, są akceptowane przez wielu programistów i stały się standardami przemysłowymi.
Część II ♌ Poznanie środowiska VBA
90
Zgodnie z pierwszym zwyczajem, nazwa nadawana procedurze musi opisywać jej działanie, np. # (dodaj liczby). Kaşdy programista od razu rozpozna, do czego ta procedura słuşy. Dodatkowo, choć VBA nie rozróşnia liter wielkich i małych, czasami musi współdziałać z programami, które to robią. Ogólna konwencja nazw, wspomniana w rozdziale 4, nakazuje rozpoczynanie nazwy od małej litery, wyróşnianie wielkimi literami początków wyrazów w zbitkach słownych, niestosowanie spacji i zaczynanie nazw raczej od liter niş cyfr. Rozpoczynanie nazw od liter, a nie od cyfr to w wielu językach, równieş w VBA, więcej niş zwyczaj — to obowiązująca zasada, narzucona przez reguły języka VBA. Drugi zwyczaj to zalecenie wcinania kodu procedury. Dzięki temu łatwo odszukać, gdzie się procedura rozpoczyna, a gdzie kończy. Aby zrobić wcięcie, zwykle trzykrotnie naciskam klawisz spacji lub uşywam klawisza Tab. Edytor VBA zapamięta wcięcie i 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 znaczenia koloró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 poszczegó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şe to być liczba, litera lub całe zdanie. Określenie miejsca przechowywanej informacji jest 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 miejsce zostanie 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.
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 zakresie od –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łącznie dane typu ! $ . Zauwaş, şe jeszcze nie nadaliśmy zmiennej şadnej wartości (i edytor by 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łowe przypisanie wartości zmiennej typu $ moşe wyglądać następująco: , ( -. ! / -
1
Nie stosujemy cudzysłowów drukarskich — przyp. tłum.
Część II ♌ Poznanie środowiska VBA
92
Ponadto musisz pamiętać, şe wartość nadawana zmiennej typu musi być ujęta w 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ą podane w tabeli 6.2. Tabela 6.2. Przedrostki zmiennych Typ zmiennej
Przedrostek
'
'
'
) (
* (
(
+
+
(
(
(
Dobrym pomysłem jest, aby przy nadawaniu nazw obiektom jakiegokolwiek typu stosować 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ętana w zmiennej .
2
Data podawana w stylu amerykańskim: miesiąc, dzień, rok — przyp. tłum.
Rozdział 6. ♌ Podstawy programowania w VBA
93
Variant Typ zmiennej, o jakim jeszcze nie mówiliśmy, to ' . Zaleşnie od tego, z jakim programistą 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 pominiesz klauzulę . 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 kolejnego przypisania 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 rezultatem jest 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 zdecydujesz 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şywamy do 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ętaj takş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.
Część II ♌ Poznanie środowiska VBA
94
Wejście i wyjście Zatem wiesz juş, jak za pomocą zmiennych zachowywać dane. Ale w jaki sposób wprowadzić informację, jaka ma być zapamiętana przez zmienną? Albo jak odczytać informacje zapamiętane przez zmienne? Pod wieloma względami właśnie tego będziemy się uczyć w pozostałej części ksiąşki. Ale dla przetestowania naszego kodu zacznijmy od paru najprostszych technik. Jednym z najprostszych sposobów pobrania informacji od uşytkownika i podstawienia jej pod zmienną jest uşycie wbudowanej funkcji ! . Spowoduje to wyświetlenie prostego okna dialogowego z wezwaniem. Kod naszego prostego przykładu uzupełnij pokazanymi nişej liniami, napisanymi pismem pogrubionym: '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ş przypisuje do zmiennej wartość podaną przez uşytkownika. W tym przypadku zostały stworzone 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 pierwszej liczby (do wprowadzenia drugiej liczby zostanie wyświetlone oddzielne okno).
Jeşeli wykonałeś poprzednie kroki, kod powinien działać, zapamiętując w zmiennych podane liczby. Jednakşe w şaden sposób nie informuje nas o tym. Są dwa sposoby stworzenia wyjścia. Pierwszy to dopisanie dwóch linii, napisanych ponişej pismem pogrubionym:
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 co poprzednio, zaś komunikat wyjściowy pojawi się w oknie Immediate widocznym na dole 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Ĺ&#x201A;adem konkatenacji, gdyĹź Ĺ&#x201A;Ä&#x2026;czy w caĹ&#x201A;oĹ&#x203A;Ä&#x2021; róşne skĹ&#x201A;adniki. Tekst znakowy jest ujÄ&#x2122;ty w cudzysĹ&#x201A;owy, zaĹ&#x203A; zmienne nie. Oba typy sÄ&#x2026; oddzielone znakiem *. ZauwaĹź, Ĺźe linia zostaĹ&#x201A;a podzielona spacjÄ&#x2026; i znakiem podkreĹ&#x203A;lenia. VBA wymaga tego, jeĹźeli jedno wyraĹźenie jest dzielone na wiele linii. W ksiÄ&#x2026;Ĺźce bÄ&#x2122;dziemy tak robili z powodu wymagaĹ&#x201E; typograficznych. JeĹźeli chcesz, moĹźesz zapisywaÄ&#x2021; wyraĹźenia kodu w jednej linii. Innym sposobem formatowania wyjĹ&#x203A;cia danych jest technika, z ktĂłrÄ&#x2026; juĹź siÄ&#x2122; spotkaliĹ&#x203A;my w rozdziale 4. MoĹźesz uĹźyÄ&#x2021; okna komunikatĂłw, jeĹźeli poprzedniÄ&#x2026; liniÄ&#x2122; wyjĹ&#x203A;cia zastÄ&#x2026;pisz nastÄ&#x2122;pujÄ&#x2026;cÄ&#x2026;: 5 ( - # ' - < & < - - <
Spowoduje to wyĹ&#x203A;wietlenie okna komunikatu:
A wiÄ&#x2122;c masz juĹź swĂłj pierwszy dziaĹ&#x201A;ajÄ&#x2026;cy program napisany w VBA.
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
96
Struktury sterujÄ&#x2026;ce Komputer dziaĹ&#x201A;a sekwencyjnie. Wykonuje pierwsze polecenie i jeĹźeli nie ma Ĺźadnego bĹ&#x201A;Ä&#x2122;du, przechodzi do nastÄ&#x2122;pnego. Nazywamy to strukturÄ&#x2026; sekwencyjnÄ&#x2026;. Ale co masz zrobiÄ&#x2021;, jeĹźeli nie chcesz, aby kolejnym krokiem byĹ&#x201A;o wykonanie nastÄ&#x2122;pnej linii kodu? W pewnych sytuacjach moĹźesz zechcieÄ&#x2021; przekazaÄ&#x2021; sterowanie programem do innego bloku linii kodu. Albo zechcesz, aby pewien blok linii kodu byĹ&#x201A; powtarzany wielokrotnie, aĹź do wystÄ&#x2026;pienia okreĹ&#x203A;lonej sytuacji (albo okreĹ&#x203A;lonÄ&#x2026; liczbÄ&#x2122; razy). Mechanizmy sĹ&#x201A;uĹźÄ&#x2026;ce realizacji tych zadaĹ&#x201E; nazywamy strukturami sterujÄ&#x2026;cymi. Struktury te dzielimy na dwie bardzo szerokie kategorie: struktury decyzyjne i struktury powtarzajÄ&#x2026;ce. Jak siÄ&#x2122; zaraz przekonasz, struktury decyzyjne pozwalajÄ&#x2026; programowi na podejmowanie decyzji. NajpopularniejszÄ&#x2026; z nich jest struktura !"+++ , . Ale VBA ma ich wiÄ&#x2122;cej: !"+++ , +++ , !", i !!". Struktury powtarzajÄ&#x2026;ce powodujÄ&#x2026; wielokrotne wykonanie bloku linii â&#x20AC;&#x201D; albo okreĹ&#x203A;lonÄ&#x2026; liczbÄ&#x2122; razy, albo do zaistnienia sytuacji, ktĂłra spowoduje przerwanie pÄ&#x2122;tli. W VBA mamy dwie gĹ&#x201A;Ăłwne struktury powtarzajÄ&#x2026;ce: +++# i +++- . W ramach tych dwĂłch struktur zasadniczych istnieje wiele wariacji.
Struktury decyzyjne RozwaĹźmy pseudokod dla porannych czynnoĹ&#x203A;ci. Dla okreĹ&#x203A;lenia dziaĹ&#x201A;ania w pewnym momencie moĹźesz napisaÄ&#x2021;: ' ( ) # # *+ ! # : , # $ $ # - =+ : 0
Wyrazy pogrubione to sĹ&#x201A;owa kluczowe konieczne do podjÄ&#x2122;cia decyzji. Rozpoczynamy strukturÄ&#x2122; decyzyjnÄ&#x2026; od porĂłwnania dwĂłch wartoĹ&#x203A;ci. Czy A jest rĂłwne B? Czy A jest wiÄ&#x2122;ksze od B? Czy B jest prawdziwe? SÄ&#x2026; to tak zwane wyraĹźenia warunkowe. Symbole uĹźywane w tych wyraĹźeniach sÄ&#x2026; podane w tabeli poniĹźej. ) ./ / . /) .)
jest rĂłwne jest róşne jest wiÄ&#x2122;ksze od jest mniejsze od jest wiÄ&#x2122;ksze lub rĂłwne jest mniejsze lub rĂłwne
Zobaczmy, jak prosta struktura decyzyjna dziaĹ&#x201A;a w procedurze: > , ) ( 5 ( , (
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
97
& )> ? &$ 0 5 ( -* # + =! - < )> (@ 5 (
W tym kodzie naleĹźy zauwaĹźyÄ&#x2021; kilka rzeczy. Linia zawierajÄ&#x2026;ca wyraĹźenie warunkowe rozpoczyna siÄ&#x2122; od !" i koĹ&#x201E;czy na , . Ponadto, tak jak wszystkie struktury w VBA, rĂłwnieĹź struktura warunkowa !" musi siÄ&#x2122; koĹ&#x201E;czyÄ&#x2021; instrukcjÄ&#x2026; . W tym przypadku jest to !". JeĹźeli uruchomisz tÄ&#x2122; przykĹ&#x201A;adowÄ&#x2026; procedurÄ&#x2122;, w oknie Immediate zobaczysz wynik pokazany na rysunku poniĹźej:
RozwaĹźmy kilka problemĂłw. Kod dziaĹ&#x201A;a dobrze, ale co by siÄ&#x2122; staĹ&#x201A;o, gdyby liczba nie byĹ&#x201A;a wiÄ&#x2122;ksza od 10? A co waĹźniejsze, skoro wartoĹ&#x203A;Ä&#x2021; zmiennej jest sztywno ustalona, bÄ&#x2122;dzie ona zawsze wiÄ&#x2122;ksza od 10. Przyjrzyjmy siÄ&#x2122; temu bliĹźej. Za pomocÄ&#x2026; polecenia moĹźesz wewnÄ&#x2026;trz struktury !" umieĹ&#x203A;ciÄ&#x2021; Ĺ&#x203A;cieĹźkÄ&#x2122; alternatywnÄ&#x2026;. Zmodyfikujmy nieco nasz kod: > , ) ( 5 ( , ( A )> ? &$ 0 5 ( -* # + ! :/ # &$
5 ( -* # + + # =! &$ )> (@ 5 (
ZauwaĹź, Ĺźe teraz nadaliĹ&#x203A;my zmiennej # nowÄ&#x2026; wartoĹ&#x203A;Ä&#x2021; oraz dodaliĹ&#x203A;my instrukcjÄ&#x2122; . PoniewaĹź instrukcja jest czÄ&#x2122;Ĺ&#x203A;ciÄ&#x2026; instrukcji !", nie potrzeba dodatkowej instrukcji . PoniewaĹź wartoĹ&#x203A;Ä&#x2021; # jest mniejsza od 10, po uruchomieniu procedury zostanie wĹ&#x201A;Ä&#x2026;czona instrukcja , dajÄ&#x2026;c wynik pokazany na rysunku na nastÄ&#x2122;pnej stronie.
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
98
OczywiĹ&#x203A;cie, tak jak poprzednio moĹźesz uĹźyÄ&#x2021; funkcji wbudowanych ! i $ do wprowadzania liczby i wyĹ&#x203A;wietlania wyjĹ&#x203A;ciowego komunikatu.
AND, OR, NOT W niektĂłrych przypadkach zechcesz sprawdziÄ&#x2021; speĹ&#x201A;nienie warunkĂłw zĹ&#x201A;oĹźonych. Czy # . 0 # /) 1? SĹ&#x201A;owa kluczowe 2# , 0 i # sÄ&#x2026; nazywane operatorami logicznymi i sĹ&#x201A;uĹźÄ&#x2026; do sprawdzania warunkĂłw zĹ&#x201A;oĹźonych. W przypadku operatora logicznego 2# oba wyraĹźenia logiczne muszÄ&#x2026; byÄ&#x2021; prawdziwe, aby warunek !" byĹ&#x201A; speĹ&#x201A;niony. PoniĹźej zostaĹ&#x201A;a podana tabela wszystkich moĹźliwych wynikĂłw logicznych dla operatora 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Ä&#x2021; prawdziwy, aby warunek !" zostaĹ&#x201A; speĹ&#x201A;niony. NastÄ&#x2122;pna tabela podaje wszystkie moĹźliwe wyniki logiczne 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 â&#x20AC;&#x201D; zgodnie z oczekiwaniami â&#x20AC;&#x201D; wartoĹ&#x203A;Ä&#x2021; przeciwnÄ&#x2026;. JeĹźeli wyraĹźenie warunkowe (A NIE jest rĂłwne B) jest prawdziwe, to jego zaprzeczenie # (A NIE jest rĂłwne B) jest faĹ&#x201A;szywe i odwrotnie â&#x20AC;&#x201D; jeĹźeli A jest rĂłwne B, wyraĹźenie jest faĹ&#x201A;szywe, a wynik ostateczny prawdziwy. Nie przejmuj siÄ&#x2122;, jeĹźeli potrzebujesz nieco czasu, aby sobie to wszystko wyobraziÄ&#x2021;. BÄ&#x2122;dziemy nadal zajmowaÄ&#x2021; siÄ&#x2122; tÄ&#x2026; samÄ&#x2026; co poprzednio procedurÄ&#x2026; " i uĹźyjemy jej do wyjaĹ&#x203A;nienia wielokrotnego uĹźycia instrukcji !"3 . Chcemy rĂłwnieĹź ograniczyÄ&#x2021; wprowadzanie przez uĹźytkownika liczb do zakresu od 1 do 15.
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
99
ZmieĹ&#x201E; swĂłj kod, aby wyglÄ&#x2026;daĹ&#x201A; 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Ĺ&#x201A;eĹ&#x203A; przedefiniowaÄ&#x2021; # na zmiennÄ&#x2026; globalnÄ&#x2026;. Jeszcze o tym nie mĂłwiliĹ&#x203A;my, ale przypomnij sobie z poczÄ&#x2026;tku tej czÄ&#x2122;Ĺ&#x203A;ci, Ĺźe wszystko, co jest umieszczone w czÄ&#x2122;Ĺ&#x203A;ci deklaracji globalnych, obowiÄ&#x2026;zuje dla caĹ&#x201A;ego moduĹ&#x201A;u. Procedura " sprawdza, czy wartoĹ&#x203A;Ä&#x2021; # zawiera siÄ&#x2122; w zakresie od 1 do 15. JeĹźeli tak, wywoĹ&#x201A;uje procedurÄ&#x2122; " & zawierajÄ&#x2026;cÄ&#x2026; kod, ktĂłrego uĹźywaliĹ&#x203A;my poprzednio, a jeĹźeli nie â&#x20AC;&#x201D; wyĹ&#x203A;wietla komunikat dla uĹźytkownika. JeĹźeli jedna procedura uruchamia innÄ&#x2026;, nazywamy to wywoĹ&#x201A;aniem procedury. SprĂłbuj uruchomiÄ&#x2021; ten kod wielokrotnie. JeĹźeli wprowadzisz liczbÄ&#x2122; z przedziaĹ&#x201A;u od 1 do 15, otrzymasz komunikat, Ĺźe jest ona wiÄ&#x2122;ksza albo mniejsza lub rĂłwna 10. JeĹźeli wprowadzona liczba bÄ&#x2122;dzie spoza przedziaĹ&#x201A;u od 1 do 15, zostanie wyĹ&#x203A;wietlony komunikat pokazany poniĹźej.
Struktura ElseIf Za pomocÄ&#x2026; !" moĹźesz poĹ&#x201A;Ä&#x2026;czyÄ&#x2021; kilka struktur !". Na przykĹ&#x201A;ad: > , ) ( &
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
100
)> & 0 (@ - + + + # # )> &B 0 (@ - + +! :/ # #
(@ - # + ! :/ # & + # &B )>
MoĹźesz uĹźywaÄ&#x2021; tylu poleceĹ&#x201E; !", ilu potrzebujesz do sprawdzenia potrzebnej liczby warunkĂłw.
Struktura Select Case JeĹźeli bÄ&#x2122;dziesz musiaĹ&#x201A; wielokrotnie stosowaÄ&#x2021; !", powinieneĹ&#x203A; zastanowiÄ&#x2021; siÄ&#x2122; nad uĹźyciem struktury . DziÄ&#x2122;ki temu kod stanie siÄ&#x2122; czytelniejszy. UĹźycie !" z poprzedniego przykĹ&#x201A;adu moĹźna w nastÄ&#x2122;pujÄ&#x2026;cy sposĂłb zastÄ&#x2026;piÄ&#x2021; kodem korzystajÄ&#x2026;cym z : > , ) ( & (@ - + + + # # &B (@ - + +! :/ # #
(@ - # + ! :/ # & + # &B
OczywiĹ&#x203A;cie, moĹźesz dodaÄ&#x2021; wiÄ&#x2122;cej przypadkĂłw, zaleĹźnie od potrzeby. VBA bÄ&#x2122;dzie badaÄ&#x2021; wszystkie przypadki, aĹź znajdzie ten, ktĂłry odpowiada wartoĹ&#x203A;ci # i wykona zapisane w nim instrukcje. JeĹźeli Ĺźaden przypadek nie bÄ&#x2122;dzie odpowiadaĹ&#x201A; wartoĹ&#x203A;ci # , wykonane zostanÄ&#x2026; instrukcje domyĹ&#x203A;lnego przypadku . UĹźycie jest opcjonalne, ale bardzo zalecane, aby struktura zawsze obejmowaĹ&#x201A;a wszystkie moĹźliwe przypadki. JeĹźeli te same instrukcje majÄ&#x2026; byÄ&#x2021; wykonane dla wielu przypadkĂłw, moĹźesz uĹźyÄ&#x2021; nastÄ&#x2122;pujÄ&#x2026;cej skĹ&#x201A;adni: &C C @@@
lub & 7
IIf Przyjrzymy siÄ&#x2122; jeszcze szybko strukturze !!", ktĂłrej nazwa pochodzi od Immediate If3. !!" jest przydatne, gdy chcemy nadaÄ&#x2021; ostatecznÄ&#x2026; wartoĹ&#x203A;Ä&#x2021; zmiennej, gdyĹź jego skĹ&#x201A;adnia jest samo wystarczalna. PrawidĹ&#x201A;owa skĹ&#x201A;adnia wyglÄ&#x2026;da tak: 3
Natychmiastowe (bezpoĹ&#x203A;rednie) jeĹźeli â&#x20AC;&#x201D; przyp. tĹ&#x201A;um.
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
101
))> ! /C ! GF C ! GF
Kod roboczy moĹźe wyglÄ&#x2026;daÄ&#x2021; mniej wiÄ&#x2122;cej tak: 5 ( ))> ? &$C -* # + ! :/ # &$-C D -* # + ! :/ # &$-
Struktura !!" dziaĹ&#x201A;a doĹ&#x203A;Ä&#x2021; wolno i dlatego nie jest zbyt czÄ&#x2122;sto uĹźywana w duĹźych programach. Teraz zwrĂłÄ&#x2021;my uwagÄ&#x2122; na struktury sterujÄ&#x2026;ce drugiego rodzaju, czyli pÄ&#x2122;tle.
PÄ&#x2122;tle PÄ&#x2122;tli uĹźywamy, gdy pewien blok instrukcji kodu ma byÄ&#x2021; wykonywany albo okreĹ&#x203A;lonÄ&#x2026; liczbÄ&#x2122; razy, albo dopĂłty, dopĂłki coĹ&#x203A; siÄ&#x2122; nie zdarzy. JeĹźeli liczba wykonaĹ&#x201E; pÄ&#x2122;tli jest okreĹ&#x203A;lona, pÄ&#x2122;tla jest sterowana przez licznik. MĂłwimy wĂłwczas o powtarzaniu sterowanym licznikiem. Drugim rodzajem sÄ&#x2026; pÄ&#x2122;tle wykonywane tak dĹ&#x201A;ugo, jak dĹ&#x201A;ugo warunek jest speĹ&#x201A;niony. MĂłwimy wĂłwczas o powtarzaniu sterowanym warunkiem. Przyjrzymy siÄ&#x2122; obu typom.
PÄ&#x2122;tla For...Next +++# jest przykĹ&#x201A;adem pÄ&#x2122;tli sterowanej licznikiem. Za pomocÄ&#x2026; rzeczywistych liczb
lub zmiennych moĹźesz sterowaÄ&#x2021; nastÄ&#x2122;pujÄ&#x2026;cymi elementami pÄ&#x2122;tli: Counter (licznik) to serce pÄ&#x2122;tli. Ĺ&#x161;ledzi liczbÄ&#x2122; powtĂłrzeĹ&#x201E; wykonanych przez pÄ&#x2122;tlÄ&#x2122;. Start to wartoĹ&#x203A;Ä&#x2021; poczÄ&#x2026;tkowa licznika. Rzadko siÄ&#x2122; zdarza ustawianie innej
wartoĹ&#x203A;ci startowej niĹź 1 (czasami robi siÄ&#x2122; to w przypadku róşnych obliczeĹ&#x201E; matematycznych). End (koniec) to liczba wyznaczajÄ&#x2026;ca koniec pÄ&#x2122;tli. Gdy licznik przekroczy tÄ&#x2122;
wartoĹ&#x203A;Ä&#x2021;, wykonywanie pÄ&#x2122;tli koĹ&#x201E;czy siÄ&#x2122;. Step (krok) wyznacza, o ile wartoĹ&#x203A;Ä&#x2021; licznika zwiÄ&#x2122;ksza siÄ&#x2122; przy kaĹźdym
wykonaniu pÄ&#x2122;tli. UĹźycie kroku jest opcjonalne. Oto przykĹ&#x201A;ad skĹ&#x201A;adni pÄ&#x2122;tli +++# : , ) ( & B @@@
PamiÄ&#x2122;taj, Ĺźe i mogÄ&#x2026; byÄ&#x2021; zmiennymi. ZauwaĹź, Ĺźe ostatniÄ&#x2026; liniÄ&#x2026; pÄ&#x2122;tli jest # , a nie , jak w strukturach, z jakimi dotychczas mieliĹ&#x203A;my do czynienia. Jest to instrukcja zwiÄ&#x2122;kszenia wartoĹ&#x203A;ci licznika o jeden krok. Do zadeklarowania pÄ&#x2122;tli moĹźemy uĹźyÄ&#x2021; rĂłwnieĹź takiej skĹ&#x201A;adni: & B B
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
102
Taka definicja powoduje zwiÄ&#x2122;kszenie licznika pÄ&#x2122;tli, w tym przypadku intCounter, o piÄ&#x2122;Ä&#x2021; po kaĹźdym wykonaniu pÄ&#x2122;tli. W rezultacie tego pÄ&#x2122;tla ta wykona siÄ&#x2122; piÄ&#x2122;Ä&#x2021; razy (intCounter bÄ&#x2122;dzie miaĹ&#x201A; kolejne wartoĹ&#x203A;ci 1, 6, 11, 16, 21). Nie jest rzeczÄ&#x2026; niezwykĹ&#x201A;Ä&#x2026; uĹźycie struktury If â&#x20AC;Ś Then wewnÄ&#x2026;trz petli, tak jak w poniĹźszym przykĹ&#x201A;adzie: > , ) ( & &$ )> 5 $ 0 (@ < - + # 9 #' 9
(@ < - + # 9 #' 9 )>
JuĹź sĹ&#x201A;yszÄ&#x2122; mojego wydawcÄ&#x2122; pojÄ&#x2122;kujÄ&#x2026;cego, Ĺźe wprowadziĹ&#x201A;em tu kilka rzeczy dodatkowych. Zatem przyjrzyjmy siÄ&#x2122; dokĹ&#x201A;adniej uĹźytemu kodowi. Jest to pÄ&#x2122;tla +++# majÄ&#x2026;ca wykonaÄ&#x2021; 10 powtĂłrzeĹ&#x201E;. Zadaniem instrukcji wewnÄ&#x2026;trz pÄ&#x2122;tli jest sprawdzenie, czy jest to przebieg parzysty, czy nieparzysty. Do tego celu posĹ&#x201A;uĹźyĹ&#x201A;a mi struktura !"+++ , +++ . Mamy zatem strukturÄ&#x2122; !"+++ , +++ wewnÄ&#x2026;trz struktury +++# . JeĹźeli jedna struktura wystÄ&#x2122;puje wewnÄ&#x2026;trz innej, mĂłwimy o strukturach zagnieĹźdĹźonych, ktĂłre sÄ&#x2026; w programowaniu powszechnie stosowane. UĹźyte wyraĹźenie warunkowe wykonuje specyficzne dzielenie. UĹźyĹ&#x201A;em sĹ&#x201A;owa kluczowego , ktĂłre jest skrĂłtem od modulus. 2 zwraca resztÄ&#x2122; z dzielenia liczby A przez liczbÄ&#x2122; B. JeĹźeli liczbÄ&#x2122; parzystÄ&#x2026; podzielimy przez 2, resztÄ&#x2026; z dzielenia bÄ&#x2122;dzie 0. Zatem jeĹźeli licznik zostanie podzielony przez 2 i resztÄ&#x2026; z dzielenia bÄ&#x2122;dzie 0, warunek !" zostanie speĹ&#x201A;niony i kolejna instrukcja wykonana. JeĹźeli reszta z dzielenia bÄ&#x2122;dzie róşna od zera, zostanie wykona instrukcja z czÄ&#x2122;Ĺ&#x203A;ci . # po prostu zwiÄ&#x2122;ksza wartoĹ&#x203A;Ä&#x2021; licznika.
Gdy uruchomisz tÄ&#x2122; procedurÄ&#x2122;, w oknie Immediate pojawiÄ&#x2026; siÄ&#x2122; nastÄ&#x2122;pujÄ&#x2026;ce wyniki:
Zajmijmy siÄ&#x2122; teraz innym rodzajem pÄ&#x2122;tli.
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
103
PÄ&#x2122;tla Do jest pÄ&#x2122;tlÄ&#x2026; z powtarzaniem sterowanym warunkiem. Innymi sĹ&#x201A;owy â&#x20AC;&#x201D; pÄ&#x2122;tlÄ&#x2026; dziaĹ&#x201A;ajÄ&#x2026;cÄ&#x2026; dopĂłty, dopĂłki okreĹ&#x203A;lony warunek jest speĹ&#x201A;niony (na przykĹ&#x201A;ad coĹ&#x203A; jest czemuĹ&#x203A; rĂłwne lub od czegoĹ&#x203A; wiÄ&#x2122;ksze).
IstniejÄ&#x2026; dwa rodzaje pÄ&#x2122;tli â&#x20AC;&#x201D; 4, i 5 . Przyjrzyjmy siÄ&#x2122; im.
Do While PÄ&#x2122;tla 4, sprawdza, czy warunek jest speĹ&#x201A;niony. JeĹźeli tak, instrukcje pÄ&#x2122;tli sÄ&#x2026; wykonywane. Dla przykĹ&#x201A;adu przyjrzyjmy siÄ&#x2122; poniĹźszej procedurze. , ) ( , ) ( & & 80 & (@ - + : - < )> ? B 0 $ )> ; & *
Jak widzisz, inaczej niĹź omawiana wczeĹ&#x203A;niej +++# , pÄ&#x2122;tla 4, nie jest samowystarczalna. W tym przypadku musiaĹ&#x201A;eĹ&#x203A; nadaÄ&#x2021; wartoĹ&#x203A;ci dwĂłm zmiennym â&#x20AC;&#x201D; jedna posĹ&#x201A;uĹźyĹ&#x201A;a jako licznik, zaĹ&#x203A; druga jako zmienna testowa. W tym przypadku chciaĹ&#x201A;em, aby procedura zakoĹ&#x201E;czyĹ&#x201A;a dziaĹ&#x201A;anie po wykonaniu piÄ&#x2026;tego powtĂłrzenia pÄ&#x2122;tli. Przeciwnie niĹź w pÄ&#x2122;tli , tutaj przebieg nie jest sterowany licznikiem, a powtarzanie pÄ&#x2122;tli trwa, dopĂłki wartoĹ&#x203A;Ä&#x2021; jest rĂłwna 1. WewnÄ&#x2026;trz pÄ&#x2122;tli zagnieĹşdziĹ&#x201A;em strukturÄ&#x2122; !"+++ , , sprawdzajÄ&#x2026;cÄ&#x2026; wartoĹ&#x203A;Ä&#x2021; licznika. Po osiÄ&#x2026;gniÄ&#x2122;ciu przez niÄ&#x2026; wartoĹ&#x203A;ci 5 struktura !" spowodowaĹ&#x201A;a zmianÄ&#x2122; wartoĹ&#x203A;ci na 0, co zakoĹ&#x201E;czyĹ&#x201A;o dziaĹ&#x201A;anie pÄ&#x2122;tli. PoniewaĹź sprawdzany jest warunek, a nie liczba iteracji, w pÄ&#x2122;tlach nie musisz uĹźywaÄ&#x2021; licznika. W tym przypadku wprowadziĹ&#x201A;em go, dodajÄ&#x2026;c zmiennÄ&#x2026; i podnoszÄ&#x2026;c jej wartoĹ&#x203A;Ä&#x2021; w ostatniej linii. MoĹźna to zastÄ&#x2026;piÄ&#x2021; wieloma innymi rozwiÄ&#x2026;zaniami. ZauwaĹź, Ĺźe ta struktura koĹ&#x201E;czy siÄ&#x2122; sĹ&#x201A;owem - . PamiÄ&#x2122;taj, Ĺźe stosowanie licznika nie jest tu wymagane. JeĹźeli uruchomisz pÄ&#x2122;tlÄ&#x2122; 4, , wyniki otrzymane w oknie Immediate powinny wyglÄ&#x2026;daÄ&#x2021; jak na rysunku na nastÄ&#x2122;pnej stronie.
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
104
Powstaje pytanie, co siÄ&#x2122; stanie, jeĹźeli z jakiegoĹ&#x203A; powodu wartoĹ&#x203A;Ä&#x2021; zmiennej nigdy nie bÄ&#x2122;dzie rĂłwna 1. Czy pÄ&#x2122;tla w ogĂłle zostanie wykonana? OdpowiedĹş brzmi: nie. Nie zostanie wykonana. Co zatem poczÄ&#x2026;Ä&#x2021;, aby pÄ&#x2122;tla zostaĹ&#x201A;a wykonana choÄ&#x2021; 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Ĺ&#x201A; liczbÄ&#x2122; z przedziaĹ&#x201A;u od 1 do 15, a jeĹźeli wprowadzona liczba bÄ&#x2122;dzie spoza tego zakresu, program po prostu zostanie zakoĹ&#x201E;czony i bÄ&#x2122;dziesz musiaĹ&#x201A; uruchomiÄ&#x2021; go ponownie. Chcemy, aby proĹ&#x203A;ba o wprowadzenie liczby byĹ&#x201A;a ponawiana do czasu, aĹź zostanie wpisana liczba speĹ&#x201A;niajÄ&#x2026;ca ustalone kryteria. ZmieĹ&#x201E; procedurÄ&#x2122; " w nastÄ&#x2122;pujÄ&#x2026;cy sposĂłb: > 5 ( , ( , ) ( & ) -8 # # : & &B-C D - ! / ' )>-
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
105
)> ? & , E &B 0 $ >
5 ( -* # 'F # # # " & &B )> * 80 &
ZauwaĹź, Ĺźe nie uĹźyliĹ&#x203A;my licznika w Ĺźadnej postaci. Zamiast tego jest sprawdzana wartoĹ&#x203A;Ä&#x2021; zmiennej . InteresujÄ&#x2026;ce, gdzie to sprawdzanie siÄ&#x2122; odbywa. Inaczej niĹź w poprzednim przykĹ&#x201A;adzie, moĹźemy sprawdzanie warunku umieĹ&#x203A;ciÄ&#x2021; na koĹ&#x201E;cu pÄ&#x2122;tli, a nie na poczÄ&#x2026;tku. DziÄ&#x2122;ki temu pÄ&#x2122;tla zawsze zostanie wykonana przynajmniej jeden raz, co okazuje siÄ&#x2122; bardzo przydatne w sytuacjach podobnych do zilustrowanej.
Do Until Jest to pÄ&#x2122;tla nieznacznie róşniÄ&#x2026;cÄ&#x2026; siÄ&#x2122; od poprzednio omĂłwionej. W 4, pÄ&#x2122;tla jest wykonywana, dopĂłki warunek jest speĹ&#x201A;niony, zaĹ&#x203A; pÄ&#x2122;tla 5 dziaĹ&#x201A;a, dopĂłki warunek nie zostanie speĹ&#x201A;niony. Podana poprzednio procedura, pokazujÄ&#x2026;ca dziaĹ&#x201A;anie pÄ&#x2122;tli 4, , po niewielkich zmianach moĹźe korzystaÄ&#x2021; z pÄ&#x2122;tli 5 : , ) ( , ) ( & & H E? & (@ - + : - < )> ? B 0 $ )> ; & *
ZauwaĹź, Ĺźe teraz pÄ&#x2122;tla bÄ&#x2122;dzie dziaĹ&#x201A;aÄ&#x2021; dopĂłty, dopĂłki wartoĹ&#x203A;Ä&#x2021; bÄ&#x2122;dzie róşna od 1. Poza tym wszystko w tym przykĹ&#x201A;adzie jest takie samo jak w poprzednim. Wynik dziaĹ&#x201A;ania powinien byÄ&#x2021; taki sam jak w przykĹ&#x201A;adzie z pÄ&#x2122;tlÄ&#x2026; 4, . Podobnie jak w pÄ&#x2122;tli 4, moĹźesz sprawdzanie warunku umieĹ&#x203A;ciÄ&#x2021; na koĹ&#x201E;cu, dziÄ&#x2122;ki czemu pÄ&#x2122;tla bÄ&#x2122;dzie zawsze wykonywana przynajmniej jeden raz. W dalszej czÄ&#x2122;Ĺ&#x203A;ci ksiÄ&#x2026;Ĺźki bÄ&#x2122;dziemy czÄ&#x2122;sto uĹźywaÄ&#x2021; pÄ&#x2122;tli. Tak jak zmienne sÄ&#x2026; one integralnÄ&#x2026; czÄ&#x2122;Ĺ&#x203A;ciÄ&#x2026; wiÄ&#x2122;kszoĹ&#x203A;ci programĂłw.
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
106
Tablice Na wiele sposobĂłw dyskusja o tablicach Ĺ&#x203A;ciĹ&#x203A;le dotyczy zmiennych. Tablica to zmienna zawierajÄ&#x2026;ca wiele wartoĹ&#x203A;ci. Liczba wartoĹ&#x203A;ci przechowywanych przez tablicÄ&#x2122; musi byÄ&#x2021; z gĂłry okreĹ&#x203A;lona i zadeklarowana. Musisz siÄ&#x2122; takĹźe nauczyÄ&#x2021; odwoĹ&#x201A;ywania do wartoĹ&#x203A;ci wewnÄ&#x2026;trz tablicy. Gdy to pisaĹ&#x201A;em, wydawca spytaĹ&#x201A;: â&#x20AC;&#x17E;A co z tablicami dynamicznymi?â&#x20AC;? Jak siÄ&#x2122; potem przekonasz, tablice dynamiczne sÄ&#x2026; poniekÄ&#x2026;d oszustwem. Nadal musisz z gĂłry zadeklarowaÄ&#x2021; liczbÄ&#x2122; wartoĹ&#x203A;ci zapamiÄ&#x2122;tywanych wewnÄ&#x2026;trz tablicy. JedynÄ&#x2026; róşnicÄ&#x2026; jest to, Ĺźe deklaracjÄ&#x2122; robisz przed uĹźyciem, podczas dziaĹ&#x201A;ania programu, a nie przy pisaniu kodu. Dowiesz siÄ&#x2122; takĹźe, jak wĹ&#x201A;aĹ&#x203A;ciwie rezerwowaÄ&#x2021; (alokowaÄ&#x2021;) pamiÄ&#x2122;Ä&#x2021; tak, aby Twoje tablice nie zajmowaĹ&#x201A;y zbyt wiele pamiÄ&#x2122;ci.
SkĹ&#x201A;adniki tablicy KaĹźda wartoĹ&#x203A;ci w tablicy jest jej elementem. PoniewaĹź zmienna tablicowa zawiera wiele elementĂłw, musisz wiedzieÄ&#x2021;, jak poszczegĂłlne z nich wybieraÄ&#x2021; i jak siÄ&#x2122; do nich odwoĹ&#x201A;ywaÄ&#x2021;. MoĹźesz to robiÄ&#x2021; za pomocÄ&#x2026; liczby zwanej indeksem. NajczÄ&#x2122;Ĺ&#x203A;ciej pierwszy element tablicy ma indeks rĂłwny 0. GdybyĹ&#x203A; mĂłgĹ&#x201A; zajrzeÄ&#x2021; â&#x20AC;&#x17E;za kulisyâ&#x20AC;? tablicy # zawierajÄ&#x2026;cej nazwiska, zobaczyĹ&#x201A;byĹ&#x203A; mniej wiÄ&#x2122;cej taki obraz:
$ -I . ! / & -I / ' # / -J # / -, * / 7 - 0 K ! / -
ZauwaĹź, Ĺźe tablica zawiera piÄ&#x2122;Ä&#x2021; elementĂłw, choÄ&#x2021; najwiÄ&#x2122;kszÄ&#x2026; wartoĹ&#x203A;ciÄ&#x2026; indeksu jest 4. Powtarzam, Ĺźe zwykle indeks pierwszego elementu jest rĂłwny 0 (w dalszej czÄ&#x2122;Ĺ&#x203A;ci tego rozdziaĹ&#x201A;u poznasz kilka odstÄ&#x2122;pstw od tej zasady). JeĹźeli chcesz pobraÄ&#x2021; z tablicy i wydrukowaÄ&#x2021; imiÄ&#x2122; i nazwisko Anity Leparskiej, musisz uĹźyÄ&#x2021; instrukcji
Anita jest na pozycji odpowiadajÄ&#x2026;cej indeksowi 3, co â&#x20AC;&#x201D; aby nie byĹ&#x201A;o zbyt prosto â&#x20AC;&#x201D; oznacza czwarty element tablicy. Jest to przyczynÄ&#x2026; wielu problemĂłw programistycznych i nieco dalej poznamy sposĂłb korygowania tej komplikacji. W VBA mamy dwa typy tablic: Tablice statyczne â&#x20AC;&#x201D; w ktĂłrych liczba elementĂłw, zwana dĹ&#x201A;ugoĹ&#x203A;ciÄ&#x2026; tablicy,
jest z gĂłry okreĹ&#x203A;lona i pozostaje niezmienna. Tablice dynamiczne â&#x20AC;&#x201D; ktĂłrych zmienna dĹ&#x201A;ugoĹ&#x203A;Ä&#x2021; nie jest ustalana z gĂłry.
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
107
Tablice statyczne deklaruje siÄ&#x2122; podobnie jak zmienne â&#x20AC;&#x201D; z jednÄ&#x2026; niewielkÄ&#x2026; róşnicÄ&#x2026;: 5' &$ , ) (
WidzÄ&#x2026;c coĹ&#x203A; takiego, musisz byÄ&#x2021; ostroĹźny. Zapewne myĹ&#x203A;lisz, Ĺźe w ten sposĂłb deklarujesz 10-elementowÄ&#x2026; tablicÄ&#x2122;. W rzeczywistoĹ&#x203A;ci tak zadeklarowana tablica ma 11 elementĂłw o indeksach od 0 do 10 (indeks o najmniejszej wartoĹ&#x203A;ci nazywamy dolnÄ&#x2026; granicÄ&#x2026;, a indeks o najwiÄ&#x2122;kszej wartoĹ&#x203A;ci gĂłrnÄ&#x2026; granicÄ&#x2026;). W przypadku naszej tablicy dolna granica, czyli najmniejszy indeks, wynosi 0. Musisz o tym pamiÄ&#x2122;taÄ&#x2021;, aby wĹ&#x201A;aĹ&#x203A;ciwie alokowaÄ&#x2021; pamiÄ&#x2122;Ä&#x2021; potrzebnÄ&#x2026; do przechowywania tablicy. JeĹźeli chcesz, moĹźesz w procedurze zadeklarowaÄ&#x2021; wiele tablic: L , (C 5' &$ , ) (
DomyĹ&#x203A;lnie najmniejszy indeks jest rĂłwny 0, Ĺ&#x201A;aĹ&#x201E;cuchy znakĂłw sÄ&#x2026; inicjowane jako puste, a zmienne caĹ&#x201A;kowite z wartoĹ&#x203A;ciÄ&#x2026; zero. Zobaczmy przykĹ&#x201A;ad. W tej procedurze stworzysz dwie pÄ&#x2122;tle +++# . Pierwsza spowoduje wypeĹ&#x201A;nienie tablicy, zaĹ&#x203A; druga wydrukowanie jej zawartoĹ&#x203A;ci. Kod tej procedury jest nastÄ&#x2122;pujÄ&#x2026;cy: ' , ) ( 5' &$ , ) ( $ &$ 5' ) -8 # ! GF - < C D - ' ' # +- $ &$ (@ -8 GF ' # / - < < - # - < D 5'
ProgramiĹ&#x203A;ci lubiÄ&#x2026; uĹźywaÄ&#x2021; maĹ&#x201A;ej litery jako zmiennej reprezentujÄ&#x2026;cej indeks tablicy. To tylko przyjÄ&#x2122;ta konwencja. Tutaj uĹźyliĹ&#x203A;my jej w podwĂłjnej roli: licznika pÄ&#x2122;tli +++# oraz indeksu tablicy. ZauwaĹź, Ĺźe do elementu tablicy zawsze odwoĹ&#x201A;ujemy siÄ&#x2122; przez jej nazwÄ&#x2122; z numerem elementu, czyli indeksem ujÄ&#x2122;tym w nawiasy. W podanym przykĹ&#x201A;adzie jako indeksu uĹźywamy licznika pÄ&#x2122;tli , co pozwala nam na wypeĹ&#x201A;nienie tablicy. MaĹ&#x201A;ym przyjemnym dodatkiem jest konkatenacja tekstu objaĹ&#x203A;niajÄ&#x2026;cego i indeksu w komunikacie wzywajÄ&#x2026;cym do podania liczby, dziÄ&#x2122;ki czemu wiadomo, ktĂłry element tablicy wypeĹ&#x201A;niamy.
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
108
Okno wprowadzania wartoĹ&#x203A;ci powinno wyglÄ&#x2026;daÄ&#x2021; mniej wiÄ&#x2122;cej tak:
Po wprowadzeniu elementĂłw zostaje uruchomiona druga pÄ&#x2122;tla , wyĹ&#x203A;wietlajÄ&#x2026;ca wartoĹ&#x203A;ci w oknie Immediate.
Rozmiar tablicy statycznej jest deklarowany bezpoĹ&#x203A;rednio w kodzie. MĂłwiÄ&#x2026;c inaczej, jest to robione w czasie projektowania. W podanym przykĹ&#x201A;adzie jest jeden problem. JeĹźeli bĹ&#x201A;Ä&#x2122;dnie zadeklarujesz dolnÄ&#x2026; lub gĂłrnÄ&#x2026; granicÄ&#x2122;, moĹźe to doprowadziÄ&#x2021; do bĹ&#x201A;Ä&#x2122;du wykonania. VBA czÄ&#x2122;Ĺ&#x203A;ciowo pomaga Ci tego uniknÄ&#x2026;Ä&#x2021; za pomocÄ&#x2026; dwĂłch wbudowanych funkcji: - 6
7 i 5 ĂĽ6
7, ktĂłre zwracajÄ&#x2026; granice tablicy. SkĹ&#x201A;adniÄ&#x2122; pÄ&#x2122;tli z poprzedniego przykĹ&#x201A;adu moĹźesz zmieniÄ&#x2021; nastÄ&#x2122;pujÄ&#x2026;co: * 5' H 5' 5' ) -8 # ! GF - < C D - ' ' # +-
Tablice dynamiczne Wielu programistĂłw uwaĹźa tablice dynamiczne VBA poniekÄ&#x2026;d za fikcjÄ&#x2122;. W zasadzie sÄ&#x2026; to nadal tablice statyczne, ale ich rozmiary nie sÄ&#x2026; deklarowane przed uruchomieniem programu. Tak wiÄ&#x2122;c jedynÄ&#x2026; róşnicÄ&#x2026; jest to, kiedy rozmiary tablic sÄ&#x2026; deklarowane. Zaczynasz od zadeklarowanie pustej tablicy, na przykĹ&#x201A;ad: ' , ) ( 5' , ) ( , ' # , ) ( , ' # ) -) !' /=! # # # ! FM-C -J # '-
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
109
J 5' , ' # $ , ' #
5' ) -8 # ! GF - < C D - ' ' # +- $ , ' #
(@ -8 GF ' # / - < < - # - < D 5'
ZauwaĹź, Ĺźe najpierw zadeklarowaliĹ&#x203A;my jako pustÄ&#x2026; tablicÄ&#x2122;. Potem za pomocÄ&#x2026; sĹ&#x201A;owa kluczowego 0 zadeklarowaliĹ&#x203A;my tablicÄ&#x2122; statycznÄ&#x2026; z gĂłrnÄ&#x2026; granicÄ&#x2026; okreĹ&#x203A;lonÄ&#x2026; przez zmiennÄ&#x2026; 2
, ktĂłrej wartoĹ&#x203A;Ä&#x2021; zostaĹ&#x201A;a wprowadzona przez uĹźytkownika. NastÄ&#x2122;pnie zmienna 2
posĹ&#x201A;uĹźyĹ&#x201A;a do sterowania pÄ&#x2122;tlÄ&#x2026;. Ĺ&#x161;ledzÄ&#x2026;c ten przykĹ&#x201A;ad, dostrzeĹźesz sprzecznoĹ&#x203A;Ä&#x2021;. JeĹźeli wpiszesz, Ĺźe chcesz wprowadziÄ&#x2021; 5 wynikĂłw, skoĹ&#x201E;czy siÄ&#x2122; na wprowadzeniu 6, gdyĹź wartoĹ&#x203A;Ä&#x2021; indeksu rozpoczyna siÄ&#x2122; od 0. To czÄ&#x2122;sty bĹ&#x201A;Ä&#x2026;d poczÄ&#x2026;tkujÄ&#x2026;cych programistĂłw. PoprawiajÄ&#x2026;c nieco kod, moĹźesz pierwszemu elementowi tablicy przypisaÄ&#x2021; indeks 1 zamiast 0. To uĹ&#x201A;atwi koordynacjÄ&#x2122; dziaĹ&#x201A;aĹ&#x201E;. Przyjrzyjmy siÄ&#x2122; nastÄ&#x2122;pujÄ&#x2026;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Ĺ&#x203A;wietlone jak na pierwszym rysunku na nastÄ&#x2122;pnej stronie. 2
jest teraz gĂłrnÄ&#x2026; granicÄ&#x2026; tablicy, zaĹ&#x203A; 1 â&#x20AC;&#x201D; granicÄ&#x2026; dolnÄ&#x2026;. Potem mamy dwie pÄ&#x2122;tle +++# startujÄ&#x2026;ce od 1 (pamiÄ&#x2122;taj, Ĺźe teraz nie istnieje element 0).
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
110
Istnieje rĂłwnieĹź inna technika pozwalajÄ&#x2026;ca na rozpoczÄ&#x2122;cie indeksowania od 1. W sekcji deklaracji ogĂłlnej moĹźesz napisaÄ&#x2021; 1 lub . W ten sposĂłb ustalisz dolnÄ&#x2026; granicÄ&#x2122; tablic w danym module. Masz do wyboru tylko dwie wartoĹ&#x203A;ci: 0 i 1.
Poza granicami Co siÄ&#x2122; stanie, jeĹźeli programujÄ&#x2026;c, zrobisz bĹ&#x201A;Ä&#x2026;d, w wyniku ktĂłrego nastÄ&#x2026;pi prĂłba uzyskania dostÄ&#x2122;pu do wiÄ&#x2122;kszej liczby elementĂłw tablicy, niĹź zostaĹ&#x201A;o zadeklarowane w instrukcji lub 0 ? VBA nie odkryje tego bĹ&#x201A;Ä&#x2122;du, dopĂłki program nie zostanie uruchomiony. Tego rodzaju bĹ&#x201A;Ä&#x2026;d jest nazywany bĹ&#x201A;Ä&#x2122;dem wykonania (runtime error). JeĹźeli nastÄ&#x2026;pi, zostanie wyĹ&#x203A;wietlony komunikat podobny do pokazanego poniĹźej:
KlikniÄ&#x2122;cie przycisku Debug spowoduje pokazanie linii kodu uznanej przez program za bĹ&#x201A;Ä&#x2122;dnÄ&#x2026;. BÄ&#x2026;dĹş jednak ostroĹźny! Wskazana linia jest tÄ&#x2026;, na ktĂłrej program siÄ&#x2122; zaĹ&#x201A;amaĹ&#x201A;, jednakĹźe zablokowanie wykonania programu moĹźe byÄ&#x2021; wynikiem bĹ&#x201A;Ä&#x2122;du popeĹ&#x201A;nionego o wiele wczeĹ&#x203A;niej. MogĹ&#x201A;eĹ&#x203A; zmiennej okreĹ&#x203A;lajÄ&#x2026;cej wielkoĹ&#x203A;Ä&#x2021; nadaÄ&#x2021; zĹ&#x201A;Ä&#x2026; wartoĹ&#x203A;Ä&#x2021; lub pomyliÄ&#x2021; siÄ&#x2122; w deklaracji lub 0 . Znalezienie przyczyny bĹ&#x201A;Ä&#x2122;du moĹźe wymagaÄ&#x2021; nieco pracy detektywistycznej.
Zmniejszanie tablicy Co siÄ&#x2122; stanie, jeĹźeli zadeklarowaĹ&#x201A;eĹ&#x203A; gĂłrnÄ&#x2026; granicÄ&#x2122; tablicy rĂłwnÄ&#x2026; 10, ale nadaĹ&#x201A;eĹ&#x203A; wartoĹ&#x203A;Ä&#x2021; jedynie czterem elementom?
RozdziaĹ&#x201A; 6. â&#x2122;Ś Podstawy programowania w VBA
111
PamiÄ&#x2122;taj, Ĺźe 10 okreĹ&#x203A;la pozycjÄ&#x2122; ostatniego elementu tablicy. JednakĹźe w przeciwieĹ&#x201E;stwie do przekroczenia wielkoĹ&#x203A;ci tablicy, nie ma Ĺźadnych zasad nakazujÄ&#x2026;cych wykorzystanie wszystkich jej elementĂłw. UĹźycie jedynie czterech z nich nie spowoduje Ĺźadnych problemĂłw. Ale â&#x20AC;&#x17E;za kulisamiâ&#x20AC;? tkwi pewien problem. Jako poczÄ&#x2026;tkujÄ&#x2026;cy nie musisz siÄ&#x2122; tym przejmowaÄ&#x2021;, ale waĹźnym zagadnieniem w programowaniu jest kontrola wykorzystania zasobĂłw. PojemnoĹ&#x203A;Ä&#x2021; pamiÄ&#x2122;ci komputera jest skoĹ&#x201E;czona. JeĹźeli deklarujesz, Ĺźe Twoja tablica bÄ&#x2122;dzie miaĹ&#x201A;a 10 elementĂłw, VBA rezerwuje pamiÄ&#x2122;Ä&#x2021; odpowiedniej wielkoĹ&#x203A;ci. Oznacza to, Ĺźe czÄ&#x2122;Ĺ&#x203A;Ä&#x2021; pamiÄ&#x2122;ci pozostanie niewykorzystana. Jest to straszne marnowanie zasobĂłw. Zapewne Twoim pierwszym odruchem bÄ&#x2122;dzie prĂłba uĹźycia 0 do zmiany wielkoĹ&#x203A;ci deklaracji, ale to spowoduje inny, raczej powaĹźny problem. Gdy w poprzednim przykĹ&#x201A;adzie uĹźyliĹ&#x203A;my deklaracji 0 , tablica nadal nie miaĹ&#x201A;a Ĺźadnych elementĂłw. JeĹźeli uĹźyjesz 0 przy wypeĹ&#x201A;nionej tablicy, zostanie ona wymazana i stworzona od nowa. Istnieje spore prawdopodobieĹ&#x201E;stwo, Ĺźe nie bÄ&#x2122;dziesz z tego zadowolony. VBA pozwala nam na wyjĹ&#x203A;cie z kĹ&#x201A;opotu przez poĹ&#x201A;Ä&#x2026;czenie 0 z innym sĹ&#x201A;owem kluczowym, jak to zostaĹ&#x201A;o pokazane poniĹźej: J 4 5' 7
SĹ&#x201A;owo kluczowe
( powoduje ponownÄ&#x2026; alokacjÄ&#x2122; pamiÄ&#x2122;ci, pozostawiajÄ&#x2026;c jej elementy nietkniÄ&#x2122;te.
Czyszczenie tablic Czasami bÄ&#x2122;dziesz chciaĹ&#x201A; zachowaÄ&#x2021; deklaracjÄ&#x2122; tablicy, ale wyczyĹ&#x203A;ciÄ&#x2021; jej elementy. MoĹźesz to zrobiÄ&#x2021; z Ĺ&#x201A;atwoĹ&#x203A;ciÄ&#x2026; za pomocÄ&#x2026; sĹ&#x201A;owa kluczowego 8 tak jak to zostaĹ&#x201A;o pokazane poniĹźej: 5'
Powoduje to wyczyszczenie zawartoĹ&#x203A;ci tablicy z zachowaniem jej deklaracji. Róşne rzeczy mogÄ&#x2026; siÄ&#x2122; zdarzyÄ&#x2021;, zaleĹźnie od typu tablicy. JeĹźeli jest to tablica numeryczna, jej elementom zostanie nadana wartoĹ&#x203A;Ä&#x2021; 0. JeĹźeli jest to tablica tekstowa (Ĺ&#x201A;aĹ&#x201E;cuchĂłw znakĂłw), jej elementom zostanie nadana wartoĹ&#x203A;Ä&#x2021; "". Jest to pusty Ĺ&#x201A;aĹ&#x201E;cuch znakĂłw. W przypadku tablicy typu jej elementy zostanÄ&#x2026; ustawione na .
IsArray Jak moĹźna sprawdziÄ&#x2021;, czy zmienna jest tablicÄ&#x2026;? VBA posiada maĹ&#x201A;Ä&#x2026; wygodnÄ&#x2026; funkcjÄ&#x2122; do testowania zmiennych. Przyjrzyj siÄ&#x2122; poniĹźszemu kodowi. ' & , ) ( 7 , ) (
CzÄ&#x2122;Ĺ&#x203A;Ä&#x2021; II â&#x2122;Ś Poznanie Ĺ&#x203A;rodowiska VBA
112
(@ - #' & + 9M - < ) , ' & (@ - #' + 9M - < ) , '
Rezultat dziaĹ&#x201A;ania tego kodu bÄ&#x2122;dzie nastÄ&#x2122;pujÄ&#x2026;cy:
Jak widzisz, ! 2
jest funkcjÄ&#x2026; typu . Zwraca wartoĹ&#x203A;Ä&#x2021; lub . W pierwszym przypadku powyĹźej wynikiem jest , gdyĹź pierwsza zmienna nie zostaĹ&#x201A;a zadeklarowana jako tablica. W drugim przypadku wynikiem jest , gdyĹź druga zmienna jest tablicÄ&#x2026;.
Podsumowanie Wiele siÄ&#x2122; nauczyliĹ&#x203A;my w tym rozdziale. PoznaliĹ&#x203A;my zmienne oraz róşne struktury VBA. Pomimo to nasza znajomoĹ&#x203A;Ä&#x2021; podstaw VBA jest wciÄ&#x2026;Ĺź dalece niepeĹ&#x201A;na. Podczas dalszej lektury ksiÄ&#x2026;Ĺźki poznamy kolejne elementy. W pozostaĹ&#x201A;ych rozdziaĹ&#x201A;ach tej czÄ&#x2122;Ĺ&#x203A;ci z jeszcze wiÄ&#x2122;kszÄ&#x2026; uwagÄ&#x2026; i bardziej szczegĂłĹ&#x201A;owo przyjrzymy siÄ&#x2122; edytorowi VBA i poznanym juĹź strukturom.