You are on page 1of 29

Wicej ni Excel 2007.

166 gotowych rozwiza


i trikw w jzyku VBA
Autor: Mirosaw Lewandowski
ISBN: 978-83-246-1907-8
Format: 158235, stron: 224

Dopasuj Excela do swoich wymaga!


Narzdzia i zasady uywania VBA okno edytora, certyfikaty, zabezpieczenia
Makra i kod VBA tworzenie, uruchamianie, przykady konkretnych dziaa
Podstawy VBA typy danych, operacje na acuchach, interakcje z uytkownikiem
Bez umiejtnoci posugiwania si arkuszem kalkulacyjnym Excela trudno dzi
wyobrazi sobie jakkolwiek prac biurow. Jego wielofunkcyjno i elastyczno s
imponujce, ale wci jeszcze mona natkn si na obszary nie do koca odpowiadajce
specyficznym potrzebom danej firmy, stanowiska czy pracownika. Owszem, oglnie
wiadomo, e wbudowany w program jzyk VBA oferuje moliwo znacznego
zmodyfikowania ustawie i zapisania dodatkowych funkcji albo sekwencji dziaa,
jednak nie wszyscy potrafi sprawnie wykorzysta to narzdzie.
Ksika VBA dla Excela 2007. 166 praktycznych przykadw to cenny poradnik dla
tych, ktrym nie wystarcza znajomo podstawowych funkcji Excela. Znajdziesz w niej
ca mas przykadw kodu napisanego w jzyku VBA zastosowanie ktregokolwiek
z nich pozwala poczu rnic w dziaaniu programu. Jeli wic chciaby zarejestrowa
i uruchomi wasne makro, zdefiniowa funkcj, doda przycisk, jednym ruchem zamkn
wszystkie skoroszyty, wykona jak operacj na tablicach albo wywietli okrelony
komunikat, moesz zrobi to bez koniecznoci zagbiania si w tajniki programowania.
Prosto, szybko, skutecznie.
Narzdzie VBA w Excelu 2007
Zabezpieczenia Excela i Windows, certyfikaty cyfrowe
Rejestrator makr uruchamianie makr i funkcji
Definiowanie wasnej funkcji i okrelanie waciwoci makra/funkcji
Wymuszanie zezwolenia na makra przy uruchomieniu skoroszytu
Dodawanie przycisku lub ikon do wstki i komentarzy do komrki
Ochrona przed zmian nazwy arkusza i dynamiczne ukrywanie wierszy
Hipercze w formularzu i oknie komunikatu
Odczytywanie danych o systemie
Blokowanie wydrukw i dostpu do makr
Arkusz ofert
Typy danych, zmienne, stae i tablice
Typy zmiennych i staych, funkcje i operatory matematyczne
Interakcja z uytkownikiem i operacje na acuchach
Dodatki
Rozszerz potg Excela wykorzystaj gotowe kody VBA

Spis treci
Wstp ................................................................................... 5
Rozdzia 1. Excel 2007 nowe przyzwyczajenie ...................................... 7
Rozdzia 2. Narzdzie VBA w Excelu 2007 ................................................ 9
Okno edytora VBA ............................................................................................9

Rozdzia 3. Zanim zaczniemy ................................................................. 15


Sowo o zabezpieczeniach ...............................................................................15
Zabezpieczenia Excela ...............................................................................17
Certyfikaty cyfrowe ....................................................................................20
Zabezpieczenia Windows ...........................................................................21

Rozdzia 4. O VBA bez VBA .................................................................... 25


Rejestrator makr ...............................................................................................25
Przykad 1. Rejestrowanie makr .................................................................26
Przykad 2. Modyfikacja kodu z rejestratora ..............................................27
Uruchamianie makr i funkcji ...........................................................................30
Przykad 3. Uruchamianie makr za pomoc okna dialogowego Makro .....30
Przykad 4. Uruchamianie makr za pomoc kombinacji klawiszy .............31
Przykad 5. Wstawianie przycisku makra na pasku narzdzi Szybki dostp .... 32
Przykad 6. Uruchamianie makra za pomoc przycisku makra
wewntrz arkusza ....................................................................34
Przykad 7. Uruchamianie makra za pomoc zdarzenia .............................34
Przykad 8. Zakadka Dodatki na wstce ..................................................35
Przykad 9. Uruchamianie makra na podstawie analizy komrki ...............38
Przykad 10. Uruchamianie makr za pomoc formantu .............................39
Przykad 11. Uruchamianie makra na podstawie analizy komrki.
Sposb drugi ..........................................................................39
Przykad 12. Uruchamianie makra na podstawie analizy wartoci komrki.
Sposb trzeci .........................................................................41

Rozdzia 5. Przykady ............................................................................. 43


Przykad 13. Definiowanie wasnej funkcji. Konwertuj .............................43
Przykad 14. Definiowanie wasnej funkcji. Dzie tygodnia .....................44
Przykad 15. Dzie tygodnia duo atwiej ..................................................45

Wicej ni Excel 2007. 166 gotowych rozwiza i trikw w jzyku VBA

Przykad 16. Funkcja Sownie ....................................................................45


Przykad 17. Funkcja Sownie wersja 2 .................................................51
Przykad 18. Funkcja Sownie z podprogramem ........................................54
Przykad 19. Okrelenie waciwoci makra/funkcji za pomoc edytora ......58
Przykad 20. Okrelenie waciwoci makra/funkcji za pomoc VBA ......60
Przykad 21. Wstawianie funkcji arkuszowej do arkusza za pomoc VBA ...61
Przykad 22. Wymuszenie wczenia dodatku ...........................................62
Przykad 23. Zamknicie dodatku ..............................................................62
Przykad 24. Zamknicie dodatku uruchomionego przez nasz skoroszyt .......62
Przykad 25. Rozwizanie drugie stabilniejsze ......................................63
Przykad 26. Formatowanie warunkowe w zalenoci od wartoci
z innej komrki .....................................................................65
Przykad 27. Ile mamy otwartych skoroszytw? ........................................65
Przykad 28. Program w wersji trial ...........................................................66
Przykad 29. Wymuszanie zezwolenia na makra
przy uruchomieniu skoroszytu ..............................................67
Przykad 30. Dodanie przycisku do wstki w zakadce Dodatki ..............68
Przykad 31. Dodawanie komentarzy do komrki w zalenoci
od warunkw .........................................................................70
Przykad 32. Poszukiwanie ostatniego wiersza ..........................................71
Przykad 33. Ochrona przed zmian nazwy arkusza ..................................72
Przykad 34. Dynamiczne ukrywanie wierszy ............................................72
Przykad 35. Jednorazowe losowanie sposb 1 .....................................74
Przykad 36. Jednorazowe losowanie sposb 2 .....................................75
Przykad 37. Automatyczne uruchamianie ostatnich skoroszytw .............76
Przykad 38. Uruchamianie skoroszytw przy starcie programu ...............76
Przykad 39. Uruchamianie skoroszytw przy starcie programu
wersja non VBA ...............................................................77
Przykad 40. Uruchamianie wielu skoroszytw jednoczenie ....................78
Przykad 41. Pisanie formularza .............................................................79
Przykad 42. Hipercze w oknie komunikatu ............................................82
Przykad 43. Hipercze w formularzu .......................................................84
Przykad 44. Najprostszy komunikat ..........................................................86
Przykad 45. Komunikat bardziej skomplikowany .....................................86
Przykad 46. Okno dialogowe ....................................................................87
Przykad 47. Porada dnia ............................................................................87
Przykad 48. Porada dnia z opcjami w User form cz I .....................88
Przykad 49. Porada dnia z opcjami w User form cz II ....................89
Przykad 50. Czyszczenie formatowania
w komrkach niezawierajcych danych ................................91
Przykad 51. Wywietlanie postpu oblicze na pasku stanu .....................92
Przykad 52. Wywietlanie postpu oblicze na formularzu ......................93
Przykad 53. Jeszcze troch zabawy ...........................................................95
Przykad 54. Odczytywanie danych o systemie nazwa komputera .......95
Przykad 55. Odczytywanie danych o systemie nazwa uytkownika ....96
Przykad 56. Odczytywanie danych o systemie
rozdzielczo karty graficznej ..........................................96
Przykad 57. Odczytywanie danych o systemie wielko okna aplikacji .....97

