Issuu on Google+


Idź do • Spis treści • Przykładowy rozdział Katalog książek • Katalog online • Zamów drukowany katalog Twój koszyk • Dodaj do koszyka Cennik i informacje • Zamów informacje o nowościach • Zamów cennik Czytelnia • Fragmenty książek online

Kontakt Helion SA ul. Kościuszki 1c 44-100 Gliwice tel. 32 230 98 63 e-mail: helion@helion.pl © Helion 1991–2010

Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha Autor: John Walkenbach Tłumaczenie: Grzegorz Kowalczyk ISBN: 978-83-246-2863-6 Tytuł oryginału: Excel 2010 Power Programming with VBA Format: 172×245, stron: 1024

Opanuj możliwości VBA z największym autorytetem w dziedzinie Excela! • Jak projektować przyjazne użytkownikom okna dialogowe? • Jak stosować VBA do tworzenia użytecznych aplikacji dla Excela? • Jak rozszerzać możliwości Excela i tworzyć praktyczne dodatki? Nie należysz do osób, które onieśmiela potencjał Excela? Sprawnie tworzysz skoroszyty, wprowadzasz formuły, używasz funkcji arkuszowych i swobodnie posługujesz się Wstążką programu? Czujesz, że drzemie w nim jeszcze ogrom niezwykłych możliwości, ale nie wiesz, jak po nie sięgnąć? Najwyższa pora na naukę z Johnem Walkenbachem – najsłynniejszym ekspertem w dziedzinie Excela! Jeśli poznałeś już podstawowe funkcje tego programu, dzięki tej książce bez trudu opanujesz narzędzia zaawansowane, czyli takie, które naprawdę ułatwią i przyspieszą Twoją codzienną pracę! Swoją naukę pod okiem mistrza zaczniesz od odświeżenia informacji na temat używania rozmaitych formuł oraz plików stosowanych i generowanych przez Excel. Zaraz potem przejdziesz do fascynującej części, poświęconej projektowaniu aplikacji w tym programie. Dowiesz się, czym taka aplikacja jest i jak szczegółowo wyglądają etapy jej tworzenia. Następnie opanujesz całą niezbędną wiedzę na temat języka VBA, aby sprawnie w nim programować oraz tworzyć funkcje i procedury. Nauczysz się również wykorzystywać jego możliwości podczas używania tabel przestawnych i wykresów. Ponadto wzbogacisz się o informacje na temat projektowania niestandardowych, przyjaznych okien dialogowych UserForm, automatycznej obsługi zdarzeń czy tworzenia praktycznych dodatków dla Excela. • Przegląd możliwości Excela 2010 • Projektowanie aplikacji w programie Excel • Język Visual Basic for Applications • Zastosowanie formularzy UserForm • Niestandardowe okna dialogowe • Zaawansowane metody programowania • Tabele przestawne, wykresy i obsługa zdarzeń • Projektowanie dodatków do Excela • Tworzenie systemów pomocy dla aplikacji • Tworzenie aplikacji przyjaznych dla użytkownika • Metody użycia VBA do pracy z plikami Posiądź wiedzę profesjonalistów – wykorzystaj wszystkie możliwości Excela i poszerzaj je!


Spis treci O autorze ............................................................................................... 19 Przedmowa ............................................................................................ 21

Cz I Rozdzia 1.

Podstawowe informacje ....................................................29 Skd si wzi Excel 2010? ................................................................... 31 Krótka historia arkuszy kalkulacyjnych ..............................................................................31 Wszystko zaczo si od programu VisiCalc .................................................................31 Lotus 1-2-3 ....................................................................................................................32 Quattro Pro ....................................................................................................................35 Microsoft Excel .............................................................................................................36 Excel jako dobre narzdzie dla projektantów aplikacji ........................................................41 Rola Excela w strategii Microsoftu .....................................................................................43

Rozdzia 2.

Program Excel w zarysie ...................................................................... 45 Mylenie w kategoriach obiektów .......................................................................................45 Skoroszyty ...........................................................................................................................46 Arkusze .........................................................................................................................46 Arkusze wykresów ........................................................................................................48 Arkusze makr XLM ......................................................................................................49 Arkusze dialogowe programów Excel 5 i 95 .................................................................50 Interfejs uytkownika programu Excel ................................................................................50 Wprowadzenie do Wstki ............................................................................................51 Menu podrczne i minipasek narzdzi ..........................................................................57 Okna dialogowe ............................................................................................................58 Skróty klawiszowe ........................................................................................................59 Tagi inteligentne ............................................................................................................59 Panel zada ...................................................................................................................60 Dostosowywanie wywietlania do wasnych potrzeb ..........................................................61 Wprowadzanie danych ........................................................................................................61 Formuy, funkcje i nazwy ....................................................................................................61 Zaznaczanie obiektów .........................................................................................................63 Formatowanie ......................................................................................................................64 Opcje ochrony .....................................................................................................................65 Ochrona formu przed nadpisaniem ..............................................................................65 Ochrona struktury skoroszytu .......................................................................................66 Ochrona skoroszytu przy uyciu hasa ..........................................................................66 Ochrona kodu VBA przy uyciu hasa ..........................................................................67 Wykresy ..............................................................................................................................68 Ksztaty i obiekty typu SmartArt .........................................................................................68


4

Spis treci

Dostp do baz danych ..........................................................................................................69 Arkuszowe bazy danych ................................................................................................69 Zewntrzne bazy danych ...............................................................................................70 Funkcje internetowe ............................................................................................................71 Narzdzia analizy danych ....................................................................................................72 Dodatki ................................................................................................................................73 Makra i programowanie ......................................................................................................74 Zgodno formatu plików ....................................................................................................74 System pomocy Excela ........................................................................................................74

Rozdzia 3.

Wybrane zasady stosowania formu ................................................... 77 Formuy ...............................................................................................................................77 Obliczanie formu ................................................................................................................78 Odwoania do komórki lub zakresu .....................................................................................79 Dlaczego warto uywa odwoa, które nie s wzgldne? ............................................79 Notacja W1K1 ...............................................................................................................80 Odwoania do innych arkuszy lub skoroszytów ............................................................81 Zastosowanie nazw ..............................................................................................................83 Nadawanie nazw komórkom i zakresom .......................................................................83 Nadawanie nazw istniejcym odwoaniom ...................................................................83 Stosowanie nazw z operatorem przecicia ....................................................................84 Nadawanie nazw kolumnom i wierszom .......................................................................85 Obszar obowizywania nazw ........................................................................................85 Nadawanie nazw staym ................................................................................................86 Nadawanie nazw formuom ...........................................................................................87 Nadawanie nazw obiektom ...........................................................................................88 Bdy wystpujce w formuach ..........................................................................................89 Formuy tablicowe ...............................................................................................................89 Przykadowa formua tablicowa ....................................................................................90 Kalendarz oparty na formule tablicowej .......................................................................91 Zalety i wady formu tablicowych .................................................................................92 Metody zliczania i sumowania ............................................................................................93 Przykady formu zliczajcych ......................................................................................94 Przykady formu sumujcych .......................................................................................95 Inne narzdzia zliczajce ...............................................................................................95 Przetwarzanie daty i czasu ...................................................................................................96 Wprowadzanie daty i czasu ...........................................................................................96 Przetwarzanie dat sprzed roku 1900 ..............................................................................97 Tworzenie megaformu .......................................................................................................98

Rozdzia 4.

Pliki programu Excel ........................................................................... 101 Uruchamianie Excela .........................................................................................................101 Formaty plików .................................................................................................................103 Formaty plików obsugiwane w programie Excel .......................................................104 Formaty plików tekstowych ........................................................................................104 Formaty plików baz danych ........................................................................................104 Inne formaty plików ....................................................................................................105 Praca z plikami szablonów ................................................................................................106 Przegldanie dostpnych szablonów ...........................................................................108 Tworzenie szablonów ..................................................................................................109 Tworzenie szablonów skoroszytu ................................................................................110 Budowa plików programu Excel .......................................................................................111 Zagldamy do wntrza pliku .......................................................................................112 Dlaczego format pliku jest taki wany? ......................................................................115


Spis treci

5

Plik OfficeUI .....................................................................................................................116 Plik XLB ...........................................................................................................................117 Pliki dodatków ...................................................................................................................117 Ustawienia Excela w rejestrze systemu Windows .............................................................118 Rejestr systemu Windows ...........................................................................................118 Ustawienia Excela .......................................................................................................120

Cz II Rozdzia 5.

Projektowanie aplikacji w Excelu ...................................123 Czym jest aplikacja arkusza kalkulacyjnego? ................................ 125 Aplikacje arkuszy kalkulacyjnych .....................................................................................125 Projektant i uytkownik kocowy .....................................................................................126 Kim s projektanci i czym si zajmuj? ......................................................................127 Klasyfikacja uytkowników arkuszy kalkulacyjnych ..................................................128 Odbiorcy aplikacji arkusza kalkulacyjnego .................................................................129 Rozwizywanie problemów przy uyciu Excela ...............................................................129 Podstawowe kategorie arkuszy kalkulacyjnych .................................................................130 Arkusze robocze ..........................................................................................................131 Arkusze przeznaczone wycznie do uytku prywatnego ............................................131 Aplikacje jednego uytkownika ..................................................................................132 Aplikacje typu „spaghetti” ..........................................................................................132 Aplikacje narzdziowe ................................................................................................133 Dodatki zawierajce funkcje arkusza ..........................................................................133 Arkusze jednoblokowe ................................................................................................134 Modele warunkowe .....................................................................................................134 Aplikacje bazodanowe (przechowujce i udostpniajce dane) ..................................134 Aplikacje komunikujce si z bazami danych .............................................................135 Aplikacje „pod klucz” .................................................................................................135

Rozdzia 6.

Podstawy projektowania aplikacji arkusza kalkulacyjnego .......... 137 Podstawowe etapy projektowania ......................................................................................137 Okrelanie wymaga uytkownika ....................................................................................138 Planowanie aplikacji speniajcej wymagania uytkownika .............................................139 Wybieranie odpowiedniego interfejsu uytkownika ..........................................................141 Dostosowywanie Wstki do potrzeb uytkownika ....................................................144 Dostosowywanie menu podrcznego do potrzeb uytkownika ...................................144 Tworzenie klawiszy skrótu ..........................................................................................145 Tworzenie niestandardowych okien dialogowych .......................................................146 Zastosowanie formantów ActiveX w arkuszu .............................................................146 Rozpoczcie prac projektowych ..................................................................................148 Zadania realizowane z myl o kocowym uytkowniku ..................................................149 Testowanie aplikacji ....................................................................................................149 Uodpornianie aplikacji na bdy popeniane przez uytkownika ................................150 Nadawanie aplikacji przyjaznego, intuicyjnego i estetycznego wygldu ....................152 Tworzenie systemu pomocy i dokumentacji przeznaczonej dla uytkownika .............154 Dokumentowanie prac projektowych ..........................................................................155 Przekazanie aplikacji uytkownikom ..........................................................................155 Aktualizacja aplikacji (kiedy to konieczne) ................................................................156 Pozostae kwestie dotyczce projektowania ......................................................................156 Wersja Excela zainstalowana przez uytkownika .......................................................157 Wersje jzykowe .........................................................................................................157 Wydajno systemu .....................................................................................................157 Tryby karty graficznej .................................................................................................158


6

Spis treci

Cz III

Jzyk Visual Basic for Applications ................................159

Rozdzia 7.

Wprowadzenie do jzyka VBA .......................................................... 161 Podstawowe informacje o jzyku BASIC .........................................................................161 Jzyk VBA ........................................................................................................................162 Modele obiektowe .......................................................................................................162 Porównanie jzyka VBA z jzykiem XLM .................................................................162 Wprowadzenie do jzyka VBA .........................................................................................163 Edytor VBE .......................................................................................................................165 Wywietlanie karty Deweloper ...................................................................................166 Uruchamianie edytora VBE ........................................................................................167 Okna edytora VBE ......................................................................................................167 Tajemnice okna Project Explorer ......................................................................................169 Dodawanie nowego moduu VBA ...............................................................................170 Usuwanie moduu VBA ..............................................................................................171 Eksportowanie i importowanie obiektów ....................................................................171 Tajemnice okna Code ........................................................................................................171 Minimalizacja i maksymalizacja okien .......................................................................172 Przechowywanie kodu ródowego jzyka VBA ........................................................172 Wprowadzanie kodu ródowego jzyka VBA ...........................................................173 Dostosowywanie edytora Visual Basic ..............................................................................179 Karta Editor .................................................................................................................180 Karta Editor Format ....................................................................................................183 Karta General ..............................................................................................................184 Zastosowanie karty Docking .......................................................................................185 Rejestrator makr Excela ....................................................................................................185 Co waciwie zapisuje rejestrator makr? .....................................................................186 Odwoania wzgldne czy bezwzgldne? .....................................................................187 Opcje zwizane z rejestrowaniem makr ......................................................................191 Modyfikowanie zarejestrowanych makr .....................................................................191 Obiekty i kolekcje .............................................................................................................192 Hierarchia obiektów ....................................................................................................193 Kolekcje ......................................................................................................................194 Odwoywanie si do obiektów ....................................................................................195 Waciwoci i metody ........................................................................................................196 Waciwoci obiektów .................................................................................................196 Metody obiektowe .......................................................................................................197 Tajemnice obiektu Comment .............................................................................................198 Pomoc dla obiektu Comment ......................................................................................199 Waciwoci obiektu Comment ...................................................................................199 Metody obiektu Comment ...........................................................................................199 Kolekcja Comments ....................................................................................................201 Waciwo Comment .................................................................................................202 Obiekty zawarte w obiekcie Comment ........................................................................202 Sprawdzanie, czy komórka posiada komentarz ...........................................................203 Dodawanie nowego obiektu Comment ........................................................................204 Kilka przydatnych waciwoci obiektu Application .........................................................205 Tajemnice obiektów Range ...............................................................................................206 Waciwo Range ......................................................................................................207 Waciwo Cells ........................................................................................................209 Waciwo Offset ......................................................................................................210 Co naley wiedzie o obiektach? .......................................................................................212 Podstawowe zagadnienia, które naley zapamita ....................................................212 Dodatkowe informacje na temat obiektów i waciwoci ............................................213


Spis treci

Rozdzia 8.

7

Podstawy programowania w jzyku VBA ......................................... 217 Przegld elementów jzyka VBA ......................................................................................217 Komentarze .......................................................................................................................219 Zmienne, typy danych i stae .............................................................................................220 Definiowanie typów danych ........................................................................................222 Deklarowanie zmiennych ............................................................................................222 Zasig zmiennych ........................................................................................................226 Zastosowanie staych ...................................................................................................229 Praca z acuchami tekstu ...........................................................................................232 Przetwarzanie dat ........................................................................................................232 Instrukcje przypisania ........................................................................................................233 Tablice ...............................................................................................................................235 Deklarowanie tablic .....................................................................................................236 Deklarowanie tablic wielowymiarowych ....................................................................236 Deklarowanie tablic dynamicznych ............................................................................237 Zmienne obiektowe ...........................................................................................................237 Typy danych definiowane przez uytkownika ..................................................................238 Wbudowane funkcje VBA .................................................................................................239 Praca z obiektami i kolekcjami ..........................................................................................242 Konstrukcja With ... End With ....................................................................................242 Konstrukcja For Each ... Next .....................................................................................243 Sterowanie wykonywaniem procedur ................................................................................244 Polecenie GoTo ...........................................................................................................245 Konstrukcja If ... Then ................................................................................................245 Konstrukcja Select Case ..............................................................................................249 Wykonywanie bloku instrukcji w ramach ptli ...........................................................252

Rozdzia 9.

Tworzenie procedur w jzyku VBA .................................................... 261 Kilka sów o procedurach ..................................................................................................261 Deklarowanie procedury Sub ......................................................................................262 Zasig procedury .........................................................................................................263 Wykonywanie procedur Sub .............................................................................................264 Uruchamianie procedury przy uyciu polecenia Run Sub/UserForm ..........................265 Uruchamianie procedury z poziomu okna dialogowego Makro ..................................265 Uruchamianie procedury przy uyciu skrótu z klawiszem Ctrl ...................................266 Uruchamianie procedury za pomoc Wstki .............................................................267 Uruchamianie procedur za porednictwem niestandardowego menu podrcznego .....267 Wywoywanie procedury z poziomu innej procedury .................................................267 Uruchamianie procedury poprzez kliknicie obiektu ..................................................271 Wykonywanie procedury po wystpieniu okrelonego zdarzenia ...............................273 Uruchamianie procedury z poziomu okna Immediate .................................................274 Przekazywanie argumentów procedurom ..........................................................................275 Metody obsugi bdów .....................................................................................................278 Przechwytywanie bdów ............................................................................................278 Przykady kodu ródowego obsugujcego bdy ......................................................279 Praktyczny przykad wykorzystujcy procedury Sub ........................................................282 Cel ...............................................................................................................................283 Wymagania projektowe ...............................................................................................283 Co ju wiesz ................................................................................................................283 Podejcie do zagadnienia ............................................................................................284 Co musimy wiedzie? .................................................................................................285 Wstpne rejestrowanie makr .......................................................................................285 Wstpne przygotowania ..............................................................................................286 Tworzenie kodu ródowego .......................................................................................288


8

Spis treci

Tworzenie procedury sortujcej ..................................................................................289 Dodatkowe testy ..........................................................................................................292 Usuwanie problemów ..................................................................................................293 Dostpno narzdzia ..................................................................................................296 Ocena projektu ............................................................................................................296

Rozdzia 10. Tworzenie funkcji w jzyku VBA ......................................................... 299 Porównanie procedur Sub i Function .................................................................................299 Dlaczego tworzymy funkcje niestandardowe? ..................................................................300 Twoja pierwsza funkcja .....................................................................................................301 Zastosowanie funkcji w arkuszu .................................................................................301 Zastosowanie funkcji w procedurze jzyka VBA ........................................................302 Analiza funkcji niestandardowej .................................................................................302 Procedury Function ...........................................................................................................304 Zasig funkcji ..............................................................................................................306 Wywoywanie procedur Function ...............................................................................306 Argumenty funkcji ............................................................................................................310 Przykady funkcji ..............................................................................................................311 Funkcja bezargumentowa ............................................................................................311 Funkcja jednoargumentowa ........................................................................................313 Funkcje z dwoma argumentami ...................................................................................316 Funkcja pobierajca tablic jako argument .................................................................317 Funkcje z argumentami opcjonalnymi ........................................................................318 Funkcje zwracajce tablic VBA ................................................................................319 Funkcje zwracajce warto bdu ..............................................................................322 Funkcje o nieokrelonej liczbie argumentów ..............................................................323 Emulacja funkcji arkuszowej SUMA ................................................................................324 Rozszerzone funkcje daty ..................................................................................................327 Wykrywanie i usuwanie bdów w funkcjach ...................................................................329 Okno dialogowe Wstawianie funkcji .................................................................................330 Zastosowanie metody MacroOptions ..........................................................................332 Definiowanie kategorii funkcji ....................................................................................333 Dodawanie opisu funkcji .............................................................................................334 Zastosowanie dodatków do przechowywania funkcji niestandardowych ..........................335 Korzystanie z Windows API .............................................................................................336 Przykady zastosowania funkcji interfejsu API systemu Windows .............................336 Identyfikacja katalogu domowego systemu Windows ................................................337 Wykrywanie wcinicia klawisza Shift .......................................................................338 Dodatkowe informacje na temat funkcji interfejsu API ..............................................339

Rozdzia 11. Przykady i techniki programowania w jzyku VBA ........................ 341 Nauka poprzez praktyk ....................................................................................................341 Przetwarzanie zakresów ....................................................................................................342 Kopiowanie zakresów .................................................................................................342 Przenoszenie zakresów ................................................................................................344 Kopiowanie zakresu o zmiennej wielkoci ..................................................................344 Zaznaczanie oraz identyfikacja rónego typu zakresów ..............................................345 Wprowadzanie wartoci do komórki ...........................................................................346 Wprowadzanie wartoci do nastpnej pustej komórki .................................................348 Wstrzymywanie dziaania makra w celu umoliwienia pobrania zakresu wyznaczonego przez uytkownika ...........................................................................350 Zliczanie zaznaczonych komórek ................................................................................351 Okrelanie typu zaznaczonego zakresu .......................................................................352 Wydajne przetwarzanie komórek zaznaczonego zakresu przy uyciu ptli ................353


Spis treci

9

Usuwanie wszystkich pustych wierszy ........................................................................356 Powielanie wierszy ......................................................................................................357 Okrelanie, czy zakres zawiera si w innym zakresie .................................................358 Okrelanie typu danych zawartych w komórce ...........................................................359 Odczytywanie i zapisywanie zakresów .......................................................................360 Lepsza metoda zapisywania zakresu ...........................................................................361 Przenoszenie zawartoci tablic jednowymiarowych ....................................................363 Przenoszenie zawartoci zakresu do tablicy typu Variant ...........................................363 Zaznaczanie komórek na podstawie wartoci ..............................................................364 Kopiowanie niecigego zakresu komórek ..................................................................365 Przetwarzanie skoroszytów i arkuszy ................................................................................367 Zapisywanie wszystkich skoroszytów .........................................................................367 Zapisywanie i zamykanie wszystkich skoroszytów .....................................................368 Ukrywanie wszystkich komórek arkusza poza zaznaczonym zakresem .....................368 Synchronizowanie arkuszy ..........................................................................................369 Techniki programowania w jzyku VBA ..........................................................................370 Przeczanie wartoci waciwoci typu logicznego ....................................................370 Okrelanie liczby drukowanych stron .........................................................................371 Wywietlanie daty i czasu ...........................................................................................372 Pobieranie listy czcionek .............................................................................................373 Sortowanie tablicy .......................................................................................................374 Przetwarzanie grupy plików ........................................................................................376 Ciekawe funkcje, których moesz uy w swoich projektach ...........................................378 Funkcja FileExists .......................................................................................................378 Funkcja FileNameOnly ...............................................................................................378 Funkcja PathExists ......................................................................................................379 Funkcja RangeNameExists ..........................................................................................379 Funkcja SheetExists ....................................................................................................380 Funkcja WorkbookIsOpen ..........................................................................................381 Pobieranie wartoci z zamknitego skoroszytu ...........................................................381 Uyteczne, niestandardowe funkcje arkuszowe .................................................................382 Funkcje zwracajce informacje o formatowaniu komórki ...........................................382 Gadajcy arkusz? ........................................................................................................384 Wywietlanie daty zapisania lub wydrukowania pliku ................................................384 Obiekty nadrzdne ......................................................................................................385 Zliczanie komórek, których wartoci zawieraj si pomidzy dwoma wartociami ...386 Wyznaczanie ostatniej niepustej komórki kolumny lub wiersza .................................387 Czy dany acuch tekstu jest zgodny z wzorcem? .......................................................388 Wyznaczanie n-tego elementu acucha ......................................................................390 Zamiana wartoci na sowa .........................................................................................390 Funkcja wielofunkcyjna ..............................................................................................391 Funkcja SheetOffset ....................................................................................................392 Zwracanie maksymalnej wartoci ze wszystkich arkuszy ...........................................393 Zwracanie tablicy zawierajcej unikatowe, losowo uporzdkowane liczby cakowite .......................................................................................................394 Porzdkowanie zakresu w losowy sposób ...................................................................395 Wywoania funkcji interfejsu Windows API .....................................................................396 Okrelanie skojarze plików .......................................................................................397 Pobieranie informacji o napdach dyskowych ............................................................397 Pobieranie informacji dotyczcych drukarki domylnej ..............................................398 Pobieranie informacji o aktualnej rozdzielczoci karty graficznej ..............................399 Dodanie d wiku do aplikacji .....................................................................................400 Odczytywanie zawartoci rejestru systemu Windows i zapisywanie w nim danych .....402


10

Spis treci

Cz IV

Praca z formularzami UserForm ......................................405

Rozdzia 12. Tworzenie wasnych okien dialogowych .......................................... 407 Zanim rozpoczniesz tworzenie formularza UserForm .......................................................407 Okno wprowadzania danych .............................................................................................407 Funkcja InputBox jzyka VBA ...................................................................................408 Metoda InputBox Excela .............................................................................................409 Funkcja MsgBox jzyka VBA ...........................................................................................412 Metoda GetOpenFilename programu Excel ......................................................................415 Metoda GetSaveAsFilename programu Excel ...................................................................419 Okno wybierania katalogu .................................................................................................419 Wywietlanie wbudowanych okien dialogowych Excela ..................................................420 Wywietlanie formularza danych ......................................................................................421 Wywietlanie formularza wprowadzania danych ........................................................423 Wywietlanie formularza wprowadzania danych za pomoc VBA .............................424

