Zintegrowany kurs języka VBA – cz. 1

Transkrypt

Zintegrowany kurs języka VBA – cz. 1
Dariusz Pietrzyk
Zintegrowany kurs języka VBA – cz. 1
Podstawy programowania – operacje na
danych w MS Excel
ISBN 978-83-912106-8-0
Copyright © by Dariusz Pietrzyk & Wydawnictwo Studio eM (www.sem.net.pl)
Żadna część tego podręcznika nie może być bez pisemnej zgody Wydawcy
powielana lub rozpowszechniana w jakiejkolwiek formie czy też jakimikolwiek
technikami elektronicznymi bądź mechanicznymi. Dotyczy to wykonania kopii
dowolną metodą poligraficzną, kserograficzną czy fotograficzną oraz utrwalania
na filmowym, magnetycznym, optycznym (m.in. CD-ROM i DVD-ROM) lub
jakimkolwiek innym nośniku.
Autor oraz Wydawnictwo Studio eM dołożyli wszelkich starań, by opracowanie
niniejsze było rzetelne i kompletne, ale nie biorą żadnej odpowiedzialności za
wykorzystanie zawartych w nim informacji czy też za związane z tym ewentualne
naruszenie praw patentowych bądź autorskich. Autor oraz Wydawnictwo nie
ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w tym podręczniku.
Wymienione w podręczniku nazwy produktów oraz marek są znakami handlowymi bądź towarowymi, przynależnymi ich prawowitym właścicielom.
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Spis treści
Wprowadzenie ............................................................................. 11
Do kogo podręcznik jest adresowany? .................................... 11
Czego się nauczysz z tego podręcznika? ................................. 12
Jak możesz używać tego podręcznika? ................................... 13
Cel kursu ................................................................................. 15
Kurs jako wprowadzenie do programowania ......................... 16
Porządek omawianego materiału ........................................... 17
Język VBA a różne wersje MS Excel ...................................... 20
O autorze ................................................................................ 21
Makra – automatyzacja zadań w arkuszach ............................... 23
Co to jest makro (procedura/program)? ............................... 23
Język VBA .............................................................................. 23
Zastosowanie makr ................................................................ 25
Sposoby tworzenia makr ........................................................ 26
Przygotowanie do tworzenia makr ......................................... 27
Rejestracja (nagrywanie) i uruchamianie makr .................... 28
Aby włączyć wstęgę z obsługą makr (wer. 2007) .............. 29
Aby włączyć wstęgę z obsługą makr (wer. 2010) .............. 29
Aby ustawić poziom zabezpieczeń (wer. XP/2003) .......... 30
Aby ustawić poziom zabezpieczeń (wer. 2007/2010) ....... 31
Aby zarejestrować makro (wer. XP/2003) ....................... 32
Aby zarejestrować makro (wer. 2007/2010) .................... 33
Aby uruchomić makro (sposób uniwersalny) ................... 35
Aby zmodyfikować kod makra .......................................... 35
Aby usunąć makro ............................................................. 37
Przyciski uruchamiające makra z poziomu arkusza .............. 37
Aby wstawić do arkusza przycisk uruchamiający makro .. 39
Aby przypisać do makra skrót klawiszowy ....................... 40
Copyright © Dariusz Pietrzyk
3
Paski narzędziowe .................................................................. 41
Aby uaktywnić skoroszyt makr osobistych
(personal.xls)
.............................................................. 44
Aby szybko przełączyć się do okna edytora VBA .............. 44
Aby utworzyć własny pasek narzędziowy
(wer. XP/2003)
.......................................................... 45
Aby utworzyć własną wstęgę/pasek narzędziowy
(wer. 2010) ........................................................................ 45
Aby podpiąć makro do przycisku na pasku
narzędziowym (wer. XP/2003) ......................................... 46
Aby dodać przycisk uruchamiający makro do paska
„Szybki dostęp” (wer. 2007/2010) .................................... 47
Edycja i zarządzanie kodem VBA ............................................... 49
Okno edytora VBA ................................................................. 49
Moduły VBA (ang. modules) .................................................. 52
Aby utworzyć nowy moduł ................................................ 53
Aby zmienić nazwę modułu ............................................... 54
Aby przejść do edycji kodu w wybranym module ............. 55
Aby szybko przełączyć się między otwartymi modułami . . 55
Aby zamknąć podgląd aktywnego modułu ........................ 55
Aby usunąć moduł ............................................................. 55
Archiwizacja i przenoszenie kodu VBA .................................. 56
Aby wyeksportować moduł ................................................ 57
Aby zaimportować moduł z pliku zewnętrznego .............. 58
Edycja kodu VBA .................................................................... 59
Aby szybko odnaleźć procedurę w module ....................... 62
Aby przeskoczyć w kodzie do początku następnej
procedury
................................................................... 62
Aby szybko zwiększyć lub zmniejszyć wcięcie ................... 63
Aby ustalić podstawowe parametry działania
edytora VBA
............................................................... 63
4
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Znaczenie kolorów w edytorze VBA ....................................... 67
Wstęp do programowania .......................................................... 69
Jakość kodu ............................................................................ 69
Procedury i funkcje ................................................................ 72
Aby utworzyć procedurę .................................................... 73
Zmienne i stałe ....................................................................... 74
Aby wymusić jawną deklarację zmiennych ....................... 79
Aby zadeklarować zmienną ............................................... 81
Aby zadeklarować stałą ..................................................... 82
Aby wyświetlić wyniki działania procedury w oknie
dialogowym (przykład programu) .................................... 83
Typy danych VBA ................................................................... 85
Typy liczbowe .................................................................... 87
Pozostałe typy ................................................................... 88
Operatory ................................................................................ 91
Operator przypisania ......................................................... 95
Operatory arytmetyczne .................................................... 96
Operator sklejania tekstów ............................................... 98
Operatory porównania ...................................................... 99
Operatory logiczne ........................................................... 101
Testowanie programów ............................................................ 103
Uruchamianie krokowe ........................................................ 103
Aby przetestować działanie procedury krok po kroku .... 104
Szybki podgląd wyników przetwarzania (instrukcja
„Debug.Print” i panel „Immediate”) .................................... 105
Aby wyniki przetwarzania skierować do panelu
„Immediate” ..................................................................... 107
Czujki – śledzenie wartości zmiennych ............................... 108
Aby szybko dodać czujkę dla zmiennej ........................... 108
Aby włączyć/wyłączyć okno z czujkami ........................... 110
Aby dodać czujkę .............................................................. 111
Copyright © Dariusz Pietrzyk
5
Aby usunąć czujkę ............................................................ 112
Aby śledzić wszystkie zmienne lokalne ............................ 112
Przetwarzanie tekstów ............................................................... 115
Sklejanie tekstów (konkatenacja) ......................................... 116
Aby połączyć ciąg znaków ................................................ 118
Aby przełamać wiersz tekstu w kodzie ............................. 119
Aby przełamać wynikowy wiersz tekstu (np. w oknie
komunikatu) .................................................................... 120
Aby dodać do tekstu wynikowego znaki specjalne
(np. cudzysłów) ................................................................ 122
Funkcje przetwarzające ciągi znaków .................................. 123
Aby sprawdzić ilość znaków w tekście (funkcja „Len”) ... 126
Aby pobrać początek tekstu (funkcja „Left”) ................... 128
Aby pobrać koniec tekstu (funkcja „Right”) .................... 129
Aby pobrać środkowy fragment tekstu (funkcja „Mid”) . 130
Aby usunąć zbędne spacje z początku i końca tekstu
(funkcja „Trim”) ............................................................... 132
Aby zamienić tekst na wielkie litery (funkcja „UCase”) . . 135
Aby zamienić tekst na małe litery (funkcja „LCase”) ....... 137
Aby znaleźć tekst w ciągu znaków (funkcja „InStr”) ....... 138
Aby sprawdzić, czy znak jest cyfrą (funkcja
„IsNumeric”)
............................................................. 141
Aby ustalić sposób porównywania tekstów („Option
Compare Binary/Text”) ................................................... 144
Sterowanie przetwarzaniem danych – instrukcje
warunkowe i pętle ..................................................................... 145
Instrukcja warunkowa (If … Then) ...................................... 146
Aby obsłużyć tylko warunek prawdziwy tylko jedną
instrukcją ......................................................................... 147
Aby obsłużyć tylko warunek prawdziwy więcej niż jedną
instrukcją ......................................................................... 150
6
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Aby użyć warunku złożonego ........................................... 151
Aby obsłużyć warunek prawdziwy lub fałszywy .............. 155
Aby obsłużyć tylko jeden ze sprawdzanych po kolei
warunków ........................................................................ 158
Instrukcja wyboru („Select Case”) ....................................... 160
Aby użyć instrukcji „Select Case” ..................................... 161
Pętla z licznikiem („For … Next”) ......................................... 166
Aby użyć pętli „For … Next” ............................................. 169
Aby zmieniać licznik pętli o wartość inną niż 1 ................ 171
Aby użyć w pętli osobnego licznika wewnętrznego ......... 174
Pętla przetwarzająca kolekcje obiektów
(„For Each … In … Next”) ..................................................... 177
Aby użyć pętli „For Each … In … Next” ........................... 180
Pętla z warunkiem zakończenia („Do … Loop”) ................... 182
Aby użyć pętli „Do … Loop” ............................................. 186
Aby użyć pętli „Do … Loop” z warunkiem na początku . . 188
Aby użyć pętli „Do … Loop” z warunkiem „While” ......... 189
Pętla „While … Wend” .......................................................... 190
Aby użyć pętli „While … Wend” ....................................... 191
Instrukcja przerwania/wyjścia („Exit”) ............................... 192
Aby przerwać działanie pętli, procedury lub funkcji ....... 195
VBA w arkuszu kalkulacyjnym .................................................. 199
Własności i metody obiektów ............................................... 199
Hierarchia obiektów w MS Excel ......................................... 201
Składnia obiektowa .............................................................. 204
Aby użyć metody lub własności obiektu ......................... 206
Klasy i kolekcje obiektów ..................................................... 207
Operacje na aktywnej komórce ................................................. 210
Wartość komórki (właściwość „Value”) ................................ 211
Aby pobrać wartość komórki ........................................... 212
Aby wpisać wartość do komórki ...................................... 214
Copyright © Dariusz Pietrzyk
7
Tekst wyświetlany w komórce (właściwość „Text”) ............. 215
Aby pobrać tekst wyświetlany w komórce ....................... 216
Formatowanie komórki z użyciem stylu (właściwość
„Style”)
........................................................................... 217
Aby sformatować komórkę z użyciem stylu .................... 219
Czyszczenie komórki (grupa metod „Clear”) ....................... 221
Aby wyczyścić komórkę ................................................... 222
Adres komórki (właściwość „Address”) ............................... 222
Aby sprawdzić adres komórki ......................................... 223
Współrzędne komórki (właściwości „Row” i „Column”) ..... 223
Aby sprawdzić numer wiersza i numer kolumny dla
komórki ........................................................................... 224
Podsumowanie głównych właściwości i metod dla
komórki
......................................................................... 225
Nawigacja względem aktywnej komórki ................................... 227
Właściwość „Offset” ............................................................. 227
Metoda „Activate” ................................................................ 229
Aby przejść do innej komórki .......................................... 231
Aby pobrać wartość z komórki poniżej ........................... 233
Odwołania do komórek i obszarów .......................................... 235
Obszar arkusza (obiekt „Range”) ......................................... 235
Zaznaczanie obszarów (metoda „Select” i obiekt
„Selection”)
................................................................... 236
Aby zaznaczyć komórkę o znanym adresie ...................... 237
Aby zaznaczyć obszar o znanym adresie ......................... 238
Aby zaznaczyć obszar o znanym adresie początku
i końca zakresu ................................................................ 239
Aby zaznaczyć obszar nieciągły ....................................... 239
Zaznaczanie obszarów – podsumowanie ............................ 240
Kolumny i wiersze (obiekty „Column” i „Row”) ................... 241
Aby zaznaczyć kolumnę o znanej nazwie ........................ 242
8
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Aby zaznaczyć kolumnę o znanym numerze ................... 243
Aby sprawdzić, czy kolumna jest ukryta (właściwość
„Hidden”) ........................................................................ 243
Aby dopasować szerokość zaznaczonych kolumn
do ich zawartości (metoda „AutoFit”) ............................. 244
Aby zaznaczyć wiersz o numerze ..................................... 245
Aby zaznaczyć kilka wierszy leżących obok siebie .......... 246
Aby dopasować wysokość zaznaczonych wierszy do
zawartości (metoda „AutoFit”) ....................................... 246
Aby ustalić wysokość zaznaczonych wierszy
(właściwość „RowHeight”) .............................................. 247
Aby policzyć wiersze w arkuszu (właściwość „Count”) ... 249
Aby policzyć kolumny w arkuszu (właściwość „Count”) . 250
Kolumny i wiersze – podsumowanie ................................... 250
Odwołanie do komórki za pomocą współrzędnych ............. 252
Aby odwołać się przez współrzędne do komórki
w arkuszu
.................................................................. 253
Aby odwołać się przez współrzędne do komórki
w zaznaczonym obszarze ................................................. 254
Odwołanie do komórki o podanych współrzędnych –
podsumowanie ................................................................ 258
Pobieranie danych od użytkownika .......................................... 259
Wprowadzanie danych przez użytkownika (metoda
„InputBox”) .......................................................................... 260
Aby pobrać dane od użytkownika ................................... 262
Konwersja typów danych ..................................................... 264
Aby skonwertować tekst na typ „Date” (funkcja
„CDate”)
.................................................................... 271
Skorowidz ................................................................................. 274
Copyright © Dariusz Pietrzyk
9
Wprowadzenie
[…]
Niniejszy podręcznik obejmuje podstawowy zestaw wiedzy w zakresie automatyzacji pracy w aplikacji MS Excel od wersji XP aż
po 2007/2010.
Do kogo podręcznik jest adresowany?
Ten podręcznik pomoże Ci zdobyć obszerną, solidną i przydatną
wiedzę, jeśli dobrze znasz i intensywnie wykorzystujesz aplikację
MS Excel w codziennej pracy, a zarazem:
• Widzisz potrzebę dalszego zwiększenia wydajności pracy w tym
zakresie.
• Przetwarzasz duże ilości danych i potrzebujesz działania z tym
związane przyspieszyć oraz ułatwić.
• Wykonujesz wiele rozmaitych powtarzalnych, monotonnych
i pracochłonnych, a przez to męczących i nużących czynności,
które zarazem mogą obniżyć jakość wykonywanej pracy – człowiek zmęczony łatwiej popełnia błędy. Maszyna natomiast się
nie męczy, a jeśli będzie dobrze zaprogramowana, nie będzie
błędów popełniać w ogóle.
• Czujesz ograniczenia w możliwościach samej aplikacji – jest
w niej wiele przydatnych narzędzi, ale nie rozwiązuje ona
wszystkich problemów. Każdy z nas pracuje przecież ze specyficznymi zestawami i strukturami danych, zatem potrzebuje
wielu narzędzi wyspecjalizowanych do ich przetwarzania.
• Próbujesz nauczyć się samodzielnie języka VBA, ale napotykasz
na tej drodze przeszkody, które wydają Ci się zbyt trudne do
przezwyciężenia.
Wprowadzenie
• Używasz języka VBA od jakiegoś czasu (i może nawet masz na
swoim koncie kilka bardziej złożonych programów), ale chcesz
uporządkować, uzupełnić, poszerzyć i pogłębić swoją wiedzę
w tym zakresie, a w efekcie skuteczniej zapobiegać rozmaitym –
dziwnym czasami i na razie niezrozumiałym – błędom działania Twoich programów.
• Chcesz, by Twoje programy napisane w VBA działały jeszcze
szybciej, sprawniej i bardziej niezawodnie.
Czego się nauczysz z tego podręcznika?
Wielu mechanizmów umożliwiających przede wszystkim pisanie
programów, które:
• ułatwią i znacząco przyspieszą wprowadzanie dużych ilości powtarzalnych danych (np. liczb porządkowych),
• wspomogą weryfikację i usuwanie najbardziej uciążliwych
i najczęściej spotykanych błędów w danych czy nawet obliczeniach wykonywanych w arkuszach kalkulacyjnych,
• wspomogą analizę dużych ilości danych oraz tworzenie różnorodnych raportów i zestawień,
• przyspieszą precyzyjne formatowanie licznych i obszernych
arkuszy.
A przy okazji – jeśli nie znasz jeszcze żadnego języka programowania – nauczysz się również podstaw programowania, czyli
umiejętności zmuszenia komputera do tego, by wspomagał Cię
w wykonywaniu powtarzalnych czynności, które męczą i zajmują
niepotrzebnie Twój cenny czas. I – co najważniejsze – by maszyna robiła to wszystko dokładnie zgodnie z Twoimi potrzebami.
12
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Najlepiej wiesz, co w pracy z arkuszami kalkulacyjnymi zajmuje
najwięcej Twojego czasu, a wiedza zdobyta za pośrednictwem
niniejszego kursu pozwoli Ci też uniezależnić się od innych osób
z Twojego otoczenia (biura, firmy, korporacji), które taką wiedzę
już posiadają, ale zarazem nie zawsze mają czas i możliwości, by
pomóc w rozwiązywaniu również Twoich problemów.
Jak możesz używać tego podręcznika?
Przede wszystkim:
1. Do sukcesywnej nauki.
Czytając ze zrozumieniem kolejne rozdziały, a przy okazji przepisując i testując podane w nich przykłady, stopniowo możesz
zdobyć, utrwalić i poszerzać bardzo przydatną wiedzę.
Aby nauczyć się programować, trzeba programować – pisać
programy, testować je i usuwać znalezione błędy. Im więcej kodu zatem napiszesz (nawet jeśli zaczniesz od przepisywania
i uruchamiania), tym szybciej zdobędziesz wystarczającą
sprawność, by skutecznie rozwiązywać coraz bardziej skomplikowane problemy związane z automatyzacją wykonywanej na
co dzień pracy. Jeśli do tego dołożysz jeszcze twórczą zabawę –
z wykorzystaniem stopniowo poznawanych na tym kursie
elementów języka VBA, by dostosować dostępne w tym podręczniku przykłady do własnych potrzeb, nauka będzie łatwiejsza i przyniesie lepsze rezultaty.
I choć być może na początku będziesz mieć uczucie powolnego
posuwania się naprzód w tym rozwoju, zaś pisane programy
będą najpierw stosunkowo proste, to jednak – przy odrobinie
Copyright © Dariusz Pietrzyk
13
Wprowadzenie
cierpliwości i konsekwencji – dotrzesz do takiego momentu, że
niespodziewanie zaczniesz „myśleć” w języku VBA, czyli stanie
się on naprawdę przedłużeniem Twojej ręki i narzędziem,
które pozwoli bardzo ułatwić i przyspieszyć wiele codziennych
czynności.
2. Jako podręczną pomoc w programowaniu.
Przy pisaniu kodu potrzebnych programów najpierw zawsze
musisz uświadomić sobie, jakie czynności program ma kolejno
wykonać. Następnie dla każdej kolejnej czynności możesz odszukać w spisie treści podręcznika mechanizm, który pozwala
ją wykonać, a następnie przepisać i dostosować do konkretnej
sytuacji i własnych potrzeb wybrany fragmentu kodu przykładowego (pojedynczych instrukcji i funkcji czy też całych większych konstrukcji).
W ten sposób możesz tworzyć nawet bardziej skomplikowane
programy z minimalnym wysiłkiem – próba napisania od razu
całego dłuższego kodu, szczególnie bez takiej dodatkowej pomocy, może być zniechęcająca. Bowiem nawet programista
z dużym doświadczeniem i wiedzą w zakresie używania tego
czy innego języka programowania ma czasem problemy, by
napisać większy program od razu „z głowy na czysto”.
3. Jako podręczne wsparcie w tłumaczeniu zapisów języka VBA.
Jeśli czytając kod nagranego makra lub procedury napisanej
przez kogoś innego, napotkasz nieznaną lub mało zrozumiałą
instrukcję, możesz sięgnąć do skorowidza, gdzie znajdziesz
odsyłacz do dokładniejszego objaśnienia poszczególnych konstrukcji, obiektów, metod i właściwości.
14
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
4. Jako „przypominacza”.
Jeśli znasz już polecenie języka VBA lub nazwę funkcji, której
potrzebujesz, ale nie pamiętasz dokładnie jej składni lub
innych szczegółów użycia, wówczas możesz zajrzeć do skorowidza, znaleźć tam potrzebny element VBA, a następnie przypomnieć sobie potrzebne szczegóły w oparciu o odpowiedni
fragment podręcznika.
[…]
Porządek omawianego materiału
Materiał podawany w tym i kolejnych częściach tego kursu są
ułożone warstwami – od podstaw do coraz bardziej zaawansowanych zagadnień, ale zarazem od zagadnień najbardziej przydatnych na co dzień do takich, które przydają się w tworzeniu
coraz bardziej wyspecjalizowanych mechanizmów. Stąd w niniejszym podręczniku znajdziesz kolejno rozdziały:
1. Makra – automatyzacja zadań w arkuszach (s. 23) – nagrywanie makr i ich udostępnianie użytkownikom (przez przyciski
i paski narzędziowe), czyli tworzenie prostszych mechanizmów
przyspieszających najczęściej wykonywane czynności.
2. Edycja i zarządzanie kodem VBA (s. 49) – krótkie omówienie
środowiska ułatwiającego pisanie programów w tym języku,
zasad tworzenia poprawnego i stabilnego kodu oraz archiwizacji (zabezpieczenia) i przenoszenia naszych programów z zeszytu do zeszytu czy też na inny komputer.
3. Wstęp do programowania (s. 69) – od czego zacząć pisanie
programu, jakie są podstawowe elementy składowe typowego
Copyright © Dariusz Pietrzyk
15
Wprowadzenie
programu (głównie zmienne i stałe, typy danych i operatory)
oraz jakie mają one znaczenie.
4. Testowanie programów (s. 103) – zapewnienie maksymalnej
poprawności działania naszych programów i podstawowe mechanizmy ułatwiające osiąganie tego celu.
5. Przetwarzanie tekstów (s. 115) – sklejanie tekstów, pisanie
czytelnego i przejrzystego kodu oraz funkcje ułatwiające wykonywanie najczęstszych operacji na tekstach.
Jest to omówienie mechanizmów, które w programowaniu są
(wbrew pozorom) powszechnie i bardzo często wykorzystywane w bardzo wielu sytuacjach, a zarazem są na tyle proste,
by od nich właśnie rozpocząć przestawianie się na sposób
myślenia właściwy do rozwiązywania różnych problemów programistycznych (jeśli jeszcze nie masz takiego doświadczenia).
6. Sterowanie przetwarzaniem danych – instrukcje warunkowe
i pętle (s. 145) – objaśnienie konstrukcji, które są niezbędne,
by tworzyć efektywnie działające programy, w tym również te
przetwarzające większe ilości danych.
7. VBA w arkuszu kalkulacyjnym (s. 199) – objaśnienie podstawowych zagadnień związanych z uzyskiwaniem dostępu do
danych, które chcemy przetwarzać w naszych programach
(w kontekście zeszytów i aplikacji MS Excel).
8. Operacje na aktywnej komórce (s. 210) – m.in. jak pobrać
i zmienić wartość, zmienić formatowanie czy też sprawdzić
adres komórki (nie tylko aktywnej zresztą).
16
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
9. Nawigacja względem aktywnej komórki (s. 227) – poruszanie
się po arkuszu oraz sięganie do komórek, wykorzystywane
przede wszystkim przy przetwarzaniu większych ilości danych
wg schematu „od komórki zaznaczonej do końca ciągu
danych”.
10. Odwołania do komórek i obszarów (s. 235) – głównie dostęp
do komórek/obszarów o znanych adresach oraz do kolumn
i wierszy arkusza.
11. Pobieranie danych od użytkownika (s. 259) – jak pobrać od
użytkownika pojedyncze parametry potrzebne do działania
programu (np. adres komórki czy też współczynnik wykorzystywany do obliczeń) oraz jak dokonać konwersji typów danych (dostosować dane uzyskane w formie nieodpowiedniej do
potrzeb przetwarzania w programu).
Autor kursu starał się też, by nie pojawiały się tu skróty myślowe
spotykane w tego rodzaju podręcznikach. Zdarza się bowiem, że
pewne zagadnienia lub pojęcia wydają się niektórym autorom
oczywiste – na tyle, że nie warto ich omawiać czy objaśniać. I jakkolwiek osoba, która np. w języku VBA już od jakiegoś czasu
programuje (lub programowała wcześniej w innym) i ma już
pewną ugruntowaną wiedzę w tym zakresie, czasem sobie z takimi skrótami myślowymi poradzi, to jednak jest to bardzo duże
utrudnienie dla kogoś, kto dopiero uczy się programować lub
uczył się języka VBA samodzielnie (czyli tworząc własne programy, ale zarazem nie mając żadnego kontaktu z niezbędną szerszą
wiedzą o programowaniu).
Copyright © Dariusz Pietrzyk
17
Wprowadzenie
Dzięki takiemu układowi materiału oraz kompletnym omówieniom przekazywanej wiedzy masz zatem okazję nauczyć się
programowania – umiejętności bardzo przydatnej w dzisiejszym
świecie wypełnionym przez komputery – lub zwiększyć swoją
sprawność w tym zakresie.
[…]
O autorze
Autor używa języka VBA od ok. roku 1998 – do automatyzacji
przetwarzania długich dokumentów MS Word, a w ostatnich kilku latach również prac wykonywanych za pośrednictwem MS
Excel oraz MS Access. Posiada też m.in. wykształcenie w zakresie
inżynierii oprogramowania oraz bogate doświadczenie dydaktyczne w tym zakresie – prowadzi bowiem od wielu lat różnorodne szkolenia w zakresie programowania oraz projektowania
systemów komputerowych.
Serdecznie życzymy sukcesów w tworzeniu mniejszych i większych, ale jak najbardziej przydatnych w codziennej pracy programów – Autor i Wydawnictwo.
[…]
18
Copyright © Dariusz Pietrzyk
Nawigacja względem aktywnej komórki
Bardzo często nasz program ma wykonywać operacje związane
z przechodzeniem po kolejnych komórkach arkusza – np. od
pierwszej komórki z danymi (zaznaczonej przez użytkownika
arkusza) i w dół aż do ostatniego wiersza z danymi (jak robiliśmy
to przy omawianiu pętli Do … Loop) albo też sformatować
komórki z tytułami kolumn, przechodząc w prawo aż do ostatniej
komórki zawierającej tytuł. Może to dotyczyć też przechodzenia
o jedną komórkę w wybranym kierunku (np. w górę lub w lewo) –
zarówno wewnątrz pętli, jak też poza nią.
W takich i jeszcze innych sytuacjach możemy skorzystać przede
wszystkim z możliwości nawigacji względem aktywnej komórki.
Mechanizm ten zaś wykorzystuje przede wszystkim właściwość
Offset (określającą wielkość i kierunek przesunięcia w arkuszu)
i metodę Activate (uaktywniającą komórkę zgodnie z podanymi
parametrami przesunięcia).
Właściwość „Offset”
Ang. offset = ‘pozycja, przesunięcie’. Jest to właściwość określająca wielkość przesunięcia (określaną za pomocą liczby wierszy
oraz kolumn) względem komórki, której właściwość ta dotyczy.
Ważna jest tutaj przede wszystkim:
• kolejność parametrów – zawsze najpierw podawana jest ilość
wierszy, a dopiero potem ilość kolumn1,
• kierunek przesunięcia – podawany za pomocą liczb całkowitych
naturalnych lub ujemnych.
1
Warto pamiętać, że jest to porządek dotyczący w języku VBA wszystkich
obiektów o budowie tabelarycznej – nie tylko arkuszy kalkulacyjnych w MS
Excel, ale też m.in. tabel w MS Word i tabel bazodanowych w MS Access.
Nawigacja względem aktywnej komórki
Stąd schemat instrukcji dokonującej zmiany aktywnej komórki
będzie wyglądać następująco:
ActiveCell.Offset(ileWierszy, ileKolumn).Activate
gdzie parametr:
• ileWierszy – jest liczbą naturalną (czyli całkowitą dodatnią,
jeśli przesunięcie ma nastąpić w dół1), całkowitą ujemną (jeśli
przesunięcie ma nastąpić w górę2) lub równą 0 (jeśli kolejna
aktywna komórka ma się znajdować w tym samym wierszu),
• ileKolumn – jest liczbą naturalną (czyli całkowitą dodatnią,
jeśli przesunięcie ma nastąpić w prawo 3), całkowitą ujemną
(jeśli przesunięcie ma nastąpić w lewo 4) lub równą 0 (jeśli
kolejna aktywna komórka ma się znajdować w tej samej
kolumnie).
Oba te parametry mogą też w razie potrzeby być zmiennymi
liczbowymi (nawet o takich samych nazwach, jak w przykładzie),
zwykle typu Integer5.
Dla lepszego skojarzenia, jak poprawnie określać kierunki przesunięcia, wystarczy zapamiętać następujący prosty schemat:
1
2
3
4
5
Czyli gdy kierunek przesunięcia ma być „naturalny” w kontekście arkusza,
gdzie w wierszach zwykle poruszamy się z góry na dół.
Czyli gdy kierunek przesunięcia ma być „przeciwny do naturalnego” w kontekście wierszy arkusza.
Czyli gdy kierunek przesunięcia ma być „naturalny” w kontekście arkusza,
gdzie w kolumnach zwykle poruszamy się od lewej do prawej.
Czyli gdy kierunek przesunięcia ma być „przeciwny do naturalnego” w kontekście kolumn arkusza.
Ponieważ ten typ obejmuje zarówno liczby całkowite dodatnie, jak i ujemne,
zaś przesunięcia czasem mogą dotyczyć przejścia do określonej komórki i powrotu do komórki poprzedniej. Zależnie od sytuacji może to być oczywiście
również typ Byte lub Long.
228
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Metoda „Activate”
Ang. activate = ‘uaktywnij’. Jest to metoda uaktywniająca wskazany obiekt. Jeśli zatem aktywna jest komórka A1, zaś wykonamy
instrukcję uaktywnienia komórki leżącej o jeden wiersz w dół,
aktywna stanie się komórka A2 (i odwołanie za pomocą
ActiveCell będzie się od tego momentu odnosić właśnie do
komórki A2).
Granice arkusza
Przy „chodzeniu” po komórkach arkusza trzeba też pamiętać, że
arkusz ma swoje granice, poza które nie wolno wychodzić. Próba
przejścia poza ostatni wiersz lub ostatnią kolumnę, ale też przed
pierwszy wiersz lub pierwszą kolumnę, zakończy się błędem –
Copyright © Dariusz Pietrzyk
229
Nawigacja względem aktywnej komórki
z punktu widzenia naszego programu w VBA poza tymi granicami
nie ma komórek, do których można przejść.
Uaktywnianie komórek a użycie klawiszy kierunkowych
Wykonanie np. instrukcji ActiveCell.Offset(1, 0).
Activate na pierwszy rzut oka wygląda jak efekt naciśnięcia na
klawiaturze komputera strzałki kierunkowej „w dół”. Jednak
wykonując instrukcje zapisane w naszych programach w języku
VBA, korzystamy z dużo mocniejszych narzędzi, niż te, które ma
do dyspozycji użytkownik samej tylko aplikacji MS Excel.
W przypadku instrukcji uaktywniania komórek w VBA poruszamy się przede wszystkim po arkuszu w pamięci operacyjnej
komputera. Zatem jeśli jakiś wiersz (lub wiersze) są ukryte i nie
widać ich na arkuszu pokazywanym na ekranie monitora po
naciśnięciu klawisza ze strzałką kierunkową „przeskakujemy”
przez nie (nad nimi) na ekranie. Jeśli jednak wykonamy
instrukcję uaktywnienia kolejnej komórki w dół z poziomu VBA,
zawsze przejdziemy do komórki w następnym wierszu (nawet
jeśli ten wiersz jest ukryty). Świadomość tego faktu pozwoli
uniknąć niemiłych niespodzianek w niektórych sytuacjach.
Aby przejść do innej komórki
• Wpisz np.:
Sub zejdzOKomorkeWDol()
If ActiveCell.Row < ActiveSheet.Rows.Count Then
ActiveCell.Offset(1, 0).Activate
Else
MsgBox ("Ostatni wiersz arkusza.")
End If
End Sub
230
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Instrukcja
If ActiveCell.Row _
< ActiveSheet.Rows.Count Then
Znaczenie
‘Jeśli aktywna komórka
znajduje się co najwyżej
w przedostatnim wierszu,
wtedy…’ (Jest to zabezpieczenie przed przekroczeniem dolnej krawędzi
arkusza.)
ActiveCell.Offset(1, 0).Activate ‘Uaktywnij komórkę leżącą
o 1 wiersz w dół, w tej samej
kolumnie.’
Else
MsgBox…
‘W przeciwnym wypadku
(czyli gdy aktywna jest komórka w ostatnim wierszu),
wyświetl tylko komunikat
z ostrzeżeniem.’
Stan arkusza przed i po uruchomieniu procedury
Wskazówki
• Właściwość Count oznacza liczbę elementów w kolekcji, której
dotyczy. W powyższym przykładzie oznacza zatem liczbę
Copyright © Dariusz Pietrzyk
231
Nawigacja względem aktywnej komórki
wierszy (kolekcja Rows) w aktywnym arkuszu (obiekt
ActiveSheet), a zarazem numer ostatniego wiersza w arkuszu (wiersze są numerowane od 1).
Przyspieszenie działania programów
Fakt, że z poziomu VBA mamy dostęp do arkusza w jego „prawdziwej” postaci w pamięci operacyjnej (a nie tylko do widoku
arkusza pokazywanego na ekranie), ma jeszcze jedną ważną konsekwencję. Każda instrukcja uaktywnienia kolejnej komórki jest
wykonywana nie tylko w pamięci operacyjnej (gdzie wykonana
być musi), ale też jest pokazywana („rysowana”) na ekranie monitora, który służy przede wszystkim do komunikacji z użytkownikiem aplikacji. Po uruchomieniu zaś naszego programu (który ma
np. przejść przez setki tysięcy komórek, wykonując zadane przez
nas, a potrzebne użytkownikowi operacje), można by bez żadnej
szkody dla działania programu monitor wyłączyć – aż do momentu zakończenia wykonywania programu (szczególnie jeśli ma on
pracować kilka czy nawet kilkanaście minut).
Wyłączać monitora oczywiście zwykle nie będziemy (bo najczęściej korzystamy w tym czasie z innych programów), ale będzie
wiele sytuacji, kiedy możemy tak napisać program, by zamiast
„chodzić” po komórkach arkusza (czyli zarazem owo przechodzenie rysować na ekranie), „sięgać” do potrzebnych komórek
bezpośrednio w pamięci komputera (czyli z pominięciem działania karty graficznej i monitora). Takie rozwiązanie znacząco
przyspieszy działanie naszych programów – szczególnie jeśli
instrukcji uaktywniania komórek będzie bardzo dużo (tysiące lub
setki tysięcy). Przyspieszenie to może zaś zaoszczędzić nawet
232
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
połowę i więcej czasu działania programu, zatem warto o tym
pomyśleć (jakkolwiek w niektórych sytuacjach nieco skomplikuje
to kod naszego programu). Przykład takiego rozwiązania jest
przedstawiony w poniższej procedurze.
Aby pobrać wartość z komórki poniżej
• Wpisz wewnątrz procedury np. instrukcję:
MsgBox (ActiveCell.Offset(1, 0).Value)
Dane w arkuszu i efekt działania
Wskazówki
• Zadziała to szybciej niż konstrukcja ActiveCell.Offset
(1,0).Activate, ponieważ nie wymaga zmiany zaznaczenia
komórki na ekranie.
• W analogiczny sposób można skorzystać z innych właściwości
lub metod wskazanej komórki.
• Próba sięgnięcia poza granice arkusza (przed pierwszy wiersz
lub kolumnę albo za ostatni wiersz lub kolumnę) wywoła błąd –
podobnie jak przy próbie przechodzenia do kolejnej komórki
z przykładów wcześniejszych.
[…]
Copyright © Dariusz Pietrzyk
233
Skorowidz
Skorowidz
Numer strony zapisany pogrubionym pismem oznacza obszerniejszy (czasem kilkustronicowy) opis, ważniejsze objaśnienie lub
typowy przykład użycia.
funkcja
Case Else .......162, 164, 165
CBool .............................268
Case Is ...........162-164, 166
CByte .............................268
Else ..................155-157, 160
CCur ...............................268
ElseIf ......................158-160
CDate .....................271, 272
End If .....................150, 151
CDbl ...............................268
End Select ..............162, 164
Chr .........................122, 123
Exit .......146, 192, 193, 195,
CInt ................................268
196
CLng ..............................268
Exit Do ...........................194
CStr ........................268, 273
Exit For ..........................194
InputBox .........................273
Exit Function .................194
InStr .......................138, 139
Exit Sub ..........................194
IsDate .....................270, 272
If … Then ......145, 146, 148,
IsNumeric .......141-143, 270
150-152, 155, 156, 158
LCase ......................137, 138
Loop ................184, 186, 187
Left .................................128
Next .........169-171, 180, 182
Len .................126, 127, 168
Select Case .....145, 160-162,
LTrim .............................134
166
Mid .........................130-132
Step ..........................171-173
Right ......................129, 130
To ...........................169, 170
RTrim .............................134
Wend ......................190, 191
Trim ........................132-134
kolekcja
UCase .....................135, 136
Cells .......208, 238, 252-256,
instrukcja
258
Case ........................162, 163
274
Copyright © Dariusz Pietrzyk
Dariusz Pietrzyk, Zintegrowany kurs języka VBA – cz. 1
Columns …....209, 241-243,
250-252
Rows .......231, 232, 241, 245,
246, 251, 252
Sheets .............................206
Workbooks ......................257
Application ............203, 257
Column ...................209, 241
Range ....235, 236, 237-240
Row ................................241
Selection .......208, 236, 238,
242, 245, 253-255, 256,
258
ThisWorkbook ...............204
metoda
Activate . 186, 187, 228, 229231, 234
operator
AutoFit .244-247, 250, 251
And ...........101, 153-155, 184
Clear ......................221, 225
Is ...................................100
ClearComments .....221, 225
Like ................................100
ClearContents …...201, 205,
Mod ..................................97
221, 222, 225
Not ..................................101
ClearFormats ..................221
Or .............101, 153-155, 184
ClearNotes ......................221
XOR ................................102
ClearOutline . 222, 226, 237
^ ......................................97
InputBox .....259, 260, 262,
- ......................................97
263, 264
* ......................................97
MsgBox .....................83, 84
/ ......................................97
Select ...236-240, 241, 242,
\ ......................................97
243, 245, 246, 250, 251
& ...............98, 99, 117, 118
+ ......................................97
obiekt
< ...................................100
ActiveCell ........….....186-188,
<= ..................................100
203, 204, 205, 210, 228,
<> ..................................100
229, 231, 233, 237
= ...................................100
ActiveSheet . 203, 204, 205,
> ...................................100
209, 231, 232, 241, 253,
>= ..................................100
254, 258
ActiveWorkbook . 203, 204, panel
205
Immediate ..............105-107
Copyright © Dariusz Pietrzyk
275
Skorowidz
Locals ......................112, 113
While ....183-185, 189, 190
Watches .........................109 typ danych
pętla
Boolean ............................88
Do .........146, 182, 183, 186,
Byte ..................................87
188-190, 191, 194, 210,
Currency ..........................89
237
Date ..................................89
For . 146, 166-172, 174, 175,
Double .............................88
177, 194, 210
Integer ..............................87
For Each ..146, 177-181, 194,
Long .................................87
210
Object ...............................88
While ......146, 190, 191, 194
Single ...............................88
String ...............................88
słowo kluczowe
Variant .............................89
Binary .............................144
Compare .........................144 właściwość
Const ................................82
Address …..222, 223, 226,
Database .........................144
237, 252-255, 258
Debug.Assert .................108
Column ........223, 224, 226
Debug.Print ...........105-108
Count . .231, 232, 249, 250,
Dim ............................81, 82
252
End Function ....................73
Hidden .......243, 244, 250,
End Sub ............................73
251
Explicit ......................79, 80
Offset ..186, 187, 227, 228,
Function ...........................73
230, 231, 233
Option ...............79, 80, 144
Row ..............223, 224, 226
Sub ....................................73
RowHeight .. .247, 248, 251
Text ................................144
Style 205, 217, 219, 225,
Until ........183-185, 188, 189
238
vbCr ................................123
Text ...............215, 216, 225
vbCrLf ....................120, 121
Value …..186-188, 211-214,
vbLf ................................123
216, 225, 233
276
Copyright © Dariusz Pietrzyk

Podobne dokumenty