Spis treci

Przykad 58. Odczytywanie danych o systemie


proba o zmian wielkoci okna ......................................98
Przykad 59. Wywietlanie okna w penym rozmiarze bez pytania ...........99
Przykad 60. Zamykanie wszystkich skoroszytw .....................................99
Przykad 61. Blokowanie wydrukw ........................................................100
Przykad 62. Blokada dostpu do makr ....................................................100
Przykad 63. Import tekstu z zewntrznego pliku tekstowego .................100
Przykad 64. Pobieranie danych z zamknitego skoroszytu Excela .........101
Przykad 65. Pobieranie danych z innego skoroszytu wersja 2 ...........102
Przykad 66. Dynamiczne tworzenie makra .............................................102
Przykad 67. Usuwanie kodu z moduu ....................................................103
Przykad 68. Zastpowanie moduu innym moduem ..............................103
Przykad 69. Przekazywanie moduu midzy plikami ..............................104
Przykad 70. Sprawdzanie ustawie dostpu do VBProject .....................105
Przykad 71. Uruchamianie innych aplikacji Windows ............................105
Przykad 72. Uruchamianie okien panelu sterowania ...............................105
Przykad 73. Zapis kopii zapasowej pliku z hasem .................................105
Przykad 74. Ostatnie zapisanie arkusza ...................................................107
Przykad 75. Przygotowanie wydruku z danymi
z arkusza innego ni widoczny ...........................................107
Przykad 76. Nie wszystko, co automatyczne, to VBA ............................108
Przykad 77. Automatyka formantw .......................................................110
Przykad 78. Wstka w Office 2007. To take nie VBA, ale... ...............110
Przykad 79. Dodawanie ikon do wstki .................................................113
Przykad 80. Arkusz ofert przykad,
o ktry najczciej pytaj czytelnicy ................................... 114
Przykad 81. Arkusz ofert otwieranie bazy ..........................................114
Przykad 82. Arkusz ofert cz 2 .......................................................115
Przykad 83. Arkusz ofert cz 3 .......................................................116
Przykad 84. Arkusz ofert cz 4 .......................................................117
Przykad 85. Arkusz ofert cz 5 .......................................................118
Przykad 86. Arkusz ofert czynnoci kocowe ....................................118

Rozdzia 6. Troch podstaw o VBA ....................................................... 119


Typy zmiennych i staych ..............................................................................119
Przykad 87. Typy zmiennych ..................................................................120
Przykad 88. Deklarowanie zmiennych ....................................................121
Wasny typ zmiennej ......................................................................................121
Przykad 89. Deklaracja wasnego typu zmiennej ....................................121
Przykad 90. Deklarowanie zmiennych za pomoc Const, Dim i Static ...123
Przykad 91. Sowa kluczowe Public i Private .........................................124
Przykad 92. Opcje moduu ......................................................................124
Przykad 93. Opcja Option Compare ........................................................125
Przykad 94. Konwersja typw danych ....................................................125
Przykad 95. Funkcje FormatNumber, FormatCurrency, FormatPercent ......128
Przykad 96. Funkcja FormatDateTime ....................................................129
Przykad 97. Sowo kluczowe ReDim ......................................................129
Przykad 98. Funkcje LBound i UBound .................................................130
Przykad 99. Operacje na tablicach ..........................................................130

Wicej ni Excel 2007. 166 gotowych rozwiza i trikw w jzyku VBA

Funkcje i operatory matematyczne ................................................................131


Przykad 100. Funkcje trygonometryczne ................................................131
Przykad 101. Funkcje Exp i Log .............................................................131
Przykad 102. Funkcja Sqr .......................................................................132
Przykad 103. Funkcje Randomize i Rnd .................................................132
Przykad 104. Funkcje Abs i Sgn .............................................................133
Przykad 105. Funkcje Fix, Int i Round ....................................................133
Przykad 106. Funkcje Hour, Minute, Second ..........................................134
Przykad 107. Funkcje Day, Month, Year ................................................134
Przykad 108. Weekday ............................................................................135
Przykad 109. TimeSerial i DateSerial .....................................................135
Przykad 110. TimeValue i DateValue .....................................................136
Przykad 111. Funkcja DateAdd ...............................................................136
Przykad 112. Funkcja DateDiff ...............................................................138
Przykad 113. Funkcja DatePart ...............................................................138
Przykad 114. Funkcje Date, Now i Time ................................................139
Przykad 115. Funkcja Timer ...................................................................139
Przykad 116. Funkcja MonthName .........................................................139
Przykad 117. Funkcja WeekdayName .....................................................140
Interakcja z uytkownikiem ...........................................................................140
Przykad 118. Okno komunikatu MsgBox ...............................................140
Przykad 119. Okno dialogowe InputBox ................................................141
Przykad 120. Funkcje logiczne ................................................................142
Operacje na acuchach .................................................................................143
Przykad 121. Funkcja StrComp ...............................................................143
Przykad 122. Funkcja StrConv ................................................................143
Przykad 123. Funkcje Lcase i Ucase .......................................................144
Przykad 124. Funkcje Space, String i Len ...............................................144
Przykad 125. Funkcja Format ..................................................................144
Przykad 126. LSet, Rset ..........................................................................146
Przykad 127. InStr, InStrRev ..................................................................146
Przykad 128. Left, Right .........................................................................146
Przykad 129. LTrim, RTrim, Trim ..........................................................147
Przykad 130. Funkcja Replace ................................................................147
Przykad 131. StrReverse .........................................................................148
Przykad 132. Funkcja Mid ......................................................................148
Przykad 133. Skok do podprogramu GoSub...Return, ............................148
Przykad 134. Skok bezwarunkowy GoTo ...............................................148
Przykad 135. Wykonuj a... Do...Loop ...................................................149
Przykad 136. Ptla For...Step...Next, Exit For ........................................149
Przykad 137. Ptla For Each...Next .........................................................150
Przykad 138. Wykonuj dopki: While...Wend ........................................150
Przykad 139. Reaguj na sytuacj On...GoSub, On...GoTo ......................151
Przykad 140. Funkcja Choose .................................................................152
Przykad 141. Instrukcje warunkowe If...Then...Else ...............................152
Przykad 142. Select Case...End Select ....................................................153
Przykad 143. Przecznik Switch ............................................................153
Przykad 144. Struktura With...End With .................................................154

Spis treci

Przykad 145. Przerwanie programu: End i Stop ......................................154


