Professional Documents
Culture Documents
Spis treci
Wstp ................................................................................... 5
Rozdzia 1. Excel 2007 nowe przyzwyczajenie ...................................... 7
Rozdzia 2. Narzdzie VBA w Excelu 2007 ................................................ 9
Okno edytora VBA ............................................................................................9
Spis treci
Spis treci
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.
Rozdzia 5. Przykady
48
49
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"
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
GoTo miliony
GoTo miliony
GoTo tysiace
GoTo tysiace
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
GoTo jednostki
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
55
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"
57
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
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)
GoTo tysiace
aa = Str(liczba)
bb = Right(aa, 1)
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)
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 + "
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
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.
2.
Rysunek 5.5.
Przegldarka
obiektw. Uyteczne
narzdzie dla
deweloperw VBA.
Naprawd warto si
z nim zaprzyjani
3.
4.
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
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
65
Finansowe
Daty i czasu
Matematyczne
Statystyczne
Wyszukiwania i adresu
Bazy danych
Tekstowe
Logiczne
Informacyjne
Uytkownika
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
67
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
69
Rysunek 5.10.
Zalenie od wartoci
wpisanej do kolumny A
otrzymujemy formatowanie
komrek w kolumnie B.
Absurdalnie proste