Rozdzia 13. Wprowadzenie do formularzy UserForm ........................................... 425 Jak Excel obsuguje niestandardowe okna dialogowe .......................................................425 Wstawianie nowego formularza UserForm .......................................................................426 Dodawanie formantรณw do formularza UserForm ..............................................................426 Formanty okna Toolbox ....................................................................................................428 Formant CheckBox .....................................................................................................428 Formant ComboBox ....................................................................................................429 Formant CommandButton ...........................................................................................429 Formant Frame ............................................................................................................429 Formant Image ............................................................................................................429 Formant Label .............................................................................................................429 Formant ListBox .........................................................................................................429 Formant MultiPage ......................................................................................................430 Formant OptionButton ................................................................................................430 Formant RefEdit ..........................................................................................................430 Formant ScrollBar .......................................................................................................430 Formant SpinButton ....................................................................................................430 Formant TabStrip ........................................................................................................430 Formant TextBox ........................................................................................................431 Formant ToggleButton ................................................................................................431 Modyfikowanie formantรณw formularza UserForm ............................................................432 Modyfikowanie waciwoci formantรณw ...........................................................................432 Zastosowanie okna Properties .....................................................................................432 Wspรณlne waciwoci ..................................................................................................435 Uwzgldnienie wymaga uytkownikรณw preferujcych korzystanie z klawiatury .....435 Wywietlanie formularza UserForm ..................................................................................438 Wywietlanie niemodalnych okien formularzy UserForm ..........................................438 Wywietlanie formularza UserForm na podstawie zmiennej ......................................439

adowanie formularza UserForm ................................................................................439 Procedury obsugi zdarze ..........................................................................................439 Zamykanie formularza UserForm ......................................................................................439 Przykad tworzenia formularza UserForm .........................................................................441 Tworzenie formularza UserForm ................................................................................441 Tworzenie kodu procedury wywietlajcej okno dialogowe .......................................444 Testowanie okna dialogowego ....................................................................................444 Dodawanie procedur obsugi zdarze ..........................................................................445 Sprawdzanie poprawnoci danych ..............................................................................447 Zakoczenie tworzenia okna dialogowego ..................................................................447


Spis treci

11

Zdarzenia powizane z formularzem UserForm ................................................................447 Zdobywanie informacji na temat zdarze ....................................................................448 Zdarzenia formularza UserForm .................................................................................449 Zdarzenia zwizane z formantem SpinButton .............................................................449 Wspópraca formantu SpinButton z formantem TextBox ...........................................451 Odwoywanie si do formantów formularza UserForm .....................................................453 Dostosowywanie okna Toolbox do wasnych wymaga ...................................................454 Dodawanie nowych kart ..............................................................................................455 Dostosowywanie lub czenie formantów ...................................................................455 Dodawanie nowych formantów ActiveX ....................................................................456 Tworzenie szablonów formularzy UserForm ....................................................................457 Lista kontrolna tworzenia i testowania formularzy UserForm ...........................................458

Rozdzia 14. Przykady formularzy UserForm .......................................................... 459 Tworzenie formularza UserForm penicego funkcj menu ..............................................459 Zastosowanie w formularzu UserForm formantów CommandButton .........................460 Zastosowanie w formularzu UserForm formantu ListBox ..........................................460 Zaznaczanie zakresów przy uyciu formularza UserForm ................................................461 Tworzenie okna powitalnego .............................................................................................463 Wyczanie przycisku Zamknij formularza UserForm ......................................................465 Zmiana wielkoci formularza UserForm ...........................................................................466 Powikszanie i przewijanie arkusza przy uyciu formularza UserForm ............................468 Zastosowania formantu ListBox ........................................................................................470 Tworzenie listy elementów formantu ListBox ............................................................471 Identyfikowanie zaznaczonego elementu listy formantu ListBox ...............................475 Identyfikowanie wielu zaznaczonych elementów listy formantu ListBox ........................475 Wiele list w jednej kontrolce ListBox .........................................................................476 Przenoszenie elementów listy formantu ListBox ........................................................478 Zmiana kolejnoci elementów listy formantu ListBox ................................................479 Wielokolumnowe formanty ListBox ...........................................................................480 Zastosowanie formantu ListBox do wybierania wierszy arkusza ................................482 Uaktywnianie arkusza za pomoc formantu ListBox ..................................................484 Zastosowanie formantu MultiPage na formularzach UserForm ........................................487 Korzystanie z formantów zewntrznych ............................................................................488 Animowanie etykiet ..........................................................................................................490

Rozdzia 15. Zaawansowane techniki korzystania z formularzy UserForm ......... 493 Niemodalne okna dialogowe .............................................................................................493 Wywietlanie wska nika postpu zadania .........................................................................497 Tworzenie samodzielnego wska nika postpu zadania ...............................................498 Wywietlanie wska nika postpu zadania za pomoc formantu MultiPage ................502 Wywietlanie wska nika postpu zadania bez korzystania z kontrolki MultiPage .....504 Tworzenie kreatorów .........................................................................................................505 Konfigurowanie formantu MultiPage w celu utworzenia kreatora ..............................506 Dodawanie przycisków do formularza UserForm kreatora .........................................507 Programowanie przycisków kreatora ..........................................................................508 Zalenoci programowe w kreatorach .........................................................................509 Wykonywanie zada za pomoc kreatorów ................................................................511 Emulacja funkcji MsgBox .................................................................................................511 Emulacja funkcji MsgBox: kod funkcji MyMsgBox ..................................................512 Jak dziaa funkcja MyMsgBox ....................................................................................513 Wykorzystanie funkcji MyMsgBox do emulacji funkcji MsgBox ..............................515 Formularz UserForm z formantami, których pooenie mona zmienia ..........................515 Formularz UserForm bez paska tytuowego ......................................................................516 Symulacja paska narzdzi za pomoc formularza UserForm ............................................518


12

Spis treci

Formularze UserForm z moliwoci zmiany rozmiaru ....................................................520 Obsuga wielu przycisków formularza UserForm za pomoc jednej procedury obsugi zdarze ...............................................................................................................524 Wybór koloru za pomoc formularza UserForm ...............................................................527 Wywietlanie wykresów na formularzach UserForm ........................................................528 Zapisywanie wykresu w postaci pliku GIF .................................................................529 Modyfikacja waciwoci Picture formantu Image .....................................................530 Tworzenie póprzezroczystych formularzy UserForm .......................................................530 Zaawansowane formularze danych ....................................................................................531 Opis ulepszonego formularza danych ..........................................................................533 Instalacja dodatku — ulepszonego formularza danych ...............................................533 Puzzle na formularzu UserForm ........................................................................................535 Wideo Poker na formularzu UserForm ..............................................................................536

Cz V

Zaawansowane techniki programowania ....................537

Rozdzia 16. Tworzenie narzdzi dla Excela w jzyku VBA .................................. 539 Kilka sów o narzdziach dla programu Excel ..................................................................539 Zastosowanie jzyka VBA do tworzenia narzdzi ............................................................540 Co decyduje o przydatnoci narzdzia? .............................................................................541 Operacje tekstowe: anatomia narzdzia .............................................................................541 Kilka sów o programie Operacje tekstowe .................................................................542 Okrelenie wymaga dla narzdzia Operacje tekstowe ...............................................543 Skoroszyt narzdzia Operacje tekstowe ......................................................................543 Jak dziaa narzdzie Operacje tekstowe? .....................................................................544 Formularz UserForm dla narzdzia Operacje tekstowe ...............................................545 Modu VBA Module1 .................................................................................................546 Modu formularza UserForm1 .....................................................................................548 Poprawa wydajnoci narzdzia Operacje tekstowe .....................................................550 Zapisywanie ustawie narzdzia Operacje tekstowe ...................................................551 Implementacja procedury Cofnij .................................................................................553 Wywietlanie pliku pomocy ........................................................................................554 Umieszczanie polece na Wstce ..............................................................................556 Ocena realizacji projektu .............................................................................................556 Dziaanie narzdzia Operacje tekstowe .......................................................................558 Dodatkowe informacje na temat narzdzi Excela ..............................................................558

Rozdzia 17. Tabele przestawne .............................................................................. 559 Przykad prostej tabeli przestawnej ...................................................................................559 Tworzenie tabel przestawnych ....................................................................................560 Analiza zarejestrowanego kodu tworzenia tabeli przestawnej ....................................561 Optymalizacja wygenerowanego kodu tworzcego tabel przestawn .......................562 Tworzenie zoonych tabel przestawnych .........................................................................565 Kod tworzcy tabel przestawn .................................................................................567 Jak dziaa zoona tabela przestawna? .........................................................................568 Jednoczesne tworzenie wielu tabel przestawnych .............................................................569 Tworzenie odwróconych tabel przestawnych ....................................................................572

Rozdzia 18. Wykresy ............................................................................................... 575 Podstawowe wiadomoci o wykresach ..............................................................................575 Lokalizacja wykresu ....................................................................................................576 Rejestrator makr a wykresy .........................................................................................576 Model obiektu Chart ....................................................................................................577 Tworzenie wykresów osadzonych na arkuszu danych .......................................................578


Spis treci

13

Tworzenie wykresu na arkuszu wykresu ...........................................................................579 Wykorzystanie VBA do uaktywnienia wykresu ................................................................580 Przenoszenie wykresu .......................................................................................................582 Wykorzystanie VBA do deaktywacji wykresu ..................................................................582 Sprawdzanie, czy wykres zosta uaktywniony ...................................................................583 Usuwanie elementów z kolekcji ChartObjects lub Charts .................................................584 Przetwarzanie wszystkich wykresów w ptli .....................................................................585 Zmiana rozmiarów i wyrównywanie obiektów ChartObject .............................................587 Eksportowanie wykresów ..................................................................................................588 Eksportowanie wszystkich obiektów graficznych .......................................................589 Zmiana danych prezentowanych na wykresie ...................................................................590 Modyfikacja danych wykresu na podstawie aktywnej komórki ..................................592 Zastosowanie jzyka VBA do identyfikacji zakresu danych prezentowanych na wykresie ..............................................................................................................593 Wykorzystanie VBA do wywietlania dowolnych etykiet danych na wykresie ................596 Wywietlanie wykresu w oknie formularza UserForm ......................................................598 Zdarzenia zwizane z wykresami ......................................................................................601 Przykad wykorzystania zdarze zwizanych z wykresami ........................................601 Obsuga zdarze dla wykresów osadzonych ...............................................................604 Przykad: zastosowanie zdarze dla wykresów osadzonych .......................................606 Jak uatwi sobie prac z wykresami przy uyciu VBA? ..................................................608 Drukowanie wykresów osadzonych na arkuszu ..........................................................608 Ukrywanie serii danych poprzez ukrywanie kolumn ...................................................608 Tworzenie wykresów, które nie s poczone z danymi ..............................................610 Wykorzystanie zdarzenia MouseOver do wywietlania tekstu ....................................611 Wykresy animowane .........................................................................................................614 Przewijanie wykresów .................................................................................................615 Tworzenie wykresu krzywych hipocykloidalnych ......................................................617 Tworzenie wykresu-zegara ..........................................................................................618 Tworzenie wykresu interaktywnego bez uycia VBA .......................................................619 Przygotowanie danych do utworzenia wykresu interaktywnego .................................620 Tworzenie przycisków opcji dla interaktywnego wykresu ..........................................620 Tworzenie listy miast dla wykresu interaktywnego ....................................................621 Tworzenie zakresów danych dla wykresu interaktywnego ..........................................621 Utworzenie wykresu interaktywnego ..........................................................................623 Tworzenie wykresów przebiegu w czasie ..........................................................................623

Rozdzia 19. Obsuga zdarze ................................................................................. 627 Co powiniene wiedzie o zdarzeniach .............................................................................627 Sekwencje zdarze ......................................................................................................628 Gdzie naley umieci procedury obsugi zdarze? ....................................................628 Wyczanie obsugi zdarze ........................................................................................630 Wprowadzanie kodu procedury obsugi zdarze .........................................................631 Procedury obsugi zdarze z argumentami ..................................................................632 Zdarzenia poziomu skoroszytu ..........................................................................................634 Zdarzenie Open ...........................................................................................................634 Zdarzenie Activate ......................................................................................................636 Zdarzenie SheetActivate .............................................................................................636 Zdarzenie NewSheet ...................................................................................................636 Zdarzenie BeforeSave .................................................................................................637 Zdarzenie Deactivate ...................................................................................................637 Zdarzenie BeforePrint .................................................................................................638 Zdarzenie BeforeClose ................................................................................................639


14

Spis treci

Zdarzenia poziomu arkusza ...............................................................................................641 Zdarzenie Change ........................................................................................................641 Monitorowanie zmian w wybranym zakresie komórek ...............................................642 Zdarzenie SelectionChange .........................................................................................647 Zdarzenie BeforeDoubleClick .....................................................................................648 Zdarzenie BeforeRightClick ........................................................................................648 Zdarzenia dotyczce wykresów .........................................................................................649 Zdarzenia dotyczce aplikacji ...........................................................................................649 Wczenie obsugi zdarze poziomu aplikacji ............................................................651 Sprawdzanie, czy skoroszyt jest otwarty .....................................................................653 Monitorowanie zdarze poziomu aplikacji .................................................................654 Zdarzenia dotyczce formularzy UserForm .......................................................................655 Zdarzenia niezwizane z obiektami ...................................................................................655 Zdarzenie OnTime ......................................................................................................655 Zdarzenie OnKey ........................................................................................................658

Rozdzia 20. Interakcje z innymi aplikacjami ........................................................ 663 Uruchamianie innych aplikacji z poziomu Excela .............................................................663 Zastosowanie funkcji Shell jzyka VBA .....................................................................663 Zastosowanie funkcji ShellExecute interfejsu Windows API .....................................665 Uaktywnianie aplikacji z poziomu Excela .........................................................................667 Wykorzystanie instrukcji AppActivate .......................................................................667 Uaktywnianie aplikacji pakietu Microsoft Office .......................................................668 Uruchamianie okien dialogowych Panelu sterowania .......................................................668 Wykorzystanie automatyzacji w programie Excel .............................................................669 Dziaania z obiektami innych aplikacji z wykorzystaniem automatyzacji ...................670 Wczesne i pó ne wizanie ...........................................................................................670 Funkcja GetObject a CreateObject ..............................................................................673 Prosty przykad pó nego wizania ..............................................................................673 Sterowanie Wordem z poziomu Excela .......................................................................674 Zarzdzanie Excelem z poziomu innej aplikacji .........................................................677 Wysyanie spersonalizowanych wiadomoci e-mail z wykorzystaniem Outlooka ............678 Wysyanie wiadomoci e-mail z zacznikami z poziomu Excela .....................................682 Zastosowanie metody SendKeys .......................................................................................684

Rozdzia 21. Tworzenie i wykorzystanie dodatków ............................................... 685 Czym s dodatki? ..............................................................................................................685 Porównanie dodatku ze standardowym skoroszytem ..................................................686 Po co tworzy si dodatki? ............................................................................................687 Meneder dodatków Excela ...............................................................................................688 Tworzenie dodatków .........................................................................................................689 Przykad tworzenia dodatku ..............................................................................................690 Tworzenie opisu dla dodatku ......................................................................................691 Tworzenie dodatku ......................................................................................................692 Instalowanie dodatku ...................................................................................................693 Testowanie dodatków ..................................................................................................694 Dystrybucja dodatków .................................................................................................694 Modyfikowanie dodatku .............................................................................................695 Porównanie plików XLAM i XLSM .................................................................................695 Pliki XLAM — przynaleno do kolekcji z poziomu VBA ......................................696 Widoczno plików XLSM i XLAM ..........................................................................697 Arkusze i wykresy w plikach XLSM i XLAM ............................................................697 Dostp do procedur VBA w dodatku ..........................................................................698


Spis treci

15

Przetwarzanie dodatków za pomoc kodu VBA ................................................................701 Waciwoci obiektu AddIn ........................................................................................703 Korzystanie z dodatku jak ze skoroszytu ....................................................................706 Zdarzenia zwizane z obiektami Addin .......................................................................706 Optymalizacja wydajnoci dodatków ................................................................................707 Problemy z dodatkami .......................................................................................................708 Zapewnienie, e dodatek zosta zainstalowany ...........................................................708 Odwoywanie si do innych plików z poziomu dodatku .............................................710 Wykrywanie waciwej wersji Excela dla dodatku .....................................................710

Cz VI

Tworzenie aplikacji ..........................................................711

Rozdzia 22. Tworzenie pasków narzdzi ............................................................... 713 Wprowadzenie do pracy ze Wstk .................................................................................713 VBA i Wstka ..................................................................................................................715 Dostp do polece Wstki .........................................................................................718 Praca ze Wstk .........................................................................................................719 Aktywowanie karty .....................................................................................................721 Dostosowywanie Wstki do wasnych potrzeb ................................................................721 Prosty przykad kodu RibbonX ...................................................................................722 Prosty przykad kodu RibbonX — podejcie 2 ...........................................................725 Kolejny przykad kodu RibbonX .................................................................................730 Demo formantów Wstki ...........................................................................................732 Przykad uycia formantu DynamicMenu ...................................................................738 Wicej wskazówek dotyczcych modyfikacji Wstki ...............................................741 Tworzenie pasków narzdzi w starym stylu ......................................................................742 Ograniczenia funkcjonalnoci tradycyjnych pasków narzdzi w Excelu 2010 ...........742 Kod tworzcy pasek narzdzi ......................................................................................743

Rozdzia 23. Praca z menu podrcznym ................................................................ 747 Obiekt CommandBar .........................................................................................................747 Rodzaje obiektów CommandBar .................................................................................748 Wywietlanie menu podrcznych ................................................................................748 Odwoania do elementów kolekcji CommandBars .....................................................749 Odwoania do formantów w obiekcie CommandBar ...................................................750 Waciwoci formantów obiektu CommandBar ..........................................................751 Wywietlanie wszystkich elementów menu podrcznego ...........................................752 Wykorzystanie VBA do dostosowywania menu podrcznego ..........................................754 Resetowanie menu podrcznego .................................................................................755 Wyczanie menu podrcznego ...................................................................................755 Wyczanie wybranych elementów menu podrcznego ..............................................756 Dodawanie nowego elementu do menu podrcznego Cell ..........................................756 Dodawanie nowego podmenu do menu podrcznego .................................................758 Menu podrczne i zdarzenia ..............................................................................................761 Automatyczne tworzenie i usuwanie menu podrcznego ............................................761 Wyczanie lub ukrywanie elementów menu podrcznego .........................................762 Tworzenie kontekstowych menu podrcznych ............................................................762

Rozdzia 24. Tworzenie systemów pomocy w aplikacjach .................................. 765 Systemy pomocy w aplikacjach Excela .............................................................................765 Pomoc online ...............................................................................................................766 Systemy pomocy wykorzystujce komponenty Excela .....................................................766 Wykorzystanie komentarzy do tworzenia systemów pomocy .....................................768 Wykorzystanie pól tekstowych do wywietlania pomocy ...........................................769


16

Spis treci

Wykorzystanie arkusza do wywietlania tekstu pomocy .............................................770 Wywietlanie pomocy w oknie formularza UserForm ................................................771 Wywietlanie pomocy w oknie przegldarki sieciowej .....................................................774 Zastosowanie plików w formacie HTML ....................................................................774 Zastosowanie plików w formacie MHTML ................................................................775 Wykorzystanie systemu HTML Help ................................................................................776 Wykorzystanie metody Help do wywietlania pomocy w formacie HTML Help .......779

czenie pliku pomocy z aplikacj ....................................................................................780 Przypisanie tematów pomocy do funkcji VBA ...........................................................780

Rozdzia 25. Tworzenie aplikacji przyjaznych dla uytkownika ........................... 783 Czym jest aplikacja przyjazna dla uytkownika? ..............................................................783 Kreator amortyzacji poyczek ...........................................................................................783 Obsuga Kreatora amortyzacji poyczek .....................................................................784 Struktura skoroszytu Kreatora amortyzacji poyczek .................................................785 Jak dziaa Kreator amortyzacji poyczek? ..................................................................786 Potencjalne usprawnienia Kreatora amortyzacji poyczek ..........................................793 Wskazówki dotyczce projektowania aplikacji .................................................................793

Cz VII Inne zagadnienia .............................................................795 Rozdzia 26. Problem kompatybilnoci aplikacji .................................................. 797 Co to jest kompatybilno? ................................................................................................797 Rodzaje problemów ze zgodnoci ...................................................................................798 Unikaj uywania nowych funkcji i mechanizmów ............................................................799 Czy aplikacja bdzie dziaa na komputerach Macintosh? ................................................801 Praca z 64-bitow wersj Excela .......................................................................................802 Tworzenie aplikacji dla wielu wersji narodowych ............................................................803 Aplikacje obsugujce wiele jzyków .........................................................................805 Obsuga jzyka w kodzie VBA ...................................................................................805 Wykorzystanie waciwoci lokalnych ........................................................................806 Identyfikacja ustawie systemu ...................................................................................807 Ustawienia daty i godziny ...........................................................................................809

Rozdzia 27. Operacje na plikach wykonywane za pomoc kodu VBA ........... 811 Najczciej wykonywane operacje na plikach ...................................................................811 Zastosowanie polece jzyka VBA do wykonywania operacji na plikach ..................812 Zastosowanie obiektu FileSystemObject .....................................................................816 Wywietlanie rozszerzonych informacji o plikach ............................................................820 Operacje z plikami tekstowymi .........................................................................................821 Otwieranie plików tekstowych ....................................................................................822 Odczytywanie plików tekstowych ...............................................................................823 Zapisywanie danych do plików tekstowych ................................................................823 Przydzielanie numeru pliku .........................................................................................823 Okrelanie lub ustawianie pozycji w pliku ..................................................................824 Instrukcje pozwalajce na odczytywanie i zapisywanie plików ..................................824 Przykady wykonywania operacji na plikach ....................................................................825 Importowanie danych z pliku tekstowego ...................................................................825 Eksportowanie zakresu do pliku tekstowego ...............................................................827 Importowanie pliku tekstowego do zakresu ................................................................828 Rejestrowanie wykorzystania Excela ..........................................................................829 Filtrowanie zawartoci pliku tekstowego ....................................................................830 Eksportowanie zakresu komórek do pliku HTML ......................................................830 Eksportowanie zakresu komórek do pliku XLM .........................................................832


Spis treci

17

Pakowanie i rozpakowywanie plików ...............................................................................835 Pakowanie plików do formatu ZIP ..............................................................................836 Rozpakowywanie plików ZIP .....................................................................................838 Dziaania z obiektami danych ActiveX (ADO) .................................................................838

Rozdzia 28. Operacje na skadnikach jzyka VBA ............................................. 841 Podstawowe informacje o rodowisku IDE .......................................................................841 Model obiektowy rodowiska IDE ....................................................................................843 Kolekcja VBProjects ...................................................................................................844 Wywietlanie wszystkich skadników projektu VBA ........................................................846 Wywietlanie wszystkich procedur VBA w arkuszu .........................................................847 Zastpowanie moduu uaktualnion wersj .......................................................................848 Zastosowanie jzyka VBA do generowania kodu VBA .......................................................850 Zastosowanie VBA do umieszczenia formantów na formularzu UserForm ......................852 Operacje z formularzami UserForm w fazie projektowania i wykonania ....................852 Dodanie 100 przycisków CommandButton w fazie projektowania .............................854 Programowe tworzenie formularzy UserForm ..................................................................855 Prosty przykad formularza UserForm ........................................................................855 Uyteczny (ale ju nie tak prosty) przykad dynamicznego formularza UserForm .....857

Rozdzia 29. Moduy klas ......................................................................................... 863 Czym jest modu klasy? .....................................................................................................863 Przykad: utworzenie klasy NumLock ...............................................................................864 Wstawianie moduu klasy ...........................................................................................865 Dodawanie kodu VBA do moduu klasy .....................................................................865 Wykorzystanie klasy NumLock ..................................................................................867 Dodatkowe informacje na temat moduów klas .................................................................868 Programowanie waciwoci obiektów .......................................................................868 Programowanie metod obiektów .................................................................................870 Zdarzenia definiowane w module klasy ......................................................................871 Przykad: klasa CSVFileClass ...........................................................................................871 Zmienne poziomu moduu dla klasy CSVFileClass ....................................................872 Definicje waciwoci klasy CSVFileClass .................................................................872 Definicje metod klasy CSVFileClass ..........................................................................872 Wykorzystanie obiektów CSVFileClass .....................................................................874