Przykad 146. Przerwanie programu: Exit ................................................155
Przykad 147. Funkcja IsArray .................................................................155
Przykad 148. Funkcja IsDate ...................................................................155
Przykad 149. Funkcja IsEmpty ................................................................156
Przykad 150. Funkcja IsError ..................................................................156
Przykad 151. Funkcja IsMissing .............................................................156
Przykad 152. Funkcja IsNull ...................................................................156
Przykad 153. Funkcja IsNumeric ............................................................157
Przykad 154. Funkcja IsObject ................................................................157
Przykad 155. Funkcje TypeName, VarType ...........................................157
Przykad 156. Obiekty Err i Error ............................................................158
Przykad 157. Sam wygeneruj bd! Raise ...............................................159
Przykad 158. Czujka bdu logicznego. On Error ...................................159
Przykad 159. Wznowienie po bdzie. Resume .......................................160
Przykad 160. Przydatne gadety. Application.Volatile ...........................160
Przykad 161. Przydatne gadety. Application.DisplayAlerts ..................160
Przykad 162. Przydatne gadety. Application.ScreenUpdating ..............161
Przykad 163. Przydatne gadety. Application.EnableEvents ..................161
Przykad 164. Przydatne gadety. Application.DoubleClick ....................162
Przykad 165. Przydatne gadety. Application.WorksheetFunction .........162
Przykad 166. Przydatne gadety. Application.Calculate .........................162

Rozdzia 7. Dodatki ............................................................................. 163


Dodatek 1. Obiekt Application.WorksheetFunction ......................................163
Dodatek 2. Skrty klawiaturowe uywane w Excelu ........................................171
Dodatek 3. Skrty klawiaturowe uywane w edytorze VBA .........................174
Dodatek 4. Procedury zdarzeniowe ................................................................177

Skorowidz .......................................................................... 215

Rozdzia 5.

Przykady
W tym rozdziale zaprezentuj przykady zastosowania VBA w rnych dziedzinach ycia. Mam nadziej, e znajdziesz tu inspiracj do tworzenia wasnych
projektw. Jzyk programowania ma bowiem to do siebie, e jego ograniczeniem
jest tylko Twoja wyobrania. I umiejtnoci. Do dziea zatem.

Przykad 13. Definiowanie wasnej funkcji. Konwertuj


Ponisza funkcja dokonuje konwersji jednostek temperatury pomidzy stopniami
Celsjusza, Fahrenheita i kelwinami. Algorytm jest nastpujcy:
Pobranie danych i weryfikacja. W przypadku temperatury niszej ni 0 K wynikiem bdzie komunikat o bdzie.
Przeliczenie wedug zalenoci:
1 st C = (1*1,8)+32 st F = 1+273,15 K
1 K = 1-273,15 st C = ((1-273,15)*1,8)+32 st F
1 st F = (1-32)/1,8 st C = ((1-32)/1,8)+273,15 K

Jeeli nastpio bdne wpisanie jednostki wejciowej lub wyjciowej, wynikiem


bdzie komunikat o bdzie.
Przyjmij obliczon warto.
Funkcji mona uywa jak kadej funkcji arkuszowej (rysunek 5.1).
Rysunek 5.1.
Mimo wielkiego bogactwa funkcji
wbudowanych kady z nas moe doda
do palety podstawowej gar wasnych
gadetw. Zanim jednak opracujesz wasn
funkcj, dobrze poszukaj prawdopodobnie
kto ju przygotowa j za Ciebie

Rozdzia 5. Przykady

48

Function konwertuj(liczba As Single, jed_wejciowa, jed_wyjciowa As String)


As Variant
Dim c, k, f, wynik As Variant, bd As String
'konwersja na wielkie litery
jed_wejciowa = UCase(jed_wejciowa)
jed_wyjciowa = UCase(jed_wyjciowa)
'czy nie jest nisza od zera bezwzgldnego
If jed_wejciowa = "K" And liczba < 0 Then _
bd = "Temperatura poniej 0 bezwzgldnego"
If jed_wejciowa = "C" And liczba < -273.15 Then _
bd = "Temperatura poniej 0 bezwzgldnego"
If jed_wejciowa = "F" And liczba < -459.67 Then _
bd = "Temperatura poniej 0 bezwzgldnego"
'zamiana danej wejciowej na stopnie Celsjusza
Select Case jed_wejciowa
Case "C"
c = liczba
Case "K"
c = liczba - 273.15
Case "F"
c = (liczba - 32) / 1.8
Case Else
bd = "Bdna jednostka wejciowa"
End Select
' zamiana stopni Celsjusza na jednostk wyjciow
Select Case jed_wyjciowa
Case "C"
wynik = c
Case "K"
wynik = c + 273.15
Case "F"
wynik = (c * 1.8) + 32
Case Else
bd = "Bdna jednostka wyjciowa"
End Select
If bd <> "" Then wynik = bd
konwertuj = wynik
End Function

Przykad 14. Definiowanie wasnej funkcji. Dzie tygodnia


Ponisza funkcja wywietla nazw dnia tygodnia z podanej daty. Dodatkowo zawiera argument opcjonalny. Jeeli go nie pominiemy, wynikiem funkcji bdzie
trzyliterowy skrt dnia tygodnia rysunek 5.2.
Rysunek 5.2.
Okrelanie nazwy
dnia tygodnia
za pomoc VBA

Przykad 15. Dzie tygodnia duo atwiej

49

Nastpny przykad pokazuje, e niekiedy warto poszuka, zanim stworzysz kod,


bo rozwizanie moe by bliej, ni mylisz.
Function Dz_tygodnia(dzie As Single, Optional skrcona)
Dim tabela(1 To 7) As String
tabela(7) = "Niedziela"
tabela(1) = "Poniedziaek"
tabela(2) = "Wtorek"
tabela(3) = "roda"
tabela(4) = "Czwartek"
tabela(5) = "Pitek"
tabela(6) = "Sobota"
Dz_tygodnia = tabela(dzie)
If IsMissing(skrcona) = False Then Dz_tygodnia = Left(Dz_tygodnia, 3)
End Function

Funkcja nie jest skomplikowana. Jej dziaanie polega na przypisaniu pozycjom


tabeli jednowymiarowej nazw kolejnych dni tygodnia, a nastpnie wybraniu
odpowiedniej wartoci z obliczonej w komrce. Dodatkowo, jeeli podasz drugi
argument (moe to by cokolwiek, bowiem kod sprawdza tylko jego obecno lub
brak If IsMissing(skrcona) = False Then...), funkcja zwrci tylko trzy
pierwsze litery nazwy dnia tygodnia (Left(Dz_tygodnia, 3)).
Bardzo wane jest, aby argument opcjonalny badany funkcj IsMissing mia
okrelony typ Variant. Nasza funkcja nie definiuje typu argumentu, zatem Variant
zostaje do niego przyporzdkowany automatycznie. Zadeklarowanie innego typu
argumentu, na przykad:
Function Dz_tygodnia(dzie As Single, Optional skrcona As String)

spowoduje nieprawidowe dziaanie.

Przykad 15. Dzie tygodnia duo atwiej


By moe miae ju okazj przekona si o tym, e narzdzia wbudowane w Excel
bywaj zaskakujce. Niekiedy przemylane ich uycie moe prowadzi do takich
samych efektw jak uywanie VBA. Rysunek 5.3 pokazuje, jak moemy otrzyma
wynik z przykadu 14 bez uywania VBA.

Przykad 16. Funkcja Sownie


To pewnie najbardziej podana z funkcji, ktre trzeba samemu napisa. Nie
wiadomo, dlaczego Microsoft w kolejnych edycjach pakietu Office nie docza
tej funkcji w standardzie. Niewane. Mamy przynajmniej moliwo, aby rozwin skrzyda. Ten przykad jest do rozbudowany, bowiem zachowuje polsk
gramatyk sw. Przykad 17 rezygnuje z niej, dajc w zamian moliwo
wyboru waluty.

Rozdzia 5. Przykady

50

