background image
background image

Idź do

• Spis treści
• Przykładowy rozdział

• Katalog online

• Dodaj do koszyka

• Zamów cennik

• Zamów informacje

o nowościach

• Fragmenty książek

online

Helion SA

ul. Kościuszki 1c

44-100 Gliwice

tel. 32 230 98 63

e-mail: helion@helion.pl

© Helion 1991–2010

Katalog książek

Twój koszyk

Cennik i informacje

Czytelnia

Kontakt

• Zamów drukowany

katalog

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!

background image

Spis treci

 O 

autorze 

............................................................................................... 19

 Przedmowa 

............................................................................................ 21

Cz I 

Podstawowe informacje ....................................................29

Rozdzia 1. 

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

background image

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

background image

 

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 

Projektowanie aplikacji w Excelu ...................................123

Rozdzia 5. 

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

background image

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

background image

 

Spis treci 

7

Rozdzia 8. 

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

background image

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

background image

 

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 dwiku do aplikacji .....................................................................................400
Odczytywanie zawartoci rejestru systemu Windows i zapisywanie w nim danych .....402

background image

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

background image

 

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 wskanika postpu zadania .........................................................................497

Tworzenie samodzielnego wskanika postpu zadania  ...............................................498
Wywietlanie wskanika postpu zadania za pomoc formantu MultiPage  ................502
Wywietlanie wskanika 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

background image

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

background image

 

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

background image

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

background image

 

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

background image

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

background image

 

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

background image

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

background image

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 kon-
kretnych przykadach omawianych zagadnie, a Czytelnicy poprzednich wyda ksiki
zdecydowanie utwierdzaj mnie w tym przekonaniu. Takie podejcie sprawdza si zwasz-
cza dla programistów pracujcych z jzykiem VBA. Dobrze opracowany przykad o wiele
lepiej objania zagadnienie ni teoretyczny opis. W zwizku z tym zrezygnowaem z mate-
riau 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 pozna-
wania 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.

background image

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, zatrzymywa-
nie 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 opty-
malny 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

background image

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 progra-
mó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 opisy-
wane w tym rozdziale przykady (i nie tylko). Jeszcze lepiej bdzie, jeeli bdziesz próbowa samo-
dzielnie modyfikowa przykady i sprawdza, jaki bdzie efekt tych modyfikacji. Mog Ci zagwa-
rantowa, 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 zarejestro-
wanego 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 doce-

lowe 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

 sko-

roszytu 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

background image

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 poni-
szym 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.

background image

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 zakre-
sach — poprzez definiowanie zakresów lub identyfikowanie zakresów w celu wykony-
wania 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

background image

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 kom-

binacje 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 kocu 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 skoro-

szycie 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 poda-
nie 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 naci-
nie w oknie dialogowym przycisk Cancel, procedura usunie wszelkie dane ju znajdujce
si w komórce. Ponisza zmodyfikowana wersja procedury sprawdza, czy zosta naci-
nity przycisk Cancel i jeeli tak, nie dokonuje zmiany zawartoci komórki:

background image

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

background image

348

Cz III 

‹

 Jzyk Visual Basic for Applications

W wielu przypadkach konieczne bdzie sprawdzenie poprawnoci danych wprowadzo-
nych 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 ponow-
nie. Operacja jest powtarzana do momentu wprowadzenia prawidowej wartoci lub naci-
nicia 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

background image

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 wprowa-
dzanych danych. Zwró uwag, e w procedurze nie zosta okrelony warunek zakocze-
nia 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 proce-

dura 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.

background image

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 przy-

cisk Anuluj, bdzie ignorowany. Jeeli tak si stanie, nie zostanie zdefiniowana zmienna
obiektowa 

UserRange

. W powyszym przykadzie jest wywietlane okno zawierajce komu-

nikat o treci Operacja anulowana. Gdy uytkownik nacinie przycisk OK, wykonywanie
makra bdzie kontynuowane. Instrukcja 

On Error GoTo 0

 przywraca standardow obsug

bdów.

background image

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 przy-

pisze liczb jego komórek zmiennej 

CellCount

:

CellCount = Range("dane").Count

Moesz równie okreli liczb wierszy lub kolumn w zakresie. Ponisze wyraenie wyzna-
cza liczb kolumn znajdujcych si w aktualnie zaznaczonym zakresie:

Selection.Columns.Count

background image

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 war-

to 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 wyra-
enie podobne do poniszego:

NumAreas = Selection.Areas.Count

Jeeli zmienna 

NumAreas

 zawiera warto wiksz od 

1

, zaznaczenie jest zaznaczeniem

