83

Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

  • Upload
    buiminh

  • View
    226

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha
Page 2: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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!

Page 3: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 4: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 5: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 6: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 7: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 8: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 9: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 10: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 11: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 12: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 13: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 14: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 15: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 16: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 17: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 18: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 19: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 20: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 21: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 22: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 23: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 24: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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:

Page 25: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 26: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 27: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 28: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 29: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 30: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 31: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 32: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 33: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 34: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 35: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 36: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 37: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 38: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 39: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 40: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 41: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 42: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 43: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 44: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 45: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 46: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 47: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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:

Page 48: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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:

Page 49: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 50: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 51: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 52: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 53: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 54: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 55: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 56: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 57: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 58: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 59: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 60: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 61: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 62: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 63: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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:

Page 64: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 65: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 66: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 67: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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##")

Page 68: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 69: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 70: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 71: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 72: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 73: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 74: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 75: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 76: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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)

Page 77: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 78: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 79: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 80: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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:

Page 81: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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

Page 82: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha

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.

Page 83: Excel 2010 PL. Programowanie w VBA. Vademecum Walkenbacha