Rysunek 5.3. Po prostu skopiuj dat do komrek B3 i B4, a nastpnie z okna Formatowanie
komrek (uruchamianego kombinacj Ctrl+1) wybierz niestandardowe formaty komrek:
dddd dla B3 i ddd dla B4
Function SLOWNIE(x)
Dim Setki(10) As String
Dim dziesiatki(10) As String
Dim jednostki(20) As String
Setki(0) = ""
Setki(1) = "sto"
Setki(2) = "dwiecie"
Setki(3) = "trzysta"
Setki(4) = "czterysta"
Setki(5) = "piset"
Setki(6) = "szeset"
Setki(7) = "siedemset"
Setki(8) = "osiemset"
Setki(9) = "dziewiset"
dziesiatki(0) = ""
dziesiatki(1) = "dziesi"
dziesiatki(2) = "dwadziecia"
dziesiatki(3) = "trzydzieci"
dziesiatki(4) = "czterdzieci"
dziesiatki(5) = "pidziesit"
dziesiatki(6) = "szedziesit"
dziesiatki(7) = "siedemdziesit"
dziesiatki(8) = "osiemdziesit"
dziesiatki(9) = "dziewidziesit"

Przykad 16. Funkcja Sownie

51

jednostki(0) = ""
jednostki(1) = "jeden"
jednostki(2) = "dwa"
jednostki(3) = "trzy"
jednostki(4) = "cztery"
jednostki(5) = "pi"
jednostki(6) = "sze"
jednostki(7) = "siedem"
jednostki(8) = "osiem"
jednostki(9) = "dziewi"
jednostki(10) = "dziesi"
jednostki(11) = "jedenacie"
jednostki(12) = "dwanacie"
jednostki(13) = "trzynacie"
jednostki(14) = "czternacie"
jednostki(15) = "pitnacie"
jednostki(16) = "szesnacie"
jednostki(17) = "siedemnacie"
jednostki(18) = "osiemnacie"
jednostki(19) = "dziewitnacie"
' jeeli modu liczby jest wikszy od podanej wartoci to zakocz i wywietl komunikat
If Abs(x) >= 1000000000000# Then
SLOWNIE = "Przekroczony zakres od -1.000.000.000.000
do 1.000.000.000.000"
Exit Function
End If
If x < 0 Then minus = "Minus " Else minus = ""
x = Abs(x)
liczba = Int(x)
L = (x - liczba) * 100
liczbagr = Int(L)
If (L - liczbagr) * 10 >= 5 Then liczbagr = liczbagr + 1
'okrela ile mamy miliardw
liczbamld = Int(liczba / 1000000000)
'okrela ile mamy milionw
liczbamil = Int((liczba - liczbamld * 1000000000) / 1000000)
'okrela ile mamy tysicy
liczbatys = Int((liczba - liczbamld * 1000000000 - liczbamil *
1000000) / 1000)
'okrela ile mamy setek
liczbaset = Int(liczba - liczbamld * 1000000000 - liczbamil * 1000000
- liczbatys * 1000)
miliardy:
liczba = liczbamld
If liczba = 0 Then GoTo miliony
L = Int(liczba / 100)
slowniezl = slowniezl + Setki(L)

Rozdzia 5. Przykady

52

liczba = liczba - (L * 100)


If liczba < 20 Then slowniezl = slowniezl + " " + jednostki(liczba):
GoTo piszmiliardy
L = Int(liczba / 10)
slowniezl = slowniezl + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slowniezl = slowniezl + " " + jednostki(liczba)
piszmiliardy:
If liczbamld = 1 Then slowniezl = slowniezl + " miliard ": GoTo miliony
aa = Str(liczba)
bb = Right(aa, 1)
If aa >= 5 And aa < 20 Then slowniezl = slowniezl + " miliardw ":

GoTo miliony

If bb > 1 And bb < 5 Then slowniezl = slowniezl + " miliardy ":

GoTo miliony

If liczbamld >= 5 Then slowniezl = slowniezl + " miliardw "


miliony:
liczba = liczbamil
If liczba = 0 Then GoTo tysiace
L = Int(liczba / 100)
slowniezl = slowniezl + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slowniezl = slowniezl + " " + jednostki(liczba):
GoTo piszmiliony
L = Int(liczba / 10)
slowniezl = slowniezl + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slowniezl = slowniezl + " " + jednostki(liczba)
piszmiliony:
If liczbamil = 1 Then slowniezl = slowniezl + " milion ": GoTo tysiace
aa = Str(liczba)
bb = Right(aa, 1)
If aa >= 5 And aa < 20 Then slowniezl = slowniezl + " milionw ":

GoTo tysiace

If bb > 1 And bb < 5 Then slowniezl = slowniezl + " miliony ":

GoTo tysiace

If liczbamil >= 5 Then slowniezl = slowniezl + " milionw "

Przykad 16. Funkcja Sownie

53

tysiace:
liczba = liczbatys
If liczba = 0 Then GoTo jednostki
L = Int(liczba / 100)
slowniezl = slowniezl + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slowniezl = slowniezl + " " + jednostki(liczba):
GoTo pisztysiace
L = Int(liczba / 10)
slowniezl = slowniezl + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slowniezl = slowniezl + " " + jednostki(liczba)
pisztysiace:
If liczbatys = 1 Then slowniezl = slowniezl + " tysic ":

GoTo jednostki

aa = Str(liczba)
bb = Right(aa, 1)
If aa >= 5 And aa < 20 Then slowniezl = slowniezl + " tysicy ":

GoTo jednostki

If bb > 1 And bb < 5 Then slowniezl = slowniezl + " tysice ":

GoTo jednostki

If liczbatys >= 5 Then slowniezl = slowniezl + " tysicy "

jednostki:
liczba = liczbaset
If Int(x) = 0 Then slowniezl = slowniezl + " zero zotych":
GoTo grosze
If liczba = 0 Then slowniezl = slowniezl + " zotych": GoTo grosze
L = Int(liczba / 100)
slowniezl = slowniezl + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slowniezl = slowniezl + " " + jednostki(liczba):
GoTo piszjednostki
L = Int(liczba / 10)
slowniezl = slowniezl + " " + dziesiatki(L)
liczbaa = liczba - (L * 10)
slowniezl = slowniezl + " " + jednostki(liczbaa)

Rozdzia 5. Przykady

54
piszjednostki:
aa = Str(liczba)
bb = Right(aa, 1)
If
If
If
If

aa >= 5 And aa < 20 Then slowniezl = slowniezl + " zotych": GoTo grosze
bb >= 2 And bb < 5 Then slowniezl = slowniezl + " zote": GoTo grosze
aa = 1 Then slowniezl = slowniezl + " zoty"
liczbaset >= 5 Then slowniezl = slowniezl + " zotych"

grosze:
liczba = liczbagr
If liczba = 0 Then slowniegr = "zero groszy": GoTo wynik
If liczba < 20 Then slowniegr = jednostki(liczba): GoTo piszgrosze
L = Int(liczba / 10)
slowniegr = slowniegr + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slowniegr = slowniegr + " " + jednostki(liczba)
piszgrosze:
aa = Str(liczbagr)
bb = Right(aa, 1)
If
If
If
If

aa
bb
aa
aa

>= 5 And aa < 20 Then slowniegr = slowniegr + " groszy": GoTo wynik
>= 2 And bb < 5 Then slowniegr = slowniegr + " grosze": GoTo wynik
= 1 Then slowniegr = slowniegr + " grosz": GoTo wynik
>= 5 Then slowniegr = slowniegr + " groszy"

wynik:
' obcina zbdne spacje na pocztku i kocu sowa
bez_spacji = Trim(minus + slowniezl)
'pierwsza litera wyraenia
wielka_litera = UCase(Left(bez_spacji, 1))
'liczy ile liter jest w wyraeniu
ile_mamy_liter = Len(bez_spacji)
'wstawia wielk liter na pocztku wyraenia
wstaw_wielka = wielka_litera + Right(bez_spacji, ile_mamy_liter - 1)
'przypisuje warto do funkcji
SLOWNIE = Application.WorksheetFunction.Trim(wstaw_wielka + " " + slowniegr)
End Function