Rozdzia 30. Praca z kolorami ................................................................................. 877 Definiowanie kolorów .......................................................................................................877 Model kolorów RGB ...................................................................................................878 Model kolorów HSL ....................................................................................................878 Konwersja kolorów .....................................................................................................879 Skala szaroci ....................................................................................................................880 Zamiana kolorów na skal szaroci .............................................................................883 Wywietlanie wykresów w skali szaroci ....................................................................883 Eksperymenty z kolorami ..................................................................................................885 Praca z motywami dokumentów ........................................................................................886 Kilka sów o motywach dokumentów .........................................................................886 Kolory motywów dokumentów ...................................................................................887 Wywietlanie wszystkich kolorów motywu ................................................................890 Praca z obiektami Shape ....................................................................................................893 Kolor ta ksztatu .........................................................................................................893 Ksztaty i kolory motywów .........................................................................................895 Przykady ksztatów ....................................................................................................897 Modyfikacja kolorów wykresów .......................................................................................897


18

Spis treci

Rozdzia 31. Czsto zadawane pytania na temat programowania w Excelu .... 901 FAQ — czyli czsto zadawane pytania .............................................................................901 Ogólne pytania dotyczce programu Excel .......................................................................902 Pytania dotyczce edytora Visual Basic ............................................................................908 Pytania dotyczce procedur ...............................................................................................911 Pytania dotyczce funkcji ..................................................................................................916 Pytania dotyczce obiektów, waciwoci, metod i zdarze ..............................................919 Pytania dotyczce formularzy UserForm ...........................................................................928 Pytania dotyczce dodatków .............................................................................................932 Pytania dotyczce pasków polece ....................................................................................934

Cz VIII Dodatki ..............................................................................937 Dodatek A

Zasoby online dotyczce Excela ...................................................... 939 Pomoc systemowa programu Excel ...................................................................................939 Pomoc techniczna firmy Microsoft ...................................................................................940 Opcje pomocy technicznej ..........................................................................................940 Baza wiedzy firmy Microsoft ......................................................................................940 Strona domowa programu Microsoft Excel .................................................................940 Strona domowa pakietu Microsoft Office ...................................................................940 Internetowe grupy dyskusyjne ...........................................................................................941 Dostp do grup dyskusyjnych za pomoc czytników grup dyskusyjnych ................941 Dostp do grup dyskusyjnych za pomoc przegldarki sieciowej ...............................941 Wyszukiwanie informacji w grupach dyskusyjnych ...................................................942 Strony internetowe WWW ................................................................................................943 Strona domowa Spreadsheet .......................................................................................943 Strona Daily Dose of Excel .........................................................................................944 Strona o Excelu Jona Peltiera ......................................................................................944 Pearson Software Consulting ......................................................................................944 Contextures .................................................................................................................944 Pointy Haired Dilbert ..................................................................................................944 Strony o Excelu Davida McRitchie .............................................................................945 Mr. Excel .....................................................................................................................945

Dodatek B

Instrukcje i funkcje VBA ...................................................................... 947 Wywoywanie funkcji Excela w instrukcjach VBA ..........................................................950

Dodatek C

Kody bdów VBA ............................................................................... 957

Dodatek D

Zawarto pyty CD-ROM ................................................................... 961 Skorowidz ............................................................................................. 977


Rozdzia 11. Przykady i techniki programowania w jzyku VBA W tym rozdziale: „ Zastosowanie VBA do pracy z zakresami „ Zastosowanie VBA do pracy ze skoroszytami i arkuszami „ Tworzenie wasnych funkcji i uywanie ich w formuach arkusza i procedurach VBA „ Przykady technik programowania w jzyku VBA „ Przykady zastosowania funkcji interfejsu API

Nauka poprzez praktyk Wierz, e nauka programowania odbywa si znacznie szybciej, kiedy pracujemy na konkretnych przykadach omawianych zagadnie, a Czytelnicy poprzednich wyda ksiki zdecydowanie utwierdzaj mnie w tym przekonaniu. Takie podejcie sprawdza si zwaszcza dla programistów pracujcych z jzykiem VBA. Dobrze opracowany przykad o wiele lepiej objania zagadnienie ni teoretyczny opis. W zwizku z tym zrezygnowaem z materiau referencyjnego, w którym dokadnie opisywano by wszystkie, nawet najdrobniejsze aspekty jzyka VBA, a zamiast tego przygotowaem przykady demonstrujce uyteczne, praktyczne techniki programowania przy uyciu Excela. Poprzednie rozdziay tej czci ksiki odpowiednio przygotoway Czytelników do poznawania zagadnie omawianych w tym rozdziale, natomiast w systemie pomocy programu Excel znajdziesz wszystkie informacje, które tutaj zostay pominite. W tym rozdziale zwikszy si nieco tempo i zaprezentowanych zostanie sporo przykadów rozwizujcych problemy spotykane w praktyce i pozwalajcych pogbi wiedz na temat jzyka VBA.


342

Cz III ‹ Jzyk Visual Basic for Applications

Przykady omawiane w tym rozdziale zostay podzielone na sze kategorii: „ Praca z zakresami „ Praca ze skoroszytami i arkuszami „ Techniki programowania w jzyku VBA „ Uyteczne funkcje, których warto uywa w procedurach VBA „ Uyteczne funkcje, których moesz uywa w formuach arkuszowych „ Wywoania funkcji i procedur Windows API W kolejnych rozdziaach naszej ksiki znajdziesz szereg przykadów procedur dotyczcych m.in. takich zagadnie , jak wykresy, tabele przestawne, zdarzenia, formularze UserForm i inne.

Przetwarzanie zakresów Przykady zamieszczone w tym podrozdziale demonstruj, w jaki sposób za pomoc jzyka VBA mona manipulowa zakresami arkusza. W szczególnoci znajdziesz tutaj przykady procedur, które pozwalaj na kopiowanie i przenoszenie zakresów komórek, zaznaczanie zakresów komórek, identyfikacj typów danych przechowywanych w danym zakresie komórek, wprowadzanie wartoci do komórek przez uytkownika, wyszukiwanie pierwszej pustej komórki w kolumnie, zatrzymywanie makra w celu umoliwienia uytkownikowi zaznaczenia zakresu, zliczanie komórek w zakresie, przechodzenie w ptli i przetwarzanie kolejnych komórek zakresu oraz kilka innych operacji, czsto wykonywanych na zakresach komórek arkusza.

Kopiowanie zakresów Rejestrator makr Excela jest bardzo przydatny nie tyle do generowania wydajnego, uytecznego kodu ródowego, co do „odkrywania” nazw odpowiednich obiektów, metod i waciwoci. Kod ródowy generowany przez rejestrator makr nie zawsze jest optymalny i efektywny, ale zwykle pozwala uzyska sporo przydatnych informacji. Przykadowo po zarejestrowaniu prostej operacji kopiowania i wklejania, generowanych jest pi wierszy kodu ródowego jzyka VBA: Sub Makro1() Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub

Wygenerowany kod najpierw powoduje zaznaczenie i skopiowanie komórki A1, a nastpnie, po zaznaczeniu komórki B1, procedura wykonuje operacj wklejania. Jednak w jzyku VBA nie jest konieczne zaznaczanie obiektu, który bdzie przetwarzany. O tej istotnej sprawie


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

343

Jak korzysta z przykadów zamieszczonych w tym rozdziale? Nie wszystkie przykady zamieszczone w tym rozdziale mog spenia rol samodzielnych programów, ale zawsze maj posta wykonywalnych procedur, które moesz dostosowa do wasnych potrzeb i uy w swoich aplikacjach. W trakcie lektury powiniene na bieco pracowa z komputerem i samodzielnie testowa opisywane w tym rozdziale przykady (i nie tylko). Jeszcze lepiej bdzie, jeeli bdziesz próbowa samodzielnie modyfikowa przykady i sprawdza, jaki bdzie efekt tych modyfikacji. Mog Ci zagwarantowa, e takie praktyczne dowiadczenia bd o wiele bardziej pomocne ni przeczytanie od deski do deski ksiki zawierajcej tylko teoretyczn stron programowania w jzyku VBA.

nie dowiedziaby si nigdy, gdyby wzorowa si tylko na kodzie ródowym zarejestrowanego makra, w którym w dwóch instrukcjach zostaa uyta metoda Select. Zamiast tego, moesz posuy si znacznie prostsz procedur, która nie zaznacza adnych komórek i korzysta z tego, e metoda Copy moe uy argumentu reprezentujcego miejsce docelowe kopiowanego zakresu. Sub CopyRange() Range("A1").Copy Range("B1") End Sub

W obu powyszych makrach przyjto zaoenie, e arkusz, w którym wykonywana jest operacja, jest aktywny. Aby skopiowa zakres do innego arkusza lub skoroszytu, wystarczy odpowiednio zdefiniowa odwoanie do zakresu docelowego. W poniszym przykadzie zakres jest kopiowany z arkusza Arkusz1 skoroszytu Plik1.xlsm do arkusza Arkusz2 skoroszytu Plik2.xlsm. Poniewa odwoania s w peni kwalifikowane, procedura zadziaa niezalenie od tego, który skoroszyt bdzie aktywny. Sub CopyRange2() Workbooks("Plik1.xlsm").Sheets("Arkusz1").Range("A1").Copy _ Workbooks("Plik2.xlsm").Sheets("Arkusz2").Range("A1") End Sub

Kolejna metoda wykonania tej operacji polega na zastosowaniu zmiennych obiektowych reprezentujcych zakresy, tak jak to zostao zilustrowane w kodzie poniszego przykadu: Sub CopyRange3() Dim Rng1 As Range, Rng2 As Range Set Rng1 = Workbooks("Plik1.xlsm").Sheets("Arkusz1").Range("A1") Set Rng2 = Workbooks("Plik2.xlsm").Sheets("Arkusz2").Range("A1") Rng1.Copy Rng2 End Sub

Jak si zapewne domylasz, kopiowanie nie jest ograniczone tylko do jednej komórki na raz. Przykadowo, procedura przedstawiona poniej kopiuje duy zakres komórek. Zwró uwag na fakt, e miejsce docelowe jest tutaj identyfikowane tylko przez jedn komórk — górn lew komórk wklejanego zakresu. Uycie jednej komórki dziaa dokadnie tak, jak podczas rcznego kopiowania i wklejania komórek arkusza. Sub CopyRange4() Range("A1:C800").Copy Range("D1") End Sub


344

Cz III ‹ Jzyk Visual Basic for Applications

Przenoszenie zakresów Instrukcje jzyka VBA suce do przenoszenia zakresu s bardzo podobne do instrukcji uywanych podczas kopiowania zakresów, tak jak to zostao zaprezentowane na poniszym przykadzie. Rónica polega na tym, e zamiast metody Copy uyta zostaa metoda Cut. Pamitaj, e musisz poda tylko lokalizacj górnej, lewej komórki zakresu docelowego. W przykadzie przedstawionym poniej 18 komórek (z zakresu A1:C6) przenosimy w nowy obszar, rozpoczynajcy si od adresu H1. Sub MoveRange1() Range("A1:C6").Cut Range("H1") End Sub

Kopiowanie zakresu o zmiennej wielkoci W wielu przypadkach konieczne jest skopiowanie zakresu komórek, dla którego dokadna liczba wierszy i kolumn okrelajcych jego wielko nie jest z góry znana. Przykadowo moesz dysponowa skoroszytem ledzcym tygodniow sprzeda, w którym liczba wierszy zmienia si kadego tygodnia po wprowadzeniu nowych danych. Na rysunku 11.1 pokazano bardzo czsto spotykany typ arkusza. Zawarty w nim zakres skada si z kilku wierszy, których liczba zmienia si kadego tygodnia. Poniewa nie wiesz, jaki jest adres zakresu w danej chwili, podczas pisania makra kopiujcego zakres bdziesz uwzgldni nieco dodatkowego kodu ródowego. Rysunek 11.1. Liczba wierszy zakresu danych zmienia si kadego tygodnia

Ponisze makro ilustruje sposób kopiowania zakresu komórek z arkusza Arkusz1 do arkusza Arkusz2 (poczwszy od komórki A1). Makro wykorzystuje waciwo CurrentRegion, która zwraca obiekt Range odpowiadajcy blokowi komórek otaczajcych okrelon komórk (w tym przypadku o adresie A1). Sub CopyCurrentRegion2() Range("A1").CurrentRegion.Copy Sheets("Arkusz2").Range("A1") End Sub

Zastosowanie waciwoci CurrentRegion jest równowane przejciu na kart Narzdzia gówne i wybraniu polecenia Znajd i zaznacz/Przejd do — specjalnie, znajdujcego si w grupie opcji Edycja i nastpnie zaznaczeniu opcji Biecy obszar (zamiast tego moesz równie nacisn kombinacj klawiszy Ctrl+Shift+*). Aby przekona si, jak to dziaa, podczas wykonywania tych polece powiniene zarejestrowa makro. Zazwyczaj warto waciwoci CurrentRegion reprezentuje prostoktny blok komórek otoczony przez puste wiersze i kolumny.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

345

Wskazówki dotyczce przetwarzania zakresów W trakcie przetwarzania zakresów powiniene pamita o kilku wanych kwestiach. „ W jzyku VBA, do przetwarzania zakresu nie jest konieczne jego uprzednie zanaczenie. „ Nie moesz zaznaczy zakresu, który znajduje si na nieaktywnym arkuszu, zatem, jeeli Twoja procedura zaznacza zakres, powizany z nim arkusz musi by aktywny. W celu uaktywnienia okrelonego arkusza mona uy metody Activate kolekcji Worksheets. „ Pamitaj, e rejestrator makr nie generuje zbyt wydajnego kodu ródowego. Najlepiej utworzy makro przy uyciu rejestratora, a nastpnie jego kod ródowy zmodyfikowa w celu zwikszenia efektywnoci. „ W kodzie ródowym jzyka VBA warto stosowa nazwane zakresy. Przykadowo odwoanie Range("Total") jest znacznie bardziej czytelne ni odwoanie Range("D45"). W tym drugim przypadku dodanie wiersza powyej wiersza 45. spowoduje zmian adresu komórki i w konsekwencji konieczne bdzie zmodyfikowanie makra tak, aby uywao zakresu o poprawnym adresie (D46). „ Jeeli w trakcie zaznaczania zakresów korzystasz z rejestratora makr, upewnij si, e makro rejestrowane jest przy uyciu odwoa wzgldnych. Aby to zrobi, przejd na kart Deweloper i nacinij przycisk Uyj odwoa wzgldnych, znajdujcy si w grupie opcji Kod. „ Po uruchomieniu makra przetwarzajcego kolejne komórki aktualnie zaznaczonego zakresu, uytkownik moe zaznacza cae wiersze lub kolumny. W wikszoci przypadków nie ma potrzeby przetwarzania wszystkich komórek zaznaczonego zakresu. Tworzone makro powinno definiowa podzbiór zaznaczenia zawierajcy wycznie niepuste komórki. Wicej szczegóowych informacji na ten temat znajdziesz w podrozdziale „Wydajne przetwarzanie komórek zaznaczonego zakresu przy uyciu ptli” w dalszej czci rozdziau. „ Excel pozwala zaznacza wiele obszarów jednoczenie. Na przykad moesz zaznaczy pierwszy zakres, wcisn klawisz Ctrl i zaznaczy kolejny zakres. Makro powinno dokona sprawdzenia zakresu i podj odpowiedni decyzj. Zapoznaj si z zawartoci punktu „Okrelanie typu zaznaczonego zakresu” w dalszej czci rozdziau.

