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