Przykad 17. Funkcja Sownie wersja 2

55

Wyjanienia do dziaania tej funkcji zawarte s w komentarzach w kodzie (czyli


w tekcie po apostrofie taki tekst nie jest analizowany przez VBA). Funkcja
jest sekwencj operacji powtarzajcych si dla kadego z rzdw wielkoci:
miliardw, milionw, tysicy itd. Wynikiem kolejnej sekwencji (nazwijmy j
podprogramem) jest zmienna slowniezl, ktra jest wyduana (czyli doklejane
s do niej kolejne sowa) w miar schodzenia kodu coraz niej. W sekcji wynik
dodawana jest jeszcze wielka litera na pocztku wyraenia, znak minus, jeeli
liczba jest ujemna, oraz usuwane s zbdne spacje midzy kolejnymi sowami.
Do usunicia zbdnych spacji postanowiem uy funkcji arkuszowej Trim
(w polskim Excelu jest to USU.ZBDNE.ODSTPY). Co prawda VBA take oferuje
funkcj Trim, jednak podczas prb okazao si, e odcina ona tylko spacje na pocztku i kocu wyniku, nie ingerujc w odstpy pomidzy sowami.

Przykad 17. Funkcja Sownie wersja 2


Ponisza funkcja jest prostsza od poprzedniej, bowiem nie uwzgldnia polskiej
gramatyki. Mamy za to do wyboru zapis w jzyku polskim lub angielskim i waluty: euro, dolary i zote.
Function SOWNIE(ByVal liczba, Optional waluta, Optional jzyk)
On Error Resume Next
'deklaracja tablicy
Dim sowa(9) As String
'deklaracja zmiennych
Dim przecinek, a, x, cakowita As Single, po_przecinku As Boolean
Dim wynik, gr, z, znak As String, jedno
'zmiana liter w zmiennych na due
If waluta = Null Then waluta = " "
If jzyk = Null Then jzyk = " "
waluta = UCase(waluta)
jzyk = UCase(jzyk)
'Nadanie wartoci pocztkowych zmiennym
wynik = ""
po_przecinku = False
Select Case waluta
Case "E"
gr = "Cent"
z = "Euro"
Case "D"
gr = "Cent"
z = "Dolar"
Case Else
gr = "gr"
z = "z"
End Select
Select Case jzyk
Case "ANG"

Rozdzia 5. Przykady

56
sowa(0)
sowa(1)
sowa(2)
sowa(3)
sowa(4)
sowa(5)
sowa(6)
sowa(7)
sowa(8)
sowa(9)
Case Else
sowa(0)
sowa(1)
sowa(2)
sowa(3)
sowa(4)
sowa(5)
sowa(6)
sowa(7)
sowa(8)
sowa(9)
End Select

=
=
=
=
=
=
=
=
=
=

"zero"
"one"
"two"
"three"
"four"
"five"
"six"
"seven"
"eight"
"nine"

=
=
=
=
=
=
=
=
=
=

"zero"
"jeden"
"dwa"
"trzy"
"cztery"
"pi"
"sze"
"siedem"
"osiem"
"dziewi"

' ustalenie znaku plus/minus


znak = ""
If liczba < 0 Then
znak = "minus "
End If
liczba = Abs(liczba)
cakowita = Int(liczba)
liczba = Trim(Str(liczba))
'szukanie przecinka
przecinek = InStr(liczba, ".")
If przecinek <> 0 Then a = przecinek - 1: po_przecinku = True Else a =
Len(liczba)
'rozpatrywanie liczb z lewej strony przecinka
If cakowita > 0 Then
For x = 1 To a
jedno = Mid(liczba, x, 1)
jedno = Val(jedno)
wynik = wynik & sowa(jedno) & "-"
Next x
Else
wynik = sowa(0) & "-"
End If
wynik = wynik & z

Przykad 17. Funkcja Sownie wersja 2

57

'rozpatrywanie dwch liczb z prawej strony przecinka (jeeli wystpuj)


If po_przecinku Then
wynik = wynik & "-"
For x = 2 To 3
jedno = Mid(liczba, a + x, 1)
jedno = Val(jedno)
wynik = wynik & sowa(jedno) & "-"
Next x
wynik = wynik & gr
Else
wynik = wynik & "-" & sowa(0) & "-" & gr
End If
'zwrcenie wartoci funkcji, obcicie niepotrzebnych spacji
SOWNIE = Trim(znak & wynik)
End Function

Kilka sw wyjanienia, jak dziaa powyszy kod:


1.

Rezerwuje tablic jednowymiarow na jednostki.

2.

Pobiera informacje na temat jzyka i waluty. Odpowiednie wartoci


zostaj przypisane zmiennym waluta i jzyk.

3.

Wprowadza do tablicy sowa po polsku lub angielsku, w zalenoci


od wskazanego jzyka, oraz przypisuje zmiennym z i gr odpowiednie
wartoci, stosownie do wybranej waluty.

4.

W przypadku liczby ujemnej nadaje zmiennej znak warto minus.

5.

W analizowanej liczbie znajduje przecinek.

6.

Obcina cz uamkow w przypadku, gdy s wicej ni dwie cyfry


po przecinku.

7.

Analizuje kolejno cyfry z lewej strony przecinka, przyporzdkowuje


im waciwe sowa, rozdziela je mylnikiem.

8.

Na zakoczenie wstawiona zostaje nazwa jednostki gwnej waluty.

9.

Analizuje dwie pierwsze cyfry z prawej strony przecinka i postpuje


jak wyej.

10.

Ostatni czynnoci jest przypisanie funkcji SOWNIE obliczonej


wartoci cigu.

W przeciwiestwie do poprzedniej funkcji tutaj nie mamy ograniczenia dotyczcego wielkoci wprowadzanej liczby. Nie jest ono potrzebne, bowiem nie uywamy tu sw miliardy, miliony itp.

Rozdzia 5. Przykady

58

Przykad 18. Funkcja Sownie z podprogramem


Jak zauwaye, w przykadzie 16 cz kodu jest powtarzana. Te same czynnoci
s wykonywane dla kadej grupy cyfr. Jeeli tworzysz due programy, warto
zamyka powtarzalne elementy kodu w osobne procedury. Zmniejszaj one
objto kodu i tylko minimalnie spowalniaj jego dziaanie.
Function SLOWNIE_Z_PODPROGRAMEM(x)
Dim Setki(10) As String
Dim dziesiatki(10) As String
Dim jednostki(20) As String
Setki(0) = ""
Setki(1) = "sto"
Setki(2) = "dwiecie"
Setki(3) = "trzysta"
Setki(4) = "czterysta"
Setki(5) = "piset"
Setki(6) = "szeset"
Setki(7) = "siedemset"
Setki(8) = "osiemset"
Setki(9) = "dziewiset"
dziesiatki(0) = ""
dziesiatki(1) = "dziesi"
dziesiatki(2) = "dwadziecia"
dziesiatki(3) = "trzydzieci"
dziesiatki(4) = "czterdzieci"
dziesiatki(5) = "pidziesit"
dziesiatki(6) = "szedziesit"
dziesiatki(7) = "siedemdziesit"
dziesiatki(8) = "osiemdziesit"
dziesiatki(9) = "dziewidziesit"
jednostki(0) = ""
jednostki(1) = "jeden"
jednostki(2) = "dwa"
jednostki(3) = "trzy"
jednostki(4) = "cztery"
jednostki(5) = "pi"
jednostki(6) = "sze"
jednostki(7) = "siedem"
jednostki(8) = "osiem"
jednostki(9) = "dziewi"
jednostki(10) = "dziesi"
jednostki(11) = "jedenacie"
jednostki(12) = "dwanacie"
jednostki(13) = "trzynacie"
jednostki(14) = "czternacie"
jednostki(15) = "pitnacie"
jednostki(16) = "szesnacie"

Przykad 18. Funkcja Sownie z podprogramem

59

jednostki(17) = "siedemnacie"
jednostki(18) = "osiemnacie"
jednostki(19) = "dziewitnacie"
' jeeli modu liczby jest wikszy od podanej wartoci to zakocz i wywietl komunikat
If Abs(x) >= 1000000000000# Then
SLOWNIE_Z_PODPROGRAMEM = "Przekroczony zakres od -1.000.000.000.000
do 1.000.000.000.000"
Exit Function
End If
If x < 0 Then minus = "Minus " Else minus = ""
x = Abs(x)
liczba = Int(x)
L = (x - liczba) * 100
liczbagr = Int(L)
If (L - liczbagr) * 10 >= 5 Then liczbagr = liczbagr + 1
'okrela ile mamy miliardw
liczbamld = Int(liczba / 1000000000)
'okrela ile mamy milionw
liczbamil = Int((liczba - liczbamld * 1000000000) / 1000000)
'okrela ile mamy tysicy
liczbatys = Int((liczba - liczbamld * 1000000000 - liczbamil *
1000000) / 1000)
'okrela ile mamy setek
liczbaset = Int(liczba - liczbamld * 1000000000 - liczbamil *
1000000 - liczbatys * 1000)
miliardy:
liczba = liczbamld
If liczba = 0 Then GoTo miliony
L = Int(liczba / 100)
slownie_zlotych = slownie_zlotych + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slownie_zlotych = slownie_zlotych + " " +
jednostki(liczba): GoTo piszmiliardy
L = Int(liczba / 10)
slownie_zlotych = slownie_zlotych + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slownie_zlotych = slownie_zlotych + " " + jednostki(liczba)
piszmiliardy:
If liczbamld = 1 Then slownie_zlotych = slownie_zlotych + " miliard ":

GoTo miliony

aa = Str(liczba)
bb = Right(aa, 1)
slownie_zlotych = slownie_zlotych + przypisz(aa, bb, " miliardw ",
" miliardy ", liczbamld)

Rozdzia 5. Przykady

60
miliony:
liczba = liczbamil
If liczba = 0 Then GoTo tysiace
L = Int(liczba / 100)
slownie_zlotych = slownie_zlotych + Setki(L)

liczba = liczba - (L * 100)


If liczba < 20 Then slownie_zlotych = slownie_zlotych + " " +
jednostki(liczba): GoTo piszmiliony
L = Int(liczba / 10)
slownie_zlotych = slownie_zlotych + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slownie_zlotych = slownie_zlotych + " " + jednostki(liczba)
piszmiliony:
If liczbamil = 1 Then slownie_zlotych = slownie_zlotych + " milion ":

GoTo tysiace

aa = Str(liczba)
bb = Right(aa, 1)

slownie_zlotych = slownie_zlotych + przypisz(aa, bb, " milionw ",

" miliony ", liczbamil)


tysiace:

liczba = liczbatys
If liczba = 0 Then GoTo jednostki
L = Int(liczba / 100)
slownie_zlotych = slownie_zlotych + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slownie_zlotych = slownie_zlotych + " " +
jednostki(liczba): GoTo pisztysiace
L = Int(liczba / 10)
slownie_zlotych = slownie_zlotych + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slownie_zlotych = slownie_zlotych + " " + jednostki(liczba)
pisztysiace:
If liczbatys = 1 Then slownie_zlotych = slownie_zlotych + " tysic ":

GoTo jednostki

aa = Str(liczba)
bb = Right(aa, 1)

Przykad 18. Funkcja Sownie z podprogramem

61

slownie_zlotych = slownie_zlotych + przypisz(aa, bb, " tysicy ", " tysice ",
liczbatys)
jednostki:
liczba = liczbaset
If Int(x) = 0 Then slownie_zlotych = slownie_zlotych + " zero zotych":
GoTo grosze
If liczba = 0 Then slownie_zlotych = slownie_zlotych + " zotych":
GoTo grosze
L = Int(liczba / 100)
slownie_zlotych = slownie_zlotych + Setki(L)
liczba = liczba - (L * 100)
If liczba < 20 Then slownie_zlotych = slownie_zlotych + " " +
jednostki(liczba): GoTo piszjednostki
L = Int(liczba / 10)
slownie_zlotych = slownie_zlotych + " " + dziesiatki(L)
liczbaa = liczba - (L * 10)
slownie_zlotych = slownie_zlotych + " " + jednostki(liczbaa)
piszjednostki:
aa = Str(liczba)
bb = Right(aa, 1)
If aa >= 5 And aa < 20 Then slownie_zlotych = slownie_zlotych + "

zotych": GoTo grosze

If bb >= 2 And bb < 5 Then slownie_zlotych = slownie_zlotych + " zote":


GoTo grosze
If aa = 1 Then slownie_zlotych = slownie_zlotych + " zoty"
If liczbaset >= 5 Then slownie_zlotych = slownie_zlotych + " zotych"
grosze:
liczba = liczbagr
If liczba = 0 Then slowniegr = "zero groszy": GoTo wynik
If liczba < 20 Then slowniegr = jednostki(liczba): GoTo piszgrosze
L = Int(liczba / 10)
slowniegr = slowniegr + " " + dziesiatki(L)
liczba = liczba - (L * 10)
slowniegr = slowniegr + " " + jednostki(liczba)
piszgrosze:
aa = Str(liczbagr)
bb = Right(aa, 1)

Rozdzia 5. Przykady

62
If
If
If
If

aa
bb
aa
aa

>= 5 And aa < 20 Then slowniegr = slowniegr + " groszy": GoTo wynik
>= 2 And bb < 5 Then slowniegr = slowniegr + " grosze": GoTo wynik
= 1 Then slowniegr = slowniegr + " grosz": GoTo wynik
>= 5 Then slowniegr = slowniegr + " groszy"

wynik:
' obcina zbdne spacje na pocztku i kocu sowa
bez_spacji = Trim(minus + slownie_zlotych)
'pierwsza litera wyraenia
wielka_litera = UCase(Left(bez_spacji, 1))
'liczy ile liter jest w wyraeniu
ile_mamy_liter = Len(bez_spacji)
'wstawia wielk liter na pocztku wyraenia
wstaw_wielka = wielka_litera + Right(bez_spacji, ile_mamy_liter - 1)
'przypisuje warto do funkcji
SLOWNIE_Z_PODPROGRAMEM = Application.WorksheetFunction.Trim(wstaw_wielka +
" " + slowniegr)
End Function

W powtarzalnych miejscach programu wywoywana jest funkcja przypisz, ktrej


wynik doklejany jest do naszej zmiennej slownie_zlotych. Kluczem dziaania
funkcji przypisz s wartoci przekazywane przy jej wywoywaniu jako argumenty.
Poniej przedstawiona jest jej tre:
Function przypisz(aa, bb, cc, dd, ee)
If aa >= 5 And aa < 20 Then przypisz = cc: Exit Function
If bb > 1 And bb < 5 Then przypisz = dd: Exit Function
If ee >= 5 Then przypisz = cc
End Function

Przykad 19. Okrelenie waciwoci makra/funkcji za pomoc edytora


Piszc funkcj uytkownika, moesz zadba o jej opis i inne waciwoci. To
bardzo uatwia korzystanie z niej. Przykad 13 bdzie tu dobr ilustracj. Funkcja
Konwertuj posiada trzy parametry. Jak jednak powinny mie posta? Wie o tym
tylko jej twrca i moe jeszcze ten, kto bdzie mia do czasu i umiejtnoci, aby
rzuci okiem na jej kod. Marna to informacja dla potencjalnego uytkownika.
Oczekuje on bowiem od Ciebie uytecznego, atwego w obsudze narzdzia
i informacji podanych na talerzu (rysunek 5.4), a nie kolejnej amigwki. Gdyby
szuka amigwki, pewnie signby po odpowiednie czasopismo. My nie zakadamy, e tworzysz makra w VBA do czasopisma z zagadkami, zatem sprbujemy do utworzonej w przykadzie 13 funkcji doda informacje umoliwiajce uytkownikowi prawidowe jej zredagowanie.

Przykad 19. Okrelenie waciwoci makra/funkcji za pomoc edytora

63

Rysunek 5.4.
Oprcz przyjaznych
nazw parametrw
moesz doda trzy
linijki informacji
dla uytkownika,
aby zachci go
do korzystania
z Twojej funkcji

W tym przykadzie nie bdziemy pisa kodw VBA, mimo e edytor bdzie nam
potrzebny.
1.

W oknie edytora VBA otwrz okno przegldarki obiektu


(F2, lub View/Object Browser).

2.

Z listy (patrz rysunek 5.5) wybierz kategori VBA Project.

Rysunek 5.5.
Przegldarka
obiektw. Uyteczne
narzdzie dla
deweloperw VBA.
Naprawd warto si
z nim zaprzyjani

3.

W polu Classes (rysunek 5.6) wska modu, w ktrym znajduje si


opisywana funkcja, kliknij prawym przyciskiem myszy jej nazw
w przegldarce i z podrcznego menu wybierz polecenie Properties.

4.

W oknie dialogowym Member Options (rysunek 5.7) wpisz opis


funkcji. Oczywicie! Moesz tam wpisa dowcip z cyklu przychodzi
baba do lekarza, lecz jeeli bdzie duszy ni trzy linijki, nie wywietli
si w caoci, a jeeli dodatkowo nie bdzie mieszny, to gwarantuj
ci, e mocno zapadniesz uytkownikom w pami. Tym byskotliwym
ruchem by moe przysuysz si czyim badaniom na temat wpywu
inteligencji krzemowej na biakow.

Rozdzia 5. Przykady

64

Rysunek 5.6.
Dodanie opisu do
funkcji uytkownika
nie jest trudne.
Zaufaj mi

Rysunek 5.7.
Kto powiedzia,
e w okno Member
Options naley wpisa
pomoc do funkcji
uytkownika? Moemy
co najwyej zaoy,
e jest to zalecane

Przykad 20. Okrelenie waciwoci makra/funkcji za pomoc VBA


Wrmy ju do VBA. Nareszcie.
Skorzystaj z metody MacroOptions. Dla obiektu Application ma ona wiele argumentw. Cz z nich jest pomijana. Najwaniejsze dla nas argumenty s uyte
w poniszej procedurze:
Macro podaje nazw funkcji (makra), do ktrego odnosi si Twoje dziaanie.
Description wywietla tekst wprowadzony przez Ciebie w oknie Member

Options.
Category przypisuje Twoj funkcj do odpowiedniej kategorii funkcji, zgodnie
z tabel 5.1.
Sub definiuj_funkcj()
tekst = "Konwertuje stopnie wg skal Celsjusza, Fahrenheita i Kelvina."
tekst = tekst & vbCrLf & "Jako argumentu jed_wejciowa i jed_wyjciowa
uyj:"
tekst = tekst & vbCrLf & "'C' dla stopni Celsjusza,"
tekst = tekst & " 'K' dla stopni Kelvina oraz"
tekst = tekst & " 'F' dla stopni Fahrenheita."
Application.MacroOptions Macro:="konwertuj", _
Description:=tekst, Category:=3
End Sub

Przykad 21. Wstawianie funkcji arkuszowej do arkusza za pomoc VBA

65

Tabela 5.1. Kategorie funkcji i wartoci argumentu Category metody MacroOptions


Kategoria funkcji

Warto argumentu Category

Finansowe

Daty i czasu

Matematyczne

Statystyczne

Wyszukiwania i adresu

Bazy danych

Tekstowe

Logiczne

Informacyjne

Uytkownika

Argument naley pomin

Przykad 21. Wstawianie funkcji arkuszowej do arkusza za pomoc VBA


Poniszy przykad spowoduje wstawienie funkcji ZCZ.TEKSTY do komrki C7.
Range("C7").Formula = "=CONCATENATE(A1,Arkusz2!A1,Arkusz3!B3)"

Jak wida, nie moemy wprowadza tu polskich nazw funkcji. Angielskie odpowiedniki znajdziesz w pliku funcs.xls, ktry jest instalowany w komputerze razem
z Excelem. W dalszej czci ksiki zamieciem tabel metod zawierajcych
si w obiekcie Application.Worksheetfunction. Tabela ta zawiera polskie nazwy
funkcji i odpowiadajce im metody bdce w zbiorze tego obiektu. Nazwy metod
odpowiadaj angielskim nazwom funkcji. Niestety, funkcja ZCZ.TEKSTY jak
i kilkanacie innych nie jest reprezentowana w tym zbiorze i nie mona uy
jej w poczeniu z obiektem Worksheetfunction. Jedynym wic sposobem na
odnalezienie jej angielskiego odpowiednika jest wspomniany wyej plik.
Moesz take uy rejestratora makr w celu wygenerowania kodu wpisujcego
formu do komrki. To najpewniejszy sposb, aby nie popeni bdu, cho rejestrator uywa sowa kluczowego FormulaR1C1, ktre wymusza nieco inny sposb
adresowania komrek. Poza tym rejestrator wstawia osobny wiersz kodu mwicy
o zaznaczeniu komrki.
Range("C7").Select
ActiveCell.FormulaR1C1 = _
"=CONCATENATE(R[-14]C[-2],Arkusz2!R[-14]C[-2],Arkusz3!R[-12]C[-1])"

Poza tymi sprawami technicznymi kod ma takie samo dziaanie, wic jeeli nie
musisz w niego ingerowa, skorzystaj z rejestratora i ciesz si szybko osignitym wynikiem.

Rozdzia 5. Przykady

66

Majc powysz wiedz, pomyl, jak atwo byoby stworzy samopiszcy si


arkusz Excela. Moesz w taki sposb wymusi na uytkowniku zgod na
uruchomienie makr. Jeeli nie bdzie zgody, nie bdzie w nim nawet zwykych
excelowskich formu!

Przykad 22. Wymuszenie wczenia dodatku


Jeeli Twj skoroszyt korzysta z formu lub funkcjonalnoci ktrego ze standardowych dodatkw, na przykad AnalysisToolPak zawierajcego szereg funkcji
inynierskich, moesz spowodowa jego zaadowanie przy kadym otwarciu
Twojego pliku. Ponisza procedura zostanie wykonana po kadym otwarciu skoroszytu. Naley j umieci w jego module.
Private Sub Workbook_Open()
AddIns("Analysis ToolPak").Installed = True
End Sub

Przykad 23. Zamknicie dodatku


Ponisza procedura zostaa przypisana do zdarzenia wykonywanego przed zamkniciem skoroszytu Workbook_BeforeClose. Uyem tego zdarzenia, niejako
kontynuujc poprzedni przykad. Jednak oczywicie nie jest to konieczne. By
moe Twj skoroszyt nie powinien pracowa, gdy jaki dodatek jest zaadowany,
i musisz umieci procedur, ktra go wyczy zaraz na pocztku. W tym przypadku powiniene uy zdarzenia Workbook_Open. A moe dodatek powinien
adowa si po wejciu/wyjciu z okrelonego arkusza? Twj wybr! Na kocu
ksiki zamieciem list zdarze, z ktrych moesz do woli korzysta.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
AddIns("Analysis ToolPak").Installed = False
End Sub

Przykad 24. Zamknicie dodatku uruchomionego przez nasz skoroszyt


Praktyka mwi, e cho 90 procent uytkownikw nigdy nie dokonao wikszej
modyfikacji narzdzi uywanych w swoim pakiecie Office, to wanie z tymi
10 procentami, ktre czego dokonay, programici maj najwikszy kopot.
Trudno bowiem przewidzie, na jaki grunt trafi Twj produkt. Na etapie projektowania musisz zatem zaoy rne sytuacje. Im wicej ich przewidzisz, tym
stabilniejszy bdzie Twj program. Jednym z oczywistych zaoe wydaje si,
e uytkownik mg samodzielnie zaadowa jaki dodatek (pozostamy ju przy
naszym przykadowym AnalysisToolPak), i nie ma potrzeby, aby po zamkniciu
naszego skoroszytu dodatek ten by dezaktywowany. Na pocztku musimy tylko
odczyta, czy dodatek jest ju otwarty, i informacj o jego stanie przechowa
w zmiennej, ktra zostanie odczytana przy zamykaniu skoroszytu.

Przykad 25. Rozwizanie drugie stabilniejsze

67

Na poziomie moduu wpisz wic deklaracj zmiennej.


Dim dodatek As Boolean

To deklaracja zmiennej logicznej, ktra moe przyjmowa wartoci Prawda lub


Fasz. Zadeklarowanie jej na poziomie moduu (przed pierwsz procedur sub
lub function) zapewnia nam, e jej warto bdzie przechowywana do zamknicia skoroszytu, pod warunkiem e VBA nie bdzie wymaga zresetowania
(rysunek 5.8).
Rysunek 5.8.
Gdy nastpi zawieszenie wykonywania makr
(mimo dooenia wszelkich stara zdarza si
to czciej, ni przypuszczasz), konieczne jest
zresetowanie VBA. Powoduje to, niestety,
wyzerowanie zmiennych

W module skoroszytu wpisz zdarzenie przy otwarciu.


Private Sub Workbook_Open()
dodatek = False
If AddIns("Analysis ToolPak").Installed = True Then
jeeli zachodzi powyszy warunek to zmiana wartoci zmiennej dodatek...
dodatek = True
... i wyjcie z procedury
Exit Sub
w przeciwnym wypadku zaadowanie dodatku
Else
AddIns("Analysis ToolPak").Installed = True
End If
End Sub

... i przy zamkniciu.

Private Sub Workbook_BeforeClose(Cancel As Boolean)


wyjd jeeli zmienna dodatek ma warto True
If dodatek = True Then Exit Sub
AddIns("Analysis ToolPak").Installed = False
End Sub

Przykad 25. Rozwizanie drugie stabilniejsze


Jak ju wiesz z wiczenia powyej, zdarzaj si sytuacje, gdy warto przechowywana przez zmienn w VBA moe zosta z rnych przyczyn
zresetowana. Doprowadzi to do zego dziaania procedury uruchamianej przy
zamykaniu skoroszytu. Nie wiadomo bowiem, czy informacja pobrana na pocztku pracy jest jeszcze przechowywana.
Przyjmij sobie jeden arkusz do przechowywania danych. Daj mu trudn nazw,
ktrej uytkownik si nie spodziewa, i nadaj mu waciwo Visible = 2
(rysunek 5.9).

Rozdzia 5. Przykady

68

Rysunek 5.9.
W naszym skoroszycie
z poziomu Excela moemy
mie arkusze widoczne
xlSheetVisible (warto
liczbowa 1) lub ukryte
xlSheetHidden (warto
liczbowa 0). VBA dorzuca
do tej kolekcji warto
xlSheetVeryHidden
(liczbowo 2). Arkusz jest
i mona w nim przechowywa
dane, ale nie jest dostpny
z poziomu zwykego Excela

Dlaczego trudna nazwa? Bowiem arkusz ten nie bdzie widoczny dla uytkownika
(waciwo xlSheetVeryHidden sprawia, e arkusza nie wida na licie arkuszy
do odkrycia), jednak dla Excela arkusz ten oczywicie istnieje i program obrazi
si, jeeli niczego niewiadomy uytkownik wybierze dla swojego nowego arkusza tak sam nazw. Potem zmodyfikuj procedury z poprzedniego przykadu.
Tym razem, zamiast przechowywa warto w zmiennej dodatek, umiecimy j
w komrce A1 ukrytego arkusza. Stamtd nic jej nie ruszy.
Private Sub Workbook_Open()
zerowanie komrki A1
ThisWorkbook.Sheets("ustawienia_a ").Cells(1, 1).ClearContents
zmiana wartoci komrki A1 jeeli dodatek jest uruchomiony i wyjcie z procedury lub...
If AddIns("Analysis ToolPak").Installed = True Then
ThisWorkbook.Sheets("ustawienia_a ").Cells(1, 1) = 1
Exit Sub
Else
... zaadowanie dodatku
AddIns("Analysis ToolPak").Installed = True
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
odczytanie wartoci komrki A1 i wyjcie jeeli dodatek
by zaadowany przed uruchomieniem tego skoroszytu...
If Sheets("ustawienia_a").Cells(1, 1) = 1 Then Exit Sub
... lub odinstalowanie dodatku
AddIns("Analysis ToolPak").Installed = False
End Sub

Przykad 26. Formatowanie warunkowe w zalenoci od wartoci z innej komrki

69

Przykad 26. Formatowanie warunkowe


w zalenoci od wartoci z innej komrki
Przykad ten jest uzupenieniem formatowania warunkowego dostpnego
w Excelu. Za jego pomoc moemy wpywa na formatowanie komrki zalenie
od wartoci innej komrki (rysunek 5.10). Wykorzystamy w tym celu zdarzenie
Worksheet_Change, ktre jak ju wiesz naley umieci w module arkusza,
ktrego dotyczy.
Private Sub Worksheet_Change(ByVal Target As Range)
rzad = Target.Row
kolumna = Target.Column
'procedura dziaa tylko dla kolumny A
If kolumna > 1 Then Exit Sub
kolor_czcionki = Int(255 - Target.Value)
If kolor_czcionki > 255 Then kolor_czcionki = 255
If kolor_czcionki < 0 Then kolor_czcionki = 0
kolor_komorki = Int(Target.Value)
If kolor_komorki > 255 Then kolor_komorki = 255
If kolor_komorki < 0 Then kolor_komorki = 0
'Procedura zmienia kolory czcionki i wypenienie
'w komrce w kolumnie B w tym samym wierszu
With Cells(rzad, kolumna + 1)
.Font.Color = RGB(kolor_czcionki, kolor_czcionki, kolor_czcionki)
.Interior.Color = RGB(kolor_komorki, kolor_komorki, kolor_komorki)
End With
End Sub

Rysunek 5.10.
Zalenie od wartoci
wpisanej do kolumny A
otrzymujemy formatowanie
komrek w kolumnie B.
Absurdalnie proste

Przykad 27. Ile mamy otwartych skoroszytw?


Spotkaem si kiedy z problemem, w ktrym importowaem dane z plikw
nadsyanych przez uytkownikw. Chciaem to zadanie zautomatyzowa, lecz nie
mona byo sztywno okreli nazw nadsyanych plikw. Uytkownicy mieli