Jeeli zakres komórek, który chcesz skopiowa jest tabel (zdefiniowan przy uycia polecenia Tabela, znajdujcego si nakrcie Narzdzia gówne, w grupie polece Tabele), moesz uy kodu przedstawionego poniej (który zakada, e tabela ma nazw Table1. Sub CopyTable Range("Table1[#All]").Copy Sheets("Sheet 2").Range("A1") End Sub

Zaznaczanie oraz identyfikacja rónego typu zakresów Wikszo operacji wykonywanych przez instrukcje jzyka VBA opiera si na zakresach — poprzez definiowanie zakresów lub identyfikowanie zakresów w celu wykonywania operacji na komórkach do nich nalecych. Oprócz waciwoci CurrentRegion (o której mówilimy ju wczeniej) powiniene równie pozna metod End obiektu Range. Metoda ta pobiera jeden argument okrelajcy kierunek, w którym zostanie wykonane zaznaczenie. Ponisze polecenie zaznacza zakres rozpoczynajcy si od aktywnej komórki i koczcy na ostatniej niepustej dolnej komórce: Range(ActiveCell, ActiveCell.End(xlDown)).Select


346

Cz III ย‹ Jzyk Visual Basic for Applications

Poniej zamieszczamy kolejny przykad, w ktรณrym zostaa zdefiniowana komรณrka bdca pocztkiem zakresu: Range(Range("A2"), Range("A2").End(xlDown)).Select

Jak mona si domyli, trzy pozostae stae (xlUp, xlToLeft, xlToRight) symuluj kombinacje klawiszy zaznaczajce komรณrki w innych kierunkach. Korzystajc z waciwoci ActiveCell w powizaniu z metod End, powiniene zachowa szczegรณln ostrono. Jeeli aktywna komรณrka znajduje si na ko cu zakresu lub jeeli w skad zakresu wchodzi jedna lub wicej pustych komรณrek, wyniki dziaania metody End mog by zupenie inne od oczekiwanych. Na doczonym dysku CD-ROM znajduje si skoroszyt (Zaznaczanie zakresรณw.xlsm) ilustrujcy najczciej spotykane rodzaje zaznacze zakresรณw. Po jego otwarciu, w menu podrcznym pojawi si nowe podmenu o nazwie Przykady zaznacze. Poszczegรณlne polecenia menu umoliwiaj uytkownikowi zapoznanie si z przykadami rรณnych rodzajรณw zaznacze (patrz rysunek 11.2).

Ponisze makro, o nazwie SelectCurrentRegion znajduje si w przykadowym skoroszycie i symuluje nacinicie kombinacji klawiszy Ctrl+Shift+*: Sub SelectCurrentRegion() ActiveCell.CurrentRegion.Select End Sub

Bardzo czsto zaznaczanie komรณrek jest tylko wstpem do innych operacji, na przykad formatowania. Procedur zaznaczajc komรณrki mona atwo przystosowa do tego celu. Procedura przedstawiona poniej jest prost modyfikacj makra SelectCurrentRegion, ktรณra nie zaznacza komรณrek, a jedynie formatuje zakres zdefiniowany jako biecy obszar otaczajcy aktywn komรณrk. Inne procedury znajdujce si w przykadowym skoroszycie te mog zosta przystosowane w ten sposรณb. Sub FormatCurrentRegion() ActiveCell.CurrentRegion.Font.Bold = True End Sub

Wprowadzanie wartoci do komรณrki Kolejna procedura przedstawiona poniej demonstruje, jak poprosi uytkownika o podanie wartoci i wstawi j do komรณrki A1 aktywnego arkusza: Sub GetValue1() Range("A1").Value = InputBox("Wprowad warto :") End Sub

Na rysunku 11.3 pokazano wygld okna umoliwiajcego wprowadzenie wartoci. Przedstawiona procedura moe sprawia jednak pewien problem. Jeeli uytkownik nacinie w oknie dialogowym przycisk Cancel, procedura usunie wszelkie dane ju znajdujce si w komรณrce. Ponisza zmodyfikowana wersja procedury sprawdza, czy zosta nacinity przycisk Cancel i jeeli tak, nie dokonuje zmiany zawartoci komรณrki:


Rozdzia 11. ย‹ Przykady i techniki programowania w jzyku VBA

347

Rysunek 11.2. Niestandardowe menu podrczne w tym skoroszycie ilustruje zaznaczanie zakresรณw o rรณnej wielkoci Rysunek 11.3. Funkcja InputBox pobiera warto, ktรณra zostanie umieszczona w komรณrce

Sub GetValue2() Dim UserEntry As String UserEntry = InputBox("Wprowad warto :") If UserEntry <> "" Then Range("A1").Value = UserEntry End Sub


348

Cz III ย‹ Jzyk Visual Basic for Applications

W wielu przypadkach konieczne bdzie sprawdzenie poprawnoci danych wprowadzonych przez uytkownika. Na przykad chcesz, aby uytkownik wprowadzi liczb z zakresu od 1 do 12. W poniszym przykadzie zademonstrowano jedn z metod sprawdzenia poprawnoci danych. Niepoprawna warto jest ignorowana, a okno wywietlane ponownie. Operacja jest powtarzana do momentu wprowadzenia prawidowej wartoci lub nacinicia przycisku Cancel. Sub GetValue3() Dim UserEntry As Variant Dim Msg As String Const MinVal As Integer = 1 Const MaxVal As Integer = 12 Msg = "Wprowad warto z zakresu od " & MinVal & " do " & MaxVal Do UserEntry = InputBox(Msg) If UserEntry = "" Then Exit Sub If IsNumeric(UserEntry) Then If UserEntry >= MinVal And UserEntry <= MaxVal Then Exit Do End If Msg = "Wprowadzona warto jest NIEPOPRAWNA." Msg = Msg & vbNewLine Msg = Msg & "Wprowad warto z zakresu od " & MinVal & " do " & MaxVal Loop ActiveSheet.Range("A1").Value = UserEntry End Sub

Jeeli uytkownik wprowadzi niepoprawn warto, program odpowiednio zmieni tre wywietlanego komunikatu (patrz rysunek 11.4). Rysunek 11.4. Sprawdzenie poprawnoci danych wprowadzonych przez uytkownika przy uyciu funkcji InputBox jzyka VBA Skoroszyt zawierajcy wszystkie trzy przykady (Funkcja InputBox.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Wprowadzanie wartoci do nastpnej pustej komรณrki Czsto wymagan operacj jest wprowadzenie wartoci do nastpnej pustej komรณrki kolumny lub wiersza. Ponisza procedura prosi uytkownika o podanie imienia i wartoci, a nastpnie wprowadza dane do nastpnego pustego wiersza (patrz rysunek 11.5). Sub GetData() Dim NextRow As Long Dim Entry1 As String, Entry2 As String Do 'Odszukaj nastpny pusty wiersz NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

349

Rysunek 11.5. Makro wstawiajce dane do nastpnego pustego wiersza arkusza

'

Popro o wprowadzenie danych Entry1 = InputBox("Podaj imi:") If Entry1 = "" Then Exit Sub Entry2 = InputBox("Podaj warto :") If Entry2 = "" Then Exit Sub

'

Zapisz dane w arkuszu Cells(NextRow, 1) = Entry1 Cells(NextRow, 2) = Entry2 Loop End Sub

Dla uproszczenia nasza procedura w aden sposób nie sprawdza poprawnoci wprowadzanych danych. Zwró uwag, e w procedurze nie zosta okrelony warunek zakoczenia ptli. W celu jej opuszczenia uyto instrukcji Exit Sub, która jest wykonywana po naciniciu przycisku Cancel w oknie wprowadzania danych. Skoroszyt zawierajcy oba przykady (NastpnaPustaKomórka.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Zwró uwag na instrukcj okrelajc warto zmiennej NextRow. Jeeli nie rozumiesz, w jaki sposób procedura dziaa, spróbuj rcznie wykona realizowan przez ni operacj: uaktywnij ostatni komórk w kolumnie A (co w przypadku Excela 2010 oznacza komórk o adresie A1048576), nacinij klawisz End i nastpnie nacinij klawisz (strzaka w gór). W efekcie zostanie zaznaczona ostatnia niepusta komórka kolumny A. Waciwo Row zwraca numer wiersza tej komórki. W celu uzyskania numeru kolejnego pustego wiersza (poniej) warto ta jest zwikszana o jeden. Zamiast umieszcza na „sztywno” adres ostatniej komórki wiersza A, uyta zostaa metoda Rows.Count, dziki czemu nasza procedura bdzie poprawnie dziaaa równie z poprzednimi wersjami programu Excel (w których maksymalna liczba wierszy w arkuszu jest duo mniejsza). Z tak metod zaznaczania nastpnej pustej komórki zwizany jest drobny problem. Jeeli kolumna jest zupenie pusta, jako nastpny pusty wiersz metoda wyznaczy wiersz 2. Na szczcie dodanie odpowiedniego kodu, który bdzie zapobiega takiemu zachowaniu, nie jest trudnym zadaniem.


350

Cz III ‹ Jzyk Visual Basic for Applications

Wstrzymywanie dziaania makra w celu umoliwienia pobrania zakresu wyznaczonego przez uytkownika Zdarzaj si sytuacje, w których makro musi by w pewien sposób interaktywne. Na przykad moesz utworzy makro, które wstrzymuje dziaanie, pozwalajc uytkownikowi na zaznaczenie wybranego zakresu komórek. Procedura opisana w tym punkcie demonstruje sposób wykonania zadania przy uyciu metody InputBox Excela. Nie naley myli metody InputBox Excela z funkcj jzyka VBA o takiej samej nazwie. Co prawda obie funkcje maj tak sam nazw, ale nie s takie same.

Ponisza procedura Sub demonstruje sposób zatrzymania pracy makra i umoliwienia uytkownikowi zaznaczenia zakresu komórek. Po wznowieniu dziaania procedura wstawia odpowiedni formu do wszystkich komórek zaznaczonego zakresu. Sub GetUserRange() Dim UserRange As Range Prompt = "Zaznacz wybrany zakres komórek." Title = "Wybieranie zakresu komórek" '

Wywietlanie okna dialogowego On Error Resume Next Set UserRange = Application.InputBox( _ Prompt:=Prompt, _ Title:=Title, _ Default:=ActiveCell.Address, _ Type:=8) 'Zaznaczanie zakresu komórek On Error GoTo 0

'

Czy okno dialogowe zostao anulowane? If UserRange Is Nothing Then MsgBox "Operacja anulowana." Else UserRange.Formula = "=RAND()" End If End Sub

Okno dialogowe zostao przedstawione na rysunku 11.6. Skoroszyt z tym przykadem (Zaznacz zakres.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Podanie argumentu Type o wartoci 8 ma kluczowe znaczenie dla powyszej procedury. Oprócz tego powiniene równie zwróci uwag na zastosowanie instrukcji On Error Resume Next. To polecenie powoduje, e bd, który wystpi gdy uytkownik nacinie przycisk Anuluj, bdzie ignorowany. Jeeli tak si stanie, nie zostanie zdefiniowana zmienna obiektowa UserRange. W powyszym przykadzie jest wywietlane okno zawierajce komunikat o treci Operacja anulowana. Gdy uytkownik nacinie przycisk OK, wykonywanie makra bdzie kontynuowane. Instrukcja On Error GoTo 0 przywraca standardow obsug bdów.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

351

Rysunek 11.6. Okno dialogowe uyte do wstrzymania dziaania makra

Nawiasem mówic, sprawdzanie poprawnoci zaznaczonego zakresu nie jest konieczne, poniewa zajmie si tym Excel. Pamitaj, podczas uywania metody InputBox do zaznaczania zakresu komórek odwieanie ekranu powinno by zawsze wczone. W przeciwnym wypadku nie bdziesz w stanie zaznaczy zakresu komórek. Do sterowania odwieaniem ekranu w trakcie wykonywania makra powiniene uy waciwoci ScreenUpdating obiektu Application.

Zliczanie zaznaczonych komórek Mona stworzy makro przetwarzajce zaznaczone komórki zakresu. Aby okreli liczb komórek w zaznaczonym zakresie (lub dowolnym innym), naley uy waciwoci Count obiektu Range. Przykadowo ponisza instrukcja wywietla w oknie komunikatu liczb aktualnie zaznaczonych komórek: MsgBox Selection.Count

Jeeli aktywny arkusz zawiera zakres o nazwie dane, polecenie przedstawione poniej przypisze liczb jego komórek zmiennej CellCount: CellCount = Range("dane").Count

Moesz równie okreli liczb wierszy lub kolumn w zakresie. Ponisze wyraenie wyznacza liczb kolumn znajdujcych si w aktualnie zaznaczonym zakresie: Selection.Columns.Count


352

Cz III ‹ Jzyk Visual Basic for Applications

Ze wzgldu na fakt, e w najnowszych wersjach Excela (2007 i 2010) maksymalne rozmiary arkusza zostay znaczco powikszone, waciwo Count moe w pewnych sytuacjach generowa bd. Waciwo Count wykorzystuje dane typu Long, zatem najwiksza warto, jak ta waciwo moe przechowywa, to 2 147 483 647, std jeeli uytkownik zaznaczy na przykad 2048 penych kolumn (czyli 2 147 483 648 komórek), waciwo Count wygeneruje bd. Na szczcie firma Microsoft dodaa w Excelu, poczwszy od wersji 2007, now waciwo: CountLarge. Waciwo ta uywa danych typu Double, które pozwalaj na przechowywanie liczb z zakresu do 1,79+E308. Wnioski? W przytaczajcej wikszoci przypadków waciwo Count bdzie dziaaa najzupeniej poprawnie. Jeeli jednak zakadasz, e bdziesz zlicza arkusze zawierajce naprawd due iloci komórek (na przykad wszystkie komórki arkusza), to zamiast waciwoci Count powiniene uy waciwoci CountLarge.

Oczywicie liczb wierszy zakresu mona równie okreli przy uyciu waciwoci Rows. Ponisza instrukcja okrela liczb wierszy zakresu o nazwie dane i przypisuje warto zmiennej RowCount: RowCount = Range("dane").Rows.Count

Okrelanie typu zaznaczonego zakresu Excel obsuguje kilka typów zaznacze zakresów. Oto one: „ pojedyncza komórka, „ cigy zakres komórek, „ jedna lub wicej kolumn, „ jeden lub wicej wierszy, „ cay arkusz, „ dowolna kombinacja wyej wymienionych typów, czyli zaznaczenie wielokrotne.

Poniewa istnieje kilka typów zaznacze, w trakcie przetwarzania zakresu procedura jzyka VBA nie moe przewidzie, jaki jest typ zaznaczenia. Na przykad zaznaczony obszar moe skada si z dwóch zakresów komórek, A1:A10 i C1:C10 (aby utworzy zaznaczenie wielokrotne, podczas zaznaczania kolejnych zakresów trzymaj wcinity klawisz Ctrl). Jeeli zakres zosta zdefiniowany przez wiele zaznacze, obiekt Range bdzie si skada z oddzielnych obszarów. Aby stwierdzi, czy zaznaczenie jest zaznaczeniem wielokrotnym, naley uy metody Areas zwracajcej kolekcj Areas. Kolekcja reprezentuje wszystkie obszary wchodzce w skad zakresu stworzonego poprzez zaznaczenie wielokrotne. W celu stwierdzenia, czy wybrany zakres posiada wiele obszarów, naley zastosowa wyraenie podobne do poniszego: NumAreas = Selection.Areas.Count

Jeeli zmienna NumAreas zawiera warto wiksz od 1, zaznaczenie jest zaznaczeniem wielokrotnym.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

353

Poniej zamieszczono kod funkcji o nazwie AreaType, która zwraca acuch tekstu opisujcy rodzaj zaznaczenia. Function AreaType(RangeArea As Range) As String ' Funkcja okrela rodzaj zaznaczonego obszaru Select Case True Case RangeArea.Cells.CountLarge = 1 AreaType = "Komórka" Case RangeArea.CountLarge = Cells.CountLarge AreaType = "Arkusz" Case RangeArea.Rows.Count = Cells.Rows.Count AreaType = "Kolumna" Case RangeArea.Columns.Count = Cells.Columns.Count AreaType = "Wiersz" Case Else AreaType = "Blok" End Select End Function

Funkcja jako argument pobiera obiekt Range i zwraca jeden z piciu acuchów opisujcych obszar — Komórka, Arkusz, Kolumna, Wiersz lub Blok. W celu okrelenia, które z piciu wyrae porównujcych ma warto True, funkcja korzysta z konstrukcji Select Case. Na przykad: jeeli zakres skada si z jednej komórki, funkcja zwróci acuch Komórka. Jeeli liczba komórek zakresu jest równa liczbie komórek arkusza, funkcja zwróci acuch Arkusz. Jeeli liczba wierszy zakresu jest równa liczbie wierszy arkusza, funkcja zwróci acuch Kolumna. Jeeli liczba kolumn zakresu jest równa liczbie kolumn arkusza, funkcja zwróci acuch Wiersz. Jeeli adne wyraenie instrukcji Case nie bdzie miao wartoci True, funkcja zwróci acuch Blok. Zauwa, e do liczenia komórek uyta zostaa waciwo CountLarge, poniewa — jak ju wspominalimy wczeniej — cakowita liczba zaznaczonych komórek w arkuszu moe teoretycznie przekroczy limit typu danych waciwoci Count. Skoroszyt Zaznaczanie.xlsm znajdujcy si na doczonym dysku CD-ROM zawiera procedur RangeDescription, która posuguje si funkcj AreaType w celu wywietlenia okna komunikatu opisujcego typ zaznaczenia aktualnego zakresu. Na rysunku 11.7 pokazano przykad jej dziaania. Zrozumienie zasad dziaania funkcji bdzie stanowio dobre przygotowanie do wykonywania kolejnych operacji na obiektach klasy Range. Excel pozwala na wykonanie wielu identycznych zaznacze . Na przykad, jeeli trzymajc wcinity klawisz Ctrl, piciokrotnie klikniesz komórk A1, zaznaczenie bdzie zoone z piciu identycznych obszarów. Procedura RangeDescription uwzgldnia taka sytuacj i nie zlicza wielokrotnie tych samych komórek.

Wydajne przetwarzanie komórek zaznaczonego zakresu przy uyciu ptli Jednym z czciej wykonywanych przez makra zada jest sprawdzanie poszczególnych komórek zakresu i wykonywanie okrelonych operacji, jeeli komórka spenia zadane kryterium. Kolejna procedura, której kod przedstawiamy poniej, jest wanie przykadem takiego makra. Procedura ColorNegaitve ustawia czerwony kolor ta dla wszystkich komórek zaznaczenia, które przechowuj warto ujemn. Kolor ta pozostaych komórek jest zerowany.


354

Cz III ‹ Jzyk Visual Basic for Applications

Rysunek 11.7. Procedura AboutRangeSelection analizuje aktualnie zaznaczony zakres Poniszy przykad zosta opracowany tylko i wycznie w celach edukacyjnych. W zastosowaniach praktycznych o wiele lepszym rozwizaniem bdzie po prostu uycie mechanizmu formatowania warunkowego. Sub ColorNegative() ' Jeeli warto jest ujemna, zmienia kolor ta komórki na czerwony Dim cell As Range If TypeName(Selection) <> "Range" Then Exit Sub Application.ScreenUpdating = False For Each cell In Selection If cell.Value < 0 Then cell.Interior.ColorIndex = RGB(255, 0, 0) Else cell.Interior.ColorIndex = xlNone End If Next cell End Sub

Z pewnoci procedura ColorNegative zadziaa, ale zawiera powany bd. Dla przykadu: co si stanie, jeeli obszar danych na arkuszu jest bardzo may, a uytkownik zaznaczy na przykad ca kolumn? Albo 10 kolumn? Albo moe nawet cay arkusz? Jak si zapewne sam domylasz, nie ma adnej potrzeby sprawdzania wszystkich pustych, nieuywanych komórek arkusza, nie mówic ju o tym, e przy duych zaznaczonych obszarach uytkownik z pewnoci poddaby si, zanim caa procedura dobiegaby do koca. Lepszym rozwizaniem jest procedura ColorNegative2, której kod przedstawiamy poniej. W tej poprawionej wersji utworzylimy zmienn obiektow WorkRange, której zawarto odpowiada czci wspólnej zaznaczonego obszaru i uytego obszaru arkusza. Przykadow sytuacj ilustruje rysunek 11.8. Jak wida, zaznaczona jest caa kolumna D (czyli 1 048 576 komórek), ale uyty zakres komórek sprowadza si ju tylko do obszaru B2:I18. Zatem przeciciem tych dwóch obszarów jest zakres D2:D18, co jest zdecydowanie mniejszym zakresem ni pocztkowe zaznaczenie. Rónica pomidzy czasem przetwarzania 15 komórek a 1 048 576 komórek bdzie naprawd znaczca.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

355

Rysunek 11.8. Zastosowanie przecicia zaznaczonego zakresu i uytego obszaru arkusza skutkuje znaczcym zmniejszeniem liczby komórek, które bdziemy musieli przetwarza

Sub ColorNegative2() ' Jeeli warto jest ujemna, zmienia kolor ta komórki na czerwony Dim WorkRange As Range Dim cell As Range If TypeName(Selection) <> "Range" Then Exit Sub Application.ScreenUpdating = False Set WorkRange = Application.Intersect(Selection, _ ActiveSheet.UsedRange) For Each cell In WorkRange If cell.Value < 0 Then cell.Interior.Color = RGB(255, 0, 0) Else cell.Interior.Color = xlNone End If Next cell End Sub

Procedura ColorNegative2 jest znacznie lepsza, ale mimo to nadal nie jest tak wydajna, jak by powinna, a to z prostego powodu — nadal niepotrzebnie przetwarza puste komórki. Trzecia wersja naszej procedury, ColorNegative3, jest nieco dusza, ale jednoczenie o wiele bardziej wydajna. W celu wygenerowania dwóch podzbiorów zaznaczenia uyem metody SpecialCells. Pierwszy podzbiór obejmuje jedynie komórki zawierajce stae numeryczne (ConstantCells), natomiast drugi — komórki przechowujce formuy numeryczne (FormulaCells). Komórki obu podzbiorów s nastpnie przetwarzane za pomoc dwóch konstrukcji For Each ... Next. W efekcie przetwarzane s tylko niepuste komórki zawierajce wartoci numeryczne, dziki czemu uzyskujemy znaczce zwikszenie szybkoci dziaania makra. Sub ColorNegative3() ' Jeeli warto jest ujemna, zmienia kolor ta komórki na czerwony Dim FormulaCells As Range, ConstantCells As Range Dim cell As Range If TypeName(Selection) <> "Range" Then Exit Sub


356

Cz III ย‹ Jzyk Visual Basic for Applications

Application.ScreenUpdating = False '

Tworzy podzbiory oryginalnego obszaru zaznaczenia On Error Resume Next Set FormulaCells = Selection.SpecialCells(xlFormulas, xlNumbers) Set ConstantCells = Selection.SpecialCells(xlConstants, xlNumbers) On Error GoTo 0 ' Przetwarzanie komรณrek zawierajcych formuy If Not FormulaCells Is Nothing Then For Each cell In FormulaCells If cell.Value < 0 Then cell.Interior.Color = RGB(255, 0, 0) Else cell.Interior.Color = xlNone End If Next cell End If ' Przetwarzanie komรณrek zawierajcych stae wartoci numeryczne If Not ConstantCells Is Nothing Then For Each cell In ConstantCells If cell.Value < 0 Then cell.Interior.Color = RGB(255, 0, 0) Else cell.Interior.Color = xlNone End If Next cell End If End Sub

Zastosowanie instrukcji On Error jest konieczne, poniewa metoda SpecialCells generuje bd, gdy adna komรณrka nie spenia kryterium. Skoroszyt z tymi przykadami (Tworzenie wydajnych ptli.xlsm), zawierajcy trzy wersje procedury ColorNegative, znajdziesz na pycie CD-ROM doczonej do ksiki.

Usuwanie wszystkich pustych wierszy Ponisza procedura usuwa puste wiersze aktywnego arkusza. Procedura jest szybka i wydajna, poniewa nie sprawdza wszystkich wierszy, a jedynie wiersze uywane przez zakres, ktรณry jest identyfikowany za pomoc waciwoci UsedRange obiektu Worksheet. Sub DeleteEmptyRows() Dim LastRow As Long Dim r As Long Dim Counter As Long Application.ScreenUpdating = False LastRow = ActiveSheet.UsedRange.Rows.Count + _ ActiveSheet.UsedRange.Rows(1).Row - 1 For r = LastRow To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(r)) = 0 Then Rows(r).Delete Counter = Counter + 1 End If Next r


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

357

Application.ScreenUpdating = True MsgBox Counter & " pustych wierszy zostao usunitych." End Sub

Pierwszym krokiem jest okrelenie ostatnio uywanego wiersza, a nastpnie przypisanie jego numeru zmiennej LastRow. Nie jest to takie proste, jak mogoby si wydawa, poniewa uywany zakres moe, ale nie musi rozpoczyna si od wiersza 1. A zatem warto zmiennej LastRow jest obliczana poprzez okrelenie liczby wierszy uywanego zakresu, dodanie numeru pierwszego wiersza zakresu i odjcie jedynki. W celu stwierdzenia, czy wiersz jest pusty, procedura korzysta z funkcji arkuszowej COUNTA (ILE.NIEPUSTYCH) Excela. Jeeli dla okrelonego wiersza funkcja zwróci warto 0, oznacza to, e jest pusty. Procedura przetwarza wiersze od dou do góry, a ponadto w ptli For ... Next uywa ujemnej wartoci skoku (Step). Jest to niezbdne, poniewa operacja usuwania wierszy powoduje, e wszystkie kolejne wiersze s przesuwane w gór arkusza. Jeeli ptla przetwarzaaby wiersze od góry do dou, jej licznik po usuniciu wiersza nie miaby waciwej wartoci. Makro wykorzystuje równie inn zmienn, Counter, do ledzenia liczby usunitych wierszy. Liczba ta jest wywietlana w oknie dialogowym, kiedy procedura koczy dziaanie. Skoroszyt z tym przykadem (Usu puste wiersze.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Powielanie wierszy Przykad, który omówimy w tym podrozdziale, ilustruje sposób wykorzystania VBA do tworzenia duplikatów istniejcych wierszy. Na rysunku 11.9 przedstawiono wygld skoroszytu zawierajcego informacje o loterii biurowej. Kolumna A przechowuje imiona graczy, kolumna B liczb losów zakupionych przez poszczególne osoby, a w kolumnie C znajduje si liczba losowa (wygenerowana przy uyciu funkcji RAND). Zwycizca zostanie wyoniony przez sortowanie danych w kolumnie C (wygrywa osoba, do której zostaa przypisana najwiksza liczba losowa). Rysunek 11.9. Zadanie polega na powieleniu istniejcych wierszy w oparciu o wartoci z kolumny B


358

Cz III ‹ Jzyk Visual Basic for Applications

Nasze zadanie polega na powieleniu istniejcych wierszy dla poszczególnych osób, tak aby kada z nich miaa tyle osobnych wierszy, ile zakupia losów. Na przykad Barbara kupia 2 losy, a zatem powinnimy dla niej utworzy 2 osobne wiersze. Kod procedury realizujcej takie zadanie zosta zamieszczony poniej: Sub DupeRows() Dim cell As Range ' Pierwsza komórka z liczb losów Set cell = Range("B2") Do While Not IsEmpty(cell) If cell > 1 Then Range(cell.Offset(1, 0), cell.Offset(cell.Value - 1, _ 0)).EntireRow.Insert Range(cell, cell.Offset(cell.Value - 1, 1)).EntireRow.FillDown End If Set cell = cell.Offset(cell.Value, 0) Loop End Sub

Zmiennej obiektowej cell zostaje przypisana warto reprezentujca komórk B2, czyli pierwsz komórk, w której przechowywana jest liczba zakupionych losów. Ptla wstawia nowy wiersz i nastpnie kopiuje go odpowiedni ilo razy przy uyciu metody FillDown. Zmienna cell jest inkrementowana tak, aby wskazywaa na liczb losów zakupionych przez kolejn osob i procedura kontynuuje dziaanie a do momentu napotkania pierwszej pustej komórki. Na rysunku 11.10 przedstawiono wygld arkusza po zakoczeniu dziaania procedury. Skoroszyt z tym przykadem (Powielanie wierszy.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Okrelanie, czy zakres zawiera si w innym zakresie Ponisza funkcja InRange pobiera dwa argumenty (obiekty klasy Range) i zwraca warto True, jeeli pierwszy zakres zawiera si w drugim: Function InRange(rng1, rng2) As Boolean ' Zwraca warto True, jeeli rng1 jest podzbiorem rng2 InRange = False If rng1.Parent.Parent.Name = rng2.Parent.Parent.Name Then If rng1.Parent.Name = rng2.Parent.Name Then If Union(rng1, rng2).Address = rng2.Address Then InRange = True End If End If End If End Function

Kod funkcji InRange moe si wydawa do zoony, poniewa program musi sprawdzi, czy dwa zakresy znajduj si w tym samym arkuszu i skoroszycie. Procedura posuguje si waciwoci Parent zwracajc kontener obiektu. Przykadowo ponisze wyraenie zwraca nazw arkusza bdcego kontenerem obiektu rng1, do którego jest wykonywane odwoanie: rng1.Parent.Name


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

359

Rysunek 11.10. Procedura dodaa do arkusza nowe wiersze w oparciu o wartoci w kolumnie B

Kolejne wyraenie zwraca nazw skoroszytu obiektu rng1: rng1.Parent.Parent.Name

Funkcja Union jzyka VBA zwraca obiekt klasy Range reprezentujcy sum dwóch obiektów Range. Zakres sumy obejmuje wspólne komórki dwóch zakresów. Jeeli adres sumy dwóch zakresów jest taki sam jak adres drugiego zakresu, oznacza to, e pierwszy zakres zawiera si w drugim. Skoroszyt z tym przykadem (Funkcja InRange.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Okrelanie typu danych zawartych w komórce Excel oferuje kilka wbudowanych funkcji arkuszowych, które pomagaj w okrelaniu typu danych zawartych w komórce. Naley do nich zaliczy funkcje CZY.TEKST, CZY.LOGICZNA i CZY.BD. Dodatkowo jzyk VBA zawiera funkcje IsEmpty, IsDate i IsNumeric.


360

Cz III ‹ Jzyk Visual Basic for Applications

Zamieszczona poniej funkcja CellType akceptuje argument Range i zwraca acuch (Pusta, Tekst, Logiczny, B d, Data, Czas lub Liczba) opisujcy typ danych zawartych w górnej lewej komórce zakresu. Funkcja moe zosta uyta w formule arkusza lub wywoana z innej procedury jzyka VBA. Function CellType(Rng) ' Zwraca typ górnej lewej komórki zakresu Dim TheCell As Range Set TheCell = Rng.Range("A1") Select Case True Case IsEmpty(TheCell) CellType = "Pusta" Case Application.IsText(TheCell) CellType = "Tekst" Case Application.IsLogical(TheCell) CellType = "Logiczny" Case Application.IsErr(TheCell) CellType = "B d" Case IsDate(TheCell) CellType = "Data" Case InStr(1, TheCell.Text, ":") <> 0 CellType = "Czas" Case IsNumeric(TheCell) CellType = "Liczba" End Select End Function

Zwró uwag na uycie polecenia Set TheCell. Funkcja CellType akceptuje argument Range dowolnej wielkoci, ale ta instrukcja powoduje, e funkcja przetwarza tylko górn lew komórk zakresu reprezentowanego przez zmienn TheCell. Skoroszyt z tym przykadem (Funkcja CellType.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Odczytywanie i zapisywanie zakresów Wiele operacji wykonywanych w arkuszach kalkulacyjnych wymaga przenoszenia wartoci z tablicy do zakresu lub z zakresu do tablicy. Z jakiego powodu Excel o wiele szybciej odczytuje dane z zakresu, ni je w nim zapisuje. Procedura WriteReadRange, której kod przedstawiamy poniej, demonstruje porównanie wzgldnych szybkoci wykonywania operacji zapisu i odczytu zakresu. Procedura tworzy tablic, a nastpnie za pomoc ptli For ... Next zapisuje jej zawarto w zakresie i ponownie wczytuje j do tablicy. Przy uyciu funkcji Timer jzyka VBA oblicza czas wymagany do wykonania kadej operacji. Sub WriteReadRange() Dim MyArray() Dim Time1 As Double Dim NumElements As Long, i As Long Dim WriteTime As String, ReadTime As String Dim Msg As String


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

361

NumElements = 60000 ReDim MyArray(1 To NumElements) '

Wypenienie tablicy For i = 1 To NumElements MyArray(i) = i Next i

'

Zapis danych z tablicy do zakresu Time1 = Timer For i = 1 To NumElements Cells(i, 1) = MyArray(i) Next i WriteTime = Format(Timer - Time1, "00:00")

'

Odczytanie danych z zakresu i zaadowanie do tablicy Time1 = Timer For i = 1 To NumElements MyArray(i) = Cells(i, 1) Next i ReadTime = Format(Timer - Time1, "00:00")

'

Wywietlenie wyników Msg = "Czas zapisu: " & WriteTime Msg = Msg & vbCrLf Msg = Msg & "Czas odczytu: " & ReadTime MsgBox Msg, vbOKOnly, NumElements & " elementów" End Sub

Na moim komputerze przepisanie tablicy liczcej 60 000 elementów do zakresu komórek zajo 58 sekund, natomiast wczytanie zakresu komórek do tablicy tylko 1 sekund.

Lepsza metoda zapisywania zakresu W poprzednim przykadzie, aby przenie zawarto tablicy do zakresu arkusza, uyto ptli For ... Next. W tym podrozdziale zademonstrujemy wydajniejsz metod osignicia tego samego celu. Kod procedury przedstawiony poniej ilustruje najbardziej oczywisty (ale niestety nie najwydajniejszy) sposób wypeniania zakresu danymi. Do umieszczenia danych w zakresie ponownie zostaa uyta ptla For ... Next. Sub LoopFillRange() ' Wypenia zakres przy uyciu ptli przetwarzajcej komórki Dim CellsDown As Long, CellsAcross As Integer Dim CurrRow As Long, CurrCol As Integer Dim StartTime As Double Dim CurrVal As Long '

Pobranie wymiarów CellsDown = Val(InputBox("Ile komórek w pionie?")) If CellsDown = 0 Then Exit Sub CellsAcross = Val(InputBox("Ile komórek w poziomie?")) If CellsAcross = 0 Then Exit Sub


362

Cz III ‹ Jzyk Visual Basic for Applications

'

Zarejestrowanie czasu rozpoczcia StartTime = Timer

'

Przy uyciu ptli przetwarza komórki i wstawia wartoci CurrVal = 1 Application.ScreenUpdating = False For CurrRow = 1 To CellsDown For CurrCol = 1 To CellsAcross ActiveCell.Offset(CurrRow - 1, _ CurrCol - 1).Value = CurrVal CurrVal = CurrVal + 1 Next CurrCol Next CurrRow

'

Wywietla czas trwania operacji Application.ScreenUpdating = True MsgBox Format(Timer - StartTime, "00.00") & " sekund" End Sub

Kolejny przykad demonstruje o wiele szybsz metod pozwalajc na uzyskanie tego samego efektu. Procedura wstawia do tablicy poszczególne wartoci, a nastpnie za pomoc jednej instrukcji przenosi zawarto tablicy do zakresu. Sub ArrayFillRange() ' Wypenienie zakresu poprzez transfer tablicy Dim CellsDown As Long, CellsAcross As Integer Dim i As Long, j As Integer Dim StartTime As Double Dim TempArray() As Long Dim TheRange As Range Dim CurrVal As Long ' Pobranie wymiarów CellsDown = Val(InputBox("Ile komórek w pionie?")) If CellsDown = 0 Then Exit Sub CellsAcross = Val(InputBox("Ile komórek w poziomie?")) If CellsAcross = 0 Then Exit Sub ' Zarejestrowanie czasu rozpoczcia StartTime = Timer ' Przeskalowanie wymiarów tablicy tymczasowej ReDim TempArray(1 To CellsDown, 1 To CellsAcross) ' Zdefiniowanie zakresu w arkuszu Set TheRange = ActiveCell.Range(Cells(1, 1), _ Cells(CellsDown, CellsAcross)) ' Wypenienie tablicy tymczasowej CurrVal = 0 Application.ScreenUpdating = False For i = 1 To CellsDown For j = 1 To CellsAcross TempArray(i, j) = CurrVal + 1 CurrVal = CurrVal + 1 Next j Next i ' Transfer tablicy tymczasowej do arkusza TheRange.Value = TempArray ' Wywietlanie czas trwania operacji Application.ScreenUpdating = True MsgBox Format(Timer - StartTime, "00.00") & " sekund" End Sub


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

363

W moim systemie wypenienie zakresu o wymiarach 1000u250 komórek (250 000 komórek) przy uyciu ptli zajo 10,05 sekundy. Metoda oparta na transferze zawartoci tablicy do uzyskania identycznego efektu potrzebowaa zaledwie 0,18 sekundy, czyli dziaaa okoo 50 razy szybciej! Jaki wniosek wynika z tego przykadu? Jeeli chcesz przenie do arkusza du ilo danych, wszdzie, gdzie tylko jest to moliwe, unikaj stosowania ptli. Osignite czasy w duej mierze zale od obecnoci w arkuszu innych formu. W praktyce lepsze czasy otrzymasz w sytuacji, kiedy podczas testu nie bd otwarte inne skoroszyty zawierajce makra lub kiedy przeczysz Excela w tryb rcznego przeliczania arkusza. Na pycie CD-ROM doczonej do ksiki znajdziesz skoroszyt Wypenianie zakresu przy uyciu ptli i tablicy.xlsm, zawierajcy procedury WriteReadRange, LoopFillRange oraz ArrayFillRange.

Przenoszenie zawartoci tablic jednowymiarowych W poprzednim przykadzie zastosowano tablic dwuwymiarow, dobrze sprawdzajc si w arkuszach, w których dane przechowywane s w uporzdkowanej strukturze wierszy i kolumn. Aby przenie zawarto tablicy jednowymiarowej, zakres musi mie orientacj poziom — czyli inaczej mówic, posiada jeden wiersz z wieloma kolumnami. Jeeli jednak musisz uy zakresu pionowego, najpierw bdziesz musia dokona transponowania tablicy z poziomej na pionow. Aby to zrobi, moesz uy funkcji arkuszowej TRANSPOSE (TRANSPONUJ) Excela. Ponisze polecenie przenosi tablic liczc 100 elementów do pionowego zakresu arkusza (A1:A100): Range("A1:A100").Value = Application.WorksheetFunction.Transpose(MyArray)

Funkcja arkuszowa TRANSPONUJ nie bdzie dziaaa z tablicami, w których przechowywanych jest wicej ni 65 536 elementów.

Przenoszenie zawartoci zakresu do tablicy typu Variant W tym podrozdziale omówimy kolejn metod przetwarzania zawartoci arkusza przy uyciu jzyka VBA. W poniszym przykadzie zawarto zakresu komórek jest przenoszona do dwuwymiarowej tablicy typu Variant. Nastpnie w oknach komunikatów s wywietlane górne granice kadego wymiaru tablicy. Sub RangeToVariant() Dim x As Variant x = Range("A1:L600").Value MsgBox UBound(x, 1) MsgBox UBound(x, 2) End Sub

W pierwszym oknie komunikatu jest wywietlana warto 600 (liczba wierszy oryginalnego zakresu), natomiast w drugim — 12 (liczba kolumn). Jak sam si przekonasz, przeniesienie zawartoci zakresu do tablicy typu Variant odbywa si prawie natychmiast.


364

Cz III ‹ Jzyk Visual Basic for Applications

Ponisza procedura wczytuje zawarto zakresu o nazwie data do tablicy typu Variant, wykonuje na poszczególnych elementach tablicy prost operacj mnoenia, a nastpnie ponownie przenosi dane zapisane w tablicy do zakresu. Sub RangeToVariant2() Dim x As Variant Dim r As Long, c As Integer ' Wczytanie danych do tablicy typu Variant x = Range("data").Value '

Wykonanie ptli dla tablicy typu Variant For r = 1 To UBound(x, 1) For c = 1 To UBound(x, 2) ' Mnoenie kolejnych elementów tablicy przez 2 x(r, c) = x(r, c) * 2 Next c Next r ' Ponowne przeniesienie zawartoci tablicy typu Variant do arkusza Range("data") = x End Sub

Jak sam si moesz przekona, caa procedura dziaa naprawd szybko. Przetwarzanie 30 000 komórek na moim komputerze trwao poniej jednej sekundy. Skoroszyt z tym przykadem (Przenoszenie tablicy typu Variant.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Zaznaczanie komórek na podstawie wartoci Nasz kolejny przykad ilustruje, w jaki sposób mona zaznacza wybrane komórki w oparciu o ich wartoci. Co ciekawe, Excel nie posiada swojego wasnego mechanizmu, który umoliwiaby bezporednie wykonanie takiej operacji. Poniej przedstawiamy kod procedury SelectByValue, której zadaniem jest zaznaczenie komórek zakresu zawierajcych wartoci ujemne, aczkolwiek mona to w atwy sposób zmodyfikowa i dopasowa do wasnych potrzeb. Sub SelectByValue() Dim Cell As Object Dim FoundCells As Range Dim WorkRange As Range If TypeName(Selection) <> "Range" Then Exit Sub '

Sprawdzamy wszystko czy tylko zaznaczenie If Selection.CountLarge = 1 Then Set WorkRange = ActiveSheet.UsedRange Else Set WorkRange = Application.Intersect(Selection, ActiveSheet.UsedRange) End If

'

Zredukuj liczb przetwarzanych komórek do komórek zawierajcych wartoci numeryczne On Error Resume Next Set WorkRange = WorkRange.SpecialCells(xlConstants, xlNumbers)


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

365

If WorkRange Is Nothing Then Exit Sub On Error GoTo 0 '

Sprawdzaj w ptli kolejne komórki i dodawaj do zakresu FoundCells, jeeli speniaj kryterium For Each Cell In WorkRange If Cell.Value < 0 Then If FoundCells Is Nothing Then Set FoundCells = Cell Else Set FoundCells = Union(FoundCells, Cell) End If End If Next Cell ' Poka komunikat lub zaznacz komórki If FoundCells Is Nothing Then MsgBox "Nie znaleziono komórek speniaj cych kryterium." Else FoundCells.Select End If End Sub

Procedura rozpoczyna dziaanie od sprawdzenia zaznaczonego zakresu. Jeeli jest to pojedyncza komórka, przeszukiwany jest cay arkusz. Jeeli zaznaczone zostay co najmniej 2 komórki, wtedy przeszukiwany jest tylko zaznaczony zakres. Zakres, który bdzie przeszukiwany, jest nastpnie redefiniowany poprzez uycie metody SpecialCells do utworzenia obiektu klasy Range, który skada si tylko z komórek zawierajcych wartoci numeryczne. Kod w ptli For ... Next sprawdza wartoci kolejnych komórek. Jeeli komórka spenia zadane kryterium (czyli jej zawarto jest mniejsza od 0), komórka jest dodawana za pomoc metody Union do obiektu FoundCells klasy Range. Zwró uwag na fakt, e nie moesz uy metody Union dla pierwszej komórki — jeeli zakres FoundCells nie zawiera adnych komórek, próba uycia metody Union spowoduje wygenerowanie bdu. Wanie dlatego w naszym programie zamiecilimy kod sprawdzajcy, czy zawarto zakresu FoundCells to Nothing. Kiedy ptla koczy swoje dziaanie, obiekt FoundCells skada si z komórek, które speniaj kryterium wyszukiwania (jeeli nie znaleziono adnych komórek, jego zawartoci bdzie Nothing). Jeeli adna komórka nie speni kryteriów, na ekranie zostanie wywietlone okno dialogowe z odpowiednim komunikatem. W przeciwnym razie komórki speniajce kryteria zostan zaznaczone. Skoroszyt z tym przykadem (Zaznaczanie wedug wartoci.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Kopiowanie niecigego zakresu komórek Jeeli kiedykolwiek próbowae kopiowa niecigy zakres komórek, z pewnoci przekonae si, e Excel nie obsuguje takiej operacji. Próba jej wykonania koczy si wywietleniem komunikatu Wykonanie tego polecenia dla kilku zakresów nie jest moliwe.


366

Cz III ‹ Jzyk Visual Basic for Applications

Jedynym wyjtkiem jest tutaj sytuacja, w której próbujesz kopiowa zaznaczenie wielokrotne, skadajce si z caych wierszy lub kolumn. Excel pozwala na wykonanie takiej operacji. Kiedy napotykasz takie ograniczenia w programie Excel, zazwyczaj moesz je obej za pomoc odpowiedniego makra. Procedura, któr omówimy poniej, jest przykadem takiego makra, które pozwala na kopiowanie wielu zaznaczonych zakresów komórek w inne miejsce arkusza. Sub CopyMultipleSelection() Dim SelAreas() As Range Dim PasteRange As Range Dim UpperLeft As Range Dim NumAreas As Long, i As Long Dim TopRow As Long, LeftCol As Long Dim RowOffset As Long, ColOffset As Long If TypeName(Selection) <> "Range" Then Exit Sub '

Zapisuje poszczególne zakresy jako osobne obiekty klasy Range NumAreas = Selection.Areas.Count ReDim SelAreas(1 To NumAreas) For i = 1 To NumAreas Set SelAreas(i) = Selection.Areas(i) Next

'

Okrela górn, lew komórk zaznaczonych obszarów TopRow = ActiveSheet.Rows.Count LeftCol = ActiveSheet.Columns.Count For i = 1 To NumAreas If SelAreas(i).Row < TopRow Then TopRow = SelAreas(i).Row If SelAreas(i).Column < LeftCol Then LeftCol = SelAreas(i).Column Next Set UpperLeft = Cells(TopRow, LeftCol)

'

Pobiera adres obszaru docelowego On Error Resume Next Set PasteRange = Application.InputBox _ (Prompt:="Podaj adres lewej, górnej komórki obszaru docelowego: ", _ Title:="Kopiowanie wielu zakresów", _ Type:=8) On Error GoTo 0 Jeeli operacja zostaa anulowana, zakocz dziaanie If TypeName(PasteRange) <> "Range" Then Exit Sub

'

'

'

Upewnij si, e uywamy tylko lewej, górnej komórki Set PasteRange = PasteRange.Range("A1")

Kopiowanie i wklejanie poszczególnych zakresów For i = 1 To NumAreas RowOffset = SelAreas(i).Row - TopRow ColOffset = SelAreas(i).Column - LeftCol SelAreas(i).Copy PasteRange.Offset(RowOffset, ColOffset) Next i End Sub


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

367

Na rysunku 11.11 przedstawiono okno dialogowe, w którym uytkownik powinien zdefiniowa adres obszaru docelowego.

Rysunek 11.11. Zastosowanie metody InputBox programu Excel do pobierania lokalizacji komórki Skoroszyt z tym przykadem (Kopiowanie wielu zakresów.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki. Dodatkowo w skoroszycie tym znajduje si inna wersja tej procedury, która ostrzega uytkownika, jeeli w wyniku kopiowania zostan nadpisane dane istniejce w obszarze docelowym.

Przetwarzanie skoroszytów i arkuszy Kolejne przykady omawiane w tym podrozdziale demonstruj metody przetwarzania skoroszytów i arkuszy przy uyciu jzyka VBA.

Zapisywanie wszystkich skoroszytów Ponisza procedura przy uyciu ptli przetwarza wszystkie skoroszyty w kolekcji Workbooks i ponownie zapisuje kady plik, który by ju wczeniej zapisany: Public Sub SaveAllWorkbooks() Dim Book As Workbook For Each Book In Workbooks If Book.Path <> "" Then Book.Save Next Book End Sub


368

Cz III ‹ Jzyk Visual Basic for Applications

Zwró uwag na waciwo Path. Jeeli waciwo Path danego skoroszytu jest pusta, oznacza to, e jego plik nigdy nie zosta zapisany (jest to nowy skoroszyt). Procedura ignoruje tego typu skoroszyty i zapisuje tylko te, których waciwo Path ma ustawion dowoln warto.

Zapisywanie i zamykanie wszystkich skoroszytów Ponisza procedura przy uyciu ptli przetwarza kolekcj Workbooks, zapisujc i zamykajc wszystkie skoroszyty: Sub CloseAllWorkbooks() Dim Book As Workbook For Each Book In Workbooks If Book.Name <> ThisWorkbook.Name Then Book.Close savechanges:=True End If Next Book ThisWorkbook.Close savechanges:=True End Sub

Aby okreli, czy dany skoroszyt to skoroszyt zawierajcy kod aktualnie wykonywanej procedury, nasza procedura uywa instrukcji If umieszczonej w ptli For-Next. Jest to konieczne, poniewa zamknicie takiego skoroszytu spowoduje przerwanie wykonywania kodu, na skutek czego inne skoroszyty nie zostan zapisane. Po zamkniciu wszystkich innych skoroszytów procedura zamyka równie swój macierzysty skoroszyt.

Ukrywanie wszystkich komórek arkusza poza zaznaczonym zakresem Procedura, któr omówimy w tym podrozdziale, ukrywa wszystkie komórki arkusza poza tymi, które znajduj si w aktualnie zaznaczonym zakresie. Przykad takiej sytuacji przedstawiono na rysunku 11.12. Sub HideRowsAndColumns() Dim row1 As Long, row2 As Long Dim col1 As Long, col2 As Long If TypeName(Selection) <> "Range" Then Exit Sub '

Jeeli ostatni wiersz lub kolumna s ukryte, odkryj wszystko i zakocz dziaanie If Rows(Rows.Count).EntireRow.Hidden Or _ Columns(Columns.Count).EntireColumn.Hidden Then Cells.EntireColumn.Hidden = False Cells.EntireRow.Hidden = False Exit Sub End If row1 row2 col1 col2

= = = =

Selection.Rows(1).Row row1 + Selection.Rows.Count - 1 Selection.Columns(1).Column col1 + Selection.Columns.Count - 1


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

369

Rysunek 11.12. Wszystkie komórki arkusza poza zaznaczonym zakresem (G8:K17) zostay ukryte Application.ScreenUpdating = False On Error Resume Next ' Ukryj wiersze Range(Cells(1, 1), Cells(row1 - 1, 1)).EntireRow.Hidden = True Range(Cells(row2 + 1, 1), Cells(Rows.Count, 1)).EntireRow.Hidden = True ' Ukryj kolumny Range(Cells(1, 1), Cells(1, col1 - 1)).EntireColumn.Hidden = True Range(Cells(1, col2 + 1), Cells(1, Columns.Count)).EntireColumn.Hidden = True End Sub

Jeeli zaznaczony obszar arkusza skada si z kilku niecigych zakresów komórek, baz do ukrywania wierszy i kolumn jest pierwszy zakres. Skoroszyt z tym przykadem (Ukrywanie wierszy i kolumn.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Synchronizowanie arkuszy Jeeli korzystae kiedykolwiek ze skoroszytów wieloarkuszowych, to wiesz zapewne, e Excel nie potrafi synchronizowa danych z poszczególnych arkuszy skoroszytu. Innymi sowy, nie ma moliwoci automatycznego zaznaczenia tego samego zakresu i ustawienia górnej, lewej komórki takiego multizakresu. Ponisze makro jzyka VBA jako bazy uywa aktywnego arkusza, a na pozostaych arkuszach skoroszytu wykonuje nastpujce operacje:


370

Cz III ‹ Jzyk Visual Basic for Applications „ zaznacza taki sam zakres, jak w przypadku aktywnego arkusza; „ ustawia tak sam górn lew komórk okna, jak w aktywnym arkuszu.

Oto kod ródowy naszej procedury: Sub SynchSheets() ' Ustawia we wszystkich arkuszach t sam aktywn komórk i lew, górn komórk zakresu If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub Dim UserSheet As Worksheet, sht As Worksheet Dim TopRow As Long, LeftCol As Integer Dim UserSel As String

'

Application.ScreenUpdating = False Zapamituje aktualny arkusz Set UserSheet = ActiveSheet

'

Zapisuje informacje z aktywnego arkusza TopRow = ActiveWindow.ScrollRow LeftCol = ActiveWindow.ScrollColumn UserSel = ActiveWindow.RangeSelection.Address

'

Przechodzi w ptli przez poszczególne arkusze For Each sht In ActiveWorkbook.Worksheets If sht.Visible Then ' pomija ukryte arkusze sht.Activate Range(UserSel).Select ActiveWindow.ScrollRow = TopRow ActiveWindow.ScrollColumn = LeftCol End If Next sht

'

Przywraca oryginalne ustawienie aktywnego arkusza UserSheet.Activate Application.ScreenUpdating = True End Sub

Skoroszyt z tym przykadem (Synchronizacja arkuszy.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Techniki programowania w jzyku VBA Nastpne przykady ilustruj czsto uywane techniki programowania w jzyku VBA, które moesz wykorzysta we wasnych projektach.

Przeczanie wartoci waciwoci typu logicznego Waciwo typu logicznego posiada warto True lub False. Najprostsza metoda przeczania wartoci takiej waciwoci polega na zastosowaniu operatora Not. Zostao to pokazane w poniszym przykadzie, w którym przeczana jest warto waciwoci WrapText obiektu Selection:


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

371

Sub ToggleWrapText() ' Wcza lub wycza zawijanie tekstu dla zaznaczonych komórek If TypeName(Selection) = "Range" Then Selection.WrapText = Not ActiveCell.WrapText End If End Sub

Oczywicie w razie potrzeby moesz dowolnie zmodyfikowa t procedur, tak aby przeczaa inne waciwoci typu logicznego. Zauwa, e przeczanie jest wykonywane w oparciu o aktywn komórk. Jeeli po zaznaczeniu zakresu waciwoci komórek maj róne wartoci (np. zawarto niektórych komórek jest pogrubiona, a innych nie), taki zakres ma mieszane waciwoci. W tym przypadku Excel w celu okrelenia sposobu przeczania wartoci posuguje si aktywn komórk. Jeeli na przykad zawarto aktywnej komórki jest pogrubiona, po naciniciu przycisku na Wstce pogrubienie zostanie usunite z wszystkich komórek zaznaczenia. Ta prosta procedura naladuje zachowanie Excela, co zazwyczaj jest najlepszym rozwizaniem. Zauwa równie, e do sprawdzenia, czy zaznaczono zakres, procedura wykorzystuje funkcj TypeName. Jeeli zaznaczony obszar nie jest zakresem, nie zostanie wykonana adna operacja. Operator Not umoliwia przeczanie wartoci wielu innych waciwoci. Aby na przykad w arkuszu wywietli lub ukry nagówki wierszy i kolumn, naley uy nastpujcej instrukcji: ActiveWindow.DisplayHeadings = Not ActiveWindow.DisplayHeadings

Aby w aktywnym arkuszu wywietli lub ukry linie siatki, naley uy nastpujcej instrukcji: ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines

Okrelanie liczby drukowanych stron W celu okrelenia liczby drukowanych stron arkusza mona uy polecenia Podgld wydruku Excela i w dolnej czci ekranu sprawdzi liczb stron. Procedura jzyka VBA przedstawiona poniej zlicza poziome i pionowe linie podziau stron i na tej podstawie okrela liczb drukowanych stron aktywnego arkusza: Sub PageCount() MsgBox (ActiveSheet.HPageBreaks.Count + 1) * _ (ActiveSheet.VPageBreaks.Count + 1) End Sub

Kolejna procedura jzyka VBA przechodzi w ptli przez wszystkie arkusze aktywnego skoroszytu i wywietla cakowit liczb drukowanych stron, tak jak to zostao zilustrowane na rysunku 11.13. Sub ShowPageCount() Dim PageCount As Integer Dim sht As Worksheet


372

Cz III ‹ Jzyk Visual Basic for Applications

Rysunek 11.13. Wykorzystanie procedury VBA do wyznaczenia liczby stron do wydruku w skoroszycie PageCount = 0 For Each sht In Worksheets PageCount = PageCount + (sht.HPageBreaks.Count + 1) * _ (sht.VPageBreaks.Count + 1) Next sht MsgBox "Liczba stron do wydruku = " & PageCount End Sub

Skoroszyt z tym przykadem (Zliczanie stron wydruku.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Wywietlanie daty i czasu Jeeli znasz ju system liczb seryjnych uywany przez Excel do przechowywania dat i godzin, nie bdziesz mia adnych problemów z zastosowaniem dat i czasu w procedurach jzyka VBA. Procedura DateAndTime wywietla okno komunikatu z aktualn dat i czasem, tak jak to zostao przedstawione na rysunku 11.14. W pasku tytuowym okna wywietlany jest komunikat odpowiedni dla danej pory dnia. Rysunek 11.14. Okno komunikatu wywietlajce dat i czas

Procedura jako argument funkcji Format wykorzystuje funkcj Date. Wynikiem dziaania procedury jest acuch zawierajcy sformatowan dat. Aby uzyska tak samo sformatowany czas, uylimy podobnego sposobu. Sub DateAndTime() ' Wywietla aktualn dat i czas Dim TheDate As String, TheTime As String Dim Greeting As String Dim FullName As String, FirstName As String Dim SpaceInName As Integer TheDate = Format(Date, "Long date") TheTime = Format(Time, "Long time") ' Okrelenie powitania w oparciu o czas Select Case Time Case Is < TimeValue("12:00"): Greeting = "Dzie dobry " Case Is >= TimeValue("17:00"): Greeting = "Dobry wieczór " Case Else: Greeting = "Dzie dobry " End Select ' Dodanie do powitania imienia uytkownika


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

373

FullName = Application.UserName SpaceInName = InStr(1, FullName, " ", 1) '

Obsuga przypadku, gdy nazwa nie zawiera spacji If SpaceInName = 0 Then SpaceInName = Len(FullName) FirstName = Left(FullName, SpaceInName) Greeting = Greeting & FirstName ' Wywietlenie komunikatu MsgBox TheDate & vbCrLf & TheTime, vbOKOnly, Greeting End Sub

W celu zagwarantowania, e makro bdzie poprawnie dziaao niezalenie od ustawie regionalnych systemu uytkownika, w powyszym przykadzie uylimy nazw formatów daty i czasu (Long Date i Long Time). Oczywicie w razie potrzeby moesz posuy si innymi formatami. Aby na przykad wywietli dat w formacie mm/dd/rr, moesz uy nastpujcego polecenia: TheDate = Format(Date, "mm/dd/yy")

Aby uzaleni tre komunikatu wywietlanego na pasku tytuowym okna od pory dnia, zastosowalimy konstrukcj Select Case. Wartoci zwizane z czasem stosowane w jzyku VBA funkcjonuj podobnie jak w Excelu. Jeeli warto czasu jest mniejsza od liczby 0,5 (poudnie), oznacza to, e jest przedpoudnie. Jeeli z kolei warto ta jest wiksza od liczby 0,7083 (godzina 17), oznacza to, e jest wieczór. W innych przypadkach jest popoudnie. Wybralimy proste rozwizanie polegajce na zastosowaniu funkcji TimeValue jzyka VBA, która pobierajc acuch, zwraca warto czasu. Kolejna grupa instrukcji identyfikuje imi uytkownika znajdujce si w zakadce Ogólne okna dialogowego Opcje. W celu zlokalizowania pierwszej spacji zawartej w personaliach uytkownika uyem funkcji InStr jzyka VBA. Po napisaniu procedury stwierdziem, e nie uwzgldniem identyfikatora uytkownika, w którym nie wystpuje spacja. Gdy wic uruchomiem j w systemie uywanym przez uytkownika Nobody, nie zadziaaa prawidowo. Jest to potwierdzeniem tezy, e nie mona przewidzie wszystkiego, i nawet najprostsze procedury mog nie zadziaa. Nawiasem mówic, jeeli nie zostan podane personalia uytkownika, Excel zawsze uyje nazwy aktualnie zalogowanego uytkownika. W procedurze problem ten zosta rozwizany poprzez przypisanie zmiennej SpaceInName dugoci penej nazwy uytkownika, tak aby funkcja Left zwrócia odpowiedni nazw. Funkcja MsgBox czy dat i czas, a ponadto w celu wstawienia pomidzy nimi znaku podziau stosuje wbudowan sta vbCrLf. Staa vbOKOnly jest predefiniowan sta zwracajc zero i powodujc, e w oknie komunikatu zostanie wywietlony jedynie przycisk OK. Ostatni argument o nazwie Greeting zosta wczeniej zdefiniowany w procedurze. Skoroszyt z tym przykadem (Data i czas.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Pobieranie listy czcionek Jeeli bdziesz chcia pobra list wszystkich zainstalowanych czcionek, przekonasz si, e Excel nie oferuje bezporedniej metody uzyskania takiej listy. Technika opisywana tutaj wykorzystuje fakt, e ze wzgldu na konieczno zachowania kompatybilnoci


374

Cz III ‹ Jzyk Visual Basic for Applications

z poprzednimi wersjami, Excel 2010 nadal obsuguje stare metody i waciwoci obiektów CommandBar, które w wersjach wczeniejszych ni 2007 byy wykorzystywane do pracy z paskami narzdzi i menu. Procedura ShowInstalledFonts wywietla w kolumnie A aktywnego arkusza list zainstalowanych czcionek. Procedura tworzy tymczasowy pasek narzdzi (obiekt klasy Command ´Bar), dodaje do niego formant Font i odczytuje list czcionek z waciwoci tego formantu. Po zakoczeniu tymczasowy pasek narzdzi jest usuwany. Sub ShowInstalledFonts() Dim FontList As CommandBarControl Dim TempBar As CommandBar Dim i As Long '

Tworzy tymczasowy pasek narzdzi (obiekt klasy CommandBar) Set TempBar = Application.CommandBars.Add Set FontList = TempBar.Controls.Add(ID:=1728)

'

Umieszcza list czcionek w kolumnie A Range("A:A").ClearContents For i = 0 To FontList.ListCount - 1 Cells(i + 1, 1) = FontList.List(i + 1) Next i

'

Usuwa tymczasowy pasek narzdzi (obiekt klasy CommandBar) TempBar.Delete End Sub

Opcjonalnie mona te wywietli nazw czcionki przy uyciu tej czcionki, tak jak to zostao zaprezentowane na rysunku 11.15. Aby to zrobi, wewntrz ptli For ... Next naley umieci nastpujc instrukcj: Cells(i+1, 1).Font.Name = FontList.List(i + 1)

Trzeba jednak mie wiadomo, e zastosowanie w skoroszycie wielu czcionek spowoduje zuycie znacznej iloci zasobów systemowych, a nawet moe doprowadzi do zawieszenia komputera. Skoroszyt z tym przykadem (Lista czcionek.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Sortowanie tablicy Co prawda Excel posiada wbudowane polecenie sortujce zakresy arkusza, ale jzyk VBA nie dysponuje metod sortowania tablic. Skuteczne, ale niewygodne rozwizanie tego problemu polega na przeniesieniu zawartoci tablicy do zakresu arkusza, posortowaniu jej przy uyciu polecenia Excela, a nastpnie wczytaniu wyniku do tablicy. Jeeli jednak szybko odgrywa du rol, lepiej stworzy w jzyku VBA procedur sortujc. W tym punkcie omówimy cztery róne metody sortowania: „ Sortowanie arkuszowe polega na przeniesieniu zawartoci tablicy do zakresu arkusza,

posortowaniu jej, a nastpnie ponownym umieszczeniu w tablicy. Jedynym argumentem procedury opartej na tej metodzie jest tablica.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

375

Rysunek 11.15. Wywietlanie listy czcionek przy uyciu tych samych czcionek

„ Sortowanie bbelkowe jest prost metod sortowania (zastosowano j te

w przykadzie demonstrujcym sortowanie arkusza w rozdziale 9.). Co prawda metoda sortowania bbelkowego jest atwa w kodowaniu, ale ma raczej powolny algorytm, zwaszcza gdy przetwarzaniu podlega dua liczba elementów. „ Sortowanie metod quick-sort (sortowanie szybkie) w porównaniu z bbelkowym

jest o wiele szybsz metod sortowania, ale te znacznie trudniejsz do zrozumienia. Metoda moe zosta wykorzystana tylko w przypadku takich typów danych, jak Integer lub Long. „ Sortowanie zliczajce jest bardzo szybkie, ale równie trudne do zrozumienia.

Technika ta, podobnie jak sortowanie szybkie, dziaa tylko w przypadku takich typów danych, jak Integer lub Long. Na doczonym dysku CD-ROM znajduje si skoroszyt o nazwie Sortowanie.xlsm, który porównuje wyej wymienione metody sortowania. Skoroszyt przydaje si w przypadku porównywania metod sortowania tablic o rónych rozmiarach. Oczywicie w razie potrzeby moesz skopiowa z niego odpowiednie procedury i uy ich w swoich programach.

Na rysunku 11.16 pokazano okno dialogowe naszego programu. Procedury sortujce zostay przetestowane przy uyciu tablic o siedmiu rónych rozmiarach liczcych od 100 do 100 000 elementów. W tablicach zawarte byy wartoci losowe typu Long.


Cz III ‹ Jzyk Visual Basic for Applications

376

Rysunek 11.16. Porównanie czasu potrzebnego do wykonania operacji sortowania tablic o rónych rozmiarach

W tabeli 11.1 zawarem wyniki testów. Warto 0,00 oznacza, e sortowanie zostao zakoczone prawie natychmiast w czasie krótszym ni 0,01 sekundy. Tabela 11.1. Czas trwania (wyraony w sekundach) operacji sortowania tablic wypenionych losowymi wartociami przy uyciu czterech algorytmów sortujcych Liczba elementów tablicy

Sortowanie arkuszowe Excela

Sortowanie bbelkowe przy uyciu jzyka VBA

Sortowanie szybkie przy uyciu jzyka VBA

Sortowanie zliczajce przy uyciu jzyka VBA

100

0,04

0,00

0,00

0,02

500

0,02

0,01

0,00

0,01

1000

0,03

0,03

0,00

0,00

5000

0,07

0,84

0,01

0,01

10 000

0,09

3,41

0,01

0,01

50 000

0,43

79,95

0,07

0,02

100 000

0,78

301,90

0,14

0,04

Algorytm sortowania arkuszowego jest wyjtkowo szybki, zwaszcza e operacja uwzgldnia przeniesienie zawartoci tablicy do arkusza, sortowanie jej i ponowne wczytanie danych do tablicy. Jeeli tablica jest ju prawie posortowana, sortowanie arkuszowe bdzie jeszcze szybsze. Algorytm sortowania bbelkowego jest do szybki w przypadku niewielkich tablic, ale przy wikszych (liczcych ponad 5000 elementów) powiniene po prostu o nim zapomnie. Sortowanie szybkie oraz sortowanie zliczajce s bardzo szybkie, ale ich funkcjonalno jest ograniczona jedynie do danych typu Interger oraz Long.

Przetwarzanie grupy plików Jednym z czstych zastosowa makr jest oczywicie kilkakrotne powtarzanie okrelonej operacji. Przykad przedstawiony poniej ilustruje, jak przy uyciu makra przetworzy kilka rónych plików zapisanych na dysku. Procedura, która moe pomóc w napisaniu


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

377

wasnego makra realizujcego tego typu zadanie, prosi uytkownika o podanie wzorca nazw plików, a nastpnie przetwarza wszystkie pliki, których nazwy s z nim zgodne. W tym przypadku operacja przetwarzania polega na zaimportowaniu pliku i wprowadzeniu grupy formu sumujcych, które opisuj zawarte w nim dane. Sub BatchProcess() Dim FileSpec As String Dim i As Integer Dim FileName As String Dim FileList() As String Dim FoundFiles As Integer ' Okrelenie cieki i wzorca nazwy FileSpec = ThisWorkbook.Path & "\" & "text??.txt" FileName = Dir(FileSpec) '

Czy plik zosta znaleziony? If FileName <> "" Then FoundFiles = 1 ReDim Preserve FileList(1 To FoundFiles) FileList(FoundFiles) = FileName Else MsgBox "Nie znaleziono adnych plików pasuj cych do wzorca " & FileSpec Exit Sub End If

'

Pobierz nazwy pozostaych plików Do FileName = Dir If FileName = "" Then Exit Do FoundFiles = FoundFiles + 1 ReDim Preserve FileList(1 To FoundFiles) FileList(FoundFiles) = FileName & "*" Loop ' Przetwarzanie kolejnych plików w ptli For i = 1 To FoundFiles Call ProcessFiles(FileList(i)) Next i End Sub

Skoroszyt z tym przykadem (Przetwarzanie wsadowe.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki. Przykad korzysta z trzech dodatkowych plików, równie znajdujcych si na dysku CD-ROM. S to: text01.txt, text02.txt i text03.txt. Aby zaimportowa inne pliki tekstowe, bdziesz musia odpowiednio zmodyfikowa kod procedury.

Nazwy plików pasujce do wzorca s przechowywane w tablicy o nazwie FoundFiles. Pliki s przetwarzane przy uyciu ptli For ... Next. W trakcie przetwarzania wewntrz ptli jest wywoywana prosta procedura ProcessFiles. W celu zaimportowania pliku korzysta ona z metody OpenText, a nastpnie wstawia pi formu. Oczywicie zamiast poniszej mona zastosowa wasn procedur. Sub ProcessFiles(FileName As String) ' Importowanie pliku Workbooks.OpenText FileName:=FileName, _ Origin:=xlWindows, _ StartRow:=1, _ DataType:=xlFixedWidth, _


378

Cz III ‹ Jzyk Visual Basic for Applications

FieldInfo:= _ Array(Array(0, 1), Array(3, 1), Array(12, 1)) ' Wprowadzanie formu podsumowujcych Range("D1").Value = "A" Range("D2").Value = "B" Range("D3").Value = "C" Range("E1:E3").Formula = "=COUNTIF(B:B,D1)" Range("F1:F3").Formula = "=SUMIF(B:B,D1,C:C)" End Sub

Wicej szczegóowych informacji na temat pracy z plikami z poziomu jzyka VBA znajdziesz w rozdziale 27.

Ciekawe funkcje, których moesz uy w swoich projektach W tym podrozdziale zaprezentujemy kilka niestandardowych funkcji, które mona albo bezporednio stosowa w aplikacjach uytkowych, albo modyfikowa, traktujc je jako twórcz inspiracj. Najprzydatniejsze s wtedy, gdy wywouje si je z innej procedury jzyka VBA. Procedury zostay zadeklarowane przy uyciu sowa kluczowego Private, dziki czemu nie bd widoczne w oknie dialogowym Wstawianie funkcji Excela. Skoroszyt z tym przykadem (Funkcje uytkowe VBA.xlsm) znajdziesz na pycie CDROM doczonej do ksiki.

Funkcja FileExists Funkcja pobiera jeden argument (cieka pliku wraz z jego nazw) i zwraca warto True, jeeli plik istnieje: Private Function FileExists(fname) As Boolean ' Zwraca warto True, jeeli istnieje plik FileExists = (Dir(fname) <> "") End Function

Funkcja FileNameOnly Funkcja pobiera jeden argument (cieka pliku wraz z jego nazw) i zwraca tylko nazw pliku (innymi sowy — usuwa ciek pliku): Private Function FileNameOnly(pname) As String ' Zwraca nazw pliku pobran z acucha zoonego ze cieki i nazwy pliku Dim temp As Variant length = Len(pname) temp = Split(pname, Application.PathSeparator) FileNameOnly = temp(UBound(temp)) End Function


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

379

Funkcja FileNameOnly wykorzystuje funkcj Split VBA, która pobiera acuch tekstu (oraz separator) i zwraca tabel typu Variant, zawierajc elementy acucha znajdujce si pomidzy znakami separatora. W tym przypadku zmienna temp zawiera tablic z acuchami tekstu znajdujcymi si pomidzy separatorami definiowanymi przez Application. ´PathSeparator (zaznaczaj s to znaki lewego ukonika). Inny przykad zastosowania funkcji Split znajdziesz w podrozdziale „Wyznaczanie n-tego elementu acucha” w dalszej czci tego rozdziau. Jeeli argumentem wywoania funkcji jest cieka c:\excel files\2010\backup\budget.xlsm, funkcja zwróci acuch budget.xlsm. Funkcja FileNameOnly przetwarza dowoln ciek i nazw pliku (nawet jeeli plik nie istnieje). Jeeli plik istnieje, ponisza funkcja oferuje prostsz metod usuwania cieki i zwracania tylko nazwy pliku: Private Function FileNameOnly2(pname) As String FileNameOnly2 = Dir(pname) End Function

Funkcja PathExists Funkcja pobiera jeden argument (cieka pliku) i zwraca warto True, jeeli cieka istnieje: Private Function PathExists(pname) As Boolean ' Zwraca warto True, jeeli istnieje cieka If Dir(pname, vbDirectory) = "" Then PathExists = False Else PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End If End Function

Funkcja RangeNameExists Funkcja pobiera jeden argument (nazwa zakresu) i zwraca warto True, jeeli w aktywnym skoroszycie istnieje nazwa zakresu: Private Function RangeNameExists(nname) As Boolean ' Zwraca warto True, jeeli istnieje nazwa zakresu Dim n As Name RangeNameExists = False For Each n In ActiveWorkbook.Names If UCase(n.Name) = UCase(nname) Then RangeNameExists = True Exit Function End If Next n End Function

Inny sposób napisania takiej funkcji przedstawiono poniej. Funkcja w tej wersji próbuje utworzy zmienn obiektow przy uyciu nazwy zakresu. Jeeli taka próba zakoczy si wygenerowaniem bdu, oznacza to, e dana nazwa zakresu nie istnieje.


380

Cz III ‹ Jzyk Visual Basic for Applications

Private Function RangeNameExists2(nname) As Boolean ' Zwraca warto True, jeeli istnieje nazwa zakresu Dim n As Range On Error Resume Next Set n = Range(nname) If Err.Number = 0 Then RangeNameExists2 = True _ Else RangeNameExists2 = False End Function

Funkcja SheetExists Funkcja pobiera jeden argument (nazwa arkusza) i zwraca warto True, jeeli w aktywnym skoroszycie istnieje arkusz o takiej nazwie: Private Function SheetExists(sname) As Boolean ' Zwraca warto True, jeeli w aktywnym skoroszycie istnieje arkusz o takiej nazwie Dim x As Object On Error Resume Next Set x = ActiveWorkbook.Sheets(sname) If Err = 0 Then SheetExists = True _ Else SheetExists = False End Function

Sprawdzanie, czy obiekt naley do kolekcji Ponisza procedura Function jest prost funkcj sprawdzajc, czy dany obiekt naley do kolekcji: Private Function IsInCollection(Coln As Object, _ Item As String) As Boolean Dim Obj As Object On Error Resume Next Set Obj = Coln(Item) IsInCollection = Not Obj Is Nothing End Function

Funkcja pobiera dwa argumenty — kolekcj (obiekt) i element (a cuch), który moe, ale nie musi nalee do kolekcji. Funkcja próbuje utworzy zmienn obiektow reprezentujc element kolekcji. Jeeli próba si powiedzie, funkcja zwraca warto True. W przeciwnym razie funkcja zwraca warto False. Funkcji IsInCollection mona uy zamiast trzech innych funkcji wymienionych w rozdziale (RangeNameExists, SheetExists i WorkbookIsOpen). Aby na przykad stwierdzi, czy w aktywnym skoroszycie istnieje zakres o nazwie Data, naley wywoa funkcj IsInCollection przy uyciu poniszej instrukcji: MsgBox IsInCollection(ActiveWorkbook.Names, "Data")

Aby stwierdzi, czy otwarto skoroszyt o nazwie budet.xlsx, naley uy nastpujcej instrukcji: MsgBox IsInCollection(Workbooks, "budet.xlsx")

Aby stwierdzi, czy aktywny skoroszyt zawiera arkusz o nazwie Arkusz1, naley uy nastpujcej instrukcji: MsgBox IsInCollection(ActiveWorkbook.Worksheets, "Arkusz1")


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

381

Funkcja WorkbookIsOpen Funkcja pobiera jeden argument (nazwa skoroszytu) i zwraca warto True, jeeli skoroszyt jest otwarty: Private Function WorkbookIsOpen(wbname) As Boolean ' Zwraca warto True, jeeli skoroszyt jest otwarty Dim x As Workbook On Error Resume Next Set x = Workbooks(wbname) If Err = 0 Then WorkbookIsOpen = True _ Else WorkbookIsOpen = False End Function

Pobieranie wartoci z zamknitego skoroszytu Jzyk VBA nie posiada metody umoliwiajcej pobranie wartoci z zamknitego skoroszytu. W razie potrzeby moemy jednak skorzysta z faktu, e Excel obsuguje cza do plików. Zamieszczona poniej funkcja GetValue jzyka VBA pobiera warto z zamknitego skoroszytu. Zadanie to jest realizowane poprzez wywoanie starszego typu makra XLM, które byo stosowane w wersjach Excela sprzed wersji 5. Na szczcie, jak wida, Excel nadal obsuguje makra tego starego typu. Private Function GetValue(path, file, sheet, ref) ' Pobiera warto z zamknitego skoroszytu Dim arg As String ' Sprawdza, czy istnieje plik If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "Plik nie zosta znaleziony." Exit Function End If ' Tworzenie argumentu arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) ' Wykonanie makra XLM GetValue = ExecuteExcel4Macro(arg) End Function

Funkcja GetValue pobiera cztery argumenty: „ path — cieka zamknitego pliku (np. "d:\pliki"); „ file — nazwa pliku skoroszytu (np. "budet.xlsx"); „ sheet — nazwa arkusza (np. "Arkusz1"); „ ref — odwoanie do komórki (np. "C4").

Ponisza procedura Sub demonstruje, w jaki sposób uy funkcji GetValue. Procedura wywietla po prostu warto w komórce A1 arkusza Arkusz1 pliku o nazwie 2010Budet.xlsx znajdujcego si w katalogu XLPliki\Budet na dysku C. Sub TestGetValue() Dim p As String, f As String Dim s As String, a As String


382

Cz III ‹ Jzyk Visual Basic for Applications

p = "c:\XLPliki\Budet" f = "2010Budet.xlsx" s = "Arkusz1" a = "A1" MsgBox GetValue(p, f, s, a) End Sub

Kolejna procedura odczytuje z zamknitego pliku 1200 wartoci (zajmujcych obszar 100 wierszyu12 kolumn), a nastpnie umieszcza je w aktywnym arkuszu: Sub TestGetValue2() Dim p As String, f As String Dim s As String, a As String Dim r As Long, c As Long p = "c:\XLPliki\Budet" f = "2010Budet.xlsx" s = "Arkusz1" Application.ScreenUpdating = False For r = 1 To 100 For c = 1 To 12 a = Cells(r, c).Address Cells(r, c) = GetValue(p, f, s, a) Next c Next r End Sub

Funkcja GetValue nie zadziaa po zastosowaniu jej w formule arkuszowej. W praktyce nie ma jednak adnej potrzeby umieszczania tej funkcji w jakiejkolwiek formule. W celu pobrania wartoci z zamknitego pliku wystarczy stworzy cze do komórki znajdujcej si w takim pliku. Skoroszyt z tym przykadem (Pobieranie wartoci z zamknitego pliku.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki. Procedury zawarte w tym skoroszycie pobieraj dane ze skoroszytu o nazwie Mój skoroszyt.xlsx.

Uyteczne, niestandardowe funkcje arkuszowe W tym podrozdziale zamiecilimy przykady niestandardowych funkcji, które mona zastosowa w formuach arkusza. Pamitaj, e takie funkcje (procedury typu Function), musz zosta zdefiniowane w module VBA, a nie w moduach powizanych z obiektami takimi jak ThisWorkbook, Arkusz1 lub UserForm1. Skoroszyt z przykadami omawianymi w tym podrozdziale (Funkcje arkuszowe.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Funkcje zwracajce informacje o formatowaniu komórki W tym podrozdziale znajdziesz szereg niestandardowych funkcji zwracajcych rónorodne informacje o sposobie formatowania komórki. Funkcje takie s przydatne na przykad w sytuacji, kiedy trzeba posortowa dane w oparciu o formatowanie (np. gdy szukasz wszystkich komórek, wobec których uyto pogrubienia).


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

383

Takie funkcje nie zawsze s automatycznie przeliczane, poniewa zmiana formatowania nie uaktywnia mechanizmu Excela wykonujcego ponowne obliczenia. Aby wymusi ponowne obliczenie wszystkich skoroszytów wraz z aktualizacj wartoci funkcji niestandardowych, naley nacisn kombinacj klawiszy Ctrl+Alt+F9. Innym rozwizaniem jest umieszczenie w kodzie ródowym funkcji nastpujcego polecenia: Application.Volatile

Po zastosowaniu tego polecenia nacinicie klawisza F9 spowoduje ponowne przeliczenie arkusza wraz z funkcjami niestandardowymi.

Ponisza funkcja zwraca warto True, jeeli w jednokomórkowym zakresie bdcym jej argumentem zastosowano pogrubienie. Jeeli jako argument wywoania funkcji zostanie przekazany zakres, funkcja uyje lewej, górnej komórki tego zakresu: Function IsBold(cell) As Boolean ' Zwraca warto True, jeeli zawarto komórki zostaa pogrubiona IsBold = cell.Range("A1").Font.Bold End Function

Pamitaj, e takie funkcje dziaaj poprawnie tylko z komórkami, którym formatowanie zostao nadane bezporednio za pomoc polece i przycisków formatujcych i nie bd dziaay w przypadku formatowania nadanego za pomoc mechanizmu formatowania warunkowego. W Excelu 2010 wprowadzony zosta nowy obiekt, DisplayFormat, który potrafi obsugiwa elementy formatowania warunkowego. Poniej zamieszczamy now wersj funkcji IsBold — zwraca ona poprawne wyniki równie dla komórek, których zawarto zostaa pogrubiona za porednictwem formatowania warunkowego: Function IsBold(cell) As Boolean ' Zwraca warto True, jeeli zawarto komórki zostaa pogrubiona (z uwzgldnieniem formatowania warunkowego) IsBold = cell.Range("A1").DisplayFormat.Font.Bold End Function

Ponisza funkcja zwraca warto True, jeeli w komórce bdcej jej argumentem zastosowano kursyw: Function IsItalic(cell) As Boolean ' Zwraca warto True, jeeli w komórce uyto kursywy IsItalic = cell.Range("A1").Font.Italic End Function

Jeeli w komórce zostanie zastosowane mieszane formatowanie (np. tylko wybrane znaki zostan pogrubione), obie powysze funkcje zwróc bd. Kolejna funkcja zwróci warto True tylko wtedy, gdy wszystkie znaki z komórki bd pogrubione: Function AllBold(cell) As Boolean ' Zwraca warto True, jeeli wszystkie znaki z komórki s pogrubione If IsNull(cell.Font.Bold) Then AllBold = False Else AllBold = cell.Font.Bold End If End Function


384

Cz III ‹ Jzyk Visual Basic for Applications

Funkcja AllBold moe zosta uproszczona do nastpujcej postaci: Function AllBold (cell) As Boolean ' Zwraca warto True, jeeli wszystkie znaki z komórki s pogrubione AllBold = Not IsNull(cell.Font.Bold) End Function

Funkcja FillColor zwraca liczb cakowit odpowiadajc indeksowi koloru ta komórki (czyli inaczej mówic, indeksowi koloru jej wypenienia). Kolor ta komórki zwykle zaley od wybranego stylu formatowania arkusza. Jeeli to komórki nie zostanie wypenione, funkcja zwraca warto –4142. Ta funkcja nie dziaa poprawnie kolorami ta tabel (definiowanych za pomoc polecenia Tabela, znajdujcego si na karcie Wstawianie, w grupie polece Tabele). Aby uwzgldni kolory ta tabel, powiniene uy obiektu DisplayFormat, o którym wspominalimy wczeniej. Function FillColor(cell) As Integer ' Zwraca liczb cakowit odpowiadajc kolorowi ta komórki FillColor = cell.Range("A1").Interior.ColorIndex End Function

Gadajcy arkusz? Funkcja SayIt wykorzystuje wbudowany w Excela generator mowy to odczytywania „na gos” przekazanego jej argumentu (którym moe by acuch tekstu lub odwoanie do wybranej komórki). Function SayIt(txt) Application.Speech.Speak (txt) SayIt = txt End Function

Opisywana funkcja daje cakiem interesujce efekty i moe by naprawd uyteczna. Spróbuj uy tej funkcji na przykad w nastpujcej formule: =IF(SUM(A:A)>25000,SayIt("Cel zosta osi gnity!"))

Jeeli suma wartoci w kolumnie A przekroczy warto 25000, usyszysz zsyntetyzowany gos radonie oznajmiajcy, e cel zosta osignity. Metody Speak moesz równie uy do powiadomienia o zakoczeniu dugo dziaajcej procedury. W ten sposób po uruchomieniu procedury bdziesz móg zaj si czym innym, a Excel sam powiadomi Ci, kiedy procedura wreszcie zakoczy dziaanie.

Wywietlanie daty zapisania lub wydrukowania pliku Skoroszyt Excela posiada szereg wbudowanych waciwoci dokumentu, które s dostpne dla programów VBA za porednictwem waciwoci BuiltinDocumentProperties obiektu Workbook. Ponisza funkcja zwraca dat i czas wykonania ostatniej operacji zapisu skoroszytu: Function LastSaved() Application.Volatile


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

385

LastSaved = ThisWorkbook. _ BuiltinDocumentProperties("Last Save Time") End Function

Data i czas ostatniego zapisu, zwracane przez t funkcj, to dokadnie ta sama informacja, jak znajdziesz w sekcji Powizane daty widoku Backstage, dostpnego po przejciu na kart Plik i wybraniu polecenia Informacje. Pamitaj, e mechanizm automatycznego zapisu równie modyfikuje te dane, std znacznik czasu ostatniego zapisu dokumentu niekoniecznie musi by tosamy z tym, kiedy dany dokument zosta zapisany przez uytkownika. Ponisza funkcja jest podobna do poprzedniej, z tym e zwraca dat i czas wykonania ostatniej operacji drukowania lub podgldu wydruku dla skoroszytu. Jeeli skoroszyt nie by jeszcze nigdy drukowany ani uytkownik nigdy nie korzysta z opcji podgldu wydruku, funkcja zwraca bd #ARG!: Function LastPrinted() Application.Volatile LastPrinted = ThisWorkbook. _ BuiltinDocumentProperties("Last Print Date") End Function

Jeeli uyjesz tych funkcji w formule, to w celu uzyskania aktualnych wartoci waciwoci skoroszytu moe by konieczne wymuszenie wykonania ponownych oblicze (poprzez wcinicie klawisza F9). Istnieje cakiem sporo dodatkowych wbudowanych waciwoci, ale Excel nie korzysta ze wszystkich. Na przykad próba uycia waciwoci Number of Bytes spowoduje wygenerowanie bdu. Pen list wbudowanych waciwoci skoroszytów znajdziesz w pomocy systemowej programu Excel.

Funkcje LastSaved i LastPrinted zostay zaprojektowane z myl o przechowywaniu ich w skoroszycie, w którym s uywane. W niektórych przypadkach funkcja moe zosta umieszczona w innym skoroszycie (np. personal.xlsb) lub dodatku. Poniewa obie powysze funkcje odwouj si do waciwoci ThisWorkbook, po zapisaniu ich w innym skoroszycie nie bd dziaay poprawnie. Poniej zawarto wersje tych funkcji o bardziej uniwersalnym przeznaczeniu. Funkcje uywaj waciwoci Application.Caller, która zwraca obiekt klasy Range reprezentujcy komórk wywoujc funkcj. Waciwo Parent.Parent zwraca skoroszyt (obiekt Workbook), czyli obiekt nadrzdny przodka obiektu Range. Zagadnienie to zostanie omówione dokadniej w nastpnym podrozdziale. Function LastSaved2() Application.Volatile LastSaved2 = Application.Caller.Parent.Parent. _ BuiltinDocumentProperties("Last Save Time") End Function

Obiekty nadrzdne Jak pamitasz, model obiektowy Excela ma posta hierarchiczn — poszczególne obiekty s zawarte w innych obiektach. Na szczycie hierarchii znajduje si obiekt klasy Appli ´cation. Excel zawiera inne obiekty, które s kontenerami dla kolejnych obiektów, itd. Ponisza hierarchia ilustruje miejsce, jakie w tym schemacie zajmuje obiekt Range:


386

Cz III ‹ Jzyk Visual Basic for Applications

obiekt Application obiekt Workbook obiekt Worksheet obiekt Range W jzyku programowania obiektowego mówimy, e przodkiem (obiektem nadrzdnym) obiektu Range jest obiekt Worksheet, bdcy jego kontenerem. Przodkiem obiektu Work ´sheet jest obiekt Workbook przechowujcy arkusz. Z kolei obiektem nadrzdnym obiektu Workbook jest obiekt Application. W jaki sposób wykorzysta t informacj w praktyce? Przeanalizujmy ponisz funkcj SheetName jzyka VBA. Funkcja pobiera jeden argument (zakres) i zwraca nazw arkusza zawierajcego zakres. Funkcja uywa waciwoci Parent obiektu Range. Waciwo Parent zwraca obiekt przechowujcy obiekt Range. Function SheetName(ref) As String SheetName = ref.Parent.Name End Function

Kolejna funkcja WorkbookName zwraca nazw skoroszytu zawierajcego okrelon komórk. Zauwa, e funkcja dwukrotnie uywa waciwoci Parent. Pierwsza waciwo Parent zwraca obiekt Worksheet, a druga — obiekt Workbook. Function WorkbookName(ref) As String WorkbookName = ref.Parent.Parent.Name End Function

Ponisza funkcja AppName przenosi nas na kolejny poziom w hierarchii, trzykrotnie korzystajc z waciwoci Parent. Funkcja zwraca nazw obiektu Application powizanego z okrelon komórk. Oczywicie w naszym przypadku funkcja zawsze bdzie zwracaa warto Microsoft Excel. Function AppName(ref) As String AppName = ref.Parent.Parent.Parent.Name End Function

Zliczanie komórek, których wartoci zawieraj si pomidzy dwoma wartociami Ponisza funkcja o nazwie CountBetween zwraca liczb wartoci w zakresie (pierwszy argument), mieszczcych si pomidzy dwoma wartociami reprezentowanymi przez drugi i trzeci argument: Function CountBetween(InRange, num1, num2) As Long ' Zlicza wartoci z przedziau od num1 do num2 With Application.WorksheetFunction If num1 <= num2 Then CountBetween = .CountIfs(InRange, ">=" & num1, _ InRange, "<=" & num2) Else CountBetween = .CountIfs(InRange, ">=" & num2, _ InRange, "<=" & num1)


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

387

End If End With End Function

Funkcja korzysta z funkcji arkuszowej COUNTIFS (LICZ.WARUNKI) Excela i w praktyce spenia rol funkcji osonowej upraszczajcej tworzone formuy. Funkcja LICZ.WARUNKI zostaa wprowadzona w Excelu 2007, std taka funkcja nie bdzie dziaaa z wczeniejszymi wersjami Excela.

Poniej zamieszczono przykad formuy korzystajcej z funkcji CountBetween, zwracajcej liczb komórek zakresu A1:A100, których wartoci s wiksze lub równe 10 i mniejsze lub równe 20: =CountBetween(A1:A100, 10, 20)

Funkcja pobiera dwa argumenty numeryczne w dowolnej kolejnoci, std formua przedstawiona poniej dziaa dokadnie tak samo, jak jej poprzedniczka: =CountBetween(A1:A100, 20, 10)

Zastosowanie tej funkcji jzyka VBA jest zdecydowanie prostsze ni wprowadzenie nastpujcej dugiej (i jak wida — dosy zoonej) formuy: =LICZ.WARUNKI(A1:A100,">=10",A1:A100"<=20")

Wyznaczanie ostatniej niepustej komórki kolumny lub wiersza W tym podrozdziale zaprezentowano dwie bardzo przydatne funkcje. Pierwsza z nich, o nazwie LastInColumn, zwraca zawarto ostatniej niepustej komórki danej kolumny. Druga funkcja, LastInRow, zwraca zawarto ostatniej niepustej komórki danego wiersza. Kada z funkcji pobiera pojedynczy argument, którym jest zakres. Zakresem moe by caa kolumna (funkcja LastInColumn) lub cay wiersz (funkcja LastInRow). Jeeli przekazany argument nie jest ca kolumn lub wierszem, funkcja uyje wiersza lub kolumny okrelonej przez górn lew komórk zakresu. Ponisza przykadowa formua zwraca warto ostatniej, niepustej komórki kolumny B: =LastInColumn(B5)

Kolejna formua zwraca warto ostatniej, niepustej komórki z wiersza 7: =LastInRow(C7:D9)

Oto kod ródowy funkcji LastInColumn: Function LastInColumn(rng As Range) ' Zwraca zawarto ostatniej niepustej komórki kolumny Dim LastCell As Range Application.Volatile With rng.Parent With .Cells(.Rows.Count, rng.Column) If Not IsEmpty(.Value) Then LastInColumn = .Value ElseIf IsEmpty(.End(xlUp)) Then


388

Cz III ‹ Jzyk Visual Basic for Applications

LastInColumn = "" Else LastInColumn = .End(xlUp).Value End If End With End With End Function

Funkcja jest dosy zoona, dlatego poniej przedstawiamy kilka punktów, które mog pomóc Ci zrozumie jej sposób dziaania: „ Metoda Application.Volatile powoduje, e funkcja zostanie wykonana

kadorazowo przy obliczaniu arkusza. „ Waciwo Rows.Count zwraca liczb wierszy arkusza. Zamiast na sztywno

wprowadza w kodzie ródowym liczb wierszy arkusza, uyem waciwoci Count, poniewa kolejna wersja Excela moe obsugiwa jeszcze wiksz ni

dotychczas liczb wierszy. „ Waciwo rng.Column zwraca numer kolumny górnej lewej komórki zakresu bdcego wartoci argumentu rng. „ Zastosowanie waciwoci rng.Parent powoduje, e funkcja bdzie dziaa poprawnie nawet wtedy, gdy argument rng odwouje si do innego arkusza lub

skoroszytu. „ Uycie metody End z argumentem xlUp jest równoznaczne z uaktywnieniem ostatniej

komórki kolumny, wciniciem klawisza End, a nastpnie klawisza n.

„ Funkcja IsEmpty sprawdza, czy komórka jest pusta. Jeeli tak jest, zwraca pusty acuch. Gdyby funkcja IsEmpty nie zostaa zastosowana, po napotkaniu pustej komórki nasza funkcja zwróciaby warto 0.

Poniej przedstawiamy kod ródowy funkcji LastInRow, która jest bardzo podobna do funkcji LastInColumn: Function LastInRow(rng As Range) ' Zwraca zawarto ostatniej niepustej komórki wiersza Application.Volatile With rng.Parent With .Cells(rng.Row, .Columns.Count) If Not IsEmpty(.Value) Then LastInRow = .Value ElseIf IsEmpty(.End(xlToLeft)) Then LastInRow = "" Else LastInRow = .End(xlToLeft).Value End If End With End With End Function

Czy dany acuch tekstu jest zgodny z wzorcem? Funkcja IsLike jest bardzo prosta i jednoczenie bardzo uyteczna. Zwraca warto True, jeeli acuch tekstowy jest zgodny ze zdefiniowanym wzorcem.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

389

Jak wida poniej, kod funkcji jest bardzo prosty. Funkcja waciwie odgrywa rol funkcji osonowej, pozwalajcej na wygodne uycie w tworzonych formuach wszechstronnego operatora Like jzyka VBA: Function IsLike(text As String, pattern As String) As Boolean ' Zwraca warto True, jeeli pierwszy argument jest podobny do drugiego IsLike = text Like pattern End Function

Funkcja IsLike pobiera dwa argumenty: „ text — acuch tekstowy lub odwoanie do komórki, która go zawiera; „ pattern — acuch zawierajcy znaki wieloznaczne, które wymieniono w poniszej

tabeli. Znaki zawarte we wzorcu

Zawarto acucha text zgodna ze wzorcem

?

Dowolny pojedynczy znak

*

0 lub wicej dowolnych znaków

#

Dowolna pojedyncza cyfra (0 – 9)

[lista_znaków]

Dowolny pojedynczy znak znajdujcy si na licie_znaków

[!lista_znaków]

Dowolny pojedynczy znak, który nie znajduje si na licie_znaków

Ponisza formua zwraca warto TRUE, poniewa wzorzec * jest zgodny z dowoln liczb znaków. Formua zwraca warto TRUE, jeeli pierwszy argument jest dowolnym acuchem tekstowym rozpoczynajcym si od litery g: =IsLike("gitara", "g*")

Kolejna formua zwraca warto TRUE, poniewa wzorzec ? jest zgodny z dowolnym pojedynczym znakiem. Formua zwróci warto FALSE, jeeli wartoci pierwszego argumentu bdzie acuch Jednostka12: = IsLike("Jednostka1", "Jednostka?")

Nastpna formua zwraca warto TRUE, poniewa jej pierwszy argument jest pojedynczym znakiem zawartym w drugim argumencie: = IsLike("a", "[aeiou]")

Ponisza formua zwraca warto TRUE, jeeli komórka A1 zawiera liter a, e, i, o, u, A, E, I, O lub U. Przetworzenie argumentów przy uyciu funkcji UPPER spowoduje, e formua nie bdzie rozróniaa wielkoci znaków: = IsLike(UPPER(A1), UPPER("[aeiou]"))

Ponisza formua zwraca warto TRUE, jeeli komórka A1 zawiera warto rozpoczynajc si cyfr 1 i skadajc si dokadnie z trzech cyfr (czyli dowoln liczb cakowit z przedziau od 100 do 199): = IsLike(A1, "1##")


390

Cz III ‹ Jzyk Visual Basic for Applications

Wyznaczanie n-tego elementu acucha Funkcja ExtractElement jest niestandardow funkcj arkusza (moe by te wywoywana z procedury jzyka VBA) wyznaczajc n-ty element acucha tekstowego. Jeeli na przykad komórka zawiera poniszy tekst, w celu wydzielenia dowolnego podacucha zawartego pomidzy cznikami mona uy funkcji ExtractElement: 123-456-789-0133-8844

Kolejna formua zwraca podacuch 0133 bdcy czwartym elementem acucha (w roli separatora w acuchu jest uywany cznik): =ExtractElement("123-456-789-0133-8844", 4, "-")

Funkcja ExtractElement pobiera trzy argumenty: „ Txt — acuch tekstowy, z którego s wydzielane podacuchy (moe to by litera

lub odwoanie do komórki); „ n — liczba cakowita reprezentujca wydzielany element; „ Separator — pojedynczy znak speniajcy funkcj separatora. Jeeli wartoci argumentu bdzie spacja, cigi kilku spacji zostan potraktowanych jak jedna spacja, co prawie zawsze bdzie zgodne z Twoimi zamierzeniami. Jeeli warto argumentu n przekroczy liczb elementów a cucha, funkcja zwróci pusty a cuch.

Oto kod ródowy funkcji ExtractElement jzyka VBA: Function ExtractElement(Txt, n, Separator) As String ' Zwraca n-ty element acucha tekstowego, w którym poszczególne elementy oddziela okrelony znak separatora Dim AllElements As Variant AllElements = Split(Txt, Separator) ExtractElement = AllElements(n - 1) End Function

Funkcja korzysta z funkcji Split jzyka VBA zwracajcej tablic typu Variant, która zawiera poszczególne elementy acucha tekstowego. Indeks tablicy rozpoczyna si od wartoci 0, a nie 1, dlatego odwoania do kolejnych elementów tablicy s realizowane poprzez wyraenie n-1.

Zamiana wartoci na sowa1 Funkcja SPELLDOLLARS zwraca „sown” wersj wartoci numerycznych podanych jako argument wywoania funkcji (tak jak w dobrze kademu znanej formuce SOWNIE: spotykanej na blankietach przelewów i wpat czy fakturach). Na przykad formua przedstawiona poniej zwraca nastpujcy acuch tekstu: One hundred twenty-three and 45/100 dollars (sto dwadziecia trzy dolary i 45 centów): =SPELLDOLLARS(123.45)

1

Uwaga: funkcja opisana w tym podrozdziale zwraca wartoci w jzyku angielskim — przyp. tum.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

391

Na rysunku 11.17 przedstawiono kilka przykadów zastosowania funkcji SPELLDOLLARS. Formuy zostay umieszczone w kolumnie C. Przykadowo formua umieszczona w komórce C1 ma nastpujc posta: =SPELLDOLLARS(A1)

Zwró uwag na fakt, e wartoci ujemne s podawane w nawiasach.

Rysunek 11.17. Przykady zastosowania funkcji SPELLDOLLARS Funkcja SPELLDOLLARS jest zbyt zoona, aby j tutaj zaprezentowa w caoci, ale skoroszyt zawierajcy peny kod tej funkcji (Funkcje arkuszowe.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Funkcja wielofunkcyjna Nastpny przykad prezentuje technik, która moe okaza si przydatna w niektórych sytuacjach. Sprawia ona, e pojedyncza funkcja arkusza zachowuje si jak wiele funkcji. Poniej zamieszczamy kod ródowy niestandardowej funkcji o nazwie StatFunction, która pobiera dwa argumenty — zakres (rng) i operacj (op). W zalenoci od wartoci argumentu op funkcja zwraca warto obliczon przy uyciu dowolnej z nastpujcych funkcji arkuszowych: AVERAGE (REDNIA), COUNT (ILE.LICZB), MAX, MEDIAN (MEDIANA), MIN, MODE (WYST.NAJCZ CIEJ), STDEV (ODCH.STANDARDOWE), SUM (SUMA) lub VAR (WARIANCJA). Funkcji StatFunction moesz uy w arkuszu w nastpujcy sposób: =StatFunction(B1:B24, A24)

Wynik formuy zaley od zawartoci komórki A24, która powinna by takim acuchem, jak Average, Count, Max itd. Podobn technik kodowania moesz zastosowa w przypadku innych funkcji. Function StatFunction(rng, Select Case UCase(op) Case "SUM" StatFunction = Case "AVERAGE" StatFunction = Case "MEDIAN" StatFunction =

op)

WorksheetFunction.Sum(rng) WorksheetFunction.Average(rng) WorksheetFunction.Median(rng)


392

Cz III ‹ Jzyk Visual Basic for Applications

Case "MODE" StatFunction Case "COUNT" StatFunction Case "MAX" StatFunction Case "MIN" StatFunction Case "VAR" StatFunction Case "STDEV" StatFunction Case Else StatFunction End Select End Function

= WorksheetFunction.Mode(rng) = WorksheetFunction.Count(rng) = WorksheetFunction.Max(rng) = WorksheetFunction.Min(rng) = WorksheetFunction.Var(rng) = WorksheetFunction.StDev(rng) = CVErr(xlErrNA)

Funkcja SheetOffset Excel oferuje ograniczon obsug trójwymiarowych skoroszytów. Jeeli na przykad konieczne jest odwoanie do innego arkusza skoroszytu, w formule trzeba uwzgldni nazw arkusza. Nie stanowi to jednak duego problemu… do momentu próby skopiowania formuy do innych arkuszy. Skopiowane formuy w dalszym cigu odwouj si do nazwy oryginalnego arkusza, a odwoania do arkuszy nie s modyfikowane tak, jak miaoby to miejsce w prawdziwym trójwymiarowym arkuszu. W tym podrozdziale zosta omówiony przykad funkcji jzyka VBA o nazwie SheetOffset, umoliwiajcej stosowanie wzgldnych odwoa do arkuszy. Na przykad w celu odwoania si do komórki A1 poprzedniego arkusza naley uy formuy: =SheetOffset(-1, A1)

Pierwszy argument funkcji, który moe by wartoci dodatni, ujemn lub zerem, identyfikuje wzgldne odwoanie do arkusza. Drugi argument musi by odwoaniem do pojedynczej komórki. Po skopiowaniu formuy do innych arkuszy odwoanie wzgldne bdzie obowizywao we wszystkich jej kopiach. Oto kod ródowy funkcji SheetOffset jzyka VBA: Function SheetOffset(Offset As Long, Optional Cell As Variant) ' Zwraca zawarto komórki wzgldnie adresowanego arkusza, do której zdefiniowano odwoanie Dim WksIndex As Long, WksNum As Long Dim wks As Worksheet Application.Volatile If IsMissing(Cell) Then Set Cell = Application.Caller WksNum = 1 For Each wks In Application.Caller.Parent.Parent.Worksheets If Application.Caller.Parent.Name = wks.Name Then SheetOffset = Worksheets(WksNum + Offset).Range(Cell(1).Address) Exit Function Else WksNum = WksNum + 1 End If Next wks End Function


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

393

Zwracanie maksymalnej wartoci ze wszystkich arkuszy Aby okreli maksymaln warto komórki B1 z kilku arkuszy, mona zastosowa formu podobn do poniszej: =MAX(Arkusz1:Arkusz4!B1)

Formua zwraca maksymaln warto komórki B1 z arkuszy Arkusz1, Arkusz4 i wszystkich, które znajduj si pomidzy nimi. Co si jednak stanie, gdy za arkuszem Arkusz4 zostanie wstawiony nowy arkusz Arkusz5? Formua nie uwzgldni tego automatycznie, dlatego konieczne bdzie jej zmodyfikowanie w celu dodania nowego odwoania do arkusza: =MAX(Arkusz1:Arkusz5!B1)

Funkcja MaxAllSheets pobiera jeden argument i zwraca maksymaln warto okrelonej komórki z wszystkich arkuszy skoroszytu. Przykadowo ponisza formua zwraca maksymaln warto komórki B1 z uwzgldnieniem wszystkich arkuszy skoroszytu: =MaxAllSheets(B1)

Po dodaniu nowego arkusza nie bdzie ju potrzeby edytowania formuy. Function MaxAllSheets(cell) Dim MaxVal As Double Dim Addr As String Dim Wksht As Object Application.Volatile Addr = cell.Range("A1").Address MaxVal = -9.9E+307 For Each Wksht In cell.Parent.Parent.Worksheets If Wksht.Name = cell.Parent.Name And _ Addr = Application.Caller.Address Then ' Uniknicie odwoania cyklicznego Else If WorksheetFunction.IsNumber(Wksht.Range(Addr)) Then If Wksht.Range(Addr) > MaxVal Then _ MaxVal = Wksht.Range(Addr).Value End If End If Next Wksht If MaxVal = -9.9E+307 Then MaxVal = 0 MaxAllSheets = MaxVal End Function

W celu uzyskania dostpu do skoroszytu ptla For Each uywa nastpujcego wyraenia: cell.Parent.Parent.Worksheets

Obiektem nadrzdnym komórki jest arkusz, natomiast przodkiem arkusza jest skoroszyt. Wynika z tego, e ptla For Each ... Next przetwarza wszystkie arkusze skoroszytu. Pierwsza instrukcja If z ptli sprawdza, czy przetwarzana komórka zawiera funkcj. Jeeli tak jest, to w celu uniknicia bdu odwoania cyklicznego komórka zostanie zignorowana.


394

Cz III ‹ Jzyk Visual Basic for Applications

Opisana funkcja z atwoci moe zosta zmodyfikowana tak, aby wykonywaa inne obliczenia midzyarkuszowe oparte na takich funkcjach, jak MIN, REDNIA, SUMA itd.

Zwracanie tablicy zawierajcej unikatowe, losowo uporzdkowane liczby cakowite Funkcja RandomIntegers zamieszczona w tym punkcie zwraca tablic unikatowych liczb cakowitych. Stosowana jest w wielokomórkowych formuach tablicowych. {=RandomIntegers()}

Zaznacz zakres, a nastpnie wprowad formu (bez nawiasów klamrowych) i zatwierd j poprzez nacinicie kombinacji klawiszy Ctrl+Shift+Enter. Formua zwraca tablic zawierajc unikatowe, losowo uporzdkowane liczby cakowite. Jeeli na przykad formua zostanie wprowadzona do zakresu zoonego z 50 komórek, jej kopie zwróc unikatowe liczby cakowite z przedziau od 1 do 50. Oto kod ródowy funkcji RandomIntegers: Function RandomIntegers() Dim FuncRange As Range Dim V() As Variant, ValArray() As Variant Dim CellCount As Double Dim i As Integer, j As Integer Dim r As Integer, c As Integer Dim Temp1 As Variant, Temp2 As Variant Dim RCount As Integer, CCount As Integer ' '

'

'

'

Tworzy obiekt klasy Range Set FuncRange = Application.Caller Zwraca bd, jeeli warto obiektu FuncRange jest zbyt dua CellCount = FuncRange.Count If CellCount > 1000 Then RandomIntegers = CVErr(xlErrNA) Exit Function End If Przypisanie zmiennych RCount = FuncRange.Rows.Count CCount = FuncRange.Columns.Count ReDim V(1 To RCount, 1 To CCount) ReDim ValArray(1 To 2, 1 To CellCount) Wypenienie tablicy losowymi wartociami i liczbami cakowitymi zakresu rng For i = 1 To CellCount ValArray(1, i) = Rnd ValArray(2, i) = i Next i Sortowanie tablicy ValArray wedug wymiaru o losowej wartoci For i = 1 To CellCount For j = i + 1 To CellCount If ValArray(1, i) > ValArray(1, j) Then Temp1 = ValArray(1, j) Temp2 = ValArray(2, j) ValArray(1, j) = ValArray(1, i)


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

395

ValArray(2, j) = ValArray(2, i) ValArray(1, i) = Temp1 ValArray(2, i) = Temp2 End If Next j Next i '

Wstawienie losowo uporzdkowanych wartoci do tablicy V i = 0 For r = 1 To RCount For c = 1 To CCount i = i + 1 V(r, c) = ValArray(2, i) Next c Next r RandomIntegers = V End Function

Porzdkowanie zakresu w losowy sposób Funkcja RangeRandomize pobiera jeden argument bdcy zakresem i zwraca tablic zoon z losowo uporzdkowanych wartoci tego zakresu. Function RangeRandomize(rng) Dim V() As Variant, ValArray() As Variant Dim CellCount As Double Dim i As Integer, j As Integer Dim r As Integer, c As Integer Dim Temp1 As Variant, Temp2 As Variant Dim RCount As Integer, CCount As Integer '

Zwraca bd, jeeli warto obiektu rng jest zbyt dua CellCount = rng.Count If CellCount > 1000 Then RangeRandomize = CVErr(xlErrNA) Exit Function End If

'

Przypisanie zmiennych RCount = rng.Rows.Count CCount = rng.Columns.Count ReDim V(1 To RCount, 1 To CCount) ReDim ValArray(1 To 2, 1 To CellCount) Wypenienie tablicy ValArray losowymi wartociami i wartociami obiektu rng For i = 1 To CellCount ValArray(1, i) = Rnd ValArray(2, i) = rng(i) Next i Sortowanie tablicy ValArray wedug wymiaru o losowej wartoci For i = 1 To CellCount For j = i + 1 To CellCount If ValArray(1, i) > ValArray(1, j) Then Temp1 = ValArray(1, j) Temp2 = ValArray(2, j) ValArray(1, j) = ValArray(1, i) ValArray(2, j) = ValArray(2, i)

'

'


396

Cz III ‹ Jzyk Visual Basic for Applications

ValArray(1, i) = Temp1 ValArray(2, i) = Temp2 End If Next j Next i '

Wstawienie losowo uporzdkowanych wartoci do tablicy V i = 0 For r = 1 To RCount For c = 1 To CCount i = i + 1 V(r, c) = ValArray(2, i) Next c Next r RangeRandomize = V End Function

Jak atwo zauway, kod ródowy tej funkcji jest bardzo podobny do kodu funkcji Random ´Integers. Na rysunku 11.18 pokazano wynik dziaania funkcji. Formua tablicowa zawarta w zakresie B2:B11 ma nastpujc posta: {=RangeRandomize(A2:A11)}

Formua zwraca zawarto komórek zakresu A2:A11, ale uporzdkowanego w losowy sposób. Rysunek 11.18. Funkcja RangeRandomize zwraca zawarto komórek zakresu w przypadkowej kolejnoci

Wywoania funkcji interfejsu Windows API Jedn z najwaniejszych cech jzyka VBA jest moliwo wywoywania funkcji przechowywanych w bibliotekach DLL (ang. Dynamic Link Library). W przykadach zaprezentowanych w tym podrozdziale bdziemy korzystali z czsto uywanych funkcji interfejsu API systemu Windows. Dla uproszczenia deklaracje funkcji API przedstawiane w tym podrozdziale dziaaj tylko w Excelu 2010 (zarówno w wersji 32-bitowej, jak i 64-bitowej), natomiast przykady zamieszczone na dysku CD-ROM doczonym do ksiki zawieraj odpowiednie dyrektywy kompilatora, dziki czemu bd poprawnie dziaa równie we wczeniejszych wersjach Excela.


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

397

Okrelanie skojarze plików W systemie Windows wiele typów plików jest kojarzonych z okrelon aplikacj. Po wykonaniu takiego skojarzenia plik mona otworzy w powizanej z nim aplikacji poprzez dwukrotne kliknicie pliku. Funkcja GetExecutable w celu uzyskania penej cieki aplikacji skojarzonej z okrelonym plikiem korzysta z funkcji interfejsu API systemu Windows. Przyjmijmy, e w Twoim systemie znajduje si wiele plików o rozszerzeniu .txt. Jeden z nich, o nazwie Readme.txt, prawdopodobnie znajduje si w katalogu systemu Windows. Aby okreli pen ciek aplikacji otwierajcej plik po jego dwukrotnym klikniciu, mona uy funkcji GetExecutable. Deklaracje funkcji interfejsu API systemu Windows musz zosta umieszczone na pocztku moduu kodu VBA. Private Declare Function FindExecutableA Lib "shell32.dll" _ (ByVal lpFile As String, ByVal lpDirectory As String, _ ByVal lpResult As String) As Long Function GetExecutable(strFile As String) As String Dim strPath As String Dim intLen As Integer strPath = Space(255) intLen = FindExecutableA(strFile, "\", strPath) GetExecutable = Trim(strPath) End Function

Na rysunku 11.19 pokazano wynik wywoania funkcji GetExecutable, która jako argument pobraa nazw pliku muzycznego w formacie MP3. Funkcja zwraca pen ciek aplikacji powizanej z plikiem. Rysunek 11.19. Okrelanie cieki aplikacji powizanej z okrelonym plikiem

Skoroszyt z tym przykadem (Skojarzenia plików.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Pobieranie informacji o napdach dyskowych VBA nie posiada metody pozwalajcej na bezporednie pobieranie informacji o zainstalowanych w systemie napdach dyskowych. Jednak dziki zastosowaniu trzech funkcji API moesz uzyska niezbdne informacje. Na rysunku 11.20 przedstawiono wynik dziaania procedury VBA, która identyfikuje wszystkie podczone do systemu dyski, okrela ich typ, sprawdza cakowit pojemno, rozmiar uytego miejsca oraz rozmiar wolnego miejsca.


398

Cz III Â&#x2039; Jzyk Visual Basic for Applications

Rysunek 11.20. Zastosowanie funkcji Windows API do pobierania informacji o dyskach

Kod procedury jest dosy dugi i zoony, dlatego nie umieszczono go tutaj, ale jeeli jeste ciekawy, jak to dziaa, moesz zajrze do odpowiedniego skoroszytu na pycie CD-ROM doczonej do ksiki. Skoroszyt z tym przykadem (Informacja o dyskach.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Pobieranie informacji dotyczcych drukarki domylnej W kolejnym przykadzie uyjemy funkcji interfejsu Windows API zwracajcej informacje na temat domylnej drukarki. Dane znajduj si w pojedynczym acuchu tekstowym. Ponisza procedura analizuje acuch i wywietla informacje przy uyciu bardziej czytelnego dla uytkownika formatu: Private Declare Function GetProfileStringA Lib "kernel32" _ (ByVal lpAppName As String, ByVal lpKeyName As String, _ ByVal lpDefault As String, ByVal lpReturnedString As String, _ ByVal nSize As Long) As Long Sub DefaultPrinterInfo() Dim strLPT As String * 255 Dim Result As String Call GetProfileStringA _ ("Windows", "Device", "", strLPT, 254)

' ' ' '

Result = Application.Trim(strLPT) ResultLength = Len(Result) Comma1 = InStr(1, Result, ",", 1) Comma2 = InStr(Comma1 + 1, Result, ",", 1) Pobiera nazw drukarki Printer = Left(Result, Comma1 - 1) Pobiera informacje na temat sterownika Driver = Mid(Result, Comma1 + 1, Comma2 - Comma1 - 1) Pobiera ostatni cz informacji na temat urzdzenia Port = Right(Result, ResultLength - Comma2) Tworzy komunikat Msg = "Drukarka:" & Chr(9) & Printer & Chr(13)


Rozdzia 11. ย‹ Przykady i techniki programowania w jzyku VBA

399

Msg = Msg & "Sterownik:" & Chr(9) & Driver & Chr(13) Msg = Msg & "Port:" & Chr(9) & Port ' Wywietla komunikat MsgBox Msg, vbInformation, "Informacje o drukarce domylnej" End Sub

Co prawda waciwo ActivePrinter obiektu Application zwraca nazw domylnej drukarki i umoliwia jej zmian, ale nie istnieje bezporednia metoda okrelenia, jaki sterownik i port urzdzenia jest uywany. Z tego wanie powodu czasami przydatna moe by nasza funkcja GetProfileStringA.

Na rysunku 11.21 pokazano przykadowe okno komunikatu wywietlone przez t procedur. Rysunek 11.21. Informacja o drukarce domylnej wywietlona przy uyciu funkcji interfejsu API systemu Windows Skoroszyt z tym przykadem (Informacja o drukarce.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Pobieranie informacji o aktualnej rozdzielczoci karty graficznej Zamieszczony w tym punkcie kod korzysta z funkcji interfejsu API w celu okrelenia aktualnej rozdzielczoci karty graficznej uywanej w systemie. Jeeli uywana aplikacja musi wywietli okrelon ilo informacji na jednym ekranie, znajomo jego rozdzielczoci moe pomรณc we waciwym przeskalowaniu tekstu. Oprรณcz tego kod procedury sprawdza liczb monitorรณw podczonych do komputera. Jeeli podczonych jest wicej monitorรณw ni jeden, procedura wywietla rozmiary pulpitu wirtualnego. Declare PtrSafe Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As Long Public Const SM_CMONITORS = 80 Public Const SM_CXSCREEN = 0 Public Const SM_CYSCREEN = 1 Public Const SM_CXVIRTUALSCREEN = 78 Public Const SM_CYVIRTUALSCREEN = 79 Sub DisplayVideoInfo() Dim numMonitors As Long Dim vidWidth As Long, vidHeight As Long Dim virtWidth As Long, virtHeight As Long Dim Msg As String numMonitors = GetSystemMetrics(SM_CMONITORS) vidWidth = GetSystemMetrics(SM_CXSCREEN) vidHeight = GetSystemMetrics(SM_CYSCREEN) virtWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN) virtHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN) If numMonitors > 1 Then Msg = numMonitors & " monitory pod czone" & vbCrLf


400

Cz III ‹ Jzyk Visual Basic for Applications

Msg Msg Msg Msg

= = = =

Msg Msg Msg Msg

& & & &

"Pulpit wirtualny: " & virtWidth & " × " virtHeight & vbCrLf & vbCrLf "Rozdzielczo gównego monitora to: " vidWidth & " × " & vidHeight

Else Msg = Msg & "Aktualny tryb graficzny: " Msg = Msg & vidWidth & " × " & vidHeight End If MsgBox Msg End Sub

Na rysunku 11.22 pokazano okno komunikatu zwrócone przez powysz procedur uruchomion w systemie uywajcym dwóch monitorów. Rysunek 11.22. Zastosowanie funkcji interfejsu Windows API do okrelenia rozdzielczoci karty graficznej Skoroszyt z tym przykadem (Informacja o rozdzielczoci karty graficznej.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Dodanie d wiku do aplikacji Przykad, który omówiono w tym podrozdziale, pozwala na dodanie efektów d wikowych do aplikacji Excela, a w szczególnoci pozwala na odtwarzanie d wików zapisanych w formacie MIDI lub WAV. Moesz na przykad odtwarza wybrany d wik w momencie otwierania danego okna dialogowego (lub nie…). Jeeli bdziesz chcia, aby Excel odtwarza pliki w formacie MIDI lub WAV, w tej sekcji znajdziesz dokadnie to, czego bdziesz potrzebowa. Skoroszyt z tym przykadem (D wik.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Odtwarzanie plików typu WAV Poniszy przykad zawiera deklaracj funkcji interfejsu API wraz z prost procedur odtwarzajc plik d wikowy o nazwie sound.wav, który znajduje si w tym samym katalogu, co plik skoroszytu: Private Declare Function PlaySound Lib "winmm.dll" _ Alias "PlaySoundA" (ByVal lpszName As String, _ ByVal hModule As Long, ByVal dwFlags As Long) As Long Const SND_SYNC = &H0 Const SND_ASYNC = &H1 Const SND_FILENAME = &H20000 Sub PlayWAV()


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

401

WAVFile = "sound.wav" WAVFile = ThisWorkbook.Path & "\" & WAVFile Call PlaySound(WAVFile, 0&, SND_ASYNC Or SND_FILENAME) End Sub

W przykadzie plik formatu WAV jest odtwarzany asynchronicznie. Oznacza to, e w trakcie odtwarzania kontynuowane jest wykonywanie procedury. Aby zatrzyma wykonywanie kodu ródowego podczas odtwarzania d wiku, naley uy nastpujcej instrukcji: Call PlaySound(WAVFile, 0&, SND_SYNC Or SND_FILENAME)

Odtwarzanie pliku formatu MIDI W przypadku pliku formatu MIDI konieczne jest zastosowanie innej funkcji interfejsu API. Procedura PlayMIDI rozpoczyna odtwarzanie pliku formatu MIDI. Wykonanie procedury StopMIDI spowoduje zakoczenie odtwarzania pliku. W przykadzie uyto pliku o nazwie helion.mid. Private Declare Function mciExecute Lib "winmm.dll" _ (ByVal lpstrCommand As String) As Long Sub PlayMIDI() MIDIFile = " helion.mid" MIDIFile = ThisWorkbook.Path & "\" & MIDIFile MciExecute ("play " & MIDIFile) End Sub Sub StopMIDI() MIDIFile = "helion.mid" MIDIFile = ThisWorkbook.Path & "\" & MIDIFile MciExecute ("stop " & MIDIFile) End Sub

Odtwarzanie d wiku przy uyciu funkcji arkuszowej Funkcja Alarm zostaa stworzona z myl o zastosowaniu w formule arkusza. Jeeli komórka spenia okrelone kryterium, funkcja, uywajc interfejsu API systemu Windows, odtwarza plik d wikowy. Declare Function PlaySound Lib "winmm.dll" _ Alias "PlaySoundA" (ByVal lpszName As String, _ ByVal hModule As Long, ByVal dwFlags As Long) As Long Function Alarm(Cell, Condition) Dim WAVFile As String Const SND_ASYNC = &H1 Const SND_FILENAME = &H20000 If Evaluate(Cell.Value & Condition) Then WAVFile = ThisWorkbook.Path & "\sound.wav" Call PlaySound(WAVFile, 0&, SND_ASYNC Or SND_FILENAME) Alarm = True Else Alarm = False End If End Function


402

Cz III ‹ Jzyk Visual Basic for Applications

Funkcja Alarm pobiera dwa argumenty — odwoanie do komórki i warunek (majcy posta acucha). Ponisza formua uywa funkcji Alarm do odtworzenia pliku formatu WAV, gdy warto komórki B13 bdzie wiksza lub równa 1000: =ALARM(B13; ">=1000")

W celu stwierdzenia, czy warto komórki spenia okrelone kryterium, funkcja korzysta z funkcji Evaluate jzyka VBA. Po spenieniu kryterium i wygenerowaniu d wiku funkcja zwróci warto True. W przeciwnym razie zwróci warto False. Funkcja SayIt, omawiana wczeniej w tym rozdziale, jest znacznie prostszym sposobem na wzbogacenie aplikacji w efekty dwikowe. Skoroszyt z tymi przykadami (d wik.xlsm) znajdziesz na pycie CD-ROM doczonej do ksiki.

Odczytywanie zawartoci rejestru systemu Windows i zapisywanie w nim danych Wikszo aplikacji Windows potrzebne informacje przechowuje w rejestrze systemu bdcym baz danych. Aby uzyska dodatkowe informacje o rejestrze, naley zajrze do rozdziau 4. Procedury jzyka VBA s w stanie odczytywa dane z rejestru i zapisywa w nim nowe wartoci. Aby to byo moliwe, konieczne jest zastosowanie nastpujcych deklaracji funkcji interfejsu API systemu Windows: Private Declare PtrSafe Function RegOpenKeyA Lib "ADVAPI32.DLL" _ (ByVal hKey As Long, ByVal sSubKey As String, _ ByRef hkeyResult As Long) As Long Private Declare PtrSafe Function RegCloseKey Lib "ADVAPI32.DLL" _ (ByVal hKey As Long) As Long Private Declare PtrSafe Function RegSetValueExA Lib "ADVAPI32.DLL" _ (ByVal hKey As Long, ByVal sValueName As String, _ ByVal dwReserved As Long, ByVal dwType As Long, _ ByVal sValue As String, ByVal dwSize As Long) As Long Private Declare PtrSafe Function RegCreateKeyA Lib "ADVAPI32.DLL" _ (ByVal hKey As Long, ByVal sSubKey As String, _ ByRef hkeyResult As Long) As Long Private Declare PtrSafe Function RegQueryValueExA Lib "ADVAPI32.DLL" _ (ByVal hKey As Long, ByVal sValueName As String, _ ByVal dwReserved As Long, ByRef lValueType As Long, _ ByVal sValue As String, ByRef lResultLen As Long) As Long

Utworzyem dwie funkcje osonowe uatwiajce korzystanie z rejestru. S to: GetRegistry i WriteRegistry. Obie znajduj si na doczonym dysku CD-ROM, w skoroszycie o nazwie Rejestr systemu Windows.xlsm. Przykadowy skoroszyt zawiera procedur demonstrujc odczyt i zapis danych w rejestrze.

Odczyt danych z rejestru Funkcja GetRegistry zwraca ustawienia znajdujce si w okrelonej lokalizacji rejestru. Funkcja pobiera trzy argumenty:


Rozdzia 11. ‹ Przykady i techniki programowania w jzyku VBA

403

„ RootKey — acuch reprezentujcy gówny klucz rejestru, który zostanie uyty.

Oto moliwe acuchy: „ HKEY_CLASSES_ROOT „ HKEY_CURRENT_USER „ HKEY_LOCAL_MACHINE „ HKEY_USERS „ HKEY_CURRENT_CONFIG „ Path — pena cieka kategorii rejestru, która zostanie uyta. „ RegEntry — nazwa ustawienia, które zostanie odczytane.

Aby na przykad odnale  w rejestrze aktualne ustawienie powizane z aktywnym paskiem tytuu okna, naley w sposób pokazany poniej wywoa funkcj GetRegistry (wielko znaków nazw argumentów nie jest rozróniana): RootKey = "hkey_current_user" Path = "Control Panel\Desktop" RegEntry = "WallPaper" MsgBox GetRegistry(RootKey, Path, RegEntry), _ vbInformation, Path & "\RegEntry"

Okno komunikatu wywietli ciek i nazw pliku graficznego uytego w roli tapety pulpitu (jeeli tapeta nie jest uywana, funkcja zwróci pusty acuch).

Zapis danych w rejestrze Funkcja WriteRegistry zapisuje warto w okrelonej lokalizacji rejestru. Jeeli operacja zakoczy si powodzeniem, funkcja zwróci warto True. W przeciwnym razie zwróci warto False. Funkcja WriteRegistry pobiera nastpujce argumenty (wszystkie s acuchami tekstu): „ RootKey — acuch reprezentujcy klucz rejestru, który zostanie uyty.

Oto moliwe acuchy: „ HKEY_CLASSES_ROOT „ HKEY_CURRENT_USER „ HKEY_LOCAL_MACHINE „ HKEY_USERS „ HKEY_CURRENT_CONFIG „ Path — pena cieka kategorii rejestru (jeeli cieka nie istnieje, zostanie

utworzona). „ RegEntry — nazwa kategorii rejestru, w której zostanie zapisana warto (jeeli

kategoria nie istnieje, zostanie dodana). „ RegVal — zapisywana warto.


404

Cz III ย‹ Jzyk Visual Basic for Applications

Poniej zamieszczono przykad procedury zapisujcej w rejestrze warto reprezentujc dat i czas uruchomienia Excela. Informacja jest zapisywana w miejscu, w ktรณrym s przechowywane ustawienia dotyczce Excela. Sub Workbook_Open() RootKey = "hkey_current_user" Path = "software\microsoft\office\14.0\Excel\LastStarted" RegEntry = "DateTime" RegVal = Now() If WriteRegistry(RootKey, Path, RegEntry, RegVal) Then msg = RegVal & " zostaa zapisana w rejestrze." Else msg = "Wyst pi b d." End If MsgBox msg End Sub

Jeeli zapiszesz t procedur w module ThisWorkbook skoroszytu makr osobistych, ustawienia bd automatycznie aktualizowane przy kadym uruchomieniu programu Excel.

atwiejszy sposรณb uzyskania dostpu do rejestru Jeeli w celu zapisania i odczytania danych dostp do rejestru systemu Windows chcesz uzyska z poziomu aplikacji Excela, nie musisz stosowa funkcji interfejsu API. Zamiast nich mona uy funkcji GetSetting i SaveSetting jzyka VBA. Obie funkcje zostay objanione w systemie pomocy, dlatego nie bd ich tutaj szczegรณowo omawia. Jednak naley wiedzie, e funkcje te dziaaj tylko z kluczem o nastpujcej nazwie: HKEY_CURRENT_USER\Software\VB and VBA Program Settings

Innymi sowy, funkcje nie mog zosta zastosowane w celu uzyskania dostpu do dowolnego klucza rejestru. Funkcje te s najbardziej przydatne do zapisywania informacji o wasnych aplikacjach Excela, ktรณre chcesz przechowa pomidzy kolejnymi sesjami.



Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha