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ść kolumn 1, 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 Integer 5. Dla lepszego skojarzenia, jak poprawnie określać kierunki przesunięcia, wystarczy zapamiętać następujący prosty schemat: 1 Czyli gdy kierunek przesunięcia ma być naturalny w kontekście arkusza, gdzie w wierszach zwykle poruszamy się z góry na dół. 2 Czyli gdy kierunek przesunięcia ma być przeciwny do naturalnego w kontekście wierszy arkusza. 3 Czyli gdy kierunek przesunięcia ma być naturalny w kontekście arkusza, gdzie w kolumnach zwykle poruszamy się od lewej do prawej. 4 Czyli gdy kierunek przesunięcia ma być przeciwny do naturalnego w kontekście kolumn arkusza. 5 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 ActiveCell.Offset(1, 0).Activate Else MsgBox Znaczenie Jeśli aktywna komórka znajduje się co najwyżej w przedostatnim wierszu, wtedy (Jest to zabezpieczenie przed przekroczeniem dolnej krawędzi arkusza.) Uaktywnij komórkę leżącą o 1 wiersz w dół, w tej samej kolumnie. 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 CBool...268 CByte...268 CCur...268 CDate...271, 272 CDbl...268 Chr...122, 123 CInt...268 CLng...268 CStr...268, 273 InputBox...273 InStr...138, 139 IsDate...270, 272 IsNumeric...141-143, 270 LCase...137, 138 Left...128 Len...126, 127, 168 LTrim...134 Mid...130-132 Right...129, 130 RTrim...134 Trim...132-134 UCase...135, 136 instrukcja Case...162, 163 Case Else...162, 164, 165 Case Is...162-164, 166 Else...155-157, 160 ElseIf...158-160 End If...150, 151 End Select...162, 164 Exit...146, 192, 193, 195, 196 Exit Do...194 Exit For...194 Exit Function...194 Exit Sub...194 If Then...145, 146, 148, 150-152, 155, 156, 158 Loop...184, 186, 187 Next...169-171, 180, 182 Select Case...145, 160-162, 166 Step...171-173 To...169, 170 Wend...190, 191 kolekcja Cells...208, 238, 252-256, 258 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 metoda Activate. 186, 187, 228, 229-231, 234 AutoFit.244-247, 250, 251 Clear...221, 225 ClearComments...221, 225 ClearContents...201, 205, 221, 222, 225 ClearFormats...221 ClearNotes...221 ClearOutline. 222, 226, 237 InputBox...259, 260, 262, 263, 264 MsgBox...83, 84 Select...236-240, 241, 242, 243, 245, 246, 250, 251 obiekt ActiveCell......186-188, 203, 204, 205, 210, 228, 229, 231, 233, 237 ActiveSheet. 203, 204, 205, 209, 231, 232, 241, 253, 254, 258 ActiveWorkbook. 203, 204, 205 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 operator And...101, 153-155, 184 Is...100 Like...100 Mod...97 Not...101 Or...101, 153-155, 184 XOR...102 ^...97 -...97 *...97 /...97 \...97 &...98, 99, 117, 118 +...97 <...100 <=...100 <>...100 =...100 >...100 >=...100 panel Immediate...105-107 Copyright Dariusz Pietrzyk 275