wielokrotnym.

background image

Rozdzia 11. 

‹

 Przykady i techniki programowania w jzyku VBA

353

Poniej zamieszczono kod funkcji o nazwie 

AreaType

, która zwraca acuch tekstu opisu-

jcy 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 a-
cuch 

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 kryte-
rium. Kolejna procedura, której kod przedstawiamy poniej, jest wanie przykadem takiego
makra. Procedura 

ColorNegaitve

 ustawia czerwony kolor ta dla wszystkich komórek zazna-

czenia, które przechowuj warto ujemn. Kolor ta pozostaych komórek jest zerowany.

background image

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, nie-
uywanych komórek arkusza, nie mówic ju o tym, e przy duych zaznaczonych obsza-
rach 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. Przyka-
dow 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 przetwa-
rzania 15 komórek a 1 048 576 komórek bdzie naprawd znaczca.

background image

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 nume-

ryczne (

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 szyb-
koci 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

background image

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

background image

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, ponie-

wa 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 usu-

wania 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 wier-

szy. 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 skoro-
szytu zawierajcego informacje o loterii biurowej. Kolumna A przechowuje imiona graczy,
kolumna B liczb losów zakupionych przez poszczególne osoby, a w kolumnie C znaj-
duje si liczba losowa (wygenerowana przy uyciu funkcji 

RAND

). Zwycizca zostanie

wyoniony przez sortowanie danych w kolumnie C (wygrywa osoba, do której zostaa przy-
pisana najwiksza liczba losowa).

Rysunek 11.9.
Zadanie polega
na powieleniu
istniejcych wierszy
w oparciu o wartoci
z kolumny B

background image

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 zaku-

pionych przez kolejn osob i procedura kontynuuje dziaanie a do momentu napotkania
pierwszej pustej komórki. Na rysunku 11.10 przedstawiono wygld arkusza po zakocze-
niu 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 spraw-

dzi, czy dwa zakresy znajduj si w tym samym arkuszu i skoroszycie. Procedura posu-
guje si waciwoci 

Parent

 zwracajc kontener obiektu. Przykadowo ponisze wyra-

enie zwraca nazw arkusza bdcego kontenerem obiektu 

rng1

, do którego jest

wykonywane odwoanie:

rng1.Parent.Name

background image

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

CZY.BD

. Dodatkowo jzyk VBA zawiera funkcje 

IsEmpty

IsDate

 i 

IsNumeric

.

background image

360

Cz III 

‹

 Jzyk Visual Basic for Applications

Zamieszczona poniej funkcja 

CellType

 akceptuje argument 

Range

 i zwraca acuch

(

Pusta

Tekst

Logiczny

Bd

Data

Czas

 lub 

Liczba

) opisujcy typ danych zawartych

w górnej lewej komórce zakresu. Funkcja moe zosta uyta w formule arkusza lub wywo-
ana 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 = "Bd"
        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 warto-
ci z tablicy do zakresu lub z zakresu do tablicy. Z jakiego powodu Excel o wiele szyb-
ciej 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

background image

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 osigni-

cia tego samego celu.

Kod procedury przedstawiony poniej ilustruje najbardziej oczywisty (ale niestety nie naj-
wydajniejszy) 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

background image

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

background image

Rozdzia 11. 

‹

 Przykady i techniki programowania w jzyku VBA

363

W moim systemie wypenienie zakresu o wymiarach 1000

u250 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 pozio-
mej 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 przeno-
szona 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 oryginal-
nego zakresu), natomiast w drugim — 12 (liczba kolumn). Jak sam si przekonasz, prze-
niesienie zawartoci zakresu do tablicy typu 

Variant

 odbywa si prawie natychmiast.

background image

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 opar-
ciu o ich wartoci. Co ciekawe, Excel nie posiada swojego wasnego mechanizmu, który
umoliwiaby bezporednie wykonanie takiej operacji. Poniej przedstawiamy kod pro-
cedury 

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)

background image

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 speniajcych 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 naj-
mniej 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 spe-

nia 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 spe-

niaj kryterium wyszukiwania (jeeli nie znaleziono adnych komórek, jego zawartoci
bdzie 

Nothing

). Jeeli adna komórka nie speni kryteriów, na ekranie zostanie wywie-

tlone okno dialogowe z odpowiednim komunikatem. W przeciwnym razie komórki spe-
niajce 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 prze-
konae si, e Excel nie obsuguje takiej operacji. Próba jej wykonania koczy si wywie-
tleniem komunikatu Wykonanie tego polecenia dla kilku zakresów nie jest moliwe.

background image

366

Cz III 

‹

 Jzyk Visual Basic for Applications

Jedynym wyjtkiem jest tutaj sytuacja, w której próbujesz kopiowa zaznaczenie wielo-
krotne, 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

background image

Rozdzia 11. 

‹

 Przykady i techniki programowania w jzyku VBA

367

Na rysunku 11.11 przedstawiono okno dialogowe, w którym uytkownik powinien zde-
finiowa 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 sko-
roszytó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

background image

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 zamy-

kajc 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 przed-
stawiono 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 = Selection.Rows(1).Row
    row2 = row1 + Selection.Rows.Count - 1
    col1 = Selection.Columns(1).Column
    col2 = col1 + Selection.Columns.Count - 1

background image

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:

background image

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 prze-

czania wartoci takiej waciwoci polega na zastosowaniu operatora 

Not

. Zostao to

pokazane w poniszym przykadzie, w którym przeczana jest warto waciwoci

WrapText

 obiektu 

Selection

:

background image

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 prze-
czaa inne waciwoci typu logicznego.

Zauwa, e przeczanie jest wykonywane w oparciu o aktywn komórk. Jeeli po zazna-
czeniu 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 rozwi-
zaniem.

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 przy-

kad w arkuszu wywietli lub ukry nagówki wierszy i kolumn, naley uy nastpu-
jcej 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

background image

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 procedu-
rach 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 sformato-
wany 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

background image

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 popo-

udnie. 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 zwra-

cajc  zero i powodujc, e w oknie komunikatu zostanie wywietlony jedynie przy-
cisk 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

background image

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 zainsta-

lowanych czcionek. Procedura tworzy tymczasowy pasek narzdzi (obiekt klasy 

Command

´

Bar

), dodaje do niego formant 

Font

 i odczytuje list czcionek z waciwoci tego for-

mantu. 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.

background image

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

.

background image

376

Cz III 

‹

 Jzyk Visual Basic for Applications

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 uwzgld-
nia 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 zapo-
mnie. Sortowanie szybkie oraz sortowanie zliczajce s bardzo szybkie, ale ich funkcjo-
nalno 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

background image

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 pasujcych 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.txttext02.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, _

background image

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 CD-
ROM 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

background image

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 acu-

chami 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 aktyw-

nym 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 zako-
czy si wygenerowaniem bdu, oznacza to, e dana nazwa zakresu nie istnieje.

background image

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 aktyw-

nym 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 (acuch), 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")

background image

Rozdzia 11. 

‹

 Przykady i techniki programowania w jzyku VBA

381

Funkcja WorkbookIsOpen

Funkcja pobiera jeden argument (nazwa skoroszytu) i zwraca warto 

True

, jeeli skoro-

szyt 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 skoro-
szytu. W razie potrzeby moemy jednak skorzysta z faktu, e Excel obsuguje cza do
plików. Zamieszczona poniej funkcja 

GetValue

 jzyka VBA pobiera warto z zamkni-

tego 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

background image

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

 wierszy

u

12

 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 ThisWorkbookArkusz1 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óno-
rodne informacje o sposobie formatowania komórki. Funkcje takie s przydatne na przy-
kad w sytuacji, kiedy trzeba posortowa dane w oparciu o formatowanie (np. gdy szukasz
wszystkich komórek, wobec których uyto pogrubienia).

background image

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 zosta-
nie 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 zasto-

sowano 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

background image

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 wype-
nione, 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 uwzgld-
ni 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 osignity!"))

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 uru-
chomieniu 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

background image

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 niekoniecz-
nie 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 powy-
sze funkcje odwouj si do waciwoci 

ThisWorkbook

, po zapisaniu ich w innym sko-

roszycie 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

:

background image

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 korzy-

stajc 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)

background image

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 spe-

nia 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

, zwracaj-

cej 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 przed-
stawiona poniej dziaa dokadnie tak samo, jak jej poprzedniczka:

=CountBetween(A1:A100, 20, 10)

Zastosowanie tej funkcji jzyka VBA jest zdecydowanie prostsze ni wprowadzenie nast-
pujcej 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 przeka-

zany 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

background image

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.

background image

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 argu-

mentu 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 aeiouA,

EIO 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 rozpoczyna-

jc si cyfr 

1

 i skadajc si dokadnie z trzech cyfr (czyli dowoln liczb cakowit

z przedziau od 100 do 199):

= IsLike(A1, "1##")

background image

390

Cz III 

‹

 Jzyk Visual Basic for Applications

Wyznaczanie n-tego elementu acucha

Funkcja 

ExtractElement

 jest niestandardow funkcj arkusza (moe by te wywoy-

wana 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 acucha, funkcja zwróci pusty acuch.

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 sowa

1

Funkcja 

SPELLDOLLARS

 zwraca „sown” wersj wartoci numerycznych podanych jako

argument wywoania funkcji (tak jak w dobrze kademu znanej formuce SOWNIE: spo-
tykanej na blankietach przelewów i wpat czy fakturach). Na przykad formua przed-
stawiona 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.

background image

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.NAJCZCIEJ

), 

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 przy-

padku innych funkcji.

Function StatFunction(rng, op)
    Select Case UCase(op)
        Case "SUM"
            StatFunction = WorksheetFunction.Sum(rng)
        Case "AVERAGE"
            StatFunction = WorksheetFunction.Average(rng)
        Case "MEDIAN"
            StatFunction = WorksheetFunction.Median(rng)

background image

392

Cz III 

‹

 Jzyk Visual Basic for Applications

        Case "MODE"
            StatFunction = WorksheetFunction.Mode(rng)
        Case "COUNT"
            StatFunction = WorksheetFunction.Count(rng)
        Case "MAX"
            StatFunction = WorksheetFunction.Max(rng)
        Case "MIN"
            StatFunction = WorksheetFunction.Min(rng)
        Case "VAR"
            StatFunction = WorksheetFunction.Var(rng)
        Case "STDEV"
            StatFunction = WorksheetFunction.StDev(rng)
        Case Else
            StatFunction = CVErr(xlErrNA)
    End Select
End Function

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 skopiowa-
nia formuy do innych arkuszy. Skopiowane formuy w dalszym cigu odwouj si do
nazwy oryginalnego arkusza, a odwoania do arkuszy nie s modyfikowane tak, jak mia-
oby 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 odwoa-
nia 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, identy-
fikuje wzgldne odwoanie do arkusza. Drugi argument musi by odwoaniem do poje-
dynczej 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

background image

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 mak-
symaln 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.

background image

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 for-
mua zostanie wprowadzona do zakresu zoonego z 50 komórek, jej kopie zwróc uni-
katowe 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)

background image

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)

background image

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 prze-
chowywanych w bibliotekach DLL (ang. Dynamic Link Library). W przykadach zapre-
zentowanych w tym podrozdziale bdziemy korzystali z czsto uywanych funkcji inter-
fejsu 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.

background image

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 sys-
temie znajduje si wiele plików o rozszerzeniu .txt. Jeden z nich, o nazwie Readme.txt, praw-
dopodobnie 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 argu-

ment 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 zain-
stalowanych 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.

background image

398

Cz III 

‹

 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 czytel-
nego 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)

background image

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 rozdziel-
czoci 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 podczone" & vbCrLf

background image

400

Cz III 

‹

 Jzyk Visual Basic for Applications

        Msg = Msg & "Pulpit wirtualny: " & virtWidth & " × "
        Msg = Msg & virtHeight & vbCrLf & vbCrLf
        Msg = Msg & "Rozdzielczo gównego monitora to: "
        Msg = Msg & 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 uru-
chomion 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 dwiku do aplikacji

Przykad, który omówiono w tym podrozdziale, pozwala na dodanie efektów dwikowych
do aplikacji Excela, a w szczególnoci pozwala na odtwarzanie dwików zapisanych
w formacie MIDI lub WAV. Moesz na przykad odtwarza wybrany dwik w momencie
otwierania danego okna dialogowego (lub nie…). Jeeli bdziesz chcia, aby Excel odtwa-
rza pliki w formacie MIDI lub WAV, w tej sekcji znajdziesz dokadnie to, czego bdziesz
potrzebowa.

Skoroszyt z tym przykadem (Dwik.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 dwikowy o nazwie 

sound.wav

, który znajduje si w tym samym kata-

logu, 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()

background image

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 trak-
cie odtwarzania kontynuowane jest wykonywanie procedury. Aby zatrzyma wykonywa-
nie kodu ródowego podczas odtwarzania dwiku, 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 pro-

cedury 

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 dwiku 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 dwikowy.

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

background image

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 dwiku 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 (dwik.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

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:

background image

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 a-

cuchami 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.

background image

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 prze-
chowywane 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 = "Wystpi bd."
    End If
    MsgBox msg
End Sub

Jeeli zapiszesz t procedur w module 

ThisWorkbook

 skoroszytu makr osobistych, usta-

wienia 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 oma-
wia. 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 aplika-
cjach Excela, które chcesz przechowa pomidzy kolejnymi sesjami.

background image