Upload
buiminh
View
226
Download
0
Embed Size (px)
Citation preview
Idź do
• Spis treści• Przykładowy rozdział
• Katalog online
• Dodaj do koszyka
• Zamów cennik
• Zamów informacjeo nowościach
• Fragmenty książekonline
Helion SAul. Kościuszki 1c44-100 Gliwicetel. 32 230 98 63e-mail: [email protected]© Helion 1991–2010
Katalog książek
Twój koszyk
Cennik i informacje
Czytelnia
Kontakt
• Zamów drukowanykatalog
Excel 2010 PL.Programowanie w VBA.Vademecum WalkenbachaAutor: 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 wszystkiemożliwości Excela i poszerzaj je!
Spis tre�ci O autorze ............................................................................................... 19
Przedmowa ............................................................................................ 21
Cz��� I Podstawowe informacje ....................................................29
Rozdzia� 1. Sk�d si� wzi�� Excel 2010? ................................................................... 31Krótka historia arkuszy kalkulacyjnych ..............................................................................31
Wszystko zacz��o si� od programu VisiCalc .................................................................31Lotus 1-2-3 ....................................................................................................................32Quattro Pro ....................................................................................................................35Microsoft Excel .............................................................................................................36
Excel jako dobre narz�dzie dla projektantów aplikacji ........................................................41Rola Excela w strategii Microsoftu .....................................................................................43
Rozdzia� 2. Program Excel w zarysie ...................................................................... 45My�lenie w kategoriach obiektów .......................................................................................45Skoroszyty ...........................................................................................................................46
Arkusze .........................................................................................................................46Arkusze wykresów ........................................................................................................48Arkusze makr XLM ......................................................................................................49Arkusze dialogowe programów Excel 5 i 95 .................................................................50
Interfejs u�ytkownika programu Excel ................................................................................50Wprowadzenie do Wst��ki ............................................................................................51Menu podr�czne i minipasek narz�dzi ..........................................................................57Okna dialogowe ............................................................................................................58Skróty klawiszowe ........................................................................................................59Tagi inteligentne ............................................................................................................59Panel zada� ...................................................................................................................60
Dostosowywanie wy�wietlania do w�asnych potrzeb ..........................................................61Wprowadzanie danych ........................................................................................................61Formu�y, funkcje i nazwy ....................................................................................................61Zaznaczanie obiektów .........................................................................................................63Formatowanie ......................................................................................................................64Opcje ochrony .....................................................................................................................65
Ochrona formu� przed nadpisaniem ..............................................................................65Ochrona struktury skoroszytu .......................................................................................66Ochrona skoroszytu przy u�yciu has�a ..........................................................................66Ochrona kodu VBA przy u�yciu has�a ..........................................................................67
Wykresy ..............................................................................................................................68Kszta�ty i obiekty typu SmartArt .........................................................................................68
4 Spis tre�ci
Dost�p do baz danych ..........................................................................................................69Arkuszowe bazy danych ................................................................................................69Zewn�trzne bazy danych ...............................................................................................70
Funkcje internetowe ............................................................................................................71Narz�dzia analizy danych ....................................................................................................72Dodatki ................................................................................................................................73Makra i programowanie ......................................................................................................74Zgodno�� formatu plików ....................................................................................................74System pomocy Excela ........................................................................................................74
Rozdzia� 3. Wybrane zasady stosowania formu� ................................................... 77Formu�y ...............................................................................................................................77Obliczanie formu� ................................................................................................................78Odwo�ania do komórki lub zakresu .....................................................................................79
Dlaczego warto u�ywa� odwo�a�, które nie s� wzgl�dne? ............................................79Notacja W1K1 ...............................................................................................................80Odwo�ania do innych arkuszy lub skoroszytów ............................................................81
Zastosowanie nazw ..............................................................................................................83Nadawanie nazw komórkom i zakresom .......................................................................83Nadawanie nazw istniej�cym odwo�aniom ...................................................................83Stosowanie nazw z operatorem przeci�cia ....................................................................84Nadawanie nazw kolumnom i wierszom .......................................................................85Obszar obowi�zywania nazw ........................................................................................85Nadawanie nazw sta�ym ................................................................................................86Nadawanie nazw formu�om ...........................................................................................87Nadawanie nazw obiektom ...........................................................................................88
B��dy wyst�puj�ce w formu�ach ..........................................................................................89Formu�y tablicowe ...............................................................................................................89
Przyk�adowa formu�a tablicowa ....................................................................................90Kalendarz oparty na formule tablicowej .......................................................................91Zalety i wady formu� tablicowych .................................................................................92
Metody zliczania i sumowania ............................................................................................93Przyk�ady formu� zliczaj�cych ......................................................................................94Przyk�ady formu� sumuj�cych .......................................................................................95Inne narz�dzia zliczaj�ce ...............................................................................................95
Przetwarzanie daty i czasu ...................................................................................................96Wprowadzanie daty i czasu ...........................................................................................96Przetwarzanie dat sprzed roku 1900 ..............................................................................97
Tworzenie megaformu� .......................................................................................................98
Rozdzia� 4. Pliki programu Excel ........................................................................... 101Uruchamianie Excela .........................................................................................................101Formaty plików .................................................................................................................103
Formaty plików obs�ugiwane w programie Excel .......................................................104Formaty plików tekstowych ........................................................................................104Formaty plików baz danych ........................................................................................104Inne formaty plików ....................................................................................................105
Praca z plikami szablonów ................................................................................................106Przegl�danie dost�pnych szablonów ...........................................................................108Tworzenie szablonów ..................................................................................................109Tworzenie szablonów skoroszytu ................................................................................110
Budowa plików programu Excel .......................................................................................111Zagl�damy do wn�trza pliku .......................................................................................112Dlaczego format pliku jest taki wa�ny? ......................................................................115
Spis tre�ci 5
Plik OfficeUI .....................................................................................................................116Plik XLB ...........................................................................................................................117Pliki dodatków ...................................................................................................................117Ustawienia Excela w rejestrze systemu Windows .............................................................118
Rejestr systemu Windows ...........................................................................................118Ustawienia Excela .......................................................................................................120
Cz��� II Projektowanie aplikacji w Excelu ...................................123
Rozdzia� 5. Czym jest aplikacja arkusza kalkulacyjnego? ................................ 125Aplikacje arkuszy kalkulacyjnych .....................................................................................125Projektant i u�ytkownik ko�cowy .....................................................................................126
Kim s� projektanci i czym si� zajmuj�? ......................................................................127Klasyfikacja u�ytkowników arkuszy kalkulacyjnych ..................................................128Odbiorcy aplikacji arkusza kalkulacyjnego .................................................................129
Rozwi�zywanie problemów przy u�yciu Excela ...............................................................129Podstawowe kategorie arkuszy kalkulacyjnych .................................................................130
Arkusze robocze ..........................................................................................................131Arkusze przeznaczone wy��cznie do u�ytku prywatnego ............................................131Aplikacje jednego u�ytkownika ..................................................................................132Aplikacje typu „spaghetti” ..........................................................................................132Aplikacje narz�dziowe ................................................................................................133Dodatki zawieraj�ce funkcje arkusza ..........................................................................133Arkusze jednoblokowe ................................................................................................134Modele warunkowe .....................................................................................................134Aplikacje bazodanowe (przechowuj�ce i udost�pniaj�ce dane) ..................................134Aplikacje komunikuj�ce si� z bazami danych .............................................................135Aplikacje „pod klucz” .................................................................................................135
Rozdzia� 6. Podstawy projektowania aplikacji arkusza kalkulacyjnego .......... 137Podstawowe etapy projektowania ......................................................................................137Okre�lanie wymaga� u�ytkownika ....................................................................................138Planowanie aplikacji spe�niaj�cej wymagania u�ytkownika .............................................139Wybieranie odpowiedniego interfejsu u�ytkownika ..........................................................141
Dostosowywanie Wst��ki do potrzeb u�ytkownika ....................................................144Dostosowywanie menu podr�cznego do potrzeb u�ytkownika ...................................144Tworzenie klawiszy skrótu ..........................................................................................145Tworzenie niestandardowych okien dialogowych .......................................................146Zastosowanie formantów ActiveX w arkuszu .............................................................146Rozpocz�cie prac projektowych ..................................................................................148
Zadania realizowane z my�l� o ko�cowym u�ytkowniku ..................................................149Testowanie aplikacji ....................................................................................................149Uodpornianie aplikacji na b��dy pope�niane przez u�ytkownika ................................150Nadawanie aplikacji przyjaznego, intuicyjnego i estetycznego wygl�du ....................152Tworzenie systemu pomocy i dokumentacji przeznaczonej dla u�ytkownika .............154Dokumentowanie prac projektowych ..........................................................................155Przekazanie aplikacji u�ytkownikom ..........................................................................155Aktualizacja aplikacji (kiedy to konieczne) ................................................................156
Pozosta�e kwestie dotycz�ce projektowania ......................................................................156Wersja Excela zainstalowana przez u�ytkownika .......................................................157Wersje j�zykowe .........................................................................................................157Wydajno�� systemu .....................................................................................................157Tryby karty graficznej .................................................................................................158
6 Spis tre�ci
Cz��� III J�zyk Visual Basic for Applications ................................159
Rozdzia� 7. Wprowadzenie do j�zyka VBA .......................................................... 161Podstawowe informacje o j�zyku BASIC .........................................................................161J�zyk VBA ........................................................................................................................162
Modele obiektowe .......................................................................................................162Porównanie j�zyka VBA z j�zykiem XLM .................................................................162
Wprowadzenie do j�zyka VBA .........................................................................................163Edytor VBE .......................................................................................................................165
Wy�wietlanie karty Deweloper ...................................................................................166Uruchamianie edytora VBE ........................................................................................167Okna edytora VBE ......................................................................................................167
Tajemnice okna Project Explorer ......................................................................................169Dodawanie nowego modu�u VBA ...............................................................................170Usuwanie modu�u VBA ..............................................................................................171Eksportowanie i importowanie obiektów ....................................................................171
Tajemnice okna Code ........................................................................................................171Minimalizacja i maksymalizacja okien .......................................................................172Przechowywanie kodu ród�owego j�zyka VBA ........................................................172Wprowadzanie kodu ród�owego j�zyka VBA ...........................................................173
Dostosowywanie edytora Visual Basic ..............................................................................179Karta Editor .................................................................................................................180Karta Editor Format ....................................................................................................183Karta General ..............................................................................................................184Zastosowanie karty Docking .......................................................................................185
Rejestrator makr Excela ....................................................................................................185Co w�a�ciwie zapisuje rejestrator makr? .....................................................................186Odwo�ania wzgl�dne czy bezwzgl�dne? .....................................................................187Opcje zwi�zane z rejestrowaniem makr ......................................................................191Modyfikowanie zarejestrowanych makr .....................................................................191
Obiekty i kolekcje .............................................................................................................192Hierarchia obiektów ....................................................................................................193Kolekcje ......................................................................................................................194Odwo�ywanie si� do obiektów ....................................................................................195
W�a�ciwo�ci i metody ........................................................................................................196W�a�ciwo�ci obiektów .................................................................................................196Metody obiektowe .......................................................................................................197
Tajemnice obiektu Comment .............................................................................................198Pomoc dla obiektu Comment ......................................................................................199W�a�ciwo�ci obiektu Comment ...................................................................................199Metody obiektu Comment ...........................................................................................199Kolekcja Comments ....................................................................................................201W�a�ciwo�� Comment .................................................................................................202Obiekty zawarte w obiekcie Comment ........................................................................202Sprawdzanie, czy komórka posiada komentarz ...........................................................203Dodawanie nowego obiektu Comment ........................................................................204
Kilka przydatnych w�a�ciwo�ci obiektu Application .........................................................205Tajemnice obiektów Range ...............................................................................................206
W�a�ciwo�� Range ......................................................................................................207W�a�ciwo�� Cells ........................................................................................................209W�a�ciwo�� Offset ......................................................................................................210
Co nale�y wiedzie� o obiektach? .......................................................................................212Podstawowe zagadnienia, które nale�y zapami�ta� ....................................................212Dodatkowe informacje na temat obiektów i w�a�ciwo�ci ............................................213
Spis tre�ci 7
Rozdzia� 8. Podstawy programowania w j�zyku VBA ......................................... 217Przegl�d elementów j�zyka VBA ......................................................................................217Komentarze .......................................................................................................................219Zmienne, typy danych i sta�e .............................................................................................220
Definiowanie typów danych ........................................................................................222Deklarowanie zmiennych ............................................................................................222Zasi�g zmiennych ........................................................................................................226Zastosowanie sta�ych ...................................................................................................229Praca z �a�cuchami tekstu ...........................................................................................232Przetwarzanie dat ........................................................................................................232
Instrukcje przypisania ........................................................................................................233Tablice ...............................................................................................................................235
Deklarowanie tablic .....................................................................................................236Deklarowanie tablic wielowymiarowych ....................................................................236Deklarowanie tablic dynamicznych ............................................................................237
Zmienne obiektowe ...........................................................................................................237Typy danych definiowane przez u�ytkownika ..................................................................238Wbudowane funkcje VBA .................................................................................................239Praca z obiektami i kolekcjami ..........................................................................................242
Konstrukcja With ... End With ....................................................................................242Konstrukcja For Each ... Next .....................................................................................243
Sterowanie wykonywaniem procedur ................................................................................244Polecenie GoTo ...........................................................................................................245Konstrukcja If ... Then ................................................................................................245Konstrukcja Select Case ..............................................................................................249Wykonywanie bloku instrukcji w ramach p�tli ...........................................................252
Rozdzia� 9. Tworzenie procedur w j�zyku VBA .................................................... 261Kilka s�ów o procedurach ..................................................................................................261
Deklarowanie procedury Sub ......................................................................................262Zasi�g procedury .........................................................................................................263
Wykonywanie procedur Sub .............................................................................................264Uruchamianie procedury przy u�yciu polecenia Run Sub/UserForm ..........................265Uruchamianie procedury z poziomu okna dialogowego Makro ..................................265Uruchamianie procedury przy u�yciu skrótu z klawiszem Ctrl ...................................266Uruchamianie procedury za pomoc� Wst��ki .............................................................267Uruchamianie procedur za po�rednictwem niestandardowego menu podr�cznego .....267Wywo�ywanie procedury z poziomu innej procedury .................................................267Uruchamianie procedury poprzez klikni�cie obiektu ..................................................271Wykonywanie procedury po wyst�pieniu okre�lonego zdarzenia ...............................273Uruchamianie procedury z poziomu okna Immediate .................................................274
Przekazywanie argumentów procedurom ..........................................................................275Metody obs�ugi b��dów .....................................................................................................278
Przechwytywanie b��dów ............................................................................................278Przyk�ady kodu ród�owego obs�uguj�cego b��dy ......................................................279
Praktyczny przyk�ad wykorzystuj�cy procedury Sub ........................................................282Cel ...............................................................................................................................283Wymagania projektowe ...............................................................................................283Co ju� wiesz ................................................................................................................283Podej�cie do zagadnienia ............................................................................................284Co musimy wiedzie�? .................................................................................................285Wst�pne rejestrowanie makr .......................................................................................285Wst�pne przygotowania ..............................................................................................286Tworzenie kodu ród�owego .......................................................................................288
8 Spis tre�ci
Tworzenie procedury sortuj�cej ..................................................................................289Dodatkowe testy ..........................................................................................................292Usuwanie problemów ..................................................................................................293Dost�pno�� narz�dzia ..................................................................................................296Ocena projektu ............................................................................................................296
Rozdzia� 10. Tworzenie funkcji w j�zyku VBA ......................................................... 299Porównanie procedur Sub i Function .................................................................................299Dlaczego tworzymy funkcje niestandardowe? ..................................................................300Twoja pierwsza funkcja .....................................................................................................301
Zastosowanie funkcji w arkuszu .................................................................................301Zastosowanie funkcji w procedurze j�zyka VBA ........................................................302Analiza funkcji niestandardowej .................................................................................302
Procedury Function ...........................................................................................................304Zasi�g funkcji ..............................................................................................................306Wywo�ywanie procedur Function ...............................................................................306
Argumenty funkcji ............................................................................................................310Przyk�ady funkcji ..............................................................................................................311
Funkcja bezargumentowa ............................................................................................311Funkcja jednoargumentowa ........................................................................................313Funkcje z dwoma argumentami ...................................................................................316Funkcja pobieraj�ca tablic� jako argument .................................................................317Funkcje z argumentami opcjonalnymi ........................................................................318Funkcje zwracaj�ce tablic� VBA ................................................................................319Funkcje zwracaj�ce warto�� b��du ..............................................................................322Funkcje o nieokre�lonej liczbie argumentów ..............................................................323
Emulacja funkcji arkuszowej SUMA ................................................................................324Rozszerzone funkcje daty ..................................................................................................327Wykrywanie i usuwanie b��dów w funkcjach ...................................................................329Okno dialogowe Wstawianie funkcji .................................................................................330
Zastosowanie metody MacroOptions ..........................................................................332Definiowanie kategorii funkcji ....................................................................................333Dodawanie opisu funkcji .............................................................................................334
Zastosowanie dodatków do przechowywania funkcji niestandardowych ..........................335Korzystanie z Windows API .............................................................................................336
Przyk�ady zastosowania funkcji interfejsu API systemu Windows .............................336Identyfikacja katalogu domowego systemu Windows ................................................337Wykrywanie wci�ni�cia klawisza Shift .......................................................................338Dodatkowe informacje na temat funkcji interfejsu API ..............................................339
Rozdzia� 11. Przyk�ady i techniki programowania w j�zyku VBA ........................ 341Nauka poprzez praktyk� ....................................................................................................341Przetwarzanie zakresów ....................................................................................................342
Kopiowanie zakresów .................................................................................................342Przenoszenie zakresów ................................................................................................344Kopiowanie zakresu o zmiennej wielko�ci ..................................................................344Zaznaczanie oraz identyfikacja ró�nego typu zakresów ..............................................345Wprowadzanie warto�ci do komórki ...........................................................................346Wprowadzanie warto�ci do nast�pnej pustej komórki .................................................348Wstrzymywanie dzia�ania makra w celu umo�liwienia pobrania zakresu
wyznaczonego przez u�ytkownika ...........................................................................350Zliczanie zaznaczonych komórek ................................................................................351Okre�lanie typu zaznaczonego zakresu .......................................................................352Wydajne przetwarzanie komórek zaznaczonego zakresu przy u�yciu p�tli ................353
Spis tre�ci 9
Usuwanie wszystkich pustych wierszy ........................................................................356Powielanie wierszy ......................................................................................................357Okre�lanie, czy zakres zawiera si� w innym zakresie .................................................358Okre�lanie typu danych zawartych w komórce ...........................................................359Odczytywanie i zapisywanie zakresów .......................................................................360Lepsza metoda zapisywania zakresu ...........................................................................361Przenoszenie zawarto�ci tablic jednowymiarowych ....................................................363Przenoszenie zawarto�ci zakresu do tablicy typu Variant ...........................................363Zaznaczanie komórek na podstawie warto�ci ..............................................................364Kopiowanie nieci�g�ego zakresu komórek ..................................................................365
Przetwarzanie skoroszytów i arkuszy ................................................................................367Zapisywanie wszystkich skoroszytów .........................................................................367Zapisywanie i zamykanie wszystkich skoroszytów .....................................................368Ukrywanie wszystkich komórek arkusza poza zaznaczonym zakresem .....................368Synchronizowanie arkuszy ..........................................................................................369
Techniki programowania w j�zyku VBA ..........................................................................370Prze��czanie warto�ci w�a�ciwo�ci typu logicznego ....................................................370Okre�lanie liczby drukowanych stron .........................................................................371Wy�wietlanie daty i czasu ...........................................................................................372Pobieranie listy czcionek .............................................................................................373Sortowanie tablicy .......................................................................................................374Przetwarzanie grupy plików ........................................................................................376
Ciekawe funkcje, których mo�esz u�y� w swoich projektach ...........................................378Funkcja FileExists .......................................................................................................378Funkcja FileNameOnly ...............................................................................................378Funkcja PathExists ......................................................................................................379Funkcja RangeNameExists ..........................................................................................379Funkcja SheetExists ....................................................................................................380Funkcja WorkbookIsOpen ..........................................................................................381Pobieranie warto�ci z zamkni�tego skoroszytu ...........................................................381
U�yteczne, niestandardowe funkcje arkuszowe .................................................................382Funkcje zwracaj�ce informacje o formatowaniu komórki ...........................................382Gadaj�cy arkusz? ........................................................................................................384Wy�wietlanie daty zapisania lub wydrukowania pliku ................................................384Obiekty nadrz�dne ......................................................................................................385Zliczanie komórek, których warto�ci zawieraj� si� pomi�dzy dwoma warto�ciami ...386Wyznaczanie ostatniej niepustej komórki kolumny lub wiersza .................................387Czy dany �a�cuch tekstu jest zgodny z wzorcem? .......................................................388Wyznaczanie n-tego elementu �a�cucha ......................................................................390Zamiana warto�ci na s�owa .........................................................................................390Funkcja wielofunkcyjna ..............................................................................................391Funkcja SheetOffset ....................................................................................................392Zwracanie maksymalnej warto�ci ze wszystkich arkuszy ...........................................393Zwracanie tablicy zawieraj�cej unikatowe, losowo uporz�dkowane
liczby ca�kowite .......................................................................................................394Porz�dkowanie zakresu w losowy sposób ...................................................................395
Wywo�ania funkcji interfejsu Windows API .....................................................................396Okre�lanie skojarze� plików .......................................................................................397Pobieranie informacji o nap�dach dyskowych ............................................................397Pobieranie informacji dotycz�cych drukarki domy�lnej ..............................................398Pobieranie informacji o aktualnej rozdzielczo�ci karty graficznej ..............................399Dodanie dwi�ku do aplikacji .....................................................................................400Odczytywanie zawarto�ci rejestru systemu Windows i zapisywanie w nim danych .....402
10 Spis tre�ci
Cz��� IV Praca z formularzami UserForm ......................................405
Rozdzia� 12. Tworzenie w�asnych okien dialogowych .......................................... 407Zanim rozpoczniesz tworzenie formularza UserForm .......................................................407Okno wprowadzania danych .............................................................................................407
Funkcja InputBox j�zyka VBA ...................................................................................408Metoda InputBox Excela .............................................................................................409
Funkcja MsgBox j�zyka VBA ...........................................................................................412Metoda GetOpenFilename programu Excel ......................................................................415Metoda GetSaveAsFilename programu Excel ...................................................................419Okno wybierania katalogu .................................................................................................419Wy�wietlanie wbudowanych okien dialogowych Excela ..................................................420Wy�wietlanie formularza danych ......................................................................................421
Wy�wietlanie formularza wprowadzania danych ........................................................423Wy�wietlanie formularza wprowadzania danych za pomoc� VBA .............................424
Rozdzia� 13. Wprowadzenie do formularzy UserForm ........................................... 425Jak Excel obs�uguje niestandardowe okna dialogowe .......................................................425Wstawianie nowego formularza UserForm .......................................................................426Dodawanie formantów do formularza UserForm ..............................................................426Formanty okna Toolbox ....................................................................................................428
Formant CheckBox .....................................................................................................428Formant ComboBox ....................................................................................................429Formant CommandButton ...........................................................................................429Formant Frame ............................................................................................................429Formant Image ............................................................................................................429Formant Label .............................................................................................................429Formant ListBox .........................................................................................................429Formant MultiPage ......................................................................................................430Formant OptionButton ................................................................................................430Formant RefEdit ..........................................................................................................430Formant ScrollBar .......................................................................................................430Formant SpinButton ....................................................................................................430Formant TabStrip ........................................................................................................430Formant TextBox ........................................................................................................431Formant ToggleButton ................................................................................................431
Modyfikowanie formantów formularza UserForm ............................................................432Modyfikowanie w�a�ciwo�ci formantów ...........................................................................432
Zastosowanie okna Properties .....................................................................................432Wspólne w�a�ciwo�ci ..................................................................................................435Uwzgl�dnienie wymaga� u�ytkowników preferuj�cych korzystanie z klawiatury .....435
Wy�wietlanie formularza UserForm ..................................................................................438Wy�wietlanie niemodalnych okien formularzy UserForm ..........................................438Wy�wietlanie formularza UserForm na podstawie zmiennej ......................................439adowanie formularza UserForm ................................................................................439Procedury obs�ugi zdarze� ..........................................................................................439
Zamykanie formularza UserForm ......................................................................................439Przyk�ad tworzenia formularza UserForm .........................................................................441
Tworzenie formularza UserForm ................................................................................441Tworzenie kodu procedury wy�wietlaj�cej okno dialogowe .......................................444Testowanie okna dialogowego ....................................................................................444Dodawanie procedur obs�ugi zdarze� ..........................................................................445Sprawdzanie poprawno�ci danych ..............................................................................447Zako�czenie tworzenia okna dialogowego ..................................................................447
Spis tre�ci 11
Zdarzenia powi�zane z formularzem UserForm ................................................................447Zdobywanie informacji na temat zdarze� ....................................................................448Zdarzenia formularza UserForm .................................................................................449Zdarzenia zwi�zane z formantem SpinButton .............................................................449Wspó�praca formantu SpinButton z formantem TextBox ...........................................451
Odwo�ywanie si� do formantów formularza UserForm .....................................................453Dostosowywanie okna Toolbox do w�asnych wymaga� ...................................................454
Dodawanie nowych kart ..............................................................................................455Dostosowywanie lub ��czenie formantów ...................................................................455Dodawanie nowych formantów ActiveX ....................................................................456
Tworzenie szablonów formularzy UserForm ....................................................................457Lista kontrolna tworzenia i testowania formularzy UserForm ...........................................458
Rozdzia� 14. Przyk�ady formularzy UserForm .......................................................... 459Tworzenie formularza UserForm pe�ni�cego funkcj� menu ..............................................459
Zastosowanie w formularzu UserForm formantów CommandButton .........................460Zastosowanie w formularzu UserForm formantu ListBox ..........................................460
Zaznaczanie zakresów przy u�yciu formularza UserForm ................................................461Tworzenie okna powitalnego .............................................................................................463Wy��czanie przycisku Zamknij formularza UserForm ......................................................465Zmiana wielko�ci formularza UserForm ...........................................................................466Powi�kszanie i przewijanie arkusza przy u�yciu formularza UserForm ............................468Zastosowania formantu ListBox ........................................................................................470
Tworzenie listy elementów formantu ListBox ............................................................471Identyfikowanie zaznaczonego elementu listy formantu ListBox ...............................475Identyfikowanie wielu zaznaczonych elementów listy formantu ListBox ........................475Wiele list w jednej kontrolce ListBox .........................................................................476Przenoszenie elementów listy formantu ListBox ........................................................478Zmiana kolejno�ci elementów listy formantu ListBox ................................................479Wielokolumnowe formanty ListBox ...........................................................................480Zastosowanie formantu ListBox do wybierania wierszy arkusza ................................482Uaktywnianie arkusza za pomoc� formantu ListBox ..................................................484
Zastosowanie formantu MultiPage na formularzach UserForm ........................................487Korzystanie z formantów zewn�trznych ............................................................................488Animowanie etykiet ..........................................................................................................490
Rozdzia� 15. Zaawansowane techniki korzystania z formularzy UserForm ......... 493Niemodalne okna dialogowe .............................................................................................493Wy�wietlanie wskanika post�pu zadania .........................................................................497
Tworzenie samodzielnego wskanika post�pu zadania ...............................................498Wy�wietlanie wskanika post�pu zadania za pomoc� formantu MultiPage ................502Wy�wietlanie wskanika post�pu zadania bez korzystania z kontrolki MultiPage .....504
Tworzenie kreatorów .........................................................................................................505Konfigurowanie formantu MultiPage w celu utworzenia kreatora ..............................506Dodawanie przycisków do formularza UserForm kreatora .........................................507Programowanie przycisków kreatora ..........................................................................508Zale�no�ci programowe w kreatorach .........................................................................509Wykonywanie zada� za pomoc� kreatorów ................................................................511
Emulacja funkcji MsgBox .................................................................................................511Emulacja funkcji MsgBox: kod funkcji MyMsgBox ..................................................512Jak dzia�a funkcja MyMsgBox ....................................................................................513Wykorzystanie funkcji MyMsgBox do emulacji funkcji MsgBox ..............................515
Formularz UserForm z formantami, których po�o�enie mo�na zmienia� ..........................515Formularz UserForm bez paska tytu�owego ......................................................................516Symulacja paska narz�dzi za pomoc� formularza UserForm ............................................518
12 Spis tre�ci
Formularze UserForm z mo�liwo�ci� zmiany rozmiaru ....................................................520Obs�uga wielu przycisków formularza UserForm za pomoc� jednej procedury
obs�ugi zdarze� ...............................................................................................................524Wybór koloru za pomoc� formularza UserForm ...............................................................527Wy�wietlanie wykresów na formularzach UserForm ........................................................528
Zapisywanie wykresu w postaci pliku GIF .................................................................529Modyfikacja w�a�ciwo�ci Picture formantu Image .....................................................530
Tworzenie pó�przezroczystych formularzy UserForm .......................................................530Zaawansowane formularze danych ....................................................................................531
Opis ulepszonego formularza danych ..........................................................................533Instalacja dodatku — ulepszonego formularza danych ...............................................533
Puzzle na formularzu UserForm ........................................................................................535Wideo Poker na formularzu UserForm ..............................................................................536
Cz��� V Zaawansowane techniki programowania ....................537Rozdzia� 16. Tworzenie narz�dzi dla Excela w j�zyku VBA .................................. 539
Kilka s�ów o narz�dziach dla programu Excel ..................................................................539Zastosowanie j�zyka VBA do tworzenia narz�dzi ............................................................540Co decyduje o przydatno�ci narz�dzia? .............................................................................541Operacje tekstowe: anatomia narz�dzia .............................................................................541
Kilka s�ów o programie Operacje tekstowe .................................................................542Okre�lenie wymaga� dla narz�dzia Operacje tekstowe ...............................................543Skoroszyt narz�dzia Operacje tekstowe ......................................................................543Jak dzia�a narz�dzie Operacje tekstowe? .....................................................................544Formularz UserForm dla narz�dzia Operacje tekstowe ...............................................545Modu� VBA Module1 .................................................................................................546Modu� formularza UserForm1 .....................................................................................548Poprawa wydajno�ci narz�dzia Operacje tekstowe .....................................................550Zapisywanie ustawie� narz�dzia Operacje tekstowe ...................................................551Implementacja procedury Cofnij .................................................................................553Wy�wietlanie pliku pomocy ........................................................................................554Umieszczanie polece� na Wst��ce ..............................................................................556Ocena realizacji projektu .............................................................................................556Dzia�anie narz�dzia Operacje tekstowe .......................................................................558
Dodatkowe informacje na temat narz�dzi Excela ..............................................................558
Rozdzia� 17. Tabele przestawne .............................................................................. 559Przyk�ad prostej tabeli przestawnej ...................................................................................559
Tworzenie tabel przestawnych ....................................................................................560Analiza zarejestrowanego kodu tworzenia tabeli przestawnej ....................................561Optymalizacja wygenerowanego kodu tworz�cego tabel� przestawn� .......................562
Tworzenie z�o�onych tabel przestawnych .........................................................................565Kod tworz�cy tabel� przestawn� .................................................................................567Jak dzia�a z�o�ona tabela przestawna? .........................................................................568
Jednoczesne tworzenie wielu tabel przestawnych .............................................................569Tworzenie odwróconych tabel przestawnych ....................................................................572
Rozdzia� 18. Wykresy ............................................................................................... 575Podstawowe wiadomo�ci o wykresach ..............................................................................575
Lokalizacja wykresu ....................................................................................................576Rejestrator makr a wykresy .........................................................................................576Model obiektu Chart ....................................................................................................577
Tworzenie wykresów osadzonych na arkuszu danych .......................................................578
Spis tre�ci 13
Tworzenie wykresu na arkuszu wykresu ...........................................................................579Wykorzystanie VBA do uaktywnienia wykresu ................................................................580Przenoszenie wykresu .......................................................................................................582Wykorzystanie VBA do deaktywacji wykresu ..................................................................582Sprawdzanie, czy wykres zosta� uaktywniony ...................................................................583Usuwanie elementów z kolekcji ChartObjects lub Charts .................................................584Przetwarzanie wszystkich wykresów w p�tli .....................................................................585Zmiana rozmiarów i wyrównywanie obiektów ChartObject .............................................587Eksportowanie wykresów ..................................................................................................588
Eksportowanie wszystkich obiektów graficznych .......................................................589Zmiana danych prezentowanych na wykresie ...................................................................590
Modyfikacja danych wykresu na podstawie aktywnej komórki ..................................592Zastosowanie j�zyka VBA do identyfikacji zakresu danych prezentowanych
na wykresie ..............................................................................................................593Wykorzystanie VBA do wy�wietlania dowolnych etykiet danych na wykresie ................596Wy�wietlanie wykresu w oknie formularza UserForm ......................................................598Zdarzenia zwi�zane z wykresami ......................................................................................601
Przyk�ad wykorzystania zdarze� zwi�zanych z wykresami ........................................601Obs�uga zdarze� dla wykresów osadzonych ...............................................................604Przyk�ad: zastosowanie zdarze� dla wykresów osadzonych .......................................606
Jak u�atwi� sobie prac� z wykresami przy u�yciu VBA? ..................................................608Drukowanie wykresów osadzonych na arkuszu ..........................................................608Ukrywanie serii danych poprzez ukrywanie kolumn ...................................................608Tworzenie wykresów, które nie s� po��czone z danymi ..............................................610Wykorzystanie zdarzenia MouseOver do wy�wietlania tekstu ....................................611
Wykresy animowane .........................................................................................................614Przewijanie wykresów .................................................................................................615Tworzenie wykresu krzywych hipocykloidalnych ......................................................617Tworzenie wykresu-zegara ..........................................................................................618
Tworzenie wykresu interaktywnego bez u�ycia VBA .......................................................619Przygotowanie danych do utworzenia wykresu interaktywnego .................................620Tworzenie przycisków opcji dla interaktywnego wykresu ..........................................620Tworzenie listy miast dla wykresu interaktywnego ....................................................621Tworzenie zakresów danych dla wykresu interaktywnego ..........................................621Utworzenie wykresu interaktywnego ..........................................................................623
Tworzenie wykresów przebiegu w czasie ..........................................................................623
Rozdzia� 19. Obs�uga zdarze� ................................................................................. 627Co powiniene� wiedzie� o zdarzeniach .............................................................................627
Sekwencje zdarze� ......................................................................................................628Gdzie nale�y umie�ci� procedury obs�ugi zdarze�? ....................................................628Wy��czanie obs�ugi zdarze� ........................................................................................630Wprowadzanie kodu procedury obs�ugi zdarze� .........................................................631Procedury obs�ugi zdarze� z argumentami ..................................................................632
Zdarzenia poziomu skoroszytu ..........................................................................................634Zdarzenie Open ...........................................................................................................634Zdarzenie Activate ......................................................................................................636Zdarzenie SheetActivate .............................................................................................636Zdarzenie NewSheet ...................................................................................................636Zdarzenie BeforeSave .................................................................................................637Zdarzenie Deactivate ...................................................................................................637Zdarzenie BeforePrint .................................................................................................638Zdarzenie BeforeClose ................................................................................................639
14 Spis tre�ci
Zdarzenia poziomu arkusza ...............................................................................................641Zdarzenie Change ........................................................................................................641Monitorowanie zmian w wybranym zakresie komórek ...............................................642Zdarzenie SelectionChange .........................................................................................647Zdarzenie BeforeDoubleClick .....................................................................................648Zdarzenie BeforeRightClick ........................................................................................648
Zdarzenia dotycz�ce wykresów .........................................................................................649Zdarzenia dotycz�ce aplikacji ...........................................................................................649
W��czenie obs�ugi zdarze� poziomu aplikacji ............................................................651Sprawdzanie, czy skoroszyt jest otwarty .....................................................................653Monitorowanie zdarze� poziomu aplikacji .................................................................654
Zdarzenia dotycz�ce formularzy UserForm .......................................................................655Zdarzenia niezwi�zane z obiektami ...................................................................................655
Zdarzenie OnTime ......................................................................................................655Zdarzenie OnKey ........................................................................................................658
Rozdzia� 20. Interakcje z innymi aplikacjami ........................................................ 663Uruchamianie innych aplikacji z poziomu Excela .............................................................663
Zastosowanie funkcji Shell j�zyka VBA .....................................................................663Zastosowanie funkcji ShellExecute interfejsu Windows API .....................................665
Uaktywnianie aplikacji z poziomu Excela .........................................................................667Wykorzystanie instrukcji AppActivate .......................................................................667Uaktywnianie aplikacji pakietu Microsoft Office .......................................................668
Uruchamianie okien dialogowych Panelu sterowania .......................................................668Wykorzystanie automatyzacji w programie Excel .............................................................669
Dzia�ania z obiektami innych aplikacji z wykorzystaniem automatyzacji ...................670Wczesne i póne wi�zanie ...........................................................................................670Funkcja GetObject a CreateObject ..............................................................................673Prosty przyk�ad pónego wi�zania ..............................................................................673Sterowanie Wordem z poziomu Excela .......................................................................674Zarz�dzanie Excelem z poziomu innej aplikacji .........................................................677
Wysy�anie spersonalizowanych wiadomo�ci e-mail z wykorzystaniem Outlooka ............678Wysy�anie wiadomo�ci e-mail z za��cznikami z poziomu Excela .....................................682Zastosowanie metody SendKeys .......................................................................................684
Rozdzia� 21. Tworzenie i wykorzystanie dodatków ............................................... 685Czym s� dodatki? ..............................................................................................................685
Porównanie dodatku ze standardowym skoroszytem ..................................................686Po co tworzy si� dodatki? ............................................................................................687
Mened�er dodatków Excela ...............................................................................................688Tworzenie dodatków .........................................................................................................689Przyk�ad tworzenia dodatku ..............................................................................................690
Tworzenie opisu dla dodatku ......................................................................................691Tworzenie dodatku ......................................................................................................692Instalowanie dodatku ...................................................................................................693Testowanie dodatków ..................................................................................................694Dystrybucja dodatków .................................................................................................694Modyfikowanie dodatku .............................................................................................695
Porównanie plików XLAM i XLSM .................................................................................695Pliki XLAM — przynale�no�� do kolekcji z poziomu VBA ......................................696Widoczno�� plików XLSM i XLAM ..........................................................................697Arkusze i wykresy w plikach XLSM i XLAM ............................................................697Dost�p do procedur VBA w dodatku ..........................................................................698
Spis tre�ci 15
Przetwarzanie dodatków za pomoc� kodu VBA ................................................................701W�a�ciwo�ci obiektu AddIn ........................................................................................703Korzystanie z dodatku jak ze skoroszytu ....................................................................706Zdarzenia zwi�zane z obiektami Addin .......................................................................706
Optymalizacja wydajno�ci dodatków ................................................................................707Problemy z dodatkami .......................................................................................................708
Zapewnienie, �e dodatek zosta� zainstalowany ...........................................................708Odwo�ywanie si� do innych plików z poziomu dodatku .............................................710Wykrywanie w�a�ciwej wersji Excela dla dodatku .....................................................710
Cz��� VI Tworzenie aplikacji ..........................................................711Rozdzia� 22. Tworzenie pasków narz�dzi ............................................................... 713
Wprowadzenie do pracy ze Wst��k� .................................................................................713VBA i Wst��ka ..................................................................................................................715
Dost�p do polece� Wst��ki .........................................................................................718Praca ze Wst��k� .........................................................................................................719Aktywowanie karty .....................................................................................................721
Dostosowywanie Wst��ki do w�asnych potrzeb ................................................................721Prosty przyk�ad kodu RibbonX ...................................................................................722Prosty przyk�ad kodu RibbonX — podej�cie 2 ...........................................................725Kolejny przyk�ad kodu RibbonX .................................................................................730Demo formantów Wst��ki ...........................................................................................732Przyk�ad u�ycia formantu DynamicMenu ...................................................................738Wi�cej wskazówek dotycz�cych modyfikacji Wst��ki ...............................................741
Tworzenie pasków narz�dzi w starym stylu ......................................................................742Ograniczenia funkcjonalno�ci tradycyjnych pasków narz�dzi w Excelu 2010 ...........742Kod tworz�cy pasek narz�dzi ......................................................................................743
Rozdzia� 23. Praca z menu podr�cznym ................................................................ 747Obiekt CommandBar .........................................................................................................747
Rodzaje obiektów CommandBar .................................................................................748Wy�wietlanie menu podr�cznych ................................................................................748Odwo�ania do elementów kolekcji CommandBars .....................................................749Odwo�ania do formantów w obiekcie CommandBar ...................................................750W�a�ciwo�ci formantów obiektu CommandBar ..........................................................751Wy�wietlanie wszystkich elementów menu podr�cznego ...........................................752
Wykorzystanie VBA do dostosowywania menu podr�cznego ..........................................754Resetowanie menu podr�cznego .................................................................................755Wy��czanie menu podr�cznego ...................................................................................755Wy��czanie wybranych elementów menu podr�cznego ..............................................756Dodawanie nowego elementu do menu podr�cznego Cell ..........................................756Dodawanie nowego podmenu do menu podr�cznego .................................................758
Menu podr�czne i zdarzenia ..............................................................................................761Automatyczne tworzenie i usuwanie menu podr�cznego ............................................761Wy��czanie lub ukrywanie elementów menu podr�cznego .........................................762Tworzenie kontekstowych menu podr�cznych ............................................................762
Rozdzia� 24. Tworzenie systemów pomocy w aplikacjach .................................. 765Systemy pomocy w aplikacjach Excela .............................................................................765
Pomoc online ...............................................................................................................766Systemy pomocy wykorzystuj�ce komponenty Excela .....................................................766
Wykorzystanie komentarzy do tworzenia systemów pomocy .....................................768Wykorzystanie pól tekstowych do wy�wietlania pomocy ...........................................769
16 Spis tre�ci
Wykorzystanie arkusza do wy�wietlania tekstu pomocy .............................................770Wy�wietlanie pomocy w oknie formularza UserForm ................................................771
Wy�wietlanie pomocy w oknie przegl�darki sieciowej .....................................................774Zastosowanie plików w formacie HTML ....................................................................774Zastosowanie plików w formacie MHTML ................................................................775
Wykorzystanie systemu HTML Help ................................................................................776Wykorzystanie metody Help do wy�wietlania pomocy w formacie HTML Help .......779
�czenie pliku pomocy z aplikacj� ....................................................................................780Przypisanie tematów pomocy do funkcji VBA ...........................................................780
Rozdzia� 25. Tworzenie aplikacji przyjaznych dla u�ytkownika ........................... 783Czym jest aplikacja przyjazna dla u�ytkownika? ..............................................................783Kreator amortyzacji po�yczek ...........................................................................................783
Obs�uga Kreatora amortyzacji po�yczek .....................................................................784Struktura skoroszytu Kreatora amortyzacji po�yczek .................................................785Jak dzia�a Kreator amortyzacji po�yczek? ..................................................................786Potencjalne usprawnienia Kreatora amortyzacji po�yczek ..........................................793
Wskazówki dotycz�ce projektowania aplikacji .................................................................793
Cz��� VII Inne zagadnienia .............................................................795
Rozdzia� 26. Problem kompatybilno�ci aplikacji .................................................. 797Co to jest kompatybilno��? ................................................................................................797Rodzaje problemów ze zgodno�ci� ...................................................................................798Unikaj u�ywania nowych funkcji i mechanizmów ............................................................799Czy aplikacja b�dzie dzia�a� na komputerach Macintosh? ................................................801Praca z 64-bitow� wersj� Excela .......................................................................................802Tworzenie aplikacji dla wielu wersji narodowych ............................................................803
Aplikacje obs�uguj�ce wiele j�zyków .........................................................................805Obs�uga j�zyka w kodzie VBA ...................................................................................805Wykorzystanie w�a�ciwo�ci lokalnych ........................................................................806Identyfikacja ustawie� systemu ...................................................................................807Ustawienia daty i godziny ...........................................................................................809
Rozdzia� 27. Operacje na plikach wykonywane za pomoc� kodu VBA ........... 811Najcz��ciej wykonywane operacje na plikach ...................................................................811
Zastosowanie polece� j�zyka VBA do wykonywania operacji na plikach ..................812Zastosowanie obiektu FileSystemObject .....................................................................816
Wy�wietlanie rozszerzonych informacji o plikach ............................................................820Operacje z plikami tekstowymi .........................................................................................821
Otwieranie plików tekstowych ....................................................................................822Odczytywanie plików tekstowych ...............................................................................823Zapisywanie danych do plików tekstowych ................................................................823Przydzielanie numeru pliku .........................................................................................823Okre�lanie lub ustawianie pozycji w pliku ..................................................................824Instrukcje pozwalaj�ce na odczytywanie i zapisywanie plików ..................................824
Przyk�ady wykonywania operacji na plikach ....................................................................825Importowanie danych z pliku tekstowego ...................................................................825Eksportowanie zakresu do pliku tekstowego ...............................................................827Importowanie pliku tekstowego do zakresu ................................................................828Rejestrowanie wykorzystania Excela ..........................................................................829Filtrowanie zawarto�ci pliku tekstowego ....................................................................830Eksportowanie zakresu komórek do pliku HTML ......................................................830Eksportowanie zakresu komórek do pliku XLM .........................................................832
Spis tre�ci 17
Pakowanie i rozpakowywanie plików ...............................................................................835Pakowanie plików do formatu ZIP ..............................................................................836Rozpakowywanie plików ZIP .....................................................................................838
Dzia�ania z obiektami danych ActiveX (ADO) .................................................................838
Rozdzia� 28. Operacje na sk�adnikach j�zyka VBA ............................................. 841Podstawowe informacje o �rodowisku IDE .......................................................................841Model obiektowy �rodowiska IDE ....................................................................................843
Kolekcja VBProjects ...................................................................................................844Wy�wietlanie wszystkich sk�adników projektu VBA ........................................................846Wy�wietlanie wszystkich procedur VBA w arkuszu .........................................................847Zast�powanie modu�u uaktualnion� wersj� .......................................................................848Zastosowanie j�zyka VBA do generowania kodu VBA .......................................................850Zastosowanie VBA do umieszczenia formantów na formularzu UserForm ......................852
Operacje z formularzami UserForm w fazie projektowania i wykonania ....................852Dodanie 100 przycisków CommandButton w fazie projektowania .............................854
Programowe tworzenie formularzy UserForm ..................................................................855Prosty przyk�ad formularza UserForm ........................................................................855U�yteczny (ale ju� nie tak prosty) przyk�ad dynamicznego formularza UserForm .....857
Rozdzia� 29. Modu�y klas ......................................................................................... 863Czym jest modu� klasy? .....................................................................................................863Przyk�ad: utworzenie klasy NumLock ...............................................................................864
Wstawianie modu�u klasy ...........................................................................................865Dodawanie kodu VBA do modu�u klasy .....................................................................865Wykorzystanie klasy NumLock ..................................................................................867
Dodatkowe informacje na temat modu�ów klas .................................................................868Programowanie w�a�ciwo�ci obiektów .......................................................................868Programowanie metod obiektów .................................................................................870Zdarzenia definiowane w module klasy ......................................................................871
Przyk�ad: klasa CSVFileClass ...........................................................................................871Zmienne poziomu modu�u dla klasy CSVFileClass ....................................................872Definicje w�a�ciwo�ci klasy CSVFileClass .................................................................872Definicje metod klasy CSVFileClass ..........................................................................872Wykorzystanie obiektów CSVFileClass .....................................................................874
Rozdzia� 30. Praca z kolorami ................................................................................. 877Definiowanie kolorów .......................................................................................................877
Model kolorów RGB ...................................................................................................878Model kolorów HSL ....................................................................................................878Konwersja kolorów .....................................................................................................879
Skala szaro�ci ....................................................................................................................880Zamiana kolorów na skal� szaro�ci .............................................................................883Wy�wietlanie wykresów w skali szaro�ci ....................................................................883
Eksperymenty z kolorami ..................................................................................................885Praca z motywami dokumentów ........................................................................................886
Kilka s�ów o motywach dokumentów .........................................................................886Kolory motywów dokumentów ...................................................................................887Wy�wietlanie wszystkich kolorów motywu ................................................................890
Praca z obiektami Shape ....................................................................................................893Kolor t�a kszta�tu .........................................................................................................893Kszta�ty i kolory motywów .........................................................................................895Przyk�ady kszta�tów ....................................................................................................897
Modyfikacja kolorów wykresów .......................................................................................897
18 Spis tre�ci
Rozdzia� 31. Cz�sto zadawane pytania na temat programowania w Excelu .... 901FAQ — czyli cz�sto zadawane pytania .............................................................................901Ogólne pytania dotycz�ce programu Excel .......................................................................902Pytania dotycz�ce edytora Visual Basic ............................................................................908Pytania dotycz�ce procedur ...............................................................................................911Pytania dotycz�ce funkcji ..................................................................................................916Pytania dotycz�ce obiektów, w�a�ciwo�ci, metod i zdarze� ..............................................919Pytania dotycz�ce formularzy UserForm ...........................................................................928Pytania dotycz�ce dodatków .............................................................................................932Pytania dotycz�ce pasków polece� ....................................................................................934
Cz��� VIII Dodatki ..............................................................................937Dodatek A Zasoby online dotycz�ce Excela ...................................................... 939
Pomoc systemowa programu Excel ...................................................................................939Pomoc techniczna firmy Microsoft ...................................................................................940
Opcje pomocy technicznej ..........................................................................................940Baza wiedzy firmy Microsoft ......................................................................................940Strona domowa programu Microsoft Excel .................................................................940Strona domowa pakietu Microsoft Office ...................................................................940
Internetowe grupy dyskusyjne ...........................................................................................941Dost�p do grup dyskusyjnych za pomoc� czytników grup dyskusyjnych ................941Dost�p do grup dyskusyjnych za pomoc� przegl�darki sieciowej ...............................941Wyszukiwanie informacji w grupach dyskusyjnych ...................................................942
Strony internetowe WWW ................................................................................................943Strona domowa Spreadsheet .......................................................................................943Strona Daily Dose of Excel .........................................................................................944Strona o Excelu Jona Peltiera ......................................................................................944Pearson Software Consulting ......................................................................................944Contextures .................................................................................................................944Pointy Haired Dilbert ..................................................................................................944Strony o Excelu Davida McRitchie .............................................................................945Mr. Excel .....................................................................................................................945
Dodatek B Instrukcje i funkcje VBA ...................................................................... 947Wywo�ywanie funkcji Excela w instrukcjach VBA ..........................................................950
Dodatek C Kody b��dów VBA ............................................................................... 957
Dodatek D Zawarto�� p�yty CD-ROM ................................................................... 961
Skorowidz ............................................................................................. 977
Rozdzia� 11.Przyk�adyi techniki programowaniaw j�zyku VBA
W tym rozdziale:
� Zastosowanie VBA do pracy z zakresami
� Zastosowanie VBA do pracy ze skoroszytami i arkuszami
� Tworzenie w�asnych funkcji i u�ywanie ich w formu�ach arkusza i procedurach VBA
� Przyk�ady technik programowania w j�zyku VBA
� Przyk�ady zastosowania funkcji interfejsu API
Nauka poprzez praktyk�Wierz�, �e nauka programowania odbywa si� znacznie szybciej, kiedy pracujemy na kon-kretnych przyk�adach omawianych zagadnie�, a Czytelnicy poprzednich wyda� ksi��kizdecydowanie utwierdzaj� mnie w tym przekonaniu. Takie podej�cie sprawdza si� zw�asz-cza dla programistów pracuj�cych z j�zykiem VBA. Dobrze opracowany przyk�ad o wielelepiej obja�nia zagadnienie ni� teoretyczny opis. W zwi�zku z tym zrezygnowa�em z mate-ria�u referencyjnego, w którym dok�adnie opisywano by wszystkie, nawet najdrobniejszeaspekty j�zyka VBA, a zamiast tego przygotowa�em przyk�ady demonstruj�ce u�yteczne,praktyczne techniki programowania przy u�yciu Excela.
Poprzednie rozdzia�y tej cz��ci ksi��ki odpowiednio przygotowa�y Czytelników do pozna-wania zagadnie� omawianych w tym rozdziale, natomiast w systemie pomocy programuExcel znajdziesz wszystkie informacje, które tutaj zosta�y pomini�te. W tym rozdzialezwi�kszy si� nieco tempo i zaprezentowanych zostanie sporo przyk�adów rozwi�zuj�cychproblemy spotykane w praktyce i pozwalaj�cych pog��bi� wiedz� na temat j�zyka VBA.
342 Cz��� III � J�zyk Visual Basic for Applications
Przyk�ady omawiane w tym rozdziale zosta�y podzielone na sze�� kategorii:
� Praca z zakresami
� Praca ze skoroszytami i arkuszami
� Techniki programowania w j�zyku VBA
� U�yteczne funkcje, których warto u�ywa� w procedurach VBA
� U�yteczne funkcje, których mo�esz u�ywa� w formu�ach arkuszowych
� Wywo�ania funkcji i procedur Windows API
W kolejnych rozdzia�ach naszej ksi��ki znajdziesz szereg przyk�adów procedur dotycz�cychm.in. takich zagadnie, jak wykresy, tabele przestawne, zdarzenia, formularze UserFormi inne.
Przetwarzanie zakresówPrzyk�ady zamieszczone w tym podrozdziale demonstruj�, w jaki sposób za pomoc� j�zykaVBA mo�na manipulowa� zakresami arkusza.
W szczególno�ci znajdziesz tutaj przyk�ady procedur, które pozwalaj� na kopiowaniei przenoszenie zakresów komórek, zaznaczanie zakresów komórek, identyfikacj� typówdanych przechowywanych w danym zakresie komórek, wprowadzanie warto�ci do komórekprzez u�ytkownika, wyszukiwanie pierwszej pustej komórki w kolumnie, zatrzymywa-nie makra w celu umo�liwienia u�ytkownikowi zaznaczenia zakresu, zliczanie komórekw zakresie, przechodzenie w p�tli i przetwarzanie kolejnych komórek zakresu oraz kilkainnych operacji, cz�sto wykonywanych na zakresach komórek arkusza.
Kopiowanie zakresów
Rejestrator makr Excela jest bardzo przydatny nie tyle do generowania wydajnego,u�ytecznego kodu ród�owego, co do „odkrywania” nazw odpowiednich obiektów, metodi w�a�ciwo�ci. Kod ród�owy generowany przez rejestrator makr nie zawsze jest opty-malny i efektywny, ale zwykle pozwala uzyska� sporo przydatnych informacji.
Przyk�adowo po zarejestrowaniu prostej operacji kopiowania i wklejania, generowanychjest pi�� wierszy kodu ród�owego j�zyka VBA:Sub Makro1() Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste Application.CutCopyMode = FalseEnd Sub
Wygenerowany kod najpierw powoduje zaznaczenie i skopiowanie komórki A1, a nast�pnie,po zaznaczeniu komórki B1, procedura wykonuje operacj� wklejania. Jednak w j�zyku VBAnie jest konieczne zaznaczanie obiektu, który b�dzie przetwarzany. O tej istotnej sprawie
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 343
Jak korzysta� z przyk�adów zamieszczonych w tym rozdziale?
Nie wszystkie przyk�ady zamieszczone w tym rozdziale mog� spe�nia� rol� samodzielnych progra-mów, ale zawsze maj� posta� wykonywalnych procedur, które mo�esz dostosowa� do w�asnychpotrzeb i u�y� w swoich aplikacjach.
W trakcie lektury powiniene� na bie��co pracowa� z komputerem i samodzielnie testowa� opisy-wane w tym rozdziale przyk�ady (i nie tylko). Jeszcze lepiej b�dzie, je�eli b�dziesz próbowa� samo-dzielnie modyfikowa� przyk�ady i sprawdza�, jaki b�dzie efekt tych modyfikacji. Mog� Ci zagwa-rantowa�, �e takie praktyczne do�wiadczenia b�d� o wiele bardziej pomocne ni� przeczytanie oddeski do deski ksi��ki zawieraj�cej tylko teoretyczn� stron� programowania w j�zyku VBA.
nie dowiedzia�by� si� nigdy, gdyby� wzorowa� si� tylko na kodzie ród�owym zarejestro-wanego makra, w którym w dwóch instrukcjach zosta�a u�yta metoda Select. Zamiasttego, mo�esz pos�u�y� si� znacznie prostsz� procedur�, która nie zaznacza �adnych komóreki korzysta z tego, �e metoda Copy mo�e u�y� argumentu reprezentuj�cego miejsce doce-lowe kopiowanego zakresu.Sub CopyRange() Range("A1").Copy Range("B1")End Sub
W obu powy�szych makrach przyj�to za�o�enie, �e arkusz, w którym wykonywana jestoperacja, jest aktywny. Aby skopiowa� zakres do innego arkusza lub skoroszytu, wystarczyodpowiednio zdefiniowa� odwo�anie do zakresu docelowego. W poni�szym przyk�adziezakres jest kopiowany z arkusza Arkusz1 skoroszytu Plik1.xlsm do arkusza Arkusz2 sko-roszytu Plik2.xlsm. Poniewa� odwo�ania s� w pe�ni kwalifikowane, procedura zadzia�aniezale�nie od tego, który skoroszyt b�dzie 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 obiektowychreprezentuj�cych zakresy, tak jak to zosta�o zilustrowane w kodzie poni�szego przyk�adu: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 Rng2End Sub
Jak si� zapewne domy�lasz, kopiowanie nie jest ograniczone tylko do jednej komórki naraz. Przyk�adowo, procedura przedstawiona poni�ej kopiuje du�y 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. U�ycie jednej komórki dzia�a dok�adnie tak,jak podczas r�cznego kopiowania i wklejania komórek arkusza.Sub CopyRange4() Range("A1:C800").Copy Range("D1")End Sub
344 Cz��� III � J�zyk Visual Basic for Applications
Przenoszenie zakresów
Instrukcje j�zyka VBA s�u��ce do przenoszenia zakresu s� bardzo podobne do instrukcjiu�ywanych podczas kopiowania zakresów, tak jak to zosta�o zaprezentowane na poni�-szym przyk�adzie. Ró�nica polega na tym, �e zamiast metody Copy u�yta zosta�a metodaCut. Pami�taj, �e musisz poda� tylko lokalizacj� górnej, lewej komórki zakresu docelowego.
W przyk�adzie przedstawionym poni�ej 18 komórek (z zakresu A1:C6) przenosimyw nowy obszar, rozpoczynaj�cy si� od adresu H1.Sub MoveRange1() Range("A1:C6").Cut Range("H1")End Sub
Kopiowanie zakresu o zmiennej wielko�ci
W wielu przypadkach konieczne jest skopiowanie zakresu komórek, dla którego dok�adnaliczba wierszy i kolumn okre�laj�cych jego wielko�� nie jest z góry znana. Przyk�adowomo�esz dysponowa� skoroszytem �ledz�cym tygodniow� sprzeda�, w którym liczba wierszyzmienia si� ka�dego tygodnia po wprowadzeniu nowych danych.
Na rysunku 11.1 pokazano bardzo cz�sto spotykany typ arkusza. Zawarty w nim zakressk�ada si� z kilku wierszy, których liczba zmienia si� ka�dego tygodnia. Poniewa� niewiesz, jaki jest adres zakresu w danej chwili, podczas pisania makra kopiuj�cego zakresb�dziesz uwzgl�dni� nieco dodatkowego kodu ród�owego.
Rysunek 11.1.Liczba wierszy zakresudanych zmienia si�ka�dego tygodnia
Poni�sze makro ilustruje sposób kopiowania zakresu komórek z arkusza Arkusz1 do arkuszaArkusz2 (pocz�wszy od komórki A1). Makro wykorzystuje w�a�ciwo�� CurrentRegion,która zwraca obiekt Range odpowiadaj�cy blokowi komórek otaczaj�cych okre�lon�komórk� (w tym przypadku o adresie A1).Sub CopyCurrentRegion2() Range("A1").CurrentRegion.Copy Sheets("Arkusz2").Range("A1")End Sub
Zastosowanie w�a�ciwo�ci CurrentRegion jest równowa�ne przej�ciu na kart� Narz�dziag�ówne i wybraniu polecenia Znajd i zaznacz/Przejd do — specjalnie, znajduj�cegosi� w grupie opcji Edycja i nast�pnie zaznaczeniu opcji Bie��cy obszar (zamiast tegomo�esz równie� nacisn�� kombinacj� klawiszy Ctrl+Shift+*). Aby przekona� si�, jakto dzia�a, podczas wykonywania tych polece powiniene� zarejestrowa� makro. Zazwyczajwarto�� w�a�ciwo�ci CurrentRegion reprezentuje prostok�tny blok komórek otoczonyprzez puste wiersze i kolumny.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 345
Wskazówki dotycz�ce przetwarzania zakresów
W trakcie przetwarzania zakresów powiniene� pami�ta� o kilku wa�nych kwestiach.
� W j�zyku VBA, do przetwarzania zakresu nie jest konieczne jego uprzednie zanaczenie.
� Nie mo�esz zaznaczy� zakresu, który znajduje si� na nieaktywnym arkuszu, zatem, je�eli Twojaprocedura zaznacza zakres, powi�zany z nim arkusz musi by� aktywny. W celu uaktywnieniaokre�lonego arkusza mo�na u�y� metody Activate kolekcji Worksheets.
� Pami�taj, �e rejestrator makr nie generuje zbyt wydajnego kodu �ród�owego. Najlepiej utworzy�makro przy u�yciu rejestratora, a nast�pnie jego kod �ród�owy zmodyfikowa� w celu zwi�kszeniaefektywno�ci.
� W kodzie �ród�owym j�zyka VBA warto stosowa� nazwane zakresy. Przyk�adowo odwo�anieRange("Total") jest znacznie bardziej czytelne ni� odwo�anie Range("D45"). W tym drugimprzypadku dodanie wiersza powy�ej wiersza 45. spowoduje zmian� adresu komórkii w konsekwencji konieczne b�dzie zmodyfikowanie makra tak, aby u�ywa�o zakresuo poprawnym adresie (D46).
� Je�eli w trakcie zaznaczania zakresów korzystasz z rejestratora makr, upewnij si�, �e makrorejestrowane jest przy u�yciu odwo�a wzgl�dnych. Aby to zrobi�, przejd� na kart� Deweloperi naci�nij przycisk U�yj odwo�a� wzgl�dnych, znajduj�cy si� w grupie opcji Kod.
� Po uruchomieniu makra przetwarzaj�cego kolejne komórki aktualnie zaznaczonego zakresu,u�ytkownik mo�e zaznacza� ca�e wiersze lub kolumny. W wi�kszo�ci przypadków nie ma potrzebyprzetwarzania wszystkich komórek zaznaczonego zakresu. Tworzone makro powinno definiowa�podzbiór zaznaczenia zawieraj�cy wy��cznie niepuste komórki. Wi�cej szczegó�owych informacjina ten temat znajdziesz w podrozdziale „Wydajne przetwarzanie komórek zaznaczonego zakresuprzy u�yciu p�tli” w dalszej cz��ci rozdzia�u.
� Excel pozwala zaznacza� wiele obszarów jednocze�nie. Na przyk�ad mo�esz zaznaczy� pierwszyzakres, wcisn�� klawisz Ctrl i zaznaczy� kolejny zakres. Makro powinno dokona� sprawdzeniazakresu i podj�� odpowiedni� decyzj�. Zapoznaj si� z zawarto�ci� punktu „Okre�lanie typuzaznaczonego zakresu” w dalszej cz��ci rozdzia�u.
Je�eli zakres komórek, który chcesz skopiowa� jest tabel� (zdefiniowan� przy u�yciapolecenia Tabela, znajduj�cego si� nakrcie Narz�dzia g�ówne, w grupie polece� Tabele),mo�esz u�y� kodu przedstawionego poni�ej (który zak�ada, �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
Wi�kszo�� operacji wykonywanych przez instrukcje j�zyka VBA opiera si� na zakre-sach — poprzez definiowanie zakresów lub identyfikowanie zakresów w celu wykony-wania operacji na komórkach do nich nale��cych.
Oprócz w�a�ciwo�ci CurrentRegion (o której mówili�my ju� wcze�niej) powiniene�równie� pozna� metod� End obiektu Range. Metoda ta pobiera jeden argument okre�laj�cykierunek, w którym zostanie wykonane zaznaczenie. Poni�sze polecenie zaznacza zakresrozpoczynaj�cy si� od aktywnej komórki i ko�cz�cy na ostatniej niepustej dolnej komórce:Range(ActiveCell, ActiveCell.End(xlDown)).Select
346 Cz��� III � J�zyk Visual Basic for Applications
Poni�ej zamieszczamy kolejny przyk�ad, w którym zosta�a zdefiniowana komórka b�d�capocz�tkiem zakresu:Range(Range("A2"), Range("A2").End(xlDown)).Select
Jak mo�na si� domy�li�, trzy pozosta�e sta�e (xlUp, xlToLeft, xlToRight) symuluj� kom-binacje klawiszy zaznaczaj�ce komórki w innych kierunkach.
Korzystaj�c z w�a�ciwo�ci ActiveCell w powi�zaniu z metod� End, powiniene� zachowa�szczególn� ostro�no��. Je�eli aktywna komórka znajduje si� na kocu zakresu lub je�eliw sk�ad zakresu wchodzi jedna lub wi�cej pustych komórek, wyniki dzia�ania metody Endmog� by� zupe�nie inne od oczekiwanych.
Na do��czonym dysku CD-ROM znajduje si� skoroszyt (Zaznaczanie zakresów.xlsm)ilustruj�cy najcz��ciej spotykane rodzaje zaznacze zakresów. Po jego otwarciu, w menupodr�cznym pojawi si� nowe podmenu o nazwie Przyk�ady zaznacze�. Poszczególnepolecenia menu umo�liwiaj� u�ytkownikowi zapoznanie si� z przyk�adami ró�nych rodzajówzaznacze (patrz rysunek 11.2).
Poni�sze makro, o nazwie SelectCurrentRegion znajduje si� w przyk�adowym skoro-szycie i symuluje naci�ni�cie kombinacji klawiszy Ctrl+Shift+*:Sub SelectCurrentRegion() ActiveCell.CurrentRegion.SelectEnd Sub
Bardzo cz�sto zaznaczanie komórek jest tylko wst�pem do innych operacji, na przyk�adformatowania. Procedur� zaznaczaj�c� komórki mo�na �atwo przystosowa� do tego celu.Procedura przedstawiona poni�ej jest prost� modyfikacj� makra SelectCurrentRegion,która nie zaznacza komórek, a jedynie formatuje zakres zdefiniowany jako bie��cy obszarotaczaj�cy aktywn� komórk�. Inne procedury znajduj�ce si� w przyk�adowym skoroszyciete� mog� zosta� przystosowane w ten sposób.Sub FormatCurrentRegion() ActiveCell.CurrentRegion.Font.Bold = TrueEnd Sub
Wprowadzanie warto�ci do komórki
Kolejna procedura przedstawiona poni�ej demonstruje, jak poprosi� u�ytkownika o poda-nie warto�ci i wstawi� j� do komórki A1 aktywnego arkusza:Sub GetValue1() Range("A1").Value = InputBox("Wprowad� warto��:")End Sub
Na rysunku 11.3 pokazano wygl�d okna umo�liwiaj�cego wprowadzenie warto�ci.
Przedstawiona procedura mo�e sprawia� jednak pewien problem. Je�eli u�ytkownik naci-�nie w oknie dialogowym przycisk Cancel, procedura usunie wszelkie dane ju� znajduj�cesi� w komórce. Poni�sza zmodyfikowana wersja procedury sprawdza, czy zosta� naci-�ni�ty przycisk Cancel i je�eli tak, nie dokonuje zmiany zawarto�ci komórki:
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 347
Rysunek 11.2. Niestandardowe menu podr�czne w tym skoroszycie ilustruje zaznaczanie zakresówo ró�nej wielko�ci
Rysunek 11.3.Funkcja InputBoxpobiera warto��,która zostanieumieszczonaw komórce
Sub GetValue2() Dim UserEntry As String UserEntry = InputBox("Wprowad� warto��:") If UserEntry <> "" Then Range("A1").Value = UserEntryEnd Sub
348 Cz��� III � J�zyk Visual Basic for Applications
W wielu przypadkach konieczne b�dzie sprawdzenie poprawno�ci danych wprowadzo-nych przez u�ytkownika. Na przyk�ad chcesz, aby u�ytkownik wprowadzi� liczb� z zakresuod 1 do 12. W poni�szym przyk�adzie zademonstrowano jedn� z metod sprawdzeniapoprawno�ci danych. Niepoprawna warto�� jest ignorowana, a okno wy�wietlane ponow-nie. Operacja jest powtarzana do momentu wprowadzenia prawid�owej warto�ci lub naci-�ni�cia 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 = UserEntryEnd Sub
Je�eli u�ytkownik wprowadzi niepoprawn� warto��, program odpowiednio zmieni tre��wy�wietlanego komunikatu (patrz rysunek 11.4).
Rysunek 11.4.Sprawdzeniepoprawno�ci danychwprowadzonychprzez u�ytkownikaprzy u�yciu funkcjiInputBox j�zyka VBA
Skoroszyt zawieraj�cy wszystkie trzy przyk�ady (Funkcja InputBox.xlsm) znajdzieszna p�ycie CD-ROM do��czonej do ksi��ki.
Wprowadzanie warto�ci do nast�pnej pustej komórki
Cz�sto wymagan� operacj� jest wprowadzenie warto�ci do nast�pnej pustej komórkikolumny lub wiersza. Poni�sza procedura prosi u�ytkownika o podanie imienia i warto�ci,a nast�pnie wprowadza dane do nast�pnego pustego wiersza (patrz rysunek 11.5).
Sub GetData() Dim NextRow As Long Dim Entry1 As String, Entry2 As StringDo 'Odszukaj nast�pny pusty wiersz NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 349
Rysunek 11.5.Makro wstawiaj�cedane do nast�pnegopustego wierszaarkusza
' 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 LoopEnd Sub
Dla uproszczenia nasza procedura w �aden sposób nie sprawdza poprawno�ci wprowa-dzanych danych. Zwró� uwag�, �e w procedurze nie zosta� okre�lony warunek zako�cze-nia p�tli. W celu jej opuszczenia u�yto instrukcji Exit Sub, która jest wykonywana ponaci�ni�ciu przycisku Cancel w oknie wprowadzania danych.
Skoroszyt zawieraj�cy oba przyk�ady (Nast�pnaPustaKomórka.xlsm) znajdziesz na p�ycieCD-ROM do��czonej do ksi��ki.
Zwró� uwag� na instrukcj� okre�laj�c� warto�� zmiennej NextRow. Je�eli nie rozumiesz,w jaki sposób procedura dzia�a, spróbuj r�cznie wykona� realizowan� przez ni� operacj�:uaktywnij ostatni� komórk� w kolumnie A (co w przypadku Excela 2010 oznacza komórk�o adresie A1048576), naci�nij klawisz End i nast�pnie naci�nij klawisz � (strza�ka w gór�).W efekcie zostanie zaznaczona ostatnia niepusta komórka kolumny A. W�a�ciwo�� Rowzwraca numer wiersza tej komórki. W celu uzyskania numeru kolejnego pustego wiersza(poni�ej) warto�� ta jest zwi�kszana o jeden. Zamiast umieszcza� na „sztywno” adresostatniej komórki wiersza A, u�yta zosta�a metoda Rows.Count, dzi�ki czemu nasza proce-dura b�dzie poprawnie dzia�a�a równie� z poprzednimi wersjami programu Excel (w którychmaksymalna liczba wierszy w arkuszu jest du�o mniejsza).
Z tak� metod� zaznaczania nast�pnej pustej komórki zwi�zany jest drobny problem. Je�elikolumna jest zupe�nie pusta, jako nast�pny pusty wiersz metoda wyznaczy wiersz 2. Naszcz��cie dodanie odpowiedniego kodu, który b�dzie zapobiega� takiemu zachowaniu, niejest trudnym zadaniem.
350 Cz��� III � J�zyk Visual Basic for Applications
Wstrzymywanie dzia�ania makra w celu umo�liwieniapobrania zakresu wyznaczonego przez u�ytkownika
Zdarzaj� si� sytuacje, w których makro musi by� w pewien sposób interaktywne. Naprzyk�ad mo�esz utworzy� makro, które wstrzymuje dzia�anie, pozwalaj�c u�ytkownikowina zaznaczenie wybranego zakresu komórek. Procedura opisana w tym punkcie demonstrujesposób wykonania zadania przy u�yciu metody InputBox Excela.
Nie nale�y myli� metody InputBox Excela z funkcj� j�zyka VBA o takiej samej nazwie.Co prawda obie funkcje maj� tak� sam� nazw�, ale nie s� takie same.
Poni�sza procedura Sub demonstruje sposób zatrzymania pracy makra i umo�liwieniau�ytkownikowi zaznaczenia zakresu komórek. Po wznowieniu dzia�ania procedura wstawiaodpowiedni� formu�� do wszystkich komórek zaznaczonego zakresu.Sub GetUserRange() Dim UserRange As Range
Prompt = "Zaznacz wybrany zakres komórek." Title = "Wybieranie zakresu komórek"
' Wy�wietlanie 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 zosta�o anulowane? If UserRange Is Nothing Then MsgBox "Operacja anulowana." Else UserRange.Formula = "=RAND()" End IfEnd Sub
Okno dialogowe zosta�o przedstawione na rysunku 11.6.
Skoroszyt z tym przyk�adem (Zaznacz zakres.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Podanie argumentu Type o warto�ci 8 ma kluczowe znaczenie dla powy�szej procedury.Oprócz tego powiniene� równie� zwróci� uwag� na zastosowanie instrukcji On ErrorResume Next. To polecenie powoduje, �e b��d, który wyst�pi gdy u�ytkownik naci�nie przy-cisk Anuluj, b�dzie ignorowany. Je�eli tak si� stanie, nie zostanie zdefiniowana zmiennaobiektowa UserRange. W powy�szym przyk�adzie jest wy�wietlane okno zawieraj�ce komu-nikat o tre�ci Operacja anulowana. Gdy u�ytkownik naci�nie przycisk OK, wykonywaniemakra b�dzie kontynuowane. Instrukcja On Error GoTo 0 przywraca standardow� obs�ug�b��dów.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 351
Rysunek 11.6. Okno dialogowe u�yte do wstrzymania dzia�ania makra
Nawiasem mówi�c, sprawdzanie poprawno�ci zaznaczonego zakresu nie jest konieczne,poniewa� zajmie si� tym Excel.
Pami�taj, podczas u�ywania metody InputBox do zaznaczania zakresu komórekod�wie�anie ekranu powinno by� zawsze w��czone. W przeciwnym wypadku nie b�dzieszw stanie zaznaczy� zakresu komórek. Do sterowania od�wie�aniem ekranu w trakciewykonywania makra powiniene� u�y� w�a�ciwo�ci ScreenUpdating obiektu Application.
Zliczanie zaznaczonych komórek
Mo�na stworzy� makro przetwarzaj�ce zaznaczone komórki zakresu. Aby okre�li� liczb�komórek w zaznaczonym zakresie (lub dowolnym innym), nale�y u�y� w�a�ciwo�ci Countobiektu Range. Przyk�adowo poni�sza instrukcja wy�wietla w oknie komunikatu liczb�aktualnie zaznaczonych komórek:MsgBox Selection.Count
Je�eli aktywny arkusz zawiera zakres o nazwie dane, polecenie przedstawione poni�ej przy-pisze liczb� jego komórek zmiennej CellCount:CellCount = Range("dane").Count
Mo�esz równie� okre�li� liczb� wierszy lub kolumn w zakresie. Poni�sze wyra�enie wyzna-cza liczb� kolumn znajduj�cych si� w aktualnie zaznaczonym zakresie:Selection.Columns.Count
352 Cz��� III � J�zyk Visual Basic for Applications
Ze wzgl�du na fakt, �e w najnowszych wersjach Excela (2007 i 2010) maksymalnerozmiary arkusza zosta�y znacz�co powi�kszone, w�a�ciwo�� Count mo�e w pewnychsytuacjach generowa� b��d. W�a�ciwo�� Count wykorzystuje dane typu Long, zatemnajwi�ksza warto��, jak� ta w�a�ciwo�� mo�e przechowywa�, to 2 147 483 647, st�dje�eli u�ytkownik zaznaczy na przyk�ad 2048 pe�nych kolumn (czyli 2 147 483 648komórek), w�a�ciwo�� Count wygeneruje b��d. Na szcz��cie firma Microsoft doda�aw Excelu, pocz�wszy od wersji 2007, now� w�a�ciwo��: CountLarge. W�a�ciwo�� ta u�ywadanych typu Double, które pozwalaj� na przechowywanie liczb z zakresu do 1,79+E308.
Wnioski? W przyt�aczaj�cej wi�kszo�ci przypadków w�a�ciwo�� Count b�dzie dzia�a�anajzupe�niej poprawnie. Je�eli jednak zak�adasz, �e b�dziesz zlicza� arkusze zawieraj�cenaprawd� du�e ilo�ci komórek (na przyk�ad wszystkie komórki arkusza), to zamiastw�a�ciwo�ci Count powiniene� u�y� w�a�ciwo�ci CountLarge.
Oczywi�cie liczb� wierszy zakresu mo�na równie� okre�li� przy u�yciu w�a�ciwo�ciRows. Poni�sza instrukcja okre�la liczb� wierszy zakresu o nazwie dane i przypisuje war-to�� zmiennej RowCount:RowCount = Range("dane").Rows.Count
Okre�lanie typu zaznaczonego zakresu
Excel obs�uguje kilka typów zaznacze� zakresów. Oto one:
� pojedyncza komórka,
� ci�g�y zakres komórek,
� jedna lub wi�cej kolumn,
� jeden lub wi�cej wierszy,
� ca�y arkusz,
� dowolna kombinacja wy�ej wymienionych typów, czyli zaznaczenie wielokrotne.
Poniewa� istnieje kilka typów zaznacze�, w trakcie przetwarzania zakresu procedura j�zykaVBA nie mo�e przewidzie�, jaki jest typ zaznaczenia. Na przyk�ad zaznaczony obszarmo�e sk�ada� si� z dwóch zakresów komórek, A1:A10 i C1:C10 (aby utworzy� zaznaczeniewielokrotne, podczas zaznaczania kolejnych zakresów trzymaj wci�ni�ty klawisz Ctrl).
Je�eli zakres zosta� zdefiniowany przez wiele zaznacze�, obiekt Range b�dzie si� sk�ada�z oddzielnych obszarów. Aby stwierdzi�, czy zaznaczenie jest zaznaczeniem wielokrotnym,nale�y u�y� metody Areas zwracaj�cej kolekcj� Areas. Kolekcja reprezentuje wszystkieobszary wchodz�ce w sk�ad zakresu stworzonego poprzez zaznaczenie wielokrotne.
W celu stwierdzenia, czy wybrany zakres posiada wiele obszarów, nale�y zastosowa� wyra-�enie podobne do poni�szego:NumAreas = Selection.Areas.Count
Je�eli zmienna NumAreas zawiera warto�� wi�ksz� od 1, zaznaczenie jest zaznaczeniemwielokrotnym.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 353
Poni�ej zamieszczono kod funkcji o nazwie AreaType, która zwraca �a�cuch tekstu opisu-j�cy rodzaj zaznaczenia.Function AreaType(RangeArea As Range) As String' Funkcja okre�la 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 SelectEnd Function
Funkcja jako argument pobiera obiekt Range i zwraca jeden z pi�ciu �a�cuchów opisuj�cychobszar — Komórka, Arkusz, Kolumna, Wiersz lub Blok. W celu okre�lenia, które z pi�ciuwyra�e� porównuj�cych ma warto�� True, funkcja korzysta z konstrukcji Select Case.Na przyk�ad: je�eli zakres sk�ada si� z jednej komórki, funkcja zwróci �a�cuch Komórka.Je�eli liczba komórek zakresu jest równa liczbie komórek arkusza, funkcja zwróci �a�-cuch Arkusz. Je�eli liczba wierszy zakresu jest równa liczbie wierszy arkusza, funkcjazwróci �a�cuch Kolumna. Je�eli liczba kolumn zakresu jest równa liczbie kolumn arkusza,funkcja zwróci �a�cuch Wiersz. Je�eli �adne wyra�enie instrukcji Case nie b�dzie mia�owarto�ci True, funkcja zwróci �a�cuch Blok.
Zauwa�, �e do liczenia komórek u�yta zosta�a w�a�ciwo�� CountLarge, poniewa� — jakju� wspominali�my wcze�niej — ca�kowita liczba zaznaczonych komórek w arkuszumo�e teoretycznie przekroczy� limit typu danych w�a�ciwo�ci Count.
Skoroszyt Zaznaczanie.xlsm znajduj�cy si� na do��czonym dysku CD-ROM zawieraprocedur� RangeDescription, która pos�uguje si� funkcj� AreaType w celu wy�wietleniaokna komunikatu opisuj�cego typ zaznaczenia aktualnego zakresu. Na rysunku 11.7pokazano przyk�ad jej dzia�ania. Zrozumienie zasad dzia�ania funkcji b�dzie stanowi�odobre przygotowanie do wykonywania kolejnych operacji na obiektach klasy Range.
Excel pozwala na wykonanie wielu identycznych zaznacze. Na przyk�ad, je�eli trzymaj�cwci�ni�ty klawisz Ctrl, pi�ciokrotnie klikniesz komórk� A1, zaznaczenie b�dzie z�o�onez pi�ciu identycznych obszarów. Procedura RangeDescription uwzgl�dnia taka sytuacj�i nie zlicza wielokrotnie tych samych komórek.
Wydajne przetwarzanie komórek zaznaczonego zakresuprzy u�yciu p�tli
Jednym z cz��ciej wykonywanych przez makra zada� jest sprawdzanie poszczególnychkomórek zakresu i wykonywanie okre�lonych operacji, je�eli komórka spe�nia zadane kryte-rium. Kolejna procedura, której kod przedstawiamy poni�ej, jest w�a�nie przyk�adem takiegomakra. Procedura ColorNegaitve ustawia czerwony kolor t�a dla wszystkich komórek zazna-czenia, które przechowuj� warto�� ujemn�. Kolor t�a pozosta�ych komórek jest zerowany.
354 Cz��� III � J�zyk Visual Basic for Applications
Rysunek 11.7. Procedura AboutRangeSelection analizuje aktualnie zaznaczony zakres
Poni�szy przyk�ad zosta� opracowany tylko i wy��cznie w celach edukacyjnych.W zastosowaniach praktycznych o wiele lepszym rozwi�zaniem b�dzie po prostuu�ycie mechanizmu formatowania warunkowego.
Sub ColorNegative()' Je�eli warto� jest ujemna, zmienia kolor t�a 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 cellEnd Sub
Z pewno�ci� procedura ColorNegative zadzia�a, ale zawiera powa�ny b��d. Dla przyk�adu:co si� stanie, je�eli obszar danych na arkuszu jest bardzo ma�y, a u�ytkownik zaznaczyna przyk�ad ca�� kolumn�? Albo 10 kolumn? Albo mo�e nawet ca�y arkusz? Jak si�zapewne sam domy�lasz, nie ma �adnej potrzeby sprawdzania wszystkich pustych, nie-u�ywanych komórek arkusza, nie mówi�c ju� o tym, �e przy du�ych zaznaczonych obsza-rach u�ytkownik z pewno�ci� podda�by si�, zanim ca�a procedura dobieg�aby do ko�ca.
Lepszym rozwi�zaniem jest procedura ColorNegative2, której kod przedstawiamy poni�ej.W tej poprawionej wersji utworzyli�my zmienn� obiektow� WorkRange, której zawarto��odpowiada cz��ci wspólnej zaznaczonego obszaru i u�ytego obszaru arkusza. Przyk�a-dow� sytuacj� ilustruje rysunek 11.8. Jak wida�, zaznaczona jest ca�a kolumna D (czyli1 048 576 komórek), ale u�yty zakres komórek sprowadza si� ju� tylko do obszaru B2:I18.Zatem przeci�ciem tych dwóch obszarów jest zakres D2:D18, co jest zdecydowaniemniejszym zakresem ni� pocz�tkowe zaznaczenie. Ró�nica pomi�dzy czasem przetwa-rzania 15 komórek a 1 048 576 komórek b�dzie naprawd� znacz�ca.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 355
Rysunek 11.8.Zastosowanieprzeci�ciazaznaczonego zakresui u�ytego obszaruarkusza skutkujeznacz�cymzmniejszeniemliczby komórek,które b�dziemymusieli przetwarza�
Sub ColorNegative2()' Je�eli warto� jest ujemna, zmienia kolor t�a 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 cellEnd 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 d�u�sza, ale jednocze�nieo wiele bardziej wydajna. W celu wygenerowania dwóch podzbiorów zaznaczenia u�y�emmetody SpecialCells. Pierwszy podzbiór obejmuje jedynie komórki zawieraj�ce sta�enumeryczne (ConstantCells), natomiast drugi — komórki przechowuj�ce formu�y nume-ryczne (FormulaCells). Komórki obu podzbiorów s� nast�pnie przetwarzane za pomoc�dwóch konstrukcji For Each ... Next. W efekcie przetwarzane s� tylko niepuste komórkizawieraj�ce warto�ci numeryczne, dzi�ki czemu uzyskujemy znacz�ce zwi�kszenie szyb-ko�ci dzia�ania makra.Sub ColorNegative3()' Je�eli warto� jest ujemna, zmienia kolor t�a komórki na czerwony Dim FormulaCells As Range, ConstantCells As Range Dim cell As Range If TypeName(Selection) <> "Range" Then Exit Sub
356 Cz��� III � J�zyk 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 zawieraj�cych formu�y 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 zawieraj�cych sta�e warto�ci 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 IfEnd Sub
Zastosowanie instrukcji On Error jest konieczne, poniewa� metoda SpecialCellsgeneruje b��d, gdy �adna komórka nie spe�nia kryterium.
Skoroszyt z tymi przyk�adami (Tworzenie wydajnych p�tli.xlsm), zawieraj�cy trzy wersjeprocedury ColorNegative, znajdziesz na p�ycie CD-ROM do��czonej do ksi��ki.
Usuwanie wszystkich pustych wierszy
Poni�sza procedura usuwa puste wiersze aktywnego arkusza. Procedura jest szybkai wydajna, poniewa� nie sprawdza wszystkich wierszy, a jedynie wiersze u�ywane przezzakres, który jest identyfikowany za pomoc� w�a�ciwo�ci UsedRange obiektu Worksheet.Sub DeleteEmptyRows() Dim LastRow As Long Dim r As Long Dim Counter As Long Application.ScreenUpdating = False LastRow = ActiveSheet.UsedRange.Rows.Count + _ ActiveSheet.UsedRange.Rows(1).Row - 1 For r = LastRow To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(r)) = 0 Then Rows(r).Delete Counter = Counter + 1 End If Next r
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 357
Application.ScreenUpdating = True MsgBox Counter & " pustych wierszy zosta�o usuni�tych."End Sub
Pierwszym krokiem jest okre�lenie ostatnio u�ywanego wiersza, a nast�pnie przypisaniejego numeru zmiennej LastRow. Nie jest to takie proste, jak mog�oby si� wydawa�, ponie-wa� u�ywany zakres mo�e, ale nie musi rozpoczyna� si� od wiersza 1. A zatem warto��zmiennej LastRow jest obliczana poprzez okre�lenie liczby wierszy u�ywanego zakresu,dodanie numeru pierwszego wiersza zakresu i odj�cie jedynki.
W celu stwierdzenia, czy wiersz jest pusty, procedura korzysta z funkcji arkuszowej COUNTA(ILE.NIEPUSTYCH) Excela. Je�eli dla okre�lonego wiersza funkcja zwróci warto�� 0, oznaczato, �e jest pusty. Procedura przetwarza wiersze od do�u do góry, a ponadto w p�tli For ...Next u�ywa ujemnej warto�ci skoku (Step). Jest to niezb�dne, poniewa� operacja usu-wania wierszy powoduje, �e wszystkie kolejne wiersze s� przesuwane w gór� arkusza.Je�eli p�tla przetwarza�aby wiersze od góry do do�u, jej licznik po usuni�ciu wiersza niemia�by w�a�ciwej warto�ci.
Makro wykorzystuje równie� inn� zmienn�, Counter, do �ledzenia liczby usuni�tych wier-szy. Liczba ta jest wy�wietlana w oknie dialogowym, kiedy procedura ko�czy dzia�anie.
Skoroszyt z tym przyk�adem (Usu� puste wiersze.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Powielanie wierszy
Przyk�ad, który omówimy w tym podrozdziale, ilustruje sposób wykorzystania VBA dotworzenia duplikatów istniej�cych wierszy. Na rysunku 11.9 przedstawiono wygl�d skoro-szytu zawieraj�cego 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 u�yciu funkcji RAND). Zwyci�zca zostaniewy�oniony przez sortowanie danych w kolumnie C (wygrywa osoba, do której zosta�a przy-pisana najwi�ksza liczba losowa).
Rysunek 11.9.Zadanie polegana powieleniuistniej�cych wierszyw oparciu o warto�ciz kolumny B
358 Cz��� III � J�zyk Visual Basic for Applications
Nasze zadanie polega na powieleniu istniej�cych wierszy dla poszczególnych osób, takaby ka�da z nich mia�a tyle osobnych wierszy, ile zakupi�a losów. Na przyk�ad Barbarakupi�a 2 losy, a zatem powinni�my dla niej utworzy� 2 osobne wiersze. Kod proceduryrealizuj�cej takie zadanie zosta� zamieszczony poni�ej: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) LoopEnd Sub
Zmiennej obiektowej cell zostaje przypisana warto�� reprezentuj�ca komórk� B2, czylipierwsz� komórk�, w której przechowywana jest liczba zakupionych losów. P�tlawstawia nowy wiersz i nast�pnie kopiuje go odpowiedni� ilo�� razy przy u�yciu metodyFillDown. Zmienna cell jest inkrementowana tak, aby wskazywa�a na liczb� losów zaku-pionych przez kolejn� osob� i procedura kontynuuje dzia�anie a� do momentu napotkaniapierwszej pustej komórki. Na rysunku 11.10 przedstawiono wygl�d arkusza po zako�cze-niu dzia�ania procedury.
Skoroszyt z tym przyk�adem (Powielanie wierszy.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Okre�lanie, czy zakres zawiera si� w innym zakresie
Poni�sza funkcja InRange pobiera dwa argumenty (obiekty klasy Range) i zwraca warto��True, je�eli pierwszy zakres zawiera si� w drugim:Function InRange(rng1, rng2) As Boolean' Zwraca warto� True, je�eli 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 IfEnd Function
Kod funkcji InRange mo�e si� wydawa� do�� z�o�ony, poniewa� program musi spraw-dzi�, czy dwa zakresy znajduj� si� w tym samym arkuszu i skoroszycie. Procedura pos�u-guje si� w�a�ciwo�ci� Parent zwracaj�c� kontener obiektu. Przyk�adowo poni�sze wyra-�enie zwraca nazw� arkusza b�d�cego kontenerem obiektu rng1, do którego jestwykonywane odwo�anie:rng1.Parent.Name
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 359
Rysunek 11.10.Procedura doda�ado arkusza nowewiersze w oparciuo warto�ciw kolumnie B
Kolejne wyra�enie zwraca nazw� skoroszytu obiektu rng1:rng1.Parent.Parent.Name
Funkcja Union j�zyka VBA zwraca obiekt klasy Range reprezentuj�cy sum� dwóchobiektów Range. Zakres sumy obejmuje wspólne komórki dwóch zakresów. Je�eli adressumy dwóch zakresów jest taki sam jak adres drugiego zakresu, oznacza to, �e pierwszyzakres zawiera si� w drugim.
Skoroszyt z tym przyk�adem (Funkcja InRange.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Okre�lanie typu danych zawartych w komórce
Excel oferuje kilka wbudowanych funkcji arkuszowych, które pomagaj� w okre�laniu typudanych zawartych w komórce. Nale�y do nich zaliczy� funkcje CZY.TEKST, CZY.LOGICZNAi CZY.B��D. Dodatkowo j�zyk VBA zawiera funkcje IsEmpty, IsDate i IsNumeric.
360 Cz��� III � J�zyk Visual Basic for Applications
Zamieszczona poni�ej funkcja CellType akceptuje argument Range i zwraca �a�cuch(Pusta, Tekst, Logiczny, B�d, Data, Czas lub Liczba) opisuj�cy typ danych zawartychw górnej lewej komórce zakresu. Funkcja mo�e zosta� u�yta w formule arkusza lub wywo-�ana z innej procedury j�zyka VBA.Function CellType(Rng)' Zwraca typ górnej lewej komórki zakresu Dim TheCell As Range Set TheCell = Rng.Range("A1") Select Case True Case IsEmpty(TheCell) CellType = "Pusta" Case Application.IsText(TheCell) CellType = "Tekst" Case Application.IsLogical(TheCell) CellType = "Logiczny" Case Application.IsErr(TheCell) CellType = "B�d" Case IsDate(TheCell) CellType = "Data" Case InStr(1, TheCell.Text, ":") <> 0 CellType = "Czas" Case IsNumeric(TheCell) CellType = "Liczba" End SelectEnd Function
Zwró� uwag� na u�ycie polecenia Set TheCell. Funkcja CellType akceptuje argumentRange dowolnej wielko�ci, ale ta instrukcja powoduje, �e funkcja przetwarza tylko górn�lew� komórk� zakresu reprezentowanego przez zmienn� TheCell.
Skoroszyt z tym przyk�adem (Funkcja CellType.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
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 kodprzedstawiamy poni�ej, demonstruje porównanie wzgl�dnych szybko�ci wykonywaniaoperacji zapisu i odczytu zakresu.
Procedura tworzy tablic�, a nast�pnie za pomoc� p�tli For ... Next zapisuje jej zawarto��w zakresie i ponownie wczytuje j� do tablicy. Przy u�yciu funkcji Timer j�zyka VBAoblicza czas wymagany do wykonania ka�dej operacji.Sub WriteReadRange() Dim MyArray() Dim Time1 As Double Dim NumElements As Long, i As Long Dim WriteTime As String, ReadTime As String Dim Msg As String
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 361
NumElements = 60000 ReDim MyArray(1 To NumElements)
' Wype�nienie 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 za�adowanie do tablicy Time1 = Timer For i = 1 To NumElements MyArray(i) = Cells(i, 1) Next i ReadTime = Format(Timer - Time1, "00:00")
' Wy�wietlenie 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 licz�cej 60 000 elementów do zakresu komórekzaj��o 58 sekund, natomiast wczytanie zakresu komórek do tablicy tylko 1 sekund�.
Lepsza metoda zapisywania zakresu
W poprzednim przyk�adzie, aby przenie�� zawarto�� tablicy do zakresu arkusza, u�ytop�tli For ... Next. W tym podrozdziale zademonstrujemy wydajniejsz� metod� osi�gni�-cia tego samego celu.
Kod procedury przedstawiony poni�ej ilustruje najbardziej oczywisty (ale niestety nie naj-wydajniejszy) sposób wype�niania zakresu danymi. Do umieszczenia danych w zakresieponownie zosta�a u�yta p�tla For ... Next.Sub LoopFillRange()' Wype�nia zakres przy u�yciu p�tli przetwarzaj�cej komórki Dim CellsDown As Long, CellsAcross As Integer Dim CurrRow As Long, CurrCol As Integer Dim StartTime As Double Dim CurrVal As Long
' Pobranie wymiarów CellsDown = Val(InputBox("Ile komórek w pionie?")) If CellsDown = 0 Then Exit Sub CellsAcross = Val(InputBox("Ile komórek w poziomie?")) If CellsAcross = 0 Then Exit Sub
362 Cz��� III � J�zyk Visual Basic for Applications
' Zarejestrowanie czasu rozpocz�cia StartTime = Timer
' Przy u�yciu p�tli przetwarza komórki i wstawia warto�ci 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
' Wy�wietla czas trwania operacji Application.ScreenUpdating = True MsgBox Format(Timer - StartTime, "00.00") & " sekund"End Sub
Kolejny przyk�ad demonstruje o wiele szybsz� metod� pozwalaj�c� na uzyskanie tegosamego efektu. Procedura wstawia do tablicy poszczególne warto�ci, a nast�pnie zapomoc� jednej instrukcji przenosi zawarto�� tablicy do zakresu.Sub ArrayFillRange()' Wype�nienie 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 rozpocz�cia 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))' Wype�nienie 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' Wy�wietlanie czas trwania operacji Application.ScreenUpdating = True MsgBox Format(Timer - StartTime, "00.00") & " sekund"End Sub
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 363
W moim systemie wype�nienie zakresu o wymiarach 1000�250 komórek (250 000 komó-rek) przy u�yciu p�tli zaj��o 10,05 sekundy. Metoda oparta na transferze zawarto�ci tablicydo uzyskania identycznego efektu potrzebowa�a zaledwie 0,18 sekundy, czyli dzia�a�aoko�o 50 razy szybciej! Jaki wniosek wynika z tego przyk�adu? Je�eli chcesz przenie�� doarkusza du�� ilo�� danych, wsz�dzie, gdzie tylko jest to mo�liwe, unikaj stosowania p�tli.
Osi�gni�te czasy w du�ej mierze zale�� od obecno�ci w arkuszu innych formu�. W praktycelepsze czasy otrzymasz w sytuacji, kiedy podczas testu nie b�d� otwarte inne skoroszytyzawieraj�ce makra lub kiedy prze��czysz Excela w tryb r�cznego przeliczania arkusza.
Na p�ycie CD-ROM do��czonej do ksi��ki znajdziesz skoroszyt Wype�nianie zakresuprzy u�yciu p�tli i tablicy.xlsm, zawieraj�cy procedury WriteReadRange, LoopFillRangeoraz ArrayFillRange.
Przenoszenie zawarto�ci tablic jednowymiarowych
W poprzednim przyk�adzie zastosowano tablic� dwuwymiarow�, dobrze sprawdzaj�c�si� w arkuszach, w których dane przechowywane s� w uporz�dkowanej strukturze wierszyi kolumn.
Aby przenie�� zawarto�� tablicy jednowymiarowej, zakres musi mie� orientacj� poziom� —czyli inaczej mówi�c, posiada� jeden wiersz z wieloma kolumnami. Je�eli jednak musiszu�y� zakresu pionowego, najpierw b�dziesz musia� dokona� transponowania tablicy z pozio-mej na pionow�. Aby to zrobi�, mo�esz u�y� funkcji arkuszowej TRANSPOSE (TRANSPONUJ)Excela. Poni�sze polecenie przenosi tablic� licz�c� 100 elementów do pionowego zakresuarkusza (A1:A100):Range("A1:A100").Value = Application.WorksheetFunction.Transpose(MyArray)
Funkcja arkuszowa TRANSPONUJ nie b�dzie dzia�a�a z tablicami, w którychprzechowywanych jest wi�cej ni� 65 536 elementów.
Przenoszenie zawarto�ci zakresu do tablicy typu Variant
W tym podrozdziale omówimy kolejn� metod� przetwarzania zawarto�ci arkusza przyu�yciu j�zyka VBA. W poni�szym przyk�adzie zawarto�� zakresu komórek jest przeno-szona do dwuwymiarowej tablicy typu Variant. Nast�pnie w oknach komunikatów s�wy�wietlane górne granice ka�dego 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 wy�wietlana warto�� 600 (liczba wierszy oryginal-nego zakresu), natomiast w drugim — 12 (liczba kolumn). Jak sam si� przekonasz, prze-niesienie zawarto�ci zakresu do tablicy typu Variant odbywa si� prawie natychmiast.
364 Cz��� III � J�zyk Visual Basic for Applications
Poni�sza procedura wczytuje zawarto�� zakresu o nazwie data do tablicy typu Variant,wykonuje na poszczególnych elementach tablicy prost� operacj� mno�enia, a nast�pnieponownie 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 p�tli dla tablicy typu Variant For r = 1 To UBound(x, 1) For c = 1 To UBound(x, 2)' Mno�enie kolejnych elementów tablicy przez 2 x(r, c) = x(r, c) * 2 Next c Next r' Ponowne przeniesienie zawarto�ci tablicy typu Variant do arkusza Range("data") = xEnd Sub
Jak sam si� mo�esz przekona�, ca�a procedura dzia�a naprawd� szybko. Przetwarzanie30 000 komórek na moim komputerze trwa�o poni�ej jednej sekundy.
Skoroszyt z tym przyk�adem (Przenoszenie tablicy typu Variant.xlsm) znajdziesz na p�ycieCD-ROM do��czonej do ksi��ki.
Zaznaczanie komórek na podstawie warto�ci
Nasz kolejny przyk�ad ilustruje, w jaki sposób mo�na zaznacza� wybrane komórki w opar-ciu o ich warto�ci. Co ciekawe, Excel nie posiada swojego w�asnego mechanizmu, któryumo�liwia�by bezpo�rednie wykonanie takiej operacji. Poni�ej przedstawiamy kod pro-cedury SelectByValue, której zadaniem jest zaznaczenie komórek zakresu zawieraj�cychwarto�ci ujemne, aczkolwiek mo�na to w �atwy sposób zmodyfikowa� i dopasowa� dow�asnych 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 zawieraj�cych warto�ci numeryczne On Error Resume Next Set WorkRange = WorkRange.SpecialCells(xlConstants, xlNumbers)
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 365
If WorkRange Is Nothing Then Exit Sub On Error GoTo 0
' Sprawdzaj w p�tli kolejne komórki i dodawaj do zakresu FoundCells, je�eli spe�niaj� 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 spe�niajcych kryterium." Else FoundCells.Select End IfEnd Sub
Procedura rozpoczyna dzia�anie od sprawdzenia zaznaczonego zakresu. Je�eli jest topojedyncza komórka, przeszukiwany jest ca�y arkusz. Je�eli zaznaczone zosta�y co naj-mniej 2 komórki, wtedy przeszukiwany jest tylko zaznaczony zakres. Zakres, który b�dzieprzeszukiwany, jest nast�pnie redefiniowany poprzez u�ycie metody SpecialCells doutworzenia obiektu klasy Range, który sk�ada si� tylko z komórek zawieraj�cych warto�cinumeryczne.
Kod w p�tli For ... Next sprawdza warto�ci kolejnych komórek. Je�eli komórka spe�-nia zadane kryterium (czyli jej zawarto�� jest mniejsza od 0), komórka jest dodawana zapomoc� metody Union do obiektu FoundCells klasy Range. Zwró� uwag� na fakt, �e niemo�esz u�y� metody Union dla pierwszej komórki — je�eli zakres FoundCells nie zawiera�adnych komórek, próba u�ycia metody Union spowoduje wygenerowanie b��du. W�a�niedlatego w naszym programie zamie�cili�my kod sprawdzaj�cy, czy zawarto�� zakresuFoundCells to Nothing.
Kiedy p�tla ko�czy swoje dzia�anie, obiekt FoundCells sk�ada si� z komórek, które spe�-niaj� kryterium wyszukiwania (je�eli nie znaleziono �adnych komórek, jego zawarto�ci�b�dzie Nothing). Je�eli �adna komórka nie spe�ni kryteriów, na ekranie zostanie wy�wie-tlone okno dialogowe z odpowiednim komunikatem. W przeciwnym razie komórki spe�-niaj�ce kryteria zostan� zaznaczone.
Skoroszyt z tym przyk�adem (Zaznaczanie wed�ug warto�ci.xlsm) znajdziesz na p�ycieCD-ROM do��czonej do ksi��ki.
Kopiowanie nieci�g�ego zakresu komórek
Je�eli kiedykolwiek próbowa�e� kopiowa� nieci�g�y zakres komórek, z pewno�ci� prze-kona�e� si�, �e Excel nie obs�uguje takiej operacji. Próba jej wykonania ko�czy si� wy�wie-tleniem komunikatu Wykonanie tego polecenia dla kilku zakresów nie jest mo�liwe.
366 Cz��� III � J�zyk Visual Basic for Applications
Jedynym wyj�tkiem jest tutaj sytuacja, w której próbujesz kopiowa� zaznaczenie wielo-krotne, sk�adaj�ce si� z ca�ych wierszy lub kolumn. Excel pozwala na wykonanie takiejoperacji.
Kiedy napotykasz takie ograniczenia w programie Excel, zazwyczaj mo�esz je obej�� zapomoc� odpowiedniego makra. Procedura, któr� omówimy poni�ej, jest przyk�adem takiegomakra, które pozwala na kopiowanie wielu zaznaczonych zakresów komórek w innemiejsce 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
' Okre�la 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' Je�eli operacja zosta�a anulowana, zako�cz dzia�anie If TypeName(PasteRange) <> "Range" Then Exit Sub
' Upewnij si�, �e u�ywamy 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 iEnd Sub
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 367
Na rysunku 11.11 przedstawiono okno dialogowe, w którym u�ytkownik powinien zde-finiowa� adres obszaru docelowego.
Rysunek 11.11. Zastosowanie metody InputBox programu Excel do pobierania lokalizacji komórki
Skoroszyt z tym przyk�adem (Kopiowanie wielu zakresów.xlsm) znajdziesz na p�ycieCD-ROM do��czonej do ksi��ki. Dodatkowo w skoroszycie tym znajduje si� inna wersjatej procedury, która ostrzega u�ytkownika, je�eli w wyniku kopiowania zostan� nadpisanedane istniej�ce w obszarze docelowym.
Przetwarzanie skoroszytów i arkuszyKolejne przyk�ady omawiane w tym podrozdziale demonstruj� metody przetwarzania sko-roszytów i arkuszy przy u�yciu j�zyka VBA.
Zapisywanie wszystkich skoroszytów
Poni�sza procedura przy u�yciu p�tli przetwarza wszystkie skoroszyty w kolekcji Workbooksi ponownie zapisuje ka�dy plik, który by� ju� wcze�niej zapisany:Public Sub SaveAllWorkbooks() Dim Book As Workbook For Each Book In Workbooks If Book.Path <> "" Then Book.Save Next BookEnd Sub
368 Cz��� III � J�zyk Visual Basic for Applications
Zwró� uwag� na w�a�ciwo�� Path. Je�eli w�a�ciwo�� Path danego skoroszytu jest pusta,oznacza to, �e jego plik nigdy nie zosta� zapisany (jest to nowy skoroszyt). Proceduraignoruje tego typu skoroszyty i zapisuje tylko te, których w�a�ciwo�� Path ma ustawion�dowoln� warto��.
Zapisywanie i zamykanie wszystkich skoroszytów
Poni�sza procedura przy u�yciu p�tli przetwarza kolekcj� Workbooks, zapisuj�c i zamy-kaj�c 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:=TrueEnd Sub
Aby okre�li�, czy dany skoroszyt to skoroszyt zawieraj�cy kod aktualnie wykonywanejprocedury, nasza procedura u�ywa instrukcji If umieszczonej w p�tli For-Next. Jest tokonieczne, poniewa� zamkni�cie takiego skoroszytu spowoduje przerwanie wykonywaniakodu, na skutek czego inne skoroszyty nie zostan� zapisane. Po zamkni�ciu wszystkichinnych skoroszytów procedura zamyka równie� swój macierzysty skoroszyt.
Ukrywanie wszystkich komórek arkuszapoza zaznaczonym zakresem
Procedura, któr� omówimy w tym podrozdziale, ukrywa wszystkie komórki arkusza pozatymi, które znajduj� si� w aktualnie zaznaczonym zakresie. Przyk�ad 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
' Je�eli ostatni wiersz lub kolumna s� ukryte, odkryj wszystko i zako�cz dzia�anie 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
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 369
Rysunek 11.12. Wszystkie komórki arkusza poza zaznaczonym zakresem (G8:K17) zosta�y 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 = TrueEnd Sub
Je�eli zaznaczony obszar arkusza sk�ada si� z kilku nieci�g�ych zakresów komórek, baz�do ukrywania wierszy i kolumn jest pierwszy zakres.
Skoroszyt z tym przyk�adem (Ukrywanie wierszy i kolumn.xlsm) znajdziesz na p�ycieCD-ROM do��czonej do ksi��ki.
Synchronizowanie arkuszy
Je�eli korzysta�e� kiedykolwiek ze skoroszytów wieloarkuszowych, to wiesz zapewne,�e Excel nie potrafi synchronizowa� danych z poszczególnych arkuszy skoroszytu. Innymis�owy, nie ma mo�liwo�ci automatycznego zaznaczenia tego samego zakresu i ustawieniagórnej, lewej komórki takiego multizakresu. Poni�sze makro j�zyka VBA jako bazy u�ywaaktywnego arkusza, a na pozosta�ych arkuszach skoroszytu wykonuje nast�puj�ce operacje:
370 Cz��� III � J�zyk 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ód�owy 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' Zapami�tuje aktualny arkusz Set UserSheet = ActiveSheet
' Zapisuje informacje z aktywnego arkusza TopRow = ActiveWindow.ScrollRow LeftCol = ActiveWindow.ScrollColumn UserSel = ActiveWindow.RangeSelection.Address
' Przechodzi w p�tli 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 = TrueEnd Sub
Skoroszyt z tym przyk�adem (Synchronizacja arkuszy.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Techniki programowania w j�zyku VBANast�pne przyk�ady ilustruj� cz�sto u�ywane techniki programowania w j�zyku VBA,które mo�esz wykorzysta� we w�asnych projektach.
Prze��czanie warto�ci w�a�ciwo�ci typu logicznego
W�a�ciwo� typu logicznego posiada warto�� True lub False. Najprostsza metoda prze-��czania warto�ci takiej w�a�ciwo�ci polega na zastosowaniu operatora Not. Zosta�o topokazane w poni�szym przyk�adzie, w którym prze��czana jest warto�� w�a�ciwo�ciWrapText obiektu Selection:
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 371
Sub ToggleWrapText()' W��cza lub wy��cza zawijanie tekstu dla zaznaczonych komórek If TypeName(Selection) = "Range" Then Selection.WrapText = Not ActiveCell.WrapText End IfEnd Sub
Oczywi�cie w razie potrzeby mo�esz dowolnie zmodyfikowa� t� procedur�, tak aby prze-��cza�a inne w�a�ciwo�ci typu logicznego.
Zauwa�, �e prze��czanie jest wykonywane w oparciu o aktywn� komórk�. Je�eli po zazna-czeniu zakresu w�a�ciwo�ci komórek maj� ró�ne warto�ci (np. zawarto�� niektórychkomórek jest pogrubiona, a innych nie), taki zakres ma mieszane w�a�ciwo�ci. W tymprzypadku Excel w celu okre�lenia sposobu prze��czania warto�ci pos�uguje si� aktywn�komórk�. Je�eli na przyk�ad zawarto�� aktywnej komórki jest pogrubiona, po naci�ni�ciuprzycisku na Wst��ce pogrubienie zostanie usuni�te z wszystkich komórek zaznaczenia.Ta prosta procedura na�laduje zachowanie Excela, co zazwyczaj jest najlepszym rozwi�-zaniem.
Zauwa� równie�, �e do sprawdzenia, czy zaznaczono zakres, procedura wykorzystujefunkcj� TypeName. Je�eli zaznaczony obszar nie jest zakresem, nie zostanie wykonana �adnaoperacja.
Operator Not umo�liwia prze��czanie warto�ci wielu innych w�a�ciwo�ci. Aby na przy-k�ad w arkuszu wy�wietli� lub ukry� nag�ówki wierszy i kolumn, nale�y u�y� nast�pu-j�cej instrukcji:ActiveWindow.DisplayHeadings = Not ActiveWindow.DisplayHeadings
Aby w aktywnym arkuszu wy�wietli� lub ukry� linie siatki, nale�y u�y� nast�puj�cejinstrukcji:ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines
Okre�lanie liczby drukowanych stron
W celu okre�lenia liczby drukowanych stron arkusza mo�na u�y� polecenia Podgl�dwydruku Excela i w dolnej cz��ci ekranu sprawdzi� liczb� stron. Procedura j�zyka VBAprzedstawiona poni�ej zlicza poziome i pionowe linie podzia�u stron i na tej podstawieokre�la liczb� drukowanych stron aktywnego arkusza:Sub PageCount() MsgBox (ActiveSheet.HPageBreaks.Count + 1) * _ (ActiveSheet.VPageBreaks.Count + 1)End Sub
Kolejna procedura j�zyka VBA przechodzi w p�tli przez wszystkie arkusze aktywnegoskoroszytu i wy�wietla ca�kowit� liczb� drukowanych stron, tak jak to zosta�o zilustrowanena rysunku 11.13.Sub ShowPageCount() Dim PageCount As Integer Dim sht As Worksheet
372 Cz��� III � J�zyk Visual Basic for Applications
Rysunek 11.13.Wykorzystanieprocedury VBAdo wyznaczenia liczbystron do wydrukuw 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 = " & PageCountEnd Sub
Skoroszyt z tym przyk�adem (Zliczanie stron wydruku.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Wy�wietlanie daty i czasu
Je�eli znasz ju� system liczb seryjnych u�ywany przez Excel do przechowywania dati godzin, nie b�dziesz mia� �adnych problemów z zastosowaniem dat i czasu w procedu-rach j�zyka VBA.
Procedura DateAndTime wy�wietla okno komunikatu z aktualn� dat� i czasem, tak jak tozosta�o przedstawione na rysunku 11.14. W pasku tytu�owym okna wy�wietlany jestkomunikat odpowiedni dla danej pory dnia.
Rysunek 11.14.Okno komunikatuwy�wietlaj�cedat� i czas
Procedura jako argument funkcji Format wykorzystuje funkcj� Date. Wynikiem dzia�aniaprocedury jest �a�cuch zawieraj�cy sformatowan� dat�. Aby uzyska� tak samo sformato-wany czas, u�yli�my podobnego sposobu.Sub DateAndTime()' Wy�wietla 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")' Okre�lenie 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 u�ytkownika
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 373
FullName = Application.UserName SpaceInName = InStr(1, FullName, " ", 1)
' Obs�uga przypadku, gdy nazwa nie zawiera spacji If SpaceInName = 0 Then SpaceInName = Len(FullName) FirstName = Left(FullName, SpaceInName) Greeting = Greeting & FirstName' Wy�wietlenie komunikatu MsgBox TheDate & vbCrLf & TheTime, vbOKOnly, GreetingEnd Sub
W celu zagwarantowania, �e makro b�dzie poprawnie dzia�a�o niezale�nie od ustawie�regionalnych systemu u�ytkownika, w powy�szym przyk�adzie u�yli�my nazw formatówdaty i czasu (Long Date i Long Time). Oczywi�cie w razie potrzeby mo�esz pos�u�y� si�innymi formatami. Aby na przyk�ad wy�wietli� dat� w formacie mm/dd/rr, mo�esz u�y�nast�puj�cego polecenia:TheDate = Format(Date, "mm/dd/yy")
Aby uzale�ni� tre�� komunikatu wy�wietlanego na pasku tytu�owym okna od pory dnia,zastosowali�my konstrukcj� Select Case. Warto�ci zwi�zane z czasem stosowane w j�zykuVBA funkcjonuj� podobnie jak w Excelu. Je�eli warto�� czasu jest mniejsza od liczby 0,5(po�udnie), oznacza to, �e jest przedpo�udnie. Je�eli z kolei warto�� ta jest wi�ksza odliczby 0,7083 (godzina 17), oznacza to, �e jest wieczór. W innych przypadkach jest popo-�udnie. Wybrali�my proste rozwi�zanie polegaj�ce na zastosowaniu funkcji TimeValuej�zyka VBA, która pobieraj�c �a�cuch, zwraca warto�� czasu.
Kolejna grupa instrukcji identyfikuje imi� u�ytkownika znajduj�ce si� w zak�adce Ogólneokna dialogowego Opcje. W celu zlokalizowania pierwszej spacji zawartej w personaliachu�ytkownika u�y�em funkcji InStr j�zyka VBA. Po napisaniu procedury stwierdzi�em,�e nie uwzgl�dni�em identyfikatora u�ytkownika, w którym nie wyst�puje spacja. Gdywi�c uruchomi�em j� w systemie u�ywanym przez u�ytkownika Nobody, nie zadzia�a�aprawid�owo. Jest to potwierdzeniem tezy, �e nie mo�na przewidzie� wszystkiego, i nawetnajprostsze procedury mog� nie zadzia�a�. Nawiasem mówi�c, je�eli nie zostan� podanepersonalia u�ytkownika, Excel zawsze u�yje nazwy aktualnie zalogowanego u�ytkownika.W procedurze problem ten zosta� rozwi�zany poprzez przypisanie zmiennej SpaceInNamed�ugo�ci pe�nej nazwy u�ytkownika, tak aby funkcja Left zwróci�a odpowiedni� nazw�.
Funkcja MsgBox ��czy dat� i czas, a ponadto w celu wstawienia pomi�dzy nimi znakupodzia�u stosuje wbudowan� sta�� vbCrLf. Sta�a vbOKOnly jest predefiniowan� sta�� zwra-caj�c� zero i powoduj�c�, �e w oknie komunikatu zostanie wy�wietlony jedynie przy-cisk OK. Ostatni argument o nazwie Greeting zosta� wcze�niej zdefiniowany w procedurze.
Skoroszyt z tym przyk�adem (Data i czas.xlsm) znajdziesz na p�ycie CD-ROM do��czonejdo ksi��ki.
Pobieranie listy czcionek
Je�eli b�dziesz chcia� pobra� list� wszystkich zainstalowanych czcionek, przekonasz si�,�e Excel nie oferuje bezpo�redniej metody uzyskania takiej listy. Technika opisywanatutaj wykorzystuje fakt, �e ze wzgl�du na konieczno�� zachowania kompatybilno�ci
374 Cz��� III � J�zyk Visual Basic for Applications
z poprzednimi wersjami, Excel 2010 nadal obs�uguje stare metody i w�a�ciwo�ci obiektówCommandBar, które w wersjach wcze�niejszych ni� 2007 by�y wykorzystywane do pracyz paskami narz�dzi i menu.
Procedura ShowInstalledFonts wy�wietla w kolumnie A aktywnego arkusza list� zainsta-lowanych czcionek. Procedura tworzy tymczasowy pasek narz�dzi (obiekt klasy Command�Bar), dodaje do niego formant Font i odczytuje list� czcionek z w�a�ciwo�ci tego for-mantu. Po zako�czeniu tymczasowy pasek narz�dzi jest usuwany.Sub ShowInstalledFonts() Dim FontList As CommandBarControl Dim TempBar As CommandBar Dim i As Long
' Tworzy tymczasowy pasek narz�dzi (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 narz�dzi (obiekt klasy CommandBar) TempBar.DeleteEnd Sub
Opcjonalnie mo�na te� wy�wietli� nazw� czcionki przy u�yciu tej czcionki, tak jak to zosta�ozaprezentowane na rysunku 11.15. Aby to zrobi�, wewn�trz p�tli For ... Next nale�yumie�ci� nast�puj�c� instrukcj�:
Cells(i+1, 1).Font.Name = FontList.List(i + 1)
Trzeba jednak mie� �wiadomo��, �e zastosowanie w skoroszycie wielu czcionekspowoduje zu�ycie znacznej ilo�ci zasobów systemowych, a nawet mo�e doprowadzi�do zawieszenia komputera.
Skoroszyt z tym przyk�adem (Lista czcionek.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Sortowanie tablicy
Co prawda Excel posiada wbudowane polecenie sortuj�ce zakresy arkusza, ale j�zyk VBAnie dysponuje metod� sortowania tablic. Skuteczne, ale niewygodne rozwi�zanie tegoproblemu polega na przeniesieniu zawarto�ci tablicy do zakresu arkusza, posortowaniujej przy u�yciu polecenia Excela, a nast�pnie wczytaniu wyniku do tablicy. Je�eli jednakszybko�� odgrywa du�� rol�, lepiej stworzy� w j�zyku VBA procedur� sortuj�c�.
W tym punkcie omówimy cztery ró�ne metody sortowania:
� Sortowanie arkuszowe polega na przeniesieniu zawarto�ci tablicy do zakresu arkusza,posortowaniu jej, a nast�pnie ponownym umieszczeniu w tablicy. Jedynymargumentem procedury opartej na tej metodzie jest tablica.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 375
Rysunek 11.15.Wy�wietlanie listyczcionek przy u�yciutych samych czcionek
� Sortowanie b�belkowe jest prost� metod� sortowania (zastosowano j� te�w przyk�adzie demonstruj�cym sortowanie arkusza w rozdziale 9.). Co prawdametoda sortowania b�belkowego jest �atwa w kodowaniu, ale ma raczej powolnyalgorytm, zw�aszcza gdy przetwarzaniu podlega du�a liczba elementów.
� Sortowanie metod� quick-sort (sortowanie szybkie) w porównaniu z b�belkowymjest o wiele szybsz� metod� sortowania, ale te� znacznie trudniejsz� do zrozumienia.Metoda mo�e zosta� wykorzystana tylko w przypadku takich typów danych,jak Integer lub Long.
� Sortowanie zliczaj�ce jest bardzo szybkie, ale równie� trudne do zrozumienia.Technika ta, podobnie jak sortowanie szybkie, dzia�a tylko w przypadku takich typówdanych, jak Integer lub Long.
Na do��czonym dysku CD-ROM znajduje si� skoroszyt o nazwie Sortowanie.xlsm, któryporównuje wy�ej wymienione metody sortowania. Skoroszyt przydaje si� w przypadkuporównywania metod sortowania tablic o ró�nych rozmiarach. Oczywi�cie w razie potrzebymo�esz skopiowa� z niego odpowiednie procedury i u�y� ich w swoich programach.
Na rysunku 11.16 pokazano okno dialogowe naszego programu. Procedury sortuj�ce zosta�yprzetestowane przy u�yciu tablic o siedmiu ró�nych rozmiarach licz�cych od 100 do100 000 elementów. W tablicach zawarte by�y warto�ci losowe typu Long.
376 Cz��� III � J�zyk Visual Basic for Applications
Rysunek 11.16.Porównanie czasupotrzebnegodo wykonania operacjisortowania tablico ró�nych rozmiarach
W tabeli 11.1 zawar�em wyniki testów. Warto�� 0,00 oznacza, �e sortowanie zosta�ozako�czone prawie natychmiast w czasie krótszym ni� 0,01 sekundy.
Tabela 11.1. Czas trwania (wyra�ony w sekundach) operacji sortowania tablic wype�nionych losowymiwarto�ciami przy u�yciu czterech algorytmów sortuj�cych
Liczbaelementów tablicy
Sortowaniearkuszowe Excela
Sortowanieb�belkoweprzy u�yciuj�zyka VBA
Sortowanieszybkieprzy u�yciuj�zyka VBA
Sortowaniezliczaj�ceprzy u�yciuj�zyka 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 wyj�tkowo szybki, zw�aszcza �e operacja uwzgl�d-nia przeniesienie zawarto�ci tablicy do arkusza, sortowanie jej i ponowne wczytanie danychdo tablicy. Je�eli tablica jest ju� prawie posortowana, sortowanie arkuszowe b�dzie jeszczeszybsze.
Algorytm sortowania b�belkowego jest do�� szybki w przypadku niewielkich tablic, aleprzy wi�kszych (licz�cych ponad 5000 elementów) powiniene� po prostu o nim zapo-mnie�. Sortowanie szybkie oraz sortowanie zliczaj�ce s� bardzo szybkie, ale ich funkcjo-nalno�� jest ograniczona jedynie do danych typu Interger oraz Long.
Przetwarzanie grupy plików
Jednym z cz�stych zastosowa� makr jest oczywi�cie kilkakrotne powtarzanie okre�lonejoperacji. Przyk�ad przedstawiony poni�ej ilustruje, jak przy u�yciu makra przetworzy�kilka ró�nych plików zapisanych na dysku. Procedura, która mo�e pomóc w napisaniu
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 377
w�asnego makra realizuj�cego tego typu zadanie, prosi u�ytkownika o podanie wzorcanazw plików, a nast�pnie przetwarza wszystkie pliki, których nazwy s� z nim zgodne.W tym przypadku operacja przetwarzania polega na zaimportowaniu pliku i wprowadzeniugrupy formu� sumuj�cych, 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' Okre�lenie �cie�ki 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 pozosta�ych 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 p�tli For i = 1 To FoundFiles Call ProcessFiles(FileList(i)) Next iEnd Sub
Skoroszyt z tym przyk�adem (Przetwarzanie wsadowe.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki. Przyk�ad korzysta z trzech dodatkowych plików, równie�znajduj�cych si� na dysku CD-ROM. S� to: text01.txt, text02.txt i text03.txt. Abyzaimportowa� inne pliki tekstowe, b�dziesz musia� odpowiednio zmodyfikowa� kodprocedury.
Nazwy plików pasuj�ce do wzorca s� przechowywane w tablicy o nazwie FoundFiles.Pliki s� przetwarzane przy u�yciu p�tli For ... Next. W trakcie przetwarzania wewn�trzp�tli jest wywo�ywana prosta procedura ProcessFiles. W celu zaimportowania plikukorzysta ona z metody OpenText, a nast�pnie wstawia pi�� formu�. Oczywi�cie zamiastponi�szej mo�na zastosowa� w�asn� procedur�.Sub ProcessFiles(FileName As String)' Importowanie pliku Workbooks.OpenText FileName:=FileName, _ Origin:=xlWindows, _ StartRow:=1, _ DataType:=xlFixedWidth, _
378 Cz��� III � J�zyk Visual Basic for Applications
FieldInfo:= _ Array(Array(0, 1), Array(3, 1), Array(12, 1))' Wprowadzanie formu� podsumowuj�cych 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
Wi�cej szczegó�owych informacji na temat pracy z plikami z poziomu j�zyka VBAznajdziesz w rozdziale 27.
Ciekawe funkcje,których mo�esz u�y� w swoich projektach
W tym podrozdziale zaprezentujemy kilka niestandardowych funkcji, które mo�na albobezpo�rednio stosowa� w aplikacjach u�ytkowych, albo modyfikowa�, traktuj�c je jakotwórcz� inspiracj�. Najprzydatniejsze s� wtedy, gdy wywo�uje si� je z innej proceduryj�zyka VBA. Procedury zosta�y zadeklarowane przy u�yciu s�owa kluczowego Private,dzi�ki czemu nie b�d� widoczne w oknie dialogowym Wstawianie funkcji Excela.
Skoroszyt z tym przyk�adem (Funkcje u�ytkowe VBA.xlsm) znajdziesz na p�ycie CD-ROM do��czonej do ksi��ki.
Funkcja FileExists
Funkcja pobiera jeden argument (�cie�ka pliku wraz z jego nazw�) i zwraca warto�� True,je�eli plik istnieje:Private Function FileExists(fname) As Boolean' Zwraca warto� True, je�eli istnieje plik FileExists = (Dir(fname) <> "")End Function
Funkcja FileNameOnly
Funkcja pobiera jeden argument (�cie�ka pliku wraz z jego nazw�) i zwraca tylko nazw�pliku (innymi s�owy — usuwa �cie�k� pliku):Private Function FileNameOnly(pname) As String' Zwraca nazw� pliku pobran� z �a�cucha z�o�onego ze �cie�ki i nazwy pliku Dim temp As Variant length = Len(pname) temp = Split(pname, Application.PathSeparator) FileNameOnly = temp(UBound(temp))End Function
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 379
Funkcja FileNameOnly wykorzystuje funkcj� Split VBA, która pobiera �a�cuch tekstu(oraz separator) i zwraca tabel� typu Variant, zawieraj�c� elementy �a�cucha znajduj�cesi� pomi�dzy znakami separatora. W tym przypadku zmienna temp zawiera tablic� z �a�cu-chami tekstu znajduj�cymi si� pomi�dzy separatorami definiowanymi przez Application.�PathSeparator (zaznaczaj s� to znaki lewego uko�nika). Inny przyk�ad zastosowaniafunkcji Split znajdziesz w podrozdziale „Wyznaczanie n-tego elementu �a�cucha”w dalszej cz��ci tego rozdzia�u.
Je�eli argumentem wywo�ania funkcji jest �cie�ka c:\excel files\2010\backup\budget.xlsm,funkcja zwróci �a�cuch budget.xlsm.
Funkcja FileNameOnly przetwarza dowoln� �cie�k� i nazw� pliku (nawet je�eli plik nieistnieje). Je�eli plik istnieje, poni�sza funkcja oferuje prostsz� metod� usuwania �cie�kii zwracania tylko nazwy pliku:Private Function FileNameOnly2(pname) As String FileNameOnly2 = Dir(pname)End Function
Funkcja PathExists
Funkcja pobiera jeden argument (�cie�ka pliku) i zwraca warto�� True, je�eli �cie�kaistnieje:Private Function PathExists(pname) As Boolean' Zwraca warto� True, je�eli istnieje �cie�ka If Dir(pname, vbDirectory) = "" Then PathExists = False Else PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End IfEnd Function
Funkcja RangeNameExists
Funkcja pobiera jeden argument (nazwa zakresu) i zwraca warto�� True, je�eli w aktyw-nym skoroszycie istnieje nazwa zakresu:Private Function RangeNameExists(nname) As Boolean' Zwraca warto� True, je�eli 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 nEnd Function
Inny sposób napisania takiej funkcji przedstawiono poni�ej. Funkcja w tej wersji pró-buje utworzy� zmienn� obiektow� przy u�yciu nazwy zakresu. Je�eli taka próba zako�-czy si� wygenerowaniem b��du, oznacza to, �e dana nazwa zakresu nie istnieje.
380 Cz��� III � J�zyk Visual Basic for Applications
Private Function RangeNameExists2(nname) As Boolean' Zwraca warto� True, je�eli istnieje nazwa zakresu Dim n As Range On Error Resume Next Set n = Range(nname) If Err.Number = 0 Then RangeNameExists2 = True _ Else RangeNameExists2 = FalseEnd Function
Funkcja SheetExists
Funkcja pobiera jeden argument (nazwa arkusza) i zwraca warto�� True, je�eli w aktyw-nym skoroszycie istnieje arkusz o takiej nazwie:Private Function SheetExists(sname) As Boolean' Zwraca warto� True, je�eli 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 = FalseEnd Function
Sprawdzanie, czy obiekt nale�y do kolekcji
Poni�sza procedura Function jest prost� funkcj� sprawdzaj�c�, czy dany obiekt nale�y 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 NothingEnd Function
Funkcja pobiera dwa argumenty — kolekcj� (obiekt) i element (�acuch), który mo�e, ale niemusi nale�e� do kolekcji. Funkcja próbuje utworzy� zmienn� obiektow� reprezentuj�c� elementkolekcji. Je�eli próba si� powiedzie, funkcja zwraca warto�� True. W przeciwnym razie funkcja zwracawarto�� False.
Funkcji IsInCollection mo�na u�y� zamiast trzech innych funkcji wymienionych w rozdziale(RangeNameExists, SheetExists i WorkbookIsOpen). Aby na przyk�ad stwierdzi�, czy w aktywnymskoroszycie istnieje zakres o nazwie Data, nale�y wywo�a� funkcj� IsInCollection przy u�yciuponi�szej instrukcji:
MsgBox IsInCollection(ActiveWorkbook.Names, "Data")
Aby stwierdzi�, czy otwarto skoroszyt o nazwie bud�et.xlsx, nale�y u�y� nast�puj�cej instrukcji:
MsgBox IsInCollection(Workbooks, "bud�et.xlsx")
Aby stwierdzi�, czy aktywny skoroszyt zawiera arkusz o nazwie Arkusz1, nale�y u�y� nast�puj�cejinstrukcji:
MsgBox IsInCollection(ActiveWorkbook.Worksheets, "Arkusz1")
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 381
Funkcja WorkbookIsOpen
Funkcja pobiera jeden argument (nazwa skoroszytu) i zwraca warto�� True, je�eli skoro-szyt jest otwarty:Private Function WorkbookIsOpen(wbname) As Boolean' Zwraca warto� True, je�eli skoroszyt jest otwarty Dim x As Workbook On Error Resume Next Set x = Workbooks(wbname) If Err = 0 Then WorkbookIsOpen = True _ Else WorkbookIsOpen = FalseEnd Function
Pobieranie warto�ci z zamkni�tego skoroszytu
J�zyk VBA nie posiada metody umo�liwiaj�cej pobranie warto�ci z zamkni�tego skoro-szytu. W razie potrzeby mo�emy jednak skorzysta� z faktu, �e Excel obs�uguje ��cza doplików. Zamieszczona poni�ej funkcja GetValue j�zyka VBA pobiera warto�� z zamkni�-tego skoroszytu. Zadanie to jest realizowane poprzez wywo�anie starszego typu makra XLM,które by�o stosowane w wersjach Excela sprzed wersji 5. Na szcz��cie, jak wida�, Excelnadal obs�uguje makra tego starego typu.Private Function GetValue(path, file, sheet, ref)' Pobiera warto� z zamkni�tego 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 — �cie�ka zamkni�tego pliku (np. "d:\pliki");
� file — nazwa pliku skoroszytu (np. "bud�et.xlsx");
� sheet — nazwa arkusza (np. "Arkusz1");
� ref — odwo�anie do komórki (np. "C4").
Poni�sza procedura Sub demonstruje, w jaki sposób u�y� funkcji GetValue. Procedurawy�wietla po prostu warto�� w komórce A1 arkusza Arkusz1 pliku o nazwie 2010Bud�et.xlsxznajduj�cego si� w katalogu XLPliki\Bud�et na dysku C.Sub TestGetValue() Dim p As String, f As String Dim s As String, a As String
382 Cz��� III � J�zyk Visual Basic for Applications
p = "c:\XLPliki\Bud�et" f = "2010Bud�et.xlsx" s = "Arkusz1" a = "A1" MsgBox GetValue(p, f, s, a)End Sub
Kolejna procedura odczytuje z zamkni�tego pliku 1200 warto�ci (zajmuj�cych obszar100 wierszy�12 kolumn), a nast�pnie 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\Bud�et" f = "2010Bud�et.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 rEnd Sub
Funkcja GetValue nie zadzia�a po zastosowaniu jej w formule arkuszowej. W praktycenie ma jednak �adnej potrzeby umieszczania tej funkcji w jakiejkolwiek formule. W celupobrania warto�ci z zamkni�tego pliku wystarczy stworzy� ��cze do komórki znajduj�cejsi� w takim pliku.
Skoroszyt z tym przyk�adem (Pobieranie warto�ci z zamkni�tego pliku.xlsm) znajdzieszna p�ycie CD-ROM do��czonej do ksi��ki. Procedury zawarte w tym skoroszycie pobieraj�dane ze skoroszytu o nazwie Mój skoroszyt.xlsx.
U�yteczne, niestandardowe funkcje arkuszoweW tym podrozdziale zamie�cili�my przyk�ady niestandardowych funkcji, które mo�nazastosowa� w formu�ach arkusza. Pami�taj, �e takie funkcje (procedury typu Function),musz� zosta� zdefiniowane w module VBA, a nie w modu�ach powi�zanych z obiektamitakimi jak ThisWorkbook, Arkusz1 lub UserForm1.
Skoroszyt z przyk�adami omawianymi w tym podrozdziale (Funkcje arkuszowe.xlsm)znajdziesz na p�ycie CD-ROM do��czonej do ksi��ki.
Funkcje zwracaj�ce informacje o formatowaniu komórki
W tym podrozdziale znajdziesz szereg niestandardowych funkcji zwracaj�cych ró�no-rodne informacje o sposobie formatowania komórki. Funkcje takie s� przydatne na przy-k�ad w sytuacji, kiedy trzeba posortowa� dane w oparciu o formatowanie (np. gdy szukaszwszystkich komórek, wobec których u�yto pogrubienia).
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 383
Takie funkcje nie zawsze s� automatycznie przeliczane, poniewa� zmiana formatowanianie uaktywnia mechanizmu Excela wykonuj�cego ponowne obliczenia. Aby wymusi�ponowne obliczenie wszystkich skoroszytów wraz z aktualizacj� warto�ci funkcjiniestandardowych, nale�y nacisn�� kombinacj� klawiszy Ctrl+Alt+F9.
Innym rozwi�zaniem jest umieszczenie w kodzie �ród�owym funkcji nast�puj�cegopolecenia:
Application.Volatile
Po zastosowaniu tego polecenia naci�ni�cie klawisza F9 spowoduje ponowne przeliczeniearkusza wraz z funkcjami niestandardowymi.
Poni�sza funkcja zwraca warto�� True, je�eli w jednokomórkowym zakresie b�d�cymjej argumentem zastosowano pogrubienie. Je�eli jako argument wywo�ania funkcji zosta-nie przekazany zakres, funkcja u�yje lewej, górnej komórki tego zakresu:Function IsBold(cell) As Boolean' Zwraca warto� True, je�eli zawarto� komórki zosta�a pogrubiona IsBold = cell.Range("A1").Font.BoldEnd Function
Pami�taj, �e takie funkcje dzia�aj� poprawnie tylko z komórkami, którym formatowaniezosta�o nadane bezpo�rednio za pomoc� polece� i przycisków formatuj�cych i nie b�d�dzia�a�y w przypadku formatowania nadanego za pomoc� mechanizmu formatowaniawarunkowego. W Excelu 2010 wprowadzony zosta� nowy obiekt, DisplayFormat, którypotrafi obs�ugiwa� elementy formatowania warunkowego. Poni�ej zamieszczamy now�wersj� funkcji IsBold — zwraca ona poprawne wyniki równie� dla komórek, którychzawarto�� zosta�a pogrubiona za po�rednictwem formatowania warunkowego:Function IsBold(cell) As Boolean' Zwraca warto� True, je�eli zawarto� komórki zosta�a pogrubiona (z uwzgl�dnieniem formatowania warunkowego) IsBold = cell.Range("A1").DisplayFormat.Font.BoldEnd Function
Poni�sza funkcja zwraca warto�� True, je�eli w komórce b�d�cej jej argumentem zasto-sowano kursyw�:Function IsItalic(cell) As Boolean' Zwraca warto� True, je�eli w komórce u�yto kursywy IsItalic = cell.Range("A1").Font.ItalicEnd Function
Je�eli w komórce zostanie zastosowane mieszane formatowanie (np. tylko wybrane znakizostan� pogrubione), obie powy�sze funkcje zwróc� b��d. Kolejna funkcja zwróci warto��True tylko wtedy, gdy wszystkie znaki z komórki b�d� pogrubione:Function AllBold(cell) As Boolean' Zwraca warto� True, je�eli wszystkie znaki z komórki s� pogrubione If IsNull(cell.Font.Bold) Then AllBold = False Else AllBold = cell.Font.Bold End IfEnd Function
384 Cz��� III � J�zyk Visual Basic for Applications
Funkcja AllBold mo�e zosta� uproszczona do nast�puj�cej postaci:Function AllBold (cell) As Boolean' Zwraca warto� True, je�eli wszystkie znaki z komórki s� pogrubione AllBold = Not IsNull(cell.Font.Bold)End Function
Funkcja FillColor zwraca liczb� ca�kowit� odpowiadaj�c� indeksowi koloru t�a komórki(czyli inaczej mówi�c, indeksowi koloru jej wype�nienia). Kolor t�a komórki zwyklezale�y od wybranego stylu formatowania arkusza. Je�eli t�o komórki nie zostanie wype�-nione, funkcja zwraca warto�� –4142.
Ta funkcja nie dzia�a poprawnie kolorami t�a tabel (definiowanych za pomoc� poleceniaTabela, znajduj�cego si� na karcie Wstawianie, w grupie polece� Tabele). Aby uwzgl�d-ni� kolory t�a tabel, powiniene� u�y� obiektu DisplayFormat, o którym wspominali�mywcze�niej.Function FillColor(cell) As Integer' Zwraca liczb� ca�kowit� odpowiadaj�c� kolorowi t�a komórki FillColor = cell.Range("A1").Interior.ColorIndexEnd Function
Gadaj�cy arkusz?
Funkcja SayIt wykorzystuje wbudowany w Excela generator mowy to odczytywania „nag�os” przekazanego jej argumentu (którym mo�e by� �a�cuch tekstu lub odwo�anie dowybranej komórki).Function SayIt(txt) Application.Speech.Speak (txt) SayIt = txtEnd Function
Opisywana funkcja daje ca�kiem interesuj�ce efekty i mo�e by� naprawd� u�yteczna.Spróbuj u�y� tej funkcji na przyk�ad w nast�puj�cej formule:=IF(SUM(A:A)>25000,SayIt("Cel zosta� osigni�ty!"))
Je�eli suma warto�ci w kolumnie A przekroczy warto�� 25000, us�yszysz zsyntetyzowanyg�os rado�nie oznajmiaj�cy, �e cel zosta� osi�gni�ty. Metody Speak mo�esz równie�u�y� do powiadomienia o zako�czeniu d�ugo dzia�aj�cej procedury. W ten sposób po uru-chomieniu procedury b�dziesz móg� zaj�� si� czym� innym, a Excel sam powiadomi Ci�,kiedy procedura wreszcie zako�czy dzia�anie.
Wy�wietlanie daty zapisania lub wydrukowania pliku
Skoroszyt Excela posiada szereg wbudowanych w�a�ciwo�ci dokumentu, które s� dost�pnedla programów VBA za po�rednictwem w�a�ciwo�ci BuiltinDocumentProperties obiektuWorkbook. Poni�sza funkcja zwraca dat� i czas wykonania ostatniej operacji zapisuskoroszytu:Function LastSaved() Application.Volatile
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 385
LastSaved = ThisWorkbook. _ BuiltinDocumentProperties("Last Save Time")End Function
Data i czas ostatniego zapisu, zwracane przez t� funkcj�, to dok�adnie ta sama informacja,jak� znajdziesz w sekcji Powi�zane daty widoku Backstage, dost�pnego po przej�ciu nakart� Plik i wybraniu polecenia Informacje. Pami�taj, �e mechanizm automatycznego zapisurównie� modyfikuje te dane, st�d znacznik czasu ostatniego zapisu dokumentu niekoniecz-nie musi by� to�samy z tym, kiedy dany dokument zosta� zapisany przez u�ytkownika.
Poni�sza funkcja jest podobna do poprzedniej, z tym �e zwraca dat� i czas wykonaniaostatniej operacji drukowania lub podgl�du wydruku dla skoroszytu. Je�eli skoroszyt nieby� jeszcze nigdy drukowany ani u�ytkownik nigdy nie korzysta� z opcji podgl�du wydruku,funkcja zwraca b��d #ARG!:Function LastPrinted() Application.Volatile LastPrinted = ThisWorkbook. _ BuiltinDocumentProperties("Last Print Date")End Function
Je�eli u�yjesz tych funkcji w formule, to w celu uzyskania aktualnych warto�ci w�a�ciwo�ciskoroszytu mo�e by� konieczne wymuszenie wykonania ponownych oblicze� (poprzezwci�ni�cie klawisza F9).
Istnieje ca�kiem sporo dodatkowych wbudowanych w�a�ciwo�ci, ale Excel nie korzystaze wszystkich. Na przyk�ad próba u�ycia w�a�ciwo�ci Number of Bytes spowodujewygenerowanie b��du. Pe�n� list� wbudowanych w�a�ciwo�ci skoroszytów znajdzieszw pomocy systemowej programu Excel.
Funkcje LastSaved i LastPrinted zosta�y zaprojektowane z my�l� o przechowywaniu ichw skoroszycie, w którym s� u�ywane. W niektórych przypadkach funkcja mo�e zosta�umieszczona w innym skoroszycie (np. personal.xlsb) lub dodatku. Poniewa� obie powy�-sze funkcje odwo�uj� si� do w�a�ciwo�ci ThisWorkbook, po zapisaniu ich w innym sko-roszycie nie b�d� dzia�a�y poprawnie. Poni�ej zawarto wersje tych funkcji o bardziejuniwersalnym przeznaczeniu. Funkcje u�ywaj� w�a�ciwo�ci Application.Caller, którazwraca obiekt klasy Range reprezentuj�cy komórk� wywo�uj�c� funkcj�. W�a�ciwo��Parent.Parent zwraca skoroszyt (obiekt Workbook), czyli obiekt nadrz�dny przodka obiektuRange. Zagadnienie to zostanie omówione dok�adniej w nast�pnym podrozdziale.Function LastSaved2() Application.Volatile LastSaved2 = Application.Caller.Parent.Parent. _ BuiltinDocumentProperties("Last Save Time")End Function
Obiekty nadrz�dne
Jak pami�tasz, model obiektowy Excela ma posta� hierarchiczn� — poszczególne obiektys� 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.Poni�sza hierarchia ilustruje miejsce, jakie w tym schemacie zajmuje obiekt Range:
386 Cz��� III � J�zyk Visual Basic for Applications
obiekt Application obiekt Workbook obiekt Worksheet obiekt Range
W j�zyku programowania obiektowego mówimy, �e przodkiem (obiektem nadrz�dnym)obiektu Range jest obiekt Worksheet, b�d�cy jego kontenerem. Przodkiem obiektu Work�sheet jest obiekt Workbook przechowuj�cy arkusz. Z kolei obiektem nadrz�dnym obiektuWorkbook jest obiekt Application.
W jaki sposób wykorzysta� t� informacj� w praktyce? Przeanalizujmy poni�sz� funkcj�SheetName j�zyka VBA. Funkcja pobiera jeden argument (zakres) i zwraca nazw� arkuszazawieraj�cego zakres. Funkcja u�ywa w�a�ciwo�ci Parent obiektu Range. W�a�ciwo��Parent zwraca obiekt przechowuj�cy obiekt Range.Function SheetName(ref) As String SheetName = ref.Parent.NameEnd Function
Kolejna funkcja WorkbookName zwraca nazw� skoroszytu zawieraj�cego okre�lon� komórk�.Zauwa�, �e funkcja dwukrotnie u�ywa w�a�ciwo�ci Parent. Pierwsza w�a�ciwo�� Parentzwraca obiekt Worksheet, a druga — obiekt Workbook.Function WorkbookName(ref) As String WorkbookName = ref.Parent.Parent.NameEnd Function
Poni�sza funkcja AppName przenosi nas na kolejny poziom w hierarchii, trzykrotnie korzy-staj�c z w�a�ciwo�ci Parent. Funkcja zwraca nazw� obiektu Application powi�zanegoz okre�lon� komórk�. Oczywi�cie w naszym przypadku funkcja zawsze b�dzie zwraca�awarto�� Microsoft Excel.Function AppName(ref) As String AppName = ref.Parent.Parent.Parent.NameEnd Function
Zliczanie komórek, których warto�ci zawieraj� si�pomi�dzy dwoma warto�ciami
Poni�sza funkcja o nazwie CountBetween zwraca liczb� warto�ci w zakresie (pierwszyargument), mieszcz�cych si� pomi�dzy dwoma warto�ciami reprezentowanymi przezdrugi i trzeci argument:Function CountBetween(InRange, num1, num2) As Long' Zlicza warto�ci z przedzia�u od num1 do num2 With Application.WorksheetFunction If num1 <= num2 Then CountBetween = .CountIfs(InRange, ">=" & num1, _ InRange, "<=" & num2) Else CountBetween = .CountIfs(InRange, ">=" & num2, _ InRange, "<=" & num1)
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 387
End If End WithEnd Function
Funkcja korzysta z funkcji arkuszowej COUNTIFS (LICZ.WARUNKI) Excela i w praktyce spe�-nia rol� funkcji os�onowej upraszczaj�cej tworzone formu�y.
Funkcja LICZ.WARUNKI zosta�a wprowadzona w Excelu 2007, st�d taka funkcja nie b�dziedzia�a�a z wcze�niejszymi wersjami Excela.
Poni�ej zamieszczono przyk�ad formu�y korzystaj�cej z funkcji CountBetween, zwracaj�-cej liczb� komórek zakresu A1:A100, których warto�ci s� wi�ksze lub równe 10 i mniejszelub równe 20:=CountBetween(A1:A100, 10, 20)
Funkcja pobiera dwa argumenty numeryczne w dowolnej kolejno�ci, st�d formu�a przed-stawiona poni�ej dzia�a dok�adnie tak samo, jak jej poprzedniczka:=CountBetween(A1:A100, 20, 10)
Zastosowanie tej funkcji j�zyka VBA jest zdecydowanie prostsze ni� wprowadzenie nast�-puj�cej d�ugiej (i jak wida� — dosy� z�o�onej) formu�y:=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.Ka�da z funkcji pobiera pojedynczy argument, którym jest zakres. Zakresem mo�e by�ca�a kolumna (funkcja LastInColumn) lub ca�y wiersz (funkcja LastInRow). Je�eli przeka-zany argument nie jest ca�� kolumn� lub wierszem, funkcja u�yje wiersza lub kolumnyokre�lonej przez górn� lew� komórk� zakresu. Poni�sza przyk�adowa formu�a zwracawarto�� ostatniej, niepustej komórki kolumny B:=LastInColumn(B5)
Kolejna formu�a zwraca warto�� ostatniej, niepustej komórki z wiersza 7:=LastInRow(C7:D9)
Oto kod ród�owy funkcji LastInColumn:Function LastInColumn(rng As Range)' Zwraca zawarto� ostatniej niepustej komórki kolumny Dim LastCell As Range Application.Volatile With rng.Parent With .Cells(.Rows.Count, rng.Column) If Not IsEmpty(.Value) Then LastInColumn = .Value ElseIf IsEmpty(.End(xlUp)) Then
388 Cz��� III � J�zyk Visual Basic for Applications
LastInColumn = "" Else LastInColumn = .End(xlUp).Value End If End With End WithEnd Function
Funkcja jest dosy� z�o�ona, dlatego poni�ej przedstawiamy kilka punktów, które mog�pomóc Ci zrozumie� jej sposób dzia�ania:
� Metoda Application.Volatile powoduje, �e funkcja zostanie wykonanaka�dorazowo przy obliczaniu arkusza.
� W�a�ciwo�� Rows.Count zwraca liczb� wierszy arkusza. Zamiast na sztywnowprowadza� w kodzie ród�owym liczb� wierszy arkusza, u�y�em w�a�ciwo�ciCount, poniewa� kolejna wersja Excela mo�e obs�ugiwa� jeszcze wi�ksz� ni�dotychczas liczb� wierszy.
� W�a�ciwo�� rng.Column zwraca numer kolumny górnej lewej komórki zakresub�d�cego warto�ci� argumentu rng.
� Zastosowanie w�a�ciwo�ci rng.Parent powoduje, �e funkcja b�dzie dzia�a�poprawnie nawet wtedy, gdy argument rng odwo�uje si� do innego arkusza lubskoroszytu.
� U�ycie metody End z argumentem xlUp jest równoznaczne z uaktywnieniem ostatniejkomórki kolumny, wci�ni�ciem klawisza End, a nast�pnie klawisza �.
� Funkcja IsEmpty sprawdza, czy komórka jest pusta. Je�eli tak jest, zwraca pusty�a�cuch. Gdyby funkcja IsEmpty nie zosta�a zastosowana, po napotkaniu pustejkomórki nasza funkcja zwróci�aby warto�� 0.
Poni�ej przedstawiamy kod ród�owy funkcji LastInRow, która jest bardzo podobna dofunkcji 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 WithEnd Function
Czy dany �a�cuch tekstu jest zgodny z wzorcem?
Funkcja IsLike jest bardzo prosta i jednocze�nie bardzo u�yteczna. Zwraca warto�� True,je�eli �a�cuch tekstowy jest zgodny ze zdefiniowanym wzorcem.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 389
Jak wida� poni�ej, kod funkcji jest bardzo prosty. Funkcja w�a�ciwie odgrywa rol� funkcjios�onowej, pozwalaj�cej na wygodne u�ycie w tworzonych formu�ach wszechstronnegooperatora Like j�zyka VBA:Function IsLike(text As String, pattern As String) As Boolean' Zwraca warto� True, je�eli pierwszy argument jest podobny do drugiego IsLike = text Like patternEnd Function
Funkcja IsLike pobiera dwa argumenty:
� text — �a�cuch tekstowy lub odwo�anie do komórki, która go zawiera;
� pattern — �a�cuch zawieraj�cy znaki wieloznaczne, które wymieniono w poni�szejtabeli.
Znaki zawarte we wzorcu Zawarto�� �a�cucha text zgodna ze wzorcem
? Dowolny pojedynczy znak
* 0 lub wi�cej dowolnych znaków
# Dowolna pojedyncza cyfra (0 – 9)
[lista_znaków] Dowolny pojedynczy znak znajduj�cy si� na li�cie_znaków
[!lista_znaków] Dowolny pojedynczy znak, który nie znajduje si�na li�cie_znaków
Poni�sza formu�a zwraca warto�� TRUE, poniewa� wzorzec * jest zgodny z dowoln�liczb� znaków. Formu�a zwraca warto�� TRUE, je�eli pierwszy argument jest dowolnym�a�cuchem tekstowym rozpoczynaj�cym si� od litery g:=IsLike("gitara", "g*")
Kolejna formu�a zwraca warto�� TRUE, poniewa� wzorzec ? jest zgodny z dowolnympojedynczym znakiem. Formu�a zwróci warto�� FALSE, je�eli warto�ci� pierwszego argu-mentu b�dzie �a�cuch Jednostka12:= IsLike("Jednostka1", "Jednostka?")
Nast�pna formu�a zwraca warto�� TRUE, poniewa� jej pierwszy argument jest pojedynczymznakiem zawartym w drugim argumencie:= IsLike("a", "[aeiou]")
Poni�sza formu�a zwraca warto�� TRUE, je�eli komórka A1 zawiera liter� a, e, i, o, u, A,E, I, O lub U. Przetworzenie argumentów przy u�yciu funkcji UPPER spowoduje, �e formu�anie b�dzie rozró�nia�a wielko�ci znaków:= IsLike(UPPER(A1), UPPER("[aeiou]"))
Poni�sza formu�a zwraca warto�� TRUE, je�eli komórka A1 zawiera warto�� rozpoczyna-j�c� si� cyfr� 1 i sk�adaj�c� si� dok�adnie z trzech cyfr (czyli dowoln� liczb� ca�kowit�z przedzia�u od 100 do 199):= IsLike(A1, "1##")
390 Cz��� III � J�zyk Visual Basic for Applications
Wyznaczanie n-tego elementu �a�cucha
Funkcja ExtractElement jest niestandardow� funkcj� arkusza (mo�e by� te� wywo�y-wana z procedury j�zyka VBA) wyznaczaj�c� n-ty element �a�cucha tekstowego. Je�elina przyk�ad komórka zawiera poni�szy tekst, w celu wydzielenia dowolnego pod�a�cuchazawartego pomi�dzy ��cznikami mo�na u�y� funkcji ExtractElement:123-456-789-0133-8844
Kolejna formu�a zwraca pod�a�cuch 0133 b�d�cy czwartym elementem �a�cucha (w roliseparatora w �a�cuchu jest u�ywany ��cznik):=ExtractElement("123-456-789-0133-8844", 4, "-")
Funkcja ExtractElement pobiera trzy argumenty:
� Txt — �a�cuch tekstowy, z którego s� wydzielane pod�a�cuchy (mo�e to by� litera�lub odwo�anie do komórki);
� n — liczba ca�kowita reprezentuj�ca wydzielany element;
� Separator — pojedynczy znak spe�niaj�cy funkcj� separatora.
Je�eli warto�ci� argumentu b�dzie spacja, ci�gi kilku spacji zostan� potraktowanychjak jedna spacja, co prawie zawsze b�dzie zgodne z Twoimi zamierzeniami. Je�eli warto��argumentu n przekroczy liczb� elementów �acucha, funkcja zwróci pusty �acuch.
Oto kod ród�owy funkcji ExtractElement j�zyka VBA:Function ExtractElement(Txt, n, Separator) As String' Zwraca n-ty element �a�cucha tekstowego, w którym poszczególne elementy oddziela okre�lony znak separatora Dim AllElements As Variant AllElements = Split(Txt, Separator) ExtractElement = AllElements(n - 1)End Function
Funkcja korzysta z funkcji Split j�zyka VBA zwracaj�cej tablic� typu Variant, którazawiera poszczególne elementy �a�cucha tekstowego. Indeks tablicy rozpoczyna si� odwarto�ci 0, a nie 1, dlatego odwo�ania do kolejnych elementów tablicy s� realizowanepoprzez wyra�enie n-1.
Zamiana warto�ci na s�owa1
Funkcja SPELLDOLLARS zwraca „s�own�” wersj� warto�ci numerycznych podanych jakoargument wywo�ania funkcji (tak jak w dobrze ka�demu znanej formu�ce S�OWNIE: spo-tykanej na blankietach przelewów i wp�at czy fakturach). Na przyk�ad formu�a przed-stawiona poni�ej zwraca nast�puj�cy �a�cuch tekstu: One hundred twenty-three and45/100 dollars (sto dwadzie�cia trzy dolary i 45 centów):=SPELLDOLLARS(123.45)
1 Uwaga: funkcja opisana w tym podrozdziale zwraca warto�ci w j�zyku angielskim — przyp. t�um.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 391
Na rysunku 11.17 przedstawiono kilka przyk�adów zastosowania funkcji SPELLDOLLARS.Formu�y zosta�y umieszczone w kolumnie C. Przyk�adowo formu�a umieszczona w komórceC1 ma nast�puj�c� posta�:=SPELLDOLLARS(A1)
Zwró� uwag� na fakt, �e warto�ci ujemne s� podawane w nawiasach.
Rysunek 11.17. Przyk�ady zastosowania funkcji SPELLDOLLARS
Funkcja SPELLDOLLARS jest zbyt z�o�ona, aby j� tutaj zaprezentowa� w ca�o�ci,ale skoroszyt zawieraj�cy pe�ny kod tej funkcji (Funkcje arkuszowe.xlsm) znajdzieszna p�ycie CD-ROM do��czonej do ksi��ki.
Funkcja wielofunkcyjna
Nast�pny przyk�ad prezentuje technik�, która mo�e okaza� si� przydatna w niektórychsytuacjach. Sprawia ona, �e pojedyncza funkcja arkusza zachowuje si� jak wiele funkcji.Poni�ej zamieszczamy kod ród�owy niestandardowej funkcji o nazwie StatFunction,która pobiera dwa argumenty — zakres (rng) i operacj� (op). W zale�no�ci od warto�ciargumentu op funkcja zwraca warto�� obliczon� przy u�yciu dowolnej z nast�puj�cychfunkcji arkuszowych: AVERAGE (�REDNIA), COUNT (ILE.LICZB), MAX, MEDIAN (MEDIANA), MIN,MODE (WYST.NAJCZ �CIEJ), STDEV (ODCH.STANDARDOWE), SUM (SUMA) lub VAR (WARIANCJA).
Funkcji StatFunction mo�esz u�y� w arkuszu w nast�puj�cy sposób:=StatFunction(B1:B24, A24)
Wynik formu�y zale�y od zawarto�ci komórki A24, która powinna by� takim �a�cuchem,jak Average, Count, Max itd. Podobn� technik� kodowania mo�esz 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)
392 Cz��� III � J�zyk 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 SelectEnd Function
Funkcja SheetOffset
Excel oferuje ograniczon� obs�ug� trójwymiarowych skoroszytów. Je�eli na przyk�adkonieczne jest odwo�anie do innego arkusza skoroszytu, w formule trzeba uwzgl�dni�nazw� arkusza. Nie stanowi to jednak du�ego problemu… do momentu próby skopiowa-nia formu�y do innych arkuszy. Skopiowane formu�y w dalszym ci�gu odwo�uj� si� donazwy oryginalnego arkusza, a odwo�ania do arkuszy nie s� modyfikowane tak, jak mia-�oby to miejsce w prawdziwym trójwymiarowym arkuszu.
W tym podrozdziale zosta� omówiony przyk�ad funkcji j�zyka VBA o nazwie SheetOffset,umo�liwiaj�cej stosowanie wzgl�dnych odwo�a� do arkuszy. Na przyk�ad w celu odwo�a-nia si� do komórki A1 poprzedniego arkusza nale�y u�y� formu�y:=SheetOffset(-1, A1)
Pierwszy argument funkcji, który mo�e by� warto�ci� dodatni�, ujemn� lub zerem, identy-fikuje wzgl�dne odwo�anie do arkusza. Drugi argument musi by� odwo�aniem do poje-dynczej komórki. Po skopiowaniu formu�y do innych arkuszy odwo�anie wzgl�dne b�dzieobowi�zywa�o we wszystkich jej kopiach.
Oto kod ród�owy funkcji SheetOffset j�zyka VBA:Function SheetOffset(Offset As Long, Optional Cell As Variant)' Zwraca zawarto� komórki wzgl�dnie adresowanego arkusza, do której zdefiniowano odwo�anie 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 wksEnd Function
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 393
Zwracanie maksymalnej warto�ci ze wszystkich arkuszy
Aby okre�li� maksymaln� warto�� komórki B1 z kilku arkuszy, mo�na zastosowa� formu��podobn� do poni�szej:=MAX(Arkusz1:Arkusz4!B1)
Formu�a zwraca maksymaln� warto�� komórki B1 z arkuszy Arkusz1, Arkusz4 i wszystkich,które znajduj� si� pomi�dzy nimi.
Co si� jednak stanie, gdy za arkuszem Arkusz4 zostanie wstawiony nowy arkusz Arkusz5?Formu�a nie uwzgl�dni tego automatycznie, dlatego konieczne b�dzie jej zmodyfikowaniew celu dodania nowego odwo�ania do arkusza:=MAX(Arkusz1:Arkusz5!B1)
Funkcja MaxAllSheets pobiera jeden argument i zwraca maksymaln� warto�� okre�lonejkomórki z wszystkich arkuszy skoroszytu. Przyk�adowo poni�sza formu�a zwraca mak-symaln� warto�� komórki B1 z uwzgl�dnieniem wszystkich arkuszy skoroszytu:=MaxAllSheets(B1)
Po dodaniu nowego arkusza nie b�dzie ju� potrzeby edytowania formu�y.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 ' Unikni�cie odwo�ania 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 = MaxValEnd Function
W celu uzyskania dost�pu do skoroszytu p�tla For Each u�ywa nast�puj�cego wyra�enia:cell.Parent.Parent.Worksheets
Obiektem nadrz�dnym komórki jest arkusz, natomiast przodkiem arkusza jest skoroszyt.Wynika z tego, �e p�tla For Each ... Next przetwarza wszystkie arkusze skoroszytu.Pierwsza instrukcja If z p�tli sprawdza, czy przetwarzana komórka zawiera funkcj�. Je�elitak jest, to w celu unikni�cia b��du odwo�ania cyklicznego komórka zostanie zignorowana.
394 Cz��� III � J�zyk Visual Basic for Applications
Opisana funkcja z �atwo�ci� mo�e zosta� zmodyfikowana tak, aby wykonywa�a inneobliczenia mi�dzyarkuszowe oparte na takich funkcjach, jak MIN, �REDNIA, SUMA itd.
Zwracanie tablicy zawieraj�cej unikatowe,losowo uporz�dkowane liczby ca�kowite
Funkcja RandomIntegers zamieszczona w tym punkcie zwraca tablic� unikatowych liczbca�kowitych. Stosowana jest w wielokomórkowych formu�ach tablicowych.{=RandomIntegers()}
Zaznacz zakres, a nast�pnie wprowad formu�� (bez nawiasów klamrowych) i zatwierdj� poprzez naci�ni�cie kombinacji klawiszy Ctrl+Shift+Enter. Formu�a zwraca tablic�zawieraj�c� unikatowe, losowo uporz�dkowane liczby ca�kowite. Je�eli na przyk�ad for-mu�a zostanie wprowadzona do zakresu z�o�onego z 50 komórek, jej kopie zwróc� uni-katowe liczby ca�kowite z przedzia�u od 1 do 50.
Oto kod ród�owy 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 b��d, je�eli warto� obiektu FuncRange jest zbyt du�a 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)' Wype�nienie tablicy losowymi warto�ciami i liczbami ca�kowitymi zakresu rng For i = 1 To CellCount ValArray(1, i) = Rnd ValArray(2, i) = i Next i' Sortowanie tablicy ValArray wed�ug wymiaru o losowej warto�ci For i = 1 To CellCount For j = i + 1 To CellCount If ValArray(1, i) > ValArray(1, j) Then Temp1 = ValArray(1, j) Temp2 = ValArray(2, j) ValArray(1, j) = ValArray(1, i)
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 395
ValArray(2, j) = ValArray(2, i) ValArray(1, i) = Temp1 ValArray(2, i) = Temp2 End If Next j Next i
' Wstawienie losowo uporz�dkowanych warto�ci 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 = VEnd Function
Porz�dkowanie zakresu w losowy sposób
Funkcja RangeRandomize pobiera jeden argument b�d�cy zakresem i zwraca tablic� z�o�on�z losowo uporz�dkowanych warto�ci 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 b��d, je�eli warto� obiektu rng jest zbyt du�a 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)' Wype�nienie tablicy ValArray losowymi warto�ciami i warto�ciami obiektu rng For i = 1 To CellCount ValArray(1, i) = Rnd ValArray(2, i) = rng(i) Next i' Sortowanie tablicy ValArray wed�ug wymiaru o losowej warto�ci For i = 1 To CellCount For j = i + 1 To CellCount If ValArray(1, i) > ValArray(1, j) Then Temp1 = ValArray(1, j) Temp2 = ValArray(2, j) ValArray(1, j) = ValArray(1, i) ValArray(2, j) = ValArray(2, i)
396 Cz��� III � J�zyk Visual Basic for Applications
ValArray(1, i) = Temp1 ValArray(2, i) = Temp2 End If Next j Next i
' Wstawienie losowo uporz�dkowanych warto�ci 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 = VEnd Function
Jak �atwo zauwa�y�, kod ród�owy tej funkcji jest bardzo podobny do kodu funkcji Random�Integers.
Na rysunku 11.18 pokazano wynik dzia�ania funkcji. Formu�a tablicowa zawarta w zakresieB2:B11 ma nast�puj�c� posta�:{=RangeRandomize(A2:A11)}
Formu�a zwraca zawarto�� komórek zakresu A2:A11, ale uporz�dkowanego w losowysposób.
Rysunek 11.18.FunkcjaRangeRandomizezwraca zawarto��komórek zakresuw przypadkowejkolejno�ci
Wywo�ania funkcji interfejsu Windows APIJedn� z najwa�niejszych cech j�zyka VBA jest mo�liwo�� wywo�ywania funkcji prze-chowywanych w bibliotekach DLL (ang. Dynamic Link Library). W przyk�adach zapre-zentowanych w tym podrozdziale b�dziemy korzystali z cz�sto u�ywanych funkcji inter-fejsu API systemu Windows.
Dla uproszczenia deklaracje funkcji API przedstawiane w tym podrozdziale dzia�aj� tylkow Excelu 2010 (zarówno w wersji 32-bitowej, jak i 64-bitowej), natomiast przyk�adyzamieszczone na dysku CD-ROM do��czonym do ksi��ki zawieraj� odpowiednie dyrektywykompilatora, dzi�ki czemu b�d� poprawnie dzia�a� równie� we wcze�niejszych wersjachExcela.
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 397
Okre�lanie skojarze� plików
W systemie Windows wiele typów plików jest kojarzonych z okre�lon� aplikacj�. Powykonaniu takiego skojarzenia plik mo�na otworzy� w powi�zanej z nim aplikacji poprzezdwukrotne klikni�cie pliku.
Funkcja GetExecutable w celu uzyskania pe�nej �cie�ki aplikacji skojarzonej z okre�lonymplikiem 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 okre�li� pe�n� �cie�k� aplikacjiotwieraj�cej plik po jego dwukrotnym klikni�ciu, mo�na u�y� funkcji GetExecutable.
Deklaracje funkcji interfejsu API systemu Windows musz� zosta� umieszczonena pocz�tku modu�u 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 wywo�ania funkcji GetExecutable, która jako argu-ment pobra�a nazw� pliku muzycznego w formacie MP3. Funkcja zwraca pe�n� �cie�k�aplikacji powi�zanej z plikiem.
Rysunek 11.19.Okre�lanie �cie�kiaplikacji powi�zanejz okre�lonym plikiem
Skoroszyt z tym przyk�adem (Skojarzenia plików.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Pobieranie informacji o nap�dach dyskowych
VBA nie posiada metody pozwalaj�cej na bezpo�rednie pobieranie informacji o zain-stalowanych w systemie nap�dach dyskowych. Jednak dzi�ki zastosowaniu trzech funkcjiAPI mo�esz uzyska� niezb�dne informacje.
Na rysunku 11.20 przedstawiono wynik dzia�ania procedury VBA, która identyfikujewszystkie pod��czone do systemu dyski, okre�la ich typ, sprawdza ca�kowit� pojemno��,rozmiar u�ytego miejsca oraz rozmiar wolnego miejsca.
398 Cz��� III � J�zyk Visual Basic for Applications
Rysunek 11.20. Zastosowanie funkcji Windows API do pobierania informacji o dyskach
Kod procedury jest dosy� d�ugi i z�o�ony, dlatego nie umieszczono go tutaj, ale je�eli jeste�ciekawy, jak to dzia�a, mo�esz zajrze� do odpowiedniego skoroszytu na p�ycie CD-ROMdo��czonej do ksi��ki.
Skoroszyt z tym przyk�adem (Informacja o dyskach.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Pobieranie informacji dotycz�cych drukarki domy�lnej
W kolejnym przyk�adzie u�yjemy funkcji interfejsu Windows API zwracaj�cej informacjena temat domy�lnej drukarki. Dane znajduj� si� w pojedynczym �a�cuchu tekstowym.Poni�sza procedura analizuje �a�cuch i wy�wietla informacje przy u�yciu bardziej czytel-nego dla u�ytkownika 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 urz�dzenia Port = Right(Result, ResultLength - Comma2)' Tworzy komunikat Msg = "Drukarka:" & Chr(9) & Printer & Chr(13)
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 399
Msg = Msg & "Sterownik:" & Chr(9) & Driver & Chr(13) Msg = Msg & "Port:" & Chr(9) & Port' Wy�wietla komunikat MsgBox Msg, vbInformation, "Informacje o drukarce domy�lnej"End Sub
Co prawda w�a�ciwo�� ActivePrinter obiektu Application zwraca nazw� domy�lnejdrukarki i umo�liwia jej zmian�, ale nie istnieje bezpo�rednia metoda okre�lenia, jakisterownik i port urz�dzenia jest u�ywany. Z tego w�a�nie powodu czasami przydatnamo�e by� nasza funkcja GetProfileStringA.
Na rysunku 11.21 pokazano przyk�adowe okno komunikatu wy�wietlone przez t� procedur�.
Rysunek 11.21.Informacja o drukarcedomy�lnej wy�wietlonaprzy u�yciu funkcjiinterfejsu API systemuWindows
Skoroszyt z tym przyk�adem (Informacja o drukarce.xlsm) znajdziesz na p�ycie CD-ROMdo��czonej do ksi��ki.
Pobieranie informacji o aktualnej rozdzielczo�ci karty graficznej
Zamieszczony w tym punkcie kod korzysta z funkcji interfejsu API w celu okre�leniaaktualnej rozdzielczo�ci karty graficznej u�ywanej w systemie. Je�eli u�ywana aplikacjamusi wy�wietli� okre�lon� ilo�� informacji na jednym ekranie, znajomo�� jego rozdziel-czo�ci mo�e pomóc we w�a�ciwym przeskalowaniu tekstu. Oprócz tego kod procedurysprawdza liczb� monitorów pod��czonych do komputera. Je�eli pod��czonych jest wi�cejmonitorów ni� jeden, procedura wy�wietla rozmiary pulpitu wirtualnego.Declare PtrSafe Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As LongPublic Const SM_CMONITORS = 80Public Const SM_CXSCREEN = 0Public Const SM_CYSCREEN = 1Public Const SM_CXVIRTUALSCREEN = 78Public Const SM_CYVIRTUALSCREEN = 79
Sub DisplayVideoInfo() Dim numMonitors As Long Dim vidWidth As Long, vidHeight As Long Dim virtWidth As Long, virtHeight As Long Dim Msg As String
numMonitors = GetSystemMetrics(SM_CMONITORS) vidWidth = GetSystemMetrics(SM_CXSCREEN) vidHeight = GetSystemMetrics(SM_CYSCREEN) virtWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN) virtHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN)
If numMonitors > 1 Then Msg = numMonitors & " monitory pod�czone" & vbCrLf
400 Cz��� III � J�zyk 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 MsgEnd Sub
Na rysunku 11.22 pokazano okno komunikatu zwrócone przez powy�sz� procedur� uru-chomion� w systemie u�ywaj�cym dwóch monitorów.
Rysunek 11.22.Zastosowanie funkcjiinterfejsu Windows APIdo okre�leniarozdzielczo�ci kartygraficznej
Skoroszyt z tym przyk�adem (Informacja o rozdzielczo�ci karty graficznej.xlsm) znajdzieszna p�ycie CD-ROM do��czonej do ksi��ki.
Dodanie dwi�ku do aplikacji
Przyk�ad, który omówiono w tym podrozdziale, pozwala na dodanie efektów dwi�kowychdo aplikacji Excela, a w szczególno�ci pozwala na odtwarzanie dwi�ków zapisanychw formacie MIDI lub WAV. Mo�esz na przyk�ad odtwarza� wybrany dwi�k w momencieotwierania danego okna dialogowego (lub nie…). Je�eli b�dziesz chcia�, aby Excel odtwa-rza� pliki w formacie MIDI lub WAV, w tej sekcji znajdziesz dok�adnie to, czego b�dzieszpotrzebowa�.
Skoroszyt z tym przyk�adem (Dwi�k.xlsm) znajdziesz na p�ycie CD-ROM do��czonejdo ksi��ki.
Odtwarzanie plików typu WAV
Poni�szy przyk�ad zawiera deklaracj� funkcji interfejsu API wraz z prost� procedur�odtwarzaj�c� plik dwi�kowy 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 = &H0Const SND_ASYNC = &H1Const SND_FILENAME = &H20000
Sub PlayWAV()
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 401
WAVFile = "sound.wav" WAVFile = ThisWorkbook.Path & "\" & WAVFile Call PlaySound(WAVFile, 0&, SND_ASYNC Or SND_FILENAME)End Sub
W przyk�adzie plik formatu WAV jest odtwarzany asynchronicznie. Oznacza to, �e w trak-cie odtwarzania kontynuowane jest wykonywanie procedury. Aby zatrzyma� wykonywa-nie kodu ród�owego podczas odtwarzania dwi�ku, nale�y u�y� nast�puj�cej instrukcji:Call PlaySound(WAVFile, 0&, SND_SYNC Or SND_FILENAME)
Odtwarzanie pliku formatu MIDI
W przypadku pliku formatu MIDI konieczne jest zastosowanie innej funkcji interfejsuAPI. Procedura PlayMIDI rozpoczyna odtwarzanie pliku formatu MIDI. Wykonanie pro-cedury StopMIDI spowoduje zako�czenie odtwarzania pliku. W przyk�adzie u�yto plikuo 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 dwi�ku przy u�yciu funkcji arkuszowej
Funkcja Alarm zosta�a stworzona z my�l� o zastosowaniu w formule arkusza. Je�eli komórkaspe�nia okre�lone kryterium, funkcja, u�ywaj�c interfejsu API systemu Windows, odtwarzaplik dwi�kowy.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 IfEnd Function
402 Cz��� III � J�zyk Visual Basic for Applications
Funkcja Alarm pobiera dwa argumenty — odwo�anie do komórki i warunek (maj�cy posta��a�cucha). Poni�sza formu�a u�ywa funkcji Alarm do odtworzenia pliku formatu WAV, gdywarto�� komórki B13 b�dzie wi�ksza lub równa 1000:=ALARM(B13; ">=1000")
W celu stwierdzenia, czy warto�� komórki spe�nia okre�lone kryterium, funkcja korzystaz funkcji Evaluate j�zyka VBA. Po spe�nieniu kryterium i wygenerowaniu dwi�ku funkcjazwróci warto�� True. W przeciwnym razie zwróci warto�� False.
Funkcja SayIt, omawiana wcze�niej w tym rozdziale, jest znacznie prostszym sposobemna wzbogacenie aplikacji w efekty d�wi�kowe.
Skoroszyt z tymi przyk�adami (dwi�k.xlsm) znajdziesz na p�ycie CD-ROM do��czonejdo ksi��ki.
Odczytywanie zawarto�ci rejestru systemu Windowsi zapisywanie w nim danych
Wi�kszo�� aplikacji Windows potrzebne informacje przechowuje w rejestrze systemub�d�cym baz� danych. Aby uzyska� dodatkowe informacje o rejestrze, nale�y zajrze� dorozdzia�u 4. Procedury j�zyka VBA s� w stanie odczytywa� dane z rejestru i zapisywa�w nim nowe warto�ci. Aby to by�o mo�liwe, konieczne jest zastosowanie nast�puj�cychdeklaracji 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 LongPrivate Declare PtrSafe Function RegCloseKey Lib "ADVAPI32.DLL" _ (ByVal hKey As Long) As LongPrivate 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 LongPrivate 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
Utworzy�em dwie funkcje os�onowe u�atwiaj�ce korzystanie z rejestru. S� to: GetRegistryi WriteRegistry. Obie znajduj� si� na do��czonym dysku CD-ROM, w skoroszycieo nazwie Rejestr systemu Windows.xlsm. Przyk�adowy skoroszyt zawiera procedur�demonstruj�c� odczyt i zapis danych w rejestrze.
Odczyt danych z rejestru
Funkcja GetRegistry zwraca ustawienia znajduj�ce si� w okre�lonej lokalizacji rejestru.Funkcja pobiera trzy argumenty:
Rozdzia� 11. � Przyk�ady i techniki programowania w j�zyku VBA 403
� RootKey — �a�cuch reprezentuj�cy g�ówny klucz rejestru, który zostanie u�yty.Oto mo�liwe �a�cuchy:
� HKEY_CLASSES_ROOT
� HKEY_CURRENT_USER
� HKEY_LOCAL_MACHINE
� HKEY_USERS
� HKEY_CURRENT_CONFIG
� Path — pe�na �cie�ka kategorii rejestru, która zostanie u�yta.
� RegEntry — nazwa ustawienia, które zostanie odczytane.
Aby na przyk�ad odnale� w rejestrze aktualne ustawienie powi�zane z aktywnym paskiemtytu�u okna, nale�y w sposób pokazany poni�ej wywo�a� 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 wy�wietli �cie�k� i nazw� pliku graficznego u�ytego w roli tapety pulpitu(je�eli tapeta nie jest u�ywana, funkcja zwróci pusty �a�cuch).
Zapis danych w rejestrze
Funkcja WriteRegistry zapisuje warto�� w okre�lonej lokalizacji rejestru. Je�eli operacjazako�czy si� powodzeniem, funkcja zwróci warto�� True. W przeciwnym razie zwróciwarto�� False. Funkcja WriteRegistry pobiera nast�puj�ce argumenty (wszystkie s� �a�-cuchami tekstu):
� RootKey — �a�cuch reprezentuj�cy klucz rejestru, który zostanie u�yty.Oto mo�liwe �a�cuchy:
� HKEY_CLASSES_ROOT
� HKEY_CURRENT_USER
� HKEY_LOCAL_MACHINE
� HKEY_USERS
� HKEY_CURRENT_CONFIG
� Path — pe�na �cie�ka kategorii rejestru (je�eli �cie�ka nie istnieje, zostanieutworzona).
� RegEntry — nazwa kategorii rejestru, w której zostanie zapisana warto�� (je�elikategoria nie istnieje, zostanie dodana).
� RegVal — zapisywana warto��.
404 Cz��� III � J�zyk Visual Basic for Applications
Poni�ej zamieszczono przyk�ad procedury zapisuj�cej w rejestrze warto�� reprezentuj�c�dat� i czas uruchomienia Excela. Informacja jest zapisywana w miejscu, w którym s� prze-chowywane ustawienia dotycz�ce 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 & " zosta�a zapisana w rejestrze." Else msg = "Wystpi� b�d." End If MsgBox msgEnd Sub
Je�eli zapiszesz t� procedur� w module ThisWorkbook skoroszytu makr osobistych, usta-wienia b�d� automatycznie aktualizowane przy ka�dym uruchomieniu programu Excel.
atwiejszy sposób uzyskania dost�pu do rejestru
Je�eli w celu zapisania i odczytania danych dost�p do rejestru systemu Windows chcesz uzyska�z poziomu aplikacji Excela, nie musisz stosowa� funkcji interfejsu API. Zamiast nich mo�na u�y�funkcji GetSetting i SaveSetting j�zyka VBA.
Obie funkcje zosta�y obja�nione w systemie pomocy, dlatego nie b�d� ich tutaj szczegó�owo oma-wia�. Jednak nale�y wiedzie�, �e funkcje te dzia�aj� tylko z kluczem o nast�puj�cej nazwie:
HKEY_CURRENT_USER\Software\VB and VBA Program Settings
Innymi s�owy, funkcje nie mog� zosta� zastosowane w celu uzyskania dost�pu do dowolnegoklucza rejestru. Funkcje te s� najbardziej przydatne do zapisywania informacji o w�asnych aplika-cjach Excela, które chcesz przechowa� pomi�dzy kolejnymi sesjami.