Professional Documents
Culture Documents
Przedmowa............................................................................................... 21
.
Rozdzlat 11 Pnyktady i metod'y programowania w jezykv VBA ..........................291
Przetwananie zakresdw ..................................................................................................... 291
Kopiowanie zakresu ..................................................................................................... 292
P~enoszenie .......zakresu
.............
Kopiowanie zakresu o mienncj wielko5ci ................................................................ 293
Zaznaczanic ldtnego typu zakrcsbw i identytikowanie ich .........................................294
Wprowadzanie wanoSci do kom6rki ............................................................................ 296
Wprowadzanie wartoSci do nastqpnej pustej korndrki .......................... . . .............. 297
Wscnymywanie wykonywania makra
w cclu pobrania zakresu zamaczonego p r a z utytkownika ...................................... 298
Zliczanic zamaczonych komdrek ................................................................................299
Okref lanic typu zmaczonego zala-csu ........................................................................ 300
Wydajne przetwnrzanie korn6rck zaznaczonego zakmu przy utyciu mtli ................. 302
Usuwanie wszystkich pustych wimzy ........................................................................ 303
Okreflanie, czy &es zawiera sic w innym zaknsie .................................................. 304
Okrdlanie typu danych z a w m c h w komdrce ............................................................304
Odczytywanie i zapusywanie zakres6w ........................................................................ 305
Lepsza mctoda zapisywania zakresu ................................:........................................... 306
Przenoszenie zawartoki tablic jednowymimwych .................................................. 308
~ ~
.
.
WDU
Zamacmie maksyrnalnej wartodci zakresu ................................................................ 309
Zamaczanie wszystkich kom6rek okrdlonego forrnatu .............................................. 310
Prottwarzanie skorosryt6w i arkuszy .................................................................................312
Zapisywanie wszpkich skoroszytdw ...........................
Zapisywanie i zamykanie wszyslkich skorosyt6w .................................................. 312
Konystanie z wlaiciwoJci skoroszytu ....................................................................... 312
Synchronizowanie arkuszy..........................................................................................313
Mctody programowania w jqzyku VBA ............................................................................. 314
Pralyzanie wartoSci wlsJciwoSci tygu logiczncgo .................................................... 314
Okrdlanic liczby drukowanych stmn .......................................................................... 315
WySwialanic . . daty i czasu ............................................................................................
315
Pobieranlc lasty czcionek.............................................................................................. 317
Sortowanie tablicy ..................................................................................................... 318
Pnctwarzanie gmpy plikdw ........................................................................................ 319
Funkcje prrydarnc w proccdurach jczyka VBA ................................................................. 320
Funkcja FileExists........................................................................................................ 321
Funkcja FileNarneOnly ................................................................................................ 321
Funkcja PathExists.................................................................................................. 321
Funkcja RangeNarneExists .......................................................................................... 322
Funkcja SheetExists ..................................................................................................... 322
Funkcja WorkbooklsOpcn ........................................................................................... 322
Pobicranie wartoSci z zamkniep skmszytu............................................................ 322
Funkcje przydamc w forrnulach arkusra ............................................................................ 324
Funkcje m c a j ~ infonnacje e o forrnatowaniu kombrki ........................................... 324
W$wietlanic daty w trakcit zapisywania lub drukowania pliku ...............................325
Obiekty nadrydnc .......................................................................................................326
Zliczanie korndrck, kt6rych wartdci znwierajq sip pomipdp dwoma wartofciami ....327
Zliczanie widocmych komdrek zakresu ......................................................................328
OkreSlanic ostatniej niepustej kom6rki kolumny lub wicnze .................................... 3 ~ 8 q.3
.
Zwrscanie tablicy zawierajqcej unikatowe loso\vo uporqdkowane liczby calko~vitr.... 335
Poaqdkowanie zakresu w losowy spos6b 336
Funkcje interfejsu API sysfernu Windows ...................................................................... 338
OkreJlanie skojarzen plik6w ........................................................................................338
OkreSlenie informacji dotyczyych domyllnej drukarki .......................... ............. 339 .
.
Okreslenie nktualncj rozdzielczoSci kany graficznej ....................... . . ...................... 340
Dodanie dtwi~kudo aplikacji ......................................................................................340
Odczytyvnnie zawartodci rcjestru systemu Windows i mpisywnnie \v nim danych ....342
.
Rozddal 18 W y i u e q ................................................................................................... 485
...............................................................................
Podstawowe wiadomoSci 0 wykrcsach 485
Poiobnic wykresu .......................................................................................................48s
Model obiektu Chart ...................................................................................................486
Rejestrowanic makr d o t y w y c h wykns6w ...................................................................... 487
Zanjcstrowany kod makra twonqccgo w y h s ........................................................... 487
Ulepszanic zarejestrowanego kodu tworzenia w y k s u ............................................... 489
Populame techniki jqzyka VBA dotycqce wykrcdw ....................................................... 489
Wykorrystanie VBA do u w w n i e n i a wykresu ..........................................................490
Wvkorzystanie VBA do deaktywacji wykresu ............................................................. 491
.
Rozdzial 20 lnterakcje z innymi apllkacjami .......................................................... 563
Uruchamianie innych aplikacji z poziomu Excela ............................................................. 563
Zastosowanic funkcji Shell jqzyka VBA ...................................................................... 563
Zastosowanie funkcji Windows API ShellExrmte ...................................................... 566
Uaktywnianie aplikacji z poziomu Excela ......................................................................... 567
Wykorzystanie instrukcji AppActivate ........................................................................567
Uaktywnianic aplikacji pakietu Microsoft Office ........................................................ 567
Uruchamianie okicn dialogowych Panclu sterowania ........................................................ 568
Wykorzystanie automatyzacji ............................................................................................ 569
Dzialania z obiektami innych aplikacji z wykonystaniem autornatyzacji ...................569
Wczcsne i p 6 h e wil\canie ........................................................................................... 570
Prosty pnyklad p6hego wiqzmia ............................................................................... 572
Zaqdzanie Wordem z poziomu Exeela ......................................................................573
Zarqdzanie Excelem z poziomu innej aplikacji .......................................................... 576
Wysyianie spersonalizowanych wiadomoki c-mail z wykorzystaniem Outlooka .............577
Dziatanin z obicktami danych ActiveX (ADO) .................................................................. 579
Wysyianie wiadomoici e-mail z zalqcmikami z poziomu Excela...................................... 581
Zastoso~waniemctody SendKcys........................................................................................582
.
Rozdzial 21 Tworzenfe I wykorzystanle dodatk6w ................................................. 585
C y m sq dodatki? ............................................................................................................... 585
Porownanie dodatku ze standardowyrn skomszytem ................................................... 585
Po co tworzy sic dodatki? ...................................... -86
Mcnedzer dodatk6w Excela ............................................................................................... 587
Tworzenie dodatk6w .......................................................................................................... 588
Przyktadowy dodatek ......................................................................................................... 589
Konfigumja skomszyhr dla przykladowego dodadtu ................................................. 589
Tesaowanie skomszytu u2ytcp do utwnenia przyktadowep dodatku .....................589
Wpaowadzanie opisu dla przykladowego dodatku ....................................................... 590
Utworzcnie dodadru .................................................................................................... 590
lnstalowanic dodatku ................................................................................................... 592
Dysuybucja dodatk6w ................................................................................................. 592
Modyfikowanie dodadru .............................................................................................. 592
Spis treici ;5
..
Czqsc VI Twonenie aplikacji........................................................... 607
.
Rozdziot 22 Tworzenle posk6w narzqdzi.................................................................. 609
Paski narqdzi .................................................................................................................... 6139
Dzialaniaz paskami nanpdzj .............................................................................................609
JakExcel m d z a peskami nanpdzi? ............................................................................... 6103
Przechowywanie pask6w n a w z j ............................................................................... 610
Problemy z dzialaniem paskow n m f l z i ..................................................................... 6 1
Rpcme dostosot+ywanie pasktiw nanpdzi ......................................................................... 611
. dostosowptania asko ow narzdzi ....................................................................... 612
Tryb
Drstrybucja paskdw narz&i u ~ k o m i k .................................................................
a 615
..CommwdBars ................................................................................... 617
Dziatania z kolekcia
Rodzaje pask6w narredzi .............................................................................................. 617
WySwictlenie wszystkich obiekt6w CommandBar .................................................... 617
T w m n i e pask6w nanpdzj ......................................................................................... 618
Odw+wanie sip do paskdw n w q d z i w VBA ............................................................ 619
Usuwanie paska nmqdzi ta pomocq kodu VBA ......................................................... 62'3
WIdciwdci paskow narqrki ...................................................................................... 620
Odwotywanic sip do kontrolek na pasku narqdzi ....................................................... 625
Wyszntgdlnicnie konmlek na pasku nam$zi .......................................................... 626
Wflwietlanie wszystkich kontrolek na wszystkich paskach narz@zi ..........................627
Dodawmie kontrolki na pasku nanedzi ..................................................................... 625
Usuwanie kontrolki z paska nanpdd ........................................................................... 628
WlaiciwoSci kontrolek parkow narzedzi ...................................................................... 629
.
Rozddd 23 Tworzenle menu ..................................................................................... 639
Pasek menu w Excclu ......................................................................................................... 639
Modyfikowanie menu Excela przez uQlkownike .............................................................. 640
Pojecia zwiqzane z systemem menu Exwla ................................................................. €40
Umwanie elcment6w menu Excela .............................................................................. &I
Dodawanie element6w menu Excela ........................................................................... 641
Modytikacja clemcnt6w mcnu Excela ......................................................................... 6-12
Wykorzyslanie jwka VBA do dostosoqwania menu w Excelu ..................................... 532
Wyjwi.etlanie inforrnacji o menu Excels..................................................................... 643
Dodawanie nowego menu na pasku menu .......................................... ............ ...... 642
Usuwanie menu z p&a menu ...................................... 6 -
..
Dodawanie pozycy menu ............................................................................................
., 647
!6 Excel 2003 PL . P r o g r a m o w a n i e w VBA . V a d e m e c u m profesjonclisty
programy realizujujilce specjalne zadania, krore motna dolqczyt do aplikacji, aby wzbo-
gacic jq o nowe funkcje i wydlutyc jej tywomoit. Udoskonalono re2 zarqdzanie pa-
migciqi zastosowano wir;cej funkcji @ (w jezyku angielskim symbol @ wyrnawia sie m).
W pomwnaniu z p o p h i q wersjq wersja Release 2 obslugiwala caerokrotnie wirksa
liczbp wierszy i umotliwiaia wykorzystanie koprocesora zmiennoprzecinkowego. Poza
rym rozbudowano w niej j e q k makr, ktdrego populamosC przekroczyla wszelkie wyobra-
tenia projektant6w.
Nie bylo zaskoczeniem, ze sukces prooramu 1-2-3 spowodowai pojawienie sic wielu
klondw, czyli podobnie do niego dziaiG4cych produktbw, zazwyczaj oferujqcych kilka
dodatkowych funkcji i sprndawanych po macznie nitszej cenie. SpoSrod nich bardziej
zauwatalne byly takie aplikacje, jak VP Planner finny Paperback Software i Twin firmy
Mosaic Software. Ostatecmie Lotus podjqi kroki prawne przeciwko firmie Paperback
Software, za naruszenie praw autonkich (skopiowanie wyglqdu i sposobu obslugi pro-
gramu 1-2-3). Lotus wygral proces i w efekcie Paperback,miknql z rynku.
Latem 1989 mku Lotus zaprezentowal mocno opbfnionq wenjq Releuse 3 przemaczonq
dla systern6w DOS i O W .Produkt ten wprowadzil nowy wyrniar (dosiownie!) w dobrze
manym arkuszu zlaonym z wienzy i kolumn. Model arkusza zostal rozszerzony poprzez
rnotliwoSC tworzenia wielu jego stron. Jednak pomysl nie by4 nowy, poniewat trojwy-
miarowe arkusze kalkulacyjne mtosowano juZ w stosunkowo malo znanym produkcie
o nazwie Boeing Calc. Utywaty go teb takie programy, jak SuperCalc 5 i CubeCalc.
Program 1-2-3 Releare 3 oferowai nowe, ale oczekiwane przez 112ytkownik6w funkcje.
W i e l o m t w o w e arkusze, motliwoSC jednoczesnej pracy z wieloma plikami, lqczenie
plikbw, rozbudowane funkcje graficzne i bezpoSredni dostep do zewnemych plik6w
baz danych ostatecmie weszly do standardowego zestawu mokliwoSci. Jednak w dalszym
cizgu program by1 pozbawiony w a h e j funkcji, ktbrej utytkownicy bardzo sip dornagali.
czyli moZliwoSci twmenia wysokiej jakoSci dokurnent6w wyjiciowych.
P o c ~ o w wersja
o Releuse 3 miala ograniczone szanse powodzenia na rynku, ponie-
wa2 wym* komputera PC z procesorem 80286 i co najmniej 1 MB pamieci RAM,
co w 1989 roku byio macmyrni wyrnaganiami. Jednak Lotus trtymal jeszcze jednego
asa w ekawie. W m z pojawieniem sie wersji Release 3 firma ku zaskoczeniu prawie
wszystkich oglasila wydanie aktualizacji do Release 2.01. Kilka miesipcy pbiniej a h -
alizacja pn'yj@apost& 1-2-3 Release 2.2. Jak oczekiwala wipkswSC analityk6w, wersja
Releare 3 nie miala zastapiC wersji Releare 2. Zamiast tego Lotus wykonal genialny .
ruch polegajqcy na podzitleniu rynku arkuszy kalkulacyjnych na dwa segrnenty. Jedcn
miai-by6powiqzany z droiszym sprqtcm, natomiast drugi z powszechniej stosowanymi
urqdzeniami.
Wersja ReIeuse 2.2 nic stanowih r o m i w ~ ~ idednego,
ia ale dokonano w niej ma&:
cych udoskonalefi. Najwaznicjsza jej funkcja nosqca nazwe AIIwuys byla dodatkiern
umo2liwiajqcym generowanie atrakcyjnych rapwtbw, zawierajwch wiele kroj6w pisma
rarnki i cieniowanie. Ponadto utytkownicy rnogli oglqdad wyniki na ekranie w oparciu
o tryb WYSIWYG (ang. What You See Is What You Get - To, co wickis, jest pm, co
uzyskarr). Jednak funkcja Allwqs nie pozwalala na wykonywanie poleceli arkusza
w uakcie pneglqdania i formatowania wynik6w w trybie WYSIWYG. Pomimo tego
d o e powahego ograniczenia wiqbmSt 112ytkownik6w programu 1-2-3 byh wyjatko-
wo zadowolona z nowej hnkcji, poniewai wreszcie rno2na bylo tworzyc dokumenv
wyjkiowe o jakoici niewiele odbiegajqcej od jakoSci skbdu drukarskiego.
32 Czg3t I + Podstawowe informacje
W maju 1990 roku Microsoft wprowadzif na rynek system Windows 3.0. Jak zapewne
wiesz, system Windows mienil s p o d b korzystania z komputer6w osobistych. Podobno
decydenci z Lotusa poczqtkowo go nie docenili i w efekcie uplynplo trochp czasu, za-
nim pojawila sip pienvsza windowsowa wersja arkusza 1-2-3.N a s t ~ i l oto pod koniec
1991 roku. Co gorsza, produkt ten, rnbwiqc w skrhie - byl niewypalem. Tak naprawde
nie wykonystywal swoich atutdw w frodowisku Windows i rozczarowat wielu utyt-
kownikbw. W konsekwencji Excel, ktdry j u t wtedy miat status pierwszego arkusza kal-
kulacyjnego dla systemu Windows, stat siq trudnym do pokonania liderem rynku arkuszy
pnemaczonych dla tego systemu i nigdy nie smcit tej pozycji. Lotus powrdcit w czerwcu
1993 roku, prezentujqc wersjt Release 4 programu 1-2-3for Windows. W por6wnaniu
z wersjq oryginalng w tej wersji dokonano znacznych udoskonaled. W potowie roku
1994 pojawila sip wcrsja Release 5.
W pdowie 1994 roku Lotus zaprezmtowal program 1-2-3 Release 4.iJfor DOS. Wielu
analitykdw (wlqczajqc w to mnie) oczekiwalo, t e produkt ten bpdzie bardziej kompaty- !
bilny z systemem Windows. Jednak byta to po prostu aktualizacja wersji Release 3.4. i.
Ze wzgltdu na d u popularnoSf
~ systemu Windows powinna to bye ostatnia wersja
program 1-2-3dla systemu DOS,kt6ra ujrzdq iwiatk dzienne. I
I
W t c e arkusze kalkulacyjne staw siq mniej istome dla Lotusa Gego flagowym pro-
duktem okazat sip pakiet Notes). W potowie 1995 roku IBM pnejqt f- Lotus Deve-
lopment Corporation. Pojawily siq jeszcze dwie wersje programu 1-2-3,ale wydaje siq.
t e n-ilo to zbyt p6iao. Excel zdominowd rynek arkusq kaikulacyjnych, natorniast
aplikacja 1-2-3 caly czas tracila w nim udzial.
Jesieniq 1989 roku Borland rozpocd s p d & programu Quattro Pro. Stworzony
w oparciu o oryginalnqaplikacje Q u m o , oferowal szersze mo2liwoSci ni2 program 1-2-3
i byl lepsy od niego pod prawie kakdym wzglpdem. PrzykMowo pierwsza wersja pro-
gramu Quattro Pro, pomimo braku p f i c m e g o interfejsu utytkownika urnotliwiala
pracp z wieloma arkuszami przy W c i u okien, kt& motna bylo pnemieuczat, mody-
fikujqc ich rozmiar w zalctnodci od potrzeb. Dodatkowo program Quattro Pro by#
oparty na niemanym pmdukcie o nazwie Surpass kupionyrn przez Borland.
W wersji Version 2.0 pmgramu @ a m Pro zapmntowanej pod koniec 1990 mku za-
stosowano tm5jwymiarowe wykresy i h a e z b q danych Pmaddx firmy Bwland. Zaie-
dwie szdC miesieey Mtniej, co macznie zasmuciio autor6w k s i e k poSwiwonych pro-
gramowi Quamo Pro, pojawila siq Version 3.0. Wyposrnno jq w opcjonalny graficmy
interfcjs utytkownika i funkcje pokazu slajdbw. Na wiosnp 1992 roku pojawih sit Ver-
sion 4, w kt6rej tastosowano modyfikowalne elementy SpeedBm i innowacyjnq funkcje
anal-j grafiki. Version5 zapmentowana w 1994 roku posiadda tylko j
amacqcq
nowq funkcjq, czyli zeszyty arkuszowe (inaczej nazywane tr6jwyrniarowymi arkuszami).
Podobnie jak Lotus, Borland do66 powoli przekonywal sip do systemu Windows. Jcd-
nak gdy ostatecmie jesieniq 1992 mku pojawil sie program Quattro Pro for Windows.
w pewnym stopniu okazal sip silnq konkurencjq dla dw6ch innych arkusy kalkulacyj-
nych przemaczonych dla tego frodowiska - aplikacji Excel 4.0 i 1-2-3 Release I. I for
Windows. Istotne byto to, te Quottro Pro for Windows posiadat i~owacyjnqfimkcje
o nazwie I11 Builder, kt6ra u m o t l i w i ~projektantom i zaawansowanym utytkownikom
proste tworzenie w h y c h interfejsdw utytkownika.
Godna uwagi jest t& sprawa sqdowa pomi- firmami Lotus i Borland. Wy@ Lotus.
ktbry zmusil konkurenta do usuniecia z Quartro Pro opcji wyboru menu oraz kompary-
bilnoSci z makrami aplikacji 1-2-3. lednak postanowienie to ostatecmie pod konicc
1994 roku zostalo miesione i obecnie Quanro Pro jest kompatybilny z aplikacjq 1-2-3
(jakby kogd to interesowab). Obie firmy wydaiy na dhgi proces miliony d o l h w ,
a gdy jut siq zakodczyt, okazalo siq, t e nie ma prawdziwcgo myciqzcy.
Version 9 wchodzqca w skhd pakietu WurdPerlfct OIjice 2000. Produkt ten uzyskat
kilka robiqcych wratenie wynikdw, takich jak obshga miliona wienzy i 18 278 kolumn
(za coS takiego utytkownicy Excela wiele by dali). Na rynku arkuszy kalkulacyjnych
Q~tatrroPro zajmuje odleglq trzeciq lokatp.
Przez jakiS czas Qua~troPro wydawat sie najlegszq propozycjq dla osdb korzystajqcych
z arkuszy kalkulacyjnych, ale tylko do momentu pojawienia siq Excela 5 .
Wipkszo$6 os6b nie zdaje sobie sprawy, te Microsoft doswiadczenie nviqzane z arkuszarni
kalkulacyjnymi zacqt zdobywaC jut na poczqtku lat 80. Przez lata arkusze kalkulacyjne
Microsoftu przcszly znaczqcq ewolucje, kt6rej zwiericzeniem - jak na razie -jest
rozbudowana aplikacja Excel 2003.
Aplikacja Excel, kt6ra po raz pimvsy pojawib sip w 1985 roku w w m j i dla kompute-
row Macintosh, w pewnyrn stopniu powstah w oparciu o program MuItiPlan. Podobnic
jak wszystkie aplikacje przemacmne dla systemu MacOS, Excel ht wykorzystywal
graficmy interfejs utytkownika (w pmciwiehstwic do Mt(ItiP!amc bazujqcego na aybie
tekstowym). W listopadzie 1987 roku Microsoft zaprczentowal pienvsq wersje pro-
gramu Excel for Windows (nadano mu numcr 2.0, aby zachowaC zgodnodt z wersjq dla
kornputer6w Macintosh). Poniewa2 sFtem Windows nie by#wowczas jesocze t b y t po-
pulamy, do tej wersji Excela dotagzono specjalnq odmiane systemu Windows, ktbra
oferowala minimalnq liczbq funkcji urndiwiajqcych tylko i wyhcznie uruchomienie
Excela Po niecalym mku Microsoft zaprczentowal program Excel Version 2.1, a w lipcu
1990 mku opublikowai mniej istotnq aktualizacjq (2.ld), kompatybilnq z systemern
Windows 3.0. Co prawda, wedlug aktualnych standard6w wersje omaczone jako 21.
byly do515 ograniczone oraz pozbawione atrakcyjnego wyglt@u pdtniejszych wersji, ale
zainteresowaty niewielkq, lecz lojalnq grupp zwolennik6w, a p a d t o stanowib znako-
mity bdament dla kolejnych wersji. Jezyk makr XLM zawierat b k c j e wykonywane
jedna po drugiej. Mia4 spore motliwoSci, ale by1 tet bardzo trudny do opanowania i ob-
shrgi. Z a s q i l go jqzyk VBA, kt6rernu podwiqcono te ksi@k$.
Excel 4 zaprezentowany wiosnq 1992 roku nie tylko by1 prostszy w obstudze, ale tei
oferowal zaawansowanym utytkownikom wiqcej motliwoSci. W porbwnaniach z nirrnal
katdym arkuszcm kalkulacyjnym publikowanych w brantowych czasopismach Excel 4
zdobyl glbwne wyr6mienia. Tymczasern relacje pomiedzy Microsoftern i IBM-em sra-
w a b siq coraz bardziej napiete. W efekcie program nigdy nie pojawil sie w wenji dla
systemu OS/2 i Microsoft zakohczyl rozwijanie aplikacji z mySlq o rej platformie.
Excel 5 pojawil s i na
~ rynku na pocqtku 1994 roku i natychmiast zdobyt makornite recen-
j e . Podobnie jak jcgo popnednik, malazt sit na szczycie wszelkich porownan arkuszy
kalkulacyjnych publikowanych w najwatniejszych czasopismach brantowych. Pomimo
sporej konkurencji ze strony program6w 1-2-3 Release jfor Windows i Quariro Pro 5
for Windows, ktbre byly makomitymi praduktami radqcymi sobie z prawie kaidq ope-
racjq wykonywanq w arkuszu kalkulacyjnym, Excel 5 w dalszym cizgu wi6di pryrn.
W tej wersji po raz pienvszy zastosowano jezyk VBA.
Excel 95 (many r6wnict pod nazwq Excel 7) pojawil sip jednoczcSnie z systernem
Windows 95. Microsoft pominql wcnjq s z b s ~ ,aby ujednolicik numeracjq wersji pro-
duktbw wchodqcych w skhd pakietu Ofice. Z zewnqtrz Excel 95 niezbyt sit romil od
swojego popmednika. Jednak wiele fiagmentbw podstawowego kodu napisano ponownie
i motna bylo zauwa2yk w n o n wydajnobci. Warto zwrdciC uwagq, i e Excel 95 poslugiwal
sic takim samym formatem pliku, jak Excel 5. Byta to pierwsza aktualizacja, w ktdrej
nie zmieniono fonnatu pliku. Jednak zgodnoit pomiqdzy obiema wersjami nie byta do-
skonah, poniewat w pnypadku Excela 95 jezyk VBA zostat wzbogacony o kilka roz-
szcrzeri. W konsekwencji motliwe bylo stworzenie w Excelu 95 apiikacji, ktbrq Excel 5
ladowat, ale kt6rej nie motna by40 poprawnie uruchomit.
Na poczqtku 1997 mku Microsoft wprowadzii do sprzedaty pakiet Ofice 97, ktdry za-
wieral program Excel 97, many r6wnieZ pod nazwq Excel 8. W tej wcrsji zastosowano
kilkadziesiqt ogblnych ronzemli oraz zupelnie nowy interfejs projektowania aplikacji
w oparciu o j m k VBA. Ponadto produkt ten oferowal nowy sposbb twmenia niestan-
dardowych okien dinlogowych nazywanych forrnularzami UserForm, a nie arkuszami
dialogowymi. Micrasoft pr6bowal zachowai zgodnoSC Excela 97 z poprzednirni wersjami.
.ale dalcko byb jej do doskondolci. Wiele aplikacji stworzonych prry W c i u Excela 5
lub 95 pned uzyskaniern motliwoSci uruchornienia ich w Excelu 97 lub nowszych wer-
sjach wymagalo modyfikacji.
36 Czgit I + Podstawowe inforrnacje
Excel 2000 pojawit sit na poczqtku 1999 roku i by# tet sprzedawany jako komponent
pakietu qffice 2000. Co prawda, nowo9ci w nim wprowadzone dotyczyiy gidwnie mot-
liwoici korzystania z intemetu, ale pojawiio sip tet kilka macqcych zmian zwiapinych
z prograrnowaniem.
Excel 2002 pojawil s i na rynku w polowie 200 I roku (by4 rbwniet sktadnikicm pakietu
Oflce XP). Podobnie jak jego popnednik, nie oferowal wielu macwcych nowych
funkcji. Zamiast tego wprowadzono kilka mniej istotnych nowoici i udoskonalono
funkcje jut Ltniejqce. Prawdopodobnie najwartoiciowstq nowq ftmkcjq byla motliwosC
naprawiania uszkodzonycl plikdw i zapisywania wynikdw pracy w przypadku zawie-
szcnia programu. Excel nadal btdzie mial dorninujqcq pozycjp na rynku i pozostanie
standardem dla uZytkownik6w o r6tnym stopniu zaawansowania
Excel 2003, many 16wniet pod nazwq Excel 11, to jak na razie najnowsza aktualizacja
arkusza kalkulacyjnego, bez wqQienia najbardziej rozczarowujqca. Pojawila sip jesicniq
2003 roku. W tej wersji dostppnych jest niewiele nowych funkcji, dlatego wiqkszoSf
urytkownik6w Excela 2002 uzna przeprowadzenie aktualizacji za zbytecme. Niekt6-
rym uytkownikom mote przypa.$C do gustu motliwoSC irnportowania i eksportowania
plikbw zapisanych w forrnacie XML (ang. extensible Markup h g u a g e ) , a t a k e ma-
powania danych do o ~ l o n y c hkombrek arkusza. Ponadto Microsoft wprowadzii kilka
funkcji z w i p n y c h z zacqdzaniem prawami, kt61-eumotliwiajq narzucanie ograniczeh
r62nym elementom skoroszytu (na omklad w tem spos6b dostep do o h i l o n e n o arkusza
mo& ottzymat tyko &kt& u.2y&owkicy). ~ojawiiosiq tet kilka nowych fimkcji (jednak
niezbyt macacych) zwiqzmych - - z listami o w nowa funkcja pozwalajqca.. poldwnywai:
.
obok-siebie dwa Gkusze p r y utyciu mechanizmu zsynchronizowanego p~twi,ania.
Rozszmono tez funkcjq SUMY. POSREDNIE i usunigo istniejqce ju2 od d&zego czasu
problemy z wieioma funkcjami statystycmymi. Dodatkowo Excel 2003 posiada nowy
system pomocy, ktdrej zawarto9C umieszczono w panclu zadah, a takte now$ metodp
szukania umotliwiajqq wyszukiwanie w panelu & r6tnych infnmacji (niek%re z nich
wymagajqzatotenia konta, za ktbrc jest pobierana oplata).
ZjakiegoS powodu Microsoft zdecydowat sic zeofsrowd dwle podwersje ExDela 2003.
Obsluga formatu XML I zanadzanle prawami sq dostepne tylko w niezdetnej wersji
Excela i wefsji wchodzqxj w sktad pakietu m c e 2003 Professional. Z tego powodu
programiki korzy-stajqcy z Excela 2003 rnogq mi& poblemy z braklem zgodnosci
nawet w ramach jednej okre9lonej wersjil
MyBlenie obiektowe
W M c i e tworrmia aplikacji w Excelu (nvhzcza, gdy korzystasz z jpzyka VBA) p
mocne jest my9lcnie przy K!Y&I obiektdw Iub elmmt6w arkusza kalkulacyjnego, kt-i
motna rnanipulowat rqcmie, bqdt za poSndnictwern makra. Oto kilka pnykladbw
obiektdw Excela:
sama aplikacja Excel,
S koroszyty
Jednym z najczqiciej stosowanych obiektdw Excela jest skoraszyr. Wszystkie operacje
wykonywane w Excclu sqpowipme ze skoroszytem przechowywanym w pliku o domysl-
nym rozszerzcniu .XIS.Skoroszyt Excela moke przechowywat dowolnq liczbp arkuszy
(ograniczonq jedynie przez dostppnq pamipt). Motna wyr62niC caery typy arkuszy:
zwykte arkusze.
arkusze wykres6w,
m arkusze makr XLM (pnestamle, ale nadal obslugiwane).
arkusze dialogowe (przestmle, ale nadal obslugiwane).
Co prawda, motna otworzyt dowolnq liczh skorosyt6w (katdy we wlasnyrn oknie),
ale w danej chwili tylko jeden z nich m o a byt skoroszytem aktyunym. Podobnie tylko
jeden arkusz skoroszytu mo* byc a r h z e m aktywnym. Aby uaktywnie arkusz, n a l e y
kliknqt jego kartq w dolnej mci ekranu. Aby mienif nazwt arkusza, nalezy dwu-
kromie kliknqt kartp i wpisaf nowq nazwp. Po kliknipciu prawym przyciskiem myszy
zostanie wySwietlone menu podlyczne.
Od wcrsji Excel 2002 i h i e j e mo2liwdC pnypisywania kolor6w kartm arkuszy. W tym
celu z menu Fonnat nalety wybrat poycjp A r k , a nastgnie Kolor karry. Identyfi-
kowanie kart przy ukyciu kolor6w mote porn& w znalezieniu okrdlonego arkusza,
zwlaszcza gdy w skoroszycie majduje sit ich wiele.
Istnieje tet rno2liwo6d ukrycia okna zawicrajqcego skoroszyt. W tym celu nalety wy-
brat pozycjp Ulrryj z menu Oho. Ukryte okno s k o m y t u potostanie Ohmate, ale b&ie
niewidocme.
(SF*Wersle
* Excela starsze od wersji Excel
wierszy.
16 384
97 obstugiwaty arkusze liczqce jedynie
MotliwofC stosowania wielu arkuszy w jednym skoroszycie to du2a zaleta. Dziqki ternu
nie tylko zwi~kszasiq liczba dostqpnych komdrek, ale t a b moha ulcpsqC organizacjq
pracy. W zamiemhlych czasach, gdy plik s kW sic z pojedynezego aricu~qpmjektanci
tracili mn6stwo czasu, prbbujqc tak go mrganimwak, aby w wydajniejszy spos6b p n e c b
wywal informacje. Obecnie dane mogq bye przechowywane w dowolnej liczbie arkuszy
i w dalsym c i u u poprzez klikni~ciekarty arkusza m o a a uzyskat do niego natychmia-
stowy dostpp.
Utytkownik w pelni konholuje szemkoid kolumn iwysokok? &my. Tak naprawdq motc
nawet duyf w i m i kolumny, a W e cale arkusm. Tekst w kom6rce mote bfi wy-
Swietlony pionowo lub ukobnie, mote tc2 zosW zawiniqty, talc aby zajmowd kilka linii.
Arkusze wyhes6w
srandardowo ericus mybsu przechowuje pojedymzy wylaes. Wielu ~ o w n i k 6 w
ip
ruje arkusze w y k n d w , pnferujy przeehowywanie wykres6w w wantwie rysunkowej
arkusat Co prawda. q i e arkuszy wykrcdw jest opcjonalm, ale w ich pnypadku wydru-
kowanie na h e samego wykrcsu jest m h p latwiejsze. Tego typu arkusm sq sz~ag6lnie
przydame w przypadku prczentacji.
Jakl Jwtrormhr d w m ?
W a t o siQ p z s Z chwllp mdmmI6 md romrlamm arkusw. Z w j operacji mybWQcZ
nej (256 * 65 536) wynlka. te jeden arkusz rawlera 16 777 216 kmdrek. Pojedynczy skorokzyt
mote s k W d sig z wlgkszej lkzby aaruszy.
JeJli utywasz ~ e l c z o S ckarty
l J x 600 waz clomy4lneJ wysok& wieruy i sm
g m f k z ~ 800
rokoJci kolumn, w dam) chwili zobaczysz 12 kolumn i 28 wienzy (lub 336 kom6rek). co stanowl
ok* 0,002X cdego arkusza. lnnymi stowy, jeden arkusz sktada sig z pawie 50 OM) ekrandw
zawierajqcych inforrnacje.
Jelll do ka2dej kom6rld wprowedzalbyO pcjdymq qfrg ze stownkourq dutq szybkoSclq w y n o s ~
cq jedna komdrka na sekum, wypelnlenle catego arkusza zajeoby okoto 194 dni nlewtannej
pmcy. Aby w y d r u k M wynikl pay, koniecme by byto miycb ponad 36 000 stron papiehl. cyli
stosu o wysokoSci okob 1.8 metra.
Wypanianie wartotiami catego arkusza nle jest mkazane. Tald plik mlalby spore m a i q i jego
przetwarzanle by4oby wyjqtkam, powolne, poniewat system Wndaws c&y a s dokonydby *onC
m a n i a dan)Fh na dysku. Excel nie -eta pe
m m katdej kombrce. Z pamiqd korrystajqjcdynie
uiywane kordrkl.
42 Czefe 1 Podstawowe inforrnacie
Jak nazwa wskaruje. arkust makra XL,M zostai stwomny do pmchowywania rnakr XLM.
System makr XLM jest pozostaloSciq poprzednich wersji Excela (4.0 i starszych). Excel
2003 w dalszym cirlgu je obsluguje r e wzgl~duna zachowanie zgodnolci, jednak nie
oferuje jut motliwoSci ich rejestrowania. W tej ksi- nie dokonano orndwienia systemu
makr XLM, natomiast ~ 6 c o n uwagco na bogatszy w motliwoJci system makr VBA.
Menu
Pocqwszy od programu Excel 97, menu wkkiiwie s@ zamaskowanymi paskami n-dzi.
Powierdzeniem tego sqikony towanysplce niekt6rym pozycjon
System menu Excela jest stosunkowo prosty. Istniejq dwa typy menu Jedno z nich jest
dost-. gdy mstanie ualdyrmiony arkw, natomiast drugie po -iu arkurm wykesu
lub zamaczeniu obiektu wylcresu majdujqcego siq w arkuszu. Zgodnie z konwencjami
Rozdzial2. + Program hcel w zarysie 43
Caty system menu moee by6 dostosowany do wlasnych potneb przez utytkownika lub
projektanta. W tym celu z menu Widok nalety wyb& pozycje Paki n a ~ e d r ia, nastepnie
Dostosuj. Zmiany dokonane w menu przy utyciu tej metody q tnvate, a wiqc pozostanq
nawet po zamkniviu Excela i jego ponownym uruchomieniu. Jednak w dowolnej chwili
motna przywrdcit domy9hq konfigwacj~menu. W tym celu z menu Widok nalety wybnc
pozycje Puski naqaki, a nastppnie Dastosuj. W oknie dialogowym Dostosowywanie nalety
klhqC zakhdkp Paski nurqdzi. Z listy Push n a q d z i nalety wybraC pozycjp Pusek menu
arkusza kalkufacyjnego lub Pmek menu Wykres, a nastppnie k1ikn;tC przycisk Resetzrj.
Edytor menu m m b w Excel 5/95 nie jest jut obstugiwany. Aby modyflkowaC menu
stworzone w programach Excel 5/95 pny uiyciu edytora menu, muslsz uruchomit
jedna z tych aplikacji. lnna motliwoSE polega na utyciu narqdzia, ktdre na to pomoli.
JeSli zalety Ci na skonwertowaniu skoroszytu Bcel 5/95, w ktdrym dokonano mian
menu, do formatu pllku obstugiwanego pnez Excel 97 lub nowszy, najlepiej prred
wykonaniern operacji konwersji uiyC edytora menu w celu usuniecia tych zmian.
Aby uryskas? wiwej infformacji na temat dostosowywania menu, naleiy raja&
do rozdzialu 23.
Menu podrqczne
Excel posiada te2 kilkadziesiqt menu podrpcznych. Tego typu menu pojawiajq sic, gdy
W k o w n i k prawym pmyciskiern myszy kliknir jeden lub kilka obiektbw. Menu pod-
Qcme sq menu kontekstowymi. lnnyrni stowy, to, ktbre menu sip pojawi, zaiety od
pdotenia wskahika myszy w momencie nacihiecia jej prawego przycisku. Prawm
pnyciskiem myszy motna k l i w prawie kaMy obiekt taki, jak kombrka, ramka wiersn .
lub kolumny, pasek tytuh skoroszytu, pasek nanpdzi itp.
Excel 2003 zawiera kilkadziesiq predefiniowanych paskbw narydzi (w tym dwa speC
niajqcc funkcjq menu), a p o d t o motma tworryC dowolnq l i e nowych. Aby dostosowat
paski n-dzi lub utwonyC nowe, z menu Widok nalety w y b d pozycjq Paski n z e & r .
a nastepnie Dosrosuj. Po ddqczeniu dostosowanych pask6w narqdzi do skoroszyt6w
motna je przenosit.
44 CzefC I + Podstowowe infomwcje
Paski@n mag@ by6 szwno ma&me (umiestczone przy jednej z kraw@i ekranu)
lub mobodnie pnemieszczane. DomySlnie Excel wySwietla paski n a r r w Standardowy
i Formatowanie bezpolrcdnio pod paskiem menu.
Rysunek 2.1.
Edytor ptzyclskdw
paska na-i
Excela nie jest crymS
W~tkOwym,
ale spefnia swojq
funkcje
Okna dialogowe
I
WiqluzdC polecefi mmu Excela wy9wietla o h dialogowe. Okna te q d o g podobne
pod wzgldem sposobu dzialania. WipkszofC okien dialogowych nalety do katcgorii I
okim modalnych. Omacza to, t e aby uzyskak d o s t q do arkusza, koniecme jest wczc- I
Sniejsze zamknipcie takiego okna Jednak kilka okien dialogowych pomstaje zawsze na
wierzchu. Pnykladowo okno dialogowe Znajdowanie i zamiwimie (aby je otwonyk, 1
z menu Edycja nalety wybrak pozycje a4j&3 mote powstae o~uartcw trakcie kotzy-
stania ze skoroszytu.
1
I
Niektdre okna dimlogowe konystajq z zakMek, dzipki czcmu jedno okno mo2e p h i 4
funkcjc k i h r6211ychokicn. Na pnykbl pokazane na rysllnku 2.2 olmo dialogowe Opcje
(aby je otworryt, z menu N q & i a nalety wybrat pozycjp Opcje) zawiaa 13 zakiadek.
Rysunek 2.2.
Okna dialogowe
z zakladkerni
udostepniajq wlele
opci, nie pnytIacrsjqc
~Iytkownika
lnteligentne tagi
InteJfgentny tog (ang. Smart Tog)jest niewjelb pojawiajvq s* automatycmie
w arkuszu Po jej klikni~ciumasz do wyboru kiIka opcji. Jdlina prqkW skopiujesz
i wkleisz rakres k o m w Exal wygmcruje inteligcnmy tag, M r y w e wid- poni*
wklejoncgo rakresu (rysunek 2.3).
46 Czeit I + Podstawowe informacje
Rysunek 2.3.
lnteligentny tag
pojawia sic
po whlejeniu
skopiowanego
zakresu
Excel h j e kilka imych inteligenmych tag6w; dodatkowe tagi mogq dostarczad nie-
zale2ni producenci. Nie katdy lubi inteligentne tagi, ale na szczqkie motna je wylqczyt
w zakladce Tagi inteligentne o h a dialogowego Autokorekta (aby otworzyt to okno,
z menu N m e d r i a nalety wyb& pozycjq Opcje autokorekry).
Panel zadah
W Excelu 2002 wprowadmno panel zadd, dodatkowy element intcrfejsu utytkownika
standardowo osadzony po prawej stronic okna programu. Panel zadah jest stosowany do
r15tnych celdw, w tym wySwietlania wynikbw przeszukiwania systernu pornocy i za-
wartoSci schowka pakietu m c e , oferowania wsparcia przy wyszukiwaniu i mapowania
danych zapisanych w formacie XML.
Panel zadatl zostal macznie rozbudowany w Excelu 2003.
Wprowadzanie danych
Wprowadzanie danych w Excelu jest d d d prate. P r o m inarpretuje zawartoS1 katdej
kom6rki jako jeden z nas&pujqcych typbw danych:
wartoe liczbowa (w tym data i czas),
teksS
B wartdt logima (Prawda lub Falsz).
PI formula.
Rozdzial2. Program Excel w zarysie 47
r -
Wskazdwki dotycrqce wpmwadzania danych
Zawarte ponitej wskazdwki dotyczqce wprowadzania danych sq szczegdlnle przydatne dla tych
osbb, ktdre rezygnujq z uiywania innego arkusza kalkulacyjnego na rzecz Excela.
JeSli pned wprowadzeniem danych zaznaczysz zakres komdrek. w celu zakollczenia
umleszczania danych w komdrce i pnejkia do nastepnej komdrki wybranego zakresu nalezy
wcisnqE klawisz Enter. Aby przejbf do komdrkl gdmej albo polozonej po prawej lub iewej
stronie, naleiy odpowiednio wcisnqC kombinacje klawiszy ShiRiEnter, Tab i ShiR+Tab.
Aby wprowadzit dane bez wciskania klawiszy stmlek, w zaktadce Edycja okna dlalogowego
Op$e n a l e j zaznaczyC opcje PrrenoJzamaczenie pa necisniwiu klawisza ENTER [aby otworzyd
okno, z menu Narqdda naleiy wybrd pozycje Opcle). Motna rdwniet okreOliC kterunek
pnemieszczania porniqdzy komdrkami.
D Aby do kaidej komdrki zamaczonego zakresu wpcowadzid takie same dane, nalety umieCiC
je w aMywnej komdrce. a nastepnie wclsn# kombinacje klawlszy CtrliEnter.
Aby s k o p i o d zawartoX aktywnej komdrki do wszystkich pozosta+ych k o d r e k zamaczonego
zakresu, naleiy wcisnqd klawisz F2, a nastepnie kombinacje klawlszy Ctrl+Enter.
Aby -if korndkl zakresu kdejnymi zwi&mjqqmi sie wartokiarni opartymi na pojedynczej
liczbie, w trakcie pneciqgania uchwytu wypetnienia znajdujqcego sie w prawym dolnym
narotnlku zaznaczonego zakresu. nalety wcisnqf klawisz Ctrl.
Aby stwoay6 niestandardowq liste automatycznie wypelnianq, nalezy u2yt zaktadki Listy
nlestandsrdowe okna dialogowego Opcje.
Aby s W o d kombrkq bez zwiqkszanla JeJwarto5c1, nalefy pneci$gn@ uchwyt wypetnienia
ma)dujqcy sic w n a r o ~ l k uzaznaczonego obszaru. Aby skopiowat dane do dolnych
lub do prawych kom6rek, naleiy odpowlednlo wclsnq6 kombinacje klawiszy CtrliD lub M + R .
Aby upmSciC czytanle tekstu, motna umie$cld w komdrce maki tabulacjl lub powrotu karetki.
Aby wstawid znak tabulacji, neleiy wcisnqd kombinacje klawiszy Ctrl+AEt+Tab. Aby wstawiC
mak powrotu karetki, nalety wcisnqd kombinacjq klawiszy Alt+Enter. Znaki powrotu karetki
powodujq zawijanle zawartoki kom6rkl w jej obszane.
B Aby wstawlC utamek, nalej wpisd zero, za nim mak spacji, a nastqpnie utamek (przy utyciu
maku /). Excel fomtuje kombrke przy u j c i u forrnatu llczbowego Ulamkowe.
B Aby automatycznie sfonatowd k o m przy utyciu forrnatu Walvtowe, za wattohiq naleiy
wprowaddf symbol waluty (np. symbol zfw przypadku Polski). Aby wprowaddd wattoff
zapisanq w formacie Procentowe, nalety za niq wpisaC znak procentu. W celu oddzielenia
od sieble cwlci tysiqcmych (np. w Stanach Zjednoczonych prrecinki sq stosowane w liczbie
- 4, 123.434) motna t e i umglgdniC symbole separator&.
Aby wstawlt aktualnq date, naleiy wcisnqt komblnacjd klawiszy Ctrli; (brednik). Z kolei
aby wstawiC do komdrki aktualny czas, naleiy wcisnqf kombinacjq klawiszy Ctr/+Shiff+:.
W celu zdefinimnia kom6rki lub lch zakresu, tak aby akceptowaly dane tylko okreslonego
typu (lub wartoSci zawierajqce siq w ustalonym pnedziale) naleiy z menu Dane WraC
pozyck Sprawdzanle poprawmSd,
Fomldy zawsze mzpoczynajq sip makiern r6wno8ci (-). Jednak Excel potrafi sip dosto-
aplikacji 1-2-3 i akceptuje symbol @,
sowaf do nawykbw ~ o w n i I c 6 w mak plusa (&)
lub minusa (-)jako pienvszy mak formuly. Propm po wcihiqciu klawisza Enter au-
tornatycmie dostosowuje wprowadzone dane.
48 CzpSC I + Podstowowe inforrnacje
Poczqwsy od wenji Excel 2002, fmkcje inspekcji zostaly w maczr\ey sposbb rozbu-
dowane. Mo-a na pnykiad utyC tych funkcji do skanowania arkusza i identyfikacji .
fomul, kt6rc mogqzawierak Mpdy. Na rysunku 2.4 Excel zidentyfikowd formule, ktbra
I
wygenerowaki blqd. Kilka opcji zwiqzanych z t.q sytuacjq wyfwietlil inteligentny tag. I
Rysunek 2.4.
Ercel pobBfi
monitorowaC formu&
pod kqtem
wystqpienia
prawdopodobnych
w w
Rysunek 2.5.
Najlepsq metodq
wstawiania
funk@ w formule
jest .?astosowanie
okna dialogowego
Wstawianie funkcjl
Zaznaczanie obiekt6w
Z . o b ijest zgodne te starcdardawymi mnodami systcmu Windows. K l i h i p
cie kom6rkj przyhzymanie lewsgo kiawki rnpzy, a n-ie praeciqgnivie w dowol-
nym kienmku pozwala m a c z y C Acres komdrek. Klikniwie obiektu umieszczanego
50 Cz#t I + Podstawowe inforrnacje
w warstwie rysunkowej powoduje jego zamaczenie. Aby zaznaczyt wiele obiektdw lub
nieprzylegajqcych komdrek, nalcty wcisnqt przycisk Ctrl, a nastepnie po kolei klikat
obiekty lub kornbrki. Aby zamaczyt duZy zakres, nalew kliknqk kornbrke majdujqcq
siq w jego dowolnym narotniku, wcisnqf przycisk Sh$ i kliknqc komorkp umieszczona
w przeciwleglym narotniku zakresu.
JeSli do obicktu pnypisano makm, klikniccie obiektu spowoduje wykonanie makra. Aby
wrnaczyc taki obiekt, nalety kliknrl(:go prawym przyciskiem rnyszy i w celu ukrycia
menu podrccznego wcisn* klawisz Esc.
-*,"
tm~. W wersjach Excela starszych ad wersjl 97 kliknisie osadzonego wykresu pwodowab
jego zaznaczenie. Poczqwszy od Excels 97, kliknivie wykresu powoduje zaznaczenie
obiektu w nlm zawartego. Aby zaznaczyC sam obiekt wykreru, przed kliknieclem
nalety wcisn* przycisk Ctrl.
Formatowanie
Excel ofenrje dwa typy formatowania - liczbowe i stylu.
Forrnatowanie liczbowe
Formufowanie liabowe dotyczy spowbu rrpramtacji warmki kbowej w kmdrce. Mo-
tna albo wybraC format z dhrgij listy predefiniowanych w, a h utrvorzyt wla~ny
(rysunek 2.6). Odpowiednia procedura zostah dokladnie omdwiona w systemie pomocy.
Rysunek 2.6.
Opcje fonnatowanla
liczbowego
s$ w Excelu
bard20 elastyczne
Formatowane stylu
Formatowanie stylu odnosi siq do forrnatowania stodomvlego w celu lepsago zapre-
zentowania wynikdw pracy. Wicle przycisk6w pask6w mzgdzi ofenlje bzpdredni
dostcp do czqsto W a n y c h opcji formatowanie, niezaletnie od tego, ay p m a n a n e
Rozdziat 2. + Program Excel w zarysie 5:
sq kombrki. obiekty gnficzne czy wykresy. Na przyklad w celu zmiany koloru tia ko-
mdrki. koloru wypelnienia narysowanego pola tekstowego lub koloru paska wykresu
motna u2yC pizycisku Kolur wypelnienio na pasku narzqdzi. Aby uzyskaC dostqp do
wszystkich opcji formatujqcych, nalety otworryC okno dialogowe Fornratowanie kattrdrek.
Rysunek 2.7.
Autoksztalty
w arkuszu
Wykresy
Excel ofetuje prrynvoite rnotliwoSci twonenia wykres6w, ale zdecydowanie wynika to
z dohego dopracowania tej funkcji. Jak ju2 d n i e j wspomniakm, wykresy mogq by6
albo pnechowywane w arkuszu wykresbw, albo swobodnie umiesnzane w nvyklym
arkuszu.
Najprostsza met& tworzenia wykesu polega na zaznaczcniu danych, k t h W a n %na
nim pokazane, a nastqpnie utyciu Kreutora w y k r e s h . W tym celu motna kIiknaC od-
powiedni pnycisk paska nanqdzi Standmdowy. Kreator wybesdw utwony wykres
speiniajqcy twoje oczekiwania, wykonujqc tp operacjp krok po kroku (rysunek 2.8).
M&a tct u w m y d ~ e s p r z ~ t u pokpmy
w ~ z tabdq pestam.Pny utyciu takich
sarnych metod, j& w prypadku tabdi przestamrej na wykesie przestawnyrn w postaci
gtaficznej motna jmzentowad rdtne zestawimia danych.
Excel umo2liwia dostosawanie wvluesu do wknvch w a e b . Jdli wkres iest swobodn~m
obiektcrn, w celu jega zaznaczeia wystarczy g i k l i k $ (aby wyGetlic! bkno dialogbwe
zawierajqce opcje formatowania wykresu, nalety kliknqt dwukrotnie). Klikni~ieprawym
pnyciskiem myszki elementu wykresu spowoduje wydwietlmie menu p o h c m e g o .
Makra i prograrnowanie
Excel oferuje dwa jqzyki programawania makr - XLM i VBA. Oryginafnie stosowany
jqzyk programowania makr XLM jest ju2 p m i zostd nts-jony przez jezyk
VBA. Excel 2003 nadal wykonuje wiqkszog makr XLM, z ktrkych rnoha'nadal korry-
stat, ale nie jest jut mottiwe ich rejemowanje. Aby stwony6 nowe makra, koniecme
jest utycic jpzyka VBA.
Rozdzial2. + Program Excel w zarysie 53
Ryrunek 2.8.
W celu
utworzenia wykresu
nale2y uW
Kreatora wykresdw
Rysunek 2.9.
Funkcja Autofiltr
pomala
pneglqdae
rekordy
b a q danych
spelniajqce
kryrena
Rysunek 2.10.
Nowa funkcja
acela 2003
zwiqzana
z twoneniem
listy ufatwia
Identytika&
arkuszowej
bazy danych
Rozdziat 2. + Program Excel w zarysie 55
Rysunsk 21 1 .
T m e n i e kwerendy
skn' Web k n p
o m w
j
dane do arkusza
Funkcje internetowe
Ercel oferuje kika fhkcji inamaowych lstnieje na przyklad mdliwoSC zapisania arkusz?
lub caiego skoroqtu jako pliku HTML obstugiwanego pnez przeglqdarke interneto-.
Ponadto bezpogrednio w kornbrkach rnotna wstawiae hipertqcza (a takte adresy poczty
elektronicmej).
Pliki Excela mogq bye zapisywane jako pliki ETML z dodanq interakcjq. Funkcja ta opie-
rajqca sic na komponentach OWC (ang. QTce Web Component)umotliwia umieszczanie
na serwclzc WWW mtediymych skomzyt6w i udostgpnianie ich innym utytkownikam
(posiadajqcyrn licencje na komponenty OWC).
Aby uzyskd wisej informacji na ternat zapisywania plikdw w fomacie HTML, naleiy
B(=&d 0 &Z~&U 4.
56 Cz@C I + Podstawowe informacje
-
,c:*
- ,
j$
wania tych danych na okreJlone kombrki.
Funkcja ta jest dostepna tylko w wersji Professional Edition programu Excel 2003.
Narzedzia analizy
Pod wzgltdem rnotliwoSci analiy Excel z pewnohiqma sip czym pochwalib. W kodcu
wla9nie z tego powodu ukytkownicy k o n y s t a j ~z arkusza kalkulacyjnego. Wipkswg
zadafi analizy moze by6 realizowanych p n y utyciu formul, ale Excel oferuje r6wniez
inne narzpdzia.
Konspekty
Arkusz konspektu shrty do pratwarzania danych hierarchicmych, takich jak budtet.
Excel potrafi automatycmie generowab konspekt (poziomy, pionowy lub lqcqcy oba
kierunki), motna tet stworzyb go rqcznie. Po utworzeniu konspektu, w celu wyhvietlania
rirhych poziom6w szczeg6lowofci motna go nvijat i ronvijaC.
Rysunek 2.12
Excel mole
automatymle
wstawiaC fonnuw
obliczajqce
sumy c.~+Jclowe
1
konspeMy WlE -13 #co 5769
I))O 1Bfi 174l 1191
1?% 1- I224 4x3 1706 I l?Xl
1 ~ 9 ~ rm IIIO YII 16l7 1512 1m6
4722 1%~ in7 1x7,
Ta bele przedawne
Jednym z najwydajniejs~ychi naj-iejszych &Exctla q tabele prrcstawvnc.
slu2qce do zcstawiania danych. Tabelp przcstawnq motoa pmtvmmd za pomoq j ~ k a
VBA lub modytikowaC przy u2yciu myszki. Dane pmchowywane w tabeli przcstawnej
pochodq z arkuszowj lub zewnpmej bazy danych i q urnieszczane w specjalnej pa-
rniqci e m c j urnotliwiaj&ej wykonywanie oblicteh natychmiast po modyfikbwaniu
za&ci tabeli pmstawnej. Na rysunku 2.13 pokazano tabelp prnstawna
TaDeIB
przes tawna
Excels ma dele
zastosowafi
58 CzefC I Podstowowe informocje
>-<- 4
Aby uzyskaC informacje na ternat rnanipulowanie tabelami przestawnymi przy uwiu
j~zykaVBA, nalety zajrzeC do rozdzlatu 17.
Dodatek Solver
Do rozwiqzywania specjalizowanych rbwnati liniowych i nieliniowych stuty dodatek
Solver Excela, ktbry w oparciu o kombrki zmieniane, komorki ograniczei i opcjonalnie
kombrki, ktbrych wartoid musi by6 jak najwiqhza lub jak najmniejsza, rozpatruje sce-
nariusze wamnkowe.
Dodatki
Dodatek jest programem do%czanym do aplikacji w celu poszerzenia zakresu jej funk-
cjonalnolci. Aby doiqczye dodatek Excela, z menu Narz&ia nalety wybrac pozycje
- do ~akietuExcel 2003, moma m .a t dodatkbw
Dodatki. Ovr6cz dodatkbw ddaczonvch
pobranych ze strony intemetowej Microsoftu. Dodatki opracowane p m z inne firmy moina
kuoiC lub vobraC za ~oirednictwcmich senvisbw internetowch. Poza tvm stworzenie
wbsnego dodatku jest bar& proste (wiccej na ten temat w rozdziale 21).
ZgodnojC wersji
Pocqwszy od Excela 97, kolejne cztery wersje aplikacji poshgujq sic takim samym
formatem pliku, dziqki czemu w ich przypadko zgodnolC plikdw nie stanowi pmblernu.
Jednak gdy tale@ ci na tym, aby plik by# zgodny z jesrcze wczeOniejszymi wersjarni
Excela, istnieje motliwolC zapisania skoronytu p n y utyciu slarszego formatu.
S A Aby uzyskl wive] informacji na tmrat zgodnoSci wenji, nalety zajrzd do rozdziatu 26.
Opcje ochrony
Excel ofemje kilka dtnych opcji ochrony. Moma na przyktad chronit s t d m r q skoro-
szytu i formuly pned nadpisaniem lub zmodyfikowaniem, a t a k e zabezpiecza6 haskm
kod j e y k a VBA i skoroszyt.
Rozdzial2. + Program Excel w zcrysie 59
Rysunek 2.14.
Okno dialogawe
Chronienie arkusza
\SF**
W arkuszu chronlonym wszystkie korndrki sq dornySlnie zablakowane.
Pocqwszy od Excela 2002, opcje ochmny aplikacji sta4y sip macznie elastyczniejsze.
Okno dialogowe Chronienie arkma pomala okreilit, jakie elementy nie b@q podlegaly
ochronie. Motna wipc zemolit utytkownikom na sortowanie danych w chronionyrn
arkuszu lub na utywanie funkcji Aulofilh. (we wczcSniejszych wersjach wykonanie.ra-
kich zadait nie bylo matliwe). M o h a tet ukryt formuty, dziyki czemu uaktywnienie
komdrki nie powoduje uwidocmienia formuly na pasku formul Excela. W tym celu naleiy
zamaczyt kom6ki formul i upewni6 sip, czy w zakkidce Ochrona okna dialo,oowego
Formarownnie komdrek zamaczono opcjp U k y j .
Rysunek 2.15.
Okno dlalogowe
Chronienie skoroszytu
Upewnij sig, czy jest wlqczona opcja Struktura. JeSli zostanie uaktywniona opcja Okna,
nie bqdzie motliwa zmiand wielkoici okna Iub jego lokalizacji.
Rysunek 2.16.
Okno dialogowe
Opcje zapisywania
um2Ihvia
zabezpieczenie
haskm
pliku skoroszytu
Po wprawadzmiu hash kliknij OK. Aby o M l i t typ sq&owania, ktbre zostanie zasto-
sowane, nalety k l i k n ~pnycisk
t Zoowansowane.
e s klkpd
W oknie dialogowym P r o j e ~ t ' P ~nalety Protection {rysunek 2.17).
~aznaczytopcjq Lock projecrfor viewing, dwukrohie wpromdzit haslo. kliknqd OX
i zapisac plik. Po zamknipciu pliku i jego ponownym otwarciu, przed q s k a n i e m mot-
liwoici przeglqdnipcia kodu lub jego modyfikacji konieczne h d z i e podanie hash.
Excel tak naprawde nie jest bezplecmq apl1kq.q. Owszern, funkcje ochrony blokujq
prpadkowym u2ytkDrnlkom dostep do r6bych kornponent6w sk~roszytu.ale k.fdy.
kornu naprawde zalety na zlarnaniu zabezpieczefi. dokona ego, siqgajqc po tatwo
dostepne n a t z w a sMqce do tarnania hasel lub poznajp kilka "tajemnlc" Excela.
Rozdziat 2. + Program hcel w zorysie 61
Rysunek 2.1 7.
Okno dialogowe
Project Properties
umoMwia wtqczenie
ochrony projektu
j w k a V8A
Xysunek 2.18.
Panel zadatf
Wyswiem ternsty
pomocy, natorniast
ich zawattoe
jest pokazywana
w oddzielnym olmle
sz?lx
(-1u'J
Wwletlanle ternatdw wmocy w utyciu panelu zadari to nowoe acela 2003.
~&ertoff tematu pomocyjest pkazybana w oddzlelnym oknie. OczywiScie omacza
to, te obecnle system pornocy wymaga "*la dw6ch okien. Wedhrg mnie osoba.
62 Cz$SC: I + Podstowowe informacje
JeSli kornputer jest podlqczony do Internetu, smkane sbwa kluczowe zostanq uzupehione
aktualnymi tematami pomocy zamieszczonymi na stronie intemetowej Microsofiu. Aby
ograniczyc zakres wyszukiwania tylko do lokalnego systemu. nalety w polu Wy.~zztkq'
w dolnej czqsci panelu zadan wybrat pozycje Pomoc w tvbie Offline.
Wybrane zasady
stosowania formul
Prawie katda poprawna aplikacja oparta na arkuszu kalkulacyjnym korzysta z formul. Tak
naprawdp tworzenie formul mote byC traktowane jako odrniana .programowania.
- W ryrn
roldziale dokonam przeg1a.d~funkcji Excela powiqzanych z formujami i omdwie kiika
metod, Mbrych motesz jeszcze nie znaC.
OczywiScie dzieki fonnutorn arkusz kalkulacyjny jest tym, c y m jest. Bez forrnul by.tby
tylko statycmym dokurnmtem, kt6ry rdwnie dobtze m o m by uysM przy utyciu edyora
tekstu obshgujcpxgo tabele. Excel posiada bogaty zestaw wbudowanych funkcji i oferuje
wyjqtkowq obslugq nazw umieszczanych w formulach, a nawet formuly tablicowe (spe-
cjalny typ formuly wykonujqcy obliczenia, ktbre w przeciwnym razie bylyby niemotliwe).
Ryrunek 3.1.
Pwad
zastosowania
w formule odwolafi.
Mdre nie 54 wzgledne
Notacja W1 K1
Standardowo Excel posluguje sip n u t u q q ~ /w, pnypaclku kt6rej adrcs katdej kom6rki
sktada sic z litery kolumny i numeru w i e m , Jednak Excel obshguje te2 notacjg
W1Kl. W t - m przypadku kombrka A1 jest identyfikowana jako kombrka W I K I , kom6rka
A 2 jako W2K1 itd.
JeSli nazwa skoroszytu w odwohniu zawiera jednq lub kilka spacji, konieczne jesr umiesz-
czenie jej wraz z nazwqarkusza w pojedynczych znakach cudzyslowu. Oto przyklad:
-' CBudtet na rok 2003. xl slArkusz1' ! A l + l
JeSli skorosyt jest zamkniety, trzeba w odwdaniu wpisat jego pefnq Scietkp. Oto prqklad:
-'C:\MSOffice\Excel\[Budtet na rok 2003.~1s1Arkuszi' !Al+l
Co prawda odwdania formul lqczy mogq bye wprowadzane bezpoirednio, ale moina
teo definiowak je p n y utyciu standardowych metod wskazywania. Aby to bylo rnotliwe.
konieczne jest otwarcie pliku Mdlowego. Po jego otwarciu Excel utworzy bezwzgledne
odwohnia do kom6rek. Aby skopiowac f o r m u l ~do innych komorek, nalety zamienit je
na odwdania wqlpdne.
Przy korzystaniu z lqczy nalety zachowat osao2noit. JeSli na pnyklad w celu wykona-
nia kopii zapasowej lowe ego arkusza z menu Pfik wybierzesz pozycjp Zapis-. joko.
autornatycmie zostanq nnodyfikowane formuiy Iqczy, talc aby odwdywaiy sip do no-
wego pliku (zwykle nie na tym ci zalety). Kolejna sytuacja, w ktorej dochodzi do
uszkodzenia l v z y , ma miejsce, gdy jest mieniana nazwa ir6diowego skoroszytu, ale
powi-ny z nim skoroszyt nie wstal wczeiniej otwarty.
Zastosowanie nazw
Jednq z najpnydatniejszych funkcji Excela jest motliwoSk nadawania charakterystycz-
nych nazw r6tnym elementom (kom6rkom. zakresorn, kolumnom, wykresom i innyrn
obiektom). U n i k a t o q zaleq Excela jest motliwoSC nadawania nazw wartosciom lub
formulorn, ktore nawet nie m j d u j q sip w kombrkach arkusza (podpunkt ,,Nadawanie
nazw staiym" w dalszej czqsci rozdziaiu).
poloionej po lewej stronie paska fomuly. Wystarczy wybraf komClrke lub zakres. wpro-
wadzit na liscie nowanazwe pola i wcisng Enter.
Aby w oparciu o tytuly wierszy lub kolumn arkusza automatycmie twonyt nazwy kombrek
lub zakresbw. z menu IVstmv nalety wybrat pozycjq Nu--a, a nast~pnieUtwdrz. Na ry-
sunku 3.2 zakresowi C3: F3 nadano nazwp Pdlnoc, zakresowi Cc: F4 nazwe Polzrdnie itd.
W pionie zakresowi C3:C6 nadano n a m e Kwartall, zakresowi D3:D6 nazwq KwnrtoI2 itd.
Rysunek 3.2.
Ercel upraszcza . .. . .
twonenie nazw d -*b;~ . a r ~:rragg-hcm_~S:*S.;i,-~-A-
bedqcych opisowyml
laricuchami
:_I
-.
u
A
-
-. B
~ 8
c I
5
-10
~
0.-; e F I G i-.H d !
Zastosowanie nazw jest s m g 6 l n i e istotne pny pisaniu kodu w jpyku VBA Wywajqcego
odwohli do kombrek lub zakresbw. Jaki iest terra - .pow6d? Po pnemieszczeniu kom6rki
lub m h e s u , do ktbrych odwohno sip w jnstrukcji jpzyka V B odwdania
~ nie sq auto-
matycmie uaktualniane. JeSli na p r q k h d kod jmka VBA q i s z e wartoSC w Range( "C4"I,
dane zostanq urniesznone w d e j kombrce, gdy M o w n i k wstawi nad korn6rkq C4 nowy
wienz lub kolurnnp po jej lewej stronie. Po zastosowaniu o d w o h i a do nazwy kom6rki
(np. Range("InterestRate")) uniknie sip potencjalnych problembw.
Jdli dla komorki A1 zdefiniujcsz nazwp Prvclrdd, natorniast dla kom6rki A2 Kwzty,
Excel nie dokona automatycmej zmiany formuty do postaci -Przychbd-Koszty. Jednak
zaskpicnie odwdan do kombrek lub zakres6w powiqzanymi z nirni namami jest doSC
prosqm zadaniem. Najpierw nalcty zamaczyt zakres, ktory zostanie modyfikowany.
Rozdziol3. + Wybrane zosady stosowania formut 69
Ukryte nazwy
Niektdre makra Excela i dodatki twonq ukryte nazwy. ZnaJduJqsiq one w skoroszycie, ale nie sq
widocme w oknie dialogowym Definiowanie nazw. Przyktadowo dodatek Solver tworzy kilka ukrytych
nazw. Zanvyczaj puwinny by6 one ignorowane. Jednak czasami ukryte n a y sq pnyczynq pre
blemu. JeSll skopiujesz arkusz do innego skoroszytu, w trakcie operacji zostanq tet uwzglednione
ukryte nazwy, ktdre mogq stworzyt lqcze bardzo trudne do wyklycia.
Aby usunqC ze skoroszytu wszystkle ukryte namy, rnoina pashr# siq poniiszym kodemJezyka VBA:
Sub DeleteYiddenNames( )
Dim n As Name
Dim Count As Integer
For Each n I n ActiveWorkbook.Nams
I f hbt n.Visible Then
-
n.Delete
Count Count + 1
End I f
Next n
MsgBox Count & " ukrytych nazw zostalo usunietych."
End Sub
Niestety nie istnieje metoda automatycmego wycofywania nazw. lnnymi sbwy, jeili
formula U r n nezwy, nie moha zarnienit jej na pawiqzane z niq odwohnle do komdrki
lub zakresu. Co gonza, jeSll zostanie usunigta nazwa zastosowana w formule, Excel
nie p w r 6 c i adresu komdrki lub zakresu puwiqzanego z nazwq. Zarniast tego zwrdcl
p0 postu blfl INAZ'dA?
- uzyska sip wynik 440 majduj4cy sic na sknytowaniu -6w Kwarfal2 i Poludnie.
Aby uzyskak sum? dla obszaru Zuchdd. nalety uzyC formu@:
-SUMA( Zach6d)
70 Czest I Podstowowe inforrnacje
Po nadaniu nazw kolumnom i wienzom nalety pamiqtat, aby nie umieszczac w nich
tadnych zewnttmych informacji. Nalety mieC SwiadomoSt, Ze na przykfad po wsta-
wieniu wartoici w kombrce C7 zostanie ona uwzglpdniona przez zakres Kwartall.
I
Nadawanie nazw statym
Prawie katdy dolwiadczony utytkownik Excela wie, w jaki s p o d b utwonyC nazwy dla
komdrek tub zakredw (chociat nie wszyscy korzystajq z tej motliwobci). Jednak wigk-
szosd uQtkownik6w Excela nie wie, t e za pomoca nazw m o h a odwdywad sie do
wartolci, kt6re nie wystppujq w arkuszu. Mam tu na mysli stale.
Rysunek 3.3.
Excel umoiliwja
nadawanie n a m
stafym.
ktdie nie znajdw.4 sip
w komdrkach arkusza
Po wykonaniu tej operacji w formu+ach motna u w a c nazwy, tak jakby powiqzana z niq
wartoif byta przechowywana w komorce. JeSli wartog stopy procenrowej ulegnie zrnianie.
wystarczy zmodyfikowaf definicjc nazwy STOPA, po czym Excel uaktualni wszystkie
kombrki jq zawierajqce.
Rysunek 3.4.
~MoinanadaC
name formule,
ktdra nie wystepuje
w iadnej komdrce
~lrkusza
Gdy po nadaniu formule nanvy otworzysz okno dialogowe Definiowanie nnnv. w polu
Odwoluje sic do zostanie wyfwietlona formuta wzglqdna w stosunku do aktywnej ko-
morki. Jefli na pnyktad komorkq aktywnq jest kom6rka 032, w polu O h v o h ~ esic do
pojawi sip nastppujqca formuta:
=Arkuszl! 83ZAArkuszl!C32
Bledy formul
C z p t o po wprowadzeniu formuty uzyskuje sip Mqd. Formu5 mogq zwrbcif wartote
blpdu, gdy komdrka, d o ktbrej sip o d w o h j g zawiera nieprawidlowq wanof€. Okresla
sic to mianem efekrufalowego, ktdry polega na tym. te pojedyncza wanoff Mpdu za-
warm w korn6rce mote spowodowaf wystwienie Mqdbw w i ~ y c hkomdrkach p n e -
chowujrlcych formuly odwotujqce siq do tej kombrki. Pasek nanqdzi lnspekcjo formul
zawiera narz$dzia pomocne p n y identyfikacji irddla blqddw. W tabeli 3.2 zamieszczono
typy wartoSci bl$d6w, ktdre rnogq pojawiC sip w komdrce zawierajqcej formu+?.
$DZIEL/O! Formula spr6bowata wykonat dzielenie przez zero (na n a m j planecic jest to operacjn
niedonvolona). Blqd taki wystwi te& gdy formula spr6buje dokonab dzielenia p r z a
pustq kombrkp.
#N/O! Fonnula odwdda sip ( p o k l n i o lub bezpohdnio) do kom6rki u+vaj~ej funkcji
arkuszowej B M K stwierdzaj4cej nicdostqpno% danych. B I d #ID! jest tet nvlncany u r n
funkcjp WYSZUW. kt6ra nie mote zlokaliwwaC wmo9ci.
#NnZWA? Formuh utyws narwy, ktbnj Excel nie rozpoznaje. Taka sytuacja mote mieC miejscc,
gdy usuniesz n m p uzywanqw fonule lub gdy w teldcie brakuje jtdnego ze makbw
cudzystowu. Formuh m o k wygenerod ten blqd tak2e w6wczas, gdy korzysta z funkcji
dodatku, kt6ry nie wstal zainstalowany.
#ZERO! Formda korzysta z przecir;cia dw6ch zakredw, kt6re faktycmie siq nie przccinajq.
Zagadnienie ombwiono wczeiniej w niniejszym rozdziale.
#LICZSA! Wystwit problem zwivany z argumentem funkcji. Przykladowo funkcja PIERUIASTEK
urbbuie obliczyt pienviastek kwadratoww dla liaby ujemnei. Taki bid wystlpi tez
idy obliczonawarrofd jest rbyt duta lubzby mat; ~ x c c nie
l obslugu~ew-art&ci rotnych
od zera mniejszych od LE-307lub wi~kszychod 1E+308.
#ADAOR! Formula odwoluje sir; do nieprawidlowej kombtki. Taka sytuacja mo& mi& rnicjsce,
gdy komdrka zostmic usunipta z ark-
#A% ! Formula utywa nie.vl&iwcgo typu argumentu. Argument jest wartdciq lub odwolaniem
do kodrki uiywanym pnez fomutp pmy o b l i m i u wyniku. TJki bt# mozt wysqpic, gdy
formula utyjc niestandardowej funkcji arkusn nqisanej w j w h VBA k r b n w i m b i d .
74 Czeit I + Podstawowe informacje
Forrnuly ta blicowe
Tubiica jest prostym zbiorem komdrek lub wartolci przetwarzanych grupowo. Formz~trr
rablico\va jest specjalnego typu formulp obslugujqcq tablice. Formula tablicowa mote
wygenerowad pojedyncy wartoSC lub wiele wynikow, z ktdrych katdy jest wyiwietlany
w oddzielnej komdrce, co wynika srqd, t e Excel mote w kom6rce wstawic tylko jednq
wanoSC.
i*:- Aby wprwadziC form* tablicokq, nalety WisnqC komblnacje klawlszy M+Sh/ft+Enter.
Aby przypornnieC u&tkownikowl, t e okreSlona forrnuta jest fomutq tablicowq. Excel
urnieszcza jq w pasku formufy w nawiasach klarnrowych ({I). Nie wprowadzaj sarnernu
takich nawias6w!
Na rysunku 3.5 pokazano arkusz, w kt6rym w zakresie A1 :A5 wprowadzono tekst Celern I
Cwiczenia jest stworzenie pojedynczej formuly nvracajqcej po zsumowaniu calkowitq
liczbp znakbw zawartych w zakresie. JeSli nie byloby wyrnagane stworzenie jednej
!
formuly, wynik motna by uzyskaC po zdefiniowaniu fomuly utywajpcej funkcji DL,
przekopiowaniu jej do kolejnych kom6rek kolumny, a nastepnie zastosowaniu funkcji
SUHA w celu zrumowania wynikbw zwr6conych przez poirednie fonnuv.
Aby zadernonsmwaC, w jaki spos6b formula tablicowa mo2e zajrnowat wiecej ni2 jednq
komdrkq, stworrykm arkusz pokazany na rysunku 3.5, po c y m wykonajern nastqpujqce
kroki:
2. Wprowadzikm formule:
Rysunek 3.5.
Komdrka 61 zawiera
formu& tablicowa
obliczajaca
cajkowita liczbq znakdw
z zakresu A1:A5
A teraz najwatniejsza uwaga. WlaSciwie nie jest konieczne wySwietlenie tych pieciu
. elementdw tablicy, poniewat Excel mote pnechowywai tablic~w pamieci. Wiedqc o em,
do dowoinej pustej kombrki mo2na wprowadzit ponibzq fomulq:
Rysunek 3.6.
Jedna
formula tablicowa
viystarczy
do shuorzenia
kalendarza
dla dowolnego
miesiaca
dowolnego roku
Aby okreSliC liczbe korn6rek zawierajqcych wartoSC Medu, nalety utyC ponitszej formuly
tablicowej:
-SUMA(JEtELi(CZY .Bt(dzne! i l . 0 ) )
Rysunek 3.7.
Ta pmsta b a a d a w h
demonstmje
kilka przydatnych
diczajqcych
i sumujqcych
formut tablicowych
~ ~ W tym mzdzlale
& " u&to forrnatu daty stosowanego w Polsce. Jelli twdj system utywa
;IV=- innego forrnatu daty, konleczne bazie dokonanie odpowiednich rnodyfkacji.
Na pnyktad mote byt konieczne wprowadzenie daty w fonnacie: 2004-36-0:
jqcych dwie daty mo2na zastosowac formuiq. Jejli zar6wno w kornorce A l i komorce A2
znajduje sic data. poni2sza formula m6ci liczk dni stanowiqcych rotnlcp:
-a2-A1
e0 CzgSC I + Podstawowe informacje
:,s::z\ W przypadku dodawania czas6w nie jest motliwe wySwietlenie wiwej n i i 24 godzin.
!.sa+. Dla kaidego 24-godzinnego okresu Excel po prostu do surnarycznej wartoSci dodaje
kolejny dziefi. Rozwiqzanie tego problemu poiega na wybraniu takiego forrnatu liczb.
kt6ry umieszcza czqSt godzinowq w nawlasach kwadratowych. Na przyklad poniiszy
format liczbowy wyswietla wiecej n i i 24 godzlny:
Taki tekst nie spowoduje negatywnej reakcji Excela, jednak nie jest rnotliwe jego mody-
fikowanie - nie motna nnienik formatowania daty, okreflit, ktdremu dniowi tygodnia
wymacqC daty wystepujwej siedem dni pbtniej.
odpowiada, a takttakte
Na do)wzonym dysku CDROM majduje sie stworzony przez mnie dodatek o nazwie
@@ m e n d e d Date Functions. Ofewje on osiern nowych funkcji arkusza umoillwiajqcych
prretwarzanie dowolnej daty z przedzlalu lat od 0100 do 9999. Na rysunku 3.8
pokazano arkusz uiywajqcy tych funkcjl do okreSlenla liczby dnl pomiedzy r6inymi
datarni sprzed roku 1900.
Rysunek 3.8.
Dodatek m e n d e d
Date Functions
umoZliwia
przetwaffanfe dat
spffed roku 1900
Rozdzial3. + Wybrone zosody stosowonio formvt 81
Tworzenie megaformut
W celu wygenerowania wyniku arkusze kalkulacyjne czgto wymagajq zastosowanin
formut potednich. lnnymi slowy, formula mote byC zaleaa od innych formu+. ktdre
z kolei opierajq sic na jeszcze innych formulach. Gdy jut wszystkie te formuly poprawnie
dzialajg czqsto motna wyeliminowat formuly poirednie i zamiast nich zastosowaC poje-
dyncqmegaformulq. Jakie uzyskuje siq korzysci? Utywana jest mniejsza liczba korndrek
(panuje mniejszy nieporqdek), a ponadto ponowne obliczenia mogq by6 wykonywane
szybciej. Porn iym wtajemniczone osoby bdqpod wrakeniem twoich umiej@loSci. A jakie
sq wady? Niemotliwe mo2e okazaC sip nozumienie lub zmodyfikowanie formuly.
Rysunek 3.9.
Usuniqcie d ~ g i d ,
imion i iniyaMw
wymaga
zastosowanla
szeSciu fonnul
pogrednich
W tym celu nalety utworzyt wszystkie fomuly poirednie, a nastqpnie przejit do for-
muly generujqcej ostateczny wynik i w rniejsce W d e g o odwbtania do kombrki wstawit
!
kopiq formuly znajdujqcej siq w kom6rce, do ktorej shvonono odwolanje (bez maku ;
rbwnojci). Na szczeicie do kopiowania i wklejania rnotna u t y t schowka. Powtarzaj :
'
SF Jedyne ograntczenie w stosowaniu megaforrnut polega na tyrn, te lorrnuty Excela
nis mogq zawleraf wlqcej nit 1024 maki. Rozwiqzanie tego problemu poiega
na stworzeniu w jgzyku VBA nlestandardowej funkcji arkusza, a nastepnle zastqpieniu
megaforrnuly nastqpujqcq prostq formulq:
Urucharnianie Excela
Excel mote byt umchamiany na r62ne sposoby w zalc2noSci od tego, jak zostal zain-
stalowany. Wszystkie metody ostatecmie powodujq taladowanie pliku wykonywalnego
Excela o r m z e n e n i u .ere.
*&* W jednyrn systemie motna uruchornit wiele kopll Excela. W a kopia jest traktowana
<.!/ jak odddelne zadanie. WiekszoX osdb z pawodzeniem urucharnia w jednym systemie
rdine wersje Excela. Aby o s i g g n g jak nallepsze rezultaty, kolejne w e ~ j enaleiy
instalow& zgodnie z ich datq powstanla.
Rozdziat 4. + Pliki Excelo 87
Wybierajqc format, naley brat pod uwagq, czy okreslony typ pliku przetrwa ,.podroz'.
i wr6ci z niej caly. lnnymi slowy. czy po zapisaniu pliku w okreslonym formacie i jego
ponownym otwarciu przy utyciu tej samej aplikacji zostanq utracone jakiekolwiek in-
- -
formacie? Zaodnie z oczekiwaniarni zastosowanie wlasnego formatu pliku Excela
(o rozsierzeniu .xis) daje gwarancjq, ze nie zostanq utracone absolutnie tadne dane. pod
warunkiem t e u2yto najnowszcj wersji formatu XLS.
Odczytywanle pliku zapisanego w forrnacie lnnyrn nii aktualna wersja formatu XLS
nlesie z sob4 ryzyko utraty okreSlonncgo typu lnformacji, zazwyczaj dotyczqcych
formatowania i makr. ale czasern tei formul i wykresdw.
<SF*Konwerter
' pllk6w twononych przez Quattro Pm moma pabrd ze drony lntemetowej
Microsoftu. Na-e to ponvala importowat pllki formatu wygenmwane przez
WB3
Quattro Pro 97. Aby zlokalizowaC konwerter, nalety pneszukaC a w a r t o s strony
internetowe] Microsoftu, poniewat adresy URL czgsto sig zmieniajq.
Excel nie jest w stanie bezpofrcdnio odcytaf lub zapisat tadncgo innego formatu pli-
k6w b a q danych. Jednak aby uzyskaf dostep do innych format6w plikdw b a q danych,
moma ugt narqdzia Micros09 @my, a n w p n i e skopiowaf dane do arkusza Excela
lub s t w o w do nich hcze. Narzedzie Microsoji Query mote zostaf uruchomione bez-
poirednio z Excela poprzez wybranie z menu DandImpormj dane zewn~crsnelNowa
kwerenda bazy danych.
Rozdzial4. + Pliki Excela 89
Gdy sprdbujesz ohNorryC w Excelu plik tekstowy, rnoke pojawit sip Kreator imporfu
tekstu, kt6ry pomote w okrefleniu sposobu wezytania pliku.
Aby pornin# Kreatora impom tekstu, nalety przed kllknigclern OKw oknie
dlalogowyrn OOHieranie nacisn* klawisz Shift.
Kwerendy rnogq tei byC wykanywane w oparciu o pllki tekstowe. W tym celu naleiy
* wybra( z menu Dane./lmportu] dare i!ewnetme/\mportu] dane.
Jaka wersja Excsla woEe)a utjta do utwwrsnla tego pliku fomatu XLS?
Niestety nie istnieje bezpodrednla metoda pozwalajqca stwlerddb, prry uiyciu ktdrej wersji Excela
unvorrono okreSlony plik formatu XLS. JeSli korzystasz ze stars4 wersji Excela i pr6bujesz
otworzyb pllk formatu XLS stworzony przy uiyclu nowszej wersji, prawdopodobnie zobaczysz ko-
munikat btpdu lub ekran peten nic niemaczqcych znakew. JeSli jednak uda ci siq otwo@ plik,
w celu okreSienla wersji Excela motesz pasluiyC sie prostq instrukcjq jqzyka VBA.
Otw6rz skoroszyt I upewnij siq, czy zostat uaktywnlony. Wcienij kombinacje klawlszy Alt+F11, aby
wIqcrp2 edytor Visual Basic, a nasepnie w celu uaktywnienia okna Immediate wcisnij kombinacje
klawiszy Ctrl+G. Wprowadf poniiszq instNkcje i wcisnij Enter.
Prl n t Act1 veUorkbook. F i leformat
W oknie Immediate pojawl slg wart& identyIikujtp wersh pliku a m e g o skoroszytu. WartoSclq
jest jedna z pokazanych w ponltszej tabeli.
Pliki szablonow
Dowolny skoroszyt mote zostaC zapisany jako plik szablonu (rozszerzenie xlr). Sza'clon
jest przydatny w przypadku czpstego hvorzenia podobnych plikdw. Aby na przyklad co
miesiqc generowat podobne raporty sprzedaty i przy okazji zaoszcz~dzicczas. naicz}
utworzyt, szablon przechowujqcy fonuly i wykresy wymagane do mygenerowanla ra-
portu. Po stworzeniu plikdw w oparciu o nowy szablon wystarczy jedynie wprouadz~c
odpowiednie wartoici.
Aby stworzyc nowy skoroszyt oparry na istniejqcyrn szablonie. naleiy z menu P!ik ivy-
brat poycjg Nowy, a nastepnie szablon w oknie dialogowym Szublory. W Excelu 7002
lub 2003 trzeba wykonad dodatkowq czynnoSC. Po wybraniu powyiszej pozycji zostanie
otwarty pasek narzpdzi Nowy skoros-yt, za pomocq ktorego motna okreSliC lokalizacje
szablonu, w tym takte rnotliwych do pobrania ze strony intemetowej Microsofiu. Klik-
niecie pozycji Nu moim komputene wywola okno dialogowe Szablony umotliwiajace
wybranie pliku szablonu.
Klikniwie prrycisku Nowy paska naredzi lub wciSnigcie komblnacji klawiszy Ctrl+.W
nle umoiliwia wybrania szablonu, a jedynie otwonenie domyllnego skoroszytu.
JeSli stworzysz szablon o nazwie Skorm~t.xIt,w oparciu o niego bqdq generowane nowe
skoroszyty. Ponadto motna stwonyt szablon o nazwie Arkusr.xlt, ktory b&ie ut)lwany
przy dodawaniu do skoroszytu nowycb arkuszy. Nie jest mozliwe utworzenie szablonu
arkusza wykresbw, poniew& Excel w inny sposdb obsluguje szablony wykresow.
System pomocy Excela 2003 zawiera list? rotnych n a m i lokalizacji plikow XL3 570-
sowanych w kolcjnych wenjach Excela. Aby uzyskac te informacje, nalezy w polu sy-
szukiwania wprowadzit iaricuch xl b.
92 Czqic I + Podstowowe inforrnacje
4
,e,h JeSli plik formatu XLB zostanie uszkodzony, nie powiedzie sie uruchomienie Excela.
,6m~fl* W taklej sytuacji nalety sprdbowat zmienit nazwe pliku XLB. Excel po stwierdzeniu,
ie nie istnieje pllk XLB, stworzy now. Co prawda, zostanq uiracone wszelkie
modyftkacje dokonane w menu lub paskach narzqdzi, ale prawdopodobnie bedzie to
leosze od braku rnozliwo5ci uruchomienia Excela.
Pliki dodatk6w
Dodarek jest plikiem skoroszytu r6tniqcym sie nastepujqcyrni watnyrni elementami:
m wlaSciwoSC IsAddin skoroszytu ma wartoif True, co omacza, t e rnotna go
zaladowat przy uQciu polecenia menu Nanea!zia/Dodatki;
I skoroszyt dodatku jest ukryty i nie mote zostat wyBwietiony pnez utytkownika
- w konsekwencji dodatek nigdy nie bedzie aktywnym skoroszytem;
w pnypadku korzystania zjezyka VBA skoroszyt dodatku nie jest c q i c i q zbioru
Workbooks.
Dodatki wzbogacajq Excel o nowe funkcje lub wlaSciwoSci. Motna z nich korzystaf
tak, jakby by4y wbudowane w program. W oparciu o pliki XLS rno2na tworzyC wlasne
dodatki. Dodatki sq preferowanp rnetodq dystrybucji niekt6rych aplikacji przemaczonych
dla Excela. DomySlnie plikom dodatk6w jest nadawane rozszerzenie . x h , ale rnotna
utyf dowolnego innego.
e# Poza dodatkami o rozszerzenlu .xla Excel obstuguje .dodatkl XLL i CUM (pocrqwsry
L!. od wersji Excel 2000). Tego typu dodatkl sq tworzone przy utyclu lnnego
dprogramowania nii Excel. W tej ksiqice om6wiono jedynie dodatki X U .
Dodatki szczegt5kwo om6wiono w rozdzlale 21.
C h d utycie formatu H7UL jako wlasnego formatu plikdw Excela mo2c zdumiewae,
MicrwoR raczej pnesadnie podkreila m o b t tej opcji. W rzeczyuristoSci - z.wyj$-
-
kiem niewielkiej liczby sytuacji taka motliwo3t nie jest zbyt przydama.
Rozdziat 4. + Pliki Excela 73
Rysunek 4.1.
Taki pmsty skoroszyt
bez problemu
rnoina zamienid
na plik formatu HTML
Otw6n plik HTML w oknie przeglqdarlci. OczywiScie plik bqdzie badzo pnypominal
oryginahy skoroszyt. Jednak skoroszyt jest ,,martwym" dokumemem pozbawionym
motliwoici interakcji. Aby zobaczyC kod Wdlowy pliku HTML,z menu Widok pne-
glqdarki Internet hplorer n a l e e wybrat pozycjq Zrddlo. Motesz byC zaskoczony tym,
co zobaczysz Nawet ckspcrci z zakresu jpzyka HTML mogq byf przytloczeni stopniem
dokonoki tak nvanego prosttgo dokumentu sieci Web.
Ponitej wymimilem kilka cech pliku formatu HTML.
Cab skoroszyt Excela ~tzwyczajmote byt reprezentowany p n e z pojedyncy
plik HTML.Innymi sbwy, wszystkie informacje wymagane do slworzenia
dokladnej kopii oryginalnego skoroszytu sq zawarte w pliku HTML.Jednak
nie zawsze tak jest. W toku dalszej lektury dowiesz sip, kiedy zwykb plik HTML
jut nie wystarcza.
8 WiqkszodC dokumentu jest zawarta pokiqdzy macmikami <head>i </head=-.
m Sporq cz& stanowiq defulicje styli. Tego typu infonnacje majdujq sip pornidzy
macmikami cstyle> i </style> osadzmymi wwnqbz macmikdw <head> i </head>.
m Wla4ciwa zawartog m n y Wwietlana w oknie pneglqdarki majduje sip w tabeli
(ograniczonej przez m c m i k i *able> i <Itable>).
8 Fornukt jest prrechowywana pny W c i u niestandardowego argurnentu znacmika
<td> - tag. Przeglqdarki ignorujq ten argument,ale Excel konysta z niego,
gdy otwiera plik ponownie.
Plik WA4L wygmerowany dla prostego skomzytu zajmuje ponad 4000 bajtbw, co jest
d d f d m wartoSci$ biorqc pod uwage prostote wyiwietlanej strony. OczywiScie do-
datkowymi danymi Excel poshrguje sit pny twomniu skoroszytu, otwicrajqc ponownie
piik HTIUL.
94 Czeic I + Podstowowe informocje
Zwiqkszanie zlozonofci
Przykladowy skorosyt z poprzedniego podpunktu jest banalnie prosty. Teraz zwiek-
szyrny nieznacznie jego zlotonoSC i zobaczymy, co sic stanie z plikiem HTIML. Zaznacz
zakres A1 :A3 i w celu utworzenia nowego arkusza wykresu wciinij klawisz FI I. Po po-
nownym zapisaniu pliku otworz go w oknie przeglqdarki. Zauwat. Ze plik przypomina
skoroszyt Excela do tego stopnia, t e na dole okna sq widocme karty arkuszy i strzalki
nawigacji!
WielkoSC pliku NTML zwipkzyki sig ponaddwukroanie. Obecnie wvynosi okoto 10 000
bajtow. Co watniejsze, w katalogu, w kt6rym zapisale3 plik, pojawit sip nowy katalog
zawierajqcy dodatkowe pliki (w przypadku skoroszytu z pnykhdu jest to szeSt plik6w).
Dodatkowe pliki sq niezbedne do wyiwietlenia w przeglqdarce kopii skoroszytu i jego
ponownego utworzenia po kolejnym otwarciu pliku HTML w Excelu.
Plik HTML jest bardziej ztokony od oryginalnego pliku i zawiera trochq bardziej za-
awansowany kod tr6dlowy jezyka skryptowego JavaScript (JavaScript jest obstugiwany
przez wiqkszoX przeglqdarek). W tym momencie uzyskany plik HTML jest poza zasiegiem
przeciqtnego tw6rcy stron internetowych. I nawet nie biorp pod uwagp innych plikbw
urnieszczonych w podkatalogu. Sq to nastqpujqce pliki:
pliki HTML @o jednym dla M e g o arkusza oraz plik wyhvietlajqcy pasek kart),
plik formatu GIF (wykres),
plik formatu CSS (kaskadowy arkusz styl6w przechowuj@cy informacje m i m e
z formatowaniem i wyfwietlaniem),
plik formatu XML.Ombwienie jpzyka XML wykracza poza zakres ksi&i.
(Przeciet mbwitem, ze to sic macznie skomplikowalo!)
Mo2na otworzyC inne skoroszyty Excela i zapisak je jako pliki HTML. Wkr6tce w pod-
katalogu zostanie utwomny kolejny typ pliku. Jest to plik formatu MSO (ang, ~Uicrosoft
W c e ) . Ten binarny plik przechowuje informacje wymagane do ponownego wygenerowa-
nia elementbw specyficmych dla Excela, takich jak maloa, tabele przestawne, formarowanie
warunkowe itp.
Po zapisaniu skoroszytu Excela Jako pllku fonatu HTML pojawia sie mnbstwo
potencjalnych problemdw. JeSli na pnyklad musisz przesla-5 plik w inne miejsce,
konieczne jest uwzglpdnlenle wszystklch towarzyszqcych mu pilkbw. JeSli MBrykolwiek
dodatkowy pliklest uszk.odzony, Excel nie bqdrie w stanie ponownie wygenerowat
skoroszytu. Aby tego uni knqf, moina zapisa-5 skoroszyt jako jednoplikowq stronq
sieci Web majqcq rozszelirenie .mht. Jednak zwiqzany jest z tym kolejny problem
- tego typu pliki obstuguje jedynie przeglqdarka Microsoft Internet Explorer.
-
w przypadku arkusza kalkulacyjnego - prowadzic z dokumentem inrerakcje, a wiqc
wprowadzai dane. edytowac fomuly, modytikowac formatowanie komorek. przegiqdac
dynamicznie mieniajqce siq wykresy, a nawet przeciwac dane w tabelach przestnwnych.
.9--
.-e
'
".il Excel 2003 umoiliwia utworzenie interaktywnego pliku HTML na bazie wleloarkuszcwgc
skoroszytu. W poprzednich wersjach prograrnu interaktywne pliki HTML byty ograniczore
do lednego arkusza.
Aby sic zorientowat, jak to dziata, uaktywnij arkusz zawierajqcy formuly. Z menu Plik
wybierz pozycjq Zapis: jako srronq sieci Web. W oknie dialogowvym Zapisyur~niejrrko
zamacz opcje Zarnaczenie: Arkuss, a nastepnie opcjp Dodaj inrerakcjq. Kliknij prrycisk
Opublikuj. Zostanie otwarte kolejne okno dialogowe Publikowanie jako strony sieci
Web. Zaakceptuj domyflne ustawienia i kliknij przycisk Opublikrrj.
Arkusze kalkuiacyfne zapisywane z uwzglgdnieniem lnterakcji rozpoznaje tylko
przeglqdarka Mlcrosoft Internet Explorer.
Rysunek 4.2.
Pnykjad
hteraktpvnego
skoroszytu E x d a
wySwietlonego
w oknie przegtqdarki
Internet fiplofer
I oru:rro l 5 . i
,s)
$j Niniejszy punkt dotycry tylko utytkownikdw Excela 2003. U2ytkownicy Excela 2000
lub 2002 bgdq mogll o t w o m niektdre pliki XML (z menu Plik naleiy wybraE pozycjq
OM=). Jednak funkcje tu opisane nie zadzlatajq.
PoniZej zmieszczono bardzo prosty plik XML zawierajqcy wiadomoSC pocziy clew
nicznej:
<?ml version-"1.0" encoding-"150-8859-2" ?>
cwi adomo$c>
cdozJan NOWdk</do>
<od>Tmasz Kowal sklclccb
c t m t 7 D a t a spotkaniacttematr
ctresc>Spotkanie odb@zie s i e we wtorek o 8 rano. <{:reso
-=/wia d m s w
Rysunek 4.3.
Program Internet
Explorer wyfwietla
pliki XML wformacie
st~ktLNalt?fl
1. Kliknij przycisk Mapy,YML w dolnej czqSci panelu zadan. Zostanie otwarte okno
dialogowe kfapyXktL.
2. Aby wySwietliC okno dialogowe Wybiari .frddto,YML,kliknij przycisk Dodaj.
3. Wybierzjeden z plik6w XML zawierajqcych dane klienta. Nie ma maczenia,
kt6ry to bcdzie plik. Jego zadaniem bedzie jedynie stwonenie schematu.
4. Kliknij OK, aby zamknqd okno dialogowe Mapy XML. W panelu zadari zostanq
wySwietlone elementy danych zawarte w pliku (rysunek 4.5).
korzysta z danych
zairnportowanych
z pliku XML
Rysunek 4.5.
Panel zadarf
zawierajacy
elementy danych
Na ko~icumo2na zaimportowaf plik XML. W tym celu z menu Done nalej wybrac po-
z y j e M L , a nastppnie Importuj, i zaznaczyd plik X.WL zawierajqcy dane klientn. Dane
zostanq umieszczone w odpowiednich komorkach. Aby przeliczyt kolejny harmono-gam
splay poiyczki. wystarczy zaimportowac kolejny plik,Y~UL.
Aby otwonyt plik XML zawierajqcy elementy powtarzajqce siq, nalety z menu PIik
Excela wybrat pozycje Otwdrz. Po podaniu nazwy pliku Excel wyswietli okno dialogowe
Otwieraniepliku XML pokazane na rysunku 4.6. Okno zawiera trzy opcje:
Rysunek 4.6.
Okno dialogowe
Ohvieranie pliku XML
Wbrew tcmu, czego mofna si~'spiziewaf,nie jest moAiwe wyeksportowanie jako pliku
formatu XMI, dowolnego zaluesu danych. JeSli na pnyklad w arkuszu zostanie stworzony
zakres listy, jego wyeksportowanie jako pliku XML nie bpdzie motliwe do momentu
ddqczenia do arkusza odpowiedniej mapy. Poza tym nie jest motliwe stworzenie lub
modyfiowanie mapy prry utyciu Excela.
100 C z e f t I + Podstawowe informocje
Rysunek 4.7.
Zaimportowana
zawartodC
oliku XML
Rysunek 4.8.
Edytor rejestn,
umoiliwia
nr-I
prreglqdanle arc-owcan ommmm~o)
i modyfikowanie .r~~mmoiormmmmmmwmltlmm~
rawartosci rejestm R l o.mmmol(I)
~ ~
arc- -fo)
QmmDIIsfIwn
aP.r.s.t.o.7.1S.Wr~rI
mmmmmmmmmmmmmommm~
PEG- amrmaO(lW
RIG- -1s In)
UG- msomlrn(rn
W G m V mmmmmmlOMl~mll0lmm~~rn~
m,z.6.aalS.*
DgpOml(1)
UstawienSa Excela
lnfonnacje m e prtez Excel sq przechowywane w nastqpujqcej cqSci rejestru:
HKEY_CVRRENT~LISER~o~meIMi~aso~\~cel!
1.01Excel.
Znajduje siq tu kilka kluczy tawierajqcych specyficme m o l c i m j q c e na spsbb
dzi2dania Excela. Ustawienia rejestru sq automatycmie uakluahiane przez Excel w mo-
mencie jego zarnykania.
-
Excel wczytule zawartoS6 relestru systemu Windows tylko raz przy ~ ~ C h a r n i a n i u .
Ustawienla rejestru uaktuainia teZ tylko raz - gdy zostanie prawidfowo zamkniety.
JeSii Excel zawiesi sie (niestety zdarza siq to). zawartodf rejestru nie zostanie
uaktualniona. Jedli na przyktad zrnodyflkujesz jedno z ustawieri Excela. takie jak
wyjwietlanie paska statusu. dokonana zrniana nie zostanie zapisana w rejestrze
do rnomentu poprawnego zamkniecia aplikacji.
W tabeli 4.2 pokazano te sekcje rejestru, Mdrych utywa Excel 2003. W p q p a d k u rejesbu
znajdujqcego sic w twoirn kornputem motesz nie znalekC wszystkich tych sekcji.
Robocza definicja
aplikacji arkusza kalkulacyjnego
Z arkuPzami kalkulacyjnymi prawdopodobnie masz do czynienia ju2 od kilku lat, jednak
zapewnc twonyle9 do@ jedynie proste arkuszc rcalizujqce r 6 h e zadania i nigdy nie
zastanawiaw siq nad og6lniejszymi zagadnieniarni, takimi jak rodzaje u2ytkownikdw
aplikacji arkusza kalkulacyjnego, czy spodb klasyfikowania tych aplikacji. Motliwe,
2e nie pabafi1byS nawet powiedziek, dlaczego utytkownicy w ogdle korzystajqz aplikacjj
arkusza kalkulacyjnego. Aby jednak stat sie dobrym programis@ musisz mac i rozurniet
te kwestie.
Aby podzial ten sprecymwat, w katdym z kryten6w wyr6tnikm trzy poziomy. W cfckcie
uzyskalem dziewi@ kombmacji zawariych w tabeli 5.1. W praktyce tylko siedem wariant6w
jest ~odnychrozwatenia, poniewat zar6wno umiarkowani, jak i bardzo dofwiadczeni
&ytytkown-icy arkusy kalk;lacyjnych zazwyczaj ptzejawiaj~przynajmniejd&e zainte-
.. -
resowanie arkuszarni kalkulacvinmi. W koricu to one motywowab ich do zdobywania
doiwiadczenia. UZytkownicy o sporym doSwiadcaniu i w niewiclkim stopniu Aintere-
sowani zdobywaniem wiedq sq najgorsymi kandydatami na pmjektantbw.
Tradycyjnie a r k ~ ~ tkalkulacyjne
e s t o s o m o do wykonywania obliczen numerycmy&
w wipkszo9ci cechujqcych sip intw&ywnolciz+ Doskmalym tego pnykladem q fir-
mowe budtety. Po stworzeniu modelu (wi* sip to ze zdefmiowaniem fornut) ppraca
nad W e t e m sprowadza sic do wprowadzania wartoSci i analizowania wynik6w. Cqsto
tworzenie b u W 6 w sprowadza siq jedynie do przyddelenia stdych zasob6w r62nym
zadaniom i zaprezentowania wynikdw p n y utyciu odpowiedaio atrakcyjnego Iub pny-
najmniej aytelnego fonnatu. OczywiScie arkusz kallculacyjny nadaje sit do tcgo idealnie.
Podstawowe kategorie
aplikacji arkusza kalkulacyjnego
WJr6d aplikacji arkusq kalkulacyjnych m o m wyr6fniC kilka podstawowych kategorii.
Ma to na celu uzyskanie lepszej o r i m j i w funkcjach, jakie te aplikacje spdniaja Oczywi-
Scie zastosowany podzial jest calkowicie umowny i oparty w y l m i e na moim dogwiad- I
I
neniu. Ponadto w pewnym stopniu kategorie sip polaywajq, jednak swoim zakresem I
B
arkurn kalkulacyjne p m a c z o n e wykqcznie do u 2 y h prywarnego,
aplikacje jednego w o w n i k q
I
B aplikacje typu ,,spaghettin,
I
aplikacje utytkowe,
I
jednoblokowe budtcty,
modele wanmkowe,
I
I
aplikacje przechowujqw h e i u d d e l a j w do nich dam, 1
Arkusze kalkulacyjne
pneznaczone wylqcznie do u5ytku prywatnego
J& sama nazwa wskazuje, nikt poza projektantem nie mote u2ywat takich arkuszy, ani
dysponowac dostppem do nich. Pnyktadem takiego arkusza mote byC plik, w ktbrym
sq przechowywane informacje o podatku dochodowym. Utytkownik otwiera go kazdo-
ramwo, gdy o v a poem czek poniesie koszty m i m e z prowadzonymi interesami
lub kupi produkt, kt6rego koszt mote odliczyC od podatku. Kolejnym pnykiadem jest
arkusz kalkulacyjny shkqcy do rejestracji czasu pracy podleglych pracownikow (mol-
nienia lekarskie, urlopy itp).
Arkwzy kaikulacyjnych zaliczajqcych siq do tej kategorii nie mo-a uznat za aplikacje,
mimo te wraz z udvwem czasu ich z+otonoSC sie zwieksza Pmxkiadowo dvsponuie
2
Nikt inny nie utyje tej aplikacji, ale jest to bardzo prosty w u&ciu, niewielki i povcmy
program. W tym szczeg6lnym przypadku czas poJwivony na zamianp aplikacji z prze-
naczonej wyiqcmie do uwku prywatnego na aplikacje jednego W k o w n i k a by1 zde-
cydowanie dobne wykorystany, poniewat. dziqki temu zawzqdzilern kilka godzii pracy.
Aktualnie aplikacja posiada przyciski wykonujqm rnalrra, a ponadm w z n a q c y r n stopniu
zmniejszyiern Ijczh operacji z w i q n y c h z mechanizmem Sledzenia klientbw i wysyta-
niem pocztq produktdw.
Apflkacje uiytkowe
Nikt nie jest cafkowicie zadowolony z posisiadanego arkusza kalkulacyjnego. OsobiScie
uwatam, 2e Excel mimo wysokiejjak& nadal ma spare W 6 w . W ten spos6b p r z d d q
do nastgpnej kategorii aplikacji arkusg kalkulacyjnych, c y l i oplikacji qtkowych. Sq
Rordziot 5. + Czym jest aplikacja arkusza kalkulacyjnego? 113
Tego typu a r h z kalkulacyjny jest spotykany bardzo c-. Program VisiCalc (pienvszy
arkusz kalkulacyjny na Swiecie) z o s d zapmjektowany z my4lq o budowaniu takich modeli.
W wiqkszo4ci pnypadkow jednoblokowe budtety nie sa. wlaSciwymi kandydatarni na
aplikacje, poniewat sq zbyt proste. Jednak zdanajq sic wyjqtki. Dla pnyk(adu motna
wziqt pod uwagq zarnian~na aplikacje arkusza, ktdrego model jest oparty na trudnym
w obshdze tr6jwymiarowym arkuszu. Mope tet by6 to arkusz konsolidujqcy dane pobieiane
z innych plik6w lub arkusz utywany p n e z kierownikdw dziaiow, ktorzy nie rozumiejq
dzialbnia arkusza kalkulacyjnego.
Modele warunkowe
Wiele osdb uwata modele wcuunkows za najlepsq przyklad aplikacji arkusza kalkula-
cyjnego. Motliwo54 natychmiastowego ponownego przeliczenia tysiqcy formul sprawia,
t e arkusz kalkulacyjny idealnie nadaje sip do wykonywania modeli finansowych zalef-
nych od wartoSci zmiennych. WMciwie prawie katdy arkusz kalkulacyjny zawierajqcy
formuly motna m a 6 za model warunkowy (tego typu arkusze c w t o sq rozprowadzane
w postaci szablonbw). Zmiana wartohci kom6rki utywanej p r a z fonnuiq jest jak zadanie
pytania: ,.Co siq stanie, je8li ...?" Jednak ja postrzegarn tq kategorie nieco inaczej. Do
modeli warunkowych zaliczmn arkusze kalkulacyjne zaprojektowane w y + m i e w celu
systematycmego analizowania efektdw wprowadzania rbtnych wartogci.
OkreSI czas utytkowania aplikacji i upewnij siq, czy w trakcie nwania projektu
z nia. nviqzanego sq planowane jakiekolwiek zmiany. Dysponujqc taka.
infonnacjq, motesz okref lit naktad pracy potrzebny do nealizowania projektu
i latwiej zaplanujesz zmiany.
Ostatnia uwaga. Nie bqd2 zaskoczony, jesli specyfikacja projektu zmieni sip przed a-
konczeniem prac. Jest to doSt powszechne, dlatego majdziesz sic w lepszej sytuacji.
gdy lamiast okazywat zaskoczenie, przygotujesz siq na miany. Wystarczy siq upewnid,
czy w urnowie (jdli takq zawarto) wspomniano o zmianie specyfikacji.
Planowanie aplikacji
spetniajqcej wymagania uzytkownika
Gdy wymagania kohcowych utytkownikow z o s t a ~ okreSlone,
~ bardzo kusqce jest natych-
miastowe rozpoczpcie twonenia aplikacji w Excelu. JeSli ktoS tak postqpuje, uswiadom
mu, tc jest to z4a metoda. Budowniczowie nie stawiajq domu bez zestawu planow, row-
niet i ty nie powinienei improwizowat, t w o m c aplikacjc. Co prawda, strona fonnalna
planu zalety od skali pmjektu i ogolnego stylu pracy projektanta, ale przynajmniej troche
czasu tneba pogwiqcit celowi projektu i okreSleniu etapow postwowania.
Zanim podwiniesz ~ k a w yi zasiqdziesz przy klawiaturze, przez chwilq zastandw sip nad
r6tnymi metodami umotliwiajqcymi rozwiqzanie pmblemu. WMnie na tym etapie wiele
zyskuje sit dziqki dogtebnej majomoSci Excela Unikanie wejicia w Slepe uliczki zawsze
jest najlepszym sposobem postppowania.
Excel ofenje kilka funkcji, ktdre q utywane przy tworzcniu interfejsu uZytkownika.
Oto one:
niestandardoweokna dialogowe [forrnularze UserFonn),
m kontrolki umieszczaM bezpo$ettnio w arlcusu takie, jak ListBax lub C m n d k t t o n .
122 CzgfC II + Projektowonie aplikacji w Excelu
niestandardowe menu,
niestandardowe p s k i narzqdzi,
niestandardowe skrdty klawiaturowe.
o n
m?m
Szezeg6towe orndwienle formulany UserFammajduje slq w czwartej ce5ci ksiqtki.
Rysunek 6.1.
Poptzez
bezpoirednie
umieszczenie
w afkuszv kontrolek
fomulatza
UserFom rnozna
upro2ciC jego
obsluge
U@ty skomszyt, zawierajqcy tei kilka prostych makr, jest dostepny na dolqczonym
dysku CD-ROM.
mzm
h d o p o d o b n i e najcqkiej stosowana jest kontrolka CmndBution. Sama kontrolka
CcmnandButton nie wykonuje a d n e j opemcji, dlatego tet z katdq z nich trzeba p o w i ~ k
BezpoSrtdnie z a s t ~ ~ ~ w akontrolek
nie okna dialogowego w arkuszu c-to eliminuje ko-
niecm& twonenia niestandardowych okien dialogowych. Z kolei poprzez umieszczenie
w a&szu kilku kontrolek ActiveX w macqcy sposdb m o h a upmScic dzialanie arkusza
kalkulaqjnega. Dziqki temu ~ o w u i nie k musi wprowadzak danych do komorek,
a decyzje maze podejmowat, utywajac manych mu kontrolek.
Dostosowanfe menu
KoIejna met& mzqdzania interfejsami u2ytkownika aplikacji arkusza kalkulacyjnego
. - na rnociyfikowaniu menu Excela lub tworzeniu wtasnego svstemu menu. Zamiast
pol*
tworzyf pnyckki wykonujqce rnakra, rnoma dodad jedno lubkiika nowych menu b q d l
ich pozycji. Mre b& wywolywaly jut napisane rnakra. Zaleg niestandardowych menu
jest to. te ich p a c k jest zawszc widoczny. natomiast pnycisk umieszczony w arkuszu
z latwokiq moze mikrqt z pola widzenia.
124 Cr$Se II + Projektowanie aplikacflw Excelu
nowe menu
zostab stwonone
pnez dadatek
Power Utility Pak
Rozdziot 6. + Podstawy projektowaflio aplikacji arkusza kalkulocyjnego 125
lstniejq dwie metody modyfikowania menu Excela - za pomocq jqzyka VBA lub po-
przez bezpoiredniq edycjq. Zgodnie z tym, co napisalem w rozdziale 23., zazyczaj
najlepsze jest zastosowanie instrukcji j ~ z y k aVBA. Utytkownik dysponuje wtedy pehq
kontrolq nad menu i mote nawet wykonac takie opcracje, jak wylqczenie pozycji menu
lub dodanie do niej symbolu zaznaczenia. Modyfikacje bezpoirednie, dokonane poprzez
wybranie z menu pozycji Widok/Parkin~q&ilDoxtosuj. s q m f e (rysunek 6.3). lnnymi
stowy, jeSli utytkownik usunie z menu jednq z jego pozycji, miana bedzie obowiqqwala
nawet po ponownyrn uruchomieniu Excela.
Rysunek 63.
Okno dia/ogowe
Dostosowpvanie
umoiliwia
reczns rnoc!vTkacje
systemu menu Excela
sit.&* Edytoc menu, Wry go raz plemuy potawit sic w Excelu 5 , ZO* usunietyju2 w wersji 97.
~ e n tiwonone
u 2 ;ego p
ontmmoeq bd; nadal dpiataty po otwrciu skom* w ~ r c e l u97
lub nowszyrn. Alejedyna metoda ich usuniqda lub modyfikowania palega
na umhomleniu Excela 5 tub innego natz-a. Mdre zostato w tym celu napisane.
Rysvnek 6.4.
Przyktad
zmodflkowanego
menu podrpcznego
Rysunek 6.5.
Okoo dialogowe
Dotqmanje paskdw
fla~eda'
umoifiwiadbdsnie
do skomszytu
nies:andardowego
paska nafz@zi
Zadania realizowane
Testowanie aplikacji I
Ile ray zdarzyio ci siq, 2c w bmdzo wahym momencie komercyjne oprogramowanie
uleglo zawieszeniu? Prawdopodoboic powodem probiernu byla niewystarczajqxi liczba
test6w. w trakcie kt6rych nie wykryto wszystkich w 6 w . Wszystkie zloeone aplikacje
zawinajq Mqdy, ale w oprogramowaniu najwytrzej jakoici M@y sq po prostu bardziej
u!qte. Czascm w celu uzyskania poprawnego dziahnia aplikacji koniecme bcdzie omi-
nipcie W 6 w Excela za pornocq rnodytikacji programu.
Gotowq a p l i i j p koniectnie haba pmtastowai. Jest to jeden z najwazniejstych eta-
p6w. Cysto zdaiza sip, 2e tesrowanit i usuwanie MH6w z aplikacji zajrnuje takq samq
iloSC c m u , jak jej hvonenie. WlaCciwie na ctapie pmjektowania aplikacji powinno sip
wykonat qmq l i c w tm5w. W koncu niezalehie od tego, czy pines2 proceduq w jpzyku
VBA, czy tworzysz forrnuly M. arhruszu, musisz mi& pcwnog, 2 aplikacja dziala zgodnie
z przyjqtymi zaloteniami.
B@dy w Excelu?
M6gtbyS pnypuszczd, te taki p ~ d u k tjak
, Excel, m a n y przez mlllony osdb na c a m fwiecle,
powinien byC pozbawiony bW6w. Nlc bardzlej myinego. Excel jest tak ziaionym programem, i e
-
wrqcz nalety $19 Ich spodzlewae. I fahtycznie Excel je pasiada.
Wpmwadzenie do sprzedaw taklego produktu, jak Excel nle jest tatwym zadaniem nawet dla
Mlcrosoftu, korporacli na poz6r majqcej nieograniczone rnotliwoSci. Z przygotowywaniem opr*
gramowania zwlqzane sg komprornisy i dylematy. Powszechnie wiadomo. te najwigksi wytw6rcy
oprograrnowania wprowadzajq do sprredaiy produkty, majqc petnq SwiadomoSd. i e zawlerajg M d y .
WlgkszoSC btgddw jest ignorowana, poniewai sq uznawane za niewystarczajqco powaine. Firmy
mogtyby opdfniC wprowadzenie produkt6w o kilka miesiwy i usunaC wiele btqd6w, ale r6wniet
w tym przypadku rzqdzq prawa ekonomii. Korzydci wynikajwe z takiego opdfnienla czgsto nie
wyrdwnujq ponlesionych strat flnansowych. Co prawda. Excel poslada sporq pule bled&, ale
Wpuszczam, te wiqkszoSC ujtkownikdw tej aplikacji nigdy nie bqdzie miata z tadnym z nich
do czynienia.
W tej kslqke wskazakm problerriy z Excelem, ktdre sq ml znane. Z pewnofciq Sam napotkasz
kilka dodatkowych. Niekt6fe pojawlajq slg tylko w okredlonej wersjl Excela i w dodatku w przy-
padku specflcznej konflguracji powiqzanej ze sprzqtem i (lub) oprogramowaniem. SpoSrbd
wszystkich Meddw takie sq najgorsze, poniewai trudno je odtworryC.
W takim ade, co mote zroblC projektant? Powlnien wykonad obelgcle (ang, workaround). JeSli
coS nle dzia+a, a zgodnie z wszelklml zatokniami powinno, para przejg do planu 8.Frustrujqce?
Na pwno. Strata czasu? Zdecydowanie. Wladnie z tyrn wszystkim ma do czynlenia projektant.
-
Testawanle beta
Wytw6rcy opmgramowanh armywaj stosujq rygorystycme procedury testowanla nowych produk-
tdw. Po zakor(czeniu intensywnych test& wewnmych wstepna wersja produktu jest zwykle
wysyiana do grupy utytkownik6w zalnteresowanych testowaniem beta. Na tyrn etapie sa identy-
fikowane dodatkowe problemy, usuwane zaryczaj przed pojawieniem sie ostatecmej wersji
produktu. OczywlScie testowanie beta zajmuje dodatkowy czas i nie prry wszystkich projektach
moina sobie pozwollc?na taki luksus.
J e l l tworzysz aplikacje, z kt6ryeh bedzle korrysta6 wiwej nlt kilka osdb, motesz wzl# pod
uwage testowanie beta. Ddgki temu wtaSclwl (zazwyczaj) uiytkownicy sprawdq apllkacje na r62-
nych komputerach z docelowymi ustawleniami.
Testowanie beta powinno rorpocz# sie po zakoriczenlu wszystkich testdw wewngtrznych i uzna
niu, te apllkacja jest gotwa do dystrybucji. Koniecme bgdzie okreflenle grupy uiytkownlkbw,
ktdrzy pomogq w pneprowadzenlu test6w. Proces test6w beta pmyniesie najlepsze rezultaty, gdy
utytkownikom zostanq przekaane wszystkle elementy, wchodzz)ce w skhd ostatecznej aplikacji
(dokumentacja u2ytkownika. program instalacyjny, system pomocy ltp). Wyniki testdw beta moina
uzyskaC na kilka sposob6w, w tym popnez bezpoSrednle spatkania, kwestionarluue i rozrnowy
telefoniczne.
Po zakoficzeniu test6w beta pawie zawsze w z i e s z Swiadomy pr&lem6w, ktdre muszq by6
usuniete, lub udoskonalefi. Mdre mu= zostaC wykonane.
<=, Pocqwsry od Excela 2002, dostgpnych jest kllka navych opcji ochrony arkusza.
Po wybranlu z menu Nanedzia pozycji Uchmne, a nastepnle Chrofi arkuszzostanie
otwafle okno dialogowe Chronlenie arkvsza. Okno urnoiliwia doktadne okreblenle,
jakle operacje moina wykonyuuaC w chronionym arkuszu. Poza tym w oknie dlalogowym
O w e zapiswanid majduje sif!przycisk Zaawansowane. Po ]ego klikniviu rnoina
I Rozdziat 6. + Podstawy projektowania aplikacji arkuna kalkulacyjnego 131
Nalety rdwniet zaplanowad wsparcie technicme dla aplikacji i m.in. rozstrzygnaf. kto
odbiene telefon, gdy utytkownik k d z i e cllcial zgbsit problem. JeSli nie jestes prry-
gotowany, aby u d z i e r odpowiedzi na bkQce pytania, musisz maleft kogos. kto siq
tym zajrnie. W niekt6rych pqpadkach kdziesz chcial otrzymywat jedynie informacje
o blcdach oraz pytania typowo technicme.
W mzddale 24, omdwiono kilka akematywnych metod oferowania pomocy
dla utytkownikdw apllkacjl.
Gdy pojawi sip koniecmoff uaktualnienia lub modyfikowania aplikacji. docenisz to, t e
od p q t k u st;u;tnnic jq pmjektowalef i w p h i udokumentowalei wykonanq pracp. JeSli
jednak tak nie bylo...No c b t uczymy sit na btdach.
Sprawy skornplikujq sip jeszcze bardziej, gdy pod uwage w e h i e sip podwersje Excela.
Microsot? rozprowadza dodatki SR (ang. service rdeme), kt6re usuwajq wykryte Mqdy.
Prryktadowo utytkownicy mogq korzystat z oryginalnej wersji Excela 2000, albo po-
szerzonej o dodatek SR-l lub SR-2.
%
(3,
Jeszcze wieksze problemy pojawiajq sie w przypadku Excela 2003. Mlcrosott
sprzedaje kllka r6inych wersjl pakietu Ofnee. Wiele nowych funkcjl Excela jest
dostemych wyiqcznie w wersjl Professional.
Kwestie dotyczqce zgodnofci wersji mstaty om6wlone w rozdziale 26.
mma?l
3
I
Wersja jezykowa
Motesz uwatat sip za d u e g o szcqkiarra, jeSli wsyscy kodcowi u2ytkownicy aplikacji
korzystajq z anglojezycmej wersji Excela. h e wersje jqzykowe Excela nie bpdq w pehi
zgodne, co omacza koniecmoit wykonania dodatkowych testow. Ponadto nalety mieC
$wiadomoX, te dw6ch utytkmikdw anglojctycmej wersji Excela moZe koqfstat z 162-
nych ustawietl regionalnych systemu Windows. W niekt6rych pnypadkach rnogqpojawit i
Niestety nie istnicje meroda automatycmego skalowania, tak aby okna byly wySwietlane
poprawnie niezalemie od rozdzielczodci karty m f i c n e i . W niekt6rych przypadkach
. -.
?smieje motliwoft powiekszenia arkusza (z minu View naleky ~ ~ b r a ~ ~ oPowiqk- z y c j ~
szenie), ale uzyskanie stabilnych wynik6w tei operacii m o k byf trudne. JeSli nie jestd
pewie", j* r&zddelczo~C k& &ficmej &tosuj<&ytko&icy aplikacji, zaprojektuj
jq w oparciu o najmniejszy wspdlny mianownik, czyli rozdzielcw4C 800 x 600.
Jak dowiesz siq w dalszej czqSci ksi&i (rozdzial lo.), moma oknfliC rozdzielcdC
karty graficznej W o w n i k a za pomocq wywdiili API systemu Windows wykonywa-
nych z poziomu kodu hddlowego j m k a VBA. W niekt6rych sytuacjach, w zalehoSci
od rozdzielcmSci karty graficmej utytkownika, za pomocajqzyka pmgamowania mo2na
odpowiednio modyfikowak ustawienia.
Jezyk fisual Basic
for Applications
Rozdziat 7.
Wprowadzenie
do jezyka VBA
Rozdzial zawiera wpmwadzenie do jpzyka VBA (ang. Visual Basicfor Applications) i do
obiektdw Excela. Progmmowanie przy u2yc:iu Excela S~r0wadZ.asie do manipulowania
obiektami, co polega a; pisaniu initrukcj; w jqzyku &zurnialyrn &z ten kkusz kal-
kulacyjny. jest nim wbSnie jqzyk VBA.
BASIC zdobytsporr urmmic w 1991 mku, gdy Microsoft wpmvaddl do spmxky produkt
o nazwie Visual Basic for Windows. Znacznie ubtwil on tworzenie niezaletnych apli-
b c j i dla systernu Windows. Co prawda, ma niewiele wsp6lnego z wczesnymi wersjami
jezyka BASIC, ale w o w i u o niego stworzono jpzyk VBA.
Jezyk'VBA
Excel 5 by1 pierwsq aplikacjq na rynku ofemjqcq j p y k VBA. Najlepiej jqzyk VBA
&owat jako og6lny s ! q p o w y jpzyk Microsoh s w c y do twonenia aplikacji.
Obemie jest doQczany do wszystkich aplikacji pakietu qffice 2003, a nawct wchodzi
w skhd programdw innych producentdw. A zatem jdli opanode.4 j w k VBA, to ko-
nystajqc z Excela, hdziesz mdgl od razu z a c q t pisaf makra dla innych produkt6w
140 Cr@C Ill J w k Visual Basic for Ao~licotions
Modele oblektowe
Sekret z w i q m y z zastomwaniem jqzyka VBA w innych aplibcjach tkwi w mzumieniu
modelu obiekrowego katdej z nich. Jezyk VBA po pmstu manipuluje jedynie obiektami,
a katdy produkt (Excel, Word, Access. PowerPoint itp.) pusiada w k n y unikatowy model
obiektowy. Aplikacja mo& zostat stwomna p l y utyciu obiektdw udosgpnionych prza
program, na kt6rym bazuje.
PrzykWwo mcdcl obiektowy Excela oferujc kilka bardzo ydajnych obiekt6w analiry
danycb takich, jak arkuszt. wykresy, tabele przestawne, scenariusze oraz sporq liczbq
funkcji matematycmych. tinmowych. intynieryjnych i potwzechnie stosowanych w biz-
nesie. Jqzyk VBA urnotliwia utywanie tych obiektbw i pmjektowanie zautornatymwanych
procedur. Utywajqcj w k a VBA. stopniowo zapoznasz siq z modelern obiektowym Excela
Na pocqtku hdzie to bardzo zagmatwane. Jednak ostatecznie wszystkie elementy u l o a
sic w catosd i nagle uiwiadomisz sobie. te to opanowaies!
Rysunek 7.1.
Pmste makm
wle.?vkuX M ,
zapisane
w arkusm makra
Rysunek 7.2.
Proste makro
w1eryku vm.
zapisane
w module VIM
1 Function. Poza procedurami Sub w module mog4 tez byt umieszctane procedury
Function. Praecdua Function m c a pojedyncqwartoSE Lub tablicq. Mote
zostat w y w h z innej procedury jczyka VBA lub byt zastosowana w formule
W s z a Oto przyktad procedury Function o nazwie Addiwo:
-
Functron PddTwt argl , arg2)
AMTw argl + argZ
EM Fwction
142 Czerc Ill + Jqzyk Visual Basic for Applications
Standardowe elementyj~kuprog~mowanio.
Jqzyk VBA posiada t a k e wszystkie
elementy nowoczesnych jqzyk6w programowania takie, jak tablice, petle itp.
Analogla
JeSll lublsz analogle, oto Jedna z nlch, w kt6rej por6wnujq Excel z sleciq bar6w szybkle] obsiugl.
Analogia mote porn& w rrozumlenlu zwlqzkbw pomiedzy obiektami, wlaSclwoJciami i rnetodaml
JgzykaVBA.
Podstawowq jednostkq Excela jest obieM Workbook. W pnypadku sled bar& szybkiej obslugi taka
jednostkq jest jeden bar, k c e l umotliwia Ovonenle I zarnykenie skoroszytbw. WszysWe otwarte
skorusryty zbi6r Workbooks (Zloiony Z obiektb hbrkbook). POdobnie klerownlctwo sieci bar6w
moie otwierat i zamykaf bary. Wszystkie bary sieci mom by2 potraktowane jak zbi6r Bary zioiony
z obiekt6w 3ar.
Skoroszyt Exctla jest obiektern, ale sarn pmchomje inne oblekty takle, jak arkusre, wykresy,
modub VBA ltp. Ponadto katdy obiekt zawarty w skoroszyele mote posiada6 wtasne oblekty.
Prryktadnwo oblekt Worksheet mote prrechowywaC takie oblekty, jak Range, PivotTable. Shape itp.
Rbwniei bar szybkie] obslugi (odpowiednik skorosrytu) zawiera takie obiekty, jak Kuchnia, Jadalnia
i Stoly (zbiw.Ponadto kierownictwo mote d o d d lub usunq5 obiekty zawarte w obiekcle Bar. P m
kledowo do zbiom Staly mote dodaC w i v e j stolbw. Keidy z tych dblekt6w mote poslada6 inne
obiekty. Rzyk(@m obi& Kuchnia pmchowuje o b i i Kuchenka, Uentylator, GlhyKucharz, Zlm itp.
Jak na razie wszystko sle zgadza. Wydaje sip, te przytoczona analogla slq spawdza. PrzekonaJmy
sle, czy bgdde tak dale].
Obiekty Excela posladajq vAa9dwoSci. Rrykladowa obiekt Range dysponuje taklml vAaSciwo5ciarni.
jak Value I Name, natornlast oblekt Rape oferu)e takie ~ S c i w o S c l jak
. Width, HelgM itp. Obiekty
w barze szybkiej obslugl t e i posladajq WaSclwdcl. Pnylctadawa ablekt KuChenka ma takie wiaSci-
woC1, jak T=peratura i LiczbaPalnikb. Obiekt Wertylator tet posiada zbi6r wlasnych wiaSciwoSc1
(k'lqczony, LiczbaObrcrtMaMinute itd).
Poza wIakl&larnl &My B e l a pasladajq te2 rnetody wykonbjp na nlch opmcje. pnvkhdauo
metoda ClearContents usuwa rawarto!E obleMu Range. O b l e w powiqzane z barem szybklej o b
stugi r6wniet posiadajq metody. Z +atwoSclq rnoina soble wyobmzld dla obiektu Kuchenka metad?
Z~i8naClstawieniaTemstatulub dla obiehtu Wentylator metode W~~crente.
W F.rrypadku -la met* czasarnl rnodytlkujq wart&i wtaJclwo4ci obiekt6w. Metoda Clearcon-
tents obiektu Range modyflkuje wta&iwoSf Value. Podobnie rnetoda ~ r n l a n a ~ s t a w l e n i a ~ e m s t a t u
obiektu Kuchenka rnodflkuje jego wt&ciwo~ Temperatura.
JBZyk VBA urndlwia plsanle procedur pnetwarz@zlc)ch&My Exesla. W pzypadku baru szybkiel C&
siugl k i m i c t w o moie wydaC poleoenie wykonania operacji mlqzany~hz DMektaml w rdrn sic ma&
dujqcyrni [wtqczenie kuchenki i ptzetqczenie wentyiataa na wywkle obroty). Czy teraz Jestto Jasne?
1 44 CmIC Ill + J
w V b d Basic for Applications
Motest wiaryC lub nie, ale powytsa zcstawienie w d d t du2ym stopniu opisuje jpzyk
VBA. Tcnz nalety jedynie tapomat siq ze s z c z c g h i , ktbrt zawarkm w pozastakj
Ponadto prry utyciu ponizszych metod motna uzyskat dostqp do dwbch specjal-
nych modu+6w VBA (obydwa zawierajt procedury obshrgi zdancfi omdwione w roz-
dziale 19.):
prawyrn pnyfiskiern myszy klihij kartp arkusza, a nastqnie w celu uzyskania
dostppu do rnoduh kodu fr6dlowgo aktywnego arkusza, wybien pozycje
WyJwietl kod,
Rysunek 7.3.
Okno edytora
Visual Basic
JeSli okno Project Explorer nie jest widocme, nalczy wcisnqt kornbinacjc klawiszy
Ctrl+R. Aby ukryC okno'Project Explorer, nalezy klikn* prycisk Zamkng w jego pasku
tytulowym. Motna tet prawym pnyciskiem m y s y kliknllf w dowolnym miejscu okna
Projecr Explorer i z menu pod~ycznegowybrat pozycjp Hide.
Okno Code
Okno Code (czasem nazywane oknern Module) zawiera kod trddlowy jpzyka VBA.
Z katdym elementem projektu jest powizgane okno zawierajqce kod hddlowy. Aby dla
okreSlonego obiektu otwonyt okno Code, n a l c e go dwukromie klikn;iC w oknie Pro-
ject Explorer. Aby na przyklad otworzyC okno Code dla obiektu Arkuszl, nalety go
dwkmtnie klilol$ w oknie Project Explorer. JeSli dla obiektu nie zostanic zdefiniowany
kod irodlowy jgzyka VBA, okno Code b@e puste.
Kolejna metoda umotliwiajqca otwotzenie okna Code dla obiektu polega na jego za-
znaczeniu w oknie Project Erplorer i kliknicciu ptzycisku View Code znajdujqcego sic
na pasku narzcdzi w gornej c*ci okna Project Explorer.
Okno Code zostanie om6wione w dalszcj c q k i mzdziatu w punkcie zatytulowanym
,,Zastosowanie okim Code".
Okno Immediate
Okno Immediate jest najbardziej pnydatne w pnypadku bezpogredniego wykonywania
inmukcji jezyka VBA, ich testowania i usuwania M ~ d b wz kodu trodlowego. Okno
mote by6 widocme lub ukryte. JeSli okno immediate jest niewidoczne, nalety wcisnqt
kombinacje klawiszy Crd-G. Aby je zamknqc, naleg, ktiknqk przycisk Zamkng na pa-
sku tytuIowym. Moms tet p r a y m pnyciskiem myszy kliknat w dowolnym miejscu
okna Immediare i z menu podwmego rvybrat pozycjp Hide.
Na rysunku 7.4 pokazano o h o Project fiplorer zawierajqce trzy projekty (jeden dodatek
i dwa skoroszyty).
Rysunek 7.4.
Okno Project E.xp/orer
H.rSw/et/a]qce
tny ProjeMy
Aby do projektu taimportowat5 obiekt, w oknie Project Explorer nalew zamaczyd nanvq
projektu, a nastwnie z menu File wybrat pozycjq Import File. Zostanie otwarte okno
dialogowe, w kt6ryrn zastanierz poprwmny o podanie nazwy pliku. Zairnparrtowat m o h a
tylko plik, krdry zostal wczesniej wyeksportowany pny utyciu polecenia Export File
menu File.
'
Aby skmowaf! modd lub obiekt UserFom do lnnego prolektu, tak napraw* nie trzeba
go eksportowar!. a nastepnie ~~~~~6. W s s r i e , gdy oba projekty sq OM.
.. _ wystarcry uakl)wnlC okno Pwect Explorer I przeciqgnqt oblekt z jednego projektu
do drugiego.
m& Mary (specjalny typ rnodub umotliwiajqcy twomnie nowych klas obiektdw),
formularz UserForm.
Edytor Yirual Basic nie umotliwia zamknivia skoroszytu. Tp operacjq motna wykonad
tylko w aktywnym oknie Excela. Jednak w celu zamkniwia skorostyru lub dodatku moms
poslutyt sie oknem Immediate. Wystarczy uaktywnit to okno, a nastcpnie wprowadzic
w nim instrukcjq jezyka VBA podobnq do ponitszej i wcisnqc Enter:
lnstrukcja wykana metode Close obiektu Workbook, ktdra zamknie skoroszyt. W tyrn
pnypadku skoroszytem jest dodatek.
Pojedynczy modut VBA moZe pmchowywad dowolnq liczLy procedur Sub i Function
oraz deklaracji. Sposdb mrganizowania rnoduiu VBA jest calkowicie zaletny od ciebie.
NieMdrzy preferujq umies~czaniecalego kodu irbdIowego jqzyka VBA dla aplikacji
w jednym module VBA. Z kolei inni przechowujqkod w kilku r62nych rnodutach.
150 CzeJC Ill + Jezyk Visual Basic for Applications I
P n w a na odrobinp tsnnlnologli
W ksipice potugujq siq taklmi termlnaml, jak program, procedura I makm. Zazwyczaj programihi
u j w a j q termlnu procedvra w celu ,opisania zautomatyzowanego zadania. W przypadku Excela
procedura jest tet okreglana mianem makra. Z technicznego punktu widzenia procedura moie byC
pacedurq typu Sub lub Function, wobec ktdrych czasarni uiywa siq okreflenia program. Osobi-
Scie wszystkich tych termlndw u w a m zamiennle. Jednak pomitylzy proceduraml Sub i Function
qsteprje istotna rbtnica. Rozrbtnienie to stanie sie widoczne w rozdziatach 9. i 10.
Edytor Visual Basic, podobnie jak Excel, ofetuJe wiele poziomdw operacji realizowanph
F e z polecenia Undo I Redo. A zatem Jefli stwierdzlsz, i e usunqieS instrukcje, ktdrej
nie powlnieneg by( usuwaf, molesz klikaC przycisk Undo (lub wcisngf kombinacje
klawlsq Ctrl+Z) a t do momentu jej pmpr6cenia. Po wykonanlu operacji prrywracania,
w celu cofniecla Jej efektdw motna klikng przycisk Redo. Funkcja ta moie .ocaliC
iycie", dlatego namawiam do poeksperymentowania z niq do rnornentu petnego
zrozumienia zasad jej dziatania.
Spr6buj umiekiC w projekcic modul VBA, a nastepnie w powiipnym z nim oknie Code
wpmwadt ponitszq procedurq:
--
Sub SayHello( 1
Ksg 'Czy odzywasz sle " I Application.UserVame b '?"
Ms UsgBoxtMsg. vbYesNo)
-
I f Ans vSHo ;hen
MsgBox "Nic s i e nle stalo."
Else
MsgBox 'MusZ~ byt J~SWidzem! '
End I f
End Sub
Ryrunek 7.5.
Pienvsza
pocedvra
napisana
w jezyku VBA
1 52 CzeJe Ill + Jew Vlwal Basic for Applications
Podczas wprowadranla kodu edytor Usual Basic dokonuje pewnych jego rnodyfikacji.
JeSll na prryktad pned lub pa maku f6wnoSci (-) pornlnlesz spacjq, edytw Wsual
Baslc wstawl jq za ciebie. Poza tyrn zrnieniany jest kolor nieM6rych st6w. Wszystko
jest bardzo normalne i z czasem to docenist
Aby uruchomic! pracedurq Szybkl:a, ncrlety sprawdzic!, czy kunor znajduje sic w do-
wolnym miejscu obszaru. w ktbqrn wprowadziled tekst, a nast~pniewykonaf jednq
z nastepujqcych operacji:
wcisnqd klawisz F5,
W z menu Run wybraf pozycjp Run SuMVser Form,
kliknqk prrycisk RunSuWUserForm na pasku n w i Standard.
Rysunek 7.6.
w i k wykonania
procedury pokazanej
na rysunku 7.5
Przed chwilq stworzyU proceduq Sub jpzyka VBA (naqvmq t& mahem). Po wykonaniu
polecenia uaktywniajqcego makm edytor Visuoi Basic szybko skompilowd i uruchomil
jego kod fr6dkwy. Innyrni siowy, przehvorzona zostala W a instmkcja i Excel po
prostu wykonal to, co mu nakazano. Makro mote by6 wykonane dowolnq liczbq razy,
chociat po jakimg czasie operacja m nic b~dziej u t tak amkcyjna.
Nietle jak na pimvszy rat? Wszystkie te zagadnienia omdwiono w dalsaj cz&i ksi@ki.
Rozdzial7. + Wprowadzenie do jszyka VBA 153
Aby przyjrreC sip wygenerowanemu makru, naleg, uaktywnik edytor Visual Baic (naj-
prolciej poprzez wcifniqcie kornbinacji klawiszy Alt+FII) i w oknie Project Explorer
zlokalizowaC projekt. Aby zobanyC zawarto9C elernentu Module, nalety go kliknqc.
W celu wyiwietlenia okna Code powipnego z elernentem Module1 nalety go kliknqc.
JeJli w pmjekcie jut.majdowat sic element Modulel, nowe rnakro zostanie urnieszczone
w elmencie 1ModuIe2.Kod M d o w y wygenerowany przy lctyciu tego jednego polecenia
zawarto w listingu 7.1. N a l w pamipic, t e wiersze kodu, na pocqtku ktotych znajduje
sic m a k apostrok, sq komentarzarni i nie zostanqwykonane.
UsHng 7.1. Kod M&wy makra zmleniajqcego orlentacje strow na podomq
Sub HakrolO
--
h'ith Activesheet .Pagesetup
.PpintTitleEto*s "
.PrintTitleColvnns "
End U! t h
ActrveSheet .PageSetm. Printllrea = "
I
154 Cz&C Ill + Jezyk Visual Basic for Applications
.LeftHeader --
With Acti veSheet .Pagesetup
""
---
.CenterHeader ""
.RlghtHeader ""
.LeftFooter ""
---
CenterFooter " "
.kiahtFooter ""
. ~ e i t ~ a rng i Pppl i c a t i o n . InchesToPoints(O.787401575)
-
.Righ:Margi n Appl icatiw. InchesToPot nts(0.787401575)
.TopMargin ~ p p l l c a t i o nInchesToPoints(O.904251969)
.
--
B o t t m t l a r g i n -.Applicaticn.InchesToPoints~0.984251969)
.HeaderMargin Appl i c a t i c n . InchesToPotnts(O.5)
.Printt!eadiqgs --
.FwterMargin App?i c a t i c n . InchesToPotnts(O.5)
Fa1se
PrintGrldlines
- - - False
Printbmnents x l P r l ntNoComnents
.PrintCuality 300
- -
.CenterHorlzontally
.Centervertically
False
False
.Draft - -
.Orientation xlLandscape
False
-
.PaprSize x l PaperA4
- -
.FirstPageNumber
Order x! DwnThenOver
xlktanati c
.
- -
BlackAndblhite False
. i m 100
.
PrintErrors x l PrlntErrorsOisplayed
End W i t h
End Sub
Profciej jest chyba zaparniqtad nazwq statej n i t rdtne wartoJci liczbowe. Aby zapomac
sic ze statymi powiqmnyrni z okreSlonymi poleceniami, nalety postutyd sic systemem
pomocy.
Zakladka Editor
Na tysunku 7.7 pokazano opcje d o s t w e po klikni~ciumkladki Editor okna dialogowego
Options.
Rysunek 7.7.
Zakladka Editor
okna dlalogowego
Omions
Opcja jest bardzo pomocna, dlatego zawsze z niej konystam. Na rysllnku 7.8 pokazano
pnykhd dziatania opcji Auto Lisr Members (stanie sip to macznie bardziej zrozumiale
po mzpocqciu wprowadzania kodu b6dlowego jqzyka VBA). W prtytoczonym p q -
ktadzie edytor Vkuoi Basic wyiwictla listc element6w powiqzanych z obiektem Ap311-
cation. Wystarczy wybrac z listy pozycjq, dzicki czemu uniknie siq koniecznolci jej
wpisywania. Takie rozwivanie gwarantuje tet poprawnoif skladni.
Rysunek 7.8.
Pnykfad
dzidania opcii
Auto List Memben
Rysunek 7.9.
Pnyklad dziaanla
o p j i Auto Quick Info
oferujqcej pomoc
na temat
wla~ciwo8cfRange
s> Zamlast spacjl do wykonywania wcl& w kodzie frbdlawym utywaj klawisza Tab.
Powstajq wbwczas Dardziej regularne odstepy. Ponadto u celu urunl~ciawlecla
rnoina wcisnqt komMnacje klawiszy Shift+Tab. KombinacJa klawiszy sprawdza sie tei
w przypadku zamaczenia wiecej nii jednej instrukcji.
Rysunek 7.10.
Zakfadka
Editor Format
okna dialogowego
Options
Rozdziat 7. + Wprowadzenie do jezyka VBA 159
Opcja Font
Opcja Font umotliwia wybranie czcionki, ktdra zostanie utyta w modulach VBA. Aby
uzyskae jak najlcpsze wyniki, nalety pozostat p n y ncionce o stalej szerokoSci, takiej
jak Courier New. Wszystkie maki majq wbwczas dokhdnie takq samq szerokodt. Dzie-
ki temu kod Mdlowy jest cytelniejszy, poniewat w pionie maki sq tadnie wyrbwnane.
a spacje widocme.
Pole She
Pole Size pozwala okreSlit rozmiar czcionki stosowanej w modulach VBA. Ustawienie
jest zale2ne od indywidualnych upodobd i rozdzielczoSci karty graficznej. DomySlny
ronniar wynoszqcy 10 punkt6w jest dla mnie odpowiedni.
Zaktudka General
Na rysunku 7.1 1 pokazano opcje 28- w zaktadce Gener~Iokna dialogowego Opriom.
W prawie kbdym pnypadlcu ustllwienia domydlne sqodpwiednie.
Rysunek 7.1 1 .
Zaktadha General
okna dialogowego
Options
160 CzgE Ill + J w k Viswl Basic for AppLotions
Sekcja Ermr Trapphgpomala okre&llf, co siq stanie, gdy wysQpl biqd. JeSli stworzyu
jakikolwlek kod frddtowy obstuqujqcy bwy, upewnij sle, cry uaktywnlono opcje Break
on Unhmdled Errors. Je511 jest aktywna opcja Break on All Ems, tego typu kod
b@de lgnorowany (czego wale nie oczekujesz). Metody obstugi btedbw zostanq
omdwione w rozdziale 9.
Rysunek 7.1 2.
Zaktadka Dacklng
okna dialogowego
Options
,~&* Blokowanie oklen w edytorze Wsual Basic zawsze by4u troche problernatycme. Czesto
<W?- niektdryeh oklen dlugonle motna zablokowaC, ch&po wielu prdbach oitatecmie sig
to udaje. Niestety nle znam tadnych sekretdw dotycqcych rnetod blokowania oklen.
Pasek narzgdzl Wsual Bask Excela poslada kllka prrydatny~hprrycisk6ur, takich jak
Uruchom maim, lare,estmj rnskm, Iatnym@n ~ t m m i IcEdytw Mstfa! B ~ s C
7 .FA.
Rozdziot7. Wprowadzenie do jer/ko VBA 161
Eluan powinien by5 podobny do pokazanego na rysunku 7.13. Rozmiar okien bgdzie
zaletat od rozdzielcno6ci karty graficmej.
Teraz w arkvszu Excela wybieit kilka r6hrych polece6. Zaznacz i sfonnatuj kombrki,
wpromdit dane, zastosuj menu i paski narrgdn, utw6n wykres, zmodyfikuj obiekty
graficzne itp. W oknie moduh VBA obserwuj proces generowania kodu Frbd4owego.
Gwamntujp, 2e domasz ohviecenia.
162 CzeSC Ill + JeykVisual.Basic for Applications
Rysunek 7.13.
Upoizqdkowanie
okien
umo2liwiajqce
wygodne
obsenvowanie
procesu 1 R.bb3 R W 0
rejestrowania nnwro rarejcsrr- rao4-08-19, aurar .I.- Eon
makra
-1-u-I -I.*.
&L1..C.1L.IOrm.l.IIICL - -100-
RmL.aO.1-14-1 .¶.I-
&CLdCII.~D-LYIICL
u.qC1-u-I. S * I L C S
. -200.
A ~ c I Y ~ C ~ I I . ~ O ~ Y L C X-300-
~CL
bm 1.16.1 .¶cirSe
AerlvcCelI.T~mml.IIlC1 -
¶ c ~ c s ~ ~ ~ ~ . T c . ~ s .'
BoRIu m
~
~-3~(RI-JlCinI-LICl
Aby wykonat powytsze makro, z menu Norzedria nalety wybrat pozycjq Makro, a na-
stqpnie M a h lub wcisn# kombinacjq klawiszy AIt+F8. Po wybraniu makra Makrol
(lubjego inncj nazwy) nalety 'kliknqt pnycisk Uruchom. Po mchomieniu maim ponownie
zostanq wykonane operacje zrealizowane w trakcie jego rejestrowania, niezaletnie od
tego, kt6ra korndrka b d z i e ak-tywna. Utycie odwdaf~bezwzglqdnych podczas reje-
strowania zawsze powoduje uzyskanie takich sarnych wynikbw. Je91i jednak zechcesz,
aby makro wprowadzato n a m y miesiqcy, poczqwszy od aktywnej kom6rki. wdwczas
podczas rejeswowania q j e s z ohuoiari wzgl~dnych.
Aby sprawdzit, jak to dziatq wyczyst zawartoSt korn6rek z zakresu 01:Dl, a nastqpnie:
I. Uaktywnij kom6rkc 01.
<s3$* Makm generuje kod t6dbwy, ktby odwoluje 910 do korndrltf Al, m maie wydawd siq
dzlwne, ponlewat ta kom6rka nle byia &?ywana pry refestracjl rnakra. Wynlka to po
pmstu ze sposobu dzlolanla ejestratora rnakr. WleSclwoe Offset zostanie ornchvlona
w dalszej clgScl rozdzlalu. W tym rniejscu rnuslsz wledzid jedynle, te makro dziata
zgodnie z oczekhvanlaml.
--
.DffsettD. 31 'Kwiecieri'
.Wfset[D. 4) 'Haj'
.MfsettO. 5) 'Czerwiec'
End With
End Sub
Rozdziaf 7. + Wprowadzenie do jezyka VBA 165
Jefli zalicmsz sig do ekspat6w z zakresu j q k a VBA (jak redaktbr technicmy tej ksi&i),
motesz n o b i t W e n i e na kolegach i sprowadzit makro do jednej instrukcji:
Sub MakroS( )
-
MttwCell.Resize(.b) Array('Styczerim. "Luty". "Marzec". "Kwiecieh". -
"Ma j" . 'Crerwiec')
End Sub
W tym miejscu jeszcze raz przypomnb t e rejesmtor utqrwa dw6ch r6tnych tryb6w.
dlatego naleq zwrdcit u w a s , kt6ry z nich jest stosowany. W przeciwnym razie uzy-
skane wyniki rnogqbyt ningodne z oczekiwanymi.
fstnieje motliwoQ podania nanvy dla rejestrowanego makra. Domyflnie Excel dla ko-
lejnych rejestrowanych makr utywa nanv Makrol, MaboZ itd. Zanvyczaj akceptuje
domyflnq n a n y malaa, a p6fniej jq mieniam. Jednak motna podac wlasnq nazwq makra
przed rozpocz+cicm jego rejestrowania. Decyzja nalety do utytkownika.
Opcja Kfawisz sb6ru wnotliwia pnypisanie do makra kombinacji klawiszy, ktdrych wci-
S n i ~ i se p o d u j e jego wykonanie. JeSli na przyklad wprowadzisz malq liteq w, makro
zostanie wykonane po wciinigciu kombinacji klawiszy CtrY+ W. JeBli podasz d m litere
W, makro zostanie uruchomione po wciinbiu kombinacji klawiszy Cfri+Shifr+W.SMt
klawiaturowy rno2na dodad lub zmienit w dowolnej chwili, dlatego nie jest koniecme
jego definiowanie w trakcie rejesfmwania makra.
Opis
Domyflnie Excel wstawia pip6 wicrszy komenram! {tmy z nich sq puste) zawierajqce mmq
makra, imiq i nazwisko uqtkownika oraz date. W komentiuzu mote by6 umieszczona
dowolna lub tadna infonnacja. Wedlug mnie wprowadzanie czegokolwiek jest straQ
czasu, poniewa po wySwietleniu zawartosci modutu zawsze komcntarz usuwam.
Watne t e t jest, aby nozumieC, t e rejestrator makr nie zawsze gcneruje najwydajniejszy
kod. Excel zazwyczaj rejestruje to, co jest zaznaczane (czyli obiekt), a nastppnie w ko-
lejnych instrukcjach postuguje sie obiektem Selection. PoniZej zawarto przykladowy
kod ht5dtowy, kt61-yzostanie uzyskany po zarejestrowaniu operacji zaznaczenia zakrtsu
komorek. a nastqpnie utyciu pnycisk6w paska narzqdzi Formafowanie do miany typu
formatowania liczb oraz zastosowania pogrubienia i kursywy.
- --
Range iVAl:C5")Select
5election.NvnberFormat '#.#O.CO"
Selection.Fonr.Bold True
Selection.Fon:. I t a l i c Tme
I
Jedli w trakcie rejestrowania makra korzystasz z okna dlalogowego formatowania,
Excel wygenemie swrq iloSC nadmlarowego kodu frbdtowego. Rejestmwanie klikni@
prrycisk6w pask6w na&dzi czesta powoae stworzenie wydajnlijszego kodu.
Nalety parniptab o tym, tt jest to tylko jedna z metod wykonywania tego typu operacji.
M o a a tet zastoso\w2 wydajniejw kmtrukcjq W j ;h . .. End With. Oto pnykbdowy kod:
Rznge ('Al:t5"; .Select
- --
1 4 t h Se'lection
.NumberFomat "#.#': .00'
.Fcnt .W;d True
F o n t . Italic T-ue
Em! Wq?n
JeSli pominie sip metodp Select, motna stworqC jeszcze wydajnjejszy kod:
- --
With Range ('AZ:C5')
.Nu~rFamat 'if.#Q.BO"
.Font.Bold True
.F~nt.Itallc True
End With
Rozdziat7. Worowadzenie d o iezvka VBA 167
JeSli szybkoK aplikacji ma dla ciebie znaczenie, zawsze powiniend dokfadnie prze-
analizowad zarejestrowany kod Wdlowy j p y k a VBA w celu upewnienia sic, te jest tak
wydajny, jak to tylko rnotliwe. Onywiicie przed rozpocqciem modyfikowania zareje-
strowanych makr koniema bdzie doglqbna majomoSC j w k a VBA.
Obiekty i zbiory
JeJli uwahie przecqmkd p i u w s q c@C rozdziah, dysponujesz og6lnq orientacjq
w j ~ k VBA u i znasz podstawy stasowania modutdw VBA w Mfytone Visual Baric.
Zapomalef, sip tet z kilkoma kodami Wdlowymi jpzyka VBA oraz takimi pojqciarni,
jak obiekty i wl.aciwoSci. W tym punkcie zawarto dodatkowe informacje o obiektach
i ich zbiorach.
Hierarchia obitkf6w
Obiekt Appllcatlon (czyli Excel) zawiera mnc obickty. Oto p q k l a d y obiekt6w za-
wartych w obiekcie Appl ication:
Workbooks (zbidr wswtkich obiektbw Workbook -skoroszyt),
l n d m (zbidr wzystkich obiekt6w Ulndm
W - oho),
AddIns (zbibr mzystkich obiehtdw MdIn - doduiek).
Niektdry obiekty q kontenerami dla innych obiekt6w. Przykladowo zbior Workbwks
sktada sip z wstysdcich otwamch obiekt6w Workbook. Z kolei obiekt WorkSook zawiera
inne obiekty. Oto niekt6re z nich:
Worksheets (zbibi obiektdw Norksheet - urbx)),
Charts (zbibr obiektbw Chart- wybes),
Names (zbidr obiektbw Name - nawu).
Z kolei katdy z powytszych obiektdw pmchowuje inne obiekty. Zbidr Worksheets
sktada sis z wszystkich obiektbw Worksheet zawartych w obiekcie Workbook. Obiekt
Worksheet zawiera wiele imych obiekbw. Oto niekt6re z nich:
Chartobjects (zbibr obickt6w ChanObJect).
Range,
Pagesetup,
r PivotTzbles (zbi6r obiektdw PivotTable - ~abelapr=utmvnnu).
Na razie wydaje sip to ragmatwane, ale na pewno z czasem ~Swiadomiszsobie, te hie-
rarchia obiektbw jest doif logiczna i d o b r a zbudowana. Diagram komplemego modclu
obiektowego Excela majduje siq w jego systemie pomocy.
Zbiory
Kolejnym kluczowym zagadnieniem zwiqimym z pmgamowaniem w j p y h VBA sp
zbiory. Zbidr jest gnrp4 obiekt6w tej samej klasy, a sarn w sobic tcil jest obiektem. Jak
wspornnialem wczesniej, h'orkbooks jest zbiorem wsrystkich aktualnie otwarrych
obickt6w Workbook. Worksheetsjest zbiorem wszystkich obitktdw Wbrksheet mjdujqcych
sic w o W l o n y m obiekcie Workbook. Istnjeje motliwoSE pmtwammia calego zbioru
obieM6w lub tylko jcdnego wybranego obiektu. Aby odwotab siq do pojedynczega
obiektu zbioru, nal* jego n a m e lub numer indeksu urniejcif w nawiasach okrqgtych
la nanva z b i m . Oto pnyklad:
Aby o d w h C siq do drugicgo arkusza obiektu Workbook, nalety uZyt odwdania Workshe-
etst2l itd. Istnieje tet zbi4r o nazwie Sheets zbtony z wszystkich arkuszy skoroszytu,
niezale2nie od tego, czy ssq to arkusze zwykk, czy .wykrwu. Jefli arkusz Arkuszl jest
pienvszym arkuszcm s k o r o s w , rnoha odwdat sie do niego w nnastqpujqcy spos6b:
Aby odwolaC siq do obiektu p n y utyciu imtmkcji jezyka VBA, czqsto trzeba go zi-
dentyfikowak, t ~ c q cza p o m o q kropki (nazywanej t e t operatorem kropki) nanvy
obiektbw. Jak p o s t ~ i s zw sytuacji, gdy otwonysz dwa skorosqq. a w katdym z nich
bedzie sic znajdowat arkusz o nanvie Arkuszl? Rozwipnie polega na stworzeniu od-
wotania do obiektu poprzez zawarcie w nim nazwy jego kontenera. Oto przyklad:
W pelnej postaci powytszego odwdania zostanie tet uwzgledniony obiekt Appl icatior;.
Ma ono nastpujaqpostat:
Appl lcation.Workbeoks[ 'ZeSZytl') .Worksheets( "Arkuszl'l .Range("Al0)
Chybtt jut zorientowale.4 sip, do n e g o mierzam. JeSli obiekt Arkuszl jest aktywnym
arkuszem, wyratenie m o a a jeszcze bardziej uproSciC. Oto ono:
Ralrge('A1")
Excel nie posiada c+iektu o nazwie Cell odwo)ujqcego siq do pojedynczej komdrki.
P ~ j e d y m akorndrka jest po prostu oblektem Range skhdajqqm slq tylko z jednego
element".
Samo odwolywanie sie do obiekt6w ljak w powytstych prtykhdach) niczcgo nie daje.
Aby W o n a k iakrrkolwiek wartoJciowa mracie. trzeba odczvtat lub zmodvfikowat
W!uSciwoSci imefody
Tysiqce dosbpnych wMciwo3ci i metod mogq z latwoSci4 pnytloczyb. WyjaSniq teraz.
w jaki spos6b z nich konystat.
1 70 C z e f t Ill + Jezvk Visual Basic for A ~ o l i c a t i o n s
MsgBox, kt6ra wyfwietla okno zawierajqce wartoit komdrki A1 arkusza Arkuszl aktyw-
nego skoroszytu:
Sub ShowVa lue( I
MsgBox Worksheets( "Arkuszl").Range("Al").Val ue
End %b
Po wykonaniu tej procedury w kombrce A1 arkusza Arkuszl pojawi sip wartoff 123.
*
Motest wprowadzid kod 2rbdIowy procedury do rnoduh i poeksperymentowat z nirn.
WlgkszoSC oblektdw ma domydlnq wtafciwoS6. W pnypadku obiektu Range takq
W a 3 c l w o ~ l ~ ~Value.
e s t A zatem jeH1 r kodzie pornlnlety zostanle +ah;uch Value.
uzyskany efekt bqdzle doktadnle taki sarn. Jednak za dobry nawyk uwaia sie
wstawianle wiaSclwoScl, nawet jeSIl jest to wtaSciwoSC dornyllna.
Metody obiekt6w
Metoda jest operacjq wykonywanq na obiekcie. Ponitej pokazano prosty pnykiad.
w ktbrym zastosowano metode Clear obiektu Range:
Sub ZapRangA)
Yorksheets( 'Artuszl") .Range('Al:W') .Clear
End Sub
Sub Capfie( 1
hbrksheets("A~usr1').Range( 'A!"). Copy -
Worksheets("Arkusz1"). Sange( '81' )
End Sub
0biekt Comment
Aby lepiej n m u m i d w44ciwodci i metody obiekty nvrdcq uwagq na szczeg6lny obiekt
o nazwie C m n t . Obiekt ten jest tworzony w rnomencie wprowadzania w kom6rce
komentam, co jest realizawane poprzcz wybranie z menu Wsraw pozycji Komentarr.
Jefli material tawarty w tym punkcic trochp cip przyttoczy, nie rnartw sip. Omawiane
zagadnienia z czasern stanq sip bardziej mzurniale.
Rysunek 7.14.
Mwne
okno pomocy
dotyczace
obiektu
Comment
sp* Motesz by6 zaskcczony shvierdzenlem, te Text zamiast da3clwoSciq jest rnetodq.
ale rozr6Znienle pornigdq wla6ilMbEiarni i metodami nie zawsze jest oczywirte.
Ponadto model oblektow nie jest idealnle konsekwentnv. Tak naprawde moiliwode
odrdtnlenia wtaSciwoSci bd &tod n k Jest Istotna. DO& jest stbsowina poprawna
sktadnia, nie ma maczenia, czy slcwo zawarte w kodde irr5dtowym identyfikuje
174 Cq56 111 + Jezyk Visual hslc for Applications
Metoda Opis
Delete Usuwa kornentarz.
Next Zwraca obiekt Comnenr reprezcntujqcy nastqpny korncntarz.
Previous Zwraca obiekt Comnent rcprrzentujqcy poprredni korncntarz
Text Zwraca lub wstawia tckst korncntarza (pobiera trzy argurnenty).
Zbi6r Comments
Zbidr jest gmpa podobnych obiekt6w. Ka2dy arkusz zawiera zbi6r Comnents ziotony
z wszystkich jego obiektdw C m n t . JeSli arkusz nie zawiera komentarzy, z b i b Com-
ments bqdzie pusty. Ponitsza insmkcja odwduje sic do pierwszego kornentarza arkusza
Arkuszl majdujqcego sic w aktymyrn skoroszycic:
Worksheets( "Arkuszl') . C a m n t ~ ( l )
WlaSciwoSC Comment
Na razie orn6wilem jedynie obiekt C m n t . Obiekt Range posiada tet wMciwo9C o nazwie
Comnent. Jefli kom6rka zawiera kornentarz, wlaSciwoSC C m e n t zwr6ci obiekt Comnent.
Na przyktad ponitsza instrukcja odwohje siq do obiektu Comnt powiqzitnego z ko-
d r k q Al:
JeJli by*y to pierwszy kornentarz w arkuszu, do tcgo sarnego obiektu Comnent rnoaa
odwdaC sip w nastqpujqcy spos6b:
Acti veSheet .C m e n t s( 1)
lnna metoda identyfikacji kolom tta obiektu C m n t polega nautyciu innych obiektbw
podrrgdnych w stosunku do obiektu Comnt.'Oto hierarchia obiekt6w nviqzanych z Q
operacjq
Appl ication (Excel)
obiekt Workbook
obiekt Worksheet
176 Cz#C Ill Jqzyk Visual Basic for Applications I
obi& Corrment
obiekt Shape
obiekt F111Format
obiekt Co1orFom t
Nawiasem rnbwiqc. aby m i e n i t kolor tekstu kornentana, konieczne jest utycie obiektu
TextFrame be&cego obiektem podrqdnym obiektu Comnent. Z kolei obiekt TextFrame
zawiera obiekt Characters, kt6remu podlega obiekt Font. Nastppnie koniecme jest za-
stosowanie wiaSciwo5ci Color lub Colorlndex obiektu Font. Oto przyktad instrukcji
ustawiajqcej dla wiaJciwoSci Col orlndex wartote 5:
Obiekt Appl icatlon p d a d a tct wlaSciwog Sel ectim zwracaj@ odwo)anie do dowolnego
zaznaczonego elementu, k t 6 jest ~ pojedyncq komdkq (akywnli], zakresem korndrek
lub takirn obiektern, jak Chartobject, Textfhx lub Shape. W tabeli 7.3 zawarto ljste wla-
fciwolci obiektu Apol ication pnydatnych w czasie przetwmania kom6rek i zakresdw.
Aby dowiedzid sip, ile w aktpnym oknic m t a l o zamacwnych kombrek, nale2y utyi
wlafciwolci Count. Ota pnyklad:
Obiekty Range
Wiele zadah realizowanych pny W i u instrukcji jwka VBA jest p o w i w y c h z ko-
m6rkami i rakrrsarni arkuszy. W kolicu w tym celu stwornno arkuszc kalkulacyjne. Co
prawda, we wczeSniejszym podmaniu v b & rejestrowania mala (punkt ,Wzglqdne
czy bemzglcdne?") zapozmk.4 sic z przetwananiem kombrek pny utyciu jptyka
VBA, ale musisz zdobyC macznie wipksq wiedze na ten temat.
Obiekt Range zawarty w obiekcie Worksheet sklada sip z pojedynczej kom6rki ark-
lub ich zakresu. W kolejnych podpunktach omdwiq trzy metody odwolywania sip do
obiektu Range przy m i u instrukcji jpzyka VBA. Oto one:
w w h i c i d d Range obiektu Worksheet lub obiektu klasy Range,
R wMciwdC Cell s obiektu Worksheet,
wfaSeiwoSt Offset obieldu Range.
180 CzqfC Ill Jqzyk Visual Bosic for Applications
I
I
Wlaiciwo5C Range
WMciwo3&Range m a obiekt Range. Posiada dwic skladnie:
-
WWciwofC jest powiapna z dwoma typami obiektdw Worksheet lub Range. Stows
kombrkal i kcmbrka2 sq odpowiednikarni terminbw, kt6re Excel traktuje jako identyfi-
kator zakrtsu (pienvsza sktndnia) i jego granicc (druga sktadnia).
Ponadto do korndrki, ktdrq b+ie komdrka 82, jest wstawiana wartoh? 5. Innymi slowy,
m 6 c o n e odwdanie jest wzglpdne w stosunku do g6mego lcwego narotnika obiektu
Range. A zatem instrukcja wprowadzi wartoff 5 bezpodrednio do kom6rki majdujqcej
sie na prawo od aktywnej kom6rki i jeden wiersz ponitej.
Troche to zagmatwane. Na s z c e c i e istnieje o wiele bardziej m z u m i a h metoda uzy-
skania dostppu do komdrki wzglpdnej w stosunku do z h e s u . Opiera sip na wlaiciwoici
Offset. M6ra zostanie ombwiona po nastppnym podpunkcie.
Wla5clwoBC Cells
Kolejna mctoda odwolywania sip do zakrcsu polega na zastosowaniu whiciwofci
Cells. Podobnie jak w pnypadku whiciwofci Range, wla4ciwoSC Cells jest utywana
w stosunku do obiekt6w Worksheet i Range. Aby z niej skorzystaf, rno2na poshtyf siq
jednq z trzech skhdni:
oblekt.C?lls[mInde%.colmlndex)
obiekt .CellsVcwlnde%)
obiekt.Cells
M m a tet utyC wMciwoSci Cells obiektu Range. W tym pnypdku obiekt Range zwracany
pnez w ~ i w o X Cells jest wzglpdny w stosunku do g6mej lewej kom6rki obiekm Range,
do kt6rego jest wykonywane odwdanie. Zagmatwane? Raczej tak. Kolejny przyklad
mote sprawif, te stanie siq to przejrzystsze:
Instrukcjq tp m o ~ opisak
a za pornocq nastqpujqcego zdania: ,,Ftozpoczuij od aktywnej
kombrki i pryjmij. t e jest ona kom6rkqA1, a nastepnie uzyskaj kom6rkp majdujqcq sip
w dmgim wierszu i pienvszej kolumnie".
W drugiej skkidni w W i d c i Cells jest utywany jeden argument ktbry mote prryjmowat
wartoSci z przedziah od 1 do 16 777 216. Wartoif jest rdwna liczbie komdrek arkusza
(65 536 wierszy x 256 kolumn). P o c w y od kombrki A l , kom6rki sq numerowane do
korica w prawq stronp, a nastppnie od pocqtku nastepnego wiersza Na pnykhd 256.
-
kornorkq jest I'J1, natomiast 257. kom6rka A2.
W nastqpnym pnykladzie do kom6rki H3 ljest 520. kom6rkd aktywnego arkusza wpm-
wadzono wartodf 2.
Activesheet .Cells[520) - 2
Aby wygwietlif wart036 ostatniej kombrki arkusza, n a l c g u2yt nastppujqcej insmukcji:
Taka skiadnia mote tet zostaC u@ta w przypadku obiektu Range. W tym wariancie
M c o n a kom6rka jest wzglpdna w stasunku do obiektu Range, do kt6rego siq odwolano.
Jeili na pnyklad obiekt Range jest zakresem A1:DlO (40 kombrek), wlaSciwoiC Cells
mote pobraC argument o wartohi z przedziah od 1 do 40 i m 6 c i C jednq z kom6re.k
obiektu Range. W ponihzym ptzykhdzie wartoif 2000 jest wprowadzana do komdrki
A2, poniewat jest to piqta komdrka zakresu (Iicqc od gdry i w prawq stronp, a nastqpnie
od poczqtku nastqpnego wiersza), do kt6rego siq odwoiano:
&* W popnednim pzykladde argument wtahlwdci Cells nie jest ogranlczony do wartokl
(,!$ z przedziatu od 1do 40. JeSli wartoSC argumentu przekracza liczbe komCkek zakresu,
diczanie jest kontynuowane tak, jakby zakres byt wlgksry nit w rzecqwisto8ci. A zatern
inst~kcjapodobna do powyiszej moze zmienlC wartosf komdrki spoza zakresu A1:0?0.
Trzecia skhdnia w ~ c i w o S c iCells po pmstu zwraca wsystkie kom6rki arkusza, do ,
ktdngo jest wykonywane odwdanie. W praeciwierlshlie do M c h powstalych s k w i .
w tym pnypadku nie jest m c a n a pojedyncza komdrka. Ponitsza instrukcja u t y a
metody C l earcontents w stosunku do zakresu zwrdconego przez wlaSciwoSC Cell s ak-
rywnego arkusza. W wyniku wykonania instrukcji czyszczona jest zawartoSC ka2dej
komdrki arkusza.
Wlaiciwoii Offset
WlaSciwoSf Offset (podobnie jak wldciwoSci Range i Cell s) te2 m c a obiekt Range.
Jednak w pneciwienstwie do dw6ch poprzednich, wlaSciwo9C Offset jest powiqzana
tylko i wy4qcmie z obiektem Range. Oto jej sktadnia:
Rozdzial7. + Wprowadzenie d o jezyka VBA 183
Nawiasem m6wia.c, jeSli aktywna kom6rka znajduje sic w wierszu 1, wlaSciwoid Offset
z powytszej insmkcji spowoduje wygenerowanie Medu, poniewat nie b ~ d z i emogla
obiektu Range, kt6ry nie istnieje.
Zarefestrujwykonywane aperacje
B a wqtpicnia najlepsq metodq zaznajomienia sip z jmkiern V B A jest po prostu uak-
tywnienie rejestratom makr i zapisanie kilku operacji wykonywanych w Excelu. Jest to
szybki spos6b zdobycia wicdzy na temat obiektbw, wtafciwoici i rnetod stosowanych
w okreilonym zadaniu. Jeszcze lepsze jest obserwowanie rnodutu VBA, w ktbrym ge-
nerowany jest kod, podczas rejestrowania makra.
Rysunek 7.15.
T ~ p o w eokno pomocy
doiyczqcej VBA
&$** Okno pornocy pokazane na tysunku 7.15 nle prerentuJewszystklch tematbw. Dopiero
po kliknislu hipertqcza Show A l l zostanle wy5wietlona petna zawartogd tematbw.
Rysunek 7.16.
Nanedzie
Object Browser
jest znakomitym
fr6dfern
infomacji
1. Rozdziat 7. + Wprowadzenie do jezyka VBA 187
Lista wrwijana w g6mym lewym narotniku narqdzia Object Browser zawiera wszystkie
udosttpnione biblioteki obiektdw:
sam program Excel
MSForms (utywana do tworrenia niestandardowych okien dialogowych),
W c e (obiekty wspdlne dla wszystkich aplikacji pakiehl Micrasofr Ofice),
Stdole (obiekty automatyzacji OLE),
Od ego,co zostanie wybrane na IiScie rozwijanej, zalety zawutoft okna Classes. Z kolei
zawartog okna Members of zalety od tego, co zostanie zamaczone w oknie Classa.
Poczqtkowo m q d z i e Object Browser mote wydawad sir dotone, ale z czasem jego
pnydamoSt wnasta.
Na dobry pocqtck zaprezentujp prostq procedurq Sub jqzyka VBA. Ponitsq kod ir6-
dlowy urnieszcmny w module VBA oblicza sump pierwszych 100 liczb calkowitych.
Po zakoliczeniu obliczeh procedura wygwietli komunikat zawierajqcy wynik.
Sub VBA-Dem(
' Przyklad prostej procedury jezyka VBA
O i m Total k Integer. 1 As Integer
Total = 0
Next i
-
For i = 1 To l D D
Total Total + 1
MsgBox Total
End Sub
Procedura zawiera kilka czpsto stosowanych element6w jpzyka VBA, w tym komentarz
-
pnypisania ( T o t a l 0 i Total-
(wiersz rozpoczynajrlcy sip apostrofan), dwie mienne (Total o r q i), dwic instrukcje
smktuq p@li (For . . . Next) i wbudo-
T c t a l + i),
wan&funkcjq (MsgBox). Wszystkie te elemmty zostanq ombwione w kolejnych punktach
rozdziahl.
190 CzeJt Ill + Jezyk Visual Basic lor Applications
x
End Sub
- -
Sub OneLi ~ e )!
1: y 2: z - 3 : MsgBox x + y + z
Jednak kod fr6d)owy jest czyteinlejszy po urnieszczenlu w kaMym wierszu tylko jedne] instmkcjl:
Sub OneLine( )
x - l
Y-2
2 -
nsgeox x
3
- y + z
End Sub
Katdy wiersz moie mi& dowolnq bugoSC. W trakcle zmlenania do prawego k o k a wiersza zb
wartost okne modutu VBA jest pnewljana w lewo. W przypadku dluglch lnstrukcji motna utyC
sekwencji zloionej ze spacji i znaku podkreflenla, oznaczajqcej kontynuacje instrukcji w nastepnyrn
wierszu. Oto pnykfad:
SU& LongLl ne( )
5mwdValue -
~orkshee~s('Artusz1') .Range("Al') .Value + -
krorksheets( 'Arkusz2"). Ranse! "Al') .Value
End Sub
Prry rejestrowaniu makr Excel w s t o ufywa mak6w ~ l e n i wacdu podzlelenla dtugch instrukqi
na wlele wierszy.
Po wpmwadzenlu lnstrukcji Interpreter jezyka VBA w celu zwipkszenla czytelnolcl wykonuje na-
stepujqce operacje:
I Pomiedzyoperatorarnl wstawla spacje. Pnykladowo pa wprowadzeniu InstrukcJlAns-1.2
(bez spacfl), Interpreterjezyka VBA zamleni jq do postaci:
Ans -
1+ 2
. zmienia odpowiednfo wklkofC makdw zawerlych w sbwadr
Interpreterjpzyka K34
kluczowych orsz w namach w(a8ciwo~cIImetod. Po wprowadzenlu nastepujqcego lakucha:
Result-activesheet.range:"al").value-12
- Interpreter jqqka VBA zamienl go do postaci:
-
Result ActiveSheet.Rz~get"a1").Value-12
Tekst zawarty w znakach cudzystowu (w tym przypadku "al") nie jest rnodyfikowany.
Poniewat w mzwach mfennych j w k a VBA nie lest rvzr6hiana wielk-036 znakbw, interpreter
domySlnie u j w s w nlch llter takiej samej wielkoScl, jak w mzwie, ktdrq wprowadmnojako
ostatnig. Jefll na przykhd na poczqtku wpmwadzikS zmiennq nyvalue (tylko male literyl.
a nastqpnle zmiennq &Value (potqczenie dutych I matych liter), intefpreter j m a VBA
w przypadku wsrystkich kolelnych vrystppid tej zmiennej wQe n a y MyValue. Wyjqtkiem
jest sytuacja, gdy mienna zostanie zdeklarowana pny utyciu s h a kluczowego D i m
lub podobnej instrukcji. W tym pnypadku nama zrniennej bqdzle miata takq postad.
jak w wierszu dekiaracji.
Interpreterjezyka VBA spra- i n m k c j e pod k e r n W d 6 w sklahi. J e l l majdzie blpd,
zmienl kolor wiersza I mote wySwletllb komunikat oplsujqcy problem. Okno dlalogowe
Oprions (uruchamiane w edytone Visual Basic przez wybranie opcji Options w menu Tools)
urnolllwla okreSlenie koloru wdnego wiersza (zaktadka Editor Format) i tego, czy zostanie
wySwietlony kornunlkat b@du (uiy] opcji Auto Syntax Check w zaWadce Editof).
Rozdzid 8. + Podstawv ~roaamowaniaw iemku VBA 191
Komentarze
Komentarz jest tekstem spelniajqcym funkcjq opisu zawartego w kodzie 2rodiowym.
Interpreter jpzyka VBA cdkowicie ignmje zawartoff komentarza. Warto cqsto stosowaf
komkntarz=bb opisu przeznaczeni&nstikcji, poniewat nie zawsze jest to oczywiste.
Wyiwietlmle nyniku
hgBox z
End Sub
Pasek narydzi Edif edytora Visuaf Busic posiada dwa bardw przydame przyciski. Po
wybraniu p p y inmkcji, w celu mmienienia ich na komemara nalety kliknqt pqcisk I
W j w k u VBA nie jest mroPd2niana wielkoSC mak6w. Aby nazwy by@ bardziej
czytelne, progamifci c q s t o stosujq maki r 6 h e j wielkoSci (na przykfad
InterestRate zamiast Interestrate).
w W nazwach nie motna stosowak spacji lub kropek. Aby nazwy byly bardziej
czytelne, pmgramiki c q s t o utywajq maku podkreflenia (Interest-Rate).
W specjalnego typu utywanych
W nazwach nie motna umieszczad ~ a k 6 w
w deklaracjach (#, S, & lub !).
Nazwy mogqzawierat maksymalnie 254 maki. Jednak nikt rozqdny nie tworzy
z m i e ~ y c ho tak dhgich nazwach!
Poniiej mwarto kilka przykiadbw i n m k c j i pnypisania stosujqcych r6tnego typu
zmimne. Nazwy miennych majdujqsie po lewej stronie znaku r6wnofci. W ka2dej in-
strukcji miennej jest pnypisywana wartosd widoczna po prawej stronie.
x- 1
InterestRate 0.075- -
-
LoanPayoffAnount 243C89
DataEntered Fals?
x - X + l
nyt(urn --YourHun 1.25
-
UserNm 'Jan N w k "
Datestarted #2/14/90#
Jtzyk VBA posiada zastmetone sIowa Wucrowe, kt6rych nie motna utywaf w roli nazw
m i e m y c h lub proccdur. JeSli Uyjesz jednego z tych slow, zostanie wygenerowany
kornunikat Wu. ChoC na prryktad mbzetone slowo Next mote byf bardzo nozumia+q
nazwq z m i e ~ c j to
, jednak po zastosowaniu ponitszcj instrukcji zosranie wygenerowany
a d sktadni:
Next - 132
W tabeli 8.1 zawarto typy danych wbudowane w jqzyk VBA. M o h a tet zdefiniowat
niestandardowe typy d ~ y c h ktdre
, ornbwiono w dalszej czqtci rozdziah w punkcie
zatytulowanym ,,Typy danych definiowane przez utytkownika".
Typ danych Declml wprowadzono w Excelu 2000, dlatego nie mote by5 stosowany
r popnednich wersjach apllkacjl. Jest to nle+pmy typ danych. poniewat w+aStiwle
nle jest motliwe jego zdeklarowanle. Tak naprawde jest to pocflyp typu Variant. Aby
zamieniC typ danych Variant na typ Decimal, konlecmejest u*ie funkcji CDecjezyka VBA.
Zamyczaj najlepiej posluZyC sig typem danych, ktdry zajmuje najmniejsq liczbp baj-
t6w i jtdnoczdnie obshguje wszystkie dane, kt6re zostanqz nim powiwne. W trakcie
pnetwamnia danych przez interpreter jpzyka VBA szybkoSC dziatania zalety od liczby
bajtow b~dpcychdo dyspozycji. fnnymi stowy, im mniej bajt6w utyjq dane, tym sqb-
ciej interpreter jqzyka VBA uzyska do nich dostpp i j e przetwony.
O M l a n k w y d a j d typu danych V d a n t
Aby pnekonaC sie, czy typ danych o d g p a wetnq roe, stworrykm ponltszq procedure wykonujqcq
w rarnach petll kllka warto5ciowych obllczefi i wyswietlajqcq catkowity czas pnetwarzania:
Sub TimTest (
Dim x As Integer. y As Integer
Dim A As Integer. B As Integer, C As Integer
O i m 1 As Integer, j As I n t e r
Dim StartTine As D a t e . EndTim k Date
a
-
Zapisuje czas pazittkouy
S t a r t T i m Timer
Wykonuje k i l k a o b l i u e r l
x-0
Y - 0
- -
For 1 1 To 5000
For j 1To 5000
A - x + y + t
e - y - x - 1
C - x - y - i
Next j
Next i
a
-
iobiera koricouy c z a s
EndTim T i w r
W y k l e t l a calkouity u a s wyratony w sekundach
MsgBox Format(EndTirre - StartTim?. "0.0')
Erd Sub
W molm systemie wykonanle p m d u f y zaJ+ 5.2 sekundy (czas mote byC lnny w zaleinofci od
srybwci promora). Nastepnle wylqqlern inrtrukcje D i m deklaruJqcetypy danych. Omacza to,
te zamienlkm Je na komentane popnez urnleszczenie apostrofu na pocz$ku katdego wiersza.
W efekcle Interpreterjezyka VBA uiyl domy5lnego typu danych Variant.
Pmame W a n l e pmcedury zaJ6-o14,7 sekundy, cEj(l bwdu prawie bzy razy dkttej nit wmfniej.
Wnlosek lest prosty. JeSli z a l e j cl, ahy aplikacje napisane w Jezyku V6A dzlataty szybko, naleiy
zdeklarowaC mienne!.
Skorosryt zawierajqcy kod frddlawy msjduje sie na d&qczonym dysku CDROM.
196 CzeSt Ill Jezyk Visual Basic for Appflccltions I
Deklarowanie zrnlennych
lefli nie zdddarujaz typu danych dla zmiennej, interpreter poshky siq domySlnym ty-
pem V a r i a n t . Dane przechowywane przy W c i u typu danych Variant sq jak kameleon:
zrnieniajq sw6j typ w zalehoSci od tego, w jaki sposbb sq przetwarzane. Ponitsza pro-
I
cedura demonstruje, w jaki spos6b mienna mote ppnjmowat r 6 h e typy danych:
---
Sub VariantDwno(
HyVar '123"
UyVar MyVar / 2
RyVar "Wynlk: ' & MyVar
nsghx MyVar
End Sub
--
Sub VartantDemo2()
MyVar "123'
-
HyVar MyVar + MyVar
MyVar 'Wynik: " d HyVar
Msghx MyVar
End Sub
-
Sub VariantDwnoZO
HyYar "123'
Wsghx
HyVar - TypeNametHyVar)
Pjvar / 2
Wsghx
HyVar
Hsgbx
- TypeName(bVar
"Nynik: ' & HyVar
TypeNarn?(~FyYar) . ~ . .
I
Hsgbx MyVar
End Sub
-.
.
W tej e j j i pa kazdej iashukcji przypisaniajest wySwietlany typ danych miennej HyYar.
I
Najpienv mienna przeehowuje Mcuch, nastqpnie jej typ danych m i d sic na Double,
wreszcie na koncu ponownie anienna jest typu kiticuchowego. ' . i1
. .
. - - . . +-... . .. ~ .. .. . ... ~ *
I
Rozdziat 8. Podstawy programowania w jezyku V M 197
Szcqblnie wartokiowym nawykiem jest deklarowanie katdej mimnej pned jej uiyciem.
Deklaraja zmimnej pnekazuje intetpiWfowi jezyka VBA jej nazwp i tn, danych. Dziqki
deklarowaniu miennych uzyskuje sip dwie podstawowe korzysci:
Programy dzialujq srybciej i d e h n i e j korystajq r pamieci. DomySlny typ
danych Variam powoduje, t e interpreter jpzyka VBA wielokrotnie wykonuje
czasochtome sprawdzenia i -a wipcej pamipci, nit jest to konieczne. Jesli
interpreter m a typ danych, nie musi go okreSlaC i mote wykorzystat pamipf
w iloSci wystarczaj~cejjedynie do zapisania danych.
Unika si~probfemdw miqzanych r Mcdnie wprowad-onyrni na-?.vamimiennych.
W tym prsypadku zakhda s i ~t,e jest uiywana opcja Dpt;on E x ~IiC Ir e
wymuszajqca deklarowanie wszystkich zmiemych (zapomaj s i z~zawartoiciq
nasypnego podpunh). Zal6my. t e utywasz nierdeklarowanej zmiennej
-
o nazwie CurrentRats. W okreilonvm mieiscru o r o c e d w wstawiasz instrukcie
pnypisania CurentRate .075. ~'bardzd trudna do Gkrycia niepoprawnil '
wprowadzona nazwa zmiennej prawdopodobnie spowoduje wygenerowanie
p m z procedw nieprawidtowych wynikbw.
Zasiqg zmiennych
Zusiw'en zmimnj o)rrcfla sip moduly i procedury, w kt6rych rnotna jq zastosowat.
W tabeli 8.2 wymieniono typy zasitgu miennych, z M6rych motna korzystak.
Zmienne lokalne
Zmienna lokalna jest m i e m q deklarowanq wewnllpz procedury. Zmienne lokalne mogq
by6 w a n e wylqcmie w procedurn, w ktdrej zostaw zdcklarowane. Po zakonczeniu
procedury mienna lokalna przestaje istnied i Excel zwalnia zajrnowanq przez niq pami&.
JeSli zalety ci na utrzymaniu pnez zmlennq pnechowywanej wartoScl, nalety
zdeklarowaC jq przy u ~ l stowa
u kluuowego Static. Zapoznaj sle z zawartosciq
podpunktu "Zrnienne statyczne" zamieszczonego w delszej czeSci rozdziatu.
Najczgtsy sposdb deklarowania miennej lokalnej polega na umieszczeniu instrukcji
D i m pomipdzy instrukcjami Sub i End Sub. Instrukcje D i m za~wyczajsq umieszcmne bez-
pofrednio po instrukcji Sub i pned kodem trddtowym pmedury.
Ostatnia instrukcja D i m nie deklaruje typu danych, a jedynie name miennej. W efekcie
zmienna staje sip zmiemq typu Variant. Nawiasern mdwiqc, przy uiyciu instrukcji D i m
rnolna t c t zdeklarowai: kilka miemych. Oto p n y h d :
D i m x As Integer, y As [nteger, 2 As Integer
Dim First As Long. Last As Double
Rozdzid 8. + Podstowy programowania w jeryku VBA 199
buble #
Currency @
String S
Taka metoda deklamwania typ6w danych wtaSehvie jest pozostafoSci~jezyka BASIC. Lepie]
deklarowd zmlenne ptzy utyciu metod omdwionych w tym rozdziale. Znaki deklarulqce typ da-
nych zostaty wyrnienione tylko na wypadek spotkania sie z nimi w starszych programach.
-
W pneciwierSshvie do kilku kzyk6w, jezyk VBA nle umotliwla deklarowania g m ~
-< zrnlennych utyvaj!qcych okrellonego typu danych popfzez oddzielenie ich prz'ecinkami.
Przyktadowo ponitsza instrukcja, pornimo te jest poprawna, nie dekiaruje wszystkich
zmiennych przy utyciu typu danych Integer:
O t m 1 , j. k As Integer
W przypadku jezyka VBA tylko zmlenna k bqdzie typr Integer. Pozostate zmienne
zostanq zdeklarowane przy utyciu typu Variant. Aby zdekla- zrnienne i,j i k
jako zmienne typu Integer, nalea uw
nastepujqcej instmkcji:
D i m i As Integer. j As Integer. k As Integer
JeSli a i e n n a zostanie zdeklarowana jako lokaia, inne pmedury zawarte w tym sa-
mym module bedqmogly utyC zmiennej o identycmej nazwie, ale ka2dy jej egzemplarz
bdzie unikatowy w rarnach pmcedury. w ktdrej go zdefiiiowano. Zazwyczaj zmienne
lokalne sq najefektywniejsze, poniewai po zakodczeniu wykonywania procedury inter-
preter jpzyka VBA zwalnia pamieC przez nie -%
Sub HySubO
[ W t y m m l e j s c u m a ~ d u ~ e s i e k otr6dlowy.l
d
End Sub
Sub Yoursub( )
[W tym miejscu znajduje s i t t o d 2rklct)wy.I
End Sub
Wartoid ztnienmj dost~pncjw calym module nie nnienia sie pa Fakohczeniu wykonywa-
nia procedury. Wyjatkiern jest sytuacja, gdy procedufa jest zatnymywana przy utyciu
instrukcji End. Gdy interpreter jezyka VBA napotka instrukcje End, wszystkie mienne
dostqpne w module utracq swoje wnndci.
Zmlenne globalne
Aby udosypnib anisma wszystkim procedurom zawanym we wszystkich modulach
VBA projektu, nalety na poziomie moddu zdeklarowaC a i e n n a przy utyciu stowa
kluczowego Public zarniast instrukcji Dim. Oto przykM:
a Public CurrentRate as Long
-
Zrnienne statyczne
Z r n i e ~ estatyczne to szcng6lny pnypadek zmiennych. Sq deklarowane przy utyciu
slowa kluczowego Static na poziomie procedury i utnyrnujq swoje wartofci po zakon-
cteniu jej wykonywania (chyba t e procedura zostanic zakohczona instrukcja, End). Oto
przyktad:
Sub Mysub(
Static Counter as Integer
[W tyn mlejscu znajduje s t e kod tr6dlwy.l
End Sub
Zastosowanie statych
WartoJt zmiennej czesto sip zmimia w trakcie wykonywania procedury. Z tego wta6nie
powodu element ten nosi nazwp zmiennej, Czasami koniecme jest odwolanie sip do
niemiennej wiutoici lub hicucha, ktbrym nadano nazwt. W tym przypadku mamy do
czynienia ze sraiq.
Deklarowanle stalych
State sq deklarowane pw utyciu instrukcji Const. Oto kilka przykladbw:
-
Const NuiQuarters as Integer 4
- -
Const Rate
Pub1i c
.0725. Period 12
Const AppName
-
Const ModNam as Strlng "Hakra budletu"
as String - 'Ppl ikacja budtetu"
Stale, podobnie jak mienne, posiadajq zasiqg. JefIi s t a h ma byt dostqpna na obszarze
pojedynczcj procedury, w celu pnypisania jej mli stakj lokalnej nalety zdeklarowat jq
po instrukcji Sub lub Function. Aby udostcpnit rrta1q wszystkim procedurom modutu.
naleky zdeklarowat jq przed pienvsq proceduq modulu. Aby udostqjnik stalq wszyst-
kim modulom skomzytu, naleZy utyC shwa kluczowego Pub1 i c i zdeklarowat jq przed
p i e m q proceduq rnoduh. Oto pnykhd:
Publlc Const InterestRate As b b l e - 0.0725
202 CzeJC Ill + Jezyk Visual Basic for Applications
Stah xlLandscape odkrykm w tmkcie njestrowania rnakra. Poza tym informacje na jej
temat malaztem w systernie pornocy. Po uaktywnieniu opcji Auto List Members, p n y
wprowadzaniu kodu fr6dkwego czpno motna uzyskaf pomoc. W wielu przypadkach
jezyk VBA wyiwietla listq wszystkich stalych, ktdre mogq byC pnypisane do wlakiwofci.
Zastosowanie lahcuch6w
J e y k VBA, podcbnie jak Excel, urno2liwia manipulowanie zarbwno liczbarni,jak i tekstem
Oaricucharni). W przypadku jpzyka VBA m o a a wyr6tniC dwa typy ldcuch6w:
W faricuchy o stalej dugdci deklarowane pny utyciu SciSle okrellonej liczby makbw
(maksyrnalna dhgosf lancucha wynosi 65 526 znakdw),
fahcuchy o niennej dhcgdci, M6m teoretycmie mogq zawiemd do 2 miliard6w
mak6w.
Katdy znak Mcucha wymaga 2 bajt6w. Dodatkowa niewielka przest1ze6 potnebna jest
do p~echowywanianaglbwka katdego Iahcucha Podczas deklarowaniu miennej WICU-
chowej przy utyciu instrukcji Dim, znajqc diugdt Wcucha, m o h a jq ok~eSliC(ldcuch
o stakj dtugdci) lub urnotliwit interpretmowi jezyka VBA wykonanie zadania w spodb
dynamicmy (laficuch o zmiennej dhgoki).
1 Rozdziat 8. + Podstowy programowanio w jezyku VBA 203
Zustosowonie dot
Oczywi.4cie do przechowywania dat mote zostaC utyta zmienna Mcuchowa, ale w tym
przypadku nie jest rnotliwe wykonywanie obliczeh. Do przetwarzania dat lepiej zasto-
sowat typ danych Date.
Zrnienna, dla kt6rej zdefiniowano typ Date, zajmuje 8 bajt6w pmipci ijest w stanie prze-
chowywaC daty z pmdztah od 1 stycznia 100 roku do 3 1 grudnia 9999 roku. Jest to prawie
10 000 lat, c y l i o h w zupehoSci wystarczajqcy nawet w pm/padku najbardziej agresyw-
nych prognoz fbnsowych! Typ danych Date nadaje sie te2 do pmchowyvania danych zw$-
m y c h z czasern. W jmku VBA daty iczas q umieszaanepomiedzy dwoma makami #.
s??.
CW,'.'
-
Przedzlat dat o b s l o ~ n przez
y lea& VBA lest maunle wlekszv nlt w pmadku Excela,
'
gdzle rozpoczyna s k od1stycGia 1900roku. A zatem dla p & n o f & nie naleiy
w arkuszu stosowa6 dat wykraczajqqch poza przedziat dat obstugiwany przez Excel.
-
Const FlrstDay As Date
Const Noon #12:00:00#
- #1/1/2001#
JeSli do wy4wietlmia daty utyjesz okna kornunikatu, data zostanie pokazana zgodnie
z systemowym formatem M t k i e j daty. Podobnie czas jest wyhvietlany z uwzgl&ieniern
systemowego foml~tuczasu (12- lub Z C g o d z i ) . W celu miany ustawieri systemowych
nalety w oknie Punel sterowanin wybrat pozycjp Opcfe regionalne ijpykowe, a na-
stqpnie uaktywnit d l a d l q Opcje regionnlne (system Windows XP).
Na dotwzonym dysku CDROM majduje slp stwoizony przeze mnie dodatek Excela
0 MI. Me?ded Date Fu"C~~ON Navis%nyw jeqku "81. dodaje do Excela now.
funkcje arkusza. M6re urnotliwiajil hvorzenie l o n u t prz3twarzajqcych daty spczed
1 stycmia 1900 roku.
Instrukcje pnypisania
Imwukcja przypisania jest insmkcjq jezyka VBA wykonujqcq matematycme obliaenia
i ptzypisujqq wynik zmiennej lub obidaowi. System pomocy Exccla definiuje wyrn-ie-
nie jako kornbinacjp s t w kluczowych, operatorbw, micnnych i stalych zwracajqcych
laticuch. liczbq lub obiekt, Wyratenie takie mote wykonad obliczenie, manipulowac
makami lub tcstowat danc.
Nie moglemtcgo lcpiej zdefiniou&. Wiqksz& p pro~ramistycznychopartych na j p k u
VBA jest zwi-ch z twomiem wym&i o m wykqwaniem i ufllwaniern w nich W d w .
Jefli umiesz OvonyC h u l y w Excelu, bez h p a t u Edefiniujesz wyratenia w j ~ k VBA.
u
W prypadku formub arkuswwej Excel wygwietla wynik w kombrce. Z kolei wyratenie
jqzyka VBA mote zostat pnypisane zmiennej lub u v e jako wartog wMciwofci.
W jqgku VBA funkcjp operators przypisania spehia mak r6wndci. P o n h j podano
kilka pnykfadowych instrukcji przypisania (wy-nia majdujq sit po prawej smnie
maku rbwnohi):
x - 1
% - *-
x-x+l
Filmen
(y 2 ) 1 (Z * 2)
FlleOpen -
True
Not
Range('Rok') .Value -
FlleCpen
2004
Jmk VBA obsluguje tet takie same operalory pdwnania, jak form* Exceta. Sq to
operator hvndci (-), wiekszy n i t (>I,mnicjsg nit (c), wiqks~ylub rdwny (r)mniejszy
,
lub rbwny (<-) i nier6wnoSci (<>). Pondto jezyk VBA ofemje pehy zestaw operator6w
logicrnych pakazanych w tabeli 8.3. Aby uzyskai: szczegbtowe i n f m a c j e o tych ope-
ratorach, nalety posIu2yC siq systemm pomocy jpzyka VBA.
Rozdziat 8. + Podstawy programowania w jpzyku VBA 205
Operator Pnanaczenie
Ncgacja logicma wyatcnia
Koniunkcja lbgicma d w h h wyra2d
Suma logicma drv6ch wyratm
Nicr6wnowatn0&5logicma d\vdch wyratcfi
R6wnowatno96 logicma dw6ch wyratcn
lmplikacja logicma dw6ch \r?.ra.tch
KolejnoX stosowania opmtor6w w jezyku VBA jest d o k d n i e taka sama, jak w Excelu.
Oczywiicie w celu zmiany naturalnej kolejnofci ich utywania motna zastosowa6 na-
aiasy okragk.
Ponitsza instrukcja u w a operatora No: w celu wyiwietlania i ukrywania linii siatki
w aktywnyrn oknie. WlaSciwoSf DisplayGridlines pobiera wart056 True iub False.
A zatern zastosowanie operatora Not spowoduje. zmiane wartoici z Fa 1 se na True iub
z True na Fa1se.
ActTveWindow. DlsplayGridl ines - Not ktiveClindow. DisplayGrldl ines
Tablice
Tablica jest grupq elementhw tego samego typu posiadajqcych wsp6lnq nazwp. W celu
odwoiania sic do okr&lonego elementu tablicy nale2y uZyt jej nazwy i numeru indeksu.
prsVMowo mo2m zdefiniowat tabliq i3020n~z 12 zmiennych Mcuchowych, z kt6rych
k&da odpoyiada nanvie miesiqca. JeSli tablica zostanie nazwana MonthNames, w celu
odwo$n& sie dn jej p i m z e g o elementu n a l e utyt instrukcji MomhNa~s(O1,do drugiego
elementu MonthNams(1) i tak dalej at do mstrukcji MonthNames(l1).
Oeklarowanie tablic
Padobnic jak zwykla zmienna, tablica m a wstat zdeklmwana p r y ugrciu instmkcji
Dim lub Public. Istnjeje t e t motliwofC okreSlenia liczby element6w tablicy. W tym celu
w nawiasie o k & p nakty podaC numcr p i m z e g o indeksu, sbwo kluczowe To j numer
206 CzqfC Ill + Jtzyk Visual Basic for Applications
s> Pny deklarowaniu tablicy konieczne Jest podanleledynle g6mego indeksu, Interpreter
].Ma VBA ptzyjmuje domy5lnle, h dolny indeks ma wart056 0. A zatem efekt
dzialanla dwdch ponitszych instrukcjl jest taki Sam:
D i m MyArray(0 To 100) As IntEger
D i m MyArray(100) A61 Integer
W obu przypadkach tablica sktada sig ze 101 element6w.
JeSli chcialbyl, aby w przypadku wszystkich tablic, w kt6rych deklarowany jest tylko
gbmy indeks, interpreter jpzyka VBA stosowal dolny indeks o wartohi 1, przed pierwsq
procedurq moduh naleg wstawiC nastqpujqq instrukcjp:
Option Base 1
Takq tablice moima traktowat jak m a c i m 10 x 10. Aby odwdat sip do okdlonego
elementu tablicy dwuwymiarowej, koniccme jest podanie dwdch numezfiw indeksu.
P o n h j pkazano, w jaki sposdb uqdat dostep do wartofci zawutcj w powyzvej tablicy:
Tablicp Wbjwymiarowq motna z kolei W w a t jak smhian. Jednak nie jestem w stanie
wykonat wizualizacji rozmiesmnia danych tablicy posiadajqxj +ej nj2 trzy wymiary.
Z r n i e ~ obiektowe,
e podobniejak nvykie mienne, sq deklarowane przy W c i u instrukcji
D i m lub Pub1 lc. Ponijsza instmkcja deklaruje zmiennq InputArea jako obiekt Range:
Public InoutArea as Range
Po zdeklarowaniu miennej MyCell jako obiektu Range, instrukcja Set pnypisuje do niej
obiekt. Zamiast dhdsLcgo odwdania postaci Worksheetsl("Arkuszl" 1. Range( "Al') w ko-
lejnych insfmkcjach b@zie motna zastosowaCjej.prostsq wersjq, czyli Mycell.
Mestandardowe t y danych
~ sq deflniowane na poczmu rnodulu pned jakqkolwiek
pocedurq.
Katdy a 100 element& tablicy sklada sip z cdcrceh kompomnt6w (drreSlonych w nie-
standardowym typic danych CustmrInfo). Do okreJlonego komponenm nkordu m o h a
sie odwotaC w nastqujqcy spodb:
Custanrs( 1) .-ny
-- -
"WarzMzla Pane"
C u s t m r s ( 1) .Contact 'Jan Nowak'
tustmrs(l).Sales -
Custcmrs(l).Regiontode 3
150677
Funkcje wbudowahe
.~,
J@ YBA, p b b n i e j& wi&sm&j&& program~wa& oferuje wbudowane funkcje
upraszczajqcc obticzenia i opracje. C w t o funkcje umo2liwiajq wykonanie operacji,
Mdrych d i z o w a n i e w pneciwnym razic byhby trudne, a nawet nicmotliwe. Wiele
hnkcji jeyka VBA jest podobnych do funkqi arkusza Excela (czasami sq identycme).
Na przyktad funkcja UCase jpzyka VBA zmieniajqca male maki hicucha na dutc jest
odpowiednikiem excelowskiej funkcji LITERY .WIELKIE.
Rozdzid 8. + Podstawy progromowania w iezyRu VBA 209
a4 W dodatku B zamieszczono kompletnq liste funkcji jezyka VBA wraz z krdtkim opisem
katdej z nich. Wswtkie funkcje zmtaty doktadnie objaSnione w m
jezyka VBA.
.,i wmocy
Aby uzyskaC llstg funkcjl Jgzyka VBA w trakcie wprowadzanla kodu frddiowego, naleiy
wpisaC sbwo kluczowe VBA, a za nim kropkg. Edytor Visual Basic wySwietli list?
wszystklch podlegajwh mu elementbw. w tyrn funkcje (rysunek 8.1).Obok funkcji
jest widocma zielona ikona. JeSli okaze si?, te lista sig nle pojawla, nalety sprawdzid,
czy uaktywniono opcje Auto List Members. W tyrn celu z menu Tools nalety wybrae
porycje Options i wisnqC Enter.
Ryrunek 8.1.
W)&wietlenie
listy funkji
jeIyka VBA w oknie
edytora VIsual Basic
Funkcje jezyka VBA sq stosowane w wyrateniach w bardzo podotjny sposbb, jak funk-
cje formui arkuszowych. Funkcje j ~ z y k aVBA mogq bye na pnyklad zagnietdtane. Oto
prosta procedura obliczajqca p n y uiyciu funkcji Sqr dla anicmej pienviastek kwadra-
towy, zapisujqca wynik w innej miennej i wy3wietlajqca go:
--
Sub 'Shcd4oot( 1
Myvalue 25
SquareRoot Sqr(HyYa1ue)
Psgfiox SquareRoot
End Sub
Funkcja Sqr jqzyka VBA jest odpowiednikiem excelowskiej fivlkcji arkusza PIERWIASTEK.
Funkcla MsgEox
Funkcja MsgBox jest jednq z najpiqdatniejszych funkcjl jezyka VBA. W M d u pnyktadach zamlesmo
nych w tym rozdzlale p o s b w a do wySwletlenla wartogci mienne]. Funkcja ta c q s t o jest dobrym
odpowlednlkiem prostego niestandardowego okna dialogowego. Poza tym lwietnie sprawdza sig
pmy wykrywaniu i usuwaniu btedbw, poniewat w celu wstrrymanla wykonywania kodu frbdtowego
i wygwietlenia wyniku obllczenia lub instmkcji przypisania moina jq wstawid w kaidej chwiii.
WigkszoSC funkcji mraca jednq wartold pnyplsywanq zmlennej. Funkcja nsgaox nie tylko m c a
wartosf, ale t e i wySwietla okno dlalogowe, dziqki ktdremu utytkownlk mote zareagowat. Wartog6
zwracana prrez funkcjg HsgBox reprezentuje dane wprowadmne pnez utytkownika w wyswietlonym
oknie dialogowym. Funkcja Msgbx M e zostaC utyta nawet wtedy, gdy nie zaleiy ci na odpwiedzi
uiytkownika, ale na moillwoSc1 wySwietlenla komunikatu.
Oficjalna skiadnia funkcji MsgBox zawiera pi# argument6w (te w nawiasach k w a d r a t o y h sg
opcjonaine):
PsgBox(kanunikat[, przyc~skiIC,tytull[. plikganocyl[, kontekst])
k m n i k a t (wymagany): kornunikat e w i e t l a n y w oknle dialogowym,
przyciski (opcjonalny): wartofc?okre9lajqca. jakle przyclskl I lkony Ue911 sq potrzebne)
pojawiq sie w oknie komunikatu (nalety u+ wbudowanych stalych. np. vbYesNo),
tytul (opcjonalny): tekst pojawiajqcy sig na pasku tytutu okna komunikatu; domyflnym
tytutem jest taricuch Micmsoft Excel.
p i i k p m y (opcjonalny): nama pliku pomocy pawiqzanego z oknem komunlkatu,
kontekst (opcjonalny): identylikator kontekstu tematu pomocy, ktdry zostanle wylwletlony.
Zwrdconq wartog motna przypisaC zmlennej, a samq funkcJe zastosowac?w insbukcji pnyplsanla.
W kolejnyrn przyktadzie wynik przyplsano zmlennej Ans:
Ans - -
HsgBox('Czy kontynuowat?", vbYesNa
IfAns vbNo Then Ex!t Sub
+ vbQuestlon. 'Powledz mi')
W przypadku argurnentu przyciski postutytem slg sumq hv6ch wbudowanych statych IvbYesNo
vwuestion). Zastosowanie statej vbYesNo spowoduje wygwietlenie dw6ch przycisk6w o namach
-
Tak i Nie. Dodanie stale] vbQuestion spowoduje Wwietlenle lkony pytajnika. Uzyskane okno
komunikatu pokazano na rysunku. Po wykonaniu piewszej instmkcji mienna Ans bedzle zawie-
rat jednq z dw6ch wartoki repezentowanych przez state vSYes i vbNo. W tym prrypadku, gdy
m
uiytkownik kliknle p q c l s k Nie, procedura zakokzy dzlatanle.
cv-
Aby uzyskaC wigcej Informacji na temat statych. naleiy zajrrd do systemu pomocy jgzyka VBA
zawlerajqcego listg wswtkich statych. ktdrych motna u w .
Sub Shokaomn( 1
Decvalue --
2001
RoMnValue Applicatiov .WorksheetFunction.Roman(DeCYalue)
Hsgbx RoranValue
End Sub
Nie motna u2ywac?funkcji arkusza, ktbre majq swoje odpowiedniki w jpzyku VBA.
Pnykladowo interpreter jezyka VBA nie rnoze vlstosowaC funkcji arkusza PIERWIASTEK
(ang. SORT) Exccla, poniewat j ~ VBA
k posiada jej wlasna wersjp o namie Sqr. A zatem
ponihza insaukcja wygenemje Mqd:
MsgBox Appl ication .WorksheetFunction.Sqrt(l23) ' blqd
J& VBA umomwla twonenie nlestandardowych funkcjl arkusza dzlatajqcych
/ podobnie Jak wbudowane funkcJe arkusza Excela. Plsze o tym w rozddale 10.
Procedura, kt* d z i h i e w e dokhdnie takie samo, mote mtaf napisana prry utyciu
konstrukcji With . . . End With:
Sub ChangeFontPO
- -
With Selectton.Font
.Flame "Tlmes Hew Rman'
- -
.Fontstyle "Bold Italic'
.Size 12
-
.Under1tne xlVoderlfneStyleStngle
.ColorIndex 5
End With
End sub
Niela6ny uwa?ajq, ts drugs wenja procedury jest mniej czytelna Nalety jednak pa- l
miptat. te celem b y b mipkszenic szybkoki. Rocedura z konstrukcjq With . . . End
W l t h macznie sybciej modyfikuje wartoSci kilku wt&ciwo6ci obiektu w por6wnaniu
zprocedurq, kt6ra w M e j instrukcji jawnie odwoluje sip do obiektu.
@$$' W prrlpadku mjssttmwie makra VBA, Excel u&wa konstwkcji Mi t h ... End Mi th
zawsze, gdy Jest to moiYlwe. Aby uryska?dobry pnyktad taklej konstrukcjl, w trakcie
o,sIan,a u s a dm n y ,tam stmnyz m n u ,ale, rejestrow,
wykonywane operaele.
-
Din HyArray(5) As Oouble
For 1 0 TO 5
EyArray(t) Rnd -
next i
For Each n I n MyArray
0ebug.Print n
Next n
End Sub
Nastqna pracedura prry Wciu konshukcji For Each . . . Next pnchvana zbi6r Sheets
z aktywoego s k o m :
Sub CountSheetsO
Otm Item as NorkSheet
For Each Item In ActivdJortboak.UorkSheets
n s g f ~ xIten.name
Next Item
End Sub
'sJPii
-
W popnednim przyktadzie Itemjest zmlennq oblektowq, a dokladniej m6wiqc
obiektem Worksheet. Me ma n L nadzwycrajnego w n m l e Item. Zamiast nlej
moina uzyf d m l n e j innej poprawnej nazwy zrniennej.
W nastppnym pnykladzie konstrukcja For Each . . . Next s h y do przehvorzcnia
wszystkich obiektbw zbioru Windows:
Sub HiddenWlndows( )
Dim! A11Visibls As Boolean
-
Dim Item As Windm
A l l V l s i b l e True
--
For Each Item I n Yindars
If t t m . V i s i b l e False Then
AllVIstble False
E x i t For
End If
Next Item
MsgBox A1 1Vlsible
End Sub
Po ukryciu olcna wart046 wMciwogci A1 1Visible zmienia sie na Fa1 se i petla For Each
. . . Next kodczy dzialanie. Okno komunikatu wykwietli wartog6 True, jekli wszystkie
okna b& widocme, lub False, gdy pnynajmniej jedno z nich zostanie ukryte. Instmk-
cj.1 E x i t For jest opcjonalna. Ofemje rnetodp wczelniejszego mkohczenia petli For
Each .. . Next. Zazwyczaj konysta sip z niej w pok.czeniu z konsmkcjq If . . . Then
om6wio1q w dalszej cqkci rozdziah.
Ponitej zawarto przyklad procedury zamykajqcej wszystkie skoroszyty z wyjqtkiem
aktywnego. Ptoccdura przy ugciu konstrukcji If . . . Then sprawdza katdy skoroszyt
zbioru Workbooks:
Sub CloseInActiwO
Dim Book as Workbook
For Each Book I n Workbooks
If Book. Name 0 ActiveWorkbook.Name Then Book.Close
k x t Book
End Sub
W ostatnim pnykladzie konstrukcja Far Each .. . Next jest wykonywma, gdy uQ+
kownik 2amaczy zakres kombrek:
Sub MakeUpperCase()
Dim Cell as Range
Cell.Valw
Rxt Cell
-
For Each Cell I n Selection
UCdse(Cell.'lalue)
End Sub
W tyrn przypadku obick Selection spehia funkcjp zbiom obiek6w Range, poniewai:
ka2da zamaczona korn6rka iest takm obiektem. Procedura S~rawdZakatda korn6rkp
w
i w celu zamiany z a q c h nicj mak6w na duiz ukywa &cji UCase j&ka VBA,
Korn6rki zawierajqce liczby nie sq uwzglcdniane.
I
21 4 CzeSC Ill + Jezyk Visual Basic for Applications
lnstrukcja GoTo
Najprostsza metoda sterowania programem polcga na tastosowaniu instrukcji GoTo. In-
strukcja po prostu przenosi wykonywanie pmgramu do nowej instrukcji, plzed kt6rq
musi znalett siq etykieta (ia13cuch tekstowy z dwduopkiem lub liczba bez dwuhpka).
Procedury j m k a VBA mogq zawierat dowolnq liczbp etykiet. Insbukcja GoTo nie mote
przenosit wykonywania programu poza obszar procedury.
Ta prosta procedura dziah, ale instrukcja GoTo powinna byE stosowana tylko wtedy, gdy
nie istnieje inna metoda wykonania operacji. Tak naprawdq jedynq syhlacjb w ktdrej
faktycmic koniecme jest utycie w kodzie Wdtowyrn jqzyka VBA instrukcji GOTO,jest
przechwyywanie Mqdow (rozdziai 9).
Rozdziot 8. + Podstawy programowonia w jezyku VBA 215
W drugiej konstrukcji I f ... Then zastosowakm operator >- (wiqkszy lub r6wny).
Konstrukcja uwzglpdnia pnypadek, te akurat b&ie dokladnie samo poludnie, na co sq
bardzo male szanse.
WanoSf 0.75 reprctcntuje godzinq 18. czyli 3/4 doby. Takq p ~ dnia
e motna jut naqwad
wieczorem.
Ponitej pokazano, w jaki spos6b nalety u2yC powytszej skladni w celu przebudowy
procedury Greet*:
Sub GreetHeSC )
I f Time < 0 . 5 Then
flsgBox W t m przed poludniem'
ElseIf T i m * 0.5 Pnd Time 0.75 Then
Msgs0x 'Hltm po poludnlu'
El 5e
MsgBox 'Hi tan wieczorem'
End If
End Sub
Gdy w pnypadku tej sldadni warunek bqdzie mial wart& True, zostanq wykonane in-
sfmkcje wantnkowe i konsbukcja If .. . Then zakdczy W a n i e . lnnymi h w y , pozostak
wanmki nie q sprawdzane. Co prawda, skMnia ta umotliwia zwiekmmie wydajnoki,
ale niewrry mogq m e , 2-coparty na niej kod kr6dbwy jest trudniejszy do mzurnienia.
Sub GreetIIe6t)
If Time x 0.5 Then
MsgBax "Wltam przed poludnim'
Else
!f Time r 0.5 And Nme <
(1. i 5 Then
HsgBox "Witam po pofudniu"
Else
I f Time >- 0.75 Then
Ms@x "Witam wieczorem'
End If
End i f
End I f
End Sub
--
D l m Diwount Cis Double
---
Quantity InputBox("Wpmdt wartoit: "I
If Ouantlty "'Then Exlt Sub
I f Quamity 0 Then Oiscount 0.1 --
I f Cucntrty
If Cuamtr ty
If Ouan:?:y -
25 Then Dlscount 0.15
50 Then Dlscount 0.2
75 Then Dlscounr D.25
Hsghx 'Upst : ' b Dl scount
End Sub
-
Funkcla Ilf jqzyka VBA
Jqzyk VBA oferule funkcj~I l f , akematymq w d ~ e ckonstrukcjl If .. . Then. Funkcja pobiera trzy
argurnenty I dziaia w sposdb bardro podobny do excelowskiej funkcja arkusza JEZELI. Skladnia
funkcjl Jest nastepljqca
I If (yy~a.?enie,c - ~ t - ~ ~ a z m a - z - w ~ o ~ c i ~d c- T~ .t ~ 1 ~ 1 ' ~ z a n a ~ ~ ~ wIse)
artofci~~Fa
wyratenfe (wymagany): wyratenie, Mdre zostanie sprawdzone,
CZ&! mld~ana-z-wrto~cFla-True[wymagany): wart& lub wyratenie zwracane, gdy wartogciq
wyra&ia m e True.
clr?Jf-&~ana-z-mrtoJcIaaFdIse (magany): warto&? tub wyrbnie mracane.
gdy wartcfclq yra.?enia hdzle False.
Ponilsza indNkcja demonstruJe zastwowanie funkcji IIf. Okno komunikatu wySWetia laficuch
Zwo, gdy komdrka A 1 jest plsta lub gdy znajduje sle w nlej zero, albo laficuch Rbzne od zera, jeSli
w kombrm A1 majdzie sle dowolna inna warta&?.
HsgBox !tf[RangeI'Alm) - 0. "Zero", 'Rbtne od zera")
i q ~zawsze
Trreci argument ( c z ~ ~ ~ - m i ~ ~ ~ z ~ w a r t o f cjest F d I swyllczany,
e) nawet je5ii wartoSclq
piemszego argumentu (wyralmle] bqdzie True. A zatern ponizua instrukcja wygeneruje bed, gUy
wartokiq n b w e zero:
HsgBox I I f [ n - 0. 0 . 1 # n l
I
21 8 Czee Ill + Jezyk Visual Basic for Applications i
.
Katda konstrukcja I f . . Then z a m w procedune jest zawszc wykonywana, dlatego I
I
wartoft zmiemej Discount mote sic mieniaf kilkakromie. Jednak kohcowa wartoSC jest
zgodna z oczekiwaniami.
Ponitsza procedura, ktbra jest modyfikacjq pop~edniej,utywa alternatywnej skladni.
W tym przypadku koficy dzialanie po wykonaniu bloku insnukcji realizowanych po
spehieniu warunku.
Sub D l scountZ( 1
D l m Quantity As Variant
--
D i m Oiscount As Double
Ouanti t y InputBox( "Wprcmvadi wartoit: "1
I f Quantity '"' Then Exit Sub
-
I f Quantity >- 0 And Ouantity < 25 Then
D l scount 0.1
-
ElseIf Ouantity c 50 h e n
Discount 0.15
Discount 0.2
ElseIf Ouantity
--
ElseIf Ouantity 75 Then
75 Then
End If
Oiscount 0.25-
MsgBox 'Upust: " d Discount
End Sub
-
Case 0.5 To 0.75
Hsg 'Witam po poludniu'
Case Else
-
Msg "Witam wieczorem"
Rozdziot 8. + Podstowy progromowania w j w k u VBA 2 19
End Select
nsgaox nsg
End Sub
-
Dim Discount As Double
Quantity InputBox('Wprowadf wartoft:
Select Case Quantity
")
Case I s-
Case 50 To 74
-
Dl scount 0.2
-
75
Discount 0.25
End Select
,
Do odddelenia wielu warto9ci instrukcji Case mo&a u2yC maku przccinka W ponitsaj
procedurze zastowwano funkcjp WeekDay j~zykaVBA okreslajqcg czy aktualny dziefi
jest soboQ tub niedzielq (finkcja WeekDay m6ci wart036 1 lub 7). Na kodcu procedura
wyswietli odpowiedni komunikat.
Sub Greetuser(
Select Case W O a y (Nw)
Case 1. 7
MsgBox "Uarny j u t weekend. '
Case Else
MsgBox "To jeszcze n l e weekend. '
End Select
End Sub
-
0im Discount As Dwble
b a n t i t y Inputbx('kprmadi
Select Case Guantity
wartoit: " I
Case I s
End Select
-
Case 25 To 49: Olscount
Case 50 To 74: Oiscount
75: Discount
End Sub
S t n ~ h r Select
y Case tet mogq by6 zagniedtane. Ponitsza procedura sprawdza status
o h a Excela (maksymalizowane, minimalizowane tub nonnalne), a nastcpnie wyiwietla I
odpowiedni komunikat. JeSli status okna Excela jest normalny, p&edura spraw&i status
aktywnego okna, nastepnie wyiwietli kolejny komunikat. i
Sub AppWlndowO
Select Case Pppl icatlon.WindovState
Case x l ~ x l m i z e d :HsgBOx '&no apl l k a c j i j c s t zmaksymal lzcwane. "
II
I
Case xlMinimized: Hsg&x 'Ckno apl l k a c j i j e s t minimalizmane."
Case x l ~ o n a a:l Hspsox "Qna apl iltacjl m standardowq uielko5.t .'
Select Case k t 1 veWi ndow .Wt ndawStste
Case xlMaxlmlred: nsgbx "Okno skoroszytu j e s t m t s y m a l izonane. "
Case xltllnimlzed: Ms~Sox"Ckm skoroszytu j e s t minimallzcwane."
Case x l Normal : HsgBox "Okno skoroszytu ma standardowa wiel to5.t. "
End Select
End Select
End Sub
Stopied zagniddtrnia komukcji Select Case m e by5 dowolny, ale nalezy u p i C sic,
i
I
I
tc katdej instrukcji Select Case odpowiada instrukcja End Select. Powytsta procedura
dernonstruje re2 prrydatndC wci& Mdre zwiekszajq przejnysto4f struktury kodu tr6-
dlowego. Sp6jrz na tq s a q procedur~pazbawionq wcieE:
Sub PppUlndm()
Select Case Appl teatton .HindowState
Case xlMaximized: MsgHox 'Uno apl i k a c j l jest m a k s p l izmane. "
Case xlMinimized: MsgBox 'Otm apl i k a c j l j e s t minimal tzrmane."
Case x l N o m l : HsgBox "Okno apllkacjl ma standardma wielkoft.'
Select Case PctiveUlndm.WindowState
Case xlHaxlmlzed: t4sgBox %no skoroszytu j e s t malsymalizmne.'
Case xltiinimized: bgBox 'Olno skorosrytu j e s t minimalizmane."
Case xlNormal : MsgBox 'Otna skoroszytu ma s t a n d a r b 4 KielkoSt.'
End Select
End Select
End Sub
- -
ActIveCell .Val w StartVal
Cnt 1
Dohother :
- -
AEtlveCell .Offset(Cnt. 0) .Value StartVal * Cnt
Cnt Cnt + 1
I f Cnt c NunToFt 11 Then GoTo DcAnother Else Exit Sub
End Sub
Zc wzglpdu na to, te j@yk VBA ofemje kilka instrukcji spehiajqcych hnkcjq struktu-
ralnych pqtli, przy tworzeniu mechanimu podejmowania decyzji prawie w og6le nie
bqdde koniecmie konystanie z insmkcji GoTo.
W tym pnyktadzie pocqtkowq wartogciq anicnnej Count (licmik pvli) jest 1, kt6ra po
ka2dcj iteracji jest zwickszana o jeden. Zmiema Sum jedynie przechowuje sump pier-
wiastkdw kwadratowych oblicwnych dla k&dej wartoki z m i m e j Count.
Ucmlk mtll For . . . Next jest zwyktq mlennq. Z tego powadu rnofna zmienlC jego
warto, wewnqtrz ,ken,,kodu f&hwego, zwartego pom ,l instrukcjami
For i Next. Jednak nie jest to zalecana praktylca, gdyi moie wywotaf nieprzewidywalne
efekty. Tak napraw* powiflienel: sig upewnie, fe kod fr6dlowy nie rnomkuje wartosci
licmika wtli.
Aby pornin@ niekt6re wartoSci pqli, motna zastosowat slowo klucmwe Step. Ponizej
procedure z poprzedniego przykladu zmodyfikowano w taki sposdb, te oblicza sum$
pienviastk6w kwadratowych dla nieparrystych l i m b z przedziah od 1do 100:
Sub SmXdSquareRwts:
Dim Sum As Double
- -
Dim Count As Integer
Sun i]
For tamt 1 To 1DD Step 2
Sum Sum + Ssr<Cwnt)
Rozdzial8. Podstowy programowanla w jezyku VBA 223
Next Count
nsgBox Sum
End Sub
--
D i m Cnt As Integer
StartVal 1
-
NunToF111 100
For Cnt 0 To NumF111 1 -
ActlveCell .Offset(Cnt. O).Value - StartVal + Cnt
Next Cnt
End sub
Pqtle For . .. Next mom tet zawierae jednq lub kilka instrukcji Exit For. Po naptkaniu
takiej instrukcji p ~ t l anatychmiast konczy dziabmie i przekazuje sterowanie instrukcji
majdujqcej sie za instrukcjq Next aktualnej pqtli For . . . Next. Ponitsy przykhd de-
monstruje zastosowanie instrukcji Exit For. Procedura okreila, ktdra komdrka kolumny
A aktywnego arkusza mwiera najwipksq wartoft.
Sub Ex1tForDemo()
Dim NaxVal As Double
Oim R o n As Long
--
O i m Thetell As Range
MaxVal Applicatlm.hrksneetFunttfon.Max(Range['A:A"))
- -
For Row 1 To 65536
Set TheCell Range("Al").Qffset(Raw
I f TheCell .Value MaxVal Then
-
1. 0)
Sub NestedLoops(
D i m MyArray(1 to 10. 1 to 10. 1 t o 10)
For t --
Otm 1 As Integer. j 4s Integer. k bs I n t e r
1 To 10
-
For j 1 To 10
For k 1 To 10
MyArray(1. j. k) - -1
N e d 1:
Next J
Next 1
End Sub
PqtIa Do Whi 1e. w przeciwiehwie do pqtli For ... Next, jest wykonywana po spelnieniu
okrrJlonego warunku MoZe mieC dwie n w p u j a c e skMnie:
Da m i l e wrunek]
[ instrukcjel
[Ex1 t001
[fnstrukcjel
Lacp
lub
Do
C ins tmkcjel
[Exlt Do1
C instrukcjel
Loop [While wmnek?
Jak motna zauwatyd, jezyk VBA umotliwia umieszcanie instrukcji warunkowej While
na poczqtku lub na koticco petli. Rdtnica pomiqdzy obiema skiadniami polega na mo-
mencie sprawdzania warunku. W pizypadku pienxszej skladni zawartogt pqtli m o t e
nigdy nit zostad wykonana. Z kolei w prypadku drugiej skhdni zawartoSf p ~ t l zosta-
i
nie zawsze wykonana pnynajmniej raz
ActiveCell.Offset(1. 0l.Select
LcoD
End Sub
Rozdziat 8. Podstawy programowania w jezyku VBA 225
Rocedum jako punktem pocqtkowym posiuguje siq aktywnq kombrka, a nastqpnie przc-
mieszcza sip w d6l kolumny, wstawiajqc zero do aktywncj komdrki. Po W d e j iteracji
~ t l aktywnq
i kombrkq staje siq nastppna komdrka kolumny. Pptla jest wykonywana do
rnomentu stwierdzenia przez funkcjq IsEmpty j~zykaVBA, te aktywna komdrka jest pusta.
Kolejna procedua konysta z p@liDo While opartej na drugiej skhdni. Pqtla zostanie zawsze
wykonana co najmniej raz, nawet jdii poczqtkowa aktywna komdrka b ~ d z i epusta.
Sub DoWhileDmZO
Do
-
ActiveCell .Value 0
ActiveCell .Offset(l. O).Select
Loop While Not isEmptytActiveCel1)
End Sub
Ponitej zamieszczono nastqpny przyktad utycia petli Do While. Procedura otwiera plik
tekstowy, wczytuje k&dy wiersz. zamienia znaki na dute i zapisuje je w aktywnym ar-
kusnr, pocqwszy od kombrki A1 w d61 kolumny. Procedura u w a funkcji EOF jpzyka
VBA zwracajqcej po osiqgnicciu kohca pliku wartoit True. Ostatnia instrukcja zamyka
plik tekstowy.
Sub OoWhileDernlO
Dim LtneCt As Long
-
Open 'c:\dane\plIk-tekstcwy .txtm For Input AS #I
CineCt 0
Do Wh7le Not EOF(1)
Line Input #LineOText
-
l.
-
Range("Al").Offset(LineCt. 0) UCase(Line0ffext)
LineCt LineCt + 1
LOOP
Close bl
End Sub
Aby ui?jsW dodatkowe informacje na temat odczytywania i zapisywania plik6w
tekstowych ply vtyciv je*a VB*, nalety zajrM do rozdziahl 27.
Bmm
Pvlc Do Wl le tek mogq z a w i e d jednq lub kilka instrukcji E x i t Do. Po napotkaniu in-
shukcji Extt 00 petla natychmiast kohczy dziaianie i pnekazuje sterowanie instrukcji
znajdujqccj sig za instrukcjq Loop.
Pplia Do Uniii
S h u k t m petli 00 Until bardzo przypomina stmktby ~ t lDoi Whi 1e. R 6 i c a jest w i d o c h
jedynie przy sprawdzaniu warunku. Pqla Do Whi 1e jest wykonywana, gdy wanmek m a
WartoSC True. Z kolei petla Do Unti 1 jest wykonywana, gdy warunek nie ma wartohi
True. P@la Do Unti 1 rbwniet posiada dwie sktadnie:
226 CzeSC Ill + Jezyk Viwal Basic for Applications
lub
Do
[instrukcje]
[Exit Do1
[instrukcjel
Loop [Unti 1 warunekl
Ponitszy pnyklad prezentowalem jut przy okazji omawiania pqtli Do While, ale po mo-
dyfikowaniu wykorzystano w nim pqtle Do Until. Jcdyna r62nica wystqpuje w wicrszu
zawierajqcym instrukcjp Do. Kod krddtowy jest ponadto trochq przejrzystszy, poniewa2
uniknieto w nim negacji obccnej w procedurze DoWhi leDem1.
Sub DoUnti lDemol(
Dim LineCt As Long
LineCt 0-
Open "c :\dane\pl;i-tekstowy . tx:" For Input As #1
00 U n t i l EOF(1)
Line Input #I. LlneOffext
- -
Range("Al"1 .Offset(LineCt. 0) Vtase(Llne9ffextl
L?neCt i i n e C t + i
Lcap
Close B1
End Sub
Rozdziat 9.
Zastosowanie procedur Sub
jezyka VBA
Procedura pnechowuje g r u ~instrukcji jezylca VBA realizujqcych zatotone zadanie.
WiekszoSt kodu tr6dlowego napisanego w jpzyku VBA jest zawarta w procedurach.
W tym rozdziale mwke uwage na proccdury Sub, k b r e wykonujq operacje. a nie zwra-
cajq wartoSci. J ~ z y kVBA obsi-uguje tet procedury Function orn6wione w rozdziale 10.
Procedura moie r n l d dowolnq dlugoX, ale programlfci wolq unika6 twonenia bardzo
hlglch pmedur wykonujqcych wiele operacji. P m N n@sf snorzenle Xllkv rmla~sqch
procedur, z Mdrych kaFda reallmje ledno zadanle. a nastgpnie nadsanie gl6wnej
pmcedury wywduJr)wj pazostate. Dzigki takiemu rozwigzaniu zarzqdzanie kodem
ir6dlawym jest tatwie]sze.
Zasieg procedury
W popmdnim rozdziale wqomnialem, t e zmi~gm i e m e j identyfikuje mod* i pro-
cedury, w kt6rych m o m jq zastosowat. Podobnie zasiqg procedury okreSla, jakie inne
pmedury mogajil w ~ w o w .
Procedury publiczne
DomyJlnie proccdury sqpubliane, co azaacza, te mogq by6 wywolywane przez inne
procedury zawantc w dowolnym module skoroszytu. Nie jest koniecme stosowanie slowa
kluczowego Publ ic, ale programiSci dla unihiqcia niejasnoSci c ~ t jeo uwzglqdniajq
Obie ponitsre pmcedury q publicme:
Rozdu'al?. + Zostosowanie procedur Sub iezyka VBA 229
Nanvy procedur
W d a procedura musi mi& .-n Zasady narywania pracedur sq takie same, jak tasady na-
zywania zmiennych. W idealne] sytuacjl nanva procedury powlnna opis)waE to, co jest przez nlq
realizowane. Zalecane jest stosowanle namy zawierajqce] czasownlk i rreczownlk {np. Przetwarraj-
Dane, DrukujRaport, SprawdfNazwePliku lub Sortuj-Tablice). Nalej unikaC nic nlemaczqcych nazw
takich, jak ZrbbTo, Uaktualnia C I Naprawia.
~ Niekt6rry p7ogramiSci poslugujq sig w nazwach zdaniami
~ t p l ~ ~ j q c ypocedup
mi (np. Pobierr-Opcje-Drukcmania1-i-Orukuj-Rap3rt i iapiszRaportWlikuTetstauyn).
Co prawda. diugle nazwy sq jednoznaczne, ale tet o wiele trudniej je wprwadzit.
i
Sub F i r s t 0
[n tym rniejscu znajduje s i e kod tr6diouyl
End Sub
Procedury prywatne
Proceduryprywatne m o m byt wywdywane przez inne pmcedwy zawarte w tym sarnlm
module, ale nie przez procedury z innych moduldw.
& t i o n P r i v a t e Module
JeSll ta Instrukcja zostanle urnieszmma w module, w deklaracjach prccedur Sub
motna pomln$ sfnwo kluczcme Private.
Rejestrator mah
Excela standardowo tworzy nowe procedury Sub o nazwach Mag rcl ,
MakroZ itd. Wszystkie one sq publicme i nigdy nie pobicrajq argumcnt6w.
Rysunek 9.1.
Okno dialogowe
Makm wySwietla
wszystkle dostepne
procedury
Wykonywanie procedury
przy uiyciu skr6tu opartego na Wawiszu Ctrl
Skr6t oparty na klawiszu Ctrl mote mstat pnypisany do dowolnej proccdury n i e w -
jqcej nrgurnmtbw. Jefli na przyklad do procedury o nazwie Update zostanie przypisana
kombinacja klawiszy CtrI+U,jej wciinivie spowoduje wykonanie procedury.
Rysunek 92.
Okno dialogowe
Opcje rnakra
I umotlhvia pnyplsanie
procedune skr6tu
klawlaturowego
opartego na klawfszu
! Ctri I podanie jej
I opisu (opcjonalne,l
i
4. Wprowadzit mak w polu Ctrl+. WiclkoSC znaku jest tond2uiana JeSli zostanie
wpmwabna litera s, s M t klawiaturowy b@ie miat postat Czri+S. Z kolei jeSli
zostanie wprowadmna litera 5, da6t klawiahnowy kdzie mkd pos& Ctri+ShrfiS.
232 CzeJC Ill+ Jqzyk Visual Bc~sicfor Applications
Ponitej opisalem czynnoki, kt& naleb wykonaQ aby wySwietli6 nowq pozycjp menu
i p r z y p i d mu m h @nyjqkm, b nowa pozycja o namie Ohvdrzplik klienta majduje
sip w menu Dane, natomiast procedunr nosi n m p OpenCustmrFi 1e):
1. Z menu Widokwybierz potyejq Pmkimn&i, a nastppnie Dostafllj. Excel wy4wictli
okno dialogowe Dostosowywanie, po czym zastanie pftxlqczony wspecjalny tryb
dostosowywania W trybie tyrn menu i paski n a q d z i nie qaktywne, ale m o m
by6 dostosowywane.
2. Kliknij zakladkq Polecenia okna dialogowego Dmtmowywmr'e.
3. P&d listp Kategorie i wybien pozycjp Makra.
4. W l i h i e Polecenia przecimij p i m q p o z y c j p (Niestmdardowy element menu)
d a d o h menu Dane (ponitej poazycji O&iet dane). Po klikniwiu, menu Dane
zostanie rozwiniqte.
5. W celu wy4wietlenia menu podrqcmego prawym przyciskiem myszy kliknij
nowq poyejp menu (Niestandmdowy element menu).
6. W polu Nanve (rysunek 9.3) wprowadt dla pozycji menu nowq nazwq &Mwbrz
pllk kllenta.
7. W oknie dialogowym P a z listy malu wybierz p r o c e d u ~
~ i mubo
OpenCustmrFI le.
Rozdzial9. Zastosowanie procedur Sub jezyko VBA 233
Rysunek 9.3. MdyfIkwa namypczycjl menu Z menu podwcmego wybien pozjtje Przypisz makro.
NO- p q t j a b-e -
z m s z e widaczna w menu nawet gcty nie zostanie ohvatty
skomsqt zawterajtlcy rnakro. Innyml shy, miany dokonane przy utyciu polecenia
Dostosujtawartego w podrnenu Paski n a n w menu Widok sq trwate. Wybranle
nowej pozycji menu spawoduje ratadowanie skorosqtu. JeSI1nie jest jeszcze otwarty.
Aby dowledzld sic, w Jakl sposdb u w jqzyka VBA do stworzenia p o w j i menu
Emm
. , " , , , od
zastosowanie metody Run obiektu Appl ication. Metody tej m o h utyC w celu
wykonania innych procedur jpzyka VBA lub makr XLM. Metoda Run jest
p&ydatna, gdiko&ecme jest uhchomienie procedury, ktbrej nazwq przypisano
zmiemej. Aby zastosowaC rnetodp Run, nale2.y zmiemq przekazak jako argument.
Ponitszy prrykIad demonstruje pierwsq metodp. Procedm YySub pn*warta kilka insauk-
cji (nie zostaly pokazane), wyvduje procedure UpdateSheet, a nastppnie rcszte instrukcji:
Sub Mysub( 1
[w tym miejscu znajduje siq kad fr6dlowyl
UpdateSheet
[w tym miejscu zrajduje s i e kod trddlowyl
End Sub
Sub Updatesheet( 1
[w tym miejscu ztajduje s i e kod Fr6dlowyl
End Sub
Kolejny przyklad demonstruje drugq metodp. Slowo klucwwe Call wykonuje proceduq
Update wyrnagajqcq jednego argurnentu. Procedura wywohjya pitekazuje argument
procedurze wywdywanej. Argumenty procedury zostanq omdwione w dalszej cyBci
rozdziaiu (zajrzyj do punktu .,Pnekazywanie argument6w pmcedurom").
Sub MySubO
-
MnthNun lnput8ox("Wpmad2 nuner mlesiqca: "I
Call UcdateSheet(MonthName1
'
[ w tym miejscu znajduje s i t tod trbdlhryl
End Sub
Sub UpdateSheetolanthSeq)
[w tym miejscu znajduje s l e kod tr6dlowy3
End Sub
'
[ W tym mlejscu znajduje sie kod i r 6 d l m y l
End Sub
Sub UpdateSheet(MonthSeq1
[w tym miejscu znajduje sie kod frddlowyl
End Sub
Metoda Run majduje zastosowanie, gdy nazwa pmcedltry jest ~ozypisywanado zmiennej.
Zostalo to pokazane w kolejnym pnyktadzic. Rocedura mi n uZyHa W c j i WeekOay jpzyka
VBA okdlajqcej dzied tygodnia (ponumemwanych od I do 7, m w s z y od niedzieli).
Zmiennej SubToCall jest pnypisywany kaf~cuchreprnentujqcy nanvp p m d u r y . Metoda
Run wywotuje nastppnie odpowiedniq proc* (hleekenC lub D a i 7 ~ ) .
ROzdziat 9. + Zastosowonie procedur Sub jqzyka VBA 235
Sub M a i n 0
D i m SubToCall As Strtng
Select Case WeekOay(Nw)
Ca'se 1: SubToCall --'WeekEnd"
Case 7 : SubToCall
Case Else: SubToCall
End Select
-
VeetEnd'
"Daily"
Sub Weekend[ 1
'
UsgBox "Marny j u t weekend."
[w tym rnlejscu znajduje sle kod fr6dlowy wytonywany w czasie weekendul
End Sub
Sub D a i l y 0
Msgbx "Jeszcze n i e ma w k e n d u . '
'
[ w tym miejscu znajduje s i e kod frddlowy wykonywany u dnl m ~ z e l
End Sub
W tym samym module nie mom majdowad sic dwie procedury o jednakowej nazwie.
ale takic ograniczenie nie wystqpuje w przypadku, gdy sq umieszcwne w rdtnych rno-
duhch. Istnicje m o t l i W f r m m n i a interpretera j~zykaVBA do wykonania procedury
posiadajqcej niejednoznacznq nawq, czyli kolcjnej pmedury o takicj samej nazwie
zawartej w innym module. W tym celu ptzed n a m q procedury nalety wstawid nazwc
modulu i kropk~.Dla przykhdu zaldhy, te w modulach Modul e l i Modul e2 zdefiniowano
procedmy o nanvie MySub. JeSli proccdm z modutu Module2 ma wywdywad proceduv
MySub znajdujqcqsiq w module Moduiel, n a i e e utyd jednej zponifszych instrukcji:
ModuIei .~ysub
Call Hodul e l . MySub
Jegli nie odr6tnisz dw6ch proccdur a takich samych nazwach, zostanie wygenerowany
komunikat bf@u Ambiguous nam detwted (wy!uyto niejednomacmqnazw~).
Aby shmzyd odwdanie do innego skoroszytu, z menu Tools edytora VisYd Busic nakty
wybrak poleccnie Rdwences. Excel otwony okno dialogowe Refereices (rysunek 9.41,
w Mdrym b d q widocme wsystkie dostpne odwotania powipmc z wszystkimi
otwartymi skoroszytami. Aby stmnyf o d w h i e do okrdionego skorouytu, wys-zy
236 czefe 1s Jew visual Basic for ~ppncations I
Rysunek 9.4.
Okno dialogowe
References umotlhvla
stworzenie odndania
do Innego skorosrytu
Skomszyt, do ktbngo jest wykonywane odwdanie, nie musi by5 otwarty. Skomszyt jest
W o w a n y jak oddzielna biblioteka obiekt6w. W celu stwomnia odwdania do skomqtu,
i
kt6ry nie jest otwarty, nalety u2yt prycisku Browse z okna dialogowego References.
Nazwy skoroszyr6w w i d a n e na likie odwoM q u p o ~ o w a n wedluge nanv projekb5w
onvartych w edytorze Visual Busic. Domyflnie katdy projekt p c q t k o w o otrzyrnuje
nazwq VBAProject. A zatem lista mote zawierat kilka identycznie nazwanych pozycji. . - -
Aby wyrdtnit projekt, nalety w oknie Properiies edytora V&I Busic zmieniejego nazwq.
Lism odwdafiwyiwidlona w oknie dialogowyrn
- . References zawicra tet biblioteki obiek-tdw I
i kontrolki ~ c t i ; ezarejestrowane
~ w systemic. ~ k o r o s z Excela
raja odwdania do nasgpujqcych bibliotek obiekt6w:
~ t ~ 2003 zawsze zawie-
ii
Visual Basic for Applications,
Microsoft Excel 11.0 Object Library,
a OLE Automation,
i
Micnnoft Office 1 1.0 Object Library, :
Miaosotl Fwms 2.0 Object Library (opcjonalna, dokpzana tylko, gdy w projekcie 1
zastasowano formulane UserForm). 1
I
Aby pnypisat makm do ksnaltu, nalcty go stwonyf przy ugciu paska n-dzi Rysowa-
nie. Prawym pnyciskiem myszy kliknij ksztalt, a nastqpnie z menu p o d ~ c m e g owybierz
poycjq Pr,~ypiszmakro.
--
D i m MyStrlng As String
HyString 'To j e s t test ."
HyString UCase(UyString)
Debug. Print MyString
End Sub
240 CtgX 111 J w V i o l Basic for Appkuiions
Na rysunlcu 9.5 polanano, co sip stanie, gdy w oknie Immediate msmnie wprowadzony
Mcuch Changecase. W cfekcie natychmiast mstanie wy4wictlony wynik wygenerowany
przez instrukcjr; Debug.Pri nt.
Rysunek 9.5.
Wonanle
pmcedury popner
wprowadzenle
jej nazwy
w oknie Immediate arscrm0
aetrrw
--
D I I WLrUII I x Sirllq
.h 1°C cur .-
ce.wIIRlcrrlq)
D.DW.JCM a)11111lq
WiqksmX pmcdur, z kt6rymi miakd do tej pory do czynienja w tej ksiqtcc. byla dekla-
rowma bez argumentbw. Ich deklaracja zawierala jedynie slowo kluczowc Sub, nazwp
pmcehy i jmq pustych nawiastw Nawiasy wskazzjo te procedura nie przyj-
muje argument6w.
Rozdziol9. + Zastosowonie procedur Sub jqzyko VBA 241
--
Flle(2) "deptZ.xls"
FIle(3) "dept3.xlsW
For 1 1 To 2
Call PmcessFiie(File(i ) I
Next 1
End Sub
Argument mote zostat pnrkazany procedurze ria dwa sposoby - przez odwdanie
i wartoit. Przekazanie argum,entu p n e z odwotanie (domyflna metoda) polega po prostu
na przeshniu procedurze adresu zmiennej w pamiwi. Z kolei przekazanie argumentu
przez waitof6 polega na pneslaniu kopii oryginalnej zmiennej. W konsekwencji w drugirn
przypadku modyfikacje argurnentu procedtny nie wpbwajq na oryginalnq zmiennq.
MyValue 10 -
Dim @Value bs Integer
3 1 1 ProcesstMyValut)
Msgbx HyYal ue
End Sub
Yourvalue
End Sub
- YourValue
Sub Processt YourValuel
10
242 CzefC Ill Jezyk Visual Basic for Applications
JeSli nie chcesz, aby wywdywana procedln-a rnodyfkowata jalqkolwiek zmiemq przeka-
zywanqjako argument, rno~esztak pnetworzyt listg j e j argumentbw, aby byly przeka-
v a n e przez wartoib, a nie przez odwolanie. W tym celu przed argumentem nalety
wstawid stowo kluczawe ByVal. Dzipki temu procedura bpdzie przetwarzala kopip prze-
kazanej zmiennej, a niej j e j oryginat. Prrykiadowo w poniBzej procedurze modydkacja
zmiennej YourValue procedury Process nie ma wplywu na zmiennq MyValue procedury
Main. W efekcie funkcja MsgBox wyiwietla wartoSC 10, anie 100.
Sub Process(ByVa1 Yourvalue)
Yourvalue
End Sub
- YourValue * !O
W wiqkszofci przypadkow wystarczy zastosowanie domyilnej metody przekazywania
argumentciw przez odwohnie. Jelli jednak pmedura rnusi utyd danych przekazywanych
j e j przy utyciu argumentu i absolutnie zalety ci na zachowaniu oryginalnych danych
w niezmienionej postaci, nalety zastosowac pnekazywanie przez wartoid.
End Sub
Oto inna metoda niewykorrystujqca przekazywania argumentu:
Publ:c MMItqVal as Integer
SLAS Mysub()
-
'
[W tym mfejscu znajduje sic kod ir6dIowyl
MnthVal 4
t a l l ProtessHcnth
'
Cw tym miejscu zna jdujc sie kod ir6dlowyl
End Sub
Poniewai w druam wariancie prooedury mienna MonthVal jest publlcma, pocedura PmessMonth
mote jej uzyC. ddeki czernu wyellminawana zostale koniecznoSC pnekazywania argumentu.
Rozdzlai 9. + Zastosowonie procedur Sub jezyka VBA 243
Przekazujqc argument procedurze, nalety parniqtak, aby jego wartolt byia zgodna z typern
danych dla niego zdefiniowanym. JeSli na pnyklad w poprzednim przykladzie wywo-
lasz procedure Process i jako pienvszy argument pnekatesz jej miennq typu Siring,
zostanie wygenerowany btqd ByRef argument type mismatch (niezgodnoff ty@w dla
argumentu przekazywanego przez odwolanie).
cg$‘F%h
Argurnenty moga byd stosowane zardwno w pzypadku pracedur Jak
W praktyce argurnenty cqJciej sq stosowane w przypadku procedur Function.
Sub, i Function.
< s
4
miam0
W dodatku C zawarto wszystkie kody Mgd6w jbzyka VBA wraz z ich opisem.
Pnechwytywanie .Mqd6w
Aby okreSlit, co sie stanie po wystapieniu bipdu, n a l e v u v t instrukcji On Error. Za-
sadniczo dostqpne sq dwie mofliwoSci:
244 Cz#t 111 Jqzyk V i a l Basic for Applications
Aby po wystqpieniu blpdu kod ir6dtowy jqzyka VBA by+ dalej przetwarzany, nalety ,
umieSciC w nim nastppujqcq insrmkcjp:
On Ermr Resume Next
Na rysunku 9.6 pokazano komunikat b$du j ~ y k aVBA, a na rysunku 9.7 ten sam b+qd
i
wyfwietlony w &ie. Bardziej zrozumiav opis mote onywikie sprawit. t e komunikat
blpdu w e dla koncowych utytkownik6w przedstawial wipkstq wart&. .
Rysunek 9.6.
Komunikaty blpddw
jevka VBA
nie zawsze
s4 pnyiazne
dl8 uiytkownlka
Rysunek 9.7.
Motna s*vor;ryC
okno komunikatu
zawierajqce Rod
bedu i jega opis
&
-\*,0, Odwolanle do obiektu Err jest rbwnomscme w l u jego wtaSciwSci o nazwie
Nmkr. A zatern ponitsze dwie instrukcje dajq taki sarn efekt:
Ms&x Err
Rozdzial9. + Zostosowonie procedur Sub jezyka VBA 245
Ponitsza procedura poshguje sie dodatkowq instrukcjq oknSlajqcg czy ystzlpit blqd:
Sub SelectFomlasZ(
On Error Resume Next
Sel~1m.Specia1tells(xlFonrulas,xlNvnbers).Select
IfErr 0 0 Then MsgBox "Nle maleziono km5rek zawierajccych fonnuie."
On Error GoTo 0
[w tp miejscu znajduje s.ie kod frddiowy]
End Sub
Jegli wanoSt Err jest &a od zera, omacza to, te wystrlpil Mqd i m t a n i e wyiwietlony
odpowiedni komunikat.
Sele:tion.Value
E x i t Sub
-
On Error GoTo Hand!er
123
Hand:e'r:
MsgBox 'Przypisanie w a r t o k i do saznaczenid n i e j e s t mtliwe."
End Sub
246 Czegt Ill + Jezyk Visual Basic for Applications I
Procedura ptbbuje przypisak wartoit aktualnemu zaznaczeniu. JeSli w y s w i M;ld (np. nie
zostanie zamaczony zakres lub arkusz jest chroniony), instrukcja pnypisujqca wygene-
ruje btqd. Po wystqpieniu blqdu instrukcja On Error dokonuje przeskoku do etykiety
Handler. Utycie przed etykietq instrukcji Exit Sub zapobiega wykonaniu kodu tr6dto-
wego obshgujqcego btpdy, w sytuacji gdy one nie wystslpiq. Jeili ta instrukcja zostanie
pominiqta, komunikat bjqdu bpdzie wyswietlany nawet wtedy, gdy bl@dnie wystslpi.
Czasami w celu uzyskania inforrnacji mo2na wykorzystaC fakt wyswienia bkdu. W pa-
nitszym przykhdzie jest fylko wykonywane sprawdzenie, ny otwarto okreilony skoroszyt.
W procedurze nie zastosowano obstugi blqd6w.
Sub CheckCorFil e 0
D i m FileName As S t n n g
D i m FileExists As Boolean
--
D i m book AS Workbook
Fi 1eName "N!!iET.XLS"
FileExists False
Spraudzeme wszystkich storoszytQ
- -
For Each book In Workbooks
I f UCase(boot .Name) FileName Then
FiieExists True
End I f
Next book
a Wybwietlenie odpowtedniegu kaunttatu
If FileExists Then Msgbx flleName L " jest Otwarty." -
Else Usg0ox FlleName d " nie jest otwarty."
End Sub
W procedurze zastosowano petle For Each . . . Next, kt6ra sprawdza wsystkie obiekty
ze zbioru Workbooks. Znalezienie ah~artegoskomzytu spowoduje ustawienie dla miennej
FiTeExists wartoSci True. Na koricu jest wySwietlany komunikat informujqcy utytkow-
nika o tym, czy skoroszyt jest otwarty.
i i leNm -
Din x As Workbook
"BUDi€T.XLSW
--
C)n Error Resune Next
Set x Workbooks: Fi 1 eNam1
I f Err 0 Then
Ms-x F i ieNave & " jest otwarty."
E'se
#sgBox FileNarne 8 ' nie jest otwar-ty .'
End I f
On Error GoTo 3
End Sub
Rozdzial 9. Zastosowunie procedur Sub jezyka VBA 247
Rzeczywisty przyktad
wykorzystujqcy procedury Sub
Muszq przyznaf, tt witkszo9C przykladbw. jakie zaprezentowdem do tej pory. byta ra-
czej rnalo odwa2na. Teraz pokatp neczywisty przyklad dernonstrujgy zagadnienia
orndwione w tyrn i w poprzednich dwdch rozdzialach. Ornbwic krok po kroku proces
projektowania pnydatnego narzcdzia. ktbre zgodnie z definicjq zawartq w rozdziale 5.
rnotna uznat za aplikacjp. Zademonstmjq rdwniet proces analiy problemu, a nastqpnie
ronviqzywania go przy u2yciu jqzyka VBA. Na poczqek chce przestrzec bardziej do-
fwiadcmnych utytkownikdw zamierzaj~cychzapoznat sic z tyrn przyktadern. Napisalem
go z rnySIq o poczqtkujqcych programistach utywajqcych jpzyka VBA. Z tego powodu
opr6cz kodu Mdtowego majdujq sic tu rbwniet wyjaSnienia. jak zdobyt wiedzp wy-
rnaganq do jego stworzenia.
Pdna aplikacja znalduje sle na dotqczonyrn dysku CD-ROM.
Cel
Celem przyktadu jest zaprojektowanie narzpdzia modyfikujqcego skoroszyt poprzez
sortowanie jego arkuszy w kolejnolci alfabetycznej (Excel czegoi takiego nie oferuje).
Jeili masz tmdencjp do twornnia wieloarkuszowych skoroszytdw, wiesz, t e zlokalizowanie
jednego z nich mote byc! trudnyrn zadaniem. leili arkusze sqwrtowane w kolejnoJci al-
fabetycznej, o wiele Iatwiej maletc! Rdany arkusz.
Wymagania projektowe
Od czego r a c e ? Od listy wymagati dotycqcych aplikacji. W trakcie projektowania
motesz sprawdzat tq list?, aby miet pewnoit, t e uwzglpdnile4 wszystkie podstawowe
wymagania. Projcktowana aplikacja powinna:
sortowat arkusze (zwykte i wykresu) aktywnego skoroszytu w kolejnosci
alfabetycznej,
byC prosta do uruchomienia,
by6 zawsze dost~pna(innymi s k y , utytkownik nie powinien bye zmuszony
do ohvicrania skomzytu, aby m6c skorzystad z nmcdzia),
dzialat poprawnie w prypadku kazdego otwartego skoroszytu.
Dostqpne informacje
Czpsto najtrudniejsq fazq projektu jest stwierdzenie, od c a g o rozpocqd jego realizacjp.
W tym przypadku na poczqrku zebratern informacje o Excelu, ktdre mogq by6 zwiqzane
z wyrnaganiami projektowymi.
I Excel nie oferujs polecenia sortujqcego arkusze. A zatem zarejestrowanie makra
sortujqcego arkusze w kolejnogci a l f a b ~ t y c ~nie
e j wchodzi w gq.
Arkusze mogq byd z tatwoiciq przenoszone poprnz przeciqgniqcie ich kart.
Pamiptaj, aby uaktywnid rejestrator makr i pneciqgnqf arkusz w nowe miejsce.
a nastepnie sprawdzi6, jaki kod M k w y zostal wygenerowany po wykonaniu
opencji.
Excel dysponuje poleceniem Prrcniei lub Ropiuj arkusr zawartyn~w menu
Edycja. Czy zarejestrowanie makra w trakcie utywania tego polecenia spowoduje
wygenerowanie innego kodu n i t w przypadku rpmego prnnoszcnia arkusza?
B@p musial mad l i e arkuszy aktywnego skoroszyh~lnformacjq t a b uzyskarn
przy utyciu instrukcji jpqka VBA.
Bedp musial m a t n a m y wszystkich arkuszy. I tym razem informacje uzyskarn
przy utyciu instmkcji jpzyka VBA.
Excel posiada po1eceni.c sortujqoe dane zawarte w komdrkach arkusza.
Parniqtaj, aby przmidC nazwy arkuszy do zakresu i utyC tego polecenia
lub spnwdzid, cry j e y k VBA nie dysponuje metodq sormjqcq, z ktorej rnotna
skonystad.
Dziqki oknu dialogowemu 0 ~ 4r%
n a h z latwolciq m o h a do makra przypisad
skr6t klawiaturowy.
Jcfli makm majduje sip w skoroszycie makr osobistych. zawsrr bqdzie dostqpne.
B Bpdp potrzebowal metody umotliwiajqmj tcstowanic aplikacji w trakcie jej
twonenia. Na pewno nie b@p chcial jej testowd pny W c i u tego samego
skoroszytu. w ktdrym w p r o w a d m kod trddtowy.
Pamiptaj o stwarzeniu tymczasowego s k o r a s z p pnunaczonego do celdw
testowych.
JeSli s t w q poprawny kod irddlowy, interpreter jczyka VBA nie wygmctuje
tadnych b d d w .
Pamiptaj, aby rny6leb pmyszbiciowo ...
Spos6b realizacji
Co prawda, nadal nie mam dokklnego planu dzidania, ale mogq opracowaC jego w s t q ~ ~ ~ ~
zarys opisujqcy og6lne zadani4 ktdrych wykonanie jest koniecme. Oto one:
I identyfikacja aktywnego skoroszytu,
I pobranie listy nazw eskuszy skomnytu,
Rozddal9. Zastasowanie procedur Sub jezyka VBA 249
policzenie arkuszy,
posortowanie nazw arkuszy (w jaki9 sposdb),
B uporqdkowanie arkuszy w kolejnoici alfabetycmej.
Poszukalem w systemie pomocy jqzyka -VBA inforrnacji o metodzie Hove, ktbra sk2y
do przenoszenia arkusza w nowe miejxe skoroszytu i w dutym stopniu jest n v i e n a
z wykonywanyrn zadaniem. Metoda pobiera t e t argument identyfikujqcy pobtenie ar-
kusta. P6hiej uaktywnifern rejestrator makr, aby qrawdzit, czy polecenie ~ r z e n i e i l u b
kopiuj a r k zawarte w menu Edycjo wygeneruje inny kod M l o w y . Jednak o k d sic
identycmy.
Nie tak! Po chwili namystu uiwiadomilem sobie, Ze rnuszq policzyC arkusze zawarte
w skoroszycie. Uzytem takiej instrukcji:
7 ActiveWorkbook .Sheets .Count
Rysunek 9.8.
Aby przetestowat
instrukcje.
u@ okna
Immediate edytora
Visual Basic
Konstrukcja For Each . . . Next jest pnydatna w przypadku przetwarzania katdego ele-
mentu zbioru. W celu przetescowania konstrukcji utworzylcm krdtkq procedurq:
Sub Test( I
For Each Sht In ActlveNorklmk.Sheets
MsgBax Sht .Name
Next Item
End Sub
Kolejny sukces. Makro wyfwietla m y okna komunikatdw, z ktbryeh keMc zawiera innq
nazwp arkusza.
Wstepne przygotowania
Teraz rnam jut wystarczajqcq wiedzt, aby rozpoczqt t i v o m i t kodu bodtowego
1
z prawdziwego zdarrenia. Jednak zanim to nastqi, musq przepmwadziC wstepne p r y -
gotowania Aby od~vorzyfto, co jutmbilem, wykonaj n a s t v u j ~ operacje:
e
1
I
1. Utwdrz pusty skoroszyt zawierajqcy pic6 arkuszy o nanvach Arkuszl. Arkusz2, i
Arkusz3, Arkusz4 i Arkusz5. 1
2. Pnenie4 losowo arkusze, tak aby nie byly ufo2one w taden uporzaldkowany spos6b.
3.. Zapisz skoroszyt pod n a n q Tesr.xls.
f Rozddal9. + Zastosowanie procedur Sub jezyka VBA 25 1
Rysunek 9.9.
Pusta pracedura
zawarta w module
majdujqcym sip
I w skoroszycie makr
I osobistkch
Wpmwadmn ponitszy kod tr6dlowy, kt6ry umieszcza nazwy arkuszy w tablicy Sheet-
Names. W Mli zastosowa4em funkcjjg MsgBax tylko dla uzyskania pewnoSci, t e nazwy
arkuszy rzeczywikie zostaty urnieszcwne w tablicy.
Sub %Sheets()
Dim SheetNamesO as String
Dim t as Integer
-
Dim YleetCount as Integer
Sheettaunt AttiveWork~ok.Sheers.Count
-
ReDm SheetNams(1 To SheetCount)
-
For 1 1 To Sheetcount
heetNames(i Activel(orkbook.Sheets(i .Name
MsgBox Sheetbin?$(i
Next 1
End Sub
Jestem gorqcym rwolennikiem testowania kodu fnSdIowego jut w trakcie jego tworze-
nia. Po uzyshniu pewnoici, 2e kod frddlowy d t i a h poprawnie, rnoZna usunqt funkcje
MsgBox. Po jakimt czasie takie okna komunikatdw staj@sitirytujqce.
I
s2 Zarniast funkcji Msg8ox rm!na w trakcie testowenla hvorzonej apllkacjl rastosowa6
m t o e P r f n t oblsku Debug, M6ra w u j e wy5wlet8nie lnfomacJ u oknle
Immediate. Przyktadowo zarnlast funkc], FsgBox u?j instrukcjl:
Debug.Prlnt SheetHames(i )
Mstoda Print Jesto wlele rnnlej irytujqca od funkcji h & x .
Na tym etapic procedura Sortsheets tworzy jedynie tablice nazw odpowiadajqcych ar-
kuszom aktyrmego skoroszytu. Pouwtajq dwa kroki do wykonania. Pierwszym jest po-
sortowanit wartoici tablicy SheetNames, natomiast dmgim ponowne uponqdkowanie I
Tablica moZe by5 sor&owanana wielc spomMw. Zdecydowakm sip zastosowaC metode
sortowania bqbelhego. Nie jest szczeg6lnie szybka, ale tam do kodowania. W pmy-
padku tej aplikacji duta szybkogf nie jest wymagana.
Rozdzial9. Zastosowanie procedur Sub jezyka VBA 253
---
Dim T m As String
F i r s t LBound(List)
Last UEound(Lisc)
For i f i r s t To Last : -
-
Far j i + 1 To Last
--
If L i s t ( i ) > L i s t [ J ) Then
Tmp L i S t [ j )
End tf
-
List(j) Llst(i)
L i s t ( i 1 Terrp
Next j
Next i
End Sub
For i -
&Dim SheetNms(1 i o SheetCount)
I To SheetCaMt
-
SheetHams(1) PrtiveUarkbaak .Sheets[i I . Name
Next 1
Call BuUleSort<Sheett&mes 1
End Sub
--
Last UBound(List)
For j -
For ! F i r s t To Last - 1
1 A 1 To Last
I f L l s t ( 4 ) z L i s t ( j ) Then
-
Temp L i s t ( j )
List(j) List(i:
List!i)
End I f
-
Tenp
Next j
Next 1
End Sub
Procedura Sheetsort zawiera term tablicq zlotonq z posortowanych nanv arkuszy ak-
tywnego skoroszytu. Aby siq o tyrn przekonak, rnotna wySwietliC zawartosc tablicy
w oknie Immediate edytora Visual Basic. W tym celu na kohcu procedury SortSheets
nalety umieSciC nastepujqcy kod frbdtowy fjesli okno Immediate nie jest widocme.
nalety wcisnaf kombinacjq klawiszy Ctrl+G):
For i -
1 To SheetCount
DeSug.Print SheetNams(1)
Vext i
Na razie wszystko idzie dobrze. Teraz muszq napisat kod Wdlowy porzqdkujqcy arkusze
zgodnie z kolejno8ciq elernentdw tablicy SheetNames. Przydatny okate sip wczeiniej za-
rejestrowany kod. Czy parnietasz instrukcjq, k t d q zarejestrowalern, gdy pnenositern
arkusz skoroszytu, tak aby stat siq jtgo pierwszym arkuszem? Oto ona:
Sheetst'Arkusz3") .rove Before :- Sheets( 1: 1
I
Po chwili narnysfu bylem w stanie napisat mllq For . . . Next przetwarzajqcq katdy arkusz
i przenoszqcq go w odpowiednie rniejsce okreflone przez polotenie elernentv tablicy
SheetNarres:
Fjr i - 1 To SheetCount
Sheets(SheetNaves! 1 .rove Befare :- Sheets( i:
Next i
-
Dia i AS I n t q e r
SheetCount k t i v e m r k b k .Sheets. Count
-
ReDiin SheetNams(: To Sheetcount)
For i 1 To Sheetcount
-
SheetNames( i1 A c t i v e l i o r l h ~.Sheets{i). Name
Rozdziat 9. Zastosowanie procedur Sub jezyko VBA 255
Next 1
-
Call BubbleSort(SheetNames)
For i 1 To Sheetbunt
ACtiveWorkbwk .Sheets(SheetNames(i ) .Move -
Before :- ActiveWorkbaok .Sheets(i I
Next 1
Ena Sub
-
OkreSla l i c z k arkuszy i z n e n l a r o n i a r t a b l i c y przy u t y c i u i n s t r u k c j i ReDim
Sheetcount ActiveUorkbwk.Sheets.Count
ReDls SheetNames(1 To S h e e t h n t )
-
Wypetniente t a b l i c y namami arkuszy
For i 1 To Sheetbunt
-
SheetNames(1) hctiveUorkbodk.Sheets(i) .Name
Next i
'
-
Przenoszenie drkuszy
For i 1 To S h e e t h n t
kt1veWsrtbock .Sheets(SheetNames( i) ) .Move
Fefore :- ActlveNorkbook .Sheets(t
Next 1
End Sub
Dodatkowe festy
Miakm ochoQ na tym popnesta6, ale przeciet na razie pracadura sprawdzih sip tylko
w przypadku skoroszytu Test.rls. Zaladowalem wipc kilka innych skoroszytdw i po-
nownie uruchomikm pmcedtq. Wkr6tce stwierdzilem, 2e pproccdura nie jest dmkonata.
Tak naprawde daleka byla od doskonaloSci. Zidentyfikowakm nastepujqce problemy:
a Sortowanie skoroszytbw zawierajqcych wielt arkuszy zajmuje du2o m u ,
poniMlt w Qakcie wykonywania operacji przenoszenia zawartoX ekranu jest
cab czas uaktualniana
256 Czge Ill + J ~ r y kVlsual Basic for Applications
Usuwanie problem6w
Usunivie problemu zwiiganego z uaktualnianiem zawartoSci ekranu bylo bardzo pro-
ste. W celu wylqctenia funkcji odSwietania zawartoSci ekranu na pac~gtkuprocedury
Sortsheets umieScilem nastppujqcq instrukcjq:
Ppplication.kreenUpdating - False
Instntkcja powoduje ,,zarnrofmie" okien Excela na czas dziaiania makra. Dodatkowq
korrykiq takiej operacji jest tet maczqce zwiqkszenie szybkofci d z i a h i a makra.
Proste bylo tet u s u n i ~ i eproblemu z proceduq Bubbl eSort. Aby w nazwach arkuszy
wyst~powalysame dute litery, uqlern funkcji UQse jqzyka VBA. Poprawiony wienz
kodu Mdlowego ma nastcpujqcq postak
I f UCase(Llst(t)) > VCasetLlst(j)) Then
-
On Ermr Resume Next
Sheetbunt ActtwWorkbook.Sheets.Cwnt
I* Err o 0 Then Extt Sub ' Brak attyrmego skoroszytu
Rozdziat 9. + Zastosowanie procedur Sub iezvka VBA 257
Zniana rozmiatu t a b l i c y
ReOim SieetNames(1 To SheetCount)
-
'
Zapisanie odwolania do aktywnego arkusza
Set OldActive Activesheet
-
Wypelnielie t a b l i c y nazwarni arkuszy
Fcr i 1 To SheetCwnt
-
SheetNamesC 1 I Ac:iveWorkbook.SheetsIi 1 .Name
Next 1
'
Sortmanie t a b l i c y u porzadku rosnqcym
C a l l BubbleSort(SheetNames)
Ocenianie projektu
A zatern dotarlc6 do tego etapu. N q d z i e spehia wszystkie wstppne wymagania pro-
jektowe. Somje arkusze aktywnego skoroszytu. Mote by6 z lahvoSciq wykonane. Jest
zawsze dostppne i wydaje sic dzialaf w przypadku dowolnego skoroszytu. Ijeszcze nie
widzialern, teby to rnakro wyfwietlalo kornunikat blcdu jczyka VBA.
%
<!, Z procedurq w d a l s m ciqgu jest mlqzany Jedenpoblem. Polega on na tym.
i e sortowanie jest proste i rnoie nie zawsze .loglcme". Pnykladowo po wykonaniu
sortowania arkusz Arkusrll Jest umleszczany pzed arkuszern Arkusz2. WleksmlC
osdb chcialaby, aby to arkusz ArkuszZ znalazt siq przed arkuszern A r t u s z l l .
Naplsany przeze mnle dodatek Power Utility Pak zawiera macznie bardziej
zaawansowane narz-le sottujqce arkuaze. ktbre allmlnuje *yD( omdwiony yrobkm.
Rozdziat 10.
Tworzenie procedur Function
Funkcja jest procedurq jpzyka VBA m c a j q c q wartosir. ~unkcjernogq by6 stosowane
w kodzie ir6dlowym napisanym w jqryku VBA lub w formutach. Jqzyk VBA umotliwia
tworzenie procedur Sub i Function. Procedury Sub orndwitern w poptzednim mzdziale.
natomiast procedumm Function p o f w i ~ ten
e rozdziat.
W tym rozdziale wyjdniq, jak tworzyf niestandardowe funkcje. Zamieszcz~w nim let
wiele prryktadow.
Funkcja niestandardowcl I
JeSII ui)iwasz Excela 2000 lub nowszego, nle ma powodu, dla Mdrego warto w
to
m
1.0 tv funkcje. m a r c z y zsrtasowat funkcje StrReverre jezyka VBA.
-
StringLength LentInString)
-
For ! StrlngLength To 1 Step - 1
.
Reverse Reverse 6 n i d : I ~ S t r i n g . i 1;
Next i
End Function
Ryrunek 10.1.
Zastosowanie
w formule arkusza
niestandardowe]
funkcji
Ryrunek 10.2.
Zastosowanie
niestandardowej
funkcji w procedune
j e m a VBA
Sub ReverscIt()
-
Dim UserInput AS Strlng
UserInput InputEox('Wpmdf tekst:')
.
Msgbx Reverse(User1nput). UserInput
End Sub
-
Dim StringLength As Integer. I As Integer
- --
Reverse "
StrlngLength Len(lnString1
For I StrtngLength To 1 Step -1
Reverse Reverse L Mld[InString, i. 11
Next t
End Function
Procedura rozpocyna sic siowem klucmwym Function zamiast Sub. a po nim majduje
sip nanva funkcji - Reverse. Ta funkcja utywa tylko jcdnego argumenhl (Instring)
zawartego w nawimch akqglych. As String defmiuje typ danych wartoici nvracanej
p m z fwkcjt. Jelli nie zwtanie podany taden typ danych, Excel we typu Variant.
Procedury Function
Niestandardowa procedura Function ma wiele wspblnego z proceduq Sub. Aby uzyskat
wiwej informacji na ternat procedur Sub, nalety zajrzeC do rozdziahr 9.
Deklarowanie funkcji
Skladnia deklaracji funkcji ma pstaC:
:Pub1 i t Privatel[Stmicl Funcion n a m ([ lista-argunent&ll [k typl
-
[Instrukcjel
[narwa wyratenfe]
[Exlr F ~ m c t i a n l
-
[instrukcjel
C n a m wateniel
End Function
Aby stworzyt niestandardowq funkcjp, najpitnv nalety wstawit modut VBA. Motna
tet posh2yC sip jut istniejqcym modulem. Wprowadf s b w o kluczowe Function, a za
nim nazwq funkcji i list? argumentdw (jeili sq koniecme) w nawiasach okmglych. Za
pomocq slowa klucmwego As (opcjonalne, ale zalecane) motna zdeklarowat typ da-
nych zwracanej wartosci. Wprowadt kod trtklfowy jezyka VBA realizujqcy zadanie.
upewniajqc sic, t e wewnqtrz procedury Function przynajmnicj raz odpowiednia wartoit
zostata przypisana m i e ~ emajqcej
j n w funkcji. Zakoncz funkcjp, u w a j q c insbukcji
End Function.
Nanv funkcji dotycq takie same zasady, jak nanv zmiennych. JeSli planujesz utycie
w formule arkusza niestandardowej funkcji, upewnij sip, 2 jej m a nie ma postaci adresu
komdrki. Pnykhdowo funkcja o nazwie 521 nie zadtiah po urnieszczeniu w formule.
Poza tym unikaj utywana nazw wbudowanych funkcji Excela. JeSli wystapi konflikt
nanv, Excel zawsze utyje funkcji wbudowanej. -
Zasiqg funkcji
Zasiqg funkcji - w podobny spmdb, jak zasig procedur orndwiony w rozdziale 9. -
okreila, czy funkcja mote rnstat wywoha p r z ~ procedury z innych moduh5w lub arkuszy.
Oto kilka infonnacji o zasipgu funkcji, o k t w c h nale2y pamiqtaC.
w JeSli nie wstanie zdeklarowany zasitg hnkcji, domfllnie b-e zastosowany
zasiqg identyfikowany przez slowo kluczowe Pub1 ic.
I
Rozdziol 10. + Tworzenie procedur Function 267
Instrukcja wykonujc funkcje SumArray, pobierajqcq argument HyArray, nvraca jej wynik
i pnypisuje go zmiennej Total. M o h a t e t utyC metody Run obiektu Appl Ica t~on. Oto
pnykhd:
Total - Appl tcation.Run('Sm4rray". "WArray')
Pienvsq argument metdy Run jest nazwq funkcji. Kolejne argumenty reprezenhjq argu-
mendy) hnkcji. Argumenty rnetody Run mom byf literaiami (jak powy2szym pnykladzie),
liczbami lub zmiennymi.
1 Wywolanie funkcji poprzez umleszczeniejej w formule arkusza
I
Stosowanie niestandardowych funkcji w formule arkusza jest podobne, jak w przypadku
wbudowanych funkcji, z tqr6hicq. 2c musiu. sic upewni6, c y Excel potrafi zlokalizowad
procedure Function. JeSli procedura Function majduje sig w tym samym skorosqcie,
nie trzeba podejmowa6 Zadnych dodatkowych krok6w. JeSli jest umieszczona w innyrni
skoroszycie, hzeba poinformowat Excel o jej lokalizacji. Mokna to mbiC na trzy sposoby:
Popnez umimczenie pned nazw(6.nkqji odwdania do pliku. Aby na przyklad
utv6 funkcii o nanvie CountNames zdtfiniowanei w otwarhrm skomzvcie
W prteciwiehstwie do procedur Sub procedury Functl on nie pojawiajq siq w oknie dia-
logowym Makro pa wybraniu z menu Narzqdrirr pozycji Makro. a nastpnie Makra.
Rdwniet jdli kursor zosral umieszcmny w obuarre procedury Function, po wykonaniu
polkenia Run SuWUserForm zawartega w menu Run edytora Visual Bait lub wci5niviu
klawisza F5 nie bqj& motliwc wybranie funkcji Zostanie wtedy otwam okno dialogowe
hfacro umotliwiajqce wybranic makra, kt6re zostanie uruchomione. W efekcie w celu
przetestowania tworzonych funkcji koniecme k d z i e wykonanie dodatkowych operacji.
Jedna z metod polega na stworzcniu prostej procedury wywdujqcej funkcjq. IeSli funkcja
zostaia shvomna z my4lq o utyciu jej w formutach arkusm, w celu jej sprawdzenia
motna zdefiniowat formu+$.
Sfi* Jefll lomwta utywa nbstandardowe] bnkcji i z k c a wartog b@du#AffG!, omacza to,
te w snkc]l wystrpll b+qd. Mogq go powodcnvaf b w loaczne kodu tr6dkwego
na skutek przekazania funkcjl niepoprawnych argurnent6w lub wykonania nledonvplone]
operecjl taklej, jak pr6ba miany fonnatowanla korndrki. Zapomaj sie z ZawartoScig
punktu .FunkcJe wykrywajqce I usuwajqce wdy"w dalsze] cefci rozdziatu.
Przyklady funkcji
W tym punkcie zaprezmtujp kilka pnykladbw efektymego stosowania argumentdw
funkcji. Nawiasem m6wiqc, zawart06t punktu dotyczy t e t procedur Sub.
Wszystkle W d y w r n l e m e w tym punkcle majdujq sie na ddqczonym dysku
Rozdziof 10. + Twonenie wocedur Function 269
-
Ponowne wynaklenis kola
Wy+qcmiedla zabawy naplsatem wtasnq wersk funkcjl 1ITERY.WIELKIE Excela (zarnienia wszystkie
maki taficucha na d u k ) i nazwakm jq UpCase. Oto ona:
Function UpCase(1nString As String) As String
'
Zamienia w argumencie makl na dute (z wyjatkiem polskich l i t e r )
Dim StnngLength As Integer
0-rn i PS Integer
D:m ASCIIVal As Integer
O l m Cr~arvalAs Integer
-- -
StringLength Len(1nString)
UpCase Instring
--
For i 1 To Stringlength
ASCIIYal Asc(Mld[InStrlng. i.111
CharVal 0
-
I f ASCIIVal >- 97 And A S C I I V a l <- 122 Then
CharVal -32
-
MidCUpCase. 1. 1) Chr(ASCIIVa1 CharVal 1
End I f
Next I
End Function
Naleiy z a u w w , t e oparkm sie pokusle p6jjfcia na latwlmq i nie utykrn funkcjl UCase jezyka
VBA. Clekaw bytern, czym niestandardowa funkcja rdtni sig od funkcji wbudowanej, dlatego
stwonytem arkusz wywolujqcy 20 000 razy funkcje. ktdrej argumentem byl takuch ztoiony z 26
makdw. Obliczenia w arkuszu zajety okoto 9 sekund. Nastepnie wstawitem do arkusza funkcjp
1ITERY.WIE:KIE i ponownie wykonatem test. Tym razern obliczenia zostaty vqkonane prawie na-
tychmiast.
Moja funkcja UpCase nle jest optynalna w W p a d k u tego zadania, ale bez obaw rnogg powiedzid, ie
nlestandardowa funkcja pod wgl@ernsrybkoSci nlgdy nie dordwna wbudowanyn funkcjom Excela.
. .
-
. Zwraca name aktualnego utytkmnika
User nppl icatlon.UserNarne
End Function
.. .- .
Funkcja k c a wMciwoSC Useflame-obiektuApplricat ion. Wart056 wlafciwoici majduje
sip w oknie dialogowym Opcje (zaktadka Ogdlne) i jest pnechowywana w rejeseze
systernu Windows. Po wpmwadzeniu ponbzej formuly w kom6rce pojawi siq nazwa
aktualnego u2ytkownika (przy zahtmiu. fe jest ona popramie pncchowywana w rejestize
systemu Windows):
Aby zastosowat funkcje w innej procedurze, konieczne jest przypisanie jej zmiennej,
u2ycie w wymeniu lub u e c i e jako argumentu innej funkcji. W poni2szym pnykhdzie
wywowana jest funkcja user; woat& r! jest m a c a n a jako argument funkcji MsgBox.
Operator 8 tqczy literal laficuchowy z wynikiem funkcji User:
S L ShowUser(
~
MsgBox 'Nazywasz 51C " 8 User0
Erd Sub
-
Applicaticm.Volatile True
NonStaticRand RndO
End Function
Je511 argumentem metody Volatile W z i e False, funkcja zostanle pcnownle wykonana tylko wtedy.
gdy jeden lub wiwej jej argument6w zmleni sig w wyniku tej operacji. JeOli funkcja nie poslada
argurnenMw, to funkcja nle W z i e powt6mle wykonana.
Aby wymusiC ponowne wykonanie wrystklch obllneh uwzglednlajqcych niestandardowe funkcje
trwale, nalety wclsnqC komblnecje klawisry Ctrl+Alt+FS. Taka kombinacja. je91i zostanie u w a
w pnyk+adzlezaprezentowanyrn w rozdzlaie, wygeneruje nowe liczby losawe dla funkcji StaticRand.
Z kilku powod6w nie jest to wlafciwa metoda. Po pierwsze, formuta jest zbyt dotona,
p m z co nudno j q m z u m i e f . Po drugie. wartohi sq na & wprowadzone do fornub,
na skutek czego trudno jq modytikowat.
--
Function Cumnlsslon(Sa1es)
Const Tier1 0.08
-
Cons: Tier2 0.105
Cons: Per3 0.12
272 CzefC Ill + Jewk Visual Basic for Appllcationr
- -
Case 20000 To 39999.99: Canniasion Sales * Tier3
Case Is >- 40000: C m l s s i o n Sales * Tier4
End Select
End Function
Po umiesrcaniu funkcji w module VBA motna jej utyt w formule arkusza lub wywolat
z innych procedur jqzyka VBA. Gdy wprowadzisz do kombrki p o n h q fomul$:
-
Dtm Sales As Long
Sales I m t B a x ( "Wpraradt wartost sprzedaiy: ')
MsgBax ' P m t r j a wynosl ' 1 tomnissiontSales)
End Sub
Procedura Sub dziala, ale raczej jest niestarannie napisana. Ponitej majduje sip jej mz-
szenona wenja wySwietlajqca sformatowane wartoici i wykonujqca p ~ t l edo momentu
klikni-ia p n e z utytkownika prrycisku Nje (rysunek 10.3).
Rysunek 10.3.
Zastosowanie ttfnkcjl
do @wiet/enb
wynlku obliczenla.
Sub CalcComn( 1
Dlm Sales As Long
. .Dlm.&g As String. Ans AS Strlng . , .: , ,
. . .
-
*
Probba o padante w a r t o ~ c isprzeda&
Sales Val (Input&x( "Wpmadi wartoit sprzedaLy :'. "Kalkulator prwizji od
sprzedaty' ))
' Twrzenle k m n i k a t u
Rozdzial 10. + Tworzenie procedur Function 273
--
Wyhletla wynlk i pros? o podante kolejnej wartofct sprzeaaty
.4ns l4sgbx(Msg. vbYesNo. "Kal kulator prwizji od sprze?latyU)
If Ans vbYes Then CaIcComn
End Sub
Funkcja utymr dw6ch wbudowanych s*ch jezyka VBA. Stah vbTab reprezentuje tabula-
tor (odstpp praed wynikiem). natomiast stafa vbCrLf wprowadza znaki powrotu karetki
i wysuwu wiersza (powoduje przejgcic do nastepnego wiersza). Funkcja Formt jqzyka
VBA wyxyfwietla wartoft w okreilonym formacie (w tym prtypadku ztotonym z prze-
cinka, dw6ch miejsc dziesipmych i lahcucha 2').
W obu przykladach procedury CalcCm funkcja Cmnissiorl musi bye dostepna w aktyw-
nym skoroszycie. W pmciwnym razie Excel wyfwietli komunikat btcdu informujqcy.
t e h k c j a nie zostala zdefirriowana.
---
Obllcza prwlzje od sprredaty w oparciu o l a t a p'acy
Cmst Tler? 0.09
tonst Tier2 0 .ID5
tonst Tier3 0.12
Cmst Tier4 0.14 -
Select Case Sales
- -
Case 0 Ta 9999.99: tomntssionl Sales * Tier1
- - -
Case BDOOO To 19999.99: Ccmnisston2 Sales Tier2
Case 20000 To 39999.99: ComnisslonZ Sales * Tier3
Case Is 4DDOD: Comnission2 Sa:es Tier4
End
End Se 1ea
CcmnissionZ
Function
- Carmisalon2 + (Comnlsslon2 * Years / 100)
Czyt nie jest to bardzo proste? W instrukcji rawierajqcej stowo kluczowe F~r.:t:or
urnidcilem jedynie drugi argument (Years) i dodatem instrukcje odpowiedruio modyfi-
h j q c e obliczenie prowizji. Ponitej mmieicikm prryklad formuty utywajqcej funkcji
C m i s s i o n 2 (alotylem, t c wartodf sprredaty majduje sig w komorce A ! , natorniast
liczba lat pmpmcowanych przez przedstawiciela w korndrce 011:
274 CzqfC Ill + Jezyk Visual Basic for Applications
Dzieki funkcji IsNumber (CZY.LICZBA) Excela, ktdra przed dodaniem katdego elementu
tablicy do sumy callkowitej sprawdza, czy element jest liczbq, m o h a wyeliminowaC:
btqd pomieszania typdw, wystepujqcy podczas prbb wykonania operacji arytmetycmej I
na tancuchu. Ponitsza procedura demonstruje, w jaki spos6b wywotat tq funkcjp z pro- 1
cedury Sub. Procedura MakeList tworzy tablicp zlotonq ze 100 elementbw i katdemu I
z nich przypisuje losowq wartoSC. Pbhiej poprzez wywolanie funkcji SumArray funkcja
MsgBox wyiwietla sum? wanogci element6w tablicy.
(
Sub Makelist0
Dim Nurns(1 To 100) As OouSle
Dim
For i - -
1 as Integer
1 Tc 100
Mums( 1 ) 2nd * 1000
Next 1
Wsg80x SurrArray(Nums)
End Sub
I
Poniewat funkcja SumArray nic deklaruje typu danych swoich argumentbw (stosowany
I
jest typ Vznant), mote tet zostad utyta w tworzonych formuhch arkusza. Pnykladowo
ponitsza formula zwraca sum? wartotci kornbrek zakresu A 1 : ClO:
Pieiwszy argument jest wymagany, natomiast drugi opcjonalny. Jefli opcjonalny argument
zostanie porninipty. Excel utyje wartoici 1. A zatem ponitsm dwie formuly zwr6cq taki
Sam wynik:
Niestandardowe funkcje tworzone w jpzyku VBA tet mogq utywat opcjonalnych ar-
gumentdw. W celu zdefiniowania opcjonalnego argumentu przed jego nazwq nalety
urnicSciC siowo kluczowe Opt~onal.Na liicie argurnenty opcjonalne muszq znaleit sip
za wymaganymi. Ponitej zamieszczono przyktad prostej funkcji zwracaja-cej nazwp
ufytkownika (aryrnent funkcji jest opcjonalny):
Function UsertOptlonal Upperbse As Variant)
-
- -
I f Isnissing(UpperCase) Then Uppercase False
I f Uppercase True Then
User UCase(App1icatian .UserName)
Else
-
User Appl ication.UserNarne
End If
End Function
JeOli wanoiciq argumentu jest Fa1 se lub jefli argument zostanie pominiqty, nazwa utyt-
kownika bedzie nvr6cona w niezmienionej postaci. JeSli wartoSciq argumentu jest True.
p r d M c e n i e r n nazwy q k o w n i k a maki w niej tawarte zostanq zamienione na duke
(przy utyciu funkcji UCase jpzyka VBA). Pierwsza instrukcja proccdury utywa funkcji
I s M i s s i ng jczyka VBA, aby stwierdzit, czy przekazano argument. JeSli argumentu nie
podano, instrukcja pmypisze zmiennej Uppercase domySlnq wartoft Fa1 se. Wszystkie
poniBze formuly sq poprawne (dwie pimvszc dajq taki sam wynik):
Aby stwlerdzlC, czy funkcjl zostal przekarany opcjonalny argument, tneba zdeklarowat
go pr2y utyciu typu danych Varlant. Po wykonsniu tej operacji rnotna w procedurze
I
uiyc funkcji I s b s s t n g zadernonstrowanej w powytszym przykiadzie.
1 '
Gdy Recalc ma w a r t o g True, funkcja s t a j e s i t nletnrala
A ~ p l i c a t i o n . V o l a t i l eRecalc
End Function
-
Draw3e Rng(Int((Rng.Count) Rnd + 1))
Wszystkie ponitsze formu+y $4poprawne (dwvie pienvsze dajq taki Sam wynik):
IDraw(A1:AlOO)
=Draw(Al:A100. Fa1se)
-0raw(Al:A100. True)
Funkcja mob. by4 pnydatna w przypadku lwowania liczb, wybierania zwyciqzcy lo-
sowania z listy nanvisk itp.
-
Function MonthNamer (
.
HOnt)rNwrs Array ('Styczeh' "Luty'. 'Marzec' .-
'Kwrecled'. 'Haj'. 'Czerwlec'. 'Lipiec". 'Sierpleh". -
'Wrzesfeh'. 'Patdziernik". ' L i s t w d " . 'Grudzietl")
End Function
F u n c t i m MonthNancs(Optlona1 MIndex)
Oim AllHalnes As Variant
-
A11Naws Array{"Styuefi'. "Luty'. 'Marzec'. -
"Kwlecleh". "Maj". 'Czerwiec'. "Llpfec', "Sierpieh'. -
.
"Urzesieh' , "Paidzlernl t' -Li stopad'. "Grudzieh')
-
IC Istiissing(M1ndex) Then
MonthNames A11Names
E: se
--
Select Case MIndex
Case Is 1
M y f t k u j e wart39C MIoder (np. 13-01
-
MonthVal ( ( M I ~ d e x- 1) Had 12)
MonthNames A1 lNeme~(HonthVal1
-
Case Is <- 0 ' Tablica pionowa
~onthNames Pppl ication.Transpose(AllNarnes1
End Select
End If
End F ~ n c t i o n
W celu sprawdmnia, czy porniniqto argument, uZykm funkcji isMissing jtzyka VBA.
W tej sytuacji nie jest motliwe podanie na liScie argumcntdw funkcji domyglnej wanosci
brakujqcego argumentu, poniewat zdehiowano j q w jej wnqm. Funkcja IsMi ssing mote
zostaf utyta tylko wtedy; gdy opcjonalny argument jest typu Variant.
W celu okreslenia wartoSci miesiwa procedura utywa operatora Hod. Operator Had
zwraca resag z dzlelenia pierwszego argumentu przez dnrgi. Przyktadowo dla argurnentu
o wartdd 13 Jest mracana llczba 1. Dla argumentu o wartoSci 23 jest mracana liczba
11 Itd. Nurnerowanie elernentdw tablicy A1 1Names rozpoczyna sig od zera i koficzy
na liczbie 11. W instrukcjl uwajqcej operatora Mod, od argurnentu funkcfi jest
odejmowana licma 1. A zatem dla argurnentu o wartolci 13 mstanle mr6cone O
(odpowlada nazwie StyczeA), natomiast dla argumentu o wartoScl 24 Ilczba 11
(odpowiada nazwie Grudzieh).
Rysunek 10.4. 1
Efekt
umieszczania
w arkuszu tablicy
lob pojedynczej
wartosci
Zakres A3: A14 zawiera liczby catkowitc z zakresu od 1 do 12. Komdrka 83 zawiera nadp-
pujqcqformutq. k t 6 q skopiowano do pozostalych 11 kom6rek majdujqcych sic nitej:
-MonthNames(A3)
- -
O i l i As I q t s e r . StringLength As Integer
Reverse " "
- -
StringLength Ler(1nString)
For i StringLength To 1 Step -1
Reverse Reverse & Mid(lnStr1ng. i . 1)
Next 1
End Function
Co prawda, ldcuch wyglqda jak wartoft Mpdu, ale p m z inne fomuty, kt6re rnogq sic
do niego odwdaf, nie jest w taki spos6b traktowany. Aby zwr6cif neczywistq wartog6
blpdu hnkcji, nalety u2yC funkcji CVErr jqzyka VBA, kt6ra zarnienia numer blpdu na
jego rzeczywistq wartoft.
Na szcqicie jqzyk VBA posiada wbudowane stale odpowiadajqce btqdom. kt6re mote
zwracat niestandardowa funkcja. Sq to wartoici M ~ d b wformut Excela. a nie btqddw
uruchornieniowych interpretera jpzyka VBA. Dostppne sq nastqpujqce stale:
xlErrOivO (#DZIEL/O!),
U x l ErrNA (BNfO!),
x l ErrName (#NAZWA?),
x l ErrNul 1 (#ZERO!),
x l ErrNum (BLICZBA!),
x l ErrRef (ADR!),
a xlErrValue(#ARG!).
Naleiy zauwaiyt, ie mienitem tet typ danych wartoki zwracane] pnez funkcjq.
Ze wzglqdu na to, re teraz funkcja mote wacd nie tylko Cficuch, typ danych
mieniiern na Variant.
280 Czpff Ill + Jszyk Visual Basic for Applications
Pierwszy argument jest wymagany, a ponadto funkcja mote mi& jeszcze maksymalnie
29 argumentbw. Oto przyklad h k j i SSUMA posiadajqcej 4 argumenty h d q c e zakresami:
,,SF.$? She kluczowe Parwarray mote byC utyte tylko dla ostatnlego afgumentu llsty
aQurnent6w procedury. Argument ten zawsze ma typ Variant i m s z e jest opcjonalny
(chaC nie stosuje slq sbwa klucmwego Optional).
P o n b fbnkcja mo2e mieC dowolnq l i c e jbdnowartoSciowych argument6w. Nie obslu-
guje argumentdw k d a ~ y c hwielokomdrkowymi zakrcsarni. Zwraw jedynie sume wartdci
argument6w.
Function SinpleSun(ParamArray a q l l s t 0 As Variant1 As h b l e
For
-
Each arg In argllst
SiMleSum SimpleSun + arg
Next arg
End Function
Funkcja SlmpleSum nie jest nawet w pmybliteniu tak elasrycma, jak W c j a SLMA Excela
Wyprdbuj jq p n y utyciu r6tnych.typdw argumentdw. Pmkonasz sit, te nie zadziah,
dop6ki ka2dy jej argument nie bpkie wartdciq lub odwdaniem do pojedynczej kom6rki
zawierajqcej wartoit.
hnkcjp SW Excela.
Zanim pnyjnysz sip kodowi W b w e m u funkcji MySum, przn: chwilp zastandw s i nad
~
funkcjq YM4 Exceh. Jest bardm miwmalna Mote psiadaC maksyutalnie 30 argument6w
(nawet puste argummty), kt6rymi mom byd wartoki liczbowe. komdrki, zakmy, tekstowe
reprezentacje liczb, wartoici logime, a nawet funkcje. Oto pnyktadowa, poprawna
formula:
I
i Rozdziot 10. + Twotzenie procedur Function 28 1
Zawiera ona wszystkie typy argummtbw, ktdre ponitej wymieniono zgodnie z kolejno8ciq
i c h utycia:
r odwotanie do pojedynczcj kornbrki,
m litera),
lahcuch dajqcy sip przeksaalcit na w a r t o i t liczbowa.
brakujqcy [pusty) argument,
warroSC logicma PRAWDA,
w wyratenie u q w a j q c e inriej funkcji.
m odwolanie do zakresu.
-
Dim Ebce As String
Mysun 3
-
' Przetwormie katdega argumntu
For i CBound(args) To UBound(aqs)
' Pominiecie brakujacych argunentb
I f Not IsMlssing(aqs(i)) Then
®lenle typu argwnentu
Select Case TypeNametargs(1))
Case 'Range" .
Utworzenle tyxzasaego zakresu obstugujqcego
-
zakresy zlotone z calych wiersry lub tolurrn
Set TempRange Intersecttargs(i). Parent .UsedRange, argsci 1 )
For Each c e l l I n TempRange
Select Case TypeNm(cel1 .Value)
Case 'Double'
-
MySm HySm + cell .Value
Case "String'
-
Mysun: UySm + EvaTuate[ce?l.Value)
Case "Error'
Select Case cell .Text
-
Case '#ZIELIO! "
RySum (NErr(xlErrDiu01
-
Case 'tNID"
NySum CVErr[xlErrNA)
-
Case 'IAPrlh?"
MySum CYErr(x1ErrNam)
-
Case '+ZERO!'
@Sum CVErr(x1 Errtiull)
282 CzeSC Ill t Jezyk Visual Basic for Applications
-
Case "XCICZBA!"
MySum CVErrlxlErrNum)
-
Case "AAOR!'
MySum CVErr(x1ErrRef)
-
Case "#ARG! "
MySum CVErr(xlErrVa1ue)
End Select
E x i t Function
-
Csse "Date"
MySun MySum c e l l .Value
Case "Empty"
+
Case "Boolean"
-
MySm MySum + 0
End Select
Next c e l l
Case "Null" Zignorhranie
-
Case "Error* ' Zwrbcenie bledu
MySum a r g s ( i )
E x i t Function
Case "Boolean'
- -
Sprawdzenie. cry wystqpil lakuch TRUE i wy&nante
I f argscl) "True" Then MySum MySun + 1
-
Case "Date"
MySum MySum args(i
Case Else
-
MySum MySum + args(i)
End Select
End i f
Next i
End Function
Parnimj, t e celem tego pnykladu nie jest tworzenie nowej wersji funkcji S U M . Przyklad
demonstmje s p o d b tworzenia niestandardowej funkcji arkusza, ktdra wyglqda i dziala
jak wbudowane funkcje Excela.
Count 0
For t
--
Function VwelCornt(r)
1 To Lentr)
-
Ch UCase<Mldtr, d . 1))
-
If Ch Like "[AEIWII" Then
C a n t count +I
284 CZ@e Ill + Jezyk Vinral Basic for Awlications
Debug.Prlnt Ch. 1
End I f
Lxt i
-
VclelCount Count
End Function
W tym pnypadku w oknie Immediate q wydwietlane wartoSci zmiennej
Ch i 1 katdorazowo po napotkaniu instrukcii Debug.Prlnt. Na rysunku 10.5
polcazano wynik d z i a h i a hnkcji, gdy jej argumentern by1 ldcuch Mississippi.
Rysunek 10.5.
Okno Immediate
umo2llwfa I 2
wy5wietlanle I 5
I I
wynikdw w Vakcie I 14
wykonpvania hmkqji
Rysunek 10.6.
Wstawianie
do formuty
niestandardowej
funkcji
PDwytsza instrukcja musi zosta6 wykonana tylko raz, a nle kaidoramwo p f q otwieraniu
ti&* skoroszytu. Po wykonaniu tej operacji, kazdorazowo po otwarciu skoroszytu funkcja
pojawi sig w zdeflniowanej kategoril.
Finansowe
Dory i ciam
286 Cz@C Ill t Jezyk Visual Basic for Applications
Rysunek 10.7.
I
Okno dialogowe
Wstawianie funkcji
wyswietla krdtkie
opisy funkcji
;a** JeSli dla niestandardowej funkcji nie zostanie zdeflnlowany opis, w oknle dlalogowym
Wstawianie funkcji pojawi sie kornunikat P m c niedostepna.
Rysunek 10.8.
W oknie dialogowym
Opcje maksa
wprowadf opls funky1
I.-
Ym nu.:
Rozdziol10.e Twmenie procedur Function 287
lnterfejs API (ang. Application Progrumming Inferfuce) systernu Windows jest zbionrn
funkcji dostqpnych dla programistbw aplikacji Windows. Pnez wywoi-anie w kodzie
M l o w y m jqzyka VBA bnkcji systernu Windows uzyshqje sic dostep do jego interfejsu
API. Wiele m o b 6 w systemu Windows utywanych przez pro,mist&w jest dost~pnych
z poziomu bibliotek DLL przechowujqcych procedury i funkcje oraz konsolidowanych
na etapie urucharniania aplikacji, a nie w czasie kompilacji.
Pnykladowo sam Excel konysta z kilku bibliotek DLL. Co prawda, kod Wdlowy za-
warty w wielu bibliotekach DLL rnbglby m t a f skompilowany bezpoSrednio w pliku
wykonywalnym excel.me. ale pmjektanci zdecydowali sic na takie rozwiqzmie, ponie-
wat pliki DLL q hdowane tylko wtedy, gdy sq potrzebne. Dziqki temu glowny plik
wykonywalny Excela jest rnniejszy. Ponadto w pizypadku bibliotek DLL wykorzystanie
pamipci jest efektywniejsze. poniewat s4 one Mowane tylko w razie koniecmofci.
Biblioteki DLL sh@ te2 do wspdMzielenia kodu fr6d)owego. Prykladowo wiqkszo3t
aplikacji Windows przy owieraniu i zapisywaniu plikdw poshguje sip oknarni dialo-
gowyrni. System Windows oferuje bibliotekp DLL, ktorej kod ir6dIowy generuje kilka
standardowych okien dialogowych. Dziqki temu programisci zarniast twonyf wlasne
proceduly, mogq wywolaf tc bibliotekp DLL.
--
D i m Win01 r As S t r i n g
WinPath Space(255)
Win01 r LeftfWlnPath. GetWi~dcwsOirectoryA -
(WinPath. Len(W1nPath)))
MsgBox WinOlr , vbInformation. "Scietka katalogu systemu Windows'
End Sub
--
Dim WnPath As Strim 255
WinPath Space(255)
Ylndu+~sOlr Left(WlnPath. GetWlndowsDirectoryA -
(Wi nPath. Len(WinPath1))
End Function
Sub Button_ClickO
-
Const V < SHI:T As Integer &HlO
IfG ~ ~ K $ ~ s ~ ~ ~ ~ ( v K - scH0I FThen
T)
MsgSox "Klawlsz S h i f t zostal wci9nlety . "
Else
HsgBox "Klawlsz Shift n i e zostal wcfSniety.'
End I f
End Sub
Je911 projektujesz aplikacje, M6re muszq byC zgodne z wszystklrni wenjami Excela,
rnuslsz by6 Swisdom kilku potendalnych problem6w miqzanych ze rgodnokiq wrsji.
wystepujqcq w ~ p a d k stosowania
u funkcfi interfejsu API. JeSli na pnykkd shvorrysz
aplikacjt: zgodnq z Excelem 97 tub jego nowszq wersjq, M6ra uiywa funkcji interfejsu
API, nia edzje rnoiliwe uruchmienie jejw Excelu 5 nawet po zapisanilu skorosrltu
w fonacle kompatybllnym. Wynika to st@, i e Excel 5 jest aplikacjq IMitowq,
natorniast Excel 97 1 nowsze wersje sq aplikacjarni 32-bitowymi. Aby uzyskd
dodatkowe informacje o tyrn problemie i wskaz6wkl urnoiliwiajqce jego mZ'Wiqzanie.
naleiy zajned do rozdzidu 26.
Rozdziat 11.
Przyktady
i metody programowania
w jezyku VBA
Wierq, t e popnez odpowiednie prryklady nauka programowania odbywa s i macmie
~
szybciej. Czytclnicy poprzednich wydah k s i w i utwierdzaj@mnie w tyrn przekonaniu.
Szczegdlnie prograrnifci u2ywajqcy jezyka VBA zyskujq na wykonywaniu przykladdw?
Dobrze opracowany prqkfad o wide lepiej objainia zagadnienie n i t jego teoretyczny
opis. W zwiqzku z tym nezygnowakm z matcrialu referencyjnego, ktory dokladnie
charakteryzuje katdy aspekt jqzyka VBA. Zarniast ttgo pnygotowalem przyklady de-
rnonsttujqce przydatne metody programowania prty utyciu Excela.
Zastasawanle prrykW6w
Nle wszystkie przyWady ramieszczone w rordziale mogq pelnlE funkc19 niezaletnych p r o g r a w .
Jednak majq postaf wkonywalnph prQcedur, Mdre moha dostosowa2 do wlasnych potmb.
Narnawlarn, aby w trakcie lektury mzddakr na bieiwo wykon* zawdrte w nirn pnvkiady.
Jeszcze leplej Wzir, jeOli czytelnik zmodyfikuje przyklady i sprawdzl. co sig stanie. Gwarantuje,
i e takie paktyczne hSwiadczenie b@zle o wiele bardzlej pomocne n i i pneuytanie ksiqiki z b
wierajqcej teoretycme opisy.
292 CzqJf Ill + Jqzyk Visual Basic for Applications
i
-< pzehmmnla zakres6w sq dostepre
Rzyk)ady ddy~~p3 na dotqcmnym dysku CDRaM.
Kopiowanie zakresu
Rejestrator makr Excela nie jest jut pny generowaniu wartdciowego kodu ir6dtowego
tak pnydatny, jak w pnypadku identyfikowania natw uzywanych obiektow, metod
i wtdciwofci. Kod ir6dlowy generowany przez rejesirator makr nie zawsze jest mak-
syrnalnie efektywny, ale nvykle pozwala uzyskaf sporo pnydatnych informacji. Przykk
dowo po zarejestrowaniu prostej operacji kopiowania i wklejania generowanych jest
pied w i e n q kodu irddlowego jqzyh VBA:
Sub MakrolO
.
Range('Alm) Select
Select l on. Copy
Range('B1') .Select
Ac:lveSheet .Paste
Appl lcation .CutCopyHode
End Sub
- False
W obu powytszych makrach przyjflo, te aktywny jest arkusz, w kt6rym jest wykonywana
operacja. Aby skopiowak zakres do innego arkusza lub skoroszytu, wystarczy okreSliC
,
odwotanie do docelowego zakresu. W ponitszym pnyktadzie zakres jest kopiowany
t arkusza Arkuszl skoroszytu P1 ~ k lxls
. do arkusza Arkusz2 skoroszytu P1 ik2.x l s . PO-
niewat odwohnia sq W p h i kwalifikowane, procedura zadziala niezal-ie od tego.
ktory skoroszyt bdzie aktywny. 4
Sub CapyRangeZ[
M r k b w k s [ ' P l l k l . x l s ' ) .Sheets('Arkuszl") .Range('Al" 1. topy -
Workbwks('P1 i k 2 . x l s " l .Sheets("ArkusrZ") .Range('Al' 1
End Sub
Sub CapyRanqeJt
--
D i m Rngl AS Range. RngZ As Range
Set Rngl Workbooks( "Pllk1,xls') .SheetstmArkuszl') .Ranget'Al')
Set RngZ Wor!&mks("Pl l k 2 , x l s") .Sheets('ArkuszZ') .Rangel'Al')
Rngl. Copy Rng2
End Sub
Rozddot 1 1. PwWody i metody programowonia w jezyku VBA 293
Motna s i domySliC,
~ te kopiowanie nie jest ograniczone tylko do jednej kombrlci Ponitsza
procedura kopiuje duty zakres:
Sub CopyRange4(
Ranget "A1:CBOO') .Copy Range('D1.1
End Sub
Miejsce docelowe jest tu identyfikowane tylko przez jednq komdrkp -gdmq leqkornorkq
wklejonego zakresu.
Przenoszenie zakresu
lnstrukcje jqzyka VBA slutqce do pnenoszenia zakresu sq bar& podobne do instrukcji
go kopiujqcych. Potwierdzeniem jest kolejny przyktad. gdzie 18 komtrrek (zawartych
w zakresie A1: C6) penosirny w nowy obszar. ktdrego g6ma lewa kornbrka ma adres H1.
Rbtnica polega na tym, t e m i a s t metody Cooy utyta zostala metoda Cut. Konieczne
jest podanie jedynic gdnej lewej komdrki docelowego zakresu:.
Sub tioveRangel( 1
Range("A1:i6").Cut Range( "HI')
End Sub
Na rysunku 11.1 pokazano bardzo cqsto spotykany typ arkusza Zawarty w nim zakres
skiada siq z kilku wierszy, ktdrych liczba zmienia sip katdego tygodnia. Poniewat nie
wiesz, jaki jest adres zalarsu w dancj chwili, w celu napisania makra kopiujqcego zakres
k d z i e wyrnagane umgl~dnieniedodatkowego kodu Wdlowego.
Rysunek 11.l.
Lids wlerszy
zakresu Uanjch
mienia s.ie
kaidego tugodnia
294 CzeE Ill 4 Jezyk Visual Bosic for Applications
Poniaze rnakro demonstruje, jak skopiowat zakres z arkusza Arkuszl do arkusza ArkuszZ
(pocuwszy od komorki Al):
Sub CopyCurrentRegronZO
t
Range("Al').Currer,tRegion.Copy Sheetst"Arkusz2").Range('Al")
End SuS
Metoda End obiektu Range pobiera jeden argument okreflajqcy kierunek w ktbrym zo-
stanie wykonane zamaczenie. Ponitsza instrukcja zaznacza zakres rozpoczynajqcy sic
od aktywnej komdrki ikoticqcy na ostatniej niepustej dolnej komdrce:
Range(Ac?iveCell. k t 1 v e C e l l . End(x1hm)).Select
Jak moma sip domyflif, tny pozostale state (xlUp, xlToLeft, xlToRight) syrnulujq
kombinacje klawiszy zaznaczajqce komorki w innych kierunkach.
Przy stosowaniu metody End nalety zachowd ostrohoSf. JeSll aMywna komdrka
@* znajduje sic na obwodzie zakresu lub zakresae
r, jednq Iub w l e j pu-h
komdrek. metoda End mote nie wygenerowaC oczekiwanych wynlk6w.
Rysunek 11.2.
Skorosryt
demonstmje
spos6b zamaczanla
zakresdw o r6tnej
wielkoJci pny
u*iu instru kcji
iezyka VBA
EL
" ,,
in:---
I
".-lp-. rP+--m--w
............. .. . . It. . . . . . . . : b
"
I
Czcsto nie tyle chcesz zaznaczyC korn6rki. ik je w jaki9 spas6b pmtwonyf. na przykM
sformatowad. Makro SelectCurrentRegion zamaczajqce korn6rki rnotna lahvo do tego
celu przystosowad. Oto prtyktad:
Sub FormatCurmtRegiono
Acti veCcl1 .CurrentRqion. Font. Bold
End Sub
- Trus
Proccdura nie zaznacza korn6rek. a jedynie fonnatuje zakres zdefiniowany jako bieQcy
obszar otaczajqcy aktywnq kombrkp. [nne procedury znajdujqce sic w przykladowyrn
skoroszycie teZ rnogqzostaf w ten spos6b przystosowane.
Jednak z proceduq zwiqzany jest problem. Jefli utytkownik kliknie w oknie pnycisk
Cancel, procedura usunie wmlkie d a m jut najdujqce sip w komdrce. Ponitua zmody-
fikowana procedwa sprawdza, czy zostal kliknicty przycisk Cancel i w takirn pnypadku
nie dokonuje zmiany zawarto9ci kom6rki:
Sub GetValueZO
-
Dlm UserEntry As String
UserEntry InputBox('Yprawadf wartolt')
If UserEntry 0 "" h e n Range( "Al") .Value - UserEntry
End Sub
--
MaxVal 12
Msg "Uprowad2 wartot€ z przedzialu ad " I HinVal K " do " & HaxVll
Do
--
UserEntry InputBox(Msg)
I f UserEntry " Then E x i t Sub
-
I f IsNumeric(UserEfitry) Then
DblEntry V a l (UserEmry)
I f DblEntry r HinVal And DblEntry <- ?(axVal Then E x i t Cc
End I f
--
Msg "Poprzednio wprowadzona wartoit by1a nieprawidlowa . "
-
Msg Msg & vbNewL1ne
Msg Msg d "Uprwadf wartofC z przedzlalu od " & MinVa: & ' do ' & HaxVal
LOOP
-
&ti veSheet .Range( "Al") .Value UserEnt r y
Ena Sub
Rytunek 11.4.
Spmdzenie
przy utyclu funkdl
InputBox jpzyka Vas
poprawno.+cl danych
wpmwadzonych pmz
uwkownika
*
&
a Funkcja InputBox zwraca laricuch. Aby zamieniC go na wartog Iiczbowq, uiytem funkcji
<!!, Val jezyka VBA, kt6rq wprowadzitem jaszcze pned instrukcjq I f Hykonujqcq operacje
pordwnania liczb.
-- -
Do
NextRcw Raw("A65536') .End[xIUp). acw + l
E n t r y l InputBox("h'prorradi imle')
--
'
IfE n t r y l " " Then E x i t Sub
Entry2 InputE'ox("l4prmadi kwote"?
--
I f Entry2 " " men E x i t Sub
Qlls(NextRar. 1) E n t r y l
@llr(NextRw. 2) Entry2
Loop
End Sub
Ryiunek 11.5.
Makro
wstawiajqce dane L,-3-A-4
do nastepnego
pus tego wiersza
iJJ!d:'.-..
All - s
iuu
c j D I
-10
E
-.B I
I F
UlLf
I
ad*
G-?--.L.-! !.-.A
arkusza K-011
910 !
I
m Ii
411
55 1
!
I
i
!
i
:-Is'
:g&** Aby przyktad byf bardtiej zrozurniaty, procedura nie przeprowadza Ladnej walldacji
danych.
Nalety zwrbcit uwagp na instrukcje okretlajqcq wa nnej NextRw. JeSli nie rozumies~
w jaki sposdb procedura dziala, sprdbuj rccmie rtoft zmie wykonat operacj~przez niq
realizowanrb czyli uaktywnit kom6rkq A65536 (ostatnia komdrka w kolumnie A). WciJnij
klawisz End, a nastepnie klawisz strzalki w gdq. W efekcie zostanie zamaczona osfatnia
niepusta komdrka kolumny A. WtaSciwoft Row zwraca numer wiersza tej komdrki.
W celu uzyskania numeru wiersza kornbki znajdujqcej sie nitej wartost te jest nviqk-
szana o jeden (nastppny pusty wiersz).
Z takq metodq zamaczania nastepnej pustej kom6rki zwiipany jest drobny problem. Jdli
kolumna jest ~ p e h i pusta,
e jako nastqpny pusty wiersz metoda wymaczy wiersz 2.
a&%* Nie nalety mylie metody Inputbx Excela z funkcjq jezyka VBA o takiej same] name.
Co prawda, obie funkcje rnajq jednakowq name, ale r62niq slq mi* sobq.
Ponitsza procedura Sub dernonstruje, jak wstrzymaf prace makra i umotliwiC utytkow-
nikowi zaznaczenie komdrki:
Sub GetUserRanget )
Din UserRa~geAs Range
i Rozdzid 1 1.4 Prryktady i metody prograrnowania w jezyku VBA 299
--
Output 565
-
Prm~t "Zaznacz wyjScim8 kc.-brke."
T i t l e 'Zaznaczanie kmBr4i"
Wyswietlenie okna m i l i w i a j ~ c q oworowadzenie danych
-
On Error Resume Next
Set UserRange Agpl icaf7,n. Icwt@ox(-
Prompt :-Prompt. -
T1tie:-Title. -
Default:-ActiveCe11.Mdwr~.-
Type:-8) Zaznaczenic zz<r+su
On Error GoTo 0
End Sub
Rysunek 1l.6.
W celu wstnymania
pracy makra u& okna
<Sl* JeSli nle jest wtqczone odswietanie mwartofci ekranu, nie Wziesz w stanie
zaznaczyd kambhi. Aby kontrolowd odfwietanle ekranu w trakcie wykonywania
makra, nalety ui$ wlakiwoki ScmUpdat~ngoblektu bppl icat~an.
j -
JeSli aktywny arkusz zawiera zakres o nazwie dane, ponitsza instrukcja z m i e ~ e Cell
Count przypiue lit*jego korndrek:
Cell tount - Ranget 'dane') .Count
Oczywifcie rnotnrr tet przy utyciu wlaSciwoSci Rows o k d l i f liczbp wierszy zakresu.
Ponitsza instrukcja okreila liczbq wierszy zakresu o nazwie dane i przypisuje wartosc
zmiennej RMount:
-
RawCount Range("daneS).Rws .Count
-
Case RangeArea.Cells.CPunt
AreaType 'Kan6rira"
- 1
Rozdzial 1 1. + Plzyktady i metody programowania w j$zyku VBA 301
- - -
Case RangeArea.Count Cells .Count
AreaType 'Arkusz'
-
Case hngeArea.Rows .Count i e l i s . Row5 .Count
AreaType "Kolurma-
-
Case bngeArea.Co1umrrs .Ccunt C e l l s .Co!umns . bunt
-
AreaType "Wlersz"
Case Else
-
AreaType "Blok"
Enc Select
End Funct~on
Rysunek 1 f .7.
Procedura
AboutRmgeSefee
tion analimje
aktualflie
zaznaczony
zakres
302 CzgfC ill 4 Jqzyk Visual Basic for Applications
Listing 11.l.
Procedura ustawiajqca czerwony kolor tfa dla komdrek pnechowujqcych warto5C ujemnq
Sub SelectiveColorl( i
'
Jefl i wartoSt j e s t ujen~na,zmienia kolor ria kom6rki nz czerwony
D i m cell As Range
Cor.st RED!NOEX -
l f TypeNane(Selection1 <> "Range" Then E x i t Sub
3
-
Apol i c a t i o n .ScreenUpdati ng Fa1se
For Each cell In Selection
I f cell .Value c C Then
-
cel I.1nterior.ColorIndex REDItGEX
Else
-
c e l l . 1nterior.ColorIndex x l N o w
End I f
Next c e l l
End Sub
a Ignoruje bledy
Cn Error Resurre Nex:
--
Tnorzy pdzbiory cryginalnego zaznacmia
Set FomlaCells bl~tion.SpecialQ1ls~x~Fonulas.xlNmbers)
Set ConstentCells Selectlon.Specia12lls(xlCsrstants. xlNLmbers)
Rozdzial 1 1. t Przyklady i rnetody programowanio w jezyku VBA 303
On Error GoTo 0
Przetwarza k d r k i formul
I f Not FonnulaCells I s Nothing Then
For Each c e l l I n F o m l a C e l l s
I f c e l l .Value c 0 Then
c e l l . I n t e r i o r .ColorIndex - REDINDEX
Else
c e l l . 1ntenor.ColorIndex
End If
- xlNone
Next cell
End If
End If
c e l l . lnterlor.Color1ndex - xlNone
Yext c e l l
End If
End Sub
s2&%*
<-?*
Zastosowanle instmkcjl On Ermr lest konlecme. poniewat rnetoda SpeclalCells
-'
generuje bhd. gdy tadna komdrka nle spdnla kryterlurn. tnstrukcja zajmuje sle tez
obshrgq wszystklch przypedkdw. w ht6rjch podczas wjkanywania procedvry
nie za&aczono zakresu.
-
Applicatim.kreenUpdating False
For r LastRow To 1 Step -1
If hpplication.WorksheetFunction.CountA(Racj(r)) - 0 Then Rows(-).Delete
Next r
End 5110
300 C z e e Ill Jewk Visual Basic for Appllcotions
JeSli aktywny arkusz zawiera z a k m o nazwie dane, poni2sza instrukcja zmiennej Cell -
Count pnypisze liczbq jego kornbnk:
CellCount - Range( "dane') . b u n t
Motna tet okreSli6 liczb~wierszy lub kolumn w zakresie. Ponitsze wyraZenie wymacm
liczbp kolurnn majdujqcych siq w aktualnie zaznaczonym zakresic:
Selectlon.Columns .Count
Oczywifcic rnotna te2 p n y utyciu wlaSciwoSci Rows okreSlif liczbp wienzy zakresu.
Ponitsza instrukcja okreSla liczh wienzy zakresu o nazwie dane i przypisuje wartosc
zmiennej Rodaunt:
R&unt - Range("dane'1 .Rars. Count
JeSli Acres zostal definiowany p n e z wiele zaznaczeb. obiekt Range h d z i e sip skladaC
z oddzielnych obszar6w. Aby shvierdzit, czy zaznaczenie jest zaznaczeniem wiclokrot-
nyrn. nalety utyC metody Areas zwracajqcej zbior Areas. Zbidr reprezentuje wszystkie
obszary wchodzqce w skhd mkrcsu stwononego poprzez melokrome zamaczenie.
W celu stwierdzenia, c y wybrany zalcres posiada wiele obszarow, nalety zastosowaC
wyrntenie podobne do ponitszego:
FILlmnreas - klectlon.Rreas.tount
-
Case RangeArea .Cells .Coun-.
AreaType "Kombrka'
- 1
Rozdzial 1 1. + Pnyklady i metody programowonia w jezyku VBA 301
- - -
Case RangeArea .Count Cell s.Count
AreaType 'hrkusz'
-
Case RangeArea .Rows. Count i e l ls.Rows .Count
AreaType 'Kolunnz"
-
-
Case RangeArea .Coi mns .&UP.:
AreaType 'Wiersz'
Cell s .Columns.Count
Case Else
-
AreaType 'Blok"
End Select
End Function
Ryzunek 1 1.7.
Pmcedura
AboutRangeSeI~
tion analizuje
aktualnie
i raznaczony
I zakres
302 CzeiC Ill + Jezvk Visual Basic for A ~ ~ l i c a t i o n s
Listing 11.l.
Procedura ustawlajqca czelwony kolor tla dfa komdrek pnechowujqcych wart056 ujemn$
Sub SelectiveColorl( i
+
Je9li wartoit jest ujemna. zmienia kolor t i a k m r k i na czenrony
Dim cel: As Range
IfTypeName(Se1ection) cz "Range" Then E x i t Sub
Const REDINDEX 3 -
A ~ pication.ScreenUpdating
l - False
For Each cell I n Selectton
Ifcell .Value < 0 Then
-
cell .lnterlor.ColorIndex RE3INOEX
Else
cell .lnterlor.ColarIndex
End I f
- xlNone
Next cell
End Sun
Z pewno4ciq procedura SelectiveCol or1 zadziata, ale zawiera powatny blqd. Dla p y -
ktadu, co sig stanie, gdy zamaczenie b@ie zawieralo cafq kolumnc, 10 kolumn lub
caly arkusz? Zanim wszystkie komorki zostanqsprawdzone, prawdopodobnie utytkownik
nezygnuje z dalszego wykonywania makra. Kod tr6dlowy lepszego wariantu powytszej
procedury o nazwie Sel e c t i vecol or2 zawarto w listingu 1 1.2.
-
Dim Constantcell s As Range
Ccnst REDINDEX ?
Ap~lication.ScreenUpdating - False
--
Twrzy podzbiory oryginalnego zaznaczenia
Set FomlaCells Selection.SpecialCells~xlfomulas,xlNwbers)
Set Constantcells Se!ection.SpeclalCell stxlCanstants. rlNmbers)
Rozddot 1 1. Przyktady i rnetody prograrnowania w jezyku VBA 303
On Error @To 0
End I:
c e l l . Interior.ColorIndex - xlNone
Next c e l l
End If
Next c e l l
End I f
End Sub
Proccdura wykonuje kilka dodatkowych opcracji, kt6rc sprawiajg te jest bardzo wydajna.
W cclu wygcnerowania dwdch podzbiordw zamaczenia utylem metody SpecialCell s.
Pierwszy podzbidr obejmuje jedynie komdrki zawierajqce stak numeryczne. natomiast
drugi -komdrki przechowujqce formuly nurnerycmc. Komdrki obu podzbiordw sq na-
stepnie przetwarzane za pomocq dwdch konstrukcji For Each . . . Next. W efekcie
przetwarzane q tylko niepustc komdrki, dziqki czemu uzyskujc siq znaczqcc przyspiesze-
nie malaa.
Zastosowanle instrukcji On Error Jest koniecme, poniewat metoda Speci alCel 1s
generuje btqd, gdy tadna komdrka nle spetnia klyterlum. Instmkcja zajmuje sie tez
obstugq wszystklch przypedkbw, w ktchyh podczas wykanywania p r o c e d u v
nie zaznaczono zakresu.
-
Application. Screenupdating Fa1 se
For r LastRw 70 1 Step -1
-
I f Application .WorksheetFunction .Counth(Rews[r) ) 0 Then R w s { r l .Delete
Next r
End Sub
304 C r e e Ill + Jezvk Visual Basic for APDlicotions
-
b r a c a Trw, je<li rngl jest podzbloten mq2
--
InRange False
I f rngl .Parent .Parent .Name mg2.Parent .Parent .Name Then
- -
I f rngl.Parem.Name rng2.Pannt.Name Then
If Umon(rng1. mg21 .Pddress rng2.Abdress Then
InRange True
End I f
End I f
End I f
End Function
Funkcja InRange mote siq wydaC dofC ztotona, poniewat insbukcje kodu Prddtowego
m u s q spmwdzit, czy dwa zakresy majdujq sip w tyrn samym arkuszu i skorostycie.
Procedura poshguje sic w~ciwo6c:iqParent m c a j q c q kontener obiektu. Pnyktadowo
poni2sze wyratenie zwraca nazwe arkusza h d p e g o kontenerem obiektu mgl, do Md-
rego jest wykonywane odwdanie:
rngl .Parent. Name
Funkcja Union jpzyka VBA zwraca obiekt Range reprcizntujqcy sump dw6ch obiekt6w
Range. Zakns sumy obejmuje wspblne kom6rki dw6ch zakres6w. JeSli adres sumy dw6ch
zakrcsdw jest taki sarn, jak adres drugiego zakresu, omacza to, t e pierwszy zalazs za-
wiera sip w dmgim.
Set TheCell
Select Case True
-
D i m TheCell As Range
Rng.Range( "Al")
-
Case IsEttwty(TheCel1)
CellType 'Pusta"
-
Case Appl ic8ation.MrksheetFunction.IsText(TheCe11 I
Cel lType 'Tekst"
-
Case A w l ication.WortsheetFunction. I s l o g i c a l (Thecell )
Cell Type 'Loglczny '
-
Case Apgl icatlon.WorksheetFunction. IsErr(TheCel1)
CellType "Btqd"
-
Case IsDate(TheCel1 I
CellType "Data'
-
Case InStr(1. TheCell.Text. ' : " ) o O
CellType "Czas'
End Select
-
Case IsNumeric(TheCell1
CellType 'Liczba'
End Function
Nalety zwr6ciC uwagp'lla instrukcjp Set Rng. Funkcja Cel iType akceptuje argument Range
dowoinej wielkoki. ale instrukcja ta powoduje, t e przctwana ona tylko g6mq lewq
kombrkq zakresu reprezentowanego przez miennq TheCel : .
Odczytywanie i zapisywanie zakes6w
Wiele operacji wykonywanych w arkuszach kalkulacyjnych uwzglqdnia ptzenoszenie
wartoki z tablicy do zakresu lub z zakresu do tablicy. Z jakiegoS powodu Excel o wiele
sybciej odczytuje dane z zakresu, nit je w nim zapisuje. Procedura iiriteReadRange
zawarta w listingu 11.3 demonstruje wzglqdne szybkoici wykonywania operacji zapisu
i o d c w zakresu.
Procalura tvforzy tablicp, a nastqpnie n pomocqpqtli For . . . Next zapisuje jej zawartoid
w zakrcsie i ponownie wczytuje jq do tablicy. Przy W c i u funkcji Tiwr jqzyka VBA
oblicza cms wymagany do wykonania katdej operacji.
Listing 1 1.3. Miemnie cmsu wykonywnia opera@/odcrytu i rapisu akresu
Sub YriteReadRangeO
D1m MyArray( I
Dim Time1 As Dwble
Din NmElecnents As Long
Dim i As Long
Dim WriteTime As String. RwdTime As S t r l n g
Dim Msg As S i r i n g
Rozdziat 1 1. + Pnyklody i metody progromowania w jezyku VBA 307
- -
&pi lcatlon.ScreenVpdatlng
For CurrRaw 1 To CellsDarn
-Fa1se
For CurrCol 1 To C e l i z k r o s s
-
ActiqteCell.Offset(CurrRow
CurrVal CurrVal 1
-
1. CurrCol - l).Value - CurrVal
Next CurrCol
Next Cur-Row
Pnyklad z listingu 11.5 demonstruje szybszq metode uzyskania tego sarnego efektu. Kod
a nastppnie za pamocqjednej instrukcji przenosi
h o d l o w y wstawia do tablicy w a n o i c i ,
zawartoSE tablicy do zakresu.
Llsting 11.5. ~ o q v s t y w a n l etymczasowych tabllc w celu szybszego wypelnienia zakres6w
Sub ArrayFillRange(
'
Wypelnieme zakresu poprzez transfer e l m n t h t a b l l c y
Dim CellsDarn As Long. CellsAcross As Integer
Dim i As Long, j AS [nteqer
Dim StartTime As Double
Dim TempArrayO As Long
Dim TheRange As Range
Dim CurrVal As Long
'
--
Pobranie wyrnlarbw
CellsDown Val (dnputbx('I1e k d r e t w plonle?"))
CellsAcross V a l ( [nputBox('Ile k d r e k w pozimie?"))
'
-
Zarejestrowanle czasu rozpoczecia
S t a r t T i m Timer
-
Zdefinlowanle zakresu w arkuszu
Set TheRange Range(klls(1. 1). Cells(Cel1sOam. CellsAcross))
CurrVal -
Wypehienie tymczasowej tab1 i c y
0
-
- -
Ppp.1icatlon.kreenUpdatlng
Far i 1 To CellsDown
False
- -
For j 1 To CellsAcross
;empArray(i. j) CurrVal + 1
CurrVal CurrVal + 1
Next j
Next i
-
Transfer t y z c r a s w j tabhicy do akusza
TheRange .Vaiue TempArrty
W moim systemic wypdnienie z h u o wymiarach 500 x 256 kom6rek (128 000 ko-
mdrek) pny u2yciu pptli zajqlo 24,12 sekundy. Metada oparta na transferze zawartotci
tablicy do uzyskania identycrnego efektu potrzebowah zaledwie 0.24 sekundy, czyli
dziahh okoh 100 ray szybciej! Jaki wniosek wynika z tego pt-zyktadu? JeJli chcesz
przenieJf do arkusza d m iloSf danych, wszqdzie, gdzie tylko jest to mozliwe. unikaj
stosowania ~ t l i .
W pierwszym oknie komunikatu jest wy4wietlana wart036 600 (liczba wierszy orygi-
nalnego zakresu), natomiast w drugim - 12 (liczba kolumn). Przeniesienie zawartoici
zakre.su do tablicy typu Variant odbywa sip prawie ~tychmiastowo.
Unotenle przez 2
I f IsNumeric(x(r, c ) ) Then x ( r , c)
Hext c
- x(r, c) * 2
Next r
'
Range('A1:LSQ")
End Sub
x-
Poncwne umleszczente w arkuszu zawarto9ci t a b l l c y typu Variant
'
I f TypeName(Se1ection) -
Kokzy dzialznie, j e i l i n l e zaznaczano zakresu
'Range' Then Exit Sub
--
'
W przeciwnym razle przeszuklwany j e s t zaznaczony zakres
I f Selection .Count 1 Then
Set WorkRange Cell s
Else
-
Set UorkRange Selection
End If
'
-
R r e J l a maksymalnnq wartoff
MaxVal Ppplicatton.Hax(NorkRange)
I
Zaznaczanie wszystkich korn6rek okreilonego forrnatu
Kolejny pnyklad dernonstruje sposbb utycia rnetody FindFormat lokalizujqcej i z m a -
czaiacei wszvstkie komorki arkusza z okreSlonym formatern. Po m a c z e n i u korn6rek
d . d
Rysunek 11.8.
Zaznaczanie
wsrystkich
komdrek
okreiionego
formatu
Z powod6w znanych tylko firmie Microsoft nie powiedzie sip rejestracja makra u2y- I
wajqcego przycisku Format z okna dialogowego Znajdowunie izamienianie. A zatem
koniecme hdzic napisanie kodu hbdlowego tego typu makr. Pmcedura SelectByFomat
wyglqda nastqpujqco:
Sub SelectByFomat( )
a
Zaz-acza kmdrki w oparclu o i c h formatowanie
'
Sprawdrenie. cry j e s t utynany Excel 2002 lub nowszy
-
.Interlor.ColorIndex
F o n t .Bold True
- 6 ' kolor i b l t y
End Wlth
'
-
Szukanie pierwszej pasujacej komdrki
Set Fi rstCell Activesheet .UsedRange.Flnd(what :-"", searchformat :-True)
--
I n i c j a l i z a c j a AllCells
Set AllCells FirstCell
Set FounUCel1 Fi rstCel 1
-
Urnon(FoundCel1. A l l C e l l s )
I f Foundcell .Address FirstCell .Address Then Exit Do
LMP
'
Zamaczenie znalezionych k d r e k i w l n f o m a n t e utytkawnika
Al1Cells.Select
MsgBox " Znaleziono pasujpcych kodrek: ' b A11Cells.Count
End Sub
Metoda Find lokalmje p i e n v q korn6rkq, kt6ra spdnia layteria. Dla argumentu wiat
metody Find jest ustawiany pusty Mcuch, poniewa2 operacja wyszllkiwania dotyczy
tylko formatowania. a nie zawartoki kom6rki. Dodatkowo wartoSciq argurnentu Sear-
chFormat jest True, poniewa2 faktycznie jest wyszukiwane formatowanie.
JeSli szukane formatownie nie zostanie znalezione, utydtownik jest informowany i pro-
cedura ko6czy ciziaianie. W pneciwnyrn razie maleziona kombrka jest przypisywana
miennej obiektowej A1 1Cell s, ktbra przechowuje wszystkie odszukane kornbrki. Petla
przy W c i u rnetody F i n d koniynuuje wyszukiwanic, ale zawsle od komdrki nastqpnej nit
popnedno znaleziana. Operacja ysmkiwania ma do momentu ponownego znalezienia
kom6rki, ktbra mtata odszukana jako p i m z a . Na koficu wszystkie malezione kornbrki
arkusza 5$ z m c z a n e i u w o w n i k jest informowany o ich licxbie.
Procedura nie rlokalimje korndrek c h m k t e r y z u j ~ hsle specyflemym formatowaniem.
bwgcyrn wynikicrn zastosowanla funkcjl iarrnatwnnla rarunkowego Excels.
312 CZQJC 111 + Jpzyk Visual Basic for Applications
Nalety nvr6ciC uwagq na wla$ciwolt Path. JeSli dta wlaSciwo3ci Path skoroszytu nie
ustawiono warto$ci, oznacza to. te jego plik nigdy nie zostal zapisany (nowy skom-
szyt). Procedura ignoruje tego typu skomszyty i zapisuje tylko te, ktdrych wlaSFiwoJc
P a t h posiada wartoft.
Aby okreblit, czy skoroszyt zawiera aktualnie wykonywany kod trMiowy, procedura
ukywa k!mkcji If. Jest to koniecme, poni- zamkni.yie takiego s k m z y t u spowoduje
p m i e wykonywania kodq na skutek czego inne skoroszyty nie zostanq prrchvomnc.
Sub LastSaved(
Dim SaveTime As String
--
On Error Resume Next
SaveTlme ActiveWorkLwk.Bui1 t i n C o c u ~ r e n t P ~ p e r t i e s " L a sSave
I f Savel'lme "" Then
t Time") .Value
Jefli skoroszyt nie zostal zapisany, pr6ba uqskania dostcpu do wlaSciwoSci Las: Save
Tire zakohczy sic wygenerowaniem blpdu. Instrukcja Dn Error powoduje, te blqd ten
zostanie zignorowany. Struktura I f . . . Ren . . . E'se sprawdza nastppnie wart056
zmiennej SaveT~mei wygwietla odpowiedni kornunikat. Jdli zmienna jest pusta, omacza
to, t e plik nie zostal zapisany. Na rysunku 1 1.9 pokazano pnykladowy wynik dziaiania
pmcedury.
Rysunek 11.9.
WySwieUenie daty
i czasu po zaplsanb
skoroszytu
Synchronizowanie arkuszy
Excel nie urnotliwia synchronizacji arkuszy w skoroszytach wieloarkuszowych. Imymi
stowy, nie istnieje rnetoda, aby we wszystkich arkuszach auromatycznie zamaczyt ten
sam h s i ustawit gdmq l e v korndrke widocmq w oknie. Ponitszc rnakro jpzyka VBA
jako bazy utywa aktywnego arkusza, a w stosunku do pozostalych arkuszy skoroszytu
wykonuje nasbpujqce operacje:
zaznacza taki sarn zakres, jak w przypadku aktywnego arkusza,
ustawia takqsarnq g 6 r q lewq komdrkc okna, jak w aktywnyrn arkuszu.
Oto kod ir6dlowy procedury:
Sub SynchSheets( 1
'
Ustawia we wszystkich a&uszach t e s m kamdrke w g6rym !wfl rogu okna -
jak w aktywym arkuszu
ifTypeName(Act~ve5heet) 0 'Worksheet' Then E x i t Sub
Dim UserSket As Worksheet, sht As Worksheet
D i m TopRw As Long. LeftCol As Integer
D l m UserSel As String
-
P p p l i c a t i ~ . S c r e e n U ~ a t l r g False
-
Zapamietuje aktualny arkusz
Set Usersheet k t i v e S h e t
314 CzgiC Ill + Jezyk Visual Basic for Applications
TooRow -- ActiveWindow.ScrollColunvl
Zapisuje info:rmacje z aktpnego arkusza
ActiveWindw.Scrol lRow
LeftCol
UserSel - ActiveWindw.RangeSelection.Address
Wykonuje ~ t l dla
e arkuszy
Far Each sht I n ktiveWor4book.kbrksheets
I f sht.Vlsible Then ' w i j a ukryte arkusze
sht .Activate
RangeIUserSel) .Select
--
PctiveWindw.Scro1 IRow TopRow
PctiveWindow.Scro11Col umn LeftCol
End If
Next sht
'
Przpraca oryginalne ustawlenie aktymego arkuszl
Usersheet .Activate
-
Application. ScreenVpdati ng True
End Sub
--
a
Wiqcza Tub ,wy?qcza zawijanie tekstu dla zaznaczorrych kombrek
[ f TypeName[Sei ection) "Range" Then
5election.dracText Not ActiveCel 1 .WrapText
E* If
Enc SUO
Aby w aktywnyrn arkuszu wyfwietlif lub ukq4 linie siatki, nalety utyC nastqpujqcej
instrukcji:
ActivdJindcw.DisplayGridl~nes - Not ActlveWincow.OisplayGridlines
Kolejna pmcedura jqzyka VBA przy utyciu petli przetwarza wsrystkie arkusze aktyw-
nego skomszytu i wyiwietla calkowitel liczh drukowanych swn:
Sub ShowPageCamt I)
Dim Pdgetnmt As Integer
-
Dim sht As Worksheet
pagecount 0
-
For Each sht I n Worrtsheets
PageCount PageCount + (skt.HPageBreaks.Cwnt
(sht .VPageBreaks.Count + 1 )
+ 11 '-
Next sht
-
MsgBox "Uszystk~chstmn " L PageCcunt
EM Sub
Rysunek 1 1 .lo.
Okno komunikatu
WySwietlaJqce date
i mas
316 CzgfC Ill + Jezyk Visual Basic for Applications I
i
Procedura z listingu 11.7 jako argument funkcji Format wykorzystuje funkcjp Date. Wy-
nikiem dziaiania procedury jest hlicuch zawierajqcy ladnie sformatowanq datq. Aby
uzyskaC tak samo sformatowany czas, postilpilem w podobny spos6b.
LIstlng 11.7. WwieUenle aktualnej daty i czasu
Sub DateAndTlmet 1
#y?yMetla aktualnq date i czas
Dim TheDate As String. TheTiw As String
O i m Greeting Ps S t r ~ i l g
Sim F~llNameAs String. FirstN~msAs String
D:m SpaceInName As Integer
TheOate
TheTime -- Fonnat(0ate. "Long date')
Fonnat(Time. 'Long time'!
'
Ckreilenie powi tania u oparclu o ; Z~S
Select Case Time
Case I s < TimeValue("l2:00"',: Greeting -- 'Dzteh dobry "
Case I s >- TimeValue("17:00"):
Case Else:
Erd Select
Greeting
Greeting - 'Dobry wieczdr "
'Dzieh dobry "
Space!nNm
--
Dodanle do povitanta tmlenla ulytkownita
Fu1I Ume Appl i c a t l o n .UserName
InStt(1. FullName. ' 1)
'
-- - -
Obslusa przypzdku. gdy nama n i e zawiera spacji
I: ~ c ~ ~ ~ N E I T0 IThen
~ SpaceInName Len(Ful1Nam)
F: -5:Name Left(Fu1lName. S~aceInName)
Greeting Gre?ting h iirstName
' Wy$wietlente k w n i k a t u
Hsghx TheOate 8 vbCrLf & TheTime. vb0KOnly. Greeting
End Sub
I
Rozdziot 1 1. Prryktody i metody programowanla w jqzyku VBA 3 17
-
S e t FontList Appllcation.ComnandBars("Fomattiq").
Findtontrol(1D:-1720)
-
J e i l l brak kontrolkl Font. twrzy t m z a s m y obiekt ConnandRar
--
If FontList Is Hathing Then
Set TerrpBar bppl i c a t i m .tcmMndBars .Add
Set F m t L i s t TempBar.Controls.Add(ID:-1728)
End If
Unieszcza ~ c i o n t wi kolunnie A
-
Range("A:A") .Cl earCcntents
For i 0 To Fontlist. L i s t t a a t - 1
C e l l s i t + 1. l? = FontList.Lfstit + 1)
Aby zastosowat crcionte d l a kan6rZi. nale) usunat znak
apostmfu sprzed pan!tszej i n s t M c j i
t e l l s ( i + 1. l).Font.Nm = FontList.List[l + 1)
Next 1
Sortowanie tablicy
Co prawda, Excel posiada wbudowane polecenie sortujqce zakresy arkusza, ale jezyk
VBA nie dysponuje metodq sortowania tablic. Skutecne, ale niewygodne rozwiqzanie
tego problemu polega na pneniesieniu zawartoSci tablicy do zakresu arkusza, posorto-
waniu j e j przy u2yciu polecenia Excela, a nastqpnie wczytaniu wyniku do tablicy. JeSli
jednek szybkoM odgrywa d u a rolp, lepiej s t w o w w j ~ z y k uVBA proceduw sortujqcq.
W tym punkcie ombwip cztery r 6 a e metody sortowania: arkuszowe, bqbelkowe, szybkie
i zliczajqce.
Sortowanie arkmowe polega na przeniesieniu zawartoici tablicy do zakresu
arkusza, posortowaniujej, a nastepnie ponownym urnieszczeniu w tablicy.
Procedura oparta na tej metodzie, kt6rej jedynym argumentem jest tablica,
obshguje tablice zawieraj4ce nie witcej n i t 65 536 element6w odpowiadajqcych
liczbie wierszy arkusza.
Sortowanie bqbclkowe jest prostqmetodqsortowania (zastosowano j q tef
h u. i m sortowanie arkusza w rozdziale 9). Co ~rawda.
w ~rzykhdzied e m o n s - *
W tabeli 11.1 zawarlem wyniki testdw. WartoSt 0,00 oznacza, te sortowanie zostato
zakonczone prawie natychmiastowo w czasie kr6tsym n i f 0,0 I sekundy. Nalety za-
uwakyd, 2e sortowanie arkusza jest ograniczone do 65 536 elementdw.
Rysunek 1 1 . 1 1 .
Okno urnotliw~ajqce
pordwnanie czasu
wymaganego
do wykonania operaji
sortowania tablic
o rdinych rozmiarach
Algorytm sortowania bqbelkowego jest do96 szybki w pnypadku niewielkich tablic, ale
- - (liczqcych ponad 5000 element6w) m o m o nim zapomniet. Jefii aleo-
. - wiekszych
prry
' u mzaa najlepszy, iortowanie zliczajwe i tak dystansije
rytm s o r t o w a n i a ~ z ~ ~ k i e ~ o sip
je pod wzglqdem szybkoici.
-
Okreilenie Scietki p ? i t u 1 wzam jego nazwy
FilePath ThisNorkboot .Path 6 '\'
320 Czefe Ill + Jezyk Visuoi Basic for Applications
-
Tworzenie obiektu F i l eSearch
S e t FS Application.Fi1eSeanh
With FS
- -
--
.LookIn Filepath
.FileName FileSoec
.Execute
'
-
Petla przetwarza kolejne p l r k i
'or i 1 To FS.FounOF11es .Csunt
Call ProcessF~1eslFS.FoundFi~es~l~!
Next 1
End Sub
Obiekt FtIeSearch pobien pliki, ktdrych nazwy sq zgodne z wzorcem. Pliki sq przetwa-
m e p n y utyciu ~ t lFori . . . Next. W trakcie przetwarzania wewnqtn ~ t jest
l i wy-
wotywana prosta procedura ProcessFi!es. W cclu zairnportowania pliku konysta ona
z rnetody OpenText, a nanepnie wsrawia pict formut. OczywiScie zamiast ponitszej rnotna
zasrosowak wlasnq procedure.
Sub ProcessFi les(Fi l e N m As Strlng)
' Importowanie p l i k u
Workkooks .OpenText F i 1eName:-Fi leName. -
Origin:-zlWindows. -
StartRon:-1.
~ata?ype:-xl~?xed~i~th, -
Field1nfo:-
~ r r a y ( ~ r r a y ( i11.
j , Array(3. 1). Array(l2. 1))
a
ilange(,'Dl') .Value --
Wprcwadzm!e f o m l padsumowujqcych
"A"
Lnge('D2') .Val ue "8"
Cnge('D3') .Value - -
"C"
Range!"Fl:F3").Fomla
End Sub
-
Lnqe('El:E3'). F o m l a "-COUNTIF(B:B.Ol)"
"-SUHIF(E:B.Ol.C:C)'
Funkcja FileExisfs
Funkcja pobiera jeden argument (Scietka pliku wraz z jcgo n m i mraca wartoSC True,
plik istnieje:
jeili
Private F u n c t ~ mF l l e E x i s t s ( f n m ) PS b o l e a n
-
'
Zwraca wartolt True. j e f l i i s t n i e j e p l l k
FileExists (Dlr(fnarr~1<> " " )
End Function
Funkcja FileNameOnly
F u n k c j a pobiera jeden argument (kietka pliku wraz z jcgo nazwa) i zwraca tylko nanvq
pliku (innyrni slowy -usuwa fcietkq pliku):
Private Functian FileNametkrly(pname) As String
Zwraca n a w p l i k u pobranq z l a k u c h a ztotonego ze Scietki 1 nazwy p l l k u
---".
D l m % As Integer. length As Integer. temp As String
1ength Len(pnant9
LRnp
--
Fsr i length To 1 Steo -1
IfHidtpnam. i. 1, Application.PathSeparator Then
FileNameOnly temp
E x i t Function
End If
-
twnp bld{pname. i. 1) b temp
Next
F i l e L ~ l y pnarrP
End Function
-
Funkcja FileNameCnly przetwarza dowolntl Scictkp i nanvq pliku (nawet jesli plik nic
istnieje). Jdli plik istnieje. ponitsza Funkcja ofemjc prostsq rnetod~usuwania Scictki
i m c a n i a tyIko nazwy pliku:
Private Function FileNamdhlyZ(pname) As S t r i n g
-
FileNameOnlyZ D l rtpnane)
End Function
Funkcja PathExists
W c j a pobierajedm argument (ki& p l h } i nvrsca wartoSf True, jdli fci&a ismieje:
Private Function PathExiststpnm) As b o l e a n
I f Dir(pname, vbDlrectory)
PathExt s t $ False
-
Zwraca wartolt True. j e l l 1 i s t n i e j e Scietka
- '" Then
Else
PathExists
End If
- tEetAttr(pname) And vWirectory) - vbDirectory
End Function
322 e + Jezyk Visual Basic for Appllcatiom
C z ~ f Ill
Funkcja RangeNameExists
Funkcja pobiera jedm argument (nazwa z a h s u ) i zwraca w M f True. jeSli w aktywnym
skoroszycie istnieje n a m a zakresu:
Private Fucctlon RangeHameExists(nname) As Boolean
*
Zwraca w a r t o g True. j e S l i i s t n i e j e nazwa zakresu
D i m n As Name
RangeNaneExists Fa1se -
I f UCasetn. Name) --
For Each n I n ActiveWorkbook.Names
UCase(nnarne) Then
RangeHameExists True
Ex1t Function
End i f
Next n
En@Function
Funkcja SheetExists
Funkcja pobiera jeden argument (nanva arkusza) i m c a wart046 True, jeili w aktywnym
skoroszycie istnieje arkusz:
Private Functiw SheetExi stsIsname) As Boolean
' Zwraca wartoit True, j e s l i n aktpnym skoroszycie i s t n i e j e arkusz
D i m x As Object
--
On Error Resume Next
Set x ActiveUorkboak.Sheets(sname)
-
i f Err 0 men Shee?Exists True Else SheetExists False -
End Function
Funkcja WorkbooklsOpen
Funkcja pobiera jeden argument (nazwa skorosytu) i nvraca wartoid True, jdli skomszyt
jest otwarty:
Private Function MrkbwkIsOoen(wbname) As Boolean
Zwraca marto5c True. j e i l i skoroszyt j e s t otwarty
Dim x As Workbook
--
On Error Resume Next
Set x W a ~ ~ k s ( m b n m ~
-
I f Err 0 Then WorkbookIsOnen True Else WottbookIs0pn - False
End Function
Zdefiniwariie argumentu
a r g - " ' " I path 8 ' [ ' A f i l e A 'I' &sheet & " ' ! " & -
Range(ref).Range('Al") .Address(. . xlRlC!)
-
Mykcnanle matra XLY
GtValue ExecuteExcel4l"zcro(arg)
End Fsnction
Ponitsza procedura Sub demonstruje, w jaki sposdb utyC funkcji GetValue. Procedura
wySwietla jedynie wartoft w komorce A1 arkusza Arkuszl pliku o nazwie 99Budtet. x l s
majdujqcego sic w katalogu XLPl ik i \Budtet na dysku C.
Sub
2 --
TestGetVal ue()
'c:\XLPliki\Bud2etW
--
f '99Budtet.xl s"
s 'Arkuszl'
3 'Al'
nsgaax GetValue(3. f . s , .?>
E?c! Sub
--
Sub TestGetValueZ()
p "c:\XLP1ik1\Budtetw
f
- "99Budiet . x i s "
s "Arkuszl"
-
- -
Appl Icat ion .ScreenUpdatr ng Fa1 se
For r ! To 100
-
For c 1 To 12
-
a Cells(r. c).Maress
Cells(r. cl GetValue(0, f. s. 31
Next c
Next r
-
Pppl ication. k r m l l p d a t i n g Tr-e
End Sun
4-
.--$.A* Funkcja GetValue nie zadziala pa zastosowaniu jej w formule arkuua. WtaSciwie
.edi- '
nie ma takle] potrzeby. W celu pobrania wartohi z zamknigtego pliku wystarczy
stworn tqcze formuty.
Ponitsza funkcja zwraca wanoft Twe, jeSli w jednokombrkowp zakresie bqdqcym jej
argumentem zastosowano pogrubienie:
Rozddot 1 1. Przykiady i metody programowoniow jqzyku VBA 325
ij
Funkcje te nie zawsze sq a u t o m a ~ l aktuallzowane.
e ponlewd zmlana formatowama
nle uaktywnla rnechanlmu Excela wykonujqcego p n w n e obltzenia. Aby vymusii
ponowne abliczenie wuystldch skomsqtbw wraz z aktualizacjq funkcji niestandardowych.
nalezy wcisnd kornbinacje klawiszy Ctrl+Alt+F9. lnna moiliwoSE polega na urnieszczeniu
w kodzie lrddbwyrn funkcji nastepujqcej instrukcji:
-
Zwraca True, j e 4 l i zawartoie kondrkt zostala pogrubiona
ISBOLD c e l l .Range("Al") .Font.Bold
End Function
-
Zwraca True. je51i w kon6rce utyto kursywj
ISITALIC cell .Range("Al").Font.I t a l i c
End Function
Jef li w kornorce zostanq zastosowane r62ne formatowania (nv. tvlko wbrane rnaki zo-
stanq pogrubione), obie powytsze funkcje m 6 q &d. ~olejnafunkcjazwr6ci warto4C
True tylko wtedy, gdy wszystkie znaki z kom6rki h d a pogrubione:
Function ALLSOLD(cel1) As Boolean
Zwraca wartoft True. j e S 1 i wszystkie znaki z k d r k i sa pogrublone
ALLB(XD -
I f lsNulI(cell.Font.Bold) Then
Fa1 se
Else
-
ALLBOLD cell .Font .Bold
End I f
End Functicn
-
Zwraca l i c z k c a ~ t c w l t acdpowiadajqcq k o l o m l wetrza kandrki
FILLCOLR c e l l . Range( "Al") .Interior .ColorIndex
End Function
-
A~plication.Volatile
LASTWD Thi sWarkbwk. &ItltinOoamntPmpertiest'tast
End Fqmction
Save Time')
326 Cz&C Ill + Jczyk Visual Basic for Appllcatlons
Jelli funkcje te zostanq utyte w formule, w celu uzyskania aktualnych wartofci wlaSci-
woSci skoroszytu mote by6 koniecme wymuszenie wykonania ponownych obliczeri
(poprzez wci8nivie klawisza F9).
:=$$* Dostgpnych jest sporo dodatkowych wbudowanych wlaklwo$ci, ale Excel nle konysta
(S! z nich wszystkich. Na pnyktad prdba u i y i a wlaSclwoSci Nunber of Bytes spowoduje
wygenerowanle M d u . !
-
Appllcation.Volatlle
Lastsaved2 ApOl ication.Cal1er.Parent .Parent. -
Bulltln0acumntPropert~es('Last Save Tlme')
End Function
Function LASTPRINTED2(
-
Ppplication.Volatile
LASTPRINTED2 Application.Ca1ler.Parent.
Parent.BuiltinDocunentPropertles('~ast-print Date")
End Function
Obiekty nadrzqdne
I
Model obiektowy Excela ma postat hiemchicznq Obiekty sqzawarte w innych obiektach.
Na szczycie hierarchii znajduje sip obiekt Application. Excel zawiera inne obiekty, kr6re
1
sq kontenearni dla kolejnych obiekt6w itd. Ponitsza hierarchia ilustruje miejsce, jakie j
w tym schemacie zajmuje obiekt Range: ,>
obiekt Appl i c a t i on
obiekt Workbook
I
obiekt Worksheet
obiekt Range
1 Rozdzid 1 1 . + Pmyldady i rnetody prograrnowania w jezyku VBA 327
-
Functim SheetName(ref) As String
SheetName r e f .Parent.Name
End Function
-
Function WorkbookNametref) As S t n n g
WorkbookName ref .Parent. Parent .Name
End Function
Poniaza funkcja AppNare pnenosi cis na nastppny logiczny poziom, tnykromie korrystajqc
z wtajciwolci Parent. Funkcja m c a nanvq obiektu Appl ~ c a t ~ opowiqzanego
n z okrcSlonq
korn6rkq. Oczywiicie fbnkcja zawsze zwrbci wartosc M i i t o s o f t E x c l l .
Function AppName(ref! As String
-
AppName r e f . parent .Parent. Parent.NEme
End Function
Zliczanie kombrek,
M6rych wartoici zawierajq siq pomiedzy dwomo wadoiciami
Ponitsza funkcja o nazwie COUNTBETWEEN zwraca liczbq wartoici zakresu (piems;ty argu-
ment) mieszcqcych sic pomiedzy dwoma wartoiciami reprezentowanymi przez drugi
i trzeci argument:
Function COUUTBTBNEN(1nRange. nwnl, n u d ) Ps Long
'
Zlicza wartoJci z przedzialu od numl do num2
With Awl ication.WarksheetFunction
I f nun1 <- nurn2 Then
-
CWNTXWEN .Counttf(InRange. ">-" & nun!)
.Countif (InRange. > & nbrn2)
--
Else
COUF*E3lEEN -
.CountIf (InQnge, ">-'
.CountIf(InRange, '>" 6 numl)
b num2) --
End I f
End Wi l h
End Funaion
Funkcja konysta z funkcji COUNTIF (LICZ.JEZEiI) Excela i odgrywa role lrodka uprasz-
czajqcego twomne fonuly. Ponitej zamieszczono przyktad formuty korzystajqcej
z Funkcji COUNTBEWEEN, zwracajqcej [ic.zbq komdrek zakresu Al:PlOO, ktbrych wartosci
sq wicks& lub rdwnt 10 i mniejsze lub d w n e 20:
-COUNTBEIWEM(Al:AlC~O, 10. 20)
328 Cze$c Ill + Jezyk Visual Basic for Applications
--
Appltcatton.Vo1at;le
Ce; 1Cwnt O
S e t r g Intersect(rng.Parent.UsedRange, mg:
For Each cell In rng
If Not IsEmpty(cel1) Then
I f Not c e l l .Ent~reRw.HiddenAnd -
-
Not c e l l .EntireCalum .Hidden Then
Gel lCount Cel lCount 1+
-
Era I f
Next cell
CGUNl'tISIBCE
End Function
- Cellcount
Przy utyciu petli funkcja przetwarza kaidq kombkt zakresu, sprawdzajqc najpierw, ezy
jest pusta. Jeili kom6rka nie jest pusta, funkcja sprawdza ukryte wlaSciwoki jej wiersza
i kolumny. Jefli ani wiersz, ani kolumna nie sq ukryte. wartoit zmiennej Cei 1Count jest
inkrernentowana. Funkcja COUNTVISIBLE przydaje sit podczas korzystania z automa-
tycznego filtrowania lub konspektbw. W obu przypadkach s q nosowane ukryte wiersze.
c a b wienz (funkcja LASTINRW). Jcfli przekazany argument nie jest calq kolurnnq lub
wierszem. funkcja utyjc wiersza lub kolumny okreflonej pnez gbrnq lewq kom6rk~za-
kresu. Ponitsza przykladowa formula zwraca ostatniq wart046 kolumny 8:
-tPSTINCOCUnM(851
-
IfNot IsEmpty( .Value) Then
LASTINCOLVHN .Value
-
ElseIf IsEm~ty(.End(xlUpIlThen
LASTINCOLUMN "
Else
-
LASTInCOLUnN .End[xlUo).Value
End I f
End U i t h
End W l t h
End FunCtim
Funkcja jest raczcj skornplikowana, dlatego wyjdniq dokhdniej jej dzialanie. Metoda
Appl icatton.Vo1 ati le powoduje, h funkcja zostanie wykonana k d o r a z o w o przy ob-
liczaniu arkusza W ~ S ~ ~ W O~&.tount
SC r&ca liczbq w ~ m z yarkusza. ~hociat'rno-$ern
trwale wprowadZiC w kodzie kbdlowyrn wartoft 65536, utytcm tej wla4ciwofci, gdyt
kolejna wenja Execla mote obstugiwat wiqksq liczbq wierszy. Whfciwoft rng.Co; wnn
mraca numer kolumny g6mej lewej kombrki zakresu k&cego wartosciq argumentu
mg. Zastosowmie wMciwoici mg.Parent powoduje, t e funkcja wi
b a b f poprawnie
nawet wtedy, gdy argument mg odwohje sip do inncgu arkusza lub skoroszytu. Utycie
metody End z argumentem xlUp jest rbwnomaczne z waktywnieniem ostatniej kombrki
kolumny, w c i h i ~ i e r nklawisza En4 a nastqpnie klawisza f I wrcszcie Funkcja IsEmpty
sprawdza, czy komdrka jest pus@ Jefli tak jest, zwraca posty laficuch. Gdyby knkcja
IsEmpty nic urstala zastosowana, po napotkaniu pustej kombrki procedura twr6citaby
wart046 0.
Poni2ej zawmto kod Wdlawy funkcji LASTINRGCI, bardm podahej do funkcji WTKMCOCLNN:
Function LASTIM1OW(mg As Range)
Zwraca tawartnit o s t a t n i e j n l c p t u t e j k d r k i wlersza
Lppl1catian.Volatl l e
U i t h rng.Parent
With .Cells(mg.Rcu. .Coltnms.Wnt)
I f Not IsEmpty(.Value) Then
I
330 Czeft Ill + Jezvk Viual Bosic For A ~ ~ t a t i o n s
LASTINW - .Value
-
E l s e I f IsEmpty( .End(xlToCeft)) Then
LASTINROW "'
Else
End If
-
LASTINROW .End(xlTdeft) .Value
End With
End With
End Function
-
Zwraca wartoit True. j e s l i pietwszy a r g w n t jest podobny do drugiego
ISLIKE t e x t Like pattern
End Function
Ponitsza fonnula zwraca wartoX TRUE, poniewat z wzorcem *jest zgodna dowolna
liczba makbw. Formula zwraca wartoSC TRUE, jcSli pienvszy argument jest dowolnym
+tllicucherntekstowym rozpoczynajqcym sit od litery g:
Ponitsza formula nvraca wart& TRUE, poniewat z wzorcem ? jest zgodny dowolny
pojedynczy znak. Formuta m d c i wartoe FALSE, jeSli wartoiciq pierwszego argumentu
b d z i e hicuch JednostkalP:
Nastcpna formula m c a wartdt WE, poniewa2 jej pierwszy argument jest pojedynczym
makiem zawartym w drugim argurnencie:
-IRIKE("a". "Caeioul")
Rozdzial 1 1. Rrykhdy i metody programowania w jezyku VBA 33 1
Kolejna formula zwraca podlahcuch 0133 bedqcy cmartym elementem lancucha (w roli
scparatora w taficuchu jest uvwany tqcznik):
-
T x t l Txt
- -
Jedl'l separatorem j e s t rDacja, zostanq usuniete zbedne soacje
i f Separator Chr:32) Then Trtl A ~ ~ l i c a t l o n . T r : m i T x t l )
'
Oodanie separatorz nz koitcu laicucha
-
I' Riqht(Txt1. Len(:xt?)) 0 Separator Then
T x t l T x t l S Separator
-
--
Inicjalizacja
ElementCount 0
TmoElmnt "'
'
-
kydzlelenle katdepo el em en:^
- --
Far I 1 To Lenf'xt!)
C f Mld(Txt1. I. 1) Separator Then
ElementCount E l m t C o u n t * 1
I f ElmntCount n Then
-
Po znalerieniu elwnentu zakokzenie przetwarzanla
EKTRACTELEHENTZ TmElenent
Ex1t Function
Else
TempElmnt
End I f
- ."
E! se
-
T R n p E l m t Tm~Elffnent6 MidtTxtl. 1 . l!
End I f
Next 1
EX7WCTELWENTZ "'
Esd Function
-
Funkcja wielofunkcyjna
Nastcpny przyklad prezentuje metodp, k6ra m o b o w sip przydabia w niekt6rjch
sytuacjach. Sprawia on& t e pojedyncza funkcja a r b zachowuje sit jak wiele fitnkcji. I
1
Ponitej zawarto kod M t o w y niestandardowej funkcji o nazwie StatFunction pobie-
rajqcej dwa argumenty - zakm (rng) i operacjp lap). W zaletnoSci ad wartoki argu-
menm op funkcja nvraca wartog6 obliczonq przy utyciu dowolnej z nastcpujacych
funkcji arkuza: AVERAGE (SREDNIA). COUNT (ILE.LICZB), MAX, MEDIAN (MEDIANA), MIN. #ODE
CPIYST NPJCZESCIEJ), STDEV (ODCH.STANDAROOWE), SUM (SMA) lub irAR OJARIANCJA).
I
I
Wynik formuly zaleky od zawartofci kombrkj ,424, kt6ra powima byd takim Earicuchern,
jak Average, Count, Max itd Metoda motc zostaC zastoscrwana w pcqpdku innych funkcji.
Functlon STArrUMTIW4(rra, w) .
Select Case VCasetop)
Case 'YJM"
Rozdriol 1 1.4 Przyktady i metody programowania w jqzyku VBA 333
End Function
Funkcja SHEETOFFSET
Excel ofemje ograniaonq obshrgc tr6jwymiarowych skorosqtbw. JeBli na prqklad
konieczne jest odwatanie do innego arkusza skoroszytu, w formule trzeba uwzglpjnit
nanvq arkusza. Nie stanowi to du2ego problemu do rnornentu prbby skopiowania for-
mu@ do innych arkuszy. Skopiowane formuly w dalsqm ciqgu odwdujq sic do n a m y
oryginalnego arkusza. O d w o h i a do arkusq nie sq rnodyfikowane tak jak mialoby to
miejsce w prawdziwym tr6jwymiarowym arkuszu.
- punkcie
W tym . mtak om6wiony- przyklad
. - - -i - ~- k VBA
funkcii a o nazwie SHEETOFFSET
umoZliwiajqcej stosowanie mglgdnych odwotah do arkuszy. Na pnyklad w celu od-
wolania sip do kombrki A1 poprzedniego arkusza nalety u e t formuly:
Pierwszy argument funkcji, ktbt-y mote byf wartoSciq dodatni& ujemna lub zerem,
identyfikuje wzglqdne o d w o h i e d o arkusza. Dtugi argument rnusi by6 odwdaniem do
pojedynczej kom6rki. Po skopiowaniu formuly do innych arkuszy odwolanie wzglpdne
w z i e o b o w i w a t o we wszystkich jej kopiach.
Oto kod 2rddlowy funkcji SHEETOFFSETj~zykaVBA:
Function SHE€WFS€f(Offset As Long. Optima1 tell As Variant)
Zwaca zawartoSt kar6rkl wzglednle adreswanego arkusza, do k t 6 r e j -
zdefiniwano ocbm~anle
Dlm WtsIndex As L o q , WksNun As Long
Dim wks As W o r t s h t
Applicaticn.Volatile
- -
I f IsMissing(Cell1 Then Set Cell Applicatlon.Caller
mshm 1
If Ppplicatlon.Ca1ler.Pam.Hame -
For Each rks In Ppplication.Caller. Parent-Parent .Worksheets
wks.Name Then
334 Czeft5 Ill + Jqzyk Visual Basic for Applications
-
SHEETOFFSET Worksheets(WksNun + Offset) .Range(Cell(l) .Address)
E x i t Functim
Else
-
WksNum WksNun + 1
End I f
Next wks
End Function
--
npplication.Volatile
Addr c e l l .Range("Al") .Address
HaxVal -9.9E+307
- -
For Each Wksht I n c e l l .Parent.Parent.Worksheets
I f Mtsht.Nme c e l l .Parent.Hame And -
Pddr Appltcation.Cal1er.Address Then
Unikniecle odwolania cykllcznego
Else
If WorksheetFunction. lsNunber(Msht.Range(Mdr I ) Then
End If
-
If Wksht .Range(Addr) > MaxVal Then
MaxVal Uksht .Range(Addr) .value
End I f
Next Y s h t
--
I f MaxYal -9.9€+307Then MaxVal 0
MAXPLLSHEETS MaxVal
-
End Fwlctlon
Pnodkjem korn6rki jesr arkusz, natomiast jego pmdkiern jest skoroszyt. Wynika z tego,
2e pttta For Each . . . Next przetwarza wszystkie arkusze skomszytu. Pienvsza instrukcja
I f z pqtli sprawdza, czy przetwarzana kom6rka zawiera funkcjq. JeSli tak jest. w celu
unikniqcia btqdu odwotania cyklicmego kom6rka zostanie zipnorowana.
<=>-
mi:< Funkcja 2 tatwoScia moze zostaC aodyfikowana, tak aby wykonywata inne obliczenia
mi@zyarkuszowe oparte na takich funkcjach, jak HIN. SREDNIA. SLMA itd.
Zwracanie tablicy
zawierajqcej unikatowe, losowo uporzqdkowane liczby calkowite
Funkcja RANDOMINTEGERS zamieszczona w tym punkcie zwraca tablice unikatowych liczb
calkowitych. Stosowana jest w wielokom6rkowych formutach tablicowych.
{-RAHrnIMTEG€RS( ))
-
Tvorzy obiekt Ra~ge
Set FuncRange Appltcation.Caller
-
Zwraca blqd, jeSli wartoit o b i l t u FuncRarge j e s t zbyt duta
Cell Count FuncRange .Count
-
If C e l I C m t > 1000 Then
IWMXMINTEGERS CVErr(xlErrNA1
Ex:t Function
End I f
--
Przypisanie aniennych
RCounr. FuncRa~e.Rows.Count
CCounc FuncRanqe .Colunns .Count
ReDim Y(1 To R h n t . 1 To CCcuntl
ReDim YalArray(1 To 2. 1 To CellCountl
-
Uypelnienie t a b l i c y l o m i w a r t o s c i m r liczbam? ca?towitymi zakresu rng
For i 1 To Cel lCount
--
ValArray(1. i ) Rnd
ValArray(2. i ) i
Next i
336 Czeft Ill + Jezyk Visual Basic for A p p l i c a t i o n s
-
Sortowanie t a b l l c y ValArray wediug u p l a r u o losowej warto5ci
-
For 1 1 To CellCount
For j i + 1 To CellCounr
--
I f ValArray(1. 1) > ValArray!l, j) Then
Temp1 ValArray(1. ;I
Twnpi ValArray(2, j)
--
ValArray(1. j) Val4rray(l. i )
ValArray(1. I ) Temp1
ValArray(2, i ! Ten72
--
ValArray(2. j) ValArray(2. i )
End If
Next j
Next i
~ e x rt
kANrnlNTEGER5 V
End Function
-
Porzqdkowanie zakresu w losowy spos6b
Funkcja WERPINMmIZE pobictajeden argument Wqcy drcsem i zwraca tablice zlotonq
z losowo uporzqdkowanego zakresu.
'untriion RANGERANWHIZ€( mg)
Dim V O As Variant. ValArrayO As Variant
D l m CellCount As DouSle
D i m i As Integer. j As Integer
D i m r As Integer. c As Integer
D i m Twnpl As Variant. Temp2 As Variant
D i m RCount As Integer. CCount As Integer
Randanlze
'
-
Zwraca blad. j e t 1 t wart056 obiektu r g jest zbyt Curs
CellBunt rng .Count
if Celltount > 1000 Then
RAffiERWWMIZE CVErr(xlErHA1
Ex?: Funclon
-
End :f
'
--
Przypi sanie miennych
RCount rng .Raws. tount
CCount mg.tolums.Count
ReOim V(1 To HCount. 1 To CCount)
ReDtm ValArray[i To 2. 1 To CellCount)
-
Mypelnlenie t a b l l c y ValArray 10s-i
For i 1 To EellCount
ValArray(1. i Rnd --
w a r t d c i m i i wartofciami obiektu m g
ValArrayt2, il rg(i)
+ Prryldody imetody progromowania w jezykv VBA
Rozdzial 1 i. 337
I Next i
- -
Sortswanie tablicy ValArray wedlug wymiaru o l o s m e j wartodci
For i 1 To Cellcount
For j i + 1 To Cellcount
--
IfValArray(1, i ) > ValArray(1, j) Then
T m p l VaIArray(1. j)
Temp2 ValArray(2. j)
--
ValArray(1. j) ValArray(1. 1 )
ValArray(2. j l
ValRrraytl. 11 T m ~ 1
ValArray(2. 1 ) Temp2
--
ValArray(2. 1 )
End I f
Next J
Next 1
'
Wstawiente d o tablicy V losowo uporzadkcwanych rrartoici
t - 0
- -
For r 1 To RCount
For c 1 To CCount
Next c
1 - 1 + 1
V(r. C ) - ValArray(2. i )
Next r
RANGERMOnlZE
End Function
- V
Kod fr6dtow-y tej Funkcji jest bardzo podobny do kodu funkcji RANOOMINTEGERS.
Na rysunku 11.12 pokazano wynik dzialania funkcji. Formuta tablicowa zawata w zakresie
82:811 ma nastppujqcq postat:
Rysunek 11.12.
Funkcja
RANGERANDOMIZE
zwraca zawartoSf
komdrek zekresu
w p~zypadkowej
kolejnogci
338 C z q l t Ill + J e y k Visual Basic for Appncatlons
-- -
Dim IntLen As Integer
strPath Space(255)
intlen FindEmutableAtstrFile. , strPa2h)
GetExecutable Trim(strPath1
End Function
Na rysunku 1 1.13 pokazano wynik wywotania funkcji GetExecutable, ktbra jako argu-
ment pobrak name pliku dokumentu Wordu. Funkcja zwraca pehq Scietkp aplikacji
powiqzanej z plikiem.
Rozdziat 1 1. + Pnyklady i metody programowania w jezyku VBA 339
Ryrunek 11.13.
OkreSIanle Scletkl
aplikacji powiqzanej
z akreBlonp plikiem
I
1
Okreilenie inforrnacjl dotyczqcych dornyilnej drukarki
W kolejnym pnykladzie k o n y s t a m z funkcji interfejsu API zwracajqcej informacje na
temat domyflnej drukarki. Dane te znajdujq sic w pojedynczym taricuchu tekstowym.
Ponitsza procedura analimje laricuch i wyiwietla inforrnacje przy u t y c i u czytelniejszego
formatu:
Private Declare Function GetProfileStringA Lib "kernel32 -
(ByVal IphppName As String. -
ByVal lpKeyName As String. -
ByVal 1pOefault As String.
ByVal IpRetumedString As ~ t rng.
: -
ByVal nSize As Lorg) As Long
Sub DefaultPrinterInfcO
Dim s t r t P T As String 255
Dim Result As Strlng
C a l l GetProft l e S t r i q A -
("Windows'. "Devtce" . '". strLPT. 254)
- -
Result A~plicatian.Trim(strLPT)
ResultLength LentResult )
Canal
Canna2
-- InStr(1. Result. ".". 1)
I n S t r ( h m 1 + 1. Result. ". ". 1)
-
Pobiera name drukarki
Printer Left(Resu1t . Cam1 - 1)
-
M i e r a informacje na t e m t stermmika
Driver Uid(Resu1t. C m l + 1. Canna2 - tanma1 - 1)
'
-
Poblera ostatnip czeiC i n f o n a c j ~na temat urzcdzenia
Port Right(Result. ResultLength - b 2 )
--
Tworzy k m n i k a t
Msg 'O~karka:" & Chr(9) & Printer & Chr(13)
-
Msg Msg b ' S t e m i k : " & Olr(9) & Driver & tEr1131
Usg Msg d "Port:" & Chr(9) 8 Port
Hyiwietla kanunikat
HsgBox k g . vSInfomtion. " I n f o m c j e dotyczpce domy5inej drukark:"
End Sub
Rysunek 11.14.
lnfonnacja o aktpnej
drvkarce wySwlet~ona
pny uzyclu funkcji
interfejsu APi
systernu Windows
--
Sub DisplayVideolnCaO
vidWidth GetSyst~ir:cs(jM-CXSCREEN)
,vidHe~gnt G ~ ~ S ~ ~ I E ~ M ~ ~ ~ ~ C ~ ( S M - C Y S C R E E N )
Hsg
Msg
Ms&x
-- 'Aktualna rozazielczoli. karty graficznej:
Msg & viblidth & " X ' 8 vldHeight
Msg
"
- 0 Sub
Rysunek 1 1.15.
Zastosowanie fvnkcji
interfejsu API
systemu Windows
w celu okreSlenia
rozdzielczoici karty
grancznej
Nie wszystkie systemy obslugujq dhvipk. Aby stwierdzie, czy system dysponuje takq
motliwoSci~nalety utyd rnetody Canplaysounds. Oto przykhd jej mtosowania:
ff Not Application.CanP1aySounds Then
Hsq90x "Niestety system nie obsluguje dhleku."
Exit Sub
Epd If
--
sua PI~~WIOIO
WIDIFile " z-archiwm-x. mid'
WIDIFile ThisWorkbook.Path & "\' C MIDIFile
ttiExecute ('play " d HIDIFile)
End Sub
Sub StopHlDI( 1
HID!Flle --
"2-archirnrm-x.mid'
WIDiFIle ThisUorkbook.Path 8 '\' 8 MIOIFile
Hct Execute ('stov " d WlDIFi l e )
End sue
342 CzefC Ill + Jezyk Visual B a s i c for A p p l i c a t i o n s
-
Call PlaySound(WAVFi l e . OL. SNO-ASYNC O
Alann True
E x i t Functlon
r ShQ-FILENPME)
End [ f
ErrHandler:
-
Alarm False
End Function
-
Funkcja Alarm pobiera dwa argumcnty o d w h i e do komdrki i warunek (majqcy postat
hticucha). Ponitsza formula utywa funkcji A l a t m do odtwonenia pliku formatu WAY.
gdy warto5C kombrki 013 btdzie wieksza lub dwna 1000:
-AlARM(B13: "-1000')
W celu stwierdzenia, czy warto.$t korn6rki spdnia okreJlone krytcrium. funkcja korzy-
sta z funkcji Evaluate jqzyka VBA. Po speinieniu luyterium i wygenerowaniu dzwiqku
funkcja nvrbci wartoSC True. W przeciwnym razie zwr6ci wartoit Fa1se.
- --
RootKey "hkey-current-user"
Path "Control Panel\Colors"
RegEntry 'Act? weTitlem
MsgBox GetRegistryiRcatKey. Path. RegEntry 1 . -
vb[nformation. Path d '\RegEntryM
RcotKey
- - "hkey-current-user'
Sub i2uts-0pen:)
RqEntry - 'DateTime"
PET^ ~~ofiware\mi~ro~oft\office~ll.P\Excel\LastStarted'
RegVal Nu#( -
-
I f JrlteReqistry(RootKey. R t h . RqEntry. RegVal) Then
msg 'egYal & ' zostala zap1 sand w rejestrze."
Else
-
msg 'Wystqpil blqd.'
End !f
Msgbx msj
End Sub
I
I Funkcja InputBox jezyka VBA
I
Skladnia funkcji InputBox jczyka VBA jest nastcpujqca:
I InputBax(k~~ikdt[.tytull[. 1lert-dony1:la][, wsp_x][. m p y ] [ . pl?k:parocy. tm:e4s:!!
a k m n i k a t (wymagany) -tekst wyfwietlany w oknie wprowadzania danych:
a tytul (opcjonalny) - tytut okna wpmwadzania danych;
wart-danH Ins (opcjonalna] -domyllna wart056 wyfwietlana w oknie
dialogowym;
wsp x . wspy (opcjonalne) - wspblrzqdne pozycji gd'rnego lewego narotnika
o&;
p7ikgcwrocy. tontekst (opcjonalne) -plik i temat pomocy.
I
348 Czg5C IV Zastosowanie forrnularry UserFonn
Rysunek 12.1.
Efekt wywolania
funkyi lnpurEox
j+?yka VBA
Sub GetNawO
D i m UserName As String
Dim F i rstjcace As Integer
D3 Unt,,l UserYaw <> " "
-
Usersame Inplr:80x("?odaj i m l e 1 nar*?sko:
"laentyfikacja")
". -
LXP
FirstSwce - !nStr(UserName. " " )
-
If FlrstSpace <> 0 Then
UserNamtr Lnft(UserName. FirstSpace 1:
€no I f
-
YsgE3x 'Witaj " 8 UserNamtr
ERG SuD
Aby zagwarantowat, 2e po pojawieniu sip okna zostanq wprowadzone dane, funkcja In-
nutsox zostata urnieszczona wewnqtn pptli Do Untll. Jefli ukytkownik kliknie pnycisk
Cuncel lub njc wprowadzi Qdnego tekstu, zmiennej UserName zostanie przypisany pusty
tancuch, po czym okno wprowadzania danych pojawi sip ponownie. Po wprowadzeniu
danych procedura szuka pierwszej spacji (prry u w i u funkcji InStr), aby pobraC imiq,
a nastepnie korzystajqc z funkcji Left, pobiera wszystkie maki przed spacjq J d l i nie
znajdzie spacji, pobierze c a b wprowadzony lakcuch.
0 Formula
64 Tablica wartoici
Metoda Inputbx Excela jest do66 wsztchstronna Aby hnkcja nvrcicah wigej n i t
j&go typu danych, naleky mtyd sumy odpowicdnich kodbw. Pszykhdowo, aby wyiwie-
tlif okno urnoZliwiajqce wpmwadzanie tekstu i liczb, jako wnrtoSf typ mlety podat 3 (1
+ 2 lub licba + luhcuck tekprowy). J d l i warkdciq argummtu typ kdzie 8, utytkownik
mote v m i e wprowadzit adres komorki lub mkresu albo wskazat go w arkuszu.
Aby urnotliwit utytkownikowi wybranie zaluesu, Mry zostanie wyczyszcwny (rysu-
nek 12.2X ponitsza p r o c t d m Eraseknge stosuje m e t o e InputBnx. Utytkownik m a
rvznie wprowadziC adres ;takrrsu lub zamaczyt go w arkuszu za pomocq myszy.
Rysunek 12.2. U+fe okna wpmwedlania danycb od zdefinfowania zakresu
Metoda InputBox z argumentem Type o wartoki 8 nvraca obiekt Range (nalety zwr6ci6
uwagp na stow0 kluczowe Set). Z a k n s jest nastqpnie c z y s m n y p n y utyciu mctody
Clear. Domyilna wart056 wygwietlana w oknie wprowadzania danych jest adnsem ak-
tualnego zamacania. JeSli w oknie m t a n i e klikniqty przycisk Amtluj, instrukcja On
Error kodczy wykonywanie procedury.
Sub EraseRange()
-
Dim UserRange As Range
Defaul tRange Select ion.Address
-
On Error GoTo Canceled
Set UserRange Appl i c a t i m.InWtBox -
:Prompt :-"Padaj zakres. Zt6ry zostanie wycryszczony :' .-
Title:-"Czyszczenie zakresu". -
Default :-DefaultRange.-
Type: -8)
UserRange. C l ear
UserRange. Sel ect
Cancel ed :
End Sub
Rysunek 12.3.
Metoda lnputBox
Excels automatycznie
sprawdza poprawnoSE
wpmwadzonych danych
-
Sub Gethswer( l
Ans MsgBox("Czy kontynuwat?', vbYesNo)
Select Case hs
Case vbYes
Ckod tr6dlawy wykonywany. gdy zostanle k l l k n l e t y przycisk Tat]
Case vbNo
Ckod t r 6 d l g wykonpany. gdy zostanle k l l k n l e t y przycisk Niel
End Select
End Sub
vb1gnore 5 Ignoruj
vhYes ' 6 Tak
vtNo 7 Nie
Aby p r z e t w o w wynik funkcji MsgEox, nie jest nawet koniecme stosowanie zmiennej.
Ponitsza procedura wyfwietla okno komunikatu zawierajqce przyciski Tak i Nie. JeSli
utytkowik nie kliknie przycisku Tuk, procedura zakhczy dzialanie.
Sub GetAnswerZC 1
I f KsgBox('Czy k o n t p w a t ? ' . vbYesNo) 0 vbYes Then Exit Sub
[rod tr6dlmy wykmjwany, gdy zostanie t l i k n i e t y przycisk Tat!
a
End Sub
Aby w oknie komunikatu zostaly wylwietbne pnyciski Tuk i Nie oraz ikona pytajnika,
w ponitszyrn pnykjadzie zastosowalem kornbinacjp statych. Drugi pnycisk spehia
funkcjp domySlnego (rysunek 12.4). Dla uprosz~zeniastale p n y p i d e m zmiennej Config.
Rozdzial 12. + Altemotywne rnetody tworrenia niestandardowycholden dialogowych 353
Rytunek 12.4.
Argument prryclsW
funkcji MsgBox
o M a , jahie p2yxk-M
pojawiq sie w oknle
--
D i m Ans As Integer
Config vbYesNo + vbljuestion + vbOefaultButton2
Ans MsgBox('Wystqpi1 blqd. Czy kontynuowat?'. Config)
-
Else ContinueProcedure False -
IfAnS vbYes Then ContinueProcedure - True -
End Function
Funkcja Cont 1nueProcedure mote zostat wywdana z innej procedury. Przykhdowo po-
nihza i n s w c j a w y w h j e funkcjq ContinueProcedure (@wietla okno kornunikatu).
JeSli funkcja zwr6ci wartog Fa1 se (u.tytkownik kliknqt pnycisk Nie), proccdura zakohczy
dzialanie. W pneciwnyrn razie zostanie wykonana nastqpna instrukcja.
I f Not ContinuePmedureO Then E x i t Sub
--
Dlm Nsg As S t r f q
Msg "To j e s t plerwszy wiersz.' d vbCrLf
-
Msg Msg & 'To jest drug1 wlersz.' & vbCrLf
Usg Msg & 'To jest ostatni wiersz.'
MsgBox nsg
End Sub
Pny utyciu stabj vbTab mobla tet wstawit znak tabulaji. W cetu wySwietlenia wartoici
&su zlotonego z 20 x 8 komdmk (rysunek 12.5) ponhza procedura korzysta z okna
komunikatu. Proadura oddziela kolumny pny Wciu stalej vbTab i wstawia nowy wierq
korzystajqc ze stalej vbCrLf. Funkcja MsgBax akceptuje laficuch o rnaksymalnej dhgosci
wynosqcej I023 maki, co stanowi ograniczenie dla liczby korndrek, kt6rych zawartost
mote wstab wyiwietlona.
Rysunek 12.5.
Okno kornunikaiu
Hn/fwietf@qcetekst l
n
~
l
~
M
~
n
q
n B
1 5
a
1
X
m O P
sformatowany w T LV B P I +I
-
s x n ~ ~ r z ~ a , ~
przy uiycu znakdw w ..,ar w I . 47
a - r n 1 6 m L m a
tabulacji i makdw s t
podziatu wiersza )
%
31
1 W ' I .
. r ( l
. . ..
' ,
I
. ~ I
3
s
. S
29
m
. S
ol
n
.
12'
. g - Y
m
F -6.'
21
n
11
m
13
.n - B
41'.
W
11
I?'.*
s
9 ) * I I Y Y P I I . I
~ P I I I I ~ U ~
S 5 L 1 7 W l I Y
m 0 3 L r w )I
.*
9 l ? 4 Y I X m m Y U
.II
3) -w n
, ,
19
. m +
1 6
g
1
. ..
354 Cze-36 IV Zastosowanie formulany UserForm
Sub ShowRangeO
Dim Hsg As Strl ng
Msg --
Dim r As Integer, c As Integer
""
For r 1 To 20
For c 1 To 8 --
Msg b Cellscr. c ) & vbTab
Msg
Next c
-
Msg Msg & vbCrLf
Next r
MsgBox Hsg
End Sub
-
Zdefinimanie l i s t y f i l t r t n r p l i t 6 w
-
F i l t 'Pliki tekstcme ( * . t x t l . * . t x t . ' &
' P l i t i arkusza kalkulacyjnego firmy Lotus i*.prn).*.prn." 8 -
'Pllki u t p a j t c e przecirta jako separatora (*.csv) .*.csa7." 8 -
" P l l t i ASCII (*.asci.*.esc." 8 -
"Yszystkie p l i k i (*.*I .*.*"
-
'
h y i l n i e wy5wletlany jest filer *.*
F l l terIndex 5
-
Zdefiniowanie t y t u l u okna dlal@owego
T i t l e "Wybierz p l i k do zaimpor:mama"
-
Pobranie p a m y p:iku
Fi letlame A ~ pication.SetOpenFi
l
F i 1eFilter:-Filt. -
lenaae( -
FilterIn6ex:-F11terIndex. -
Title:-Title1
'
-
iabohczeniepracy, j e 5 l i wcknledialogowyrnzostz~isklikniety przycisk Anulu;
I f F l l m w False ;hen
MsgGox 'Nie wybrano i a d r q p l - t u . "
E x l t Sub
EM If
F:lt -
Zdefiniwanle l i s t y f i l t r d w p l i k b
"Pllkf tekst~we(*.ta).*.tanm 8-
'Pllkl arkusza talkulacyjnego finny Lotus (*.prn).*.prn.' & -
" P l i k i utywajace przecinta jako sewratora [*.csv).*.csv." & -
" P l i k i PSCII (*.asc).*.asc." .
I-
'Wszystkie p l t k t (*.*).*.*"
-
Donyilnie wy6wietlany jest f i l t r
F'l terIndex 5
*.*
T!tle -
Zdeflnlwanie tytulu &na d l a l c q w g o
'Wybierz p l l k do zaiwportwnla'
Rozdziaf 12. Alternatywne rnetody tworzenia niestandardowych olden diologowych 357
--
' WyWetlenle pelnych f c i e t e i nazw p l l k h
For i LBound(F1leNm) To VBound(F1leName)
nsg Msg L F i l e N w ( 1 ) 8 vDCrLf
Nexr 1
nsgbx ' w r a l e i p l l k l : ' d vbCrlf d Hsg
End Sub
Zrnicnna FileNam zostala zdefiniowana przy utyciu typu Variant, a nie String, jak
w poprzsdnich pnykbdach. Wynika to stqd, & n i e n n a F i leName zarniast pojedynczej
nazwy pliku mope przechowywaC tabliq nazw.
-
r F i 1eFi 1 ter (opcjonalny) taricuch okrellajqcy kryterium filtrowania piikbw;
F l l terIndex (opcjonalny) -
numcry indeksu dornyflnego bytcrium filtrowania
plikbw;
-
T I t 1 e (opcjonalny) tytul okna dialogowego;
w ButtcnText -
stosawany tyko w pnypadku systemu Macintosh.
Wybieranie katalogu
przy uiyciu funkcji inkrfejsu API systemu Windows
W tym punkcie zaprezentujp funkcjp o nazwie GetOi r e c t o r y wwietlajqcq okno dialogowe
pokazane na rysunku 12.7 i nvracajrlcq taficuch rrpmentujrlcy wybrany katalog. JeSli
umkownik kliknie przycisk Anuluj, funkcja zw%ci pusty hdcuch. Metoda zadziata
w przypadku Excela 97 lub jego nowszych wersji.
Rysunek 12.7.
Zastosowanie Itmkcjl
interfejsu APl
do wySwietlenia
okna dialogowego
Ponitej zarnieszczono deklaracje fimkcji interfejsu API majdujqce sit na poczqtku moduhr
skoroszytu. Funkcja Get01 r e c t o r y korzysta tet z typu danych o nanvie BROWSEINFO.
32-bitme detlaracje I n t e r f e j s u API
Oeclare Functton SHGetPathFranIOLi s t L l b 'she1 132 . d V '-
Alias "SHGetPathFromiDListA" (ByVal p i d l As Long. ByVal pszPath As String) As Long
-
Wyiwietlenie okna dialogowego
x SHBrowseForFolder(b1nfo)
--
a Analiza wynltu
path SpaceStSlZ)
r SHGetPathFraIDList(ByV.?1 x . ByVal oath)
I f r Then
- -
pos *InS:r(path. ChrS(0))
GetDirectory Left(path. ms - 1)
E l se
End If
GetDlrectory - "
End Functton
- -
D i m UserFi l e As String
Hsg "Pmsze o t r e j l i t :okallzacje kooi i rapasowej."
-
UserFi l e GetOi rectory(Msg1
I f UserFile "" Then
Msgbx "Anulouano."
Else
Usghx UserFile
End If
End Sub
i,s$$%*
Nlestety nie istnleje prosta mtoda okreslenia katalogu domySlnego luo startowego.
Q,
mmm
360 CzefC IV + Zastosowanie formulam UserFon
Wyfwietlanie
wbudowanyc h okien dialogowych Excela
Kod ir6dlowy napkany w jqzyku VBA mote wykonywad polecenia menu Excela JeSli
wykonane polecenie o t w i m okno dialogowe, kod tr6dbwy umotliwia modyfikowanie
zawartych w nim opcji, pomimo te samo okno nie jest wy9wietlane. Wykonanie ponhzej
instrukcji jezyka VBA odpowiada wybraniu z menu Edycja polecenia Pnej& do, za-
maczeniu &esu Al:C3 i kliknipciu OK. Jbdnak okno Prrechdenie do nie zostanie
otwarte, co jest M e z twoimi oczekiwaniami.
Pppl tcation.Gota Reference:-Range( "AI :U")
W niekt6rjch sytuacjach mow ci zal& na otwarciu jednego z wbudowanych okim
dialogowych Excelq tak aby kolicowy utytkownik m6gi dokonaf wyboru. Mas to
zrealizowat na dwa sp~soby:
I Rozdzid 12. Alternatywne metody tworzenm niestandardowych okien dialogowych 361
Rysunek 12.8.
Okno dlalogowe
otwarte prq u2)ciu
Instmkcfl]~zykeV M
Wbrew temu, czego motna by oczekiwat, zmicnna Result nie przcchowuje zakrcsu
zdetiniowanego w oknie dialogowym Pnechodzenie do.
Metoda ta nie jest zbyt dobrze uddnunentowana. System pomocy traktuje ten temat
bardzo og6lnikowo i nie wspomniano w nim,tt wy9wietlanie okna dialogowego Excela
przy u2yciu insmkcji j ~ k VBA
a nie zawsze pnebiega identycmie, jak w prtypadku
otwierania o h a poprzez wybranie pzycji menu. W efekcie w cclu upewnienia sie, te
kod kr6dlowy dziala zgodnie z ocakiwaniami, mate bye koniecme wykonanie tcstdw.
Kolejny potencjalny problem polega na tym, te nie jest motliwe poprawne wygwietlenie
niekt6rych zakladkowych okien dialogowych. Przyktadowo nie jest motliwe otwarcie
okna dialogwego Formatowanie komdrek zawierajqcego wszystkie zakladki. W danej
chwili motna wySwietlif tylko jednq zaktadh. Poni-tsza inshukcja wyiwietla zakladkp
Wyrdwnanie okna dialogowego Formotowanie komdrek (rysunek 12.9):
Rysunek 12.9.
Zakfadka ~ w n a n l e
I... -.
. -
-d _~
-
..................... ._
okna dialogowego - 1
..
&
-
I GIlna
Fomatowanie -
. .. - .. - -. ;
. .
',
.
kom6rek Doah C,
, .: ..
.....
, ,. 1
-. . ,, , , ....,- .., ...
0 ; 'k
tdr -.! ' , T n -
.......:... t
, *'
-Mu" . *:
om- ...,. . .
0-S- :O-,-; dm1
Or~baa
DIDrml*llll
---
--.....
K&
... .
I I x
Aby wyfwietlif inne zakladki okna dialogowego Formatowanie komdrek, tneba utyC
jednej z pipciu stalych: xl Dl a1 ogFomtNumber, xl DialogBorder, xl DialogCell Protec-
ti on, xlDialogPatterns lub xlOial ogfontproperties. Nalety zauwatyf, t e pomiqdzy
nazwarni statych nie wyst~pujetadna zgodnoS6.
r n a t o ~ a nkomdrek
i~
- -
odpowiadajq ich kontrolkorn. Przyktadowo zakladka Ochrona okna dialoeowego For-
(otwierane pny utyciu stalej xl D i alogCel1 Protect-on) korrysta
z dw6ch argurnent6w - locked (opcja Zablohj] i hidden (opcja Ukryj). JeSli w zakhdce
okna dialogowego obie opcje majq byc uaktywnione, nalety utyC nastcpujqcej insnukcji:
Application.Oialogs(x1DialogCellPr~~esclr,nl.Shw True. Trse
Udane konystanie ze zbioru Dialogs mote jednak wymagad wykonania testow w oparciu
o metodp pr6b i Mpdbw.
Po wykonaniu instrukcji zostanie otwarte okno dialogowe Przechoh-enie do. Muzq byc
podawane pehe nanvy pozycji menu (z uwzgl~dnieniemtrzech kmpek po hhcuchu
Prrej& do). W ptzeciwiebtwie do metody opartej na zbiom D i a1 ws,ta metoda nie
urnotliwia oheilenia dornyilnych ustawieh w oknach dialogowych.
Nawiasem mbwiqc* mnoda Execute sprawdza sic te2 w przypadku kontrolek paskbw
n-dzi niewySwietlajqeych okien dialogowych. Przykladowo wykonanie ponitszej in-
strukcji odpowiada kliknipciu prrycisku Popbienie znajdujqago sic na pasku n m ~ d z i
Formatowanie:
Appl icatTon.CmndBars('Formattlng') .Controls("Pogrublenie') .Execute
Jednak nic przychodzi mi na my41 tadm powbd, dla ktbrcgo warto z niej skorzystaf.
Efektywniejsza metoda pnelqczania wartoSci wlaSciwoSci Bold zaznaczonych komdrek
polega na zastosowaniu nasttpujqcej instrukcji:
-
Se1ection.Font.Bold Not Selectlon.Font.Bold
Rozdziat 13.
Wprowadzenie
do formulurzy UserForm
Excel pamala w stosunkowo prosty sposdb hvoayC w aplikacjach niestandardowe okna
dialogowe. Tak naprawdq moma powielit wyglqd i spos4b obshgi prawie wsqstkich
okien dialogowych tego arkusza kalkulacyjnego.
Aby mtawie nowy formularz UserFonn,aale2y uaktywniC edytor Vinrol Basic popnez
wchiqcie kombirnaji klawiszy A&,Fll. Wrn w oknie f@eci myhat projekt s k o m
szytu, a z menu Imeri pozycjp U s e r F m . Kolejnym u~mmmymformulmrn
UserForm q nadawane domyilne nazwy UserFannl, UserForm2 itd.
366 Czeft IV + Zastosowanie formulazj' UserForrn
Rysunek 13.1.
Okno Properlies
powiqzane z pustym
fonnularzem
UserForm
Rysunek 139.
Okno Toolbox
umotllwia dodawanie
kontrolek do fornulama
UserForm
Aby dodak kantrolke o do-lnym ropniam, wystarczy klikn@ w oknie Toolbar pnycisk
repraentujqcy a d a q konholb, a mi&pnie klknqt w o h m h v o m e g o okna dialo-
gowego. W celu okrcflenia w i e k o k i konvolki m o mjq kliknqi, a nastepnie pmciagnqt
kursor myszki w obszarze okna dialagowego. ..
Rozdzld 13. Wprowadzenie do formulary UserForrn 367
Dodanej kontrolce zostanie nadana nazwa zlotona z identyfikatora typu kontrolki i ko-
lejnej wartoSci liczbowej. JeSli na przyklad do pustego formularza UserForm zostanie
dodana kontrolka ComnandButton, jej nanvq bpdzie ComnandButtonl. Je9li nastppnie zo-
stanie dodana dmga tego typu kontrolka, jej nazwqbpdzie ComnandButtonP.
Dobrym pamystem jest zmlana nazw wszystkich kontrolek. ktdre b@q przetwanane
pny uwiu insttukcji kodu frbdtowego jqzyka VBA. DziqkI temu zarniast vtyvania
'm ogdlnych nazw w stylu Listbxl bedzie moiliwe odwolvwanle sie do aozurniakh n a m
takich, jak na pnyktad ~ista~rod"kt6w.Aby zrnieniC name kontrolki, nalezy postu&!
sie oknem Properties edytora Visual Basic. Wystarczy zaznaczyC oblekt i wprowadziC
Kontrolka CheckBox
Kontrolka Chectbx (pole wybom) jest przydatna w przypadku pobierania wartosci
dwustanowych typu tak lub nie,pruwda lubfal~z,wiqcrony lub wylqczony itd. Uaktyw-
-
niona kontmlka CheckBox ma wartoit True, natorniast wyfqczona wartost Fa1 se.
Konlrolka ComboBox
Kontrollka Can3Wx @olekombi) jest podobna do konbolki Listsax. Jednak ta kontroka jest
oknem rozwijanym i w damj chwili wySwietla tylko jednq pozycjp. Kolejna M i c a polega
na tym,2e utytkownik mote wprowadzit wartost, ktdra nie majduje siq na IiJcie pozycji.
Kontrolka CommandBufton
K&de twomne okno dialogowe prawdopodobnie h d z i e zawierato przynajmniej jednq
kontrolkq ComndButton @nycisk polecenia). Zanvyczaj zostanie uzyta kontmka Con-
MndButton o n&e OK i kolejna o nanvie Anuluj.
Kontrolka Frame
Kontrolka Frame (pole grupy) to kontena dla imych kontrolck Kontrolki umieszczane
sq w tej konbolce dla celdw estetycmych lub w celu poppowania zbioru obiektow.
Kontrolka Frame jest szczegdlnie pnydama, gdy o h dialogowe zawiera wivej nit jeden
zbi6r kontmlek Dptlonlutton.
368 C z e f t IV + Zastosowanie iormvlany UserFwm
Dodawanie kontrolek do arkusza mob ok& sig t m h g zagmatwane, poniewai moha je pobkra6
z dw&h pask6w narzgdzl: Forrnolane i Pnybcmik fomantbw. Kontrolki z paska narzqdzi Formo-
lane sq obiektami. ktdre motna wstawid do arkusza. Ponadto sq zgodne z Exce:lern w wersjach
5 i 95. Na pasku n a r m d W m i k formant& majdu]q slq kontrdki ActiveX Stanowiq podzbidr
kontrolek. ktdre sq dostgpne przy tworzeniu formulary UserFom. Kontmlki te sq kornpatybilne
tylko z Excelem 97 I nowszyrni wersjami. Nie sq obstugiwane przez Excel w wersjach 5 i 95.
Motna s t o M kontrolki z obu pask6w narpedrl, ale wake jest ~czumienierbhic pwnlgdzy nimi.
Sposbb dzi&ania kontrolek paska nanqdzi Formularre rbini sip zneczqco od spsobu dziatania
kontrolek ActiveX.
Gdy do arkusza jest dodawana kontrolka paska n a n w Rzytmrnik formantbw, Excel pnetqcza
siq w t@ prolektowania. W priypadku tego t@u m o t l i i Jest modynkowanle wtaSclwoSci d&
wo[nej kontrolkl umieszczonej w arkusru, dodawanie lub edytowanle pocedur obslugl xlarzeci
powlwanych z kontrolkq bqdf zmlana wielkoSci lub potoienia kontrolki. Aby dla k,ontrolkiActiveX
rnyszy i z menu podrpcznego Wra6
wyhietlit okno Pmperties, naleiy jq klikn* pral~ym~ l s k l e m
pozycje WlaSciwgci.
W przypadku huwrenia proSych m i s k d w czgsto uZywarn kontrolki Prz)cisk (8utton) z paska
narzgdzi Fornulame, ponlewai umoillwla rnl przypisanie jej dowolnego rnakra. Je51i mstosujp
kontrolke Przjcisk polecenia (GmmndWlttonJ zawartq na pasku narz@zi m o r n i k formanrdw. po
Rozdziol13. + Wprowadzenie do fomnrlorzy UserForrn 369
jej kllknigclu zostanie wykonana powlqrana z niq procedura obslugl zdarrenia (majqca np. nazwq
CmandButtonl-Click), ktdrej kod frddtowy majduje sle w module obiektu Sheet. Nie jest moiliwe
bezpogrednie przyplsanie do taklej kontrolki dowolnego makre.
Gdy Excel znajduje sie w ttyble projektowanla, nle jest motliwe testowanle kontmlek. Aby wytq.
cqd tryb projektowania, naieiy kllknqC przycisk Zakodcz t@ projektowania na pasku nangdzi
Prrybornik fonnantdw.
Skoroszyty, ktdre dernonstnrJq wszystkie kontrolki arkusza, sq dostepne na dolqczonym dysku
CDROM.
Konfrolka Image
Kontrolka Image (obraz) stub do wyiwietlania obrazu pobieranego z pliku lub wkleja-
- - -
neno ze schowka. M o t t zostaC S / t a w oknie dialoaowvm w celu wy5wietlcnia loco
w
firmy. Obraz jest przcchowywany skorasycie. Dziqki temu w sytuacji, gdy skomszyt
zostanie pnestany k o m d innemu. nie kdzie koniecme dolquanic kopii pliku graficmego.
Nlektdre pllki graflcme sq bardzo dute, dlatego zastosowanle ich mote znacmie
?,w
k,@
i rozrniar skomszytu. Dl. uzyskania ]ak najlepsqrh kynikdw obrazy powinny
by6 "&wane rradko lub wtedy, gdy sq nlewlelkie.
Kontrolka Label
Kontrolka Label (etykieta) po prostu wySwietla tckst w oknie dialogowyrn.
Kontrolka ListBox
Kontrolka L i stBox @ole listy) prczentuje listq poycji, ktdre utytkownik moze w y b d
(jedna lub wiele). Kontrolki C i s t k x sq bardzo elastycme w zastosowaniu. Na przyklad
rnotna okretlid zakres zawierajqcy pozycje kontrolki L l stBox. Zakres ten mote skhdad
sit z wielu kolumn. Pozycje kontmlki L i stBox mogq t& zostat zdefiniowane p n y uZyciu
instrukcji jqzyka VBA.
Kontrolka MultiPage
Kontrolka Multi Page um&liwia t w o m i e zaldadkowych olden dialogowych podobnych
do tego, ktbre jest otwierane po wybtaniu z menu Nan~ukiapozycji Opcje. DomySlnie
kontrolka MultiPage posiada dwie zakladki. Aby dodaC kolejne, prawym pnyciskiern
rnyszy nalety kliknaj zakladkq i z menu podpcnego wybraC pozycjq New Page.
Kontrolka RefEdit
Konkolka RefEdi t jest s m w a n a , aby umotliwif uhytkownikowi wybranie zakresu arkusza.
Kontrolka ScrollBar
Kontrolka Scrol lBar (pasek przewijania) jest podobna do kontrolki SpinButton. R6tnica
polega na tym, t e w celu miany wartoici kontrolki Scrol lBar w wipkszym zakresie utyt-
kownik mo2e pmciwd jej suwak. Kontrolka Scrol 1Bar najprzydatniejstajest w prrypadku
wybierania wartofci, ktdra zawiera sic w szerokim zakresie motliwych wartofci.
Kontrolka SpinButton
Kontrolka SpinButton (pokrctb) umotliwia utytkownikowi wybranie wartofci p o p m z
klihiecie dw6ch sbzalek. Pierwsza z nich zwieksza wartoJt. natomiast druea mnieisza
w
~ontrolkaSpinButton czpto jest stosowana pdqczeniu.t kontrolkami-~extE!ox lub
Label, kt6re wySwietlajqaktualnqwartoJC zwiqzantz tq konholkq.
Kontrolka Ta bStrip
Kontrolka TabStrip jest podobna do konfmlki MultiPage, ale w przcciwiehstwie do niej, nie
spelnia funkcji kontenera dla innych obiektbw. Jest r6wniet trudniejsza w utyciu i znacz-
nie rnniej wszechstronna.
Kontrolka ToggleButton
Kontrolka ToggleButton [przycisk pnetqcmika) posiada dwa stany -
wlqczony lub
wylqaony. Kliknipcie pnycisku powoduje pr&czanie pomiedzy dworna stanami. Dodat-
kowo zmienia sic wyglqd pprzycisku. WartoJciq konholki jest True (pnycisk wcifnim)
lub False (przycisk nie jest wciSniqty). WlaSciwie nie jest to standardowa konbolka
j lepszym wyjsciem jest stosowanie dw6ch kontrolek OptionButton lub jednej CheclcBox.
Formularz UserFonn mote zawierat podorne i pionowe linie siatki zlotone z kopek, kt6re
pomagajq przy wyr6wnywaniu dodanych kontrolek. Podczas dodawania lub przemiesz-
czania kontrolka przylega do linii siadci, aby uhtwiC wyr6wnanie jej w stosunku do innych
kontrolek. Linie siatki rno2na wylqczyb, wybierajqc z menu Tools edytora Y&ual Basic
pozycje Opfiom. W o h i e dialogo\tym Opfiom nalety kliknqd zakYadkq General i w sekcji
Form Grid Seftings wybraC tadane opcje.
Menu Format edytora Visual Basic oferuje kilka polecen pomocnych w precyzyjnyrn
wyrownaniu kontmlek w oknie dialogowym i ustawieniu odleg4oSci porniqdzy nimi.
Pmed uyciern tych polecen n a l e q zaznaczyc kontrolki, ktbre bcdq rnodyfikowane.
Polecenia dziahjq zgodnie z oczekiwaniami, dlatego nie b& ich tutaj objdnial. Na ry-
sunku 13.3 pokazano okno dialogowe zawieraj%cekilka kontrolek Opti onButton, ktore
zostanq wyldwnane.
Rysunek 13.3.
Polecenie Format/
Atign umotliwia
zmiane sposobu
wydwnarna Kontrolek
Gdy zaznaemnych zostab wiele konblek, wok61 ostafnlej z nich zarnlast standwowych
czarnph uchwytb pjawiajq siq bide. Konfrolka z biatyrni uchwytarni p h i funkcje
rnodelu, z ktdrym pod wzglqdern wlelkoSci i pdotenia sq porbwnyane kontrolki
z czarnyml uchwytami.
Modyfikowanie wla~ciw&cikontrolki
Ka2da kontrolka posiada kilka wl&ciwolci okreilajqcych jej wyglqd i zachowanie.
WMciwoSci kontraki m o m byf modyfikowane na dwa sposoby:
pay utyciu opcji okna Properties -w trakcie projektowania formularza UserForm,
p r y W i u inshukcji jqzyka VBA -po wySwietleniu formulam UserForm
przez m o w n i k a .
....
Zastosowanie okna Properties
ZawartoSC o h a Properties edytora Yisual B a i c zmienia sip w zalctnoici od wlafciwodci
aktualnie wybranego obiektu, ktorym m o b by6 kontolka lub sam forrnularz UserForm.
Dodatkowo kontrolkp motna wybmt z listy rozwijanej majdujqcej sip w g6rnej czeci
okna Properties (rysunek 13.4).
Rysunek 13.4.
Wybieranle kontrolki
OpttonButlon3 z listy
' rozwijanej okna
Properties
JcSli kontrolh b g z i e pnetwarzana przy W c i u instrukcji jpzyka VBA, warto nadat jej
z n a q c q nazwq. Pnykhdowo pierwsza kontralka OptionButton dodana do formularza
VserFom posiada domySlnq nazwp OptionButtonl. W celu odwalania sip w kodzie trb
dbwym do tego obiektu nalcty &ye naswpujqcej insmtkcji:
Jdli jednak kontrolce OptionButton zostanie nadana bardziej m a c q c a nanva, taka jak
obOrientacjaPozicma, rno2na u t y t nastppujqcej i n s d c j i :
I obOrlentacjaPozlm .Value - True
. -
opt1onEiuitm motna &w& wzgI@ern lewej m n y . W tym eelu wystarcq zaznaczyt
wszystkie kontrolki btionBvttm. a nastepnie w oknie Prurntics zrnodytikowa6 wart066
wl&idci Left. Waystkie zamaczone I;bntrolki u2yjqn&ej W c i ~ ~ c i w oLeft. ~ci
I Zdobywanie dodatkowych infarmacjl a wtaichvofciach
;
II
iI Najlepsza metoda zdobycia w i e d y o wla9ciwokiih konbolki polega na W c i u systemu
pomocy. W tym cetu w oknie Properties wystarczy k l h q t wtaSciwo45 i wcisnqt klawisz
FI. Na rysunku 13.5 pokazano pnyldad okna pornocy p o w i m e g o z wlaSciwoScia
I
Rysunek 13.5. I
System pomocy
zawiera informade
o kaidej wfafciwoSd Mulaselect Proparty
esuroh wbsn
wszystkich kontrolek S..AI*O :
I-
h ""m.4.rt --.
r ~ k tn. r *
W.nmI.h)I.M*l..dl
hapnnarmmn . * a m r .
..&.a ".a *
a
.!
~#.TIm.*.eammhhnhmdum.
n,..~r".r'".n?
--
-
munram*
v*r
.I.
m a w h o
Onr err un b. u-
d.nmhed n m m in he hC
(ddaull.
r m ~ * . t r r a u n r d h n q u h ~
Aby dla kontmlek zdetiniowat kolejnoS4 tabulacji, z menu View n a l w wybrat pozycjp
Tab Order. Moms t e t prawym przyciskiem myszy kliknqd okno dialogowe i z menu
podrpcmego wybrat pozycje Tab Order. W tym przypadku Excel wyiwietli okno dia-
logowe Tab Order (rysunek 13.6). zawierajye listp wszystkich kontrolek w kolejnoici
zgodnej z kolejnoiciq uaktywniania ich w fonnulam UserForm. Aby mienid pozycjp
kontrolki, nalety jq zamaczyt i kliknqd klawisz shzatki w g6rp lub w d6t. Jednoczeinie
motna zamaczyC wiscej nit jednq kontrolke (nale2y je kliknqe, hzymajqc wciininty
klawisz Sh$ lub C ~ r l i) m i e n i t pozycje ich wszystkich.
Pny utyciu okna Properties m o h a te2 okrellit pdotenie pojedynczej kontroIki znaj-
dujqcej siq na liScie kolejnoki tabulacji. WartoSciq wMciwo4ci TabIndex pierwszej
kontrolki z tej listy jest zero. Zmiana wartoki widciwo~ciTabIndex kontrolki mote
mied wplyw na wldciwo5f TabIndex pozostalych kontrolek. Operacja odpowiedniego
ustawienia wartoici wldciwoSci TabIndex jest wykonywana automatycznie, co ma na
celu zagwarantowanie, t e w przypadku ani jednej kontrolki wartoit tej wtaSciwoSci nie
p m h c z y liczby wszystkich utytych kontrolek W celu usuniecia kontrolki z listy ko-
lejnoSci tabulacji, dlajej w ~ c i w o S c TabStop
i nalety ustawit wartoft Fa1 se.
KontrolW takle, Jak Fram i MltiPage pelnlq funk& kontener6w innych kontmlek.
Kontrolki w q t n kontcma majp wtasnp kolej*lm6etabulacji. Aby stworryC kolejnoa
tabulacji dla grupy kantmlek Opt~onButtonznajdujqcych siq wewnqtn kontrolkl Frame,
przed wybraniem z menu View pozycji Tab Order naleiy zaznacz$ kontrolke Frame.
Rozdzial13. Wprowadzenie do formulorry UserForm 375
Rysunek 13.6.
Okno dialogowe
Tab Order umotlhvla
okreglenie kolejnogd
tabulacji kontrolek
Jefli nazwa formulana UserFonn jest przechowywana jako mienna typu String, w celu
dodania formulana do zbioru UserFom m o m u t j metody Pdd, a nastqpnie metody Show
zbioru UserForms. Ponitej zamieszczono pnyktad, w kt6rym przypisano nazwe formu-
lama L'swForm miennej HyFon, a nast~pniego rvyiwietlono:
Metoda ta mote byC pmydatna, gdy projekt zawiera kilka formulany UswForm i to,
ktory z nich tostanie wy91vietlony. zalery od programu.
Jqzyk VBA ofemje let insmkcje Load, kt6ra iaduje formuIan do pamieci, ale nit jut
on widocmy do momentu utycia metody Show. Aby zatadowad fonnulan UserForm,
nalety utyC nastqpujqcej instrukcji:
Load UserFonnl
7
Testowanie formularza UserForrn
Zaprojektowany fmularz Userform naleiy przetestowaE. Motna wyr6biC tny rnetody testowania
fomularza VserFonn, niewymagajqce otwierania go z podornu kodu frbdbwego proceduryjpzyka
VBA:
r wybranie z menu Run polecenia Run Sub/UserFom,
M wciSniecie klawisza F5,
B ldiknlvie ~ z y c i s k uRun Sub/UserForm znajdujqcego sie na pasku narzedri Standard.
Wszystkle wymienlone rnetody genetujq zdarzenie I n i t i a l i z e powiqzane z forrnularzem User-
Form. Po wySwietleniu okna dlalogowego w trybie testowym moina sprawdzid kolejnoff tabulacjl
I klawlsze skdtu.
Rozdzial13. + Wprowodzenie do f o m u l o UserForm
~ 377
JeSli formularz UserForm jest zlotony, motna go zaladowa6 do pmieci, zanim bqdzie
poaebny, dzieki czemu po zastosowaniu metody Show pojawi sip macmie sybciej.
Jednak w wipkszofci pnypadkbw nie jest konieczne stosowanie inseukcji Load.
JeSli kod hbd+owy znajduje sip w module formulana UserForm, motna utyC nastcpu-
jqcej instrukcji:
Unload Me
W tym pnypadku slowo kluczowe He odnosi sig do formulana UserForm.
Zwykle w kodzie M l o w y m jqzyka VBA za instrukcjami wykonujqcymi operacje z w i p -
ne z formularzem UserForm powinna sip male% instrukcja Unload. Na pnykIad forrnulan
UserForm mote zawierab kontrolb ComndButton s p e h i a j ~ qhnkcjc przycisku OK.
Kliknipcie pnycisku spowoduje wykonanie makra. Jedna z insaukcji makra usunie
z pamipci formularz UserForm, ale pozostanie on widoczny na ekranie do momentu za-
konncnia wykonywania tego makra.
Gdy formuIan UserForm jest usuwany z pamipci, wla6ciwoSci jego kontrolek przyj-
mujq domyflne wartofci. lnnymi slowy, po z a m h i p i u f m u l a n a UserForm instmkcje
kodu tr6dbwego nie b@q dysponowaly dost~pemdo wartoSci wprowadzanych przez
utydrownika JeSli wart046 podana pnez utytkownika musi mstaC pdtniej wykorzystana
(po usunipciu z p a m i e fomularza (IserFonn), koniecme w e zapisanie jcj w zmiennej
publicmej zdeklarowanej (z utyciem slowa klucmwego Pub1ic) w sgnda~iowymmodule
jqzyka VBA. Warto4C motna tet umieScit w kom6rce arkusza.
Formularz Userfirmjest automalycmle usuwany z pemlgd, gdy utytkownik kliknie
@.$$ prrjclsk Zamknij (ikona X znajdujqca siq na pasku tytutu formulam). Operacla ta
powuduje tet wygenemwanie zdanenla QueryClosepowlqzanego z formulanem
UserForm,po ktdrym nastqpl zdanenie Temnate.
;' 4
@ W mzddale 15. wyjagnig, w jaki sposdb wySwietllC wskatnlk postgpu,
kt6" wykorzystuje to. I.torrnularz UserFom7 mzosta]e vldocmy w trakcie
wykonywania makra.
=%F Kod fr6d)owy procedur obstugl zdanerl rnusl zostd urnleszczony w oknie Code
(E! powiqzanym z formulanem UseBonn. Jednakie procedura obstugl zdarzenia mote
wywoia6 innq prctcedurq znajdujqcq slp w standardowym module VBA.
Rysunek 13.7.
Okno dialogowe
umotliwia
uzylkownikowi
wprowadzenie imienia
i okreglenie pki
..
..
.. r- , .. . . . ..
, .. .. ... .
Wtalciwol6 Wart046
Accelerator I
Caption Imie:
TabIndex 0
WlaSciwoiC WartoSC
Name Texth'ane
TabIndex 1
Caption
TabIndex
7. Wewnqtrz kontrolki Frame umiefC kontrolkq 0pt;onBution i ustaw wartoici dla jej
nast~pujqcychwlaSciwoSci:
WaSciwodt WartoSC
Nane OpticnYaie
TabIndex 0
380 Cz@C IV + Zastosowanie forrnulatzy UserForm
Accel arator K
Caotion Kobieca
Tab Index 1
Accelarator tI
Caption Nieznana
Nam Opt: onUntnovn
Va 1ue True
lo. Poza obszarem kontrolki Frame umieSC kontrolkq CmndButton i ustaw wartofci
dla jej nastppujqcych wldciwoSci:
Caption OK
Default True
Nar~ OKButton
Tab1ndex 3
Ceptlon Anul u j
Cancel True
N2m2 Cancel Button
TabIndex 4
I Rysunek 13.8.
I Procedura
CommandButtanZ_Cllck
/ Jest wykonywana
*. po kliknieciu p q / s k u
majdujqcego sip
i w arkusru
I
Po kliknieciu kontmlki ComndButton znajdujqcej sie w arkuszu nic siq nie dzieje.
Wynika to stad, Ze Excel nadal znajduje sie w trybie projektowania, kt6ry uak-tywnia
sie autometycmie, gdy dodawana Jest kontrolka majdujqca sie na pasku nerzqdzi
Pnybomik formantdw. Aby zakoric* tryb projektowania, nalej kliknqt pnycisk
paska narwdzi Pnybornik formantdw o nanvie Zakoficz tryb projektowania.
Aby dokonaC jakichkolwiek modflkacji kontrolki Ccmnandhttcn, konieczne k d z i e
ponowne przetqctenie Excela w tryb pmjektowania.
--
R r e l l a nastepny pusty wlersz
NextRow
Appl ication.UorksheetFunc:~on.CountA~Range( "A:A") 1 + 1
Pczenosl im? e
-
CellstNextRow. 1) TextName.Text
Przenosi p l e t
--
if OptionMale Then Cells(NextRw. 2) "MeZczyzna'
-
If OptionFernale Then CellstNextRaw. 2 ) "Kobieta'
If O p t i o n u n k m Then Cell s(NeaRow. 2) "Nieznana"
--
'
Czydcl kontrolki przed wprcwadzenlm kolejnych danych
TextHam.Text "-
OptimUnknown True
TextName. SetFxus
End Sub
Rysunek 13.10.
Informaya
wpmwadzona
w fornulam
Userformjest
wstawiana
w pierwszym
pustym wienzu.
I f TextNam.Text -
Sprmdza, czy wpmadzono irnie
"" Then
UsgBox 'Uusisz podat inie.'
TextName. SetFocus
Ex?t Sub
End If
Rysunek 13.11.
Lista zdarzeii
powiqzanych
r kontrolkq CheckBox
Nazwa procedury obstugl zdarzenla zewlera nazwg powlqzanego z niq obiektu. A zatem
jesli mstanie mienlma n a m kontrolki, kaiecme P~dziet e t dokonanie odpaiednich
modyrikacji w powiqzanej z niq procedune lub procedurach obstugi zdarzeh. Nazwy
nie sq zrnlenlane autornatycznle! Aby soble uproSciC zadanle, moina nadaC nazwy
kontrolkom. zanim rozpocznle slg hvonenle procedur obslugl zdaneri.
~
I
1
I
Y~YUP
SpinOorm
SpinUp
Wyst~puje,gdy utytkownik zwotni klawisz gdy obiekt jest uaktymiony.
Wystqpujc, gdy utytkownik kliknie przycisk s&ki
skierowanej w d6l lub w lnvo.
kontrolki Spinautton
Text8oxl.Text
Enb Sub
-
Private Sub SpinBlrttml-Change( )
Spln@uttonl.Value
W a l -
If Nedal -
Private Sub TextBoxl-Change( )
Yal (TextBoxl .Text
SpinButt~onl.Win Pnd -
End sub
-
NewVal <- SplnEuttonl.Hax Then
SplnButtml .Value MewVal
-
- T e x t b x l .Text Then
SpinButtonl.Value
Unload Me
Else
.
Msgbx "tfleprawidlowa wartole. ' vbCri tica 1
TextBoxl SetFocus
TextBoxl .SelStart 0--
TextBoxl .SelLength Len(TextBox1 .Text)
End I f
End Sub
W I a O c M C Tag
Katdy formulsn U s e f i r m i kontrolka posiadajq MablwoSC Tag. W C h v o # nle reprezentuje nl-
czego szczeg6lnego i domy8lniejest pusta. Mote Jednak paslut$ do pprrechowywania lnformacjl.
Przylmljmy, ze w fwmulatzu Usefiorm majduje sie kllka kontrolek TextBox. Od utytkownika mote
b$ wymagane wprowadzenb tekstu tylko do nlektdrych z nich. W celu identyftkacji wymaganych
@I mozna zastosowaC wta5eiwoSC Tag. W tym pnypadku wartoSciq wtahlwoki Tag mote by5 taki
tahcuch, jak Mywagane. P6fniej w trekde pisania kodu frbd(owego spmdzajzpgo poprawno%
danych wprowadzonych przez uiytkownika m o ~ OCIWOM a sie do wtaSchvoScl Tag.
Ponitej zadeszczono +d funkcjl sprawdzajqcej wszystkle kontrolkl T e x t b x fonnulana User-
Form1 i macajqcej llczbe wymaganych kontrolek TextBox, M6re sq puste:
F u n c t l m EmptyCount( )
-
O l m c t l As Control
EaptyCount 0
--
For Each c t l I n Userfnnnl.tontrols
IfTypeNae(ct1) 'Text&" Then
--
Ifc t l .Tag 3lymagane" Then
If Ct1.Text "" Then
ErrptyCowt EqtyCount + 1
End If
End I f
End I f
Wxe. ctl
EN F W i o n
W b a k e konystanfa z formularzy U s M u n prawdapodobnle pz53dsl d M myfl inne zastosomia
w)alciwoScl Tag.
Procedura wykonuje kokowe sprawdzenie, czy hkst wpmwadmny w kontrolce TextBox
odpowiada m c i wl&iwofci Value konmlki SpinButton. Operacia taka jest koniecma
na'wypadek wprowachnia niepoprawnych danych JeSli na pq&adCu2ykdwnik wprowa-
dzilby w konaolcc TextBox hncuch 3r, wartoSC wlaSciwoSci Value kontrolki SpinButton
nie zostahby zmodyfikowana i w efekcie wynik umieszcwny w aktywnej kom6rce nie
bylby zgodny z onekiwaniarni.
WidciwoSC Value kontrolki SpinButton jest zamieniana na faf~cuchp n e z hnkcjq CStr.
Dzieki ternu uzyskuje sip gwarancjp, ;te w przypadku pohmywania wartofci z fancu-
chem nie zostanie wygenerowany b#qd.JeSli wart066 kontrolki SpinButton nie odpowiada
zawartoici kontrolki TextBox, wstanic wyiwietlony komunikat Mqdu. Nale2y zwrdcit
uwagq, t e uaktywniany jest obiekt TextBox i pny utyciu wMciwoSci SelStart i Sel-
Length zaznaczana jego zawartoik. Dzipki temu utyikownik w bardzo prosty sposdb
mote poprawif wprowadzone dane.
mi& Cantmh
Kantrolkl formulana Userform tworzq zblbr. Na przyklad ponltsza lnstrukcja wygwletla l l d g
kontrolek forrnulana UserFonnl:
HsgBox UserFonl .Controls .Count
Me lstnlele zbi6r dla katdego typu kontmlki. Ne ptzykkd nie istnieje &i6r kontrolek CarmandButton.
Jednak za pomocg funkcji -ypeNm rnotna okre511C typ kontrolki. Ponitsza procedura pny utyclu
mtli For Each . . . Next pmtwana zbl6r Contra; s, a nastgpnie wySwietla iiczb? kontrolek Ccm-
mnd@utton fonnularza UserFsrml:
Sub CountButtonsO
Dim c b b u n t As Integer
-
O l m c t l as Control
cbCount 0
- -
For Each c t l In UserFonnl.Controls
If TypeName(ct1) "ComndButton" n w -
cbCount cbCbunt + 1
Next ctl
MsgMx CbCount
End Sub
Rozddal 13. Wprowadzenie do fmlarry UserForrn 39 1
~ostosowywanieokna Toolbox
Motna tet w oknie Toolbox stworzyt nowy element zbtony na przykhd z dwdch kon-
trolek CornnandButton reprezentujqcych przyciski OK i Anuluj formulam Userform. Po
dostosowaniu obu kontrolek do wtasnych wyrnaga6 naleiy je pneciignqf do okna To-
olbox. P n y u2yciu tej nowej kontrolki okna Toolbox za jednym razern motna dodat
dwa odpowiednio zmodyfikowane przyciski.
Rysunek 13.13.
Okno Tocfbox
zawierajqce now?
za kladh
z kontrotkarnl
Rysunek 13.14.
Okno dialogowe
Addltlonal Controls
omoilhvia dodanie
innych kontmlek
ActiveX
tista kontrolna
zwiqzana z tworzeniem formularzy UserForm
Zanim formularz UserForm zostanie udosqpniony kohcowym utytkownikom, naleq
upemid siq, c y wszystko poprawnie dziala. Ponitsza lista kontrolna powinna porn&
w identyfikacji potencjalnych problem6w.
Czy podobne kontrolki qjednakowej wielkofci?
Czy odlegioh! pomipdzy kontrolkami jest idmtyczna?
Czy tawart& okna dialogowego nie jest zbyt przythczaj4ca? JeSli tak, przy
ugciu kontrolki Hulti Page motna pogrupowaC kontrolki.
Czy katda kontrolkamok mstaC uaktywniona pny utyciu skr6tu klawiaturowego? .
Czy nie d o d o do powielenia skr6t6w klawiaturowych?
m Czy papramie zdefiniowano kolejndt tabulacji?
C y po wci$niqciu przcz u$ykownika klawisza Erc lub klikniviu przycisku Zamhg
formularza UserForm kod W l o w y jpzyka VBA wykonuje wla3ciwq operacjq?
Czy w etykictach nie wystwujq liter6wki7
Czy o h o dialogowe posiada odpowiedni tytut (Caption)?
Czy o h o dialogowe mstanie poprawnie Wwietlone w przypadku katdej
rozdzielczo3ci eluanu? Czasami etykiety, k6re q poprawnie wyswittlane prty
wytszej rozdzielczoSci, po wlqczeniu standardowego trybu VGA zostajq obciete.
Czy kontrolki sq logicmie p o p p o w a n e (wedlug hnkcji)?
Czy kontrolki Scroll Bar i Spl nButton umotliwiajq ustawienie tylko popmwnych
wartogci?
Czy popmmie zdefiniowano kontrolki Li stsox (wartoSci w&iwoSci Mu1 tiSel ect:
- -
0 - frrt.lultiSelectS~ngle,1 frrk!ultiSelectnulti i 2 frMultiSelectExtended)?
Rozdziat 14.
Przyktady
formularzy UserForm
W tym rozdziale zaprezentowano wiele prrydablych pnyklad6w dernonstrujqcych kilka
dodatkowych metod zastosowania formulanv UserForm. lsmieie rnoAiwoSC dostosowania
omowion~chrnetod do wlasnej pracy. ~ s & t k i e pnyklady &ajdujq sip na dhcronyrn
dysku CD-ROM.
W rozddale 15. zamieszczono dodatkowe prrykIady bardziej zaawansowanych rnetod
wybrzystanla formulary Userform.
I ,
Rysunek 14.1.
Okno dialogowe
z kontrolkami
CommandButton
spehiajqce funkcjq
menu
Rysunek 14.2.
Okno dlalogowe
u2jwajqce w roli
menu kontrolki
ListBox
P r i v a t e Sub UserFom- I n i t i a l i z e ( 1
With ListBoxl
.MdItem "Hakrol'
.PddItem 'Makr~a'
.AddItm 'Hakro3"
.AddItm 'Hakrod"
.AddItm 'HakroS"
.Addltem 'Yakm6"
End U l t h
End Sub
Oto kilka zagadnied, o ktdrych nalcty pami@ pny rtosowaniu kontrolki Ref Edi t:
Kontrolka RefEdit m c a M c u c h tektowy nprezentujqcy adres zakresu. Pny
uZyciu p o n h z e j instmkcji hticuch m o k zosmt ramieniony na obiekt Range:
Set UserRange - Range(RefM1t l . T u t )
W celu wySwiedenia aktualnie zgmanonego zalaesu mleca sip dokonanie
inicjalkcji kontrolki RefEdit. Moma to & b i ~ poprzez w n i e s k i e
w procedurze UserForm-In1ti a1 t ze nastwujqcej instmkcji:
I f Err- 0 Then
-
On Error Resume Next
Set UserRange RangeCRefEdt t l . T e x t )
a4 W rozdzlale 12. oplsalem, Jak przy utyciu funkcjl inputBox jezyka WA umotliwiC
u,kownikowi zaznaczenie zakresu.
Okno powitalne projektowanej aplikacji Excela rnowa stwonyC przy utyciu formulam
Usefirm. W ponitszym przyktadzie zaprezentowano fonnularz UserForm. ktory jest
wySwietlany autornatycznie i zarnykany po pipciu sekundach. Aby shvonyf takie okno
powitalne, wykonaj nastqpujqce kroki:
Ryrunek 14.4.
Okno powitatne
jest w e z chwie E F S ~ ~w "U, P , ; -
wySwletlane
w tfakcie B ! . . c o i E - F 1 G i-H--_I J Y
JeSli w trakcie uruchamlanla apllkacja rnusi ,wykonad kllka procedur jezyka VBA,
m t n a wy5vletll~nlemodalny fomulan Usefiom, dzieki c z e m kod iddbwy bad&
caty czas przetwarzany. W tym celu nalety u q f ponijszej procedury:
Private Sub Workbook Open0
UserForml.Show v~ttodeless
W tym miejscu znajduja sic lnne instrukcje
a
End Suh
IfC : o s W e -
'rivate Sub UserForm-QueryClose(Cance1 As Integer. Closettode As rntegerl
vScanControlttenu Then
-
Hsgbx "Aby zamknqt okno, t l i kni j przycisk OK.'
Cancel True
Enb I f
Erg SLitJ
Rysunek 14.5.
Pmste okno
dialogowe
o standardowej
wielkogci
Ryrunek 14.6.
To semo okno
dialogowe
powipkszone w celu
Wmetlenb
dodatkowych opcJ
-
If ~ptions~utton.~apt~un -
Private Sub OptimsButton CltckO
'Opcje >>" Then
&.Height 164
-
CptionsButton.Caption "<< Owe"
Else
W.P,eight - 128
OptlonsBvtton.Capt1on - " m e =-*"
End i f
End Sub
Gdy kontrolkl nie sq Wwietlane, poniewat znajdujq sie poza wldocznq czeSclq
forrnularza UserFonn, motna je uaktywnid ptzy u2yclu klawlszy skrbtdw, Mdre zostaiy
z nlml powlqzane. W tym przyktadzie utytkownlk moie wcisnqC kombinacje klawiszy
Alt+L (uaktywnla opcje Orlentacje pozloma) nawet wteby, gdy opcja nie Jest widoczna.
W celu zablokowania dostqpu do opcji, M6re nle sq wy5wletlane. nalety napisat kod
frddtowy wylqczajqcy kontrolkl, gdy sq nlewldoczne.
Poczwszy od Excela 2000, fonnularze UserFom mogq by? nlemodalne. Oznacza to.
i e pned uaktywnlenlem skomszytu i ykonaniem innych zadarl w Excelu utytkownik
nie rnusi zarnykad okna dialogowego. DomySlnle metoda Show obiektu UserFonn
wySwietla forrnularze Jako modalne. Aby wy3wietllC okno dlalogowe jako nlemodalne,
nalety utyd nastqpuJqcejInstrukcji:
UserFonl . Show vbHodeless
Pnyklad z tego podroldzialu demonstruje, jak utyk kontrolek Scroll Bar w celu umot-
liwienia przewijania i powiekszania zawarto9ci arkusza po wySwietl'eniu okna dialogo-
wego. N a rysunku 14.7 pokazano pnyktadowe okna dialogowe. Po ~ S w i e t l e n i uformula-
rza UserForm uzytkownik mote. modyfikowad warto46 wskahika powi~kszeniaarkusza
(w zakresie od ID do 4 W h przy utyciu kontrolki ScrollBar z gdmej c q k i okna). Dwie
kontrolki ScrollBar urnieszczone w dolnej czeSci okna dialogowego umotliwiajq uiyt-
kownikowi przewijanie arkusza w pionie Lub poziomie.
'
-
Private Sub UserFonn_Initialize()
Labe1Zm.Caption ActiveWindow. Zoom & ' X '
Powiekszanie
--
With k r o l IBarZoan
.Min 10
.Max 400
.$ma1 IChange 1--
.Lamange 10
-
.Value Activeuindow. Z m
End Uith
--
kith Scml IBarColmns
.Mill 1
.Max
- 256
--
.Value ActiveWlndow. k r o l l b l u r m
.Largechange 25
.Sml IChange 1
Ella With
Rysunek 14.7.
Hontmlki ScrollBar
--
Y+t h ScrollBarRcws
.Min 1
.Max Activesheet .UsedRan~e.Rows.Count -
- -
+ Activesheet .UsedRange. Row
.Value PctivdJindow. Scroll Rm
-
.Laq&hange 25
.Smal lChange 1
End W i t h
End Sub
..?om - -
With ActiveHindu#
ScrollBarZm.Va1ve
Label Zwm .Zm& 'X"
End With
End Sub
- ;
Private Sub Scrol18arColums~Change~
ActlveWIndow.Scrol?Colwnn Scml1BarCo1lmns.Value
End 5ub
404 Czf$C IV + Zastosowanie formulany UserForrn
Activellindow.Scrol1Rw
End Sub
-
Private Sub Scrol1SarRc.s-Change()
Scrol IBarRows. Value
Kontrolka LlstBox
Ponitcj wymieniono kilka ngadnieh. o ktdrych nalety pamiqtaf, stosujqc kontrolki Li stbx.
Szerzej zostanqomdwione w nast~pnychpunktach.
r Pozycje kontrolki Li stflox mogq byt pobrane z zakresu komdrek (okreglany ptzez
wlaiciwosd Rowsource) lub dodane p n y utyciu instrukcji kodu h6dfowego
jezyka VBA (stosowana jest metoda Addltem).
Kontrolka ListBox obshguje pojedyncze i wielokrome t e a c z e n i a . Umotliwia
to rvf&ciwobC Mu1 tiSel ect.
Jesli konwolka ListBox zostak tak zdefiniowana, aby nie obshrgiwad
wielokromych zamaczen, p n y q c i u w+aSciwoSciControlSource jej wtdciwoft
Value mote zostat pdqczona z kom6rkq arkusza.
Motliwe jest wyiwietlenie kontrolki L i stBox bez zmacmnych poqcji (wartoicia
wlaJciwodci List Index h d z i e -1). Jednak po wybraniu pozycji utytkownik nie
bqdzie m6gt usunqt zamaczenia, b d z i e m6gl tylko zmienid z a z n a c m q pozycjg.
Wyjqtkowo jest to motliwe, gdy wartoSciq wiaSciwoici MultiSelect jest True.
Konwlka ListBox mote zawierak wiele kolumn (kontrolowane przez wlaSciwoSd
ColumCount), a nawet nagtowki kolumn (kontrolowane p m z wta5ciwo4t
CalumHeads).
WysokoS4 kontrolki Ll stBox wydwietlanej w tworzonym formulam UserForm
nie mwsze jest taka sama, jakjej wysokott po otwarciu okna forrnularza
uruchomionej aplikacji.
R Pozycje kontrolki ListBox mogqmied postat kontrolek CheckBox (w
. p-dku
. ..
zamaczenia wielokrotnego) lubbption~utton[w pnypadku zaznaczenia
pojedynczego). 0 wyglqdzie pozycji decyduje wlaSciwoSC Li stSty'e.
\*!
P%W
ImEa
Aby uiyska6 szczegMowe informacje na temat wta§dwo§cl i rnetod kontrolki ListBox.
nalety skorrystaC z systemu pomocy.
Lepszym rozviiqzanlem Jest nadanle namy zakresowf Iutycie jej w kodzie Wdtowym.
Dzieki ternu na pewno zostenie utyty w h h t w y zakres nawet wtedy, gdy powyiej niego
wkownik usunie b d d doda wiersze.
Rysunek 14.8.
Ustawlanie wertotolcl
WaSclwoSci
RowSoune
w lrakcie
projektowania
WartoSC wlaSciwoSci RowSource zarniast pny utyciu okna Properties m o t e byC usta-
wiona za poSrednictwem inmukcji kodu fr6dlowego. Przykladowo ponitsza procedura
ustawia wartoSC wlaSciwoSci RowSource kontrolki ListBox ieszcze ~ r z e d
wyBwietleniem
f o r m u l a m UserForm. W tym pnypadku pozy-cje kontroiki s q p&choGwane w ko-
mbrkach zakresu Kategorie majdujqcego siq w arkuszu Budtet:
UserForml. ListBoxl .RawSource
.
UserFonnl Show
- 'Budtet!Kategorie"
-
W i t k UserFom2.LtstBoxl
.RowSource " "
.Addl tan "Styczeh"
.AddIten "Luty"
.AddItm "Marzec"
.Add[tan "Kwiecieh"
.Add[tem "Maj"
.Add[tem "Czerwiec"
.AddItm "Lipiec"
.AddItem "Sierpieri"
.AddItm "Wrzesieri"
.AddItem "Paidziernik'
. A d d I t m "Listopad'
.AddItwn Trudzleri'
End With
U s e r F a d .Shm
End Sub
I W powytszym kodzie trddwvym dla wta5ciwoSc.i RwSaurce ustawiono pusty taricuch.
Ma to na cslu uniknlqcie mo*liwold wyntqpienla Mpdu, JeSliw oknie Pmpeflier
dla MaSciwoSc.i Rowsource mstanie ustawiona wartost. Przy prdbie dodania pozycji
do kontrolki ListBox, w przypadku ktdrej wartolciq wta5ciwoSc.i RowSource nie jest pusty
taficuch, zostanie wygenerowany btqd informujqcy o braku dostqpu.
W celu pobrania pozycji kontrolki L i stflox z zakresu rnotna tet poslutyd sie metodq Ac-
dItem. Oto przyklad kodu irbdtowego wypelniajqcego kontrolkc L ? s t B z r zawartoscia
kombrek zakresu A1 .A12 arkusza Arksszl:
-
For Row 1 To 12
UserFonl.Li stBOxl.MdIten 5heets:"Arkuszl") Cell s(P.0~.1;
Next Row
JeSli zostanie uiyty argument klucz, jego wartoit rnusi byc unikatowym lancuchem
tekstowym pchiqcym funkcje nieraletnego klucza stosowanego przy uzyskiwaniu do-
stepu do elementu zbioru. Istome jest tutaj slow0 unikarowym. P n y probie umieszczenia
~ i pozycja nie zostanie doda-
w zbiorze klucza, ktbr), nie jest unikatowy, pojawi s i Mqd
na. Zdarzenie to mote zostaC wykonystane do shvorzenia zbioru zawierajacego tylko
unikatowe pozycje.
Rysunek 14.9. I
ObleM zbioru sfuty
do wypelnienia
kontrolki ListBox
unikatowymi
poqcjami z kolumny B
Sub RmveOupllcatesl()
D i m A1 lCells As Range. Cell As Range
O i m NoOupes As New Collection
-
)cdarne do kontrolkl LIstBox unikatowych pozycjl
Fgr Each item In NoOupes
UserForm1.List80xl.AddItem Item
Next ::m
W celu ident)fikacji zamacmnej pozycji naJW utyC wWciwoki Value kontroki ListBox.
Przykladowo ponitsza insttukcja wyiwietla tawartoft zaznaczonej p o q c j i kontrolki
L i stBox:
VsgSox ListBoxl .Value
JeSli nie zaznaczono tadnej pozycji, warto9ciq wlaSciwoSci List Index bedzie - 1.
--
Private Sub OKBvtton-Click0
nsg - *
For i 0 To ListBoxl.ListCount 1 -
If ListSoxl.SelecW(i) Then -
Next i
-
Hsg Msg & LIstBoxl.List(i ) & vbCrLf
Na rysunku 14.10 pokazano wynik dzialania procedury, gdy zmaczonych zostalo wiele
pozycji kontrolki ListBox.
Rysunek 14.10.
Okno komunlkatu
wySwietla llste
pazycji
zaznaczonych
w kontrolce
ListBox
-
Private Sub obMonths-Cl lck( j
ListBoxl.RowSource "Arkusrl!Manths'
End Sub
Rysunek 14.12.
Tworzenie //SO,
w oparciu o inn* iiste
Kod Zrddlowy zastosowany w omawianym przyktadzie jest dog6 prosty. Oto procedura
wykonywana po klikniqciu przez uMkownika p ~ i s k Dodaj:
u
-
Private Sub A W t t o n - C l i c k ( )
If ListBoxl.ListIndex -1 Pen Exit Sub
If Nct cbDuplic2tes Then
For - -
Sprwrdza. czy pozycja jui istnieje
-
0 To LlstBox2.ListCwnt - 1
If ListBox1.Y~:~~ List3ox2.Lisr:i) Then
Beep
Ex1 t Sub
End If
Next i
End If
ListBox2.AddItem ListBoxl.Value
End Sub
-
Private Sub [)eleteButton-Cl i c t ! 1
i f List&xZ.Listlndex -1 Then E x i t Sub
ListBoxZ.RemoveItem L i s t B o x Z . ~
stIndex
~
End Sub
Powytsze procedury sprawdzaj% czy pozycja faktycmie mstata zamaczona. Jcfli war-
toiciq wlaSciwoSci L i s t Index kontrolki L i stBox jest - 1, oznacza to, t e nie zamaczono
tadnej pozycji, co rpowoduje zakoficzenie wykonywania procedury.
Rysunek 14.13.
Pnyciski umotllwiaj~
u,?ytkownikowi
pnemieszczanie
porvcji w gdrq I w ddl
listy kontrolki UstBox
i
Procedury obskgi d a n e h powiqzane z komlkami CmndEutton wyglqdajq n a s t p u j p : !I
-
I f LiStBaxl.List[ndex <- 0 Then E x i t 5 3
NumIterns ListBoxl.Listtount
'
Oim TenpLtstO
R&lm TempList(0 To %nItm - 11
F3r i -
Wypelnlenle t a b l l c y oozycJami kontrolkt ListBox
-
0 To Num1:ms - 1
TenpLtst(i1 L i s t b x l . L i s t ( t 1
t+ext i
I
I
I
-
Wybrana pozycja
ItemNun List8oxl.Li stIndex
!
-
b ~ a n apoTotenia pozycjl i
T~npLi~t(1tm~W - -
r m p [ t m TWL~S~(I~~NWI)
T m p L l ~ t ( I t a- 11 I
-
impllst(1temNum - 11 TemItem
L?stBoxl.List TenpLis:
nodyfikacja indeXsu 'isty porycji
/
9"
ListBoxl.ListIndex
End Sub
- ItemNum - I
- -
Prlvate Sub Mvd)o*nButton-C1 i c k (
-
If LlstBoxl.List1ndex ListBoxl.ListCovnt 1 Then E x i t Sub
Numltens ListBoxl.ListCount
Dim TempLlstO
ReOim TmpList(0 To NmItems - 1)
-
Wypelnienie t a b l i c y pozycjaml k o n t r o l k l ListBox
-
For i 0 To NumItems - I
TempList(i) ListBoxl.List:i )
Next i
-
' Wybrana pozycja
ItecrNum LtstSoxl.ListIndex
a
-
Zmiana palotenla pazyc:I
- -
TempItem TempLlst(It~nNm)
Tem~List(ItmNum1 TempList(1rmHwn im. 1)
List8axl.List -
Tem~List(1temNum+ 1) TempIt?
TempLlst
'
Llstbxl.List[ndex
End Sub
-
W y f i k a c j a indeksu 1 i s t y pozyc;?
ItenNm 1 +
Pmcedury dziahjq przyzwoicie, ale z jakiegd powodu szybkie klikniwie nie zawsze jest
rejestrowane. Pnykladowo m o a a szybko tnykmtnie kliknqt pnycisk Przesuh w ddl,
ale pozycja zostanie prremieszmna tylko o jedno lub dwa miejsca R o m i ~ n i problemu
e
polega na powiqzmiu z W d q kontrolkq ComndButton nowcgo zdarzenia OblCllck
i napisaniu dla niego procedury. Kod Mdlowy procedur wywdujqcych jedynie proce-
dury obstugi zdarzenia Click wyglqda nastcpujqco:
Private Sub MoveUpButton-OblClick(ByVa1 Cancel As HSFonns. Returnbolean)
C a l l MoveUpButton-Cl l c k
End Sub
P.5 1.k
k 1%
$!',
.,. In{
;I9
m-
?I. 4 . *\Sh.l,/
For i 1 To 12-
Dim Datatl To 12. 1 To 2 )
-
Datatl. 1) Format(DateSerial(2001. i.1). 'mmm")
Next i
- I
For 1 1 To 12
-
Data(%. 2) OaytOateSertal(2DDl. i
kxt i
- 1. 1) - 11
Rysunek 14.15.
L)wukolumnowa
kontrolka ListBox
wypehiona danymi
pmechowywanymi
w tablicy
ListBoxl.List
End Sub
--
ListBoxl.ColurmCount 2
Data
Wydaje sie. ie nie jest rnozllwe okreslenie nagldwkdw kolurnn, gdy Zr6dtem danych
listy jest tabllca jezyka VBA.
Rysunek 14.16.
Kontrolka ListBox
utatwia zaznaczanie
wierszy arkusza
Zamaczenie wielu poqcji jest motliwe, poniewat wartoiciq wlaiciwolci Mu: t 1 S ~ ' e t t
kontrolki Li stsox jest 1 - fmui tiSelectVu1 ti. Pole wybom obok ka2dej pozycji j e s t
wyswietlane, poniewat wartoiciq wMciwo5ci ~ i s ? ~ i y lkontrolki
e L i stBox jest 1 - fn-
L i stStyl eOption.
--
Private Sub Userform-Initial ize(
.
ColCnt ActiveSheet UsedRange.Calumns .Count
Set rng Activesheet .UsebRarge
--
With L i s t b x l
.ColunmCount ColCnt
.RowSource rng .Address
or.
For c
~d
""
-- cw
1 To .ColumnCount
& ~ q . C o l u m n s { c ) . H ~ d t&h ':'
--
Next c
.ColumnWidths cw
.LI s t Index 0
End With
End Sub
-
Prq,vate Sub SelectA11Button-Cl ick( 1
For r 0 To List&sxl.LlstCoun:
listSoxl.Selected(r) True - - 1
Next r
End Sub
-
Pfivate Sub SelectNone8utton-C1 I c k (
For r 0 To ListBoxl.ListCaunt - 1
listBoxl.Selec:w(rl False -
Next r
End Sub
Ponitej ejicszczono kod Wdlowy procedury OKButton-Cl id. Rocedura morzy obiekt
Range o nazwie !?Mange zlotony z wierszy odpowiadaj~cychm a c z m p pozycjom
kontrolki Li st8ox. Aby stwierddd, czy zamactono wimt, procedura sprawdza wan066
wMciwoici Selected konttblki ListEox. W celu dodania do obiektu RMange dodatkowych
zakredw pmedura konysta z funkcji Umon.
Private Sub OKButton-Cl i c k ( 1
--
G i m RowRange As Range
RMnt 0
:or r 0 To ListBox!.?!s;Ccunt 1 -
--
If LlstBoxl.Selected(r1 Then
RowCnt Rolctn: + l
I f R m c f l t 1 Then
-
S e t RmRange ActiveSheet.Rows(r + 11
E l re
End If
-
S e t RouRange Unfon(RowRange. PctlveSheet.Rows(r + 11)
End If
Next r
I f Not RowRange I s Nothing Then RouRange.Select
Unload He
End Sub
UaMywnianle arkusza za pomocq kontrolki UstBox
P n y k h d zaprezentowany w niniejszym podpunkcie jest w r6wnym stopniu pnydatny
i pouczajqcy. Zastosowano tu wielokolumnowq kontrolk~ListBox wySwietlajqcq listc
arkuszy aktywnego skorosEytu. Kolumny przekazujq takie informacje, jak: n a m a arku-
sza, typ arkusza (nvykly, wykresu lub okna dialogowego Excela w wersjach 5 i 95),
liczba niepustych korn6rek arkusza i w i d o c m o ~ tarkusza. Na rysunku 14.17 pokazano
przykiadowe okno dialogowe.
Rysunek 14.1 7.
Okno dialogowe
umotliwia
uiylkownlkowl
uakfywnienle arkusza
- -
Dim SheetDataO As String
Set Originalsheet ActiveSheet
ShtCnt Mive!dorkorkbaQ.Sheets.Count
-
ReDIm SheetData(1 To ShtCnt. 1 To 41
ShtNm 1
--
For Each Sht I n nctiveWorkbook.Sheets
I f Ylt .Name Activesheet .Name Then
-
-
-
L i s t P ~ s 9tNm 1
SheetData(ShtNum. 11 Sht .Name
Select Case TypeName(Sht1
Case 'Wwksheet'
-- -
SheetDaU(ShtNum. 21 'Arkusz'
%eetData(SMIYum. 31
Appl1catton.CountA(Sht.Cells)
Case .Ch?rtm
SheetData(ShtNun.
SheetDatafShtNun.
2)
3)
--
'Uyl;res"
'8rak danych'
Case "DtalogSheet'
SheetOats(ShtNm.
SheetData(ShtNun.
2)
3)
-- "@no dialogowe"
"8rak danych'
End Select
! f Sht.Yislble Then
SheetData[SMNvn, 4) - 'Prawda'
Else
SheetData(SMICn. 4) - 'Falsr'
End I f
-
SMNun ShtNun + 1
Next Sht
- --
With ListBOxl
.CalmnWidths '70 pt:70 pt:60 pt:50 pt'
. L i s t SheetOata
.LlstIndex ListPos
End With
End Sub
Wart056 wEs4ciwo9ci Value kontrolki CheckBox o nazwie cbpreview decyduje, czy dla
wybmnego arkusza zostanie wySwietlony podglqd, jJli utydcownik zmaczy w kon-
trolce ListBox p o w i w q z niqpozycjp. Klikniecie OK (kontrolka OKButton) spowoduje
wykonanie procedury OKButton-C1 Ick, kt6rtj kod Wdtowy wyglqda nastepujqco:
Private Sub OKButton-Click0
-
O i m UserSheet As Object
Set UserSheet heetstListBox1 .Value)
IfUserSheet .Visible Then
UserSheet .Activate
Else
- -
I f MsgBox("tzy pakazaC a r k u ~ ~ ? -" ,
vbQuestian + vbYesNoCance1) vbYes Then
UserSheet . V i s i b l e True
UserSheet .Activate
Else
0riginalSheet.ktivate
End If
End I f
Unload He
End Sub
Dwukrotne klikniecie pozycji konlmlki LlstBox da takie same efekty, jak kliknigie OK.
Ponihza pmcedura L i stBoxl-Dbl C1 ick wywohje jcdynie p r o c e d u ~OKButton-Ci ick:
Prlvate Sub L i s t b x l - b l C l l c k ( B y V a 1 C a ~ e As
l NSForms.Return~lean1
Call OKButton-Cl lck
End Sub
Rysunek 15.1.
Ten formulan UserForm
shty jako wskafnik
postepu zadania
---
Cells.Clear
Counter 1
RawMax 200
Co!Max
- 25
-
For r 1 To M a x
- -
For c 1 To to1 Hax
Cellsfr, c l Intcbd * 13110)
Counter Counter + 1
Next c
-
PctDow Counter / [ R M x * ColMax?
Call lbdateProgress(Pn3one)
Next r
Unload UserFoml
End Sub
424 Cz@t IV Zastosowanie formulaw UserForrn
--
With UserFonl
.FrameProgress.Captton Format( Pct. "0%')
.LabelProgress.Width Pct * ( .FramePrcgress.Nidth - 10)
.Repaint
End With
End Sub
Ryrunek 159.
Na d ~ g l estronie
j
kontrolki MultiPage
mstanie wySwietlony
wskainik
postppw zadania
--
With UserFonl
.FramProgress.Capt1on Format(Pct. '0%")
.Label Progress .Wi~dtb Pct * ( .Frame!Jrogress .Width - 10)
.Repaint
End Wlth
End Sub
Insaukcja uaktywnia drug%stronp kontrolki Mu1t i Page (tq, ktbra wyiwietla wskafnik
postepu zadania).
Nastqny krok zal* od aplikacji. Musimy napisad kod do obliczania procentu wykonania
zadania i pnypisania wyniku do z m i e ~ ePctDone.
j W wiekszoici przypadkbw rakie obli-
m n i e wykonpme jest w e l i . Po wykonaniu obliczenia zastosujemy ponitsq instmkcj$
do uahalnienia wskatnika postppu zadania:
Call VpdateProgresstPctDone)
Na rysunku 153 pokazano fwmularz UserFon wySwietlany w oknie edytora Visual Basic.
WtaSciwoSC Height formularza Userform wynosi 172. Jednak p m d wyswietleniem for-
mularza UserForm wtaSciwoSd Height jest zmniejszana do 2 4 (co oznacza. t e kontrolka
wskainika postwu zadania nie jest widocma). Dopiero kiedy utytkownik kliknie OK.
w kodzie VBA nastqpi modyfikacja wlaSciwoSci Height do wartoSci i i 2 za pornocq na-
stqpujqcej instrukcji:
Rysunek 15.3.
Pokazany wskainlk
postepu zadania
zostanie ukryty
paprzez mniejszenie
wysokoJci fonnulana
UserForm
-
Kreatory interakiywne sekwencje
okien dialogowych
W wielu aplikacjach wykorzystuje sic kreatory, kt& prowadqu2ytkownika przez pmces
wykonywania dziaiah (pnyk(adem mote by6 beator jmportu Excela). Kreotor to nic
innego, jak sekwencja okien dialogowych, kt6re pobieraja infomacje od utytkownika.
Czqsto wybory dokonane przez utytkownika w jednym oknie dialogowym majq wpiyw
na zawartott okien kolejnych. W wighzo2ci krcator6w M o w n i k ma swobodt poru-
szania sie w prz6d i w tyl w sekwencji okien lub mote kliknqt ZakoAcz, aby zatwiirdzi6
wartosci dornytlne.
Rysunek 15.4.
W tym kreatone
zastosowano
kontrolkq MultlPage
Rysunek 15.5.
KMknlgcie pnycisku
I Anuluj spowoduje
wygwietlenie
kamunikatu
-- -
P r i v a t e Sub CancelButt~llckO
Usg 'AnulwaC dzlalanie kreatora?'
Pns Hsgbx(Hsg, vbQuestion + vblesb. APPNfflE)
If Ans vbYes Then Unload Me
End Sub
Procedury obshgi zdarzeh dla pnycisk6w Wstea oraz Dolej zapmentowano ponitej:
I
-
Prlvate Sub B&Button-Cl IckO
MulttPagel.Value MultlPagel.Value
UpdateControls
- 1
End Sub
UpdateControls
-
P r i v a t e Sub NextButtcn-Clickt)
HultiPagel.Value MulttPage1.Value 4 1
End Sub
Sub UpdateCcntmls()
Select Case kltlPagel.Va1 w
Case O
8ackButtm .Enabled
kxtButtar.Enabied
-- False
True
430 CzqE IV + Zastosowonie formulamy UserForm
Case HultiPagel.Pages.Cwnt - 1
Back0utton.Enabled
NextButton.Enabled Fa1 se
-- True
Case Else
BackButton .Enabled True
NextButton .Enabled = True
-
End Select
'
-
Aktuallzacja t y t u l u
Me.Captlon APPNM 8 ' Krok "
I Mu1t i P a p 1 .Value + 1 & " z " -
-
& Mu1t i P a p l . P a g e s . t a m t
'
I f tbName.Text -
Pole Nazwlsko j e s t obawiqzkowe
FimshButton.Enabled -
" " Then
Fa1 se
Else
Finish&rtton.Enabled
End If
- True
Ena Sub
W naszym pnykladzie w kodtie utyto dw6ch tablic kontrolek -jednej dla @I wyboru
produkt6w (kmk3.J drugiej dla kanh-olek Frame (krok 4). Zastosowano pedq For . . . Next,
kt6ra ukrywa n i e w w a n e ramki produkt6w oraz koryguje ich pozycje w pionie. Jeteli
w kroku 3. nie zaznaczono 2adnych produkt6w. wszystkie kontrolki w kroku 4. bp*
ukryte poza p l e m tekstowym wyiwietlajqcym tekst Kliknij Zukorics, aaby ~3,js'C(jeteli
w h k u 1. wprowadmno nazwe) lub Wprava&enie nmwiska w b o b I. jest obowiqrkawe
ljeteli w kroku 1. nie wprowadmno nazwiska). Procedu1.e HultiPagel-Change zapre-
zentowano w listingu 15.2.
-
Czy w y W e t l i C s t m e z ocena?
IfPbltiPagel .Value 3 Then
Rozdziot 15. + Zoowansowane techniki komystonio z formulam/ UserForrn 431
--
Dim Pr,MCB(l To 3) As HSFons. CheckBox
Set PmdCB(1) cbExce1
-
Set PmdCB(2) W o r d
Set ProdCB(3) cbAccess
Utworzenie tab1 i c y kontrolek Frame
Dim ProdFram(1 To 3 ) As FISForms.Fram
---
Set PmdFram( 11 FrarneExcel
Set ProdFram(Z1 Frameword
Set ProdFram(31 Framebccess
--
TopPos 22
FSoace 8
-
AtieastOne False
-
Petla dla wszystkich p r o d ~ k t j w
Far i 1 To 3
- -
If ProdCB(i ) Then
ProdFraWi) . V i s i b l e True
- -
ProdFrame(i) .Top TapPos
TopPo5 TopPos + PmdF:ane() .Height FSpace
AtLeastOne True
Else
ProdFram(i).Visikle
End I f
- Fa'se
Next 1
Nie wymleniono produktow?
- --
I f AtLeastOne Then
131Headings.Visible True
Image4. V i s.i b l e True
1blFinishM~g.Visible False
- -
Else
1blHeadings.Visible False
Imge4,Visible False
-
IblFinisht4sg.V1slble - True
If tbName "'Then
1b l FinishMsg.Caption -
"Wprwadzenie nazwitla w krohu 1. j e s t obowiaztoue
Else
1blFinishMsg.Caption -
'Kliknl j Zakokz. aby wyjit."
End I f
End If
End If
End Sub
r -
Private Sub F i n i s h & l t t ~ ~ - C l I c k ( )
Application.WorksheetFunction. -
CountA(Range('A:A') ) + 1
'
-
Wstawi eni e n a m i ska
Cel1s:r. 1) tsNam.Text
k t a w l e n l e informacji o p l c i
Select Case True
Case obnak: C e l l s ( r . 2) --
'Metczyzna"
Case obfenale: C e i l s ( r . 2) 'Kocleta"
Case obNoPnswer: C e l l s l r . 2)
End Select
-
'Brat odpowtedzf~"
---
' Wpravadzenie i n f o n a c j ; 3 prbduktach
Cell s ( r. 3) cSE.xcel
Cellscr. 4) c'snor3
C P ~l s ( r . 5 ) cnkcess
Wpmadzenie ocen
[ f obExcell Then C e l l s ( r . 6 ) " " --
I f obExcel2 Then t e l l s ( r . 6 ) 0
If obExce13 Then t e l l s ( r . 6) 1 --
I f obExcel4 Then t e l l s ( r . 6 ) 2
I f obUordl Then C e l l s ( r . 71 "' --
--
I f obWord2 Then C e l l s ( r . 7) 0
:f 0bU0rd3 Then C e l l s ( r . 71 1
---
If oaWoroJ Then C e l l s ( r . 7) 2
If obaccessl Then Cells(r. 8) '"
I f obAccess2 Then Cells(r. 8) il
I f obAccess3 Then C e l l s ( r . 81 1
If oMccess4 Then Cells(r. 8) 2 -
Usuniecie f o m l a r z a
Unload !4e
End Sub
Celem tego Cwiczenia nie jest utwomnie altematywnej funkcji wyswietlania komuni-
katow, ale zademonsh-owaniesposobu twonenia stosunkowo skomplikowanych funkcji
433
Skhdnia jest taka sama, jak h k c j i MsgBox, ale nie motna wprowadziC dw6ch ostatnich
opcjonalnych argumentbw (Helpfile i Context). W hnkcji MyMsgBox wykorzystamy te
same predefiniowane stak, kt6re wykorzystano w funkcji MsgBox: vbOK0nly. v w u e s t i o n ,
vbOefaul t B u t t o n l itd.
I
Aby poznaC agurnerrty funkcji MsgMx, nalefy zapomd sie z jej listinglem dostecmym
w systernie pomocy.
--
Ptocrptl Pmnpt
-
&Ittons1 &Ittons
Title1 Title
HflsgBox
End Function
-
I?yMsgi%xForm. Shw
Userclick
434 CzefC IV Zastosowanie bmwlorzy UserForm
Dzialanie funkcji MyMsgBox pokazano na rysunku 15.6. (zastosowalem inn4 czcionke dla
tekstu kornunikatu).
Rysunek 15.6.
m t k di3ahnia finkdl
emufujqcej lunkch MsgBox
(z zastosowaniem
innej czcionkj)
Ponitej majduje sic kod. kt6rego utykrn do umchornienia finkcji:
--
Prcmnpt "Masz zaniar wymazae zawartoSC dystu twardego."
--
P m p t Pmmpt & vbCrLf 8 " K l i k n l j OK. aby kontynuowat."
Buttons vb0uestlon + vbYesNa
-
T i t l e "Marny problem"
h s MyMsgBox(Pranpt. &Ittans. T i t l e )
Rysunek 15.7.
Fomulan UserForm
dla lunkcjl MyMsg8ox
-
W procedune UserForm I n i t i a l 1 ze s q s p r a w h e argumenty, po czym odbywa sic:
H sprawdzenie, kt6rj obrazek nalety wySwietBC Cjeteli wybrano wyiwietlenie
o b h ) , i ukrycie pozostalych.
H sprawdzenie, kt6re pnyciski nalety wySwietlit, i ukrycie pozostalych,
sprawdzenie, kt6ry.pnycisk jest dornfllny,
wySrodkowanie pnyciskbw w oknie dialogowym,
okreilenie podpisbw pnyciskdw,
okrdlenie pozycji tekstu w oknie dialogowym,
Rozdziat 15. z formulcrny UserForm
Zaawansowane techniki ko~zystania 435
Dodatkowo zdefiniowano tny pracedury obslugi zdarzen @o jednej dla kadzdego pqcisku).
W procedurach tych nastqpuje sprawdzenie, &dry pnycisk klikniqto. i zwrbcenie war-
toici funkcji popnez ustawienie warto3ci zmiennej UserCl ;cl.
Ten argument powoduje utworzenie okna RgBox z tmrna przyciskami (Tak. Nie i Anul~rj).
wyiwietlenie ikony pytajnika i ustawienie tncciego przycisku jako dornyilnego. Rze-
czywista wartost?argumentu wynosi 547 (3 + 32 + 512). Na podstawie tej jednej liczby
trzeba uzyskat? t n y informacje. W tym celu nalety przeksaalcit? argument na postat bi-
narnq i sprawdzit ustawienie poszczegdlnych bifiow. Na pnyktad liczba 547 w postaci
binarnej to 100010001 1. Cyfry binarne na pozycjach od 3 do 6 ohellaja wygwietlana.
-
ikonq. od 8 do 10 wyfwietlane przyciski, natomiast cyfry na pozycjach I. 2 informuja..
kt6ry pnycisk jest domyslny.
SyQ
- .1
Po raz plenvszy obstu@ nlemodalnych &ten dlakgowych wprowadzono w Excelu 2000.
We wczedniejszych wersjach Excela wtafciwofC ta jest niedostgpna.
mrm
Aby wySwietlii: niernoralny f m u l . a n U s e r F o nakty
~ skorzystad z nastcpujqcej insinkcji:
UserFonnl. Sl?ow vhdeless
Rysunek 15.8.
Niemodalne okno
dialogowe umotlhvia
utylkownikowi prace -
z innymi oknami S)#i.4aL
ma,,,
..E..
J@JII.Y.L
B
i . .P -E
-#I'
-.~:-.F.-Q. .: .!- :... 1
-1
..--
1blFomla.Caption -
If TyoeNane[ActiveSheet) 0 'Worksheet' then
'NIA"
1 Rozdzial 15. + Zaawansowane techniki kotzystonia z forrnularzy UserForm 437
--
.I blNumFonnat .Caption 'N/A'
1 blLocked.Caption "NIA'
E x i t Sub
End If
-
.Caption "Komdrka: ' L ActiveCell .Address(False. False)
Fornula
-
If ActiveCell .HasFormula Then
.lblFomla.Caption Activecell .Formula
Else
-
1blFonwla.Caption "(brakl"
End If
Format liczby
-
.lblNtnnFormat.Caotion ktiveCell . NumberFormat
-
Kombrka zablokowana ?
IblLocked.Caotion Activecell .Locked
End With
End Sub
Rysunek 15.9.
W tym f o n u l a m
UserFonn
wyfwietlono
infunnacje na temat
a k w n q kombrki
M6wiqc inaczej, nie motna skonfigumwa6 maha, kt6re b@zie wykonywane w mornencie
kliknivia dowolnego pnycisku. K d a proeedua obslugi zdarzenia Click jest ,.Mtwardo"
powiqzana z konkretnyrn przyciskiem CannandButton. Moma jednak spowodowaC. teby
w katdej procedurze obshgi zdanenia majdowalo sig wywoianie uniwersalnego ma-
ha, ale w takim przypadku trzeba pmkazat do niego argument wskazujqcy na to, ktbry
przycisk kliknitto. W ponilsych przykladach kliknipcie przycisku ComndBut:onl lub
C m a n d B u t t o n Z spowoduje wybnanie pmcedury ButtonC?i ck i przekmanie do niej ar-
gurnentu informujqcego, kt61y pnycisk klikni~to.
Private Sub CmandButtonl-C1 i c k ( I
t a l l ButtonClick(l)
End Sub
--
Private Sub ButtonGroup-Cl ickc)
Hsg "Kliknieto " & euttonGmup.Name & vbCrlf 6 vbCrtf
--
Hsg Msg 8 "?odpia: " & &ttcnGrcup.Cap:lw. & vhCrLf
Hsg Hsg & "Lewa wspdlrzedna: " & 0uttonGrwp.Left 8 vKrL:
Hsg Hsg & "G6rna wspbl rzqJna: ' & ButtonGrcup .-op
4sgBox Ysg. v b I n f o m t i o n . F!uttanGroup.Name
End ScS
3. Dodaj modul VBA i wprowadi podany nitej kod. Dzialanie tej pmcedury polega
na wytwietleniu fonnularza UserForm.
Sub 9OwOialog( )
UserForml .Shm
End Sub
Utworze~ieo b i e k t b Button
ButtonCwnt = 0
I f TypName[ctl) -
For Each c t l In-EJserForml.C3ntrol s
"tomnandButton' Then
-
Ifc t l .Name u "OKButton" Then ' pomimecle przyci sku OK
ButtonCount ButtonCwnt + 1
-
ReOim Preserve Buttons( 1 -0 ButtonCount 1
Set Buttons(EvttonCount) .ButtonGrovp c t i
End I f
End If
Next ctl
End Sub
Rysunek 15.10.
Procedura
ButtonGroup-Click
wySwietla infonnacje
o tym, &dry przycisk
kliknieto
I
i Wyb6r koloru za pomocq formularza UserForm
Przyklad zaprenntowany w tym podrozdziale jest nieco bardziej skomplikowany od
przykladu poprzedniego, choC sq one do siebie podobne. W pnykfadowym skorosqcie
zademonstrowano technikq wyiwietlania formularza UserForm umotliwiajqcego wybie-
ranie kolor6w z palety skokszyCu skladajqcej sic z 56 kolor6w. ~ ~ k o r z y s t a nfunkcjp
o
Get ACol or wyswietlajqcq forrnulan UserForm i zwracajqq wart066 wybranego koloru.
Buttonbunt 0 -
Dlm ButtonCount As Integer
- -
Dla 56 przyctskbn oznacrajqcych kolory w~afclwo5tTag ustawiom na ColorButtan
I f c t l .Tag "ColorButton" Then
ButtonCount ButtonCount + 1
Set Buttons(ButtonCwnt) .Colorflutton c t l-
Pobranie k o l o r b z palety aktywnego skoroszytu
0uttons(8uttonCount).ColorButton.BackColor --
ActiveUorktcak .Colors(&rttonCount)
End If
Next c t l
-
UserFonnl .Show
G e t n b l o r ColorValue
End Functlon
Rysunek 15.1 1.
To okno dlalogowe
umozliwia
uzytkownikowt
wybranie kolom
poprrez kliknigcie
przycisku
Chociat fonnulanr UserForm majq daleko wiqksze motliwo~cinit stare afkusze dialogowe.
to jednak wydaje sic, te o tym jednyrn aspekcie Microsoft zapomnial.
a&* W Excelu 97 i w wersjach p6tnieJszych w dalszym clqgu motna kofzystaC r arkuszy
(9, dlalogawych I z ich pomocq wySwietlaC dynamiczne wykresy w oknach dialogowych.
Rysunek 15.12.
mtarczy
odroblna pomystowo9ci,
aby wyjwietlat
"dynarniczne" wykresy
w forrnulanach UserFom
Fname -
Set Currentchart -
She?tts['Dane" .ChartObjects(l).Chzr:
ThisUorkboot. Path b ' \ t m p . g i f '
CurrentChart.Eqort Fi 1eNaee:-Fname. F l l terName:-'GIF"
,:r3...+:Y Pokazany powytej spas6b ddaia, ale podczas zapisywania i odtwamnla wykresu
\ef WjStepUje niewielkie op6tnienie. W przypadku szybkich kornputer6w to op6fnienie
- nie jest jednak odczuwalne.
Rysunek 15.13.
Ten formularz . . ,- . .. fl
UserForm zawlera
kontrolke Chartspace
obok pozycji Microsofl Ojlice Chart 11.0. W pnypadku Excela 2002 bgdzie tarn pozy-
cja Microsofl O J c eChart 10.0, natorniast w przypadku Excela 2000 pozycja Microsofr
Ofice Ch& 9.0. Klikniecie OK spowoduje dodanie nowego przycisku do przybornika.
-
'
Dodanie wytresu do oblettu ChartSpace
Set Chart 1 ChartSpacel .Chz~s.ACd
Nadanle wytresoui t y t u l u
Ulth Chartl
.HasTit l e True - -
.Title.Caption Range('B1'1
End U i t h
For r - 2 To 13
--
XValuestr - 1) Cellscr. 11
DataYalues(r - 1) Cellstr. 21
Next r
-
Utworrenie sert i danych wykresu
S e t Seriesl Chartl.SerlesCollectian.Add
Dokurnentacja obiektbw OWC znajduje sie na twardym dysku. Jest ona instalowana
w momencie instalowania skladnika OWC. Altematywnie motna uAyC prLeglqdarki obiek-
tbw, dziqki niej motliwe jest lepsze pomanie w+aSciwo9cinowych kontmlek.
Model obiektbw do twonenla wykres6w dla sktadnlk6w OWC nle jest taki Sam.
c~F** jak model oblektbw do tworzenla wykres6w w Excelu. Zastosowanie jqzyka VBA
do wykonywania dziatah na "rzeczywistych" wykresach Excela om6wiono w rozdziale 18.
Rysunek 15.14.
Ten fomularz
UserFom zawlera
kontrolke Chartspace
(jeden
z komponentbw sleci
Web pakietu Office)
Rysunek 15.15.
Ten formularr
Userform
1 Spreadsheet
Rysunek 15.16.
W tym fomulam
UserForrn zastosowano
kontrolke Spreadsheet
do utwonenia prostego
kalkulatora rat poaczki
Rysunek 15.17.
Tego okna
dialogowego matna
utyC w celu
dostosowania
-kc-bwda 1Qmra :I
-
a
.
F m e 1 k m ( . I M P m
..- . ~.
f-w-
. ........
i+%dax:,
A
m
...
-
cwnm=m
wtabciwodci kontrolki ~~
Soreadsheet r wmpaars r w m -
rw* Pmkmodd
- .-. - - -.--- . - -.
-........ -. .- . . . .
me.:
, ..-
awl
ibY1' + d
b b w d
i * *
6. Zaznacz zakres 81: 03, a nasqpnie kliknij zakladke Format w oknie dialogowym
Polecenia i opcje. Kliknii ikonc klucza w celu odblokowania zaznaczonvch
kom6rek (po;o;tale kornbrki p&ostanq zablokowane; jest to dzialanie &myilne).
7. Kliknij zakhdkc Arkarsz w oknie dialogowym Polecenia i opcje. Wpolu Widocty
zakres wprowadi A1: 05. Spowaduje to ukrycie nieutywanych wierszy i kolumn.
a. Anuluj zamaczenie opcji h'agldwki wiersry oraz Nagkjwki kolumn.
9. Na koniec dodaj dwa przyciski poleceb. Prycisk Cancel8utton bqdzie spelnial
funkcje przycisku Amrluj, przycisk PasteButton spowoduje wykonanie kodu,
ktdry wklei obliczony wynik do aktywnej komdrki arkusza Excela.
-
Private Sub PasteSutton-Ctick( )
ktiveCel1 .Value S p r e a d s k ' . ? .Range("35'f
Unload He
End Sub
Rysunek 15.18.
Forrnulan danych
Excela
Podobnie jak formulam danych Excela, m6j ulepszony formularz danych wykonuje
dziaiania dla listy z arkusza. Jednak, jak motna zobaczyt na rysunku 15.19, ma zupehie
inny wyglqd i dodatkowe zalety.
Rysunek 15.19.
' Ulepszony fonnulan
danych opracowany
przez aurora ksiqtki
W prowadzenie
Nanqdzie nie jest produktern koricowym, takim jak na przyktad kwartalny raport. Jesr
to raczej program, kt6ry utatwia tworzenie produktu kon'cowego. Narzqdzie Excela to
prawie zawsze dodatek wzbogacajqcy jego motliwofci.
Pomimo tego, t e Excel jest doskonaiym produktern, utytkownicy wciqz zgtaszaja pro-
pozycje ulepszed. Na ptzykjad ci, kt6rzy wylqczajq wybwietlanie linii siatki, z radoiciq
powitaliby opcjp ponownego ich wtpzania bez konieczno8ci otwierania okna dialogo-
wego NanqdzidOpcje. Utytkownikom wykonujqcyrn operacje na datach przydalby sic
p o d r p n y kalendarz ulatwiajqcy wpmwadzanie dat w komijrkach. Jeszcze inni poazebujq
htwiejszej rnetody eksportowania zakresu danych do osobnego pliku. To tylko kilka
przyktaddw d z i a t a ktdre prawdopodobnie nigdy nie pojawiq sic w standardowym ze-
stawie whsciwoSci funkcjonalnych Excela. Motna je jednak dodad, t w o q c narzqdzia.
Powy2sm makr~mo2na zapisak w osobistym skoroszycie z mahami I& aby by10 zawsze
dostcpne. W celu umo2liwienia szybszego dostepu, motna je przypisat do pnycisku na
pasku n a n e do nowej pozycji menu, do polecenia w menu podrccmym Iub do skrbtu
klawiaturowego.
Kilka pt-oIdadbw kodu fr6dbwego zaprezentowanych w czeCl IV m o ~ za tativo5ciq
meloztafcif ria namedzia.
456 Cz$SC V + Zoowonsowane techniki programowonio I
Jqzyk VBA pocqtkowo mote wydawat siq trudny. ale w praktyce okazuje sie bardzo
przystepny. Kluczern do osiagniqcia mistrzostwa w j~zykuVBA jest eksperyrnentowanie.
Katdy projekt, ktbrym sic; zajrnujc, zwykle sktada sip z kilkunastu rnatych ekspery-
mentdw propnmistycmych, wsp6lnie tworqcych koticowy pmdukt. Jpzyk VBA pozwala
tet poszemc rnotliwoici Excela w sposdb spojny z jego standardmi dotycqcymi menu,
paskdw narrpdzi i okien dialogowych.
Za pornocq Excela rnotna &if pnwie wszystko. Kiedy napotkmy ilepq uliczke, nvykle
okazuje sip. t e do celu prowadzi inna icietka. Tneba rylko by6 kreatywnyrn i wiedzief,
gdzie nalety szukaf pomocy. Niewiele pakiet6w programowych zawiera tak obszerny
zestaw nmcdzi pozwalajqcych ~Zytkawnikowina rozszemnie standardowych motliw&ci.
Efekfy ich dziafania motna cofirqf. Utytkownikorn, kt6ny nie bpdq zadowoleni
z dzialania naszych narzcdzi, nalety zapewnit sposdb cofnipcia skutkdw ich
Rysunek 16.1.
NanNn'e Operaye
tekstowe motna
wykonystad
do zmiany wlelkofci
liter zaznaczonego
tekstu
zmianq wielkoJci liter tekstu (dute littry, mak litcry, wszystkie wyrazy z d q c h
liter, jak w zdaniu, przdzpnik mak-dute),
wprowadzanie mak6w w tekScie (m pocqtku. na koricu, na okrdlonej pozycji).
B usuwanie mak6w z tekshl (z pocqtku, z kodca lub z okrtglonej pozycji).
usuwanie spacji z tekstu (wszystkich spacji lub nadmiarowych),
usuwanie mak6w z tekstu jniedrukowalnych, mak6w alfabetu, makdw
niebcdqcych cyfmmi, mak6w nietydqcych cyframi lub znakami alfabetu).
Ne
- Opeq'e tekstowez pakietu Power UtiHty Pakmtdwbgpm na p)yde C W M
dolgzon) do ksiqtki. Mofna )e zainstalmaC, wy!Aera]+c w Excel" polecenlc
Nan@zia/Dodatki (,ale, klikng pnycisk Przeglqdaj i odszukad plik *.xlal. MoLna
tei po prostu ohvo m plik za pomczq palecenia Plik/Ohv&z W kazdym przypadku
~stniejedostep do pelnego kodu &&owego {ten prolekt VBA nie Jestchroniony haslem).
458 Czeft V Zaowansowane techniki ~ r o a r a m o w a n i a
Fomularr UserForm dla nmgdzia Opwa4e tebrowe pokazano na rysunku 16.2. Wano
nvrdcit wag?, t e konfiguracja kontrolck zmienia siq w zaletnoSci od wybranej opcj i.
Rysunek 16.2.
Fonnularr UserForm
dla nanedzla
Operacle tekstowe
Na rysunku 16.3 pokazano wyglqd fonnularza UserForm dla katdej z pipciu operacji.
Konfiguracja kontrolek j e s t r6tna w zaleMo4ci od wybranej opcji.
Ryrunek 16.3.
Uktad fomulana
U s e r f i n jest r b a y
dla rdinych operacji
--
D l m nui it en As ComnandBarSutton
Set ToolsMenu Application.CmndBars(1) .FindControl(Type:-10. 10:-30007)
Set W n u I t m ToolsMenu.Co~tro1s .Add(Type:-1. Temporary:-True)
--
With NewMenuItem
.Ca3tion APPNAnE
.OaAction "RunTextTool S "
End W i t n
End Sub
-
Gdy dodatek jest zamykany, nastepuje wykonanie procedury Workbook BeforeCl ose. Jej
dzialanie polega na usunipciu pozycji z menu ,Vurz&ia.
Private Sub Workbook-bforeClose(Cznce1 As Boolean)
On Error Resum Next
Applicatlon.Com~ndBars(1).Finbtootrol(Type:-10.
10:-30007) . t o n t r o l ~ ( A 3 ~ N A m
.Delete
)
On Error &To 0
End Sub
Na aysunku 16.4 pokazano menu Narrqdzia podczas otwierania narzpdzia Operacje rek-
stowe.
Rysunek 16.4.
Menu Naqdzta.
w Mdrym Wwfetla
slq dodatkowa m a
W ~ e Infomacji
j na temat dodawania pow1 do menu ma]&Je sig w mzdziale 23.
462 Czgfk V + Zoawansowane techniki p r o g r a m w a n i a
Ta prosta pmcedura sprawdza, czy istnieje akcywny obiekt i czy aktywny obiekt jest ar-
kuszern roboczym. Jeteli nim nie jest, mienna Invalidcontext otnymuje wartolt True.
a sprawdz&a w instrukcji If .. . Then . . . Else i w zaletnofci
Nastqnie z m i e ~ jest
od jej wartogci zostanie wyiwietlony komunikat (wbacz rysunek 16.5) lub fomulan
UserForm. W metodzie Show Eastosoweno wgurnent 0, k6ry powoduje. Ze okno UserForm
staje sic niemodalne (tzn. w crasie jego wyiwietlania utytkownik maze kontynuowat
pracq w Excelu). ~
I
I
Rozdziot 16. + Tworzenie narzgdzi dta Excela w jezyku VBA 463
Rysunek 16.5.
Ten kornunikat
1 -
:s7$%* Kod nie sprawdza, czy zaznaczono zakres komdrek. Obstug? tego Medu zawarto
w kodzie wykonywanym po klikniviu przycisku Zaslosuj.
Procedura UserForrn-Initialize
Wykonywana jest przed wyiwietleniem formulam UserFo-m. Jej dzialanie polega na
obef leniu roniar6w formularza UsetFon i pobraniu (z rejestru Windows) popnednio
wybranych wartoSci dla fomant6w. Procedura dodaje t&e elementy na liScie pola
kornbi (o namie Com3oBoxOperation), ktdrego wartoif decyduje o wykonqwanej operacji.
Procedura ~ o m b o ~ o x ~ ~ e r a t i o n - c h b n g e
Wykonywana jest za katdym razern, kiedy utytkownik wybierze pozycje w polu kombi
Operacja:. Zadanie procedury to wyfwietlanie lub ukrywanie kontmlek.
Procedura AppIyButton-Click
Wykonywana jest w momencie k l i k n i ~ i aprzycisku Zustosuj. Najpienv sprawdza Mqdy,
a nastgpnie wywojuje funkcjq CreatekiartR~rgew celu sprawdzenia, czy oie ma pustych
komdwk w z a h s i e zamaczonym do pmtwarzania (wiwej infomacji znajduje sic
w nastcpnym punkcie .,Popram wydajnoici narzedzja Operacje tekstowe"). Procedura
App2yButton C l i c k wywohje rdwniei procedure SaveForUnCo, ktbra zapisuje biea.ce
dane na wypidek, gdyby u2ytkownik chcial cofnqt opaacje (wiqcej infomacji majduje
sip w punkcie ,Implementacja procedury Cofnij" w dalszej czqSci niniejszega rozdrjatu).
464 Cz@t V Zaawansowane techniki programowania
Procedura CloseButton-Click
Wykonywana jest w,momencie klikniqcia prrycisku Zamknij. Jej dzialanie polega na
zapisaniu bieiqcych ustawieh konholek w rejestne Windows. a nastqpnie zarnknieciu
formularza UserForm.
Procedura HelpButton-Click
Wykonywana jest w momencie klikni~ciaprzycisku Pomoc. Jej dziatanie polega na wy-
Swietleniu pliku pomocy.
If Rng.Count -
bjedyncza k&rka z forrm1.q
-
1 And Rng.HasFomla Ren
Set CreateWorkRange Nothing
E x i t Functlon
End If
- -
Pojedyncza tan6rrta l u b pojedynua scalona kdrka
I f Rng-Count 1 Or Rng.MeqeCells T r w Then
Rozdzial 16. + Twotzenie narzedzl dl0 Excela w jqzyku VBA 465
If TedOnly Then
-
I f Not IsNumericlRng(l).Valuel Then
Set CreateWorkRange Rng
Exit Function
Else
-
Set CreateUorkRange Nothing
E x i t Function
End I f
Else
I f Not Isbpty(Rng(1)) Then
-
Set CreateWorkRange Rng
E x i t Function
End If
End If
End I f
- -
On Error Resme Next
Set Rng Intersect(Rng. Rng.Parent .UsedRange)
-
If T e x t h l y True Then
Set CreateMrkRange Rng.SgecialCellstxlConstants. x!TextValues)
I f Err o 0 Then
-
Set CreateMrkRange Nothing
On Error GoTo 0
E x i t Function
End I f
Else
-
-
Set CreateNorkRange Rng. Specialcell s
txlConstants, xl7extValues + xl~umberi)
[ f Err 0 Then
-
Set CreateUorkilancje Mothlng
On Error GoTo O
Exit Furction
End I f
End I f
End Functla,
wySwietll6. W C ~ S ~ ~klawlsr
JW
-
ustawienia w oknie dialogowym Pnedrodzenie do specjalnle Excela. Motna je
F5. a nastqpnie klikalqc pr~jciskSpajalnfe w oknie
dialogowym P ~ e ~ h a d Z e n do.
i8
Rysunek 16.6.
Za wmoca
e&ora rejestru
molna sprawdziE
ustawienia i.d-.a
.. r c p
r a-ta-.. arcs
zapisane i ..?WPlvdn
,-
w rejestffe ..,,,;r.
,;y-..
,,_,
PIGS
9 6 9
I*--. ucp
I31.d~- ercp
Pnypomnijmy sobie dwie mienne publiczne radeklarowane w module VBA Modul el,
kt6rych zadaniem byta obsluga operacji Cojnij:
Pub1 i c UndoRange As Range
Public UserSelectlon As Range
Rozdzial 16. + Tworzenie narzgdzi d l a Excela w jqzyku VBA 467
- -
Set UserSelection Selection
Set UndoRange WorkRange
l3islkorkbook .Sheets(l).?IsslRange.C:ear
Obiekt WorkRange, jak pamietamy z poprzedniego punktu, jest typu Range i skhda sie
z komdrek zamaczonego zakrew, ktbre nie sq puste i nie zawierajq fonnul. Trzecia instruk-
cja z b l o b zaprezentowanego powyitej usuwa z arkusza dane zapisane w nim poprzednio.
W petli przetwarzane sz\ poszczeg6lne obszary zakresu NorkRange, ktbre nastepnie sa.
zapisywanc jako dane w arkuszu. JeZeEi zakres WcrkRange sktada sie z c i ~ l e g ozakresu
kombrek, arkusz b d z i e zawieraf tylko jeden obszar.
Po jej wykonaniu, w menu Edycja Excela pojawi sip pozycje: Cojnij zrnianq wiel.koici
liter, kteli w o w n i k wybierze to polecenie, zostanie wykonana procedura pokazana
ponikj:
P r i v a t e Sub UndoTextTools(
' Cofniecie ostatiio nykonanej oceracjl
D i m a As Range
468 CzeJt V Zoawonsowone techniki programowanio
-
For Each a I n UndoRange.Areas
a .Formula Tht sWcrkbook.Sheets(1) .Rangeta .Address1 Formula
Next a
-
Application.~creen~pdating True
On Error GaTo 0
E x i t Sub
ErrHandler:
-
Appl lcation.ScreenUcdatlng True
MsgBax "Nie mtna cofnqC operacji". vbInformation. APPNAHE
On Error GoTo 0
End Sub
Ryrunek 16.7.
Paklet Power Utllity
Pak. ktdreeo t w d m
jest autor nin~ejszei
ksi@ki, zawiera wiefe
przydatnych nanedzl
--
470 Cz&C V + Zoowansowone techniki programwanla i
Oprbcz pakietu Power Uriliw Pak, z internetu m o a a pobraf inne pakiety. Poszukiwania
dodatkowych narqdzi motna rozpacqk od mojej witryny WWW. Zapraszam na strone
Spreachheet pod adresem h t t p : / k . j - w a l k c o m / s s S
I
Rozdziat 17.
Tabele przestawne
Wedlug niektorych utytkownikdw Excela tabele przestawne sq jego najbardziej inno-
wacyjnq i oferujqcq najwipksze motliwoici wtaSciwoScig Jest to takie unikatowa cecha
Excela (taden inny arkusz kalkulacyjny niq nie dysponuje). Po raz pierwszy pojawita
sie w Excelu 5.
<*,
a&'*
Tabele pnestawne Excela znacznie ulepszono w Excelu 2000. Wykorzystano tam
ydajnlejsze metody buforowania danych, a takie wprowadzono obstuge wykresirw
powi~zanychz tabelami ~ e s t a w n p lZ. tego powodu pewna czeSC rnateriafu
zawartego w niniejsrym rozdziale nie dotyczy Excela 97 lub wersji wczeSniejsrych.
Rysunek 17.1.
Z tej prostej bazy
danych Iatwo motna
utwofiy2 tabele
pnestawna
Rysunek 17.2.
Tabela pnestawna
utwonona
na podstawie danych
zamieszczonych
na rysonku 17.1
i End With
--
PivotFlelds("RepHand1")
.Orientation xlRouField
.Position 1
End With
--
PlvotFlelds( "Niesiac")
.Orientation xlColu~mField
.Position 1
End Hi t h
ActiveSheet.PlvotTables("Tabela przestawnal"). -
AddDataField ActiwSheet.PivotTables~"Tabelaprzestannal').
P-uotFields('SprzedatW). 'Sum z SprzedaL". xlSun
-
End Sub
-
Set PTCache Act1wWorkbook .Pi votcaches .Add
(SourceType:-xlDatabase.
-
SourceDa~ta:-Range('A1') .c;rrent~eglon .Address)
-
Set PT PTCache.CreatePivotTable
(Tab1eDestination:-"". -
-
Tab1eName:-"Tabela przestawnal')
Wlth PT
--
.PivotFields("Regton") .Orlentation xlPageField
--
. P t v o t F i e l d ~ ( " M l e s l ~ c.Orientation
"I
.PivotFields("RepHandl "I .Orientation xlRowField
.PivotFields("SprzedaL") .Orientation xlDataField
xlColumnF1eld
End U I t h
End Sub
Ryrunek 17.3.
Dane z tego
skorosIytu bedq
zestawione w tabeli
pnestawnej
Ppplication.5creenUpdat~q - False
476 Cze9t V + Zaawanswane technlki ~roararnowania
Rysunek 17.4.
Tabela przestawna
utwonona
na podstawie danych
z lysunku 17.3
.
-
Utworzenle tabeli p r z e s t m e j na podstawle bufora
Set PT PTtache.CreatePivotTable( -
Table0estination:-Sheets( 'ArkuszTabel iprzestawnej') .Range('Alm) .-
Tab1eName:-"TabelaPrzestarnzBudietu")
With PT
Dodarrie pbl
.PimtFields('WYOZIAC").Orientation --
xlRowField
--
.PivotFields('MIESIAC").Orientation xlCoLmnField
.PivotFields("ODOZIAC"),Orientation xlPageFleld
.PivotFields("8UDtET").Orlentation x1DataFteld
.PlvotFlelds("PJEUYWISTE WDATK!').Orientatron xlDataField -
Dodanie pola slutacego do obliczania odchylenia
.CalculatedFields.Afid "Wchylenie" , "-BUO2ET-RZEUWISTE WYDATKI'
.PiwtField~('Wchylenie') .Orientation xlDataField -
Rozdziat 17. + Tabele przestawne 477
.PlvatFields("MIESIAC'l.Pi~tItems('Kw4"l.Position
--
PivctFields('MIESI4C'l .PivotItems('Kw2"). Position 8
.PivatFields("MIESIAC'l.PivotItems('Kw3").Posttion 12
16
Modyftkacja podplsh
-
.PivotFields("Sm z BUOZET") .Caption "EudFet (21 )"
-
-
.PivotFields("Suma z RZECZYWISTE WYDATKI') .Caption "Rzeczywiste wydatki(z1)"
.PivotFields("Suma z Odchylenie").Caption "Odchylenie (21)-
End With
Appl ication.5creenUpdating
End Sub
- Tm
Jak dziala zlozona tabela przestawna?
Procedura CreatePivotTable z listingu 172 najpiew usuwa arkusz ArkuszTabel1Prze-
staknej, jeali taki w c d n i e j istnid. Nasttpnie tworzy obiekt PivotCache, wstawia nowy
arkusz o nazwie ArkuszTabel iprzestawnej i w koricu tworzy tabel? przestawna Do tabeli
pnestawnej dodawane sq nastqpujqce pola:
Wydzi a 1 -pole wiersza;
Mlesiqc -pole kolumny;
Oddzia? -pole strony;
Budtet -pole danych;
r Rzeczywiste wydatki -poledanych.
Nastqpnie w y k o ~ metod~
o Add zbim Cal culatedFields w celu u m n i a oblicul-
nego pola Odchylenie, IUbrego wart& jest wyliczana poprzcz odjr;cie m c i faktycmie
wydanej kwoty (pole RZECZYWISTE WYOATKI) od kwoty bu&m (pole BUDLET). Crtery
oblicmne pola sfuQ do wylicmia kwartalnych podsumowafi. Domyilnie oblictane pola
q dodawane po prawej shonie tabeli przestawncj, a zatem poirzebny jest dodatkowy
kod, aby umieScic je obok miesiqcy, ktorych dotycq (np. pole Kwl jest umieszczone za
polem Mar). Na koniec ksd modyfikuje podpisy wyiwietlane w tabeli pnestawnej (np.
nanva Suma z BUOtUjest zastqpowana nanvqBudLet (21)).
Kod z listingu 17.3 tworzy tabela przestawna Zalotono, te plik bazy danych budet,
mdb jest zapisany w tym samym katalogu, co arkusz
LSstlng 17.3. Generowanie bbell pnest8wnej na podstawie danych z zewnqtnnel bazy danych
Sub CreatePivotTableFrwiJBt 1
D i m PTCache As Pivotcache
D i m PT As PivotTable
D i m OBFile As String
Dim Constring As S t r i n g
D i m OueryStrtng As String
-
Utworzenie bufora t a b e l i przestawnej
Set PTCache ActiveWorltbook .Pivotcaches .Add
(Source1ype:-xl External 1
-
Constring -
tancuth polaczenia
" O D B C : M Access Database:DBP' 6 DBFil e
* Zapytanie
CueryString - "SELECT * mM f!U02ETm
With PTCache
--
.tonnectlon Constring
.CmandText OueryString
End UI t h
DPdanie arkusra
'&rksheets.Add
Activesheet .Hame - 'ArkPrzest'
-
Utwonenie t a b e l l przestawnej
Set PT PTCache.CreatePivotTab!e( -
Rozdziot 17. Tobele przestawne 479
W i t h PT
W a n l e pbl
.PivotFtelds<"WDZlAt') Or:enr.ation -- xlRowileld
.PivotFleldst'OCOZIAL') Or'entation
.PivotFieldsl'BUD2ET") .Orientzt'on --
.PivotFields ("MIESIAC') .I)rientstion xl CoLumnField
xlPageFieId
xlOataFielc
.PivotFields( 'RZECZYWISTE k'iZLTK1") .Orientation * xlDateF: ela
End With
End Sub
\V tym przykladzie tahcuch poIi.czenia o m l a , kr6dto danych ODBC, ktorym jest plik
Accessa o nanvie buber.mdb. Laiicuch zapytania okreila w tyrn przypadku calq tabel?
BUDZET, lnformacje te q przekazywane do obiektu Pi votCache poprzez ustawienie d d c i -
woki Connection oraz ComnandTex;. Po zapisaniu danych w buforze tabeli prrestawnej
nastppuje utwomnie tabeli za pomocq metody CreatePivotTable.
SQLjest standardavym jezykiern sluz&yrn do twnenia zapytati do bazy danych.
@
$
b
* W i w j informacJl mozna uzyskd w pomocy online. Warto r6wnlei zakuplC ksiqlke
poswi~onqtern" jezykowi, co pozwoli poznaC go dokladniej.
Ustlng 17.4. Tworzenle wielu tabel przestamjch na podstawle danych re zfozonej zewnetrznej b,ary
Sub MakePivotTablesO
'
Ta procedura twarzy 28 tabel prrestc*nyco
D l m PTCache As PlvatCache
Dim PT As PlvotTable
480 CzgfC V Zaawansowane techniki programowania
Rysunek 17.5.
m i k i anklety
bedq podsumowane
w kilku tabelach
pnestawnych
Application.ScreenUpdat1ng - False
'
--
Dodante arkusza " P o d s m a n i e "
Set SumarySheet Worksheets .Add
Activesheet .Name " P c d r m a n i e "
-
Utworzenie bufora catel l przestawnej
Set PTCache Actl veWorkbook .PivotCaches.Add( -
SourceType:-xloatabase.
Source0ata:-Sheets( '~ane%nkiety") .Range( "Al') .-
CurrentRegim .Address)
Row --1
For 1 1 To 14
-
ItemName Sheets("DaneDnkiety').Cells(l. l + 2)
-
Utwrzenie tdbeli p r z e s t m e j
Set PT PTCache.CreatePivotTab1e -
(Tab1eDestination:-S~mrySheet.Cel IslRou. 6). -
-
Tab1eName: -I tmName)
R a r Row +ll
Dodanle p61
- --
With PT.PlvotFields(ItemName)
.Orlentation xlOataField
.Name 'Liczba odpowledzl "
.Function xlr&nt
End U i t h
Row-1
- -
For i 1 70 14
ItenNane %eetsl'Dane~kiety").Cells(l, I + 2)
-
Utwrzenle t a b e l i przestawnej
5et P i PlCache.CreatePivotTable -
(Table0estinattan:-SurmarySheet.Cells(Row.1). -
-
Tab1eNam:-ItemName 8 "2')
Row Row + 11
- --
With F T . M v o t F i e l d s ( I t ~ m )
.Orlentation x1DataField
.Name ' P r x m t "
F~mction x l h n t
482 Czg5t V + Zoowansowone techniki programowanio
-
.Calm1 a t l o n xlPercent0fColm
End Hi t h
PT.AddFtelds RowFie1ds:-Array(1twnName. "Dane"
Rysunek 17.7.
U2ytkownIk mote
skorzystd
z formantdw w celu
modyfikowanla tabel
przestawnych
13-
+?..la."/ ..
1.1- I
-
rlE
Rozdziol 17. + Tobele przestowne 483
Tabela prrestawna zawiera cztery dodatkowe pola obliczane (Kwl, Kw2, Kw3 i Kw4). kt6re
s h a d 0 obliczania podsumowan kwartalnych. Kod wykonywany w przypadku zamacze-
nia pierwszej wartoSci pnebcznika (Tyiko rniesiqce) pokazuje listing 17.5. Procedura
jest prosta, przypomina procedury obslugi zdarzen dla innych pneiqcznikow.
Pdoienie wykresu
W Excciu wykrcsy rnotna umieszczat w jednym z dw6ch miejsc w skoroszycie:
juko wbudowuny obi& w orkusm -arkusz m o e zawierad w6wczas dowolnq
liczbc wbudowanych wykresdw;
w osobnym m h u -arkusz wykresu zawiera tylko jeden wykks.
Jak opisano w dalszej c g k i rozdziatu. w arkuszu wykresu takte motna osadzaC
wykresy wbudowaw. Wiwej infompojl majduje s l punk& ~ .Zaplsywanie wielu
wykresb w arkuszu-wykresle'
Wykres ak!pny to wykm, ktbry zostal wybrany. Kiedy wytkownik kliknie wbudowa-
ny w y h s lub arkusz w y h s u , nasteuje uaktymicnic obicktu Chart. W jezyku VBA
wIafciwoSC Actlvomart m c a uaktywniony obiekt Chart Cjdeli jakiS ismieje). Moma
486 Czg5t V + Zoawansowane techniki progromowania
napisat kod wykonujqcy d z i a h i a z tym obiektem Chart, podobnie jak moma napisat
kod wykonujqcy dzialania z obiektem Workbook zwracanym p o p m z wLSciwoSC Ac-
1
t l veworkbook. Oto przykhd: jeteli uaktywniono wykres, ponits;za instrukcja spowoduje
wyfwietlenie wta4ciwobci Name obiektu Chart:
j
!
MsgBox Activechart. Name
I
*- Jak slq pmkonamy w dalsze] czgSci tego rozdziatu, aby wykonywat dzlatania
< ! A z wykresern za pornocq kodu VBA. nle trzeba go uaktywnid.
Chart
ChartTi t l e
W kodzie VBA tmba oczywikie iciSle pnestrzegai madelu obiektowego. Aby na pcy-
ktad ustawiC tytuk wykresu na Spnedatfirny YTD,naIe2y zapisaC nast~pujqcqinstrukcje
VBA:
W tcj instrukcji &tono, te aktywny skoroszyt jest obiektem typu Workbook. Instmkcja
zadziala dla pierwszego elementu w kolekcji Chartobjects w arkuszu o nazwie Arkuszl.
WlaSciwoSC Chart m c a odpowiedni obiekt Chart, natomiast wWciwoSC ChartTitle
m c a obiekt ChartTi tle. Na koficu urjshjejemy dostep do wMciw&i Text.
W pnypadku arkusza wykresu hierarchia obiekt6w nieco s i r6tni.
~ poniewat nie zawiera
obiekt6w Worksheet i ChartDbJect. Ponitej pokazano hierarchic obiektbw dla obielrm
C3artTi t l e w przypadku arkusza-wykresu:
Appl icati on
Workbook
Chart
ChartTi t l e
W kodzie VBA, w celu miany tytuh wykresu na Spriedatfirmy YTD naletajobp za-
stmowat ponitszq instrukcjp:
Sheets("Wytresl'1 .thartTitle.Text - "Sprzedai f i rrny YTD"
M6wiqc inaczej, arkusz wykresu jest po prostu obiektem Chart, ktbry nie jest zawarty
w obiekcie ChartObject. Dla wykresu wbudowanego jego obiektem nadrzcdnyrn jest
-
ChartObject, a dla arkusza wykresu obiekt WOrkb00~.
Rejestrator makr Excela zawsze uaktywnia whSciwoSC Acti vdhart w celu zwrkenia'
obiektu Chart. W Excelu nie m b a ~ c z a obiektu
c (Lub uaktywniat wykresu), aby mi&
pracowat z nim w jczyku VBA. Jak wspomnialem, rejestrator makr genemje mn6stu.o
nadmiarowego kodu. Z tego powodu, jesli dbamy o wydajnoit, nie powinniSmy wyko-
rzystywdf zarejemwanych makr bez wprowadzeqia poprawek. Szczeg6lnie dotycq to
rnakr wykonujqcych dziahnia z w y h a r n i .
Rysunek 18.1.
Ten wykres
utwonono
przy wtqczonym
rejestratone makr
-
k t i v e c h a r t .Axes( xlcategoryl .Select
Selection.Tick~abels.Orientation xlHorizonta1
blection.Font.Bold True
Selection.AutoScaleFont
- -
4ctiveChart.ChartTitle.Select
True
--
with Selec:ton.Fant
.Name 'Arlal"
-- -
.Size 12
.Stnkethrough False
.Superscript False
- --
.Subscript False
.Out? ineFont False
.Shadow False
--
Under l i n e xlUnderlineStyleNone
.ColorIndex xlAutomatic
.Background xlAutomatic
End Ui t h
5slection.Height
--
,ktiveChart.PlotArea .Select
5election.Top 18
152
kt iveChart .ChartArea .Select
k t i v e v l a r t .Axes(xlUaluel .Select
- -
Nth ActiveChart.Axes(xlValue)
.BinirmmScaleIsAuto Tme
.Haxim.unSca?e D.5
-
-
.MinorUnitIsAuto True
- -
.MajorUnitIsAuto True
.Crosses xlAutomatic
-
.ReversePlotOrder False
.ScaleType xlLinear
End With
End Sub
-
Activechart . L a a t I o n
Where : - x l L a a t ionAsDb,ject. Name :-'Arkus~l"
Wlth Activechart
--
.SetSourceOata Rangef"A1 :F2"
.HasTitle True
-
.ChartType xlColunnClusrered
.HasLegend False
.kplyDataLabels Type: -xlDaralabelsShowValue
--
.Axes(xlCategory) .TickLtbels.Orientation
.C?artTitle. Font .Bold True
- xlHonzonta1
--
.CiartTitle.Font.Size
.PlotArea.Top 18
12
. PlotArea-Height 162
.Axes~xlYalue).Maxlrmdcale 0.6
.Deselect
-
End Ui t h
Ppplication.ScreenUpdatlng
End Sub
- True
<&% Za pomocq metody AdU kolekcjl Charts zawsre utwonymy arkusz wykresu. W kodzie
zaprezentowanyrn powytej wykres zostd przenlesiony do arkusza za pomocq metody
Location.
Aby dokonaC rnodyfikacji za pomocq kodu VBA, wykresu nie meba uaktywniat. Efekt
wykonania dwdch procedur zarnieszczonych ponitej jest dokladnie taki sam: rnodyfikacja
wbudowanego wykresu o nazwie Wykresl na wykres warstwowy. Pierwsza procedura
uaktywnia wykres przed wykonaniem dziahh, druga tego nie robi.
Sub Modifychartlo
ActiveChart.Type -
ActiveSheet .ChartObjects('Nykresl').
x l Area
Pc',iveChart .Deselect
Mivate
End Sub
Sub Wl fyChart2()
Activesheet. ChartObjects( "Wykresl") .Chart.Typ
End Sub
- x l Area
wykresu w oknie
Ponizsy kod VBA wySwietla okno piwwszego obiekhl ChartCbject. w aktywnyrn arkuszu:
Activechart .ShMindow -
ActiveSheet.ChartObjects~1).Pctivzte
True
Ta instrukcja neczywiScie deaktywuje wykres, ale nie jest do konca jasne, dlaczego tak
sic dzieje. Piszqe makra, kt6re wykonujq dziahnia z wykresami, do deaktywacji wykresu
lepiej wykorzystaC rnetodp Deselect:
Activechart .Deselect
492 CzeSC V Zaawansowane techniki prograrnowonia
Pokame dwie instrukcje r6tniq siq nieco dzialaniem. JeSli wbudowany wykres jest ak-
tywny, wykonanie metody Deselect nie spowoduje zaznaczenia Zadnej kom6rki w arkusm.
Ustawienie wMciwoSci V i s i b l e obiektu Acti veW1 ndcw na wart056 Fa1se spowoduje po-
nowne zaznaczenie poprzednio zamaczonego zakresu.
Powytsze wyratenie pnyjmie wartoe True, jeSli arkusz wykresu W i e aktywny, ale nie
przyjmie wartogci Ttue w pmypdku zamaczenia wykresu wbudowanego. W takiej ytuacji
zamaczony W z i e obiekt wewnqtn obiektu Chart. Na przyklad mote to byd obiekt Series.
ChartTi t l e , Legend, PlotArea itd.
ChartIsSe1ec:ed
End Function
-
Private Function ChartIsSelectedO As Boolean
Not ktiveChart Is Nothing
Ta ftmkcja sprawdza wartoSC obiektu Activechart. Jeteli wynosi ona Nothing, wykres
jest nieaktywny.
Ppplication.0isplayAlerts - False
Act~veWorkbwk.Charts .Delete
Application.DisplayA1erts - True
-
With Activechart
.Type xlArea
.ChartArea.Font.Name - -
"Arial"
.QlartArea.Font.Size 9 -
.ChartArea.Font.FontStyle "Regular'
.PlotArea. 1nterior.ColorIndex - -
xlNone
.Axes(xlValue).TickLabels.Font.Bold
- - -Tme
.Axes(xlCategory) .TickLabels .Font .Bold True
If .HasLegend True Then .Legend .Position x l s o t t m
End With
End Sub
Ponitej majduje sip inna wmja pmcedury ChartMs. W tym pnypadku dziala ona dla
konkretnego wykresu: sktadowej obicktu Chartobject o namie Wykresl,umieszcmnej
w arkuszu Arkuszl. Wykres nic jest uaktywniany.
Sub Chartnods20
-
With Sheets("Arkusz1') .(hart0bjects( Yykresl') .Chart
.Type xl Area
.Charthrea.Font.Name - -
"Arial"
.ChartArea.Font.STze - -
.ChartArea .Font.FontStyle
9
'Regular'
--
.Axes(xlValue) .TlckLabels. Font.5old True
I f .HasLwnd
End With
-
.Axes(xlCategory) .TlckLabels.Fmt.Bold
True Then .Legend.Posltion-
True
xlbttm
End Sub
-
For Each chtobj I n ActiveSheet.ChartDbjects
chtobj.Chart .U~artType xlArea
Next chtobj
End Sub
Ponitsze makro wykonuje to samo dzialanie, co poprzednie, ale dziala dla wszystkich
arkuszy wykres6w w aktywnym skoroszycie:
Sub ChangeChartTypeZ(
Dim cht as Chart
cht.ChartType
Next cht
-
For Each cht I n ktfveUorkbook.Chart5
x l Area
End Sub
- -
M i t h chtobj .Chart .Legend.Font
.Name " A r i a l "
-
.Fontstyle
.Size 12
End With
"Bold'
.Next chtobj
End Sub
<
Wykreay przestawne
W Excelu 2000 wprowadmno nowq WaSclwoSt: wykresy przestawne. Dziqki niej m o h a t w o w
dynarniczne wykresy powlqzane z tabelami pnestawnymi. Wykres przestawny wyfwietla bieiqcg
zawartofc?tabell pnestawnej w formle graficznej. lstnieje motliwo56 utworzenla albo sarnej tabeli
przestawnej, albo W r e s u przestawnego, kt6ry dodatkowo zawiera powiqzanq z nirn tabel? prze-
stawng. Aby utwonyd wykres przestawny na podstawie tabeli, nalej jq uakt)umie i klikng przycisk
Kreator wykresdw. Wykres zostanie utworzony w nowyrn arkuszu. Domyllnie nowy wykres prze-
stawny zawsze jest tworzony w osobnym arkuszu (rysunek poniiej). Moina jednak przeksztatciC
go na wykres wbudowany za pornocq polecenia ~fes/Lokalizacja.
Microsoft m o ~ k o w amodel
l cbiektovry w taki spos6b, aby umotliwiC obsluge tej nowej wtaici-
wosci Excela za pornocq kodu VBA. Dla ykresdw pzestawnych wpmwadzono obiekt PivotLayout
wewnsrz obiektu Chzrt. Najlepuym sposobem zapomanla st9 z tym oblektern jest zarejestrowanie
dziatari rnodyfikowanla wykresu przestawnego, a nastppnie przeanalizawanie wygenemwanego kodu.
Aby uzyskat wivej inforrnacji na ternat obiektdw, wtaSciwoSci i rnetod, rnotna rhvniel skotzystac?
z pornocy online.
Sub SizeAnd41ignCharts( 1
Dim W As Long. H As Long
D l m TopPosition As Long. LeftPosition As Long
Dim ChtObj As ChartObject
I f k t i v e C h a r t 1s Nothlng Then E x i t Sub
'
--
Pabranie rozmiarh aktywnego wykresu
W ActivdXart.Parent.kidth
TopPosition 1
LeftPosition 1
--
H Activechart .Pzrent .Height
Chtc4j.Wldth --
For Each NCbj In ktlveSheet.thartObjec:s
W
ChtCbj.Height
-- H
ChtObj .TOP TopPosi t i o n
ChtOhj.Left
- LeftPosition
TopPosition TopPosition
Next ChtCbj
ChtObj.Feight
End Sub
496 CzeSk V + Zaawansowane techniki oroaramowania
,e
G 3
;.n;m;m
Ten m i a d jest dostgpny na plycie CDROM doiqczonej do ksiqfki.
W tym przypadku motna nadat nazwy dwbm zakresom (np. Kategorie i Dane), a na-
stqpnie zmodyfikowac fonnutq SERIE w taki spodb, aby zarniast odwoian do z a h s d w
wykorzystywano ich nazwy. Formula po edycji b&ie miala nastppujqcqpostaC:
-SERIE( .Arkuszl! Kategorle.Arkuszl!Dane.l)
Po wykonaniu tej instrukcji wykres uaktualni sip, uwzglpdniajqc nowq definicjp zakresu
3ane.
Za pomocq metody Resize obiektu motna zmodyfikowat mmlar zakresu
ldsntyflkoranego przez n a y . Na pnyklad ponitszy kod r ~ o d u j rozszenenie
a
zakresu Dane o dodatkowy wiersz:
M it h
End
Range("DaneW)
.Resize(.Rows.Coont
Yith
+ 1. l).Name - "Dane"
F m u t a SERIE
Dane wykorzystane w kaMej d l wykresu okreSla formula SERIE. WySwletla slg ona w pasku
formuly po zamaczeniu serii danydr na wykresie. Nie jest to form& w petnym tego stowa maczeniu:
mdwiqc inaczej, nie motna utyC jej w komdrce, a takte w formule SERIE nie motna wykorzystat
funkcjl arkusza. M o h a jednak rnodyfikowaejej argumenty.
Formula SERIE ma nastgpu)qcq sktadnig:
-SERIE(nazwa-seri i , etykiety-kategorif , wartoici. kolejnoft. romiary)
Argumenty, kt6re motna zastosowaf w formule SERIE, oplsano ponltej.
B nazwa serl i (opcjonalny)- W a n i e do kom6rki zawlera&e] nazwg s d i do wykorzystania
w leg&ndzle. Jeiell wykres sklada sle tylko zjednej serii danych, argument ten jest
wykorzystywany jako tytut. Moha go t a w pod& jako tekst ujety w cudzysMw. Jetell argument
zostanie pominiqty, Excel utworzy domyllnq name serli (np. Serla 1).
-
etykiety-kategori i (opcjonalny) odwotanie do zakresu zawlerajpcego etyklety dla osi
kategorli. Jetell argument zostanle.pominlety, Excel zastosuje koiejne liczby catkowite
poczqwszy od 1. Dla wykresdw XY ten argument deflnluje etyklety dla osi X. Poprawne jest
takie odwotanie do nieciqgtego zakresu, W takim przypadku adresy zakresdw powinny byC
oddzielone przecinkami i ujete w nawiasy. Agurnent moha tam zdeflniowat w postaci tablicy
wartoki oddzielonych pminkami (lub tekst6w w cudzysbwach) ujetych w nawiasy klarnrowe.
B wartoici (wymagany) - odwotanie do zakresu zawlerajzpego wartohi dla serii. Dla wykresdw
XI ten argument deflniuje wartoSci dla osi Y. Poprawne jest takie odwdanie do nieciqgtego
zakresu. W takim pnypadku adresy zakres6w powlnny by6 oddzlelone pnecinkami i ujete
w nawiasy. Argument motna takze zdefinlowd w pastaci tabllcy wartohi oddzielonych
przeclnkaml ujetych w nawiasy klarnrowe.
-
kolejno<C (wymagany) liczba catkowita okreflajqca kolejnog wykreflania serii.
Ten argument ma znaczenie tylko wtedy. gdy wykres sktada slg z wlwej nlt jedne] serii.
Zastosowanle odwotanla do komdrki nie jest dozwolone.
-
roaniary (tylko dla wykresdw bqbelkowych) odwotanie do zaknsu zawlerajqcego wartoSci
mzmlardw bqbelk6w w wykresech bqbelkowych. P o p r a m jest takfe odmhnie do n4eciqega
zakresu. W takim przypadku adresy zakresh powlnny by2 oddzielone przeclnkami I ujete
w nawiasy. Argument mozna tak2e zdefiniowat w postaci tabllcy wartohi ujetych w nawiasy
klarnrave.
Ochwtania do zakresdw w formule SERIE zawsze sq bemq$@ne I zawsze zawierajq na* arkusza.
Oto przyktad:
-SERIE(Arkusrl!SBSl. .Arkuszl!1812:SBS7.1)
Odwoknie do zakresu mote okreeSlaC nieciqgty obuar. W takim przypadku poszczeg6lne zakresy
skkdowe naleiy oddzielid przecinkami i ujqd argument w nawlasy. W ponitszym pnyktadrie form*
SERIE wartogcl naletq do zakresu 82:83 waz 6537:
-SERIE(. .IArkuszl!SBS2:IBS3.A~usz1!SBS5:S817).1)
JeSE zamiast adres6w rakresdw zoJtanq we Ich namy, Excel m k u j e odwotanla, wprowadzajrtc
w formule SERIE n a w skoroszytu. Oto m t a d :
-SERIE(A~uszl!SBSX. .budtet.xlslWje0ane. 11
II
Zastosowanie jezyka VBA
w celu okreslenia danych wykorrystywanych na wykresie
Prrykhdy z tego punk opiwjq tcchrulci jpzyka VBA umotliwiajp rnodyfikacjjedanych
wykresu.
498 Czefk V + Zaawonsowane techniki prograrnowania
Rysunek 18.4.
Ten rvykres zawsze
wy3wietla dane
na podstawie
wiersza
odpowiadajqcego
akiywnej komdrce
- -
1f Sheets("~rkuszl').Checkbxl Then
Set TheChartObj ActtveSheet.01artObjects(l)
-
Set TheC3art TheChartObj .Chart
UserRow Activecell .Rw
-
I f UserRow c 3 Or IsEmpty(Cells(UserR0~~1 1 Then
TheChartObJ.Vlslble False
---
Else
Set CatTitles Range('A2:FZ")
S e t SrcRange Range!Cel ls(UserRow. 1). Cells(UserRow. 6))
Set SaurceData Union(CatTtt1es. SrcRange)
Thechart. SetSourceData -
Source:-SourceData . PlotBy :-xlRws
-
TheChartObj . V i s i b l e True
End If
End If
End Sub
W innym przypadku kod utworzy obiekt Range (CatTitle) zawierajqcy tytuty kategorii
oraz inny obiekt Range QrcRange) zawierajqcy dane wiersza. Te dwa obiekty Range sa.
kczone za pomoq funkcji VBA Union i przypisywane do obiektu Range o nazwie Sour -
ceData. Na koniec zakres SoutceOata jest przypisywany do wykresu za pornocq metody
SetSourceData obiektu Chart.
Rysunek 18.5.
k$imnie pozjcji
z p ~ I akombi
modflkuje dane
frddtowe wykresu
-
D i m ListIndex A5 I n t e g ~ r
L i stlndex ActrveChart .DropDoms(l). Value
Call UpdateChart(List11dex)
End Sub
Set M a r t
Set Datasheet
--
Sheets("Wykres1')
Sheets:"Arkuszl")
--
i r i t h Datasheet
Set CatTitles .Rdnge("AZ:FZ")
Set SrcRange .Rarge( .Cell s( Item + 2. 1). -
.Cells(l:em + 2. 5))
End With
-
Set SourceData Union:CacTitles. SrcRange)
With TheChart
.SetSourceOata Swrce:-SourceData. PlotBy :-xlRows
.ChartTitle.Left
.Deselect
-
TheChart .ChartArea .Left
End U i t h
End Sub
W fonnule SERIE nie m z e pojawiajq sip wszydcje argumenty, poza tym jcdne wystppujq
w postaci tablic, a ime q adresami nicciqglych zakresdw. &by b y b jeszcze trudniej,
dla wykredw bqbclkowych istnieje dodatkowy argument (np, w onatniej forrnule SERIE
na popnedniej lilcie). Pr6ba przeanalizowania argumentdw z pewnogciq nic jest tty-
wialnym zadaniem pmgramistycznym.
- --
Dim x AS V a n d n t
Set Ser ActlveChart.SeriesCollection(~)
x VALUES-FROH-SERIES(Ser1
I f x(1) 'Range" Then
HsgBox Range(x(2)) .Address
End If
End Sub
Na rysunku 18.6 zaprezentowano inny pnykhd. Wykres zawiera trzy serie danych.
Przyciski w arkuszu powodujq wykonywanie makr, ktdre rozszerzajq i nwptajq po-
uczegdlne Eaknsy danych.
Rytunek 18.6.
W tym skoroszycie
pokazano,
w jaki sposbb
rozszerryE
lub ScieSnit
serie danych
za pomocq makr
napisanych
w lezyku VB.4
Rozdzictl 18. + Wy kresy 503
- -
For Each s I n ActiveSheet.ChartObjectstl) Chart.Seriestallect;on
Result XVALUES-FRCN-SERIES( 5 )
-
i f Result(l! "Range" The?
Set DRaqe RangetResult(2:
I f DRange.Ras.C~unt ,1 Then
--
Set DRange 5Range. i e s l ze(CRange. Rows .Count -' 1:
s .XVa 1 ues DRange
End If
- -
End I f
Result VALUES-%OH-SER1ES:s)
-
I f Result(1) "Range" Then
Set mange RangelResu; t ( 2 3 )
--
If 0 R a n g e . M ~.Count > 1 Then
Set DRang DRange. Res- ze(9Range .Rws . r a n t - I1
s .Values DRange
End I f
Ene If
Next s
End Sub
Proccdura ExpandAl 1 Series jest bardzo podobna. Jej wykonanie powoduje rozszerzenie
wszystkich zakredw o jednq komorkq.
Wykorzystanie VBA
do wyiwietlania dowolnych etykiet danych na wykresie
U@tkownicy Excela cqsto narzekajq na male mo~iwofcimodyfikacji etykiet na wykre-
sach. Dla przykladu przeanalizujmy wykres XY pokazany na rysunku 18.7. Prydataby
sip motliwolt wydwiettenia n a m y dla ka2dego punktu na wykresie. Na prbtno jednak
by szukat polecenia Excela. za pomocq ktdrego motna by wykonak tq operacjq autorna-
tycznie (wskazdwka: takie potecenie nie istnieje). Etykictami motna o m a c q k tylko
wartoici ... chyba t e zdecydujemy sip na Rcmq edycjp katdej etykiety danych, aby za-
stwit jq dowolnym tekstem.
Listing 182. Pobieranie etyMet prnktdw danycb na podstaw'e nazw !J~J arkusza
Sob DataLabel sFronRavqe( I
D i m DLRarge Rs Range
Dim Cht As Char.
Dim i As Integer
504 CzeSC V + Zaawansowane techniki programowania
Rysunek 18.7.
W k r e s XY
be.? etykiet danych
'
-
Otre9lenie wykresu
Set Cht Activesheet .ChartWjects(l) .Chart
-
G? Error Resume Next
Set DLRange A P P ~tcatton. I n p u t b x -
(prmpe:-"Zakres zarlerajqcy etykiety danych?". Type:-8)
I f DLRange Is Nothlnc] P e n E x i t Sub
On Error Golo O
Dodanle e t y k i e t danyc*
Cht .SeriesCol l e c t l m ! 11 .@plyCata LaDel s -
Type:-xlDataLabe1 sShmVa1ue. -
Autoiext :-True. -
LegendKey :-Fa1 se
--
Przetnarzante w pet11 t a l e t c j i P o ~ n t s1 ustawlanie e t y k i e t danych
Pts Cht.SeriesCollect~on(:).Points.~~mt
For i 1 To Pts
-
Cht.SeriesCo1 l e c t i o n i l ) .
Next i
-
Points(1) .Datalaw1 .Text DLRange.(l)
End Sub
g$$%* Poprzednia procdura nie jest dopracowana i nle zawlera razbudowanej obstugi W6w.
Poza tym dziala tylko dla pierwrzego oblektu Series. Paklet Power Utilfty Pak zawiera
m-ie bardziej ztoione n a m e pzemacmne do modyfikowania etykiet na ~ y k i e s ~ .
Rozdziat 18. + Wykresy 505
Rysunek 18.8.
L4fh-e~XY
zawleraJqcy
etykiety danych
dzieki rastosowaniu
procedury VBA
Rysunek 18.9.
w k r e s w tym
okde UserFonn
zostai uhvor7ony
.w rode.
na podstawie danych
z bidqcego wiersza
Okno UserFon wykonystane dla potrzeb tcgo przyktadu jest bard20 p m t e . Zawiera
konnolke Imge (obraz) oraz pnycisk Zamknij. W arkuszu z danymi majduje sie prq-
cisk, ktbrego wciSniecie powoduje wykonanie nastqpujqcej proctdury:
506 e + Zaawansowane techniki programowania
Cz~fV
Sub M h a r t O
-
Dim UserRow As Long
UserRow Activecell .Row
IfUserRw < 3 O r IsEmpty(Cells(UserRow. D l Then
MsgBox "PrzemiefC kursor do wlersza zaulerajacego dane."
E x i t Sub
End I f
CreateChart UserRow
UserFonl .Show
End Sub
Wykres jest tworzbny na padstawie danych z wiersza, w ktdrym znajduje sic aktywna
kom6rka. JeSli wskainik kom6rki majduje sic w nieodpowiednim wierszu, procedura
wySwietla ostrze2enie. W innym przypadku procedura Showchart wywduje procedure
CreateChart w celu utworzenia wykresu, a nast~pniewytwietla go w oknie UserFom.
---
Set CatTItles ActiveYleet.Range('AZ:F2"1
Set SrcRange ActiveYleet.Range(Cells(r. 11. Cells(r. 5 ) )
Set SourceData Unton(CatT1 t l e s . SrcRangel
Oodante wykresu
-
Set T m C h a r t Charts.Add
--
.PpplyDataLabels Type:-xlDataLabelsShowValw. LegendKey:-False
.ChartTitle.Font.Size 14
.ChartTitle.Font. Bold True
Axes(xlValw).MaxtmanScale 0.6 -
.Axes(xlCategory).TlckLabels.Font.Size 10 --
.Axes(xlCategory) .TlckLabels.Orlentatlon xlHorlzonta1
.Location 'Ahere:-xlLaationAsObfect. Name :-"Arkuszl"
End Wlth
--
Wlth bctiveSheet.Chart0bJects(l)
.Width 300
.Height
.Visible
End W t h
150
-
False
End Sub
Gdy procedura Createchart zostanie zako~iczona,w arkuszu zostanie urnieucwny obiekt
ChartObject zawierajqcy wykres utworzony na podstawie danych z wiersza aktywnej
kom6rki. Obiekt ChartObject nie bedzie jednak widoczny, poniewat wlaiciwoit Scre-
enupdatl ng wyiqczono oraz ustawiono wartoit wlaiciwo5ci V i s i b l e wykresu na Fa1 se.
'
-
Wyfwietlenie wykresu
-
1magel.Picture LoadPfcture(Fneme1
Appl icatton. Screenupdating True
End Sub
Rysunek 18.7.
W)+ves XY
bez etykiet danych
-
Okref lenie wykresu
Set Cht ActlveSheet.ChartObjects:l).Olart
--
2rzetwalrzanie w pet11 k o l e k c j l Points 1 ustawianie e t y k l e t danych
Pts Cht . S e r i e s b l lection(1). Points .Count
For I 1 To Pts
Next i
Cht.SeriesCollectlon(1).
Points(i).DataLabel .T& - DLRaw(i)
End S L ~
Poprzednia procedura nie lest dopracowana i nie zawiera mzbudowanej obslugl b@d6w.
g
&j" Poza tym dziala tylko dla pierwszego obiektu Series. Pakiet Power UtiIIty Pak zawiera
znacmie barddej zhione nan@zie p r r e z n a c m do modyflkowanla etykiet na Wesach.
Rysunek 18.8.
w r e s XY
zawierajqcy
etykiety danych
dn'qki zastosowaniu
procedury WA
Rysunek 18.9.
v@kfes w tym
oknie UserForm
zostat utwonony
,w locle "
na podstawie danych Wynlkl anklaty kllentbw
z bie2wego wiersza
Okno UserFann wykonystane dla potrzeb tego p n y k M u jest bardm proste. Zawiera
kontrolkq Image (obraz) oraz w i s k Zomhij. W arkuszu z danyrni majduje s i pny-
~
cisk, ktdrego wciSnivie powoduje wykonanie nastepujqcej pmccdury:
506 CzdC V Zaawansowane techniki prograrnowania
Sub ShowChart(
-
Dim UserRm As Long
UserRw Activecell .Am
If UserRaw < 3 Or IsEmpty(Cells(UserRow. 01 Then
MsgBox "Przemieft kursor do wiersza zawierajacego dane."
E x i t Sub
End I f
CreateUIart UserRon
UserFonl .Show
End Sub
Wykres jest twomny na podstawie danych z wiersza, w ktbrym majduje sip aktywna
kornbrka. JeSli wskatnik kornbrki majduje sip w nieodpowiednim wienzu. procedura
wyfwietla ostrzetenie. W innym przypadku procedura Showchart wywoluje procedure
Createchart w celu uhvonenia wykresu, a nastppnie wyfwietla go w oknie UserFom.
-- -
Set CatTl t l e s Activesheet .Rangel 'A2:FZ")
Set SrcRange ktiveSheet.Range(Cellstr. 11. G?lls(r. 611
Set SourceOata Union(CatTit1es. SrcRange)
DPdanie wykresu
-
Set Tempchart Charts.Add
-
.SetSourceData Source:-ScurceData. Plot8y : - x l h s
.HasLegend False
.PlotArea. 1nterior.ColorIndex -
xlNone
Axes(xlValue1.HajorGridlines.Delete
.ChartTltle.Font.Size --
.AoplyDataLabels Type:-xlDataLabelsShowValue. LegendKey:-False
14
.ChartTitle.Font.Bold
Axes(xlValw).Maxi&le
True
-
Axes~xlCategory).TickLabels.Font.Size
0.6
--10
Axes(x1Category) .TictLabels.Orientation xlHorizonta1
.Location Where:-xlLocationAsObject. flame:-"Arkuszl'
End With
--
Uith ActiveSheet.ChartObjects(1)
.Width 300
-
.Height 150
.Visible False
End With
End Sub
*
Rozdziat 18. + Wykresy 9 7
-
Zapisanie wykresu w fomacle GIF
Fnarne ThisWOrkbmk .Path & App!lcatlm .Pathseparator & "temp. ~1 f
CurrentChart .Export Fi1eName:-Fname. F i 1terNane:-"GIG'
ActiveSheet .Chartobjects (1).Delete
* Wy9wietlente wykresu
1magel.Picture LoadPicture(Fnane)
Application.kreenUpdating True
End Sub
-
*
, Ten m t a d jest dostepny na Wcie CD-ROM dolqczonej do ksiqtkl.
-4
(8,
lhdatkowe lnfonacje na temat zdarren mozna maleB w rozdziale 19.
*ll"r. IU E.II-b-I*.E.O
D Y
"q . A. *,.,a.
-%-
. I.. ",.1" ..* -.-
.yl I. Y S l * W
3.1-1
Cl.
..c.
C U I,-:*
XLAaIn: l d
iLhl.llll.i
. . 'UV
ill -YL.IIIY.
C . w .LF.Y.*". 1.. .CIUCII".
C u m zLCIYcIxLL.I
.- Id ' -PltT1..1*.
.C
.. .LC.rn...,
C u m .LAI.\.I.Lx
C U . slD.L.%l.~
C U . .,m.nu.,
Id
U
I8
I..
-
-cmlrr..
-I-.
*I-T-h.
B.6.I.r..
-
msg msg & "sprzedaty produkth 1-3." 8 vbCrLf d vbCrCf
msg msg & "Kl iknl j pozycje na wykresle, aby dorriedzlet sic. crego aotgczy."
MsgBOx msg, vbInfonnation. ActiveUorkbook. Ham
End Sub
Rysunek 18.1 1 .
UaMywnienie rcykresu
powoduje
umchomienie
procedury
Chart-AcNvate
I
i wySwietlenie
pokazanego
komunikatu
510 CzqdC V + Zoowonsowane techniki programowonia
-
Dim m g As String
msg 'Dziekujemy za przejrzenie wykreru."
.
Msgbx msg. k t 1veWork book.Name
End Sub
Kolejna procedura Chart-Sel ect jest wykonywana za katdym razem, kiedy na wykresie
zostanie zamaczony element:
Private Sub Chart-Select(ByVa1 ElementID As Long. -
ByVal Argl As Long. ByVal ArgZ As Long)
O i m i d AS Strfng
Select Case E l m t I O
- -
Case xlAxis: Id "Axis"
-
Case xlAxisTi t l e : I d ' A x i s l i t l e "
- --
Case xlChartArea: I d "ChartAna"
Case xlChartTi t l e : I d "ChartTitle'
Case xlcorners: I d "Corners'
--
Case xlDataLabe1: I d "DataLabel"
Case xlDataTable: I d 'OataTable"
--
Case xlDownBars: I d 'DounBars'
Case xl0rapLines: I d "DropLines'
-
Case xlErmr0ars: I d 'ErrorBars"
- --
Case x l F l w r : I d "Floor"
Case xlHiLoLines: I d "HiLoLines*
Case xlLegend: I d "Legend"
Case xlLegendEntry : I d "LegendEntry"
- -
Case xlLegendKey: I d 'LegendKey"
-- -
Case xlMajoffiridlines~: I d "MajorGridLines"
Case xlMinoffiridIines: I d "MinorGrldLines"
tase xlNothing: I d 'Nothing"
- - -
Case xlPlotArea: I d *PlotArea'
Case xlRadarAxisLabels: I d 'RadarAxlsLabels"
Case xlSeries: I d 'Series'
- -
Case xlSeriesLines: I d 'SeriesLines"
Case xlShape: I d 'Shape'
-- -
Case xlTrendl ine: I d "Trend1 lne'
Case xlUpBars: I d "UpBars"
Case xiwall s: I d "Wall s"
- -
Case x7XErrorBars: Id "XErmrBarr"
Case xlYErrorBars: I d "YErrorBars"
Case Else:: I d 'Nieznsny element"
End Select
Hsgbx "Typ ybrancgo elenentu: ' I I d
End Sub
Pmcbdura wyhvietk okno informacyjne zawierajqce typ wybranego clementu. Kiedy zaj-
- .-
dzie zdarzenie Select.,areument ElenwrtID bedzie zawieral liczbe ca4kowita odwwiadaim-
elernentowi, Wry mstat zazrtaczony. Argumenty Argl i Arg2 &erajlldo&tkoh.e informa-
cje o wybranyrn elemencie (wivej informacji znajduje sit w pomocy online). Procedm
Select Case zamienia wbudowane staie na Mcuchy mak6w.
Nie jest to pdna lista element6w, kt6re moge wystepowd w oblekcie Chart
-nie H e r . na przyklad obiekt6w spcgflcmyrh dla wykrea6w gmslawnych.
Wiagnle dlatego utyto instrukcji Case Else.
-
Czynnolt tq wykonuje ponitsza instrukcja::
Se: MyChart.clsChart PstiveSheet .ChartObjects(l).Ch~rt
Sub EnableChartEventsO
'
Procedura wywolyana przez przycisk r arkuszu
Range( 'Aln>.Select
Set SmaryUlart.myChartClass -
Uorksheets(l1.thart~bjects(lj.~hart
End Sub
Sub OlsableChartEvents()
-
Procedura wywljwana przez przyci sk w arkusru
Set SumsaryCMrt .aryChartClass Not9ing
Range( 'Al') .Select
End Sub
Sub ReturnToHalnt)
Procedura vyw~lywanaprzez przyclsk w arkuszu
Sheets("G?*').ktivate
End Sub
51 4 Cz$IC V + Zaawansowane techniki programowonio
Pienvsza instrukcja jest deklaracjq nowej zmiennej obiektowej SumryChart typu Emb- f
-
Chartclass, co -jak pamietamy jest nazwq modutu klasy. Kiedy utytkownik kliknie
przycisk W l q a obsluge zdarzeri wykreru, wbudowany wykres zostanie przypisany do
obiektu, co w rezultacie spowoduje uaktywnienie obshgi zdaneri dla wykresu. Modul
klasy ErnbChartClass pokazuje listing 18.4.
I
Listing 18.4. Obsluga kliknlpla k,olumny
Public WithEvents mychartclass As Chart
Private Sub ayChartClass-HouseOown(ByVa1 Button As Long. -
ByVal Shift As Long. ByVal X As Long. ByVal Y As Long)
D i m IDnum As Long
Dim a As long. b As.Long
-
Czy kliknreto serie danych?
If [Dnm xlSeries Then
Select Case 5
Case 1
Sheets("P6lnoc") .Activate
Case 2
Sheetst"Po1udnle") .Activate
Case 3
Sheets( "Zach&*l .Act1vate
End Select
End If
Range('Al"1 .Select
End Sub
E x i t Sub
End I f
-
Sec TheCbart k t l v e t h a r i
fipplication.ScreenUpdating False -
-hechart .CopyPic:ure Appearance: -xi Printer. -
Si ze:-xlScreen. Fomat :-xlPicture
I f TypeName(Pctlve5heet)
Acti veulart . Paste
-
"Char:" Then
Else
--
PctiveSheet .Paste
Selection.Left, TheChart.Parent.Left
Selection .Top Thechart. Paren: .TOP
End If
Thechart. Parent .Delete
npplicatlon.ScrmUpdat7ng
End Sub
h e -
Ten przyktad jest dostepny na ptycle CDROM ddqczonej do ksiqtki.
Kolcjna procedura tworzy wykres na podstawic tablicy (rysunek 18.14). Dane nie sq
zrrpisane w arkuszu. Jak motna s i przekonaf,
~ formula SERIE zawicra tablice tamiast
odwolan do zakres6w.
Rysvnek 18.14.
Ten wykres
utwonono
na podstawle danych
z rablic
(a nie z arkusza)
Sub CreatePDeadChartO
.Darts.Add
k t l v e U ~ a r t . L a a t i o n-
*ere:-xlLocationAsObjeCt. Nam:-"Arkuszl"
U i t h Activechart
--
.SeriesCol1ection.NewSeries
.SeriesCol lection(1) .%Values Array('Sty'. "Lut'. "Mar")
.SerielC~llection(l).Yalues Array(l25. t65. 189)
.HasLegend = Fa1se
.Deselect
End With
End Sub
Poniewa2 ismieje ograniczenie dlugoici fonnuly SERIE dla wykresu. technike te rnotna
stosowat tylko dla relatywnie malych zbiorbw danych.
Rysuncik 18.15.
Pole tekstuwe
Mwietfajqce
infomacje na temat
ponh-tu danych
wskazyvanego
pnez mysz
- -
If NewText 0 Activechart .Shapes[l) .TextFrane.Text lhen
Activechart .Shapes0 1) .TextFrafre.Text NewText.
nctrvethart .Shapes(l) . V i s i b l e True
End I f
End Sub
Rysunek 18.1 6.
Zakres B7:C9
zawlera 1nfomrac)e
o punktach danych
wy6wielIanflh
w polu tekstowym
wykresu
Wykresy animowane
Za pornocq Excela motna animowat figury i wylaesy. Rzeanalizujrny wylcres XY po-
kazany na rysunku 18.1 7.
Rozdziai 18. + Wykresy 519
Rysunek 18.1 7.
Pmsta procedura
w ieIvku
VBA przeksztafci
ten wykres
w interesujqca
animacje
- - -
D i m i As Integer
Range("Al.1 0
Far i 1 To 150
Range('Al"! Range("Al"1 + 0.035
Next 1
-
Range('A1")
End Sub
C
Rysunek 18.18.
Skoroszyt
genenrjqcy knywe
hipocykloidalne
W przyktadzie wykorzystano wykres XY. Dane dla osi X i Y sq generowane przy uty-
ciu forrnul n ~ i s a n v c hw kolurnnach A i 0. Paski ~ m w i i a n i aw gbrnei cze9ci okna
umo2liwiajq modyfikacjc tnech panrnerr6w sterujicych kglqdem wykes". Sq one
powiwme z komdrkami 81.82 i 83.Nie sa to kontrolki ActiveX. lecz kontrolki z paska
narzedzi Forntrrlorre. ~ o d z ~ t k o wnao wykksie znajduje sic pnycisk Losowo, kt& ge-
neruje losowe wartosci dla trzech parametrbw.
Twonenie wykresu-zegam
Na rysunku 18.19 pokazano wykres XY, kt6ry skonfigurowano w taki sposbb, aby
pnypomind z e p r i dziatal jak zegar. Nie przychodzi mi na my61 zadna konkretna sytu-
acja, w ktbrej rnotna by wykorzysaaf taki zegaa w arkuszu, ale jego utwonenie bylo dla
mnie wyzwaniem. Poza tym tworqc taki wykrcs, rnotna sie wiele naucqf.
Ten pnyklad jest dostgpny na ptycie CD-ROM dolqczonej do ksiqiki.
Ryrunek 18.1 9.
Ten dzlafajqcy zegar
jest w neczvwlstoScl
Poza wykresem-zegarem skorosq't zawiera pole tekstowe,, w ktbrym czas jest wyfwie-
tlany w postaci nvyktego tarlcucha makbw. jak pokazano na rysunku 18.20. Domyslnie
to pole jest ukryte. ale motna je wytwietlit. anulujqc zaznaczenie pola wyboru Zegar
analogony.
Rysunek 18.20.
kt+3wietlanie zegara
w postaci cyfmwej
jest znacznie lahviejsze,
ale i efektjest rnniej
interesujqcy
Rysumk 18.21.
Za parnacq
w~~&,/wo~c/
Autofffir Excela
moina wykreSIfd
VIko podzbidr danych
Rysunek 18.22.
Zastosowanie
okna dialogowego
Autofiltr
niestanderdcwyw celu
filtrowania listy
Jeieli okate sig. Le ta technika nie dziala, nalety zrnlenit ustawienia dla wykresu.
W tym celu trzeba uaktpniC wykres, wybraC pozycje Na~dzfa/Opcje,kliknqd
zaktadke W)4cre+ I zamaczy6 pole KmSl tylko widmne komdrki. Aby wykres nie znikf.
jeSli wszystkie wfersze, M6re go dotyczq. zostanq ukryte, naleiy zamaczyd opcjqa'
Nie menod ant nie zmieniaj romiaru z komdfkamiw zaktadce WIagciwo5ci okna
dialogowego Formatavanie obszaru wykresu dostepnym po W r a n i u poieceria
Format/Zaznaczony obszw wykresu.
Rysunek 18.24.
Arkusz-wykres
z szeJcioma
wbudowanymi
wykresami
Aby lepiej wzumieC ten problem, spdjrzmy na rysunek 18.25, na ktbryrn zaprezento-
wano wyhs dotycqcy dziennej sprzedaky. Jest on uaktualniany codziennie i dotyczy
wszystkich danych w arkusw. Wprowadzenie nowych danych powoduje koniecmoSf
dodania nowych serii danych, w celu uwzglqdnienia nowych informacji. Z kolei w pny-
pdku usuniccia danych serie m u s q zostat usunicte. Jest to cakowicie realne, wystarczy
tylko wykonaf kilka czynnoici przygotowawczych.
Rozdziat 18. Wvkresv 525
Rysunek 18.25.
Samorozuenajacy
sic wykres aktuallz~~je
sie autom8Qcznie
w miare
wprowadzanla
nowych danych
P i ~ u y n n o S c i q j e sutworzmie
t standardowego w y h u , M r y wyk-je istniejp
dane. Na rysunku 1815 zapmentawsno iut dane oraz wykrcs kolumnowy utworzony
na ich d t a w i e . W y h A w i m jednq skie danych. ~ o & u l aSERIE odpo&adajqca tej
serii danych ma nastqpujqcqpostat:
-SERIE(Arkuszl! SBS1 .Arkuszl! SAS2:SPJll.Arku~zl: !1812:SBSll.1)
Na jej podstawie mo2na wywnioskow&, tk:
n m serii danych zapisano w kom6rce 81,
W etykiety kategarii zapisano w ralrnsie A2:All,
wartoki zapisano w zakresie B2: 011.
Datyehczas jest to nwykly wykres. Jeteli w arkwzu wprowadziiy nowq dag, na yf-
krcsie nie zostanqwql~dnionenowe dam. W t o e si! tym zajmiemy.
526 CzgfC V + Zoawansowane techniki programowonio
Tworzenie fonnu).~namami
Teraz utworrymy dwie formuly, ktckym nadamy nazwy. Nazwy te posh* jako argumenty
w formule SERIE. Pojpcie formu1 z nazwami om6wip w dalszej czpfci tego p u n h . Aby
utworzyt fonnuly z nazwarni, wykonaj nastppujqce czynnosci:
1. Wybierz polecenie Wstmv/NazwalDefiniuj.Na ekranie wySwietli sip okno
dialogowe Definiowanie nmw.
2. W polu Nanvy w skoroszycie wprowadt nazwe Data. W polu Odwoluje sic
do wprowailt p o n i b q formute:
-PRZESUNIEC1E(Arkuszl!SAS2.0.O. ILE.NIEPUTTYOI(Arkuszl! SA:SAl-1.1)
3. Kliknij Dodaj, aby utwonyC fonnulp o nazwie Data. Zwr6C uwage, t e funkcja
PRZESUNIECIE odwduje sit do picrwszej etykiety kategorii (komdrka A2)
i wykortystuje funkcjp ILE.NIEPUSTYCH w celu okreilenia liczby etykiet
w koiumnie. Poniewat w wienzu 1majdujqsip nagl6wki, od uzyskanej
licby odejrnowanajestjedynka.
4. Wpolu N a m y w skomszycie wprowadt n a m e Sprzedat. W polu Odwoluje sic
do wprowadt ponitsq formu+q:
Wykonanie tych cqnnogci spowoduje dodanie do skoroszytu dw6ch nazw: Data oraz
Sprzedat.
Jak powinno 5yC? W pnypadku wykorzystania nazwanych formul, naMry formu1 nalet);
poprzedzif nanvq arkusza lub skomsytu (wedlug mnie tatwiej postugiwad siq nazwa.
skoroszytu). Trzeba jednak pamiqtad, t e jeSli nazwa arkusza lub skoroszytu zawiera
spacjq, n a m e @ nale2y ujqt w apostrofy tak. jak pokazano ponitej:
-'dzienna sprzedat.x l s ' !Sprzedat
lub
'dane sprredab' !sprzedai
Wivej informacji na temat nazw mokna maleif w rarnce ,,Jak Excel obshguje nazwy".
Zarniast korzystd z okna dialogowego Dane frddtowe, motna bezpo5rednio edylowad
Je51i jednak wprowadzimy te form* w innym arkuszu. Excel nle mzpozna nazwy. ch@a i e okreSlirny
nazw arkusza:
-Arkuszl! Danen4
Nazwy poziornu arkusza sq prrydatne, poniewai urnoiliwiajq uwanie tych sarnych nazw w r6inych
arkuszach. Na przyktad moina wprowadzif namy pozlomu arkusza postaci Artusrl!C3scrk!. A r -
tusz2lOdsetki oraz irrkusz3!06setkl. Kaida nazwa odwoluje sle do komdrki w lnnym ar)cuszu.
Formula. w ktdrej uFyto nazwy Odsetki. wykorzystuje definicje teJ namy dla Wasnego arkusza.
Nazwane formuly viykorzystane w tym rozdziale sg nazwami poziornu skoroszytu, poniewa2 nie
sq poprzedzone namq arkusza. Jeteli jednak wpmwadzarny n a w w polu okna dialogowego
Dane irddbwe, Excel (z pewnych powod6w) wymaga podania namy z namq arkusza lub z namq
skoroszytu.
Pole Odwohje sig do z okna dialogowego D&niowanie nanv zawiera fomulq, natorniast
pole N Q H ~w~skoroszycie zawiera natwp fornub. &wart& pola Oddqie sic do zawsze
rozpoczyna sip od maku r6wnoSci -jest to wskahik, te mamy do czynienia z form*.
W tej fonnule u@to korn6rki 02 jako kom6rki odniesimia Formula zwraca zakres, ktbry:
I
jest pnesuniqty w stosunku do kom6rki 82 o 0 wierszy (drugi argument
przes-wt erszy);
5313 CzedC V Zaawansowane techniki programowonia
Rysunek 18.27.
W tej apllkacjl
nykorzystano Wlka
technik w celu
wykredlenla
miesiecmycf, danydr
doryczqcych klirnatu
dwdch wybmnyl:h
miast
-
InteraMywM19t zapewniajq wbudowane wlaSEiwoSci Excela nie sq potrzebne makra.
Miasta q wybiemne z rozwijanej listy za p o m q wtakiwoki sprawdzania poprawnoSci
danych Exeela, a opj e danych za pomocqcztcrcch pnel~cznik6w.Elementy te sq z sob&
p o w i p n e la pomocq zaledwie kilku forrnul.
W celu uzyskania nazwy tabeli danych m podstawie wartogci liczbowej zapisanej w ko-
m6rce 03 napiszemy fomulq (w kom6rce 04) wykonystujqcq funkcj~Excela WYBIERZ:
Tak wiw w korndrce 04 maj'duje sip nazwa jednej z czterech nazwanych tabel danych.
Nast~pniewpmwadzimy pewne elernenty formatowania dla przyciskow opcji, aby uatrak-
cyjniC ich wygld.
Aby ulatwiC dzialania z listq rniast, utworzymy zakres o m i e ListaHiast, kt6ry od-
wohje sip do pienvszej kolumny w tabeli DaneOpady. W celu utworzenia rozwijanych
list wykonaj nastqpujqce czynnoici:
1. Zamacz obszar J l l :MI1 (pamiqtaj, ae sq to komdrki scalene).
2. Wybierz polecenie D a n d S p r ~ d i u n i epoprawnoSd. WySwietli siq okno
dialogowe Sprmdzanie popruwnoici danych.
532 Czg!.C V 6 Zaawansowane techniki prograrnowania
Rysunek 18.28.
Do W i e r a n i a miasta
wykonystamy
romljanq
liste wtaSciwoJci
Sprawdzanie
poprawnoBci danych
Rysunek 18.29.
Na wykresie
wykonystano dane
pobrane pcez forrnuly
zapisane w zakresie
A22:M24
I3
"& Niektdrych czytelnlk6w z pewnokla zainteresowak uiycle funkcjl NR. KOLUMNY
a ,* dla trzeciego argumntu funkcjl WSZUW .PIONMU. Funkcla mraca nurner kolurnny
korn6rkl zawlerajqcej formute. Jest to wygodny sposdb pozwalajqcy na uniknlqcle
kodowania .na twardo' kolumny do pobranla. Dzlekl temu dla wszystklch kolurnn
rnoina zastosowat tg sarnq formuk.
Etykietq powytszej listy miesiqcy generuje formula odwolujrlca sic do kom6rki Ta be1 a -
Danych, kt6ra twomy na tej podstawie opisowy tytul. Formuta ma nastqpujqcqpostac:
Sekwencje zdaneh
Niektbn'dziahnia powodujq powstanie wielu zdanel5. Gdy na przykhd nowy nrkusz
jest wtawiany do skoroszytu, zachodqb-zy zdanenia poziomu aplikacji:
WorkbookNewSheet, ktbre zachdzi podczas dodawania nowego arkusza,
SheetDeactlvate, kt6m zachodzi podczas deaktywacji aktywnego arkusza,
SheetActivate, ktbre zachodzi podczas uaktywniania dodanego arkusza.
Sekwencje zdarzefi sq nieco bardzlej ztohne, nit m@by sle wydawd. Wymienlone
(
=
$?
** powytej zdarzenia zachodq na pon'ornie aplikacji. Podczas dodawania nowego arkuSZa
zachodzq dodatkowe zdanenie na poziornie skoroszytu i arkusza.
I Rozdziat 19. ObsIuga zdarzeh 537
Rysunek 19.1.
Komponenty wsqstklch
projeM6w VBA
sq wyszczeg6lnione
w oknie Project
End i f
N-i ponowne wykonanie procedury obstugi zdarzeti. ale dzicki wanoici True niennej
AbortProc procedura natychrniast zakoficzy dziatanie. Dodatkowo zrnienna Abortpro:
zostanie ponownie ustawiona na wartoit ~ a - .se.
Praktycmy plzyktad spawdzania poprawnoSci danych zaprezentowano w punkcie
.Monltorowanie zakresu w celu sprawdzenia poprawnoSci danych" w dalszej czqdci
nlnlejszego rozdziatu.
Wyfqczenle rdaneri w Excelu dotyczy wstystkich skoroszyt6w. Na przyklad jeieli
wytqczyrny zdarzenla w procedurze, a nastepnie otwotzymy lnny skoroszyt, w kt6rym
zdefiniowano procedure Mortbook-Open, procedvra ta nie zostanie wykonana.
Procedurp rno2na zadcklarowad, wpisujqc jjq rqcznie, ale macznie lepsze jest wykorzy-
stanie w tym celu edytora Visual Basic.
Na rysunku 19.2 pokazano modut kodu dla obiektu Thisworkbook. Aby wstawic deklaracje
procedury, naleZy wybrad skoroszyt z listy obiekt6w po lewej stronie oraz zdarmnie
z listy procedur po prawej swonie. Wykonanie v c h czynnosci spowoduje utwonenie
szkielehl procedury, kt6ry zawiera wiersz deklaracji procedury oraz instrukcjq En3 Si~b.
Jeteli na pnykhd wybierzerny Workbdok z listy obiektdw i Open z listy procedur. edytor
Visual Basic wstawi nast~pujqcq(pus@ procedup:
P r i v a t e Sub Uorkbwk-@en [ )
End Sub
WWciwy kod powinien onywiicie zawierak wiqej nit tylko te dwie instrukcje.
540 Czeit V + Zaawansowane fechniki progromowania
Rysunek 19.2.
Naj1epszj-m
sposobem ulwonenla
procedury obslugi
~da~eflialest
wykonystanie edytora
Visual Basic
-
P r i v a t e Sub Workbook-BeforePrint(Cance1 k Boolea?>
- -
Pns HsgBox(Msg, vbYeaNo. "Drukowanie.. . " )
If Ans vbNo Then Cancel True
End Sub
Rysunek 19.3.
Operacjp drvkowanla
mama anulowa6,
rnaWkwec
argument Cancel
Zdarzenie Open
Jednym z najcqdciej monitorowanych zdarze6 paziomu skoroszytu jest zdamnie Open.
ktbre nastCpuie w momencie otwarcia skoroszytu- (tub
- dodatku). Wystzwicnie zdanenia
powoduje;;;konanie proctdwy Workbook Open. Procedura ta mote h k o n a t najrdaiej-
sze zadania, najcqiciej sq to nasttpujqce operacjc:
mwietlanie komunikat6w powitalnych,
otwieranie innych skomzyt6w,
konfigurowanie menu lub paskbw n q d z i utytkownika,
e uaktywnianie oheSlonego a&ua lub kombrki,
542 CzgSe V + Z a a w o n s o w a n e tachnikl p r o g a m o w a n i a
,s-fU Jeieli utytkownik przytrzyma klawisz Shift podczas otwlerania skoroszytu, procedura
Workbook Open nie wykona sig. Procedura nle wykona st? r6wnlez w przypadku
otwlerania arkusza z wytyczonq obstugq rnakr.
-- -
Private Sub Uorkbook-Open0
If Weekday(Nw1 vbFriday Then
Msg "QziS jest piqtek. Panietaj. aby '
Msg Msg 1 "wykonat tygodniowa kooie zapasowa!"
Msgeox Psg, v b I n f o m t i o n
End If
Era Sub
Zdarzenie Activate
Ponitsza procedura wykonywana jest katdorazowo podczas uaktywniania skoroszytu:
Private Sub Uorkbwk-Activate0
-
ActiveWindow. Windowstate xlMaxi7ized
End Sub
Zdarzenie SheetActlvate
Kolejna procedura jest wykonywana, kiedy utytkownik uaktywni dowolny arkvsz
w skoroszycie. W pnypadku zwykfego arkusza kod wybiera kombrk~A l . W przypadku
arkusza bedqcego wykresem nic sip nie dzieje. W procedurze wykorzystano funkcjq VBA
TypeNam w celu sprawdzenia, ay uaktywniany arkuszjest myktyrn arkuszern (w odrbtnie-
niu od arkuszy-wykredw).
I f TypeNam(Sh)-
Private Sub Wortbook-ShwtActivate[ByVal Sh A
"Worksheet" ihen -
Rangei'A!').Select
s 3bjecti
End Sub
544 Czgde V + Zaowansowane techniki programowania
Zdanenfe NewSheet
Ponihza procedurajest wykonywana, kiedy do skoroszytu dodawany jest nowy arkusz.
Arkusz jest przekazywany do procedury jako argument. Poniewat nowy arkusz mote
byc zwyklym arkuszem albo arkuszem wykresu, procedura spmwdza jego typ, Jeteli jest
to zwykly arkusz, kod wstawia datq i macznik czasowy w komdrce A 1 nowego arkusza.
P r Y r ? t eSub Workbcck-NmS'r.sel!3yqJal Zh As Objecti
!i TypeNarrel Shi--
Sh.Range("Aia)
'n'orrsheet" T ~ e n
"Arkust codano-' & NawO
ir!: Sub
Zdarzenie BeforeSave
Zdarnnie BeforeSave zachodzi, zanim skmszyt zostanie zapisany. Jak wiadomo. wybranie
polecenia PlihZupis= czasami powoduje wyiwietlenie okna dialogowego Zapisywanie
jako. Taka sytuacja wystqpuje w przypadku, gdy skoroszyt nigdy wczeiniej nie by1 za-
pisywany lub j e S l i otwarto go w p b i e cylko do odczytu.
Zdarzenie Deactivate
W wrn pnykladzie zadernonstrowano zdarzenie Deactivate. Procedura obshgi tego
zdarzmia zaprezentowana poni*j jest wykonywana przy kazdej prdbie deaktywacji
skomqtu. Jej dziatanie polega na uniemotliwieniu deaktywacji. Kiedy wystagi zda-
rzenie Deactivate, kod ponownie uaktywni skomszyt i wyiwietli kornunikat.
P r i v a t e Sub Workbook-Deactivate0
He.ktlvate
H s e x "Niestety. n l e mzesz opugcit tego skoroszytu."
-End Su3
Nle polecam stosowanla procedur, M6re pr6buJq pz~Jq6 kontrole n s d Excelem. Moie
to b# bardzo frustrujqce I mylqce dla uiytkownihs Zamiast stosowaC takie p m c e d u ~ ,
lepiej nauczyC uiytkownlkdw poprawnego korzystania z apllkacji.
Ten prosty przyktad pokaruje. jak watna jest wiedz. na temat kolejnolci zdarzeri. Jeteli
wypr6bujemy tq proceduv, zauwatymy, tc dziata pprawnie podczas prdby uaktyw-
nienia innego skoroszytu. Nalezy jednak pami~tat,2e zdarzenie poziomu skoroszytu
Deactivate jest generowane t a b w wyniku:
Zdarrenie BeforePrint
Zdarrenie 6eforePrlnt wy*puje podczas edania wydrukowania arkusza (wyfwietle-
nia go na podglqdzie wydruku), ale przed faktycmym wydrukowaniem (wyiwietleniem
podglMu). W procedurze obshgi zdarrenia wykorrystywany j a t argument Cancel, kt6ry
pozwala na anulowanie drukowania lub wyfwietlenia pdglqdu. j&li nada siq mu wartoit
True. Niestety nie ma sposobu sprawdzeniq cry zdanenie BeforePrint tostalo wygene-
rowane w wyniku Wania wydmku, czy tet w wyniku pr6by wyiwietlenia arkusza
w podglqdzie wydruku.
Zdarzenie BeforeClose
Zdarzenie BeforeClose zachodzi pned zamkni~ciemskoroszytu. Czpsto utywa sip go
w m c z e n i u z proceduq obslugi zdarzenia Workbook-open. N a przyklad procedure
Workbook-Open motna wykorzystaC do utwonenia menu utytkownika, a nastppnie za
pornoq procedury Workbook-BeforeClose u s u w menu W k o w n i k a przed zarnknipciern
skoroszytu. W ten sposdb menu ukytkownika bqdzie dostppne tylko wtedy, gdy skoro-
szyt bcdzie otwarty.
Podczas pr6by zamkniqcia skoroszytu, M6ry nie byf wczeSniej zapisany, Excel wyiwietla
pytanie o to, czy zapisat skoroszyt przed zarnknipiem tak, jak pokazano na rysunku 19.4.
Rysunek 19.4.
Pojawienre sic tego
komunlkatu omacza,
t e rostala kykonana
procedura
Workbook-BeforeClose
Jak zmacqiem, pytanie Excela Cv zquisud zmiany w... wygwietla sip po wykonianiu
procedury Workbook-Befareclose. Zatem jeSli W o w n i k k l i h i e Arzufuj. skomszyt pozo-
stanie otwarty, ale miknie menu uzytkownika, kt6re zosealo usunipte wczefniej! Jednym
I
I! Rozdzid 19. + Obsluga zdorreh 547
z romiqzah tego problemu jest pominiecie pytania wyiwidlanego przez Excel i napisanie
wbnego kodu pmcedury Workbook-BeforeClose. Przykladowq procedq zaprezentowano
ponitej:
Private Sub Workbook-0eforeClose(Cancel As Boolean1
-- -
D i m Msg As String
I I f Me.Saved False Then
Msg "Czy zaplsat zmiany w "
-
Msg Msg 6 He.Name B '?"
Ans Msgbx(Msg. vb0uestion + vbYesHoCancel1
Select Case Ans
Case vbYes
Me.Save
-
Case vbtancel
Cancel True
E x i t Sub
End Select
End I f
-
Call DeleteMenu
Me. Saved True
End Sub
Kod procedur obslugi zdarzen poziomu arkusza musi byC zapisany w module k d u dla
okreilonego a r h z a .
Aby szybko uaktywniE rnodut kodu arkusza, ttzeba kllknqd prawyrn prryciskiern mysry
zakladke arkusza. a nastcpnie wybrad p l e c e n i l k?,dwietl kod
Zdarzenie Change
Zdarzenie Ch,arge nastepuje w prrypadku modyfikacji dowolnej komirrki arkusza przez
utytkownika lub procedure VBA. Zdanenie to nie naswi, jeteli w wyniku obliczen
zmieni sip wart066 formuly Iub kiedy do arkusza zostanie dodany obiekt.
548 CzeSt V Zaawansowane techniki programowania
Proccdua Worksheet Change pobiea obiekt typu Range jako argument Target. Obiekt
ten reprczentuje zmc&tikowanq kom6rkq lub zakres, ktdre spowodowaly wyswienie
zdanenia. Ponitsm procedura zostanie wykonma, kiedy zmieni sic zawartoft arkusza.
Jej dzialanie polega na wyJwietleniu okna informacyjnego z adrcsem zakresu Target:
Prt vate Sub Worksheet-Olange(ByVa1 Target As Excel .Range)
Fsm x "Zakres ' L T a v t . A d d r e s s & ' zfrcdyfi tmiana."
End Sub
Aby lepicj nozwnied rodraje dzialah, kt6re gmemjq rdanenie Change dla arkusw.
wprowadhy p o p d n i proccduq
~ w module kodu obiektu Worksheet. Nasypnie uaktyw-
nijmy Exccla i wykonajmy kilka rnodyfikacji za pomocq r6tnych technik. Za k d y m
razem. kiedy nastapi zdanenie Change, wyhvietli siq komunikat zawierajqcy a h zakresu.
kt6ry zostal zmodyfikowony.
Po uruchornieniu procedury odkryfern kilka intmsujqcych wtaSciwoSci. Niekr6re Qiahnia
nie pnerowab zdarzen, choC powinny, natomiast inne, kt6n pozornie nie powimy tego
robit, generowaly je!
Modyfikacja korndrki nie wyzwala zdarzenia Change (chocial wydaje sic,
t e powinna), natomiast wybranie poiecenia E&cjdWyczys'~Formaty wyzwala
*
Z a l d h y , w arkwu zdefiniowano zakres danych wejlciowych InputRange i intere-
sujq nas wyhcznie modyfikacje wykonane w tym taknsie. Obiekt Range nic obslugujc
zdarzenia Change, ale z htwoSciq m o a a wykonaf odpowiednie sprawdzenie wewnqtn
procedury Worksheet-Change. Czynnoff t~ zademonstrowano ponitej:
Private Sub Worksheet-Change(ByVa1 Target As Excel .Range)
-
Dim VRange As Range
Set VRange Range("1nputRange')
I f Not Intersect(Taqet. VRange) 1.5 Nothing Then -
Ms&x ' h d y f l kouana km5rka majduje s i e n zakresle danych wejbciaqch. "
End Sub
Monitorowanie zakresu
w celu pogrubienia zawartofcf kom6rek zawierajqcych formuty
Ponitej zaprezrntormno przyklad monitorowania zakreou w celu pogrubienia komdrek
zawierajqcych fonnuly.
Ten pnykkdjest dostepny na plycle CDROM dok)emnej do ksiqtkl.
mam
Private Sub Uorksheet-Change(8yVal Target As Excel Range)
Dim c e l l As Range
For Each cell In Target
550 CzgSt V + Zaawansowane technlki programowanla
-
cell. Font .@old cell .HasFormula
Next cell
End Sub
Listing 10.1. Spnmdzenle, czy zmrtaS6 komdrM ma byE poddana wetyfJkaq/IpaprawnoSc1 danych
Private Sub Worksheet-Change(ByVa1 Target As Excel .Range)
Dsm Wange As Range, cell As Range
D i m Msg As Strlng
Oin Val idatecode As Variant
-
Set VRange Range('InputRangem)
If Intersect(VRange. Target) Is Nothing Then Exit Sub
-
For Each cell I n Intersect(VRange. Target)
-
Validateme EntryIsValid[cell)
--
If TypeNane(Va1ldateCode) 'String" Then
Msg 'Cell " L cell .AddresS(False. False) h ':'
Msg Hsg & vbCrLf & v t C r t f h ValidateCode
-
MsgMx Hsg. vbCritica1. "Ntw?a$ciwa zawartoif k ~ r k" l
Application.Enab1eEvents False
cell .Clearcontents
cell .ktivate
-
PpplIcation.EnableEvents True
End I f
Next cell
End Sub
Procedura Wo&sheet-Change tworzy obiekt Range o namie VRange reprezentujqcy mkres
arkusza, dla kt6rego sprawdzana jest poprawnoif. Nastepnie przemara w petli wszystkie
komorki zakresu okredlonego argumentem Target, ktdry reprezentuje zmodyfikowanq
kom6rke lub komdrki. Nastgpuje sprawdzenie, c y poszczeg6lne komdrki mieszczq sic
w za!uesie, dla kt6rego ma byc wykonana weryfilwja poprawno5ci. Jeteli tak jest, komdrka
jest przekazywana jako argument do funkcji urtytkownika EntrylsValld, mracajqcej
wartoX True,je&li dane w komdrce sq prawidlowe.
Jeteli wart096 w kom6rce nie jest poprawna, funkcja nvr6ci ciqg mak6w opisujqcy
problem, a utytkownik uzyska informacje za pomocq okna informacyjnego (rysunek 19.5).
Po zamknipciu okna niepoprawny zapis jest usuwany, a komdrka uaktywniana. Warto
nvr6cif uwagc, t e p m d wyzerowaniem komdrki obsluga ularzeri jest wylqczana. Gdyby
zdarzenia nie byly wyhczone, zerowanie kom6rki wygenerowaloby zdanenie Change
i w efekcie powstalaby pgtla nieskohczona
Rysunek 19.5.
Okno informaq'ne
wySwietla komunikat,
]eS// u?ytkownik
wprowadzi
niepoprawne dane
Czy wprowadzono l i c m ?
-
a
-
IfC I n t l c e l l ) <> c e l l Then
EntryIsValid "Nalety w p r h a d z l f l i c z k calkcwit*."
E x i t Function
End I f
Czy l i c t b a mleSc1 sre w zakresie p m e d z y 1 a 12?
-
I f c e l l < 1 Or c e l l > 12 Then
EntryIsValid "Nalety wprcwadzic l i t z k o wartofc: p o n i d z y 1 a 12."
Ex1t Function
End I f
'
-
Wszystkie testy zakcuiczyly s i e sukcesem
EntryIsValid True
End Function
Zdarzenie Selectionchange
W ponhzym przyktadzie zademomowano zastosowanie zdanenia Sel ectionchange.
Procedwa jest qkonywana, kiedy uiytkownik zaznaczy nowy obszar w arkuszu.
552 Czei.6 V + Zaawansowane techniki programowonio
Cel1s.Interior.ColorInUex xlNone -
Private Sub Wortsheet-Sel&:ionChange(9yVal Target As Exce: .Range)
511th Activecell
--
. EntireRw. I n t e r i o r . ColorIndex 36
. E n t i r K o l u m . !nter?or . C o l ~ r I n b e x 36
End With
End Sub
Rysunek 19.6.
Koiurnna i wiersz,
w Mdrej znajdule sip
aktywna komdrka sg
pakolorowane ~3 DII >Y m m
3695 I s 9 721
na ,?&to
p r t m
331
S l
us
3%%,
1*I
1'3 z 31Y
,
,ae Ten przyklad jest dostepny na ptycle CDROM ddqczonej do ksiqtkl.
Zdanenie BefareRightCllck
Kitdy u2ytkownik kliknie arkusz prawym pnyciskiem rnyszy, wyiwietli sip menu pod-
reczne. Jeteli z jakiego4 powodu chcemy wylqczyk jego wygwietlanie w okreSlonym
arkuszu, motemy w tym celu wykonystak zdarzenie Rightclick. Ponitsza procedura
ustawia argument Cancel na wart046 True, co powoduje anulowanie zdanenia RlghtCl ick,
ta tym sarnym wySwietlanie menu podrqcmego. Zamiast niego wyiwietla sip okno in-
fonnacyjne.
Drivate Sub Morksheet BeforeRightClick -
Cancel -
!3y1#al Target As Excel .Range. Cancel As 8001ean)
True
flsg8ox "Henu p o d e u n e j e s t niedostepne. "
End Sub
mmBa
Zdarzenia dotyczqce wykresbw
DomySlnie obshrga zdantA jest wkgmna tylko dla wykrcs6w umieszmnych w osobnych
arkuszach. Aby wykorzystad zdarzenia dla wykresbw wbudowanych, naleg utworzyC
Ljsta jest podzlelona na tny kolumy: Ubrery (blbllateka). Class (klasa) oraz Members (sktadowe).
Wyszuklwany element mote sip malefd w katdej z tych kolumn. Wiqte si? z tyrn bardzo istotna
uwaga: nazwa zdamnla, oblektu lub sktadowej naletqca do jednej biblioteki moie by2 taka sarna.
jak nazwa zdanenia, obiektu lub sktadowej n a l e w e j do innej biblioteki, c h d z reguly nle spelniajq
one identycznych funkcjl. Zatem przed uiyciem elementu wySwietlanego w pneglqdarce obiektdw
nalety przestudlowad jego sktadnle, kt6ra jest wyfwietlana na pasku stanu po kllkni?ciu e l e
rnentu w pneglqdarce. Czasaml mote si? okazad, i e w okreflonej klasle lub blbliotece zdarzenie
jest obstugiwane w inny sposbb.
T ~ 0 ~ 0 f lprocedur
le obsfugl zdand poriomu aplikacjl zawsze wyrnaga zastosowania
*c modutu klasy oraz p w n y r h cqm&cl pygntowawqch.
Emm
W tabeli 19.4 wyszczegblniono zdarzenia dotyczqce aplikacji wraz z krbtkim opisem
kudego z nich.
- - - -- - -
2. Wpisz nazwq tego moduh w polu Name okna Properties uwononego modulu
klasy. W jqzyku VBA kakdcmu nowemu modutowi klasy jest nadawana
domySlna nazwa, na pnyklad Classl, Class2 itd. Zalecam nadanie modutowi
klasy opisowej nazwy, na prtykiad c l sApp.
3. W module klasy zadeklaruj publicmy obiekt A~oltcation z uFyciem slowa
kluczowego Wi thEvents. Oto przyktad:
Public WithEvents X L A s Application
4. Utw6rz zmienng za pornocq ktdrej bedziesz odwolywat sic do zadeklarowanego
obiektu &pl ication w module klasv. Powinna to byf n i c n n a ob.iektowa poziomu
modulu zadeklarowana w module VBA
(nie w module klasy). Oto pnykjad:
Dim X As New clsApp
-
wykonywana w procedune Workbook-Open:
Set X . X L - Application
6. Napisz procedury obshgi zdarzeri dla obiektu XL w module klasy.
Sub I n i t 0
-
'
Procedura wywolywana przez procedure YorkbookPpen
Set AopObject.AppEvents Application
End Sub
tx? --
Sub UcdateLogFile(Wb)
Wb.FullName
txt
-t x t 8 '.' & Date I
~ x t txt 8
- '.'
'."
5 Time
& Poplication.UserNam
Fnane ThisUorkb&.Path & " \ l o g f i l e . t x t "
Open Fnam For Append As 41
W r ? t e 41, t x t
Close #1
nsgBox t x t
End Sub
Typem zmiennej AppObject jest clsApp (nazwa typu odpowiada nazwie rnoduh klasy).
W procedurzc Workbook-Open majdujwj sip w module kodu obiektu ThisWorkbook urnicsz-
Etano wywolanie procedury Ini t. Procedue Workbook-Open zaprezentowano ponitej:
Private Sub Workbook-Ow0
Call l n i t
End Sub
Rysunek 19.7.
W tym skomszycie
wykoaystano modul
klasy w celu
monitorowania
zdarzerl paziomu
aplikacji
-
Sub LcgEvent ( t x t l
EventNum EventNum + 1
With UserForml
.
-- -
With IblEvents
.AutoSlze False
.Caption .Caption b vbCrLf 4 t x t
.Width UserForml.FrameEvents.Wdth - 20
-
.AutoSize True
--
End With
.FrameEvents.kml lHeight .lblEwnts.Height + 20
.FrameEvents.kmllTop EventNun * 20
End U i t h
End Sub
Zdarzenie OnTirne
Zdarzenie OnTime wyst~pujeo okreflonej pone dnia. Kod ponitsrego pnykladu powoduje
wygenerowanie sygnaht diwiqkowego, a nastepnie wygwietlenie komunikatu o godzinie 3
po poludniu:
Sub SetAl arm( )
Application.OnTime 7iwvrl~e!"15:CO:OO").'DisplayAlann"
End Sub
Sub DisplayAlan0
See9
MsgBax "kistari. Czas na ooooludniwa Drzerwe!'
End sub
Rysunek 19.8.
To okno informacyjne
zostab zaprogramowane
tak, aby wyJwietlab sie
o okref lonej porre dnia
Aby zaplanowat zdanenie w odniesieniu do czasu bi-ego, a wiec takie. kt6rc ma na-
stapif na prtykhd za 20 minut, nalety zastosowaf ponitsq instrukcjq:
Apol ication .OnTim Now + TimValue('00:2D:OO"). "Di splayAlarm"
Metode OnTIme m o h a zastosowaf t a k e do zaplanowania wykonania procedury na
okreilony dzien. Ponitsza instrukcja spowoduje umchornienie procedury D i spl ayAl arm
o godz. 0:01 1 kwiemia 2004 roku:
Sub
'
Updateclock0
Uaktualnienie t p m S ~ iA l infomaeJani o bietqcej padzinie
'
Thl sWarkbwk.Sheets(l) .Range('Al'l Time -
-
Zaplancwanie nastepnego zdarzenia za p i g sekund
NextTlck Nm + TimeValue~"DO:OO:D5")
Pppllcatlon.OnTime NextTlck. "UpdateClock"
End Sub
Sub StopClockO
Anulcwanie zdarzenia OnTlme (zatrzynanie zegara)
On Error Resume Next
Apol tcation.OnTim NextTick. "UpdateClock". , False
End Sob
Zdarzenie OnKey
Podczas pracy Excel przez caly czas monitoruje wciskane klawisze. bzipki temu moms
skonfigurowat klawisz lub kombiacjp klawiszy, ktbrych wcifniqcic spwoduje wykonmie
okreSlonej procedury. Jedyne pnypadki. kiedy kombinacje klawiszy nie sq rozpozna-
wane, to wprowadmie formuly lub praca z oknem dialogowym.
Sub PgDn-Sub(
On Error Resume Next
nctiveCe11 .Offset(l. Dl. A c t i v a t e
End Sub
Sub psUp-Sub( l
Ch Ermr Resw Next
PctiveCell.Offset(-1. O).Actlvate
End Sub
562 CzefC V 4 Zaawamowone technikl pragramowanio
Zastosowanie pustego ciclgu mak4w jako drugiego argurnentu metody OnKey nie spo-
woduje anulowania zdarzcnia OnKey. Zamiast tcgo Excel zignoruje ciitg znak6w i nie
wykona tadnych dziald. Na pnyktad ponitrza instrukcja inforrnuje Excel, aby ignomwal
kornbinacje klawisty A/t+F4 (znak procenta reprezentuje klawisz Aft):
Umhamianie innych aplikacji z poziomu Excela jest bardzo przydatnq operacjq Dzi~kiniej
m o h a na pnyktad tmkhorni~Glikacjp ~ i c m o >Wce lub k t D&-owy smt wsa-
dowy. M o a a tak2e u W i c utytkownikowi dostpp do windowsowego Paneh sferowania.
Program
-- 'champ.exee
TaskID Shell (Program. 1)
If Err 0 0 Then
HsgBox 'Hie mind uruchomit apllkacjl " 1 Program. vbcritical . "8lqd"
End If
End Sub
--
a.n-
ow-
u-
i E
--
a
"
Kod VBA nie zatrzymuje sie po uruchomieniu aplikacji za pornocqfunkcji Shel 1. M6wiqc
inaczei. funkcia Shel 1 uruchamia aulikacie w s ~ o d asynchronicznv.
b Jekli za wywda-
niern k c j i She11 w proccdurze mijdujcs'ip ddatkowe ktrukcje, b&q one wykonywane
r6wnolegle z uruchornionyrn programem. Jeteli dowolna instrukcja wymaga interwencji
utytkownika (np. wyiwietla siq okno informacyjae), a aktywna jest inna aplikacja, za-
czyna migat pasek tytutu Excela
Czasami trzeba uruchornik aplikacjp za pornoq funkcji Shel 1 i zatrzyrnab kod VBA do
czasu jej zamknipcia. Mote tak sip zdanyC, jedli na przyktad uruchomiona aplikacja ge-
neruje plik kt6ry jest utywany w dalszej c@ci kodu. Chociat nie m o m wmzymaC
wykonywania kodu, rnotna utworzyk pctlp, kt6ra rnonibwuje stan aplikacji. Listing 20.2
prezentuje pnyklad kodu wylwietlaj~egoo h infoimacyjne w chwili zakoticzenia
dziabnia aplikacji mchomionej za pomocqfunkcji Shel 1.
I
i
! Rozdziat 20. + lnterakcje z innymi aplikacjami 565
Sub RunChartiapP( )
Dlm Task10 As Long
Dim hProc As Long
Dim IExitCDde As Long
Dim ACCESS-TYPE As Integer. STILL-ACTIVE As Integer
Dim Program AS String
ACCESS TYPE
STILL-~TIVE
--&ti400
W103
Program - 'Charmap.exe"
On Error R e s m Next
-
Uruchomienle zadanla
TaskID Shell (Program. 1)
-
Pobranle uchrrytu pmcesu
hPrcc OpenPmess(ACCESS-TYPE. False. Task101
I f Err 0 0 Then
MsgBox "Hie m t n a uruchuitit progrwu ' L Program. vbCritlca1. 'Blad'
E x i t Sub
End If
Deklaracjp API funkcji Shel 1 Execute zmieszczono ponitej (ten kod nalety umieicit na
pocqtku moduiu VBA):
Private Declare Function ShellExecute L i b "she1132.dll' -
Alias 'ShellExecuteA' (ByVal hWnd As Long. -
$Val 1pOperation As String. ByVal l p F i l e As String. -
ByVal lpparameters As String. ByVal IpDirectory As String. -
ByVal nShowtmd As Long) As Long
-
Dim FileNanre As S t r i n g
F i l e N m "c:\face.gifm
Call ShellExecute(0l. vbNullString. FlleName. -
vbNullString. vbNullStrlng. vbNomlFocus)
End Sub
-
D i m URL As Strlna
URL "http://&.mlcrosoft
Call ShellExecute(O&, ybNullString. M.
.cm'
vbNul1String. v b m l i s t r i n g . v b k m l ~ & u s )
End Sub
Sub S t a r t h i 1( I
-
D i m Addr As String
Wdr "mailto:bgates~tcrosoft.un'
. Call S h e l l k c u t e ( O & . vbNul1String. Addr. -
~ u l l S t r i n g .vbNullString, vbrlornalF~~us)
End Sub
Rozdziot20. e lntemkcie z innvrni a~likociorni 567
&File - 'Calc.exe'
On Error Resune Next
AppActivate "Kalkulator"
Err 0- -
I f Err 0 0 Then
CalcTaskID Shell(AppFi1e. 1)
I f Err 0 0 Then MsgBox 'Nie mtna uruchornit kallulatora.'
End I f
End Sub
J-li w mommcie wykonywania pmcedury Word by# jut uruchomiony, nastagi jego
uaktyvnienie. W instrukcji wywo4nia tej metody moma takte wykorqstak inne staie:
xlMi crosoftPwerPoint,
m xlMicrosoftMai1,
m xlMicrasoftAccess,
xlMi crosoftFoxPro.
568 CzeLe V + Zaowansowane techniki progmmowonio
Rysunek 20.2.
Za P o m W jeryka
WA motna wyfwietlid
okna dialogowe
Panelu sterowania
-
O i m Task10 As Double
A r g "rundl 132.exe she1132.dll. Cantrol -RunDLL timedate.cp1"
-
On E r m r Resune Next
Task10 She!l(Arg)
I f Err 0 0 Then
M s m x ('Nie rnotna uruchmiC aplikacji.")
End If
End Sub
Rysunek 20.3.
SkorosIyt z tym oknem
dialogowynl W j e sposdb
uruchamlanla systemowych
okien dialogowych
z poziomu Excela
Wykorzystanie automatyzacji
W Excelu motna napisat makra m d z a j q c e pracq innej aplikacji. na pnykbd Worda.
M6wiqc 4ciAlej, za pomocq makra w Excelu motna zarzqdzat sewerem automatyzacji
Worda. W takiej sytuacji Excel jest aplikacjq klienckq, natomiast Word serwerem. Motna
tet napisad aplikacjq sterujqcq Excelem w Visual Basicu. Pmces zarqdtania aplikacjq
p r n z innq aplikacj~czasami nazywa siq tqczeniern i osadzaniem obiektbw (ang. Object
Linking and Embedding -OLE)lub po prostu autornarylocjq.
Wczesne I p 3 n e wlqzanle
Przed wykonaniem dziahh z obiektem zewngnnym mlety utwonyt jego egamplarz.
Mo-a to nobiC, wykorzystujqc w z w n e lub p 6 h e w i p n i e . W i q m i e dotyczy dopa-
sowywania napisanych przez programistq wywohfi hnkcji do wtaSciwego kodu im-
plementacji funkcji.
Wczesne wiqzanle
Aby wykorzystat wczesne wbpnie, nakty utworzyC odwdanie do biblioteki obiekt6w
p o p m z wybranie polecenia TooMReferences w edytorze Visual Bmic. Na ekranie wy-
fwietli sie okno dialogowe podobne do tego, kt6rc zaprczentowano na rysunku 20.4.
Rysunek 20.4.
Dodawanle wlpblanla
do pliku
biblioteki obieM6w
Ryrunek 20.5.
Za pomocq
pmgtqdarki oblektdw
motna uryskad
informaj e
o obiektadr,
do ktdrych
zdefiniowano
odwohnia
Rozdziat 20. lnterakcje z innymi aplikacjami 57 1
P 6 h e wiqzanie motna wykonystab nawet wtedy, kiedy nie jest mana wersja aplikacji
zainstalowanej w systemie utytkownika Na pykM wykonanie ponitszego kodu spo-
woduje utworzenie o b i e h Worda (kod dziala dla irVorda 97 i wersji polniejszych):
-
Dim WordApp As Object
Set MrdApp CreateObject[~blord.Appllcatlon")
I
Funkcja Getobject a C~matsObjeat
Obie funkcje VBA GetCbject i CresteObject ~wracajqodwcbnle do oblektu, ale dzlatajq w inny sposbb.
Funkcja CreateObject sbty do twonzenia interfejsu do nowego egzemplarza apllkacJi. Nalety z niej
skorzystaf, jeieli aplikacja nie daaia. Nawet jeteli egzernplarz apllkacji zostat wczeSniej u w
chom~ony.funkcja spowoduje uruchornlenie nowego egzemplarza aplikacji. Na przyklad Ponitsta
instrukcja spowoduje uruchornienie Excela, a obiekt zwrcicony w zmiennej XLMp b@ie odwotaniem
do utworronego obiektu Excel Ao~i?cation:
Set XLApp - CreateObject("Exce1 .Appl lcation")
Funkcjq Getobject kykonystuje siq z aplikacjq. kt6ra jut dzlata, lub w celu uruchomlenia aplikacji
zjeclnoczesnym zaladowaniem pllku. Na pzyktad ponibza Instmkcja spowoduje uruchomienie Excela
i jednoczesne zatadowanie pliku Mflie.xls. ObieM zwr6cony w zmiennej XLBook bedzie odwot*
niem do obiektu Workbook (pllku Mflle.xb).
Set YLBook - GetObject('C:\Pyffle.xls-)
Ofice 2003. Jeteli Worda 20Y12 utytkownik Wordem 2003, funkcja CreateOb-
ject ( "Word. Appl i c a t i on" 1 dalej bpdzie dzialat prawidlowo, c h d tym razem btdzie
odwolywaf sie do nowej aplikacji. Jeteli jednak usuniemy Worda 2003, wykonanie
funkcji CreateObject("Word.Appi 1cation.ll'), w kt6rej u y t o nazwy syrnbolicznej od-
powiadajqcej Wordowi 21003, nie powiedzie sip.
W oclu automatyzacji aplikacji pakietu Wce zaleca sig wykorystanie wczesnego wiqzania
i odwola~Ido najwczefniejszej wenji produktu, kt6rq jak siq spodziewarny, jest zainsta-
lowana w systemach klienckich. Jeteli na przyklad chcemy wykorzystak automatyzacjq
dla Worda 97, Worda 2000, Worda 2002 oraz Worda 2003, w celu zachowania zgodnofci
z wszystkimi caerema wersjami powinniimy wykorzystaf bibliotekp typu Worda 97.
Oczykikie omacza to, t e nic bedzie mo*a wykonystad wlaSciwoSci nowszych wersji
Worda.
-
Dim WardPpp As Oblect
Set UomlApp CreateObject~"Word.Ppplication')
MsgBox Wordnpp. Verston
brc!App.Puit
-
Set MrdPpp Nothing
End Sub
Rozdzial20. + lnterokcje z innymi aplikacjomi 573
a@ ObleM Words utwomny w te] prowdune bedzle nlewldoczny. Aby zobac* oblekt
v czasic, kiedy sq r nlm wykonywane dziatania. nale2y usfs*lejego wlakIwO5~
Visible na wart056 True tak, jak pokazano ponlte):
WordApp.'Jisible - True
Rysunek 20.6.
Word automatyunie
generuje trzy notatki
na podstawie danych
zapisanych w a r k u m
Excela
Sub MakeNmsO
Pnxedura tworzy notatki w WDrdrte za pamcq e c h a n i w a u t w t y z a c j i
Dim ~ordAppAs Cbject
Oim Oata As Rang?, rnessage Pis String
Dim Recwds k Integer. i k Integer
D i m Regim As Strlq. SalesPmt As Strlng. S a l e s W km 'String
574 Czqft V + Zoowonsowane techniki progromowania
-
a
Uruchmienle Worda 1 utworzenie obiektu (pbfne wipzanie)
Set WordAw CreateObject( "Word .Appl l c a t i on")
--
Infornacje z artusza
Set Data Shects("Arkuszl').Range( "Al")
Message Sheets("Arkusrlm) .Range("Notatka")
--
a
Przetwarzanle w p e t l t wszystklch re0rdt.w w arkuszu Arkuszl
Records Application .CountA(Sheets( "Arkuszl") .Range('A:A")
For 1 1 To Records
Appllcation.Status8ar -
Aktualizacja i n f o m c j i o posteple zadanla na pasku stanu
'Przetwarzanle rekordu ' & 1
--
Przyplsanle bletqcych danych do niennych
Region Oata.'Cells(l , l).Value
-
SalesNun Data.Cells(1. 2).Value
S a l e s h t Format(hta.Cells(1. 31.Value. "U.000")
-
Okreilenie nazwy p l l k u
SaveAsName ThlsWorkbook.Path h "\' & Region & ".doc"
Wslanle polecerl do M r d a
With WordApp
.Oocmnts .Add
--
With .Selection
.Font.Slze 14
.Font.Bald True
.ParagraphFornat.Al lgment 1 -
.TypeText Text:-'N 0 T A T K A'
.Typeparagraph
.Font .Size -
.Typeparagraph
12
-
-
.ParagraphFonnat .A1 lgrnnent 0
.Font.Bold False
.TypeText Text:-"Oata:" & vbTab 1 -
Format(Date. "d m.yyyy')
.Typeparagraph
.TypeText Text:-'0o:' & vbTab h 'Menedter ' b vbTab & Region
.Typeparagraph
.TypeText Text:-"Cd:" 1 vbTab h -
Appllicatlon.UserName
.Typeparagraph
.Typeparagraph
.TypeText Mesrage
.Typeparagraph
.Typeparagraph
.TypeTex: Text:-"Sprzedanm jednostek : " I vbTab h SalesNun
.~~h~aragra~h
.TypeText Text:-"Kwta:' & vbTab & -
FomttSalesPmt. "#.#O z?")
End K i t h
.
ActtveDocunerh.SaveAs F1leNae:-SaveAslame
End With
Uext i
Zniszczenie obiektu
Word@.Cult
I Rozdzial20. lnterokcje z innymi oplikocjomi
I
575
1 .
Set WardApp - Nothing
I + ~ d t h ~ r z e n lpaska
e stanu
Applica:ion.StatusBar "" -
M s g h x Records & " notatkl utwrzono I zaplsano u " & -
ihisWorkbook.Path
End Sub
I
I
Dntr 5 mnrca. 1004
Do Menedzer Region1
I Ckl Radek hfeq-k
II Rysunek 20.7. Ten dokument Worda zosttil uhvorzonyza pomocg procedury acela
Ten wad jest dosepny na plycle CD-ROM dolgczonej do ksl@l. Nie naleiy jednak
urucharniad pmedury bezpaSrednio z m,.
W kodzie jest wykonywana prdba zapisu
do katalogu, w Mdrym majduje sie skoroszyt Excela.
Listing 20.4 prezentuje proceduq umieszczo~w module VBA dokurnentu Worda 2003.
Na podstilwie istniejyego skoroszytu procedura twony obiekt Excela Worksheet, ktorego
nanva syrnboliczna to Excel .Sheet.
'
StartVal --
Zapytanie o dane wejiciowe
InputBox("Wartost poczqttowa?")
PctChange
PctChange - InputBox("Procentowa miana?")
PctChange / 100
- -
Utwrzenie obiektu Sheet
Mboaa: ThisDocument.Path 8 "\progmzy.xls'
Set XLSheet GetObject[Wbook. 'Excel .Sheet") .Activesheet
--
' Lmieszczenle w a r t o i c i w arkuszu
XLSheet .Range('WartoscPocz") S t a r t V a l
XLSheet .Range( 'PctZmlana') PctChange
Xisheet .Calculate
--
' Vstarienie naglhka strony
blect1on.Font.Size 14
Selection.Font.Bold True
Rozdzial20. * Interakcjez innyrni aplikacjami 577
~ ~ y 'd
Selectton.TypeText " n l e ~ l wzrost:
Fomt(PctChange. "0.0%")
-
Selection .Typeparagraph
Selection .Typeparagraph
'
Skopiowanie danych z arkusza 1 wklejenie i c h do dokumentu
XLSheet . Range( "Dane") . m y
Selectlon.Paste
-
Znl szczente obiektu
Set XLSheet Nothing
End Sub
Rysunek 20.8.
Ten arkusz
wbwtuJe
procedura VBA
w Wordzie
Ryrunek 20.10.
Informa@ zapisane
w tyrn arkuszu
sq wykonyswane
w wiadomodciaeh
m a i l programu
Outlook Express
Usting 20.5. b+)sybnie wlaUomJcl email Outlooka z pozlomu Exceia
Sub SendEmai1( 1
Wykorzystanie wczesnga wipanla - w g a odwtania do biblioteki miektbw
Outlooka
D i m OutlookPpp As 0utlook.Agplicatlon
D i m M I t m As Outlook.tiailItem
Dim c e l l As Range
Dlm Subj As String
Dim EmatlMdr As Strlnq
Dim Recipient As String
Dim Bcnus As String
Dim Msg A5 String
-
U*rorzenie oblektu Outlooks
Set W l o o k & ~ p NRI &itloot .&PIIcation
- -
Recipient c e l l .OffsetlO, -1) .Value
Emai lAddr cell .Value
Bonus Formt(cell.Offset(0. l).Value. "0.000 21")
--
Utworzenie tekstu w i a d m i c i
Msg "Szanwny(a) Pan(i) ' 8 Recipient 6 vbCrCf & vbCrLf
--
Msg Msg 8 "2 przy:emno$cia zawiadarniarn. ze Panaci) raczna prmia
Msg Msg 8 Bonus & vbCrLf & vbCrL:
WyCGSi"
-
Msg Msg 8 "Wieslaw RbZahski" A vhCrLf
Msg Hsg & "Prezes zarztdu"
-
Utworzenie wiadomofci e-mail 1 j e j nys?an'o
Set MItm CutlookApp.CreateIterntolYa?l [tern:
With MItm
-
EmailAddr
.To
.Subject
.Body Hsg
.Send
-
Subj
End Ui tb,
End If
Next
End Sub
Kod ustawia wtaiciwofci To, Subject oraz Body, a nastepnie wykonystuje metode Senc
w celu wyslania wiadomofci.
-
Src = Src & "and Oddzial -
Src "SELECT FROM Budtet WHERE Pozycja
'Pmeryka Pln"
-
'Dziertawa' '
Zapisanie n a m p-57
-
For Col 0 To Recordset .Flelds.Caunt
Range("Al').Offset(O. Cal).Value --- 1
-
Connection. Close
Set Connection Nothing
End Sub
' a
M
Ten pnyklad wraz z bazq danych Accessa jest dostepny na plycle CDROM doiqczonej
do kslqtki.
Sub SendOneShcet( )
-
Dim Filename k String
F t l e n m "m6j p l i k . x l s "
ActlveWortbook .Worksheets("Arkuszl") .Copy
Act IveUorkbwk .SaveAs Filename
ActlveWorkbook.Sendtiai1 'jankowalstt@jakasdenena.cam". 'M6j arkusr'
ActIveWorkbook .Close False
Kt11 Filename
End Sub
Kod wysyla kombinacjg klawiszy Aft+ Y (znak pmcenta reprezentuje klawisz Aft), a po
niej klawisz S. Opis metody SendKeys majduje sig w systernie pomocy Excela %tam
informacje na temat sposobu p m y l a n i a niestandardowych ciag&w klawiszy, jak na
przyktad kombinacji z klawiszami Alt lub Ctrl.
- -
Pobranle danych
Subj 'Roczna p r m i a "
- -
Recipient c e l l .Offset(O. -1).Value
EmailAddr c e l l .Value
b n u s F o m t ( c e l 1 .Offset(O. 1) .Value. "0.000 z l " )
--
Utworzenie wladomobcl
Msg 'Szanowny(a) Pan(i) " & Recipient & "ZOA"
Msg Msg & "40A" & "2 p r z y j m o s c i a zawiadamiam.
--
Msg = Msg & "Ze Pana(i ) roczna premia wynosi "
Msg Msg & Banus & '. XOA"
-
Msg Msg & "ZOA" & "Wieslaw R6tadski'
Msg Msg & "XOA" & "Prezes zarzadu"
---
Utworzenie hiperlacza
HLink "mailto:" & EmailAddr & "?"
HLink HLink & "subject-' 8 Subj & '&"
HLink HLink & "body-" & Msg
Uyslante wladamSc1
ActiveWorkhook.FollowHyperlink HLir,k
Applicatton.nait (Naw + iimeYalue("3:00:02'1)
SendKeys "Xs". True
End If
Next
End Sub
Rysunek 20.12.
lnfomacje zapisane
w tym arkuszu
53 wykorystpane
w w/adornoSuUach
m a i l programu
~utlookExpress
W p r o c e d w e SendGmi 1 zalotono, 2e Ou1look Express jest domySlnym k l i e n t e m pcm.
Proosdura ~rzehKanaw ~etli .
. wiersze w arkuszu i twm wiadomdt (zaoisana
. . w miennei
Msg), D o oiwarcia okna Nowo windomoi6 prograrnu ~ u k m kErpress ~ y k o ~ s t y w a jest
na
metoda Fol IckMyperl ink. W pnypadku pierwszega rekordu hiperbm b@ie nastvujqce:
m a i l to:jjasinskihjakasdmena .pl?subject-Rocm premla
Ibcdy-Szancwny(a) ? a n ( i l Jan Jaslhski%OAXDAZ przyjemno5clq zawiadaniam.
l e Pans( i) mczna premia wynosi 2 000 z?. XOAXOPWaldemar RbiafisklfOkPrezes zarzqdu
Procedura zabzyrnuje sic na dwie sekundy, a potem za poma'q metody SendKeys wysyla
polccenie Alt+S, ktbre umicszcza wiadomolt w skrzynce nadawczej Outlooks. Przenva
jest potrzebna, aby uzyskat pewnolt, t e w czasic wysylania kombinacji klawiszy wia-
domoSC znajduje sit na ekranie. Opbfnienie h-zeba dostosowat do indywidualnych wla-
sciwoSci systemu. Czasami wystarczy opjhienie jednosekundowe, a innym razem b@zie
uzeba zastosowat opbinienie pmkraczajqce dwie sekundy.
Rysunek 20.13.
W tej wiadornoScl
progtamu
Outlook &press
wykonystano dane
zauisane w arkuszu
Tworzenie
i wykorzystanie dodatk6w
Jednq z wlaSciwoSci Excela, kt6ra najbardziej pnydajc siq programistom, jest motliwdf
tworzmia dodatkdw. Wprowadrenie dodatkbw sprawia, t e aplikacje stajq sic bardziej
profesjonalne. Ponadto niekiedy dodatki majq przewagp nad standardowyrni plikarni
skorosqt6w. W tym mzdziale om6wiq kornici wynikajqce ze stosowania dodatkdw otaz
pokat9, jak tworzyk wlasne dodatki, poslugujqc sip wyltpznie wbudowanyrni narzc-
dziami Excela.
Czym sq dodatki?
Og6lnie nta b i w dodatki q mechizmami, kt& wzbagacajqarkurze o nowe wlahi-
wofci funkcjonalne. Na przyktad pakiet Annbsis ToolPak, jeden z najpopulamiejszych
dodatk6w dostarczany z Excelem, umotliwia wykonywanie obliczeri statystycznych
oraz analitycmych, kt6iych standadowo nie ma w Excelu. N i e b dodatki (m.in. daSnie
, ToolPnkl dosarctaia.hnkcii
Analvsic ., arkusza ktbre m o h a stosowaf w formulach. Nowe
wl&ciwoSci nvykle d o b m integrujq sip z oryginalnym interkjscm i utytkownik odnosi
m e n i e , t e q czeciq pmgramu. Cechp te okreSla siq jakoprzevoczystq integ~acje.
,:*WU
a A*.
OomySlnle dodatkl maJqrozszerzenie .xla. Nle jest to obowiazkowe. Plikowi dodatku
rnotna nadaC dowolne rozszerzenie.
DadatW COM
Excel obs)uguje takie dodatkl COM (ang. Component Object Model). Plikl te rnajq rozszerzenia .dl/
lub .exe. Dodatek COM m t n a naplsad w taki sposdb, i e W z i e ddataC z wszystkirni aplikacjami
pakietu Office,ktdre obsbgujq dodatkl. Poniewat kod dodatkdw COMjest skornpilowany, stosujac
je, uzyskuje sie wiekszy podom bezpieczefistwa. W odrdinieniu od dodatk6w XLA, dodatki COM nie
mogq zawierad. arkuszy lub hykresdw Exceia. Dodatki COM rnotna twortyd za pomocq jezyk6w
Visual Basic 5 (lub wersji nowszych). Visual Basic .NET lub za pomocq pakietu Office w wydaniu
Developer. Doktadne omdwienie tworzenia procedur COM wykracza poza ramy niniejszej ksiqiki.
&
"* Katdy tworzony dodatek zawiera rnakra. ale w rnomencie otwlerania skoroszytu
(83, (w przypadku ustawienla Sredniego poziornu zabezpleczefi) nie jest wyswietlane
ostrzetenie o rnakrach. Jeteli zainstalujemy dodatek, uiytkownik nie zobaczy komunikatu
ostrzeienia, o ile dqczyrny opcj? Ufaj wszptkim zainstalowanymdodatkom iszablonorn.
Opcje tq motna znalefC w zaktadce Zaufani wydawcy. Aby uzyskaC dostep do tego
okna, naleiy wybraC polecenie Namdzia/Makro/Zabezpieczenia.
Rysunek 21.1.
Okno dlalogowe
Dodatki
Tworzenie dodatk6w
Jak wspomniatern wczelniej, dodatek motna utworzyC z dowolnego skoroszytu, ale na
przykhd skoroszyt, ktbry zawiera tylko arkusze, niabyt sip do tego nadaje, poniewat po
przeksztalceniu arkusze bedq u m e . Motna jednak napisat kod. ktory skopiuje wsystkie
c&ci arkuszy z dodatku do widocmego skoroszym. Najwigej moma zyskat. przeksztai-
-
cajqc na dodatek skoroszyt. kt6ry zawiera makra szczegblnie makra uniwenalne.
Utworzenie dodatku na podstawie skoroszytu jest proste. Czynnoif tp opisuje ponitsza
procedura:
1. U w 6 n aplikacjp i s p r a w e czy wszystko dziak Nie zapomnij, 2e nalety zapewnit
spos6b wykonywania makra lub rnakr w dodatku. W tym celu m o a a utworzyf
nowe menu, nowq pogcje w menu albo pasek narzwi. Szczeg&owe inforrnacje
o twomniu indywidualnych menu majdujq siq w rozdziale 23., natorniast
w rozdziale 22. opisano sposbb tworzenia indywidualnych pask6w narz*i.
2. Przetestuj aplikacjg wykonujqc jq w czasie, kiedy jcst akrywny inny skoroszyt.
Z uwagi na to, t e dodatek nigdy nie jest aktywnym skoroszytem, w e to symulacja !
dziatania aplikacji po przeksztatceniu na dodatek. !
I
3. Uaktywnij edytor Visual Basic i w y b i n skoroszyt w oknie Project. Wybierz
polecenie Tools/xx~Properties, a nastqpnie kliknij zakladkp Protection. Zaznacz
pole wyboru Lock Projecrfor Viewing i wprowadi haslo (dwukromie). Kliknij OK.
Ten krok jcst wymagany tylko wtedy, kiedy chcesz zablokowaf mokliwosC
przcglqdania m a k lub modyfiowania okien UserForn przez innych ~tytkownik6w.
i
4. Ponownie uj-i Excel i w y b i m polecenie P l i ~ a C c i w d c ikliknij
Po&umowanie i wprowadk nvipzky, opisowy tytui w polu tytuh oraz d h z y
,
opis w polu Komentarze. Ten k o k nie jest wymagany, ale dzipki niernu koqstanie
z dodatku jest latwiejsze, gdyt w oknie dialogowym Dodutki wygwietla sie
zakladke
i
opisowy tekst.
-
na pzyklad skoroszyt zawlera wytgCznie arkusze wykresdw IUD ahusze dlalog-
Excela 5/95, opcja Dodatek prugrarnu MicrosoffOMce heel w oknie dialogowym
ZapisywanieJako nle pojawl sle.Opcja ta bedzle aktywna tylko wtedy, gdy polecenie
Zapisz jako zostanle wybrane przy aktywnym ark.uszu.
Przyktadowy dodatek
W tym podrozdziale orn6wip czynnoici, jakie nalety wykonat, aby utworzyt W e c z n y
dodatek. W prykladzie wykorzysmo mrqdzie Operacje reksrowe opisane w rozdziale 16.
Wersja XLS naredzla Operacje tekstowe jest dosepna na W e CD-ROM dotqczonej
do ksiwi. PlIk ten mobla wykonystat?w celu utwomnla opisanego ponitcj dodatku.
Testowanie skoroszytu
uiytego do utworzenia przyktadowego dodatku
Prred pNksztaIcmiem skoroszytu na dodatek nale2-y go pmestowat. Aby zasymulo-
wat d z i a h i e skomszytu jako dodatku. nalety go testowat wtcdy, gdy inny skorosw
jest aktywny. Nale* parniptat, t e dodatek nigdy nie jest aktywnym skorosrytem, zatem
takie postqxwanie pomote zlokatizowaf potencjalne problemy, jnk na pnyktad nie-
prawidtowe odwolania do obiektu Thisklarkboct.
590 Cz46 V Zaawansowone techniki programowania
Rysunek 21.2.
Za pomocq
okna dialogowego
WlaSciwoSci motna
wprowadzid opis
twononego dodatku
W polu Tyful nalety wprowadzid tytuf dodatku. Ten tekst wyfwiatli sit w oknie dialogo-
wym Dodarki. W polu Komerrlarze nakty wprowadzit opis, ktbry wyiwietli siq w dolnej
cqSci okna Dodatki, jeteli dodatek wstanie wybrany na lifcie.
Uiworzenie dodatku
Aby uhvorzyt dodatek, wykonaj nas$pujqce czynnofci:
1. Uaktywrrij edytor Visual Basic i w oknie Project wybien skoroszyt, kt6ry chcesz
przeksztatcif na dodatek.
2. Wybierz polefmie Debug/Compile. Ta czynnoW wyrnusza kompilacje kodu
VBA o m pozwala m a l e i t i poprawit bfqdy syntaktycme. Podczas zapisywania
skoroszytu jako dodatku, Excel utworzy dodatek nawet wtedy, gdy zawiera bir;dy
syntaktycne.
3. Wybierz polecenie TmWm Properrfes,aby wySwitlit okno dialogowe wlafciwoSci
projektu (mrepnzentuje nazwe projektu). Kliknij zaktadke Genmd i wprowadt
now4 nazvq projektu. DomySlnic wsqstkim projehom VB jest nadawana nazwa
VBProjecr. W pfemtowanym pnyktadzie name projektu zmieniono
na OperacjeTekFroweVBA.Ta czynnoic nie jest obowiqzkowa, ale zalecana.
Rozdzial21. + Twonenie iwkorzvstonie dodatkbw 59 1
lnstalowanie dodatku
Aby uniknqb pomylek, przed instalacjq dodatku utworzonego na podstawie skoroszytu
XLS nalety zamkng ten skoroszyt. W celu zainstalowania dodadru wykonaj nastepujqce
czynnoici:
1. Wybierz polecenie Nan?dzia/Dodatki.WySwietli siq okno dialogowe Dodatki.
2. Kliknij przycisk Pceglqduj i odszukaj dodatek, kt6ry w4ahie utworzylei.
Odnaleziony dodatzk wykwietli sig na liicie dodatk6w w oknie dialogowym
Dodatki. Jak pokazano na rysunku 21.3, w oknie dialogowym Dodatki wyiwietla
sic rowniet opisowa informacja, kt6q wprowadzilei w oknie dialogowym
WlaSciwojci.
Rysunek 21.3.
Okno dialogowe
Dodatki
z zamaczonym
nowym dodatkiem
Po otwarciu dodatku Operacje teknowe, w menu Nmp&iu wyhvietli sig nowa poycja.
Sej wybranie spowoduje wchomienie procedury StartTextTcal zdefiniowanej w dodatku.
Dystrybucja dodatk6w
Utworzony dodatek m o h a udoqpnid innyrn utytkownikom, dajqc im kopiq pliku XLA
wraz z instrukcjq instalacji (wersja XLS jest im niepotnebna). Po instalacji w menu Na-
tzqckia pojawi im s i nowa
~ pozycja: Operacje t e k t e . Je2eli zablokowaliSmy plik za
pomocq hasla, utytkownicy niemajqcy hasta nie b d &mogli przeglqdat lub modyfik*
wad kodu.
Modyfikowanie dodafku
Aby modyfikowat dodatek, nalety go otworisyt i odblokowat. W celu odblokowania .
nalety uaktywnit tdytor Y i d Basic, po czym dwukmmie k I W C n a m e pmjekfu w o h i e
Project. Wyiwietli sig pytanie o haslo. Po podaniu wWciwego hash nalegr wprowadzic :
poprawki, a nastepnie zapisat plik w e d y t m Visual Basic, wybierajqc polecenie File/Save.
*
Rozdrlat 21. Tworzenie i wykorryrtonie dodatkbv 593
Rysunek 21.4.
Przeksdakanie
dodatku
w mykw skams@
Z kolei ponitsza p@la For . . . Next spowoduje wytwietlenie dodatku Myuddin.xlcr pny 1
zaloteniu, t e dodatek ten wyhvietla s i w~ oknie dialogowym Dodafki Excela: 1
For Each a i n Apglication.PddIns
MsgBox a. Name
Next a
-
For Each Win I n AetlveWorkbook.Windcws
Win.Visible False
Next Win
Pliki dodatk6w nigdy nie sq widacme i oficjalnie nie posiadajq okien, pomimo tego. .te
zawierajq niewidocme arkusze. W efekcie nie pojawiajqsiq na lidcie okien po wybraniu
polecenia Okno. Nawet jdli skoroszyt Myoddin.xlo jest otwarty, ponitsza instrukcja
zwrdci zawsze wartoif 0:
MsgBox Workbooks("Myaddin.xlam) .Windows.Caunt
Jeteli dodatek jest onvarty, motna uzyskat dostep do jego arkuszy z poziomu kodu
VBA w taki Sam sposbb, jak do arkuszy zwyktego skoroszytu. Poniewat jednak pliki
dodatk6w nie nale4 do kolekcji Workbooks, do dodatku motna odwolywaf siq wytqcz-
nie na podstawie n a y , a nie na podstawie nurneru indeksu. Zaprezentowany ponitej
przyklad wyiwietla wartodd z kom6rki A 1 pienvszego arkusza w pliku Myoddin.xla
(pny zaloteniu, t e jest otwarty):
MsgBox Workbodts('Myaddin.xla").Worksheets(l).Ranget"Al').Value
Jeteli dodatek zawicra arkusz, ktbrcgo zawartoM chcemy wySwictliC, motemy go sko-
piowad do otwartego skoroszytu albo utworzyk nowy skoroszyt i zapisad w nim arkusz.
Na przyktad ponhzy kod kopiuje pienvszy arkusz z dodatku i urnieszcza go w aktywnym
skoroszycie (jako ostatni arkusz):
Sub C o p y S h e e t F d d i n ( 1
D i m Addinheet As Worksheet
- -
D i m Nunsheets As Long
Set Addinsheet Workboaks("Myaddin.xla").Sheets(ll
Nunsheets AetiveWorkbook .Sheets ..Count
Addi nSheet .Copy After :-ActiveWorkbook .Sheets(NumUleets)
End Sub
'%
:- Jeteli mamy n a w pmedury w dodatku. rnotemy bezposrednio wpowaddC ja w oknie
dialogowym Mahro i kliknqC Umchom w celu jej wykonania. Procedury Sub naleiy
urniescie w og6lnymmodvle VBA, a nie w module kodu obiektu.
Podglqdanle m b e z p i s ~ g doddku
o
Okno dialogowe Makm nie wygwletla nazw procedur zawartych w dodatku. Co zatem oobib. jesli
chcemy uruchomib takq procedurg, a dodatek jest zabezp[eczony I nle motna prreglqdaC kodu.
aby poznaC nazwy procedufl Nalety wykorzystad pneaqdark? obiektbw!
Najpletw wybierz polecenie N&zla/Dodathl, aby zainstalowad Knrator odmSnikdw. Jest to d ~ +
datek razprowadzany z Excelem. Jest zabezpieczony. a zatern nie nnotna przeglqdad jego kodu.
Potem wykonaj nastepujqce czynnoSci:
1. Ua-ij edytor Wsual Basic i wybierz projekt Lookup.xla w oknle Project.
2. WciSnij F2,aby uaktywnlC przeglqdarkg obiekt6w.
3. Na romijanej likie biblldek wyblerz pory~jqLoohup. WySwleUq slg wsrystkie klasy apisane
w dodatku Loohup.xla, jak pokazano na poniiszym rysunku.
4 Zamacz kilka pazycJi na IlScle Classes, aby przejrzd skladowe zawarte w tych klasach.
W pnyk+adrlezap.ezentowanym na tysunku Wasa Lookup-Comn jest d u l e m , a jej skladowe to
nazwy nniennych, stalych, procedur I funkcji. Wydaje siq. te pmcedura DoLookupCmnd uruchamia
kreator. Aby sprawdzlt tg teorle, nalety uaktywniC Excel, a nastepnie wybraC polecenie NanWa/
Makro/Makm. W polu Nama makra w p i d GoCockupCmnd i kliknqf Urvdnmr.Z pewnoblq yswietli
sle p i m z e okno dialogowe kreatora odnolnlkbw. Majqc takie inforrnacje, moterny napisat kod
VBA uruchamlajqcy kreator odnognik6w.
Natorniast jdli funkcje zapisano w pliku dodatku, kt6y jest otwaty+motna pominqk
odwdanie do pliku i skofzystak z insimkcji o nastcpujgej sktadni:
-MOIAVG(Al:P50)
Kolekcja Addlns iI
Kolekcja AddIns &era wszystkie dodatki, o kt6rych Excel posiada infonnacje. Mogq
to byt zar6wno dodatki zainstalowane, jak niezainstalowane. Skladowe kolekcji AddIns
rnotna wy3wietlit w oknie dialogowym Dodatki, wybierajqc polecenie Nmeh-ia4hfatki.
Zainstalowane sqte dodatki, dla k t w c h tamaczono pola wyboru. I
Pliki dodatk6w sktadajqce sip na kolekcjp AddIns rnotna zapisat w dowolnym miejscu.
Excel utnyrnuje list? niekt6rych spdr6d tych plikbw wraz z ich lokalizacjq w rejestrze
Windows. W przypadku Excela 2003 Ma tajest pnechowywana w nastppujqcej lokalizacji:
I . ObcelMdd-in Manager
HKEY-CURRENTNTWSERISofime\MiwmoJ\~cell
Do przegl%daniatcgo klucta rejestru motna wykonystaC sdytor rejesbu (regedit.exe).
Standardowe dodatki dostarcme wraz z Excelern nie sq wymienione w tym klucur rc-
jestru. Ponadto pliki dodatkbw zapisane w )catalogu podanyrn ponitej bqdq wyrnienione ,
I
ReJestr Windows m e uaktualnlony ty(ko wtedy, kiedy Excel zostanle poprawrile
@* nrnkniety. MI1 pnylarzy slq awa)a, namy wymuadzmFh dodatklw nle zostanq
zapisane w rejestrze, a zatern po ponownym uruchomieniu Excela nie bgdq czgSci4
kolekcjl AddIns.
Rozdzid 21. Tworzenie i wykonystonie dodatk6w 59.9
Irtnym sposobem usunivia dodatku z kolekcji AddIns jest usunipcie, przeniesienie lub
miana nazwy pliku XLA dodanku. W takirn p n y p d h prry nas&pnej prbbie zainstalowania
lub odinstalowania dodatku uryiwietli siq ostrzetenie podobne do tego. kt6re pokazano
na rysunku 21.5.
Rysunek 21.5.
Jeden ze sposob6w - m r a r ~ d ~ ~ l a + . p r ~ r p -
usuniwa elementu 2) -bn-- ~l-*~m:
kolekcji Addlns
obiektu Addln
Wla~ciwo~ci
Obiekt AddIn to pojedynczy element kolekcji Mdlns. Aby wyiwietlit n a n q pliku pienv-
s z e g elernentu kolekcji AddIns, motna wykonystat nastcpujqcq instrukcjq:
Hsgbox Addlns(1) .Nam
Waiciwo3i Name
Nazwa pliku dodnku. Jest to wlaSciwoi6 tylko do odcEytu, a zatem nie rnotna zmienic
namry pliku popnez jej modyfikacjq.
WlaiciwoSC Path
Nap@ i f c i e k a d o a p u do p l h dodatku. Nie zawiera ostatniego ukoJnika i nazwy pliku.
WtaiciwoS&Fullname
Napqd i hie* dmtgpu or= nanva plku dodapku. WWciwoSC jest nadmiarowa, po-
niewa2 infwmacje te m o m odcqtai: t a k e z wkSciwcrSci Nam i F'zth. Poni- dwie
instrukcje powodujqwyiwietlenie dokladnie takich samych komunikat6w:
600 CzefC V + Zoowansowane technikl prograrnowania
-
Opisowa n a m a dodatku whkiwo3t ukryta. Jej wart&&jest tekstem, kt6ry wy4wietla
sip w o h i e dialogowym Dodatki. Jest to wlaSciwob5 tyke do dcytu. Jedynyrn sposobcm
dodania lub modyfikacji wlaSciwoSci Title jest skonystanie z polecenia PliffWtaiciwdci
(nalety kliknqt zakladkp Podrumowanie i wprowadzit tekst w polu Tyml). Tego pole-
ccnia menu m o h a u Q C tylko dla pliku XU,p m d pprzeksztakeniem go na dodarek.
Zanvyczaj d o s t ~ pdo elementu kolekcji uzyskuje sip popraz jej wlafciwoSt Name. Ko-
lekcja AddIns jest pod tym wzgledem nieco inna. w tym celu wykorzystuje wldciwoSt
Title. W ponizszym przykladzie pokazmo sposdb W w i a l e n i a nazwy pliku dla do-
datku Anulysis ToolPak (tm. analys32.xlC) na podstawie w ~ i w v o S c iT l t l e , kt6ra ma
wartoft Analysls TgolPat:
Sub ShnrNznW)
Msg8ox AddIns('Ana1ysl s ToolPak") .Name
End Sub
Wtafciwo46 Comments
W tej ukryrej wMciwo4ci jest zapisany tekst, jaki wyhietla sip w oknie dialogowym
Dw'arki po mzmczeniu ohflonego d o d a h Wtdciwo56 -s jest rylko do odczytu.
Jedynym sposobem jej modyfikacji jest wykonystanie o h dialogowego Wlas'ciwaici
pned pmksztakcniem skoroszytu na dodatek Komentam mogq mieC dlugoOC do 255
makbw, ale w oknie dialogowym wyjwietla sip tylko okolo 100 mak6w.
W l c ~ k i w o KInstalled
W M i w o J t Installed ma wart&& True, jeeli w okllonyrn momencie dodatek jest
zainstalowany -tm.zaznaczony w oknie dialogowym Dodutki. Ustawienie w!dciwoSci
I n s t a l ?edna wartoe True powoduje otwarcie dodatku Ustawienie jej na wartoif Fa1se
powoduje zamlaiiwie dadatku. Ponitcj p o h o przyklad sposobu instalacji (a tym samym
otwarcia) dodatku Anabsis ToolPak za pomocq kodu VBA:
Svb Instal lATP()
nddIns['Analysl s ToolPak'l.
E*.d 41b
Installed - True
Gdy p d w a mstanie wykonana, w o h i e dialogowym W k i pole wyboru obok namy
dodatku Analysis ToolPak b&ie zaznacmne. Jeteli dadaak zainstalowano w c d n i e j ,
ustawienie wlaSciwoSci Instal led na wartoSC T r ~ nie
e przpiesie tadnego efektu. Aby
usunqC dodatek (odinstalowaf go), wystarczy ustawit whSciwoSC Instal led na wartosf
Fa 1 se.
-
Dim Msg As String
Count 0
For Each Item I n AddIns
-
[ f [ten.I n s t a l led Then Count Count + I
--
Next I t e n
nsg 'Dodatkbr: " d AddIns.Count & vbCrlf
Usg Usg & "Zatnstalmanych: " h Count
UsgBox Hsg
End Sub
Count 0 -
Dim Item As Pddin
- -
I f 1t~em.InstalledThen
Item. Installed False
Count Count + 1
End I f
Next [ten
HsgBox 'Odinstalcuano ' b b u n t L ' dodatkbw."
End Sub
Aby pnekonat! slq, cry okreSlony skoiosryt jest dodatkiem, wystarczy sprawdziC
wartog wta5ctwofci IsPddln tego skorosrytu. Nle jest to w+aSdwoSCtylko do odczytu.
a zatem ustawlajqc WaWIvoSC IsAddln na wart086 T m , rnotna takte przeksztalcif
-
skoroszyt na dodatek. I odwratnie popmz ustawiertie W i w o f c l IsAddin na wartog
False moaa przekztatcil dodatak na skorosryt Po wykonaniu tej czynnokl arkusze
dodatku bedq widawne w Excelu nawet wtedy, kledy pojekt VB dodatku jest
zabezpieczony.
'a> lnnq metodq pomlaJgcqzmnlejszyC romiar pliku jest ]ego zaplsanie w formacie
WML. Nast?mle nalrly otworzyc?plik H T l i ponornic zapis& w formacic XL.5,
Czasami ten sposbblhst skutecmy. m a , ie uryskany plik ma mniejsze rozrnlary.
ale sq tet sytuacje, kiedy pllk po wykonaniu opisanej operacjl jest nawet wi9ks.q
od orypinalnego.
Problemy z dodatkami
Dodatki to Swietny mechanizm, ale tak, jak w tyciu: nie ma nic ta d m o . Dodarki nawiajq
p m d programisQ okreflone wynvania. W tym podrozddale opisq kilka problemow,
kt6re pro-mrnista musi ronvigC, jetli chce tworzyt dodatki dla szcrokiego gmna urn-
kownikdw.
Rysunek 21 -6.
Prdba niewla9dwego
owarcia dodatku
powoduje
wy3wieUenle
takiego komunikatv
Listing 2 1.1 prezentuje modut kodu dla obiektu ThisWorkbosk z tego pnykladu. Procedura
w-ykonystuje fakf ze dla skoroszytu zdartenie PudInInstal? wyst~pujepned zdarze-
raiem Open.
End Sub
-
P r i v a t e Sub 'MorCbook-AddinInsts110
I n s t a l ledproperly True
P r i v a t e Sub LJortbook-Cpenc)
D i m Msg As S t r i n g
i f InstalledDtoperly Then ~ x i Sub
t
Msg 'my otworzyt ten p l l k . skorzystaj r polecenla Narz@zlalDodatki .'
Hsghx Msg. vbInfonnation. This~rktmok.Nw
Thi ~WOrkbook.Close
End Sub
-
Jefeli dodatek zostal prawidtowo zainstalowany, wykona sip procedura Workbook-
AddinInstal 1. Pmcedura ustawi miennq Instal ledproper1 y typu Boolean na wartoif
True. Je2eli dodatek otwarto za pomocq polecenia PliffOfwdrr, procedura Workbook-
AddinInstall nie wykona sic, a zatem zmiema Instal 1edProperly tydzie miah domyilnq
wartoff (Fa1 se).
Podczas wykonywania pmedury Workbook Open nastepuje sprawdzenie wartoki zmiemej
Instal ledproperly. JeZeli imienna ma war ti^^ Tme, procedura konczy dziahie. W innym
przypadku kod wyfwietla inforrnacjp o tym, w jaki sposdb n a l e g prawidtowo zainsta-
lowac dodatek i plikjest zamykany.
Ten dodatek jest dostepny na ptycie CD dotqczonej do kslqtkl. Sprdbuj ohvorzyr5 go
za pornocq polecenia PIIk/Ohvdn, a nastepnie zainstaluj 130prawidlowo za pomocq
p o l ~ e n i aNan@zia/Dodatki.
Jeteli na przyklad w aplikacji wykonystano plik pomocy, nalety znpewnit, aby mstat
on skopiowany do tego samego katalogu, w kt6rym urnitszczono aplikacje. Nastepnie
w celu sprawdzenia, czy moma odnaleki plik, wykonamy poni- kod:
Sub GetHel p( )
-
D i m Path As String
Path Thlsllarkbook.Path
Applicatton.He1p Path L 'USER.W'
End Sub
Sub Checkversion( 1
If Val(Avpllcstton.Version) < 11 Then
HsgBox "Ten dodatek dziafa tylko z Excelm 2003 lub wersjq nowsz6."
ThisWorCbwk .Close
End I f
End Sub
WMciwo4t Verslon obiektu Application zawiera lahcuch makdw, na przyklad mote mieC
wartoSC II.0 a. Z tego powodu w zaprezentowanej procedune wykorzystano fbnkcj~
VBA Val, ktdra ignoruje wszystkie maki pocqwszy od pierwszej napotkanej litery.
i
4 Wiqcej informacji na temat zgodnoSci wersjl motna znaletC w rozdziale 26.
I
Tworzenie aplikacji
Tworzenie pask6w narzqdzi
Paski narzqdzi to popularny element interfejslz lrZytkownika, hdry obccnie mottna spotkat
niemal wc wsrjstkich progrmach. W tym rozdziale opiszq sps6b ich tworzenia i ma-
dyfikowania.
Excel z cafq pewnaSciq nie jest pcodukrcm, w ktbryrn btakuje wbudowanych paskbw
nancdzi. Wenja 2003 zawiera ich panad 60. Dodatkowo moma z 4awaSciq twonyt
nowe lub dostosowywat istniejqce -zarciwno vzrtje, jak za ~pornmqjezyka VBA.
Jak Excel'zarz~dza
paskami narzqdzi?
Pried rcszpoczqciem pracy z wlasnymi pasksmi narzqdzi, wacto dawiedzieb siq, w jaki
spos4b Excel nimi mpdza. Jest ro daft aryginslny sposdb.
Wlmne paski na@d moaa doiqczaC do arkuszy Excela ilub plikdw dodatkbw i dzieki
temu z IatwoSciq mzpowszcchniaCje z aplikacjmi (wiecej infamacji na ten ternat znajduje
siq w punkcie ,,Dystrybucja pask6w nantdzi u?ytkownikaY'w dalszej czeSci rozdziahzl).
Do skotoszytu lub dodatku moha ddqczyt dowolnq ficzbq paskbw narmzi. Kiedy
uZytkawnik atwony plik dalqczone paski wygwietlq siq automawznie. Wyjqtek stanowi
sytuacj% kiedy pasek Q tej samej lzazwie 20S&t zdefiniowany wc&njej. W takim przypadlku
nowy pasek nie zastvi istniejqccgo (i me wy5wictlj siq infclrmacjrt, 2e jest dostqpny
nowszy gasek nan*j). Wiqcej informacji na ten temat majduje siq w punkcie ,,Pro-
blerny z dziaianiem paskdw narqdzi" w dalszej cq9ci sozdriah.
lnforrnacje o pashch narzqdzi Excel zapisujt w pliku XLB. W pmypadku Extela 2003,
dziahjqcego w systemit Windows XP,plik XL? jest zapisany w nastqujqcej Iokalizacji:
Dokladna n a m a pfiku i pdotcnie plikv sq c6-e dla r62nych w m j j Excel3 oraz syste-
mu Windows. W przypadku Excela 2003 pPik nasi nazwq axcelll.xlb, w prtypadktz
Excela 21002 -ace/lO,xlb.
Dlaczegol ptik XLB jest tak w a y ? Zatbkrny, h dostaled od kolegi skorosiyt Excela,
w kt6r).m mstaI zapisany pasek narzcdzi wkownika. Otwarcie skoroszytu spowodowalo
wySwietlenie paska narzqdzi. Po przejrzeniu skomszytu stwimdzi#eb, re nie jesteS nim
minteresowany. Jedrmk w rnomencie donczenia sesji Exeela pasek narzqdzi wkownika
zostal zapisany do pliku XLB. Wykonanie dowolnych modyfikacji dotyczqcych paskbw
narztylsi - od niewielkich korekt pask6w wbudowanych do zdefin iowania wtasnych
pask6w - tawsre powoduje zapis pliku XLB przy wyj4ciu z Excela. Poniewa2: za ka2-
dym razem, kiedy umchamiamy ExceIa, Iaduje sic cab plik XLB?cms urucharniania
i zamykania Excela macznie siq migksza wmz ze wtrostem romianr pliku ,'ELB. Do-
datkowo k a d y pasek narzqdzi zajrnuje rniejscc w pmjeci i W w a zasoby systemowe.
Z tega powodu, we wlasnyrn interesie, powinnibmy usuwad paski narzgdzi, kt6rych nie
utywarny- Aby to mob id, nalez;y wy brat poleeenie Widok/Puski nurzedzi/Doscosrrj.
(s> Czqstym p m d e r n awaril Excela podczas uruchamianla jest usrkodzony plik XLB.
JeFell zdarzy nam riq maria EIcela natychmiast po uruchornleniu. spr6bymy mien16
nazwg tego pliku.
.
Na sxzqScie, aby zabezpieczyt siq pned takimi sytuacjami. rnoma napisat kod VBA,
Technika polega na unicrnotliwieniu dodania paska m d z i aplikacji do kalekcji paskbw
n a p d z i uzydrownika. Jednym ze sposobdw na wykonanie tej cqmojci jest utwonenie
p k a narz~dzi,,w locie", za katdym mem, kjedy skorowyt jest onvierany, o m usunit-
cie go w mornencie zamykania aplikacji. W ten spos6b p e k narzqdzi nigdy nie zostanie
zapisany w pliku XLB wtytkownjka. Mogloby si< yyclawai, $Etwonenje paska nanqdzi
,,w locie" jest procwem pnebiegajqcym wolno. Jak sie pnekonamy w daEszej cqSci tego
ro&iah, taki p m e s wykonywany za pomocq VBA prrebicga mkakujqct, sqbko.
Aby wykonaC dowolnc nyme miany w paskach naqdzi jlub menu), Excel musi maj-
dawak sig w stank, Mry n m l e r n lrybem d m t u s o ~ u n i o
park& natquki. W Excelu
mogna w % cyC ten tryb za pomacq:
ttar~dz~Das~os~,
wybran ia polecenja Widok/Pc~skr'
Kiedy Excel znajduje siq w trybie dostosowywania pask6w narzdzi, wySwietlane jest
akno dialogowe Dostosowpanie i moma dowolnic rnodyfikowat paski narzqdzi lub
menu. Klikniqcie prawyrn przyciskiem myszy menu tub paskdw narz~dzipawodujc wy-
3wietIenie mcnu podrecmtgo (rysunek 22. I). Po wykonaniu modyfikacji naEeQ kl ihqt
pmy cisk Zamkng w oknie d ialogowym Dustaso~ywonie.
Rysunek 22.1.
W t@ie
dostosowywania
paskBw narqda-
motna
modflhwa6 paskc
narzedzl i menu
Kiedy Excel znajduje siq w trybie dostosawywania paskbw narqdri (tm.kiedy wyS;wie-
tlane jest okno dialogowe D~~dsowywunie), moma dawalnie kopiowak i przenosif
kontmlki pomiedzy wsystkirni wyswietlanymi paskami. Aby pnenieS4 kontrolke, na-
l e e przeciqgnqb jqdo nowego pdamia na tym sarnym lub innyrn paslcu namylzi. Aby
skopiowrf:kontrcrlk$, nale* wcisnqk klawisz Cid, a nastqpnit pmciigrqt jq do innego
paska narzqdzi. Konhlkq moaa take skopiawat w obqbie tego samego paska n a w z i .
Aby dodat nowq k~ntrolkedo pska narzedzi, mleq skorzystat z zakladki Pofecerriu
okna dialogawego D o s f o s o ~ c r n i ekt6q
, pokatano na rysunku 22.3.
Rozdzjat 22. + Twonenie ~ a s k b wnamedri 61 5
Rysunek 22.4.
Dostosowywanie
pqclskes paska
nanedri
W tym punkcie opiszq sposdb dystrybucji pask6w narzgdzi oraz wskakq, na co nale2-y
m 6 c i C uwagq, aby uniknq: pmblern6w.
Oto typowy scenariusz: tworzyrny apl ikacjq, w kt6re4 wykar;cystali$my pmek namdzi
q k o w n i k a . Przyciski na tyr~lpasku powadujq wykmywanie pmcedur VBA w skoroszy-
cie apllikacji, Ihlqczarny pasek n W E j i zapisujemy skorm$. Na podstawic skomzytu
t w ~ n y n ydodatek. Zamykamy wersje X U aplikacji, hstalujerny bcsdatek. Kl ikarny p q -
cisk na pasku narzqdzi u2ytkownika i . ..atwiera siq plik XLS!
0 Pas& nm@ri
1 Pasck menu
2 Menu pdwnc
Rysunek 22.6.
Tq liste
wszystkich obiektdw
P # r & manqdzh
CommandBar Pas& nmqdzi
uhuorzono P h m h nmqda
Phf.$ amqdn
za pomocq k&u VBA Pnr* rrnmqjli.
' P a r a nmqdri
Parh n o n e
Pasdl mn-r@g
P l u k srrgr3.l
Pmark n u r l d n
PISIC nrrqltd
Prmh nmqda
Plllk lvtpdtl
Pmrnk mrqda
Pal& n v r q d n
Powk m q d a
Pm~mlrn r r t d r ~
Parmk nmmdm
P a dnmqde~
Pa~rl:n r r z t d e ~
P a ~ r kn w d r l
P a n h nrwdtr
Sub ShaHCbmnandBarlrfanesO
D l m Row As IntWef
D i m cbar AS ZomnandBsr
Raw -
Cel ls.C?ear
1
--
For Each cbar I n C m n d B a r s
Cells[Rcw. 1) cbar.Index
Cells[Raw. 2) cbar.Nam
Select Case cbar .Type
Case msoBarTypeHom1
-
CelIs(9ow. 3) 'Pasek irarredri*
Case msok rTypeHenuBas
-
tells(Row. 3) 'Pasek menu"
Case rnsoRa rfypPapUp
-
tell s( Row. 3) "Henu p d m r n e '
End Select
-
Cells(Rm, 41
Row ROW + 1
Next char
cbar.&llltIn
End Sub
---
With T8ar
. Name "MjPa sek IJ~rztdzi"
.Top D
.Left 0
Visible = True
End With
End Sub
W przypadku Wcia nazwy nalety pamiqtat, $e wielko5-i liter nie ma maczenia. M6wiqc
inaczej, moha wpisaC nazwq Standard, STANDARD; srundurd Etd.
Mumerawanle indeks6w dla paskdw nanedzi nie jest sp6jne pomiedzy c62:nymi
@ wersjarni Excela! Na pnyklad w Excelu 2002 MaBdwoSf i ? e L s paska Typ wyhresu
wynosi 74, natomiast w Ulcelu 2003 wladcivndt :ndex a wartoki 74 ma pasek
narzedzl S'ehernat o r g a ~ i z a ~ nJeieli
y, apfikacja ma dzlah€ s r62nymi wersjarnl
Excela, rawsze naleiy k ~ q s b a ds wtaSciwu5ci Naw zarniast wlaSciwoSci Index.
Usuwanle patkcl nan@ri m pom'ocq kodu VBA
Aby usunqd pasek nm@zi utydcownika, nalce wykorzystat metode Delete obiektu
C m n d B a r. Wykonanie poni&oej instrukcji spwoduje usuniqcit paska nmqdzi MclJ Pa -
sekNa rzMz1:
J&li pasek narzqdzi nie istniejt, wywuhnie instrukcji spowoduje powstanie MNu.
Aby tapabiec wyvySwieflaniu kornunikatu o blqdzie pod- @by usunipcia nieistniejq-
oego paska n a r ~ d z iwystarczy
, zignomwat h$. Wykonanie poniazego kodu powodujc
usuniqcie paska nacqdzi M O j P a ~ eMarr@z+,
t je2eli taki pasck istnieje. JekeIi pasek nie
istnieje, nie zastanie wygwietlony komunikat o bwtie,
an E ~ R Wae~unpM X ~
CamandBars( "MbjPas&Nafr+jrf'l .@lete
On Error h T o 0
E x i t Funct:m
End I f
Nexteb -
CannandSarExlsts
End Fun~tiion
- False
Name -n m a paska m q d r j . .
-
Type m c a l i e cdkowitqnprezenmjqq typ p a s b namzi. Matt miet
nastqpujqce wartdci:
-
Dim Count As Integer
bunt D
-
For Each cb I n Comnand0ars
I f sb.Type msoBarTypeNorma1 Then
bunt
End I f
-
I f Not cb.Builtln Then
Count + 1
End I f
Next t b
Customfool bars
End Function
- Count
Po wykohaniu tej instrukcji uwkownik nit bgdzie m6gt dostowwa6 paska nanedzi.
Smte dla w I d c i d e i Protectlot? m o h a Iqczyk, ce omacza, kc za prnocqjednego pole-
cenia m o h a wpmwadrad dme rodzaje zabezpieczeh. Na prykhd p n i ~ z instrukcjaa
modyfikuje pasek narzqdti Mbj PasekNarzHr i w taki sposbb, aby nie rnoitna go byto do-
stosowaC lub.przenieid:
- -
Set cb CmandBars[ 'H6jPasekNarzedrlm)
cb. Prgtect-ron t m*i msoBarNoMov~
m s ~ B d f N o C ~ ~ze
v
c!?!
Aby wyCqcryC autamatycme wykrywanlc dla ohSlonega paska narzqdzi, wystatczy
go ramknq6 podczas pracy w kmtekScie, w Hbryrn y k k Iten pasek sie wyswietla.
Aby ponownie w t p z ' dutamatycme wylcrywanie dla tego pasb narmd, nalezy
pnownie przywolat go na ckran paderas pracy w akreSlonym kontekScie,
- --
' Utwarrenle paska narredzi
Set AutoSense Camnamlbrs .Add
For I 1 To 4
Set Button AutoSense.C~ntmls.Md(ms~ntr~lButton1
Wlth Buttm
-
.Onbct~on= "&uttonn & 1
. FaceId i + 37
End With
Next i
. -
AutaSense Nam *PutoSenseD
End Sub
Rocedurn abslugi idamnia Select i onchange (umieszczona w module kodu obiektu Ar-
kusrl) jest nastgpujqca:
Private Sub Worksheet Selectlar~Changet ByVal Target As k e l .Ram)
.
I f UnlontTaqet ne.ftangel "ZakresPaska~ars~dzia1
1 .Address = -
-
Me.Rangeln5akresPaskaMarz@z:l'1 .Pddress Then
ComMndBars("Aut~Sensc"I .Visible T m
El se
-
CmndEars("htoSense* 1,Visible Fa1se
End If
End Sub
Sub HideA11Tmlbars~l
Din TE ds ComMndbr
Dim TBNum As Integer
Dim T&Sheet As Worksheet
Set TBSheet = ~ t s C ' T B ~ " 5
-
d p O l i c a t i w r . S c r ~ L $ d a t i n g False
'
-
Ukrycrle wszystkleh wlckcmyeh pask6w ~ r ~ e d iz iraplsanie i@
TBNun I)
razw
-
=or Each T3 I n CarmandBal.5
If -.Type f l s o B ~ r T ~ m
If TB-Vlsible Then
Then
l
TBNm = f0Nm + 1
TB.Visible False
.
-
TBSWt Cell sTTBNm. 13 - PB-Ham
End If
End If
Nextm
i = f me
A p p l I c a t l m . S c r ~ a tng
End Sub
Sub RestomToolbats C 1
Dim TSSheet As nbrksM
Dim cell As Range
,
Set TBSheet -
Appllcatian.ScrmVpdating - False
Sheets l'tBSheet " 1
End Sub
Next cell
-
Apoll cat 1on. ScremUpdat ing True
*-*,
W niekthyh plnypadkach ukryeie widocmych pasltbu, nan@zl nle wystarcza. Na pnykhd
@
; $*a
paski narpdzi, W6re autmatycm{e wykryw;rfq kontekst pctrnim ukrycia ich w momeneie
ctwiwania aplikacji, y5wieietla sie, jedli splilcacja znajdzie sit!! w odpowlednirn
korrtekSde. Jednym z rnoilrwych foorwiaqzan t y h p&lern&w jest ustawrenie WaScfwaSci
Enzbld na wart046 False dla wszystkich p s k h narzedd, ktdre nie majq by? Wyswletlane,
Obitkt ComnandBar -taki, jak na przykhd pasek narqdzi -zawiera kontmlki (abitkty
Cmnd8atf;ontrol). Dostqp do tych obiektirw uzyskuje siq za pmocq wtaSciwoSci Curb-
trol s abiektu CmandEar. Istniejq trsy mdraje:kantrolck:
N a m a kontrolki zapisma w wlaSciwoSci Caption czqsto zawiera znak &. Litera za tym 1
makiem jest wy9wietlana z @krcSlcnitrn i dziah jako klawisz sMtu dla przycisku
paska narzedzi (np. w n m i e &Nowjest to litem N). Jc2eli odwotujerny siq do paska I
narzqdzi za pofrednictwern wMcEwoSci Caption, nie musimy uwzglqdniad znaku &.
Czasaml eblakty CaRml zawlerajq lnne oblekty Control. Na $mykhdplsrwsza kontralka
RF* paska nanedzl l?ysowanie rawiera inne kontrolki (na tej podstawie m t n a tak2e
wywnioskowat, ze paski nanqdrj mogq zawierat elemenv menu). Zagadnienie
to opisano bardziej szczegdtow w rozdziale 23, prry okazjl ornawiania menu.
-
D i m Cbar as CormandBar
Set CSar ComnandBars( "StandardWJ
-
Cells.Clear
Raw 1
-
For Each ctl In CEIar.Cantro1s
-
CellsIRaw, 13 ctl .Capttan
Rm Rcm + 1
Next ctl
End Sub
Wynik dzialania pmedury ShowControl Ca ptians zapnzentdwana na rysunku 22.8.
Rozdzia?22. + Twonenie pcrskbw narzqdzi 427
row 1 -
Cells.Clear
For Each Cbar I n C m a ~ E l a r s
If Cbar.Type msoBarTypeNoma1 Then
Cells(rcw. I ) CSar.Naw
For Each c t l I n Cbar.Controfs
Cell f ( rm. 2) = ctl .Captian
O
rw row + 1
Next ctl
End f f
Next Cbar
~ n dSun
Rysunek 22,P.
Lista podpr'sdw
wszptkich konftojek
na wszystkich
paskach nan@a
W cclu dadania nowej kontrolki do o b i e b C m n d B a r mama wykonystad metode Add
obielctu kolckcji Controls. Wykanmic instrukcji pokazanej poni2ej spwuduje dodanie
nowej konaolki do paska narz~dzio m i e MdjPasetHarz@ri. WMciwoid Type tego
paska nanqdzdzi ustawiono na wart& moControlBurton, co odpowiada standardowemu 1
pqciskowi,
CmandBarsI "MjPasekNanedzi'3 .Controls.Add Type :lmsKcm*.ml&Itton I
Przycisk dodany na pash nanqdzi za pomocq p p c d n i e j insrmkcji jest pusty: jcgo klik-
nivie nie przynosi tadnego efektu. W wiqkszdci pnypadkbw, dodajqc nowy przycisk
na pasku nan@zi, nalety ustawit pewne w+aiciwohi. Zapmntotmny poniaj kod
powoduje dGdanie nowej kontrolki, przypisanie o b r m ZZI pomocq wlaSciwa9ci Fa celd.
przypisanie makra ta pomocpwlaiciwobci &&ti on i okdlenie podpisu:
Sub Mdflutt~W
D i m NewStn As CornnandBartkrttbn
Set NewBtn CmnandBars( "MbjPasekNarzqdzi"I .hmtrol r .bdd -
(Type: l m ~ n t r 0 7 B u t t o n E
Wlth N&tn
,Faceld = 300
-
.Onbction "Hbjetl~km'
. C a p t i ~ n "To jest tetst wskazbki .'
End With
End Sub
i
Praeedura AQdWlttm twomy zmimnq chiektowq M n repreantujacqd u d a m q kontrolkq.
Nastqmie m pumocq konstrukcji With . . . End M i t h ustawiane q wlaSciwoSci obiektu.
T c same dzidania m o a a wykonaC bcz wyhrzyst~cwaniazrniennych abicktowych t&
jak pokazana w poniBzym krsdzie: I
Sub Md6uttmO
Ui t h ZomnandSarsI*M6jPas&Hai=z~zlD~ .brCmls.Md -
(Type :~msdontrolButton 1
.FaceId 300
.Or&tfan = "HojeHakro"
.CaptScm * L L Tj ~e s t tekst wskazhki .'
Znd With
End Svb
rn msaButtonIcondMrapCapti on,
Dla kontrolki ComrrandBarCwnbo8ox wWciwyrni ustawi eniam i sq msoComboLabe1 tub mso-
CombNorma1.
Na rysunku 22.1 0 pokazano siedem kantrolek przyciskdw polecd. K&dy x nich repre-
zentuje inny styl.
Siedern warto5ci
wlaSciwaSci Sryfe
dla kbntrolkl
= Skmszyt. w Mbrym znajduje slq kod M r z q c y pokamny wsek namyH, jest dostqpny
na *ie CDROM dolqcronej do ksieki.
W jaki sposbb okreSlit nurner kodu wtytej ilustracji? OczywiScie mokm zastosowa~
metodq pr6b i wd6w, ale 0 wiele lepszle! jest zastosowanie prmedury VBA, k6ra wy-
Swietla wszystkie dostepne obrazy prryeiskdw paskbw narzgdzi. K d t listingu 22-3
tworzy pasek n-zi z 200 przyciskami. Opr6cz tegs zmim p l c kombi, kt& mobs
wykorzystat do okrdlenia, ktbry zbibt przyciskdw ma byt wySwietlony. Poqtkowl'o
wyhietlajq siq obrazy o numerach FaceId I - 200. Dmgi zbidr wySwiet!a a b m q o iden-
tyfikatorach 201 -400 itd.
'
5et NewToalbar -
tbdanie pustego paska narzflzl
Rppl tfaticm.ComnandBars,Add
(Ham:-"FaceIds" , temporary :-True)
-
MewToolbar.Vi s i ble True
'
-
Dadanle 200 prxyci s k b
For i 1 To MO
!jet N&ttm NekrToolba;r.Contmls,Add -
I T y p e : ~ o C b n t r o l ~ u t t o n10:-2450)
.
Next I
- -
Obdanie mrwij a n e j 11sty
Set SetNum NewToolbat.Contm1s .AddlType:lnrsoControlD~cwmI
For 1 1 To 10
~ t ~ . A d d I t"2bj6r
m " 8 i
Uext 1
With SetNwn
- -" N m r
. L i stlndex h~ttoffiroup
,On&tion -
.Caption zestarm prtycisk&"
"NewButtons"
End W l t h
HewTaal bat.Wtctth = 400
* Skonfigurclwanie ptsyci skbw
Call NewButtons
End Sub
Sub k B u t t o n s t l
'
Wy5wietlenl e przycf s k h na podstawle wybranega rbioru na rozwljanej 1 l3cle
O i m i As Long
- -
ButtwlGmp ~ n d B a r i ~ " F a c c 1 d. sC"o ~r i t r 0 1 ~ ~ ~ N u nzestawu
e~
-
przyci s k b " ) .Li stIndex
For i 1 To 200
-
W l t h CannanCSars("Face1ds') .Control sC1 E
-
.FaccId l0uttonGmup 11 * 200 + i -
.Caption = 'FaceID
-0nAction "EwtySub*
End With
- " & IButtonGroup - I1 * 200 + i
Next i
End Sub
Ptbcedura ShowFaceIDs tworzy pasek natrgdzi i dodaje m i s k i . Wywduje prncedur~
NewButtons, lusdawia whiciwoic FzteZD i d h j e podpis (podpis ~ S w i e t k asiq %K mo-
mencie, kiedy wskahik myszy majduje siq nad prqciskiem). Wybrsnie innej pozycji
na romijanej Iiscic take powoduje uruchomienie p~lceduryNMuttons. Zbibr przyciskdw
jest okre4lany za pornocq micnnej poziomu modulu ButtanGrauu.
Chociat w Excclu dos&pnych jm bardzo duto obtwhv, Mre motna nosowat na pa-
skach mqdzi, nicktbny wo14 definiowd w h n e . Do tego celu m o a a wykotzystaC
ed;or pnyciskdw, pokazany na rysunku 22.12, kt6ry p i w a l a na dycjq obraz6w pmy-
ciskbw o wyrniarach 16 x 16. Aby wyiwietlid Edyror pnyciskdw, n a l e q wybrat pole-
cenie IViduPP arki nunq&~Dustmuj. Nastepnie pny wySwietlonyrn oka ie dialogowym
Dosto.rmvpwnie nale* kliknqd przycjsk na pasku narz@zi prawym pnyciskjern rnyszy
i z menu wybrat polccenie E@uj obrmprrycidai.
I
Jceli korzystamy z VBA, do utwamnia paska m q d z i ,,w Iucie" rno- wykorrysta6
metode PasteFace, b6ra wklei ohm ze schowka. W kdzie saprezentowanym ponitej
przyjgta, fe arhsz Arkuszl mwiera obraz Meja Ekona. Obraz skopiowanu do schowka, na-
stepnie dodano pasek mqdzi i za pomocq rnetody PasteFace o b m umieszmano na pasku.
-
ThlsWarkbaok.Sheets~"ArkustZm).P1ctures("HofaIkbnam) .Copy
Set PyButton GcmiandBar~["MjPasek"
VyRutton. Pasteface
5 .Control s.Add~fype:~msohntmlButtonl
hocedursr z Iistingu 22.4 twrzy pmek namdzi mwicrajqcy pujtdyncq prtycisk Pod-
pis na tym rysunku prredstawia laricuch opisujqcy format liczby dla aktywnej kom6rki
(rysunek 22,13). W pmcdurze wykorqstano z d a m i a m i w e z obiekzem Worksheet
w celu monitomwania m i a n mmaczonego o m . KEedy achodzi zdarzenie Selection-
Change wykonywana jest pmtdura mitniajqca podpis przycisku.
ltysunek 22.13.
Ten pwsk
$Wy~lrM JT n v q ' obrrh? Cnmrru&r (Tnrmlt hczby).
M w i etfa 7 ,
Vhronenie mwegc~paska n a r d z i
Set TBar = Comnand€hrs,&dd
With redr
-
.Ham = "Format 1iczby'
..Visible Tme
End With
' ~ a n l prwr
t stu
Set Hewetn ComMndBarsql 'Format 1Iczbf"' ,CMTtml S , Add -
lType:-msKmtrol Button]
KSth NewBtn
.Captian
.OnActlon
--
"'
-
'ChangeNwnFem t '
.Tool tfpText "Kl ik n i j. aby mienit fomat 1 tczby , "
.Style = msoEWtonCaption
End M l t h
C a l l UpdateTwlbar
End Sub
Tcchnika ta dzjah doSC dobrze, ale ma wade: jeeeli &ytkomik mieni format liczby za
pomocq przycisku na pasku narz~dziFmtztawani~,podpis nje zmieni sic, gdyt zmiana
>
fonnatu liczby w km6m nie generuje zdarzenia, kt6re rno-a Sledzit.
Przypisywanie m a h uiytkownlka da wbudowanego przycisku
K a y wbudowany przycisk po waduj c wykonanie okre9lonej wewn~trmcjprocedury.
Do wbudctwanego przycisku motna jednak p q p i s a t wlasne makro, W tym celu wy-
starczy ustawiC w#aSciwoS6 OnActi on, Poni&za instrukcja powoduje prtypisanie makra
do pnycisku Sortaj ranqco:
Gdy ta instmkcja zostanie wykonana, kliknigcie przycisku Surhj rosnqco nie spowoduje
posortawania rakresu. Zamiast tego zostanie wykonana proeedm VBA ShowMsg. Aby
pnywtdcid normalne dzialanie przyciskowi, nale* pr~ypisaEpusty hricuch nakdw do
wIagciwofci DnAct ion:
CmandBars("Standardml,Control s( "Sortuj rosnqco") .OnActlan - '"
%
2
-
(
WtaSclwoSE Type abiektu Control, ustawiana w rnomncle twmenia kontrolki, jest
Qlko do odcrytu. M6wiqc in=@, po utwoneniu kontrolkl nle m o ~ mienit
a jej typu.
-
Utwclrzenie nawego paska narx@rl
kt lEar mandSars,Add
With TBar
. N m --
'L4 sta miesjqcy"
.Visible True
End With
-
.Capt iwr = 'DataDO"
.Onktim 'PasteMonthW
.Style ms&ttonAutamatic
.
For 4 -
Hypelnienle listy mmmi m i e s i w
1 To 32
.AddTtem FormatIDateSerlal(1. ? . 1). "mmmml
End
Next 1
.Listfndex 1
W l th
-
End Sub
Sub PasteMonthC}
'
Ctnieszczeulc w y b r a m mlesSwa; w aktywnej kamdm
(h Error Resme Next
With CmndBars("L1sta mlesiecyml.Controls("DataDOw3
ActivKell ,Value = .kistI.tistlndex)
End With
End Sub
Nie q to bynajmniej mgu& sztyme. Jezeli jest taka pbhneba, moha mtosowat mdy-
cyjne pnyciski paskdw nsrqdzi na paskach menu lub tradycyjne polecenia mmu na
paskaEh nmzqdzi. Mokna nawet przenosid pasek menu z jm tradycyjnego polo2mia
i spowdawd, 2e b@zie ruchomy. Chock& Excel o b m j e wiele paskbw menu, tylko
jcdm z nich makc byc widoczny w okrieSlonym mornencie,
W cclu dwtosowania menu Excels do whnych potrreb moan usuwaC elmmty. dodawat
j e i zmieniat. Ponadta matna tymcmczasowo mtqpiC standardowy psek menu Excela
paskiem nicstandardowym. Menu Excela m o h a modyfikowat na dwa sposoby: rqczn ie
lu b za pornocq kodu V B A.
;set JeSll nle chamy, aby modyfikacje menu byty zapisywane 1 obowiqqwafy w lnnych
sesjach, nalefy napis& kod VBA mieniajgcy menu podczas owleranla okreSlonego
skoroszytu, a nastepnle prtywracajacy stan pSetwutny podczas jego sarnykani a.
UQtkownik mde usunq6 d m l n q ca$d s p a n u menu Exotla: poqcje menu, menu i &
paski menu. J&li na iprzykhd nie cbcemy, aby u2ytkownicy rndyrfikcrwali opt-t wySwie-
tlania, m a m y uurrqt menu Widok z Pmka m e m urRzrsra kdhfacyjmgo. Jeeli z kolei
usvnicrny polrycjc Nowy z menu Plik, l&ytkownicy nie l y d q mogli wykzystat menu
do u t w o m i a nowego skmsqtu, Wreszcie mokna wytliminomt pasek menu Exccla
i mtqpit go paskiern niestandardowym. Celm takiej a p c j i mote bye sterawanie apli-
kacjq prmm u w a w n i k a catkowieie za pommq zdefiniowanych p r x z pmjekmnta rnakr.
Utytkownikorn, Way naucqdi sie dostosowywa6 menu w ExceEu 5 lub Exoelu 95, na niewiale
przyda siq zdobyta wiedza. Pocr$wsry od h e l a 97, dostusowycuante m n u z n ~ m i esic zmienib.
Pa& menu jest wtaSciwie nieco m o ~ k o w a n y mpaskfem narzpdd. J'efeli kt05 nle wlecy,
prosze spr6bowaC kllkn# pasek rnenu pa lewej stronle I przmlqgnqd go w inne rniejsce.
Uqskamy paseg nanedd, M6ry rnolna swbodnie pnemieszczad. Dla paskdw narzedd
I paskdw rnenu wjeryku VBA stosowana jest wsp6lna oficjalna nazwa paski polecer5.
Pocrqwszy d hcela 97, nie ma dytm menu mmego r Excela 5/95. Alsy wmie rnodyfik W
menu, nalety wybrd polecenie Widokflaskl n a n ~ d ~ f l o s t o s uNalezy
f, jedna k pamiqtat,
te skcrroszyty Excela 5/95,wyposaione w menu dostosowane za pomocq stamgo edytora
menu, w dalsryn? ciqgu dziala~qw Excelu 97 1 wersjach nowsmh. Jednak aby kvprowadziC
Iakiekdwiek zmiany w tak zmo~kowanychmenu, nalety uQ6 Excela 5/95.Je2eli planujemy
wyk0ny~tyW8Cstay skorosqt r nowszq m j q Excela, o wiele wygdni~ejusunqe modyfikacje
(za prnocv Excefa 5/95).
INle ma bezpoSredniego sposobu pnyplsania makra VBA do nwvej porycji menu w menu
Namo'rfa. W Erccelu 5/95 by+oto drieclnnie W e . W dalszej czq$ci ninieJsregarozdziafu
z a p z e n t u j ~kod VBA. kt&y moha wykonystaCS w celu dodania nowej pozycji w menu NapdriEl.
W bcelu 2000 1 wwsjach m s z y c h dmfllnie Wyswletlajq sig tylka ostatnio utpane porycje
m n u . Moim zdmiern jest to jeden 2 najgorsrych pomyskh Microsoftu. Nie potrafiq zrozurni~,
komu ma shzyd ciqgh miana kalejnbki parycli w menu. Na szczqhie te wtaSciwuSC moina
wyiqczyC w saktadce Opcje akna dialagowego LbsXosowywanie.
-
For Each SubHenuEtm 1fl Mcnul tm.Control5
Cells[rm. 11 Fenu.Caption
-
Cell s[rm. 23 = KenuItm,Caption
tells[rm. 3) SuiPenultm.Captlon
Mwarm+l
Next SubMenuI tem
Next slenvltem
Next Menu
End Sub
Rpunek 23.1.
CrpSciowy wynik
..
batanfa ~ ~ w . .
bdnrdywsnls slq do kalskcjl CmmamlBan
Kolekcja Cornmandhrs jest sktadouuq obiektu Appl I cat ion. Kledy odwdujwny slq do nfej w og6lnym
module VBA, mzemy pominqC odwdanle do obiektu Appl tcatlan, poniewai ten obfekt bedrle
uiyty darnySlnie. Na pnykiad panihza instrwkcja {umleszczona w standardawyrn module VBA)
wySwietll namq picrwszego elementu kolekcji CommandBars:
.
HsgBax CcmandBa rst 1I Name
I
Jetelf -my sfe dol kolekcji ConnandSar; r modutu kodu oblektu ~ I s W k b a o k rnushny
, pocrzedzlt
jej name odwotaniern do obiem Appl rcatlan w nasepujqcy spos6b:
Msgkx Appl icatlm .Carm#ndBars313 .Name
tlelpIex -
Pobranle indeksu menu PMnoc
CamnandBars(l3 , C e n t m l s C ~ ~.Idex
"l
' Utwonerrle MU
-
Set HMlertu CnmandSars[l] . ~ n n t msl. A d d C T y p e : 1 m s c C m t ~ u 1 ~-~ .
kfo~:-HelpIndex.Temparary:- True)
' Wantepodplsu
&&nu.Caption ="&gudtetw
End Sub
*
KanwsnGje Wmanla m u
Menu w apllkacjaeh wfndbwsawjrch zarylezaj wallmje pewrte konwncje. NiM nie We,kto te kon
m c j e ustatit ale p91i chcemy sprrzlwiat dobm wrahnie, puwInnl3my ich p s t m g a t . Modyflkujqc
menu, pamiqtajmy o ponifsqch rasadach.
ITradycyjnie m n u Plik jest pierwsrq potycliq menu, a menu Pmoc ostatniq.
-
r Tekst menu JestwySMetlany jak n a m whsna tm.zaezyna slq wlelkq Ilterq.
H Menu nalwytszego pozIomu nfe gowodu1;gwykanywanla dziatati. MMqc inamj, Mde menu
rnusi sawieraC co najrnniej jednq porycjq.
U PozycJe menu zamyezaj skIadaJqsl.9 z trzech lub mnlej s W .
a Z k&dq powgmenu pcwinien trjd miqzany klawisz skrdtu (litera pmW&lana), Mbm w rarnach
wybranega menu jest niepowtarzalna.
Poryeja menu wy5wietlajqca okno dfa!@ow]est xakoficzona wlelokmplclem I,..).
U Wsty poyeji menu pbwinny byC stosunkowo ImRkle. Czasarnl zamiast dlugiej listy IepieJ
rdennimC podmenu. Gdy zachodzi konfecmoSd zdefiniuwania dtuglch list, nale* wykomystaC
separatory w ceftr podrielenla polecer'F,na Iogiczne gru~y.
H W miae m mo itl Sc1pozyqe menu niewtadciwe w okref lunym kmtekScle powl~nybyC
w
nieaktywne. W jezyku VEA w mlu d e a w a c j i pozycji menu nale2y ustawlt jej WaSciwafC
Enabled na wartoft Fa1 se.
H NieMbre poq%jemenu drlalajq jak p&qcmikl. Je2ell apcja jest wtqcma, poqcja menu
jest popmdzona maklern raznaczenia.
Zapnzmtowany kod nic jest idealnym mmiqaniem. Po jego wykonaniu nowe menu
nie zawsze zostanie umicszczone na wlafciwtj pozycj i. Wys-tqpujqdwa problerny:
zaIokono, PE menu Pornoc istnitjc, a grzecie2 make siq zdamyd. 2e u ~ k a w n i k
j e usmai,
talotono, b podpis menu pomocy to Pomm, natumiarr w innych wersjach
jqzykowych Excela mogqwystepowaC inne pdpisy.
'
If f-4lpMenu
-
Odsttlkanie menu Pcmc
Set MlpHenu! ComMndBarstlS .Ff ~
Is Nothing Then
m ' f
I~d:*300101
-
Dodanfe m u prsed menu k m x
Set tfWWu C m n d B a r s ( 13. Control sSMCT~:~aCcrntm106pup,
Before: 4elpHenu .Irdex,Teqarary:-Trw)
-
End If
"ante
End Sub
oplsu
.
NewMenu Capt Ion - "&Budtet"
pep
L=,
Prmedura z Ilstlngu 231 twany bemfytecme! menu, ktdre nie zawiera kadnych
porycji. Pnyktad dodawania porycji menu do menu zaprerentowand w punkcie
"Dodawanie pozycji do menu Narzedzia' w dalwej cze5ci rozdziatu.
W oknie infomacyjnym Wyswietlih siq wartoSC 30010, kt6Ftj uwkm jako argumentu I D
m a y F i ndContro1. Ustawicnia wfaSciwoScE I D dla menu najwyBzcga poziomu Exeela
zestawiono w tabeli 23.1.
PI*
E&ia
Widok
wsrm
Fmmctr
Nma&iu
Dane
wybe3
Oh0
Pomm
Kiedy odwohjerny siq do menu za pornocq pdpisu, w c i e mafnt & jest opcjonalne.
-
Dodanze mnu na ~ M Ckolekcjt
U
I
-
Set N e n u ComMndBarst 1) .Cmtrol s .Plb$CType:=n~o&mtm1P~~~~,
Tmrary:-True)
El se
Dodanle menu prted menu Pam
Set NeMenu CumandBarsf 11.13ont ral s.Md(Type:~s&ntralPoarD. -
kfu~e:-HelWenu. Index . T m t a r j l :-fmI
End If
--- "Hacrol"
With MwruZtem
,Caption "bWprcxuadranIe d ~ n y t h. . "
,Faceld 162
.0nktlon
End Wlth
.
. F a c ~ I d-
.Caption = " M r o w a n i e rawr26w.. '
590
-
-43nktlan 'MacroZ'
End M i t h
' WECEA POZYWA M€W
Set HenuItem
With MenuEtem
- ~u.Cmtmls.Wd(Ty~:~oContro~Popup3
.
BeglnGrwp True
End W t h
-
.Caption *&Podglqd wykmsh"
'
-
P f M Z A PdZl'WA PU34EMi.I
kt Subnrenuitern &nu1 tem.Cwlrtmls.Md~Ty~:~rns&ntrotButtanl
---
Wa t h S u ~ n u i t m
.Caption "&Odchylenfa miesi.eezneM
. Facetd 420
.OnAc t ion 'Hacsa3'
End With
---
With Submenuitem
.Caption ' 8 P t x t s ~ l ~ ~ ~ aadn lpacs&tku
e mku*
.Face Id 422
.OnActr on *HacrM'
End Wlth
End Sub
'
-
Odsmkanie menu NarmzJa
Set Toalsknu CmandRarsIll ~Fb~mtm1~1d:-3[bW71
If TcmlsH~nuIs Nothing Then
MsgEiox "Hie mtna dod& psrycjl m -
u wtyj klawirzy Ctrl+Shift+C.'
E x i t Sub
fl sc
-
Set HMermItm tbal ~u.Cmtmls.AddtType:lnzsoCartrolRttonl
K l t h N*nuItm
-
.Caption Vykry3.C wsystko n p m f o m l "
.FaceId
.Q&tlon
=
-
3a0
'ClearAl 1&EtFbrmrlarse
.BegtnGmp Trw
End With
End I f
End Sub
m
-- u
- -- --- - 2.1
me..
Obok niekthych pozycji wbudowanego mmu Excela wyfwktlr! siq kombinacja klawisy,
krbrej wciJniccie powoduje wykonanie tych samych dzialafi, ca wybtanie pozycji menu.
KIawisze sMt6w Wwietlajq siq na pnyk-lad obok k i l h poqcji menu lk$cju.
'
Set -POI -
Wszutanic menu NarzMzla
sknu ConmandBarsCl) .Fi nKmt rol (Id:=30007l
If Tool sMenu Is Notping Then
HsgBox "Wie mzna dodaC pbzycjl mnu - u t y j klmiszy Ctrl+$?ift+C.'
Ex?t Sub
Else
Set HMenu[tem Tool zJlenu . ~ t r a l s . A d d l T y p e : ~ m s a ~ n tEhtton)
ral
-
With K W n u I t e m
.Captlan "UykzyiC wszystka oprdcr fomlM
.FaceId = 340
-
.ShortcutText = "Ctrl+Shi ft+Cg
.Cn4ctiw *ClearAl18utFom~as"
End U i tn
End If
'
Utwotrenle kl awi sza skrdtu
Appllcat~on.MacmOptionsMacra:-'ClearA1 leutFamlasm.HasShb~cutKey:-Tm. -
ShortcutKey : -"Cm
End Sub
Wykonanie tej prucedury spowadujc dodanie poycji w menu Nmq&ia, jak pokazano
na rysunku 23.4.
Ten prryktad jest dastepny na p)yeie lCDLROM doQcmnej & ksi@l.
. .-~-----.--. .. .?
IeI3Cli jednak jwzed ramhivim skomszyt nie xostanie zapisany, mo* pojawiC siq pro-
blem. Okno dialogawe Excela z pytaniem a zapisanic zmian jest wyJwietlane, ranirn
uruchomi siq procedura obstugi zdarzenia Workbock E e f o r K l ase. Zatem jdli utytkownik
kliknie A m h j , skoroszyl pazomnie otwarty, ale menu utytkownika wczegniej zostalo
usuni@c?
Jcdnym z mzwizpah ?empmb!emu jest porninigcit pytania wyiwittlanego przez Excel
i napisanie wtasnego kodu w pmcedune 'dorkbook BeforgCl ose, k6ry wySwietla pytanic
o zapisanic zmian Proredm tq zapmentowano Gnittj:
Prlvate !&& bbrkbmk BeforeClasetCancel As Boolean)
If NO t *.Saved hen
?I59 = "Czy zaplsat m a n y w "
Msg Msg 8 He,Nam & "?'
Ans MsgBoxlHsg. vMues;tjon * vbYesFloCance?1
Select Case Ans
Case vbYes
Me.Save
Case vbNa
&.Saved = True
Case vbtancel
Cancel = True
E x l t Sub
End Select
End If
Call &let-
End Sub
Procedura s p m e czy skamzyt -1 zapisany. JeMi tak, n a w u j c wykonanie
pm%h"y D e l e t ~ iumrnkniqcie skormzytu. Je2eli jednak skomsqt nie mstal jeszcze
zapisany,pcdmwyswietla alolo infmcyjnc idmtycmcjak to. Mre wytwietla Exoel.
Je2eli uzytkownik kliknie T& skoroszyt 2;05~niezapisany, menu usuniqtc, a skorosqt
atnkniety. JeMi ujrtkownik kliknie Nie, kod ustawi wlafeiwSE Saved obiektu Hark-
book na wartclSk True [ale nie mpisze pliku) i usunie menu. Jezeli uvkownik kliknie
Amhj, pmocdum obslusi zdarzcnia BeforeC! me zakohczy siq kusuwania menu.
End Sub
Sub HideMenu( l
CmandSarsI1).Contmls~"Budtet"~.Vislble= False
End Sub
Rpunek 23.5.
Porycja menu Ude
siatki wySwietla a a k
zaznaczenia,
JeSIi w akywnym
aikoszu
wvfwietfajq sic
link siatkl
pozycji powoduje mian? mnu wyfrviettania linii siatki oraz wy8wictltnie Iub ukrycie
maku zaaraczenia.O tym, czy znak macrenia jest y4wictlany. dccydujc whSciwoSC
S t a t e kontrolki.
Sub MciNmItenC I
Drm V t M e n u As ICornnandBarP~pup
Olm MMMuItem As CamMndBasButton
'
Usunjsie mrycji rrrenu. jczel t ju2 1sttnleje
Call klete%nuItem
'
-
Mssukanle menu Widak
Set V t M e n u tomMnd8ars ( 2 :,.F i ndarrtrcl It 0:=301C041
I f WiMenu Ir Mthinq Then
MsgBax 'Nie moina dad& porycjt menu. '
E x i t Sub
Else
Set HewMmItem = U l M e n u .Controls ,P$dtT~:moContmlsUtton~
With NwPknuItem
-
.C?p?ion "8Linie siatkti'
.Onktian
End Ylth
- 'TcgglcGr~dIines"
End ff
*
-
Konfiguracja pmedury obstugt zdarzed a01 f k a c j i
Set PgpOtl.j~t.AppE~et~csAppt icatlon
End Sub
Wykonanie praccdury AddMnu Itm powoduje dudanie nawtj puzycji na Pasku memrr
m k a kafkulocyfiego, Procedura nie doda pozycji na Pasku mentr Wykres. Z tego po-
wodu nawa paqcja mmu nie bqdric wyiwietlana w prypadku uaktywnienia wykresu
(wldnie o takie dzialanie nam chodri).
-
Gn Ermr &sum kxt
Set TG ~andBars(l).Find~ntm?{ID:-30004I.Cmtmls~'&linie
If bctlwWIndor~.01splayGridlinesThen
siatktu1
-
fG.State msoBrrttonDarm
Else
-
TG-Statt? msa0uttanUp
End If
End 5ub
Pcocedura spramlza akrywne ololo i ustawia wlaSciwo+f State porycji mmu. J*?cli nq
wyhvietlane link siatki, do pozycji menu Link siarki dodawany jest mak tamaczenia
kkli Linie siatki nie sq wyfwialane, proredm usuwa mak zmacmia z pozycji menu.
JcJli pozycja menu jest tsmactona, wla9ciwde OnAction tej pozycji mmu powodujc
wykonanie procedury Toggl eGridl7 nes, k t d q zaprctentowano ponitej:
Sub Tuggl &ri dl 1nes ( 1
IfTypeNameCActiveSheet) = "Worksheet' Then
ActiveW1ndow.Oi splayGr1dl ines = Not ActfveWindaw.Dl splayGridl1nes
Ca 11 UleckGrldl 1nes
End If
End Sub
Rpunek 23.6.
lntomrade zsplsane
w t)lm arkusru
shr& do utwomnfs
menu u2ytkownlka
Plniom wyznacza @o&nie o M l o n e j poycji rclatywnie do h i e m h i i systernu
menu. Poprawne wartogci to 1,2 i 3, Poziom 1 odpowiada menu, poziorn 2
pozycji menu, natomiast poziom 3 pozycji podmenu. Zanvyczaj powinna by6
jedna pazycja poziomu 1 o m kilka pozycji poziomu 2. Niektdrym poqcjorn
poziomu 2 odpowiadajq pozycje menu 3 (pzycjc podmenu).
Nanola to tekst, kthry wyiwietla siq w menu, pozycji menu lub podmenu.
Aby wySwietI it pdkreSlony nak, nalew popntdziC go makiern &.
E PozycjdMakro -dla ekmentSw pziornu 1 powinna to by5 liczba calkowita
reprezentujqca p q c j e na pasku menu. DEa elementdw poziornu 2 i 3 kolumna
zawiera makro, kt6re Wzie wykonane po wybraniu pozycji. Jcteli clementowi
goziomu 2 odpowiada jeden lub kilka elementbw poziornu 3, to z elementarni
pziomu 2 nie zawsze sqpowiqzane rnakm.
-
Separator naleky wpeowadzit wartogt PRAWOA, jttcIi p m d elementern menu
lub podmenu ma byd wyfwietlony separator.
w FuceiD to wartdt opcjonallna Jest kodem, kt6ry rcpmmhje b b r Wwietlane
~
obok tekstu elemtntu menu.
Na rysunku 23.7 mpmentowano menu, h6re utwowno na padstawie danych mpisa-
nych w arkusm.
Rysunek 23.7.
To menu oMomno
na podstawle
danych zaplsan)rch
w arkuszu
.Vtslble
End Uith
-
.Name "VbjPasekMenu'
True
- -
Dbdanie n m q o m u
.
Set M e n u W e n u B a r .Cmt rol s Md[Type:.~rrsoContml
NMlenu. Captlm "gPolcen~ a'
Popup3
'
-
Wanle p o w 1 do menu
Set HwItem W e n u . Cont re1s .Add (Type; 1msoContr01Eutton 1
Vith HmItem
--
.Captim 'b0dtw6rz stand~sdawemenu"
.QnActian 'Del eteNmuBarm
End With
.capEton
.OnAction
-- "&W'
'ShanHet p"
End MI t h
End Sub
-
W tcj p~.detduranie ma instrokcji, ktbre ukrywajq P m k m m arkrrra &uku?~cpjnego.
lnstrukcja Set NWemBdr CmnCBars.Add!MenuBar:-True1 powoduje dodanic no-
wego paska palecd. Kiedy wiaSciwo$t V i s i bl e tego nowgo paska zostanic ushwiona
na wartoft True, pasek pnejrnuje r o l ~gI6mego paska menu. W Excelu w okreflonym
rnorncncie m02e by6 aktywny tylku jeden pasek menu.
5
t
e%!e4Zgadnie z tym,co napisafem w rozddals 22.. wfaklwu9C Trpe standardowego paska
nanedd ma wart056 msok tTypet4orna 1, WaJcim9d Type paska menu uhvanonega
w wpncdnlrn prryktadzie ma wartoe mso&ar7ype*nuBar.
D u s t o s ~ a n k Jedynyrn
. spdsobm dostosowania menu pdqcznych jest wykorzy-
stanie jezyka VBA.
Menu podqcrne jest paskiern pleccfi, kt6lego wlaSciwSk Type ma wartog6 msokrfype-
Popup. Aby wyk6nywad d z i a h i a z menu m m y m j , azeba mat wamfci ich wMci- .
wdci Index lub Name. Do ygenernwania Ijsty wszystkich menu podrqcmych rnclgna
wyk-C p o h q prcrccdu~.Na 1ikie w pmzzegbhych w i e m c h arkusza wySwietlq
sic wartoSci w#&ciwoSci Index i iam o m Iista wszystkich pzycji menu.
Sub L i s t S h o r t C u t ~ u tsI
Row 1
For Each cbar I n Cmnd6ars
I f cbar .Type mm%rTypePn~upThen - -
-
Cells(Rw, 21 c b a r . N m-
Zells(Row. I > cbar.Ir?:ex
For Col 1 TO c h r -Contr315 ,Count
Cells<Rou, t o 1 21 c3ar.Controls(Cu13 .CaptSon
Next CoJ
+ -
Rw = Row + 1
End I f
Next cbar
End Sub
-
. .
:9: '2 Ra . WT'W .&4 m*;Lpwlrha...
my
a plr - .ffiergNqrkrnn Whnr W S ~
1, u n~ u'-- Whml . -mW+ - . ~ . wq L U W ~w...
1 2 j 15 DummM - Zkwzyta. BDuxili.. LL¶l- army.
.I- -- -
-
*13 r G D . I H o r - ... - - - - - - - - ---. h p r &!r. L-1 [err
IAE
-+-
uw
l l r r * ~ r fPrtmrtmy
d ~ b~ayw' ~ ~ b 1 3 ) 1 ' -
~ ~ w
* ~ t W j lfkdphbihW
a --
-. * . - - .w a r r k m - _ _&Wnh!
'SJ
i a
-. 9 D*
?74
.
.
--- - - - -
..
wan%
*'@
+
~~
. -
. -.----
m d q
* _-
v-.~
-,!"rFq
<
tTb+Ibrm*- -
~ & r c : ~ ~ l h l l t *
~ M
W / Dtbsx -
.
_
---
~BJ51 S m m W y b r r y Wmbl hTp y b r ~ w . abarn2*ddlM.
-X#J
'9_1_9p'* - _---Wr*r~ h h
53FlowdHHI
&Tfl r ~ k n * ~ . . - - ---- o ' ! a w t m . - & Qm**-* - -
-. Wy!lmmyb.W Wi*ktw, wq*t
W J b r n ~ w M W=rY
m r M -
-23_1
- S 6-
--2 4 ~5? F
E4 C*.lrl
b a Swrr
a n *m
~
w r bbtrl
WybmrL&mH
L W t
~ T T ~P m m .
LYycr* usd nt-
ww--
bpasrz -
I
-
5 SB Famd L q d EMy Wybq bbrw iJLCryj BZE- *Palal m r m 4wyE~Ty
. A 53 FFmMJ1m 0 ~ r wfi w wj mlbq Panaym ,
8 BORrPtT*mrlLkcu ffamwW.. . C W y k m m L K r l ( l ~ ~ U b d oWbarnz#m
~ ~
k- f i r -
-. WflW WJ %% ~ n by-..
my--- --- - .
--
A A
69 k r o 5rm . -
31m
-
H
F~~
r * u\-cl
&rsp-
Sbnku
Wk
y
o
-lt:p
r
$
in
la LLrmt SLmm ~
1
' us'*-
Llnmrrc~a
*lr
-
W ~ t hNewltem
.Caption 711~ezlwylacrtmi janle btyrarbw"
.OnActian = 'ToqgleWordWrap"
.Begi !Group True
End With
End Sub
Wybranie nowej pazycji mmu powoduje wykonanie pmccdury Toggl MrdWrab {nie zapre-
zentowano jej w tekScie ksigtki). Now? zawartoM menu podnymego zaprczentowano
na rysunh 23.10.
Rysunek 23.10.
Do tego
menu podpcmego
dodanrr nowa porycJe
Sub O i sab?eAl1ShortcuttMus( 3
O l m cb As Cmmndbr
I f cb.Typ
Next cb
-
For Each cb In CmmandBars
mso0arTypePopup Then cb.Enabl ed - Fa1 re
End Sub
lednak po jej wykananiu w dalszysn ciqgu bqdzit dostqpne menu pdt.ecmc Toolbur
Lisr (jest to menu, k6re wySwietta siq p klikniqciu pra- pnyciskicm myszy do-
wolnegcr paska nrtrzqdzi). Nie mam sposobu, aby zablokowat jcga wyfwietlanie.
c3J OemMywacJamenu podrqemych jest tmda. 3eJ skutki nia sq cofane po zakoficzeniu
;=@* sesji, Z tego powodu pned sarnknivlem Ejrcela tneba pamieat5 CIodtwoneniu menu
podrfxxnych. Aby je od t
w om .nslezy pmedurg pokaranq powyief modyfikowd
w takl sposdb, aby ustawiata ~ ~ w menu
l Snebled o ~godrecznyh na wartoSC True.
-
Sub CreateSMrtcut ( 3
Set mybr CnmandSars.Add _
CfOame:="MbSdlenrsPodwme'. Posi ttm:~moBarhpup.
TEmmrary.:=Tml
"
-
Oodanie pazycji merru
Set myItem @ar.Cantrbls
Wfth myItem
.Add[Type:-msoComtml
Buttofl)
.OnAetIon
.FaceId
E d With
-- *ShPwFomtNunbern
1554
-
.C)nktion "Sh0wFomatAllgmntU
.Faceid 217
End W l t h
'
-
Oadanie potycji m u
Set nryltem my8ar.Control s .llddfType :lmsaCantra?Button)
Wlth my!tm
--
.Caption = "ECzclonka.. .'
.Cnktion "ShMormatFonim
.FeeeId 291
End Ul t h
aodanie potycjf mnu
Set myItem = mybr ,ControPs.MdtType:-msaCantrusl&rttonl
Mith *Item
- - "ShawFormatBorderw
. C a p t i a n = "8Obranowanie. , . "
.OnActlan
.FamId 149
.Bqi&raup = True
End Wj!h
*
-
Doclanit! p z y c j l menu
Set inyItm nyBaf .Control s.AddIType:qsaCantmlMtm)
Hith myItem
.Caot lon -- "W&rorce.. ."
.%Action
-
*ShawFomtPatterns'
.FaceId 1550
End WCth
-
Oodantt! pozycjl n#mt
Set nyItem myBar.Gmtmls .MdlType:m~m1Buttbn~
With myItm
.Captian = 'Za8bewl~renJa.., '
,FaceId
End With
-
O n k t i o n = 'ShauFarmatPmtectlon'
2654
End Sub
-
Privcte Sub Worksheet &f~reRiglltCl~ck[ByUalTarget As Excel .Range, taneel As Boolean)
If !hisnt~arget.6qe("~l'l.RangeC'dmm) 1,Address Sange( "dam"I .Address men
-
CmmndBars [ " H o j M u P 6 d r e u n c "1. ShorPaoup
Cancel True
End If
End Sub
Rysunek 23.1 1.
Menu padr(:cme
utwonane
za pamocq kodu VBA
Jckeli kornbrlra, kt6q kliknie utytkownik, majduje sic w zallarsie a nazwie dune, wy-
Swietla siq menu pdrqcme McrjeMemrPudreme. 3Dziqki ustawjeniu argumentu Cancel
na wart05C True nie jest wySwietlsnc standardowe menu podrvzne.
Systemy pomacy
wykorzystujqce komponenty Excela
J e d q z najprostsych metod definiowania systemu pomwy jest wykorrystanie wbudowa-
nych wlafciwoSci Excela. Najwamiejsq zaletq tej rnetody jest fakt, te nie meba uczyi:
siq twonenia plikbw pomocy w jezyku HTML -
co stanowi jeden z najwatniejstych
problernbw i mote zajq6 wiccej c w u n i t opracowanie cajej aplikacji.
ta najbardziej nadaje siq do opisywania typu danych wejfciowych, ktbre nale2y wpm-
!
wadraC w komdrkach. Kiedy utytkownik umiefci wskahik m y p w kom6rce zawierajwj
kornentan, wyJwietla siq niewielkie okno podobne do mkaz4wki e h o w e j . Uhvomnie
takiego systemu pomocy nic wymaga definiowania makr.
!
Kanentarze w km5rkach mina * y M e t ? a t autmtycznie. PoniLsza Instmkcja VBA
zapeunia M e t l a n i e macmikin d l a tych k d r e k . dla ktbrych Z d e f m l ~ a n o
kcmentame :
-
Appl Ecation .DisplayCmmtIndi cator xlCamentIndtcator(Xl1y
Rozdziat 24. + Tworrenie system6w pomocy w aplikacjach 669
YCYlllCl-
f Gvta-blfm*
m-PB VIM
: ~ m w . ~ o . ~ & C b . Q ~ ~ ~ m I l l k ( P . ~
W w m R k p r t O~
a r q~d a c l q p h n m m w R m I h l , l p y &
Aplikacja jest v s t a , ale sktada sie z kllku cdddelnych komponentbw, M6re pcezentu]q r6he
sposoby wyfwletlania kontekstowej pomocy. Skoroszyt huorzq nastepujwe komponenty:
Rysunek 24.1.
wonystanie
pola tekstavego
do wySwietlania
pomocy
dla utytkownlka
Pracujw z aplikacja, nvykk nie chcerny, aby pole teksrDwe bylo widoczne. Do jego ukg-
.. zwiaranv z makrern. kt& od~owiednio
wania i wiwietlania m o a a zdefiniowak arzvcisk
~ pola tekstowego. ~mykiad;akiego rnakra zapre&ntowaoo
ustawia v k c i w o ~ Vt i s ble
ponifej. W tym przypadku pole tekstowe wysepuje pod n a m q HelpText.
Sub ToggleHelp 0
ActlveUleet .TextBaxes('HelpText'l .\risl ble-
Not Activesheet .Textf!oxes('HelpText") .'disicle
End Sub
Rytunek 242.
Skonystenie Pardl & .z.mnu -
z oddzielnego &SIB
jest l
a m sposobem
zdefiniowania
Insrrukcje
systemu pomocy . -- .--*.
bm.~.4
.0:::.
rnmlv- ~ r u"o**.~
....... lo.nr..
l * earn.+*
*# ...............................
., ., . . , . -
.... ......................................
, . . . ob.lS;:virrk?~"rr+.a.. ....... , ............
. . - . w k o m r n r Cln*lrr.**.nd-tplmn?nM*. . . . . . .
,. .. va~ornunrrrn(.u& a m , n k w . ~ w p d r u b b 4 ( ~ a i n a i n . ,
nb-, n.*l)lr obu k.mdrtm .CI I CS q d . 6 I. ..nm rm.$rl
'oln'n.-l*-
P~*+I-*.
....................
W I ~*h)t
, m..q +m.w-r;Uy i
...... sdd" ** lo+omi.:.~r*k.-~~ laxnd prrp*. . . .
O ~ Y M .Y. . . . . . . ..............
-
.
n.:#
..... ..*KT
. . , .. , .....-....
....................
v:.$?+---.!*+-Y!b.
L H ~ ~ * ? P I I W ~ * L % I I I ~ M ~ W ~ ~ ~ ~ ~ ~
. . . .
.
. . *ncrki.irinrri .: ..,
-
He.Caption APPNPME &
SpinButtonl.Max & ")"
" (tmt pmmy ' L HelpTopic & 'z ' I -
End Sub
--
Private Sub UserForm-Initial ize( )
He.Caption A P P W E I ' - p m ~ '
LastRar Wleets:'ARu~fm').Range('A66536') .End(xlUpl .Rod
Rozddat 24. + Tworzenie systern6w pomocy w aptikocjach 673
txt " --
-
For r 1 To LastRar
t x t t x t k S h w t s ( ' A r k u s z P m " ) .Cells(r. 1).Text d vbCrLf
bxt r
Nttn Label1
.Top 0- -
--
.Caption t x t
.Width 160
.AutoSize True
End Y i th
--
With Frarnel
.Scm1 \Height Label 1 .Height
.krollTop 0
EM W i t n
End Sub
- -
CaEbcBoxTopics.ListIndex h r n n t T o p l c
Pe.Caption HelpFonrtaption
-1
I' & CurrentTwlc d ' z ' h ToptcCourrt 6 '1"
k i t h LabelText
--
.Captlcn HelpSheet .Cells(QmentTwlc. 2)
.Width --
.AutoSlze False
.Autosize True
212
Erd U i t h
Uith Frarnel
.krnllHeQht -
LabelText.HergM + 5
1
674 CzefC VI + Twmenie aplikacji
.ScrollTop
End U.i t h
-1
-
I f CurrentTopic 1 Then
MexzButton. SetFocus
Else'.f CurrentTopic TopicCount Then
Preri ousButton.SetFocus
--
End I f
PreviousButton.Enabled CurrentTopic 0 1
.
Nexthtton Enabled CurrentToplc o TopicCount
End Sub
Asystenta pakictu Ofice motna zaprogramowak tak, aby wyiwialat tekst pornocy dla
utytkomik6w. P n y k M zaprezcntowano na rysunku 24.6.
Rysunek 24.6.
wkonystanie
asystenta
pakietu Mflce
do wySwietlania
tekstu pomocy
Sub ShowHelp( I
-
Set HelpSheet Thishbrkbwk .Worksheets('ArkuszPomoc')
On Error Resune Next
-
App1icatfon.Assistant.On True
I f Err.Nunber 0 0 Then
MsgBox "Nie zainstalmano asystenta pakietu Office. -
W celu zainstalowanla t e j funkcji uruchan program instalacyjny -
pakietu Office. " , vDCritica1. APPNPM
E x i t Sub
End If
-
On Error GoTo 0
Twlc 1
- --
With Assistant.NewBallmn
.Heading " T a t p m y " 8 Topic d ': " d vbCrLf 8 HelpSheet.Cells(Topic. 1)
.Text Help5heet .Cells(Top~c. 2)
- --
.8utton msoButtmSetNextClose
.€!dllmnType msoBa11wnTypeButtons
.Mode msoM3deMadeless
.Call back "ProcessReqwst'
.Shov
End M i t h
End Sub
Jeteli asystent pakietu Ofice jest -lowany, procedura twory nowy obiekt Ball oon
Cjak pamietamy, tekst pomocy asystenta pakietu m c e jest e w i e t l ~ yw postaci
chmurki) i w c z p j e picnvsy temat pornocy z arkusza ArkrrszPomoc w celu ustawienia
jego wlaSciwoSci Heading oraz Text. Dziqki ustawieniu wlaSciwb$ci Button e w i e t l a n e
sq pnyciski N a r t q n y i Zamknij, podobnie jak w pnypadku kreator6w. Nastqpnie pro-
cedura ustawia w+&ciwoStMode aa wartoid msoModeModeless. dzieki c a m u utytkownik
mote kontynuowak prag podcm wyiwietlania pomocy. w l d c i w o ~Cali back zawiera
nazwq procedury wykonywanej po klikniqciu pnycisku. Na koniec wygwietlana jest
chmurka asystenta za pomocqmetody Sbow.
-
Dim MnnTopics As Integer
-
NmTwi cs Uorksheetfunctlon. CauntA(He1pSheet .Range('A:A') I
Assl~tant.Animatmon msoAnlMtionCharaberSut.ceY~jor
Select Case l b t n
Case msa8allaarf)utton8ack
-
I f Twlc 0 1 Then Topic Toptc -1
Case moBal 1aonButtonntxt
Case
I f Topic 0 NunTopTcs Then Topic
moBal 1aanEuttmClose
- Tapic + 1
bln.Ciose
Exit Sub
End Select
Wtth bln
.Close
Select Case Toplc
- -
Case 1: .Buttan aot?uttonSetNextClase
-
Case ICanTopics: .Button m~B~ttmSetBackCloSe
Case Else: .Button mso8~1ttonSetBackNextClose
--
End Select
.Heading 'Tmt ponocy ' 6 Tcplc 6 ': ' d vbCrLf & HelpSheet.Cells(TooW 11
.Text H e l p ~ t . @ l l s [ T o p ~2)c .
.Show
End W i t h
End Sub
,
Rysunek 24.8.
Pnyktad systernu
pornocy MML Help
a> Aby pornat sposdb hmxrsnla pllkbw MML. wySwletl dowolny tema w systemie
pornocy Excela. Nastcmie kliknlj prawym pmsiskiem myszy Wkumnl i wybieia2
polecenle Wy5Met,frWb. WySwietli sig oryginalny pllk ir6cslawy w fonnacie HTML
W edytom Visual Besic nal* wybraC polecenie* T Propmies (gdzie xtr jest
nanvq projektu). Wfiwidli sip okno diaLogowe Pmjecr Properties, w ktdrym nale2y
kliknqt zakladkp General i wprowadzit skompilowany plik pomcy systemu HTML
Help dla projektu. Plik powinien mi& rozszemenie .chm.
I
I
Dabrq pmkQ~kq jest pmechowywanit plikbw pomocy aplikacji w lym samym katalogu,
co aplikacja. Ponitsza instdcja powoduje powiqzanie aplikacji z systemem pomocy
Mojef.nkcje.chm. Rzyjqto mlokenie, t e pljk pomocy majdujt siq w tym samym kata-
1
i
logu, co skomszyt f
Rymnek 24.9.
Det7nlowanle
/dent)nkatora kontekstv
pornocy dla funky/
-
uiytkomika
w oknie d i a l o g t w p
Member Optlons
Do ustawienia identyfikatora konhkstu pornocy oraz pliku pomocy dla funkcji utyb
kownika mo2na wykonystat kod VBA. W tym celu n a l w pos- siq metodq Hacro-
Options. W pan&zej p&edune utyto jej & celu oh9lenia opisu, pliku pomocy oraz
identyfikatora kontekstu pomocy dla d d c h funkcji ukytkownika (AddTwo oraz Squared):
sub Setopttcnso
'
Ustawienle opcjl dla funkcjl MVO
Awl icat1an.MacroOpttons Macm :-'AddTwo' .Descrlptlan:="turdca 5 1 4 dw6ch 1 lczb'. -
W1Mile:-ThlsUarkW.Path & "\mjefmkcjc.ctm'.WlpConteJnIO:-1000
'
Ustmrienle opcji dla funtcjt Squared
Appi icatlm.MacroOptlons Macro:-'Squared'. -
D e x r i p t ion:--Zwraca kwadrat 1 lczby pcdanej jdko a-nt'. -
WlpFi 1e:-ThisUorkbwk . Pat3 & "\mjefunkcJe.chn' .WlpContextIO:-2000
End Sub
Ponitszy kod wy4wietla dornytlny tcmat pliku Mojaop.chm przy zatoteniy 2e plik ten
majduje sic w tyrn samyrn katalogu, co skomszyt, z ktbrego go wywohno. ZwsbCrny
uwagp, te dmgi argument pominiqto.
Sub Y,&l pContents( I
Ppplication. Wlp ThlsWorkbook.Path & '\Hojaap.chn' !
End Sub
Rysunek 24.10.
Qkno infonnaqbjne
z pWskiern Pomoc
--
Sub t%gBox&lp{
Ksg "Czy podDba c i t i e Excel?'
--
Buttons vtQuestion + vbYesFlo + vbElsqBox+lelp&rtt~n
HelpFi l e Thi sMrkbook.Path & " \ P m x A p . c h "
--
Context10 1002
.
Pns bgBox(Msg. Buttwrs. HelpFlle. ContextID)
If Ans vbYes Then Call C10sd)own
End Sub
- -
Sub ShowinputBox( 1
Hsg ' b c a j liczk:"
- -
DefaultVal 0
HFlle ThlsWarkbook.Path & '\PcrmcApl .&TI'
x -
ContextID 3000
End Sub
tnput!!ox(Prmpt:-Msg. Cefault:¶efaultVal.HelpFSle:-HFlle. Context:WextID)
Rysunek 24.11.
Okno lnpltBox
z pnyciskiem hmoc
' W pqpdku funkcji InpltEbx wySwistIaJiqai~sngidskie w@e apisu pnyciebw --. tf~m
Rozdziat 25.
Tworzenie aplikacji
wygodnyc~hdla uzytkownika
W tyrn rozdziale spr6buJiqpodsumowat informacje z p o p d n i c h rozdzial6w. Opisane
-
zagadnienia zostaty zilustrowane za pomocq Kreatora omorfyzacjip~czek prostego
nanedzia pnygotowanqo zgodnie z zasadami pmjektowania aplikacji typu user-
oriented. W tym skqdinqd utytecmym pnykMzie zaprezentowano kilka ciekawych
technik projektowania. -
Co to jest aplikacja user-oriented?
Tcrmin apjikacja wer-orientedtanzerwowakm dla aplikacji, kt&q z powodzcniem mogq
poshgiwaC siq u2ytkownicy o minimalnej wiedzy na temat Excela Opisany w rozdziale
fieator m o r w a c j i poryczek sklasyfikowalem jako aplikacje urw-oriented, poniewat
skuteczne korzystanie z niego nie wymaga od utytkownika wiedzy na temat zawiloSci
Exwla. Wystarczy, 2e utytkownik odpowie na kilka prosrych pya& a utworzy przydatny
i elastyczny arkusz z gotowymi tomulami.
I Przyktadowa aplikacja
I
I - Kreatar arnartyzacji poiyczek
Kreufor amwryzu~ipo?ucrek generuje arkusz zawierajilcy hamonogram amortyzacji
powzki o stalp opmntowaniu. Hamonogram pnedstawia informacje o potyczce dla
kolejnych rniesiecy (rysunek 25.1). Wyfwietlane q talkie dane o poqczce, jak kwota plat-
noki z wysxzeg6lnieniem kapitah i odsetek oraz saldo potyczki po splacie. Altema-
tywnym sposobern utwonenia t a k i e y harmonogramu jest zdefiniowanie pliku szablonu
XLT. Jak sip przekonamy, zastosowanie kreatora jest lepsze z kilku powod6w.
Rysunek 25.1.
Harmonogram
amortpacji wySwietla
szuegdty potyclki
zaciqgnietej na 30 let
Rysunek 25.3.
Krok 2. Kreatora
amorryzscl'l PO-
Rozdziol25. Tworzenie oplikocji wygodnych db uiytkowniko 685
Rysunek 25.4.
Kmk 3. h a t o m
amortpacji potyuek
Rytunsk 25.5.
Krok 4. Kreatora
amortyzacjl p o w e k
Ryrunek 25.6.
Kmk 5. *atom
anmrtpdcji potyuek
Ryarnek 25.7.
Pomoc
jest @wieUana
w fonnulam
Userfonn, do Mdrego
jest kopiawany tekst
zapisany w arkuszu
--
For Each b l In Me.Contrnls
CtrlTm TypeName(ct1)
- -
--
If CtrlType "Textk' Or CtrlType ' M x " Or
CtrlType 'OptionButton' Or CtrlType "~heck~ox'Or -
-
CtrlType 'SpinButton" Then
ctl .Value V~.GetSetting(APP~,
End If
"DonySlne'. ctl .Hame. ctl.Value)
Next ctl
End Sub
Rysunek 25.9.
Domy3tne warto§t9
worrystywane
p a 2 kreator
sq zapisane
w rejestne Windows
--
For Each ctl I n k . C M l t r o l s
CtrlType Typebm(ct1)
-
--
IfCtrlType "TextBox' Or
CtrlType 'CmhBox" Or
CtrlType "0pticn8utton'13r -
--
CtrlType 'CheckBox" O r
CtrlType 'Splnhttm' Then
-
Savesetting APPNPME. 'Dony9lne". c t l .Name. CStr(ct.1 .Value)
End If
Next c t l
End Sub
Twortmie aplikacji urer-oriented w Excelu nie jest proste. Tmeba pnewidzid, w jaki
s p 6 b utytkomby b& konystad z aplikacji. Chociat stamhm sic, aby aplikacja przed-
stawiona w niniejszym wrdzialc byla w maksymalnym stopniu odpoma na nierozsqdne
dziatania Uytkownik6w. nie przrprowadzitem dla niej gruntownego testowania w wa-
mnkach rzeczywistej pracy. W zwia;rku z tym nie zdziwilbym sic, gdyby w pewnych
warunkach nastqita jej awaria
Co to jest zgodnoit?
W W utytkownik6w komputedw terminzgorlnoitjest m y bardzo cqsto i omacza
zdolnoft dziahia programu w rdtnych Smdowiskach spnqtowych, programowych lub
sprqtowoprogramowych. Na prz)rktad aprogramomie napisane dla 32-bitowych systs
rn6w operacyjnych takich, jak Windows XP nie bQdzie dziaM ze starsq 16-bitowq wcrsjq
systemu Windows 3.x. M6wiqc inaczej. 32-bitowe aplikacje nie sq zgdne z Windows
3.x. OczywiScie nie m o a a tet bezpoirednio uruchornii oprogramowania napisanego
dla sysemu Windows w innych systcrnach operacyjnych takich, jak MacOS czy Linux.
W tym rozdziale opisy, jak aplikacje Excela 2003 dziahjq we wczehiejszych wersjach
Excela dla Window o m Excela dla systcmu MacOS. Do zapewnienia pehej zgadnoici
pomiqdzy zawartogciq plikciw nie zawsze wytarcla Fakt, it dwie wersje Excela kony-
stajq z tego samego formatu plik6w. Na przyklad Excel 97, Excel 2000. Exoel 2002,
Excel 2003 m z Excel 2002 dla systcmu MacOS wykorystujq ten sam format plik6w.
ale wystppujq pomipdq nimi olbrqmie problemy zgodnoki. Samo otwarcie skoroszytu
lub dodatku w dmAlonej wersji Excela nie oznacza, ke uda sic utuchomit zapisme w nich
r n a h jqqka VBA.
Okrdanie n u m wa@l E x d a
Wersjp Excela m&a uryskaC za pomocq ~~ Version obleldu ~ l r c a t i mZwrkona
. warto5C
jest clqgiern makh, a zatern aasami trzeba jq prreksztakit na Hczbp. ldealnle nadaje sig do
tego funkcja Val jeryka VBA. Na pnyklad p ~ k z funkcja
a m a wartog Trw, jekli uzytkorm~k
-
wykonystuje Exoela 2003 lub m s z + wersj? [uwaga: Excel 2003 to rversja 11):
-
Function XCllOrlatert I
.XLLllOrlater lralIJpplicatlcn.V~lon)
End Fumtim
11
-
698 Cz@eV11 lnne zagodnienia
ProgramiJci VBA musq.-u aby nie ko- z obiektbw, wlaSciw&i lub maod,
kt6re nie s~ dast$pe we wczeSnjejszych wersjach. Ogdlnie RCCZ biorqc, najbeqiecz-
niejszym sposobern projektowania aplikacji jest zastosowanie zasady najmniejszego
wsp5tnego rnianowika W celu zachowania zgodnoSci z Excelem 97 i wersjami nowsryrni
nalety do projektowania aplikacji wykonystak Excel 97, a nasttepnie przetestowaC jq
w nowszych wersjach.
-
I f ~ 1 i c a t l o n . D p e r a t i n g S y s t e ml i k e "%int" Then
W l ndonsOS True
El se
WindonsOS False
End If
-
End Function
lstnieje wiele r6tnic pomiqdzy wenjp Excela dla systemu Windows oraz dla systernu
MacOS. Niektbre z nich sq subtelne (np. r6me czcionki domyflne), a inne dofC istotne.
Na przykhd Excel dla systemu MacOS nie obshguje kontrolek ActiveX. Ponadto do-
mySlnie wykonystuje system daty 1904, a zatem w niektbrych skoroszytach daty rnogp
byC wcztSnicjsze o cztery lata. Z kolei w Excelu dla Windows domySlnie wykonystywany
jest system dat 1900. W systemie MacOS data o wartojci 1oznacza I stycmia 1904 roku,
natomiast w Excelu dla Windows ta sama wartoit daty oznacza 1 stycznia 1900 roku.
Inne ograniczenia dotycq funkcji interfejsu Windows APk w Excelu dla systemu MacOS
takie funkcjc nie wq dzialaf. Jeteli w naszych aplikacjach takie funkcje odgrywajq
istomq mlq, nalety opiacowat rozwipnie zastqpcze.
pnki 982
Jeteli z aplthcji bqdq korzystaly osoby postugujqce sip innyrni jwkami, nalety m-
pewnit ntycie wMciwego jqzyka w oknach dialogowych. N a l w t a b ddentyfikowat
ustawimia rnipdzynarodowe dla syrnbolu dzitsiwego oraz sepaqtora tysi~cy.W Polsce
R o z M 26. + Problerny zgodnokl 701
sr\ to odpwiednio pracinek i spacja, jcdnak utytkownicy w innych laajach stosujq inne
aski. Kolejnym problemem jest format daty i czasu: w niekt6rych laajach u2ywa sip for-
matu miesiqJ&ieri/mk, w innych &iedmiesiqdrok, ajesaze w innych rok/miesiqd&i&.
Rysunek 26.2.
Demonstracyjny kreaQor
- j p q k polski
702 CzefC VII lnne zagadnienia
Wykonystanfe wta~ciwofcilokalnych
Jeteli kod wySwietla informacje z arkusza (np. formulp lub adres zakresu), najlepiej
wySwietlif je w lokalnym jezyku. Na przykhd ponitsza instrukcja wylwietla formulp
zapisanq w kom6rce A l :
MsgBox Range(~Al').Fomla
--
Dim StartDate As Date
Stamate D a t e S e r ~ a l ( ~ 34.. 15)
Range('AlB) StartOate
End Sub
Aby zastosowat dodatkowc fonnatowanie dla daty, mo2na napisad kod, kt6ry wykonuje
te dziatania po wprowadzcniu danych w kom6rce. W Exalu jest dost~pnychk i b for-
mat6w daty i czasu, a t a b kilka fomat6w liczb. Opisanoje w systemie pomocy.
708 Czqe VII Inno zogadnienia
End Functim
-
Fumtlon FileExlrts(fnae) As Boolean
FllcExlsts Dlrtfname) "" 4
Argumentem funkcji F i leExi sts jest p e h ki- dostqu do pliku wraz z jego n w
Funkcjp mo2na wykony~tatw arkuszu lub wywoM z pmedury VBA.
-
sub L i s t F i l e s o
01 rectory 'c:\wlndows\PulpIt\'
r-1
' Wstawienie naglW6u
--
Cel1s.ClearContents
Cells(r. 11 'Nazwa pliku'
-
Cells(r, 2) "Rozmlar'
Cells(r. 3) "Datalgodzlna'
Range('Al:Cl").Fant.Bold -
True
'
-
Pobranfe piemrego pltku
f Di r(Di rectosry. 7)
DoUhile f ""
r - r + l
Cells(r. 1) --
f
Cellstr,
Cells(r.
Pobranie
2)
-
FlleLen(0irectory L f)
3) FileOateTim(0irectory & f )
nastepnego pl l k u
f -Dlr
LOOP
End Sub
-11 M M ~
H.W, ,Yh" R ~ l l l rD l l u + l l c * r
-
-
E . ~ ~ I 1.
~ sssosm.aru n n
ma
I . ~ . . ~ . t S.W. rn 459 w a r n ran.
A .nt@ amuu mrn rr:n
y%ar-w m w~awm15
-kr*~f.rt* . 3 4 oroz.mr3m.
7 E n t r u 2 7 ~ p ~ b m ~ ~ l )m,OTaaMltl
W1~
&am n (n wmrn01:10 .
-. 9 - h h - s o c z b k . 9 5 O Bmm H:35
A&nwr*15 w m w-mmmls
n"'YkYsn'+ : 51s ormm~a..-
7--
&m, s c n k ~ ~,-m.wm.arwcea.
e .
13 .L**k.W v l 5 a M Y p8 ( ~ m m 1ua
T!:*M.,q , ,.,W1 O M I
m lk36
15%~ .- -. i m rsmaxrnrc_
-.I S P I # ',1 2 t W 1-HY nrl
rrlm-iw " - I dn rrma~wrr
Xlwmm,c-.u , mnm-mms'
.
a3i~
; ..
3-p,dlrmsmd,mihl
,.
i\mptf
&
1
-- = .=- - [*I.-._-A
~ A¶
- . . . . .- . !if
lcK&mz:I
Pimvszym argumentan fankcji Di r mode by6 takte rpecymcsja pliWw w paptmsci wmrca
"
Aby na przykl;aduyskat I i q plik6w Excela, nal- wyk- insbukcjs
710 CzefC VII* lrme zagadnienia
End Function
Rozdzid27. + Operacje no plikach wykonywone za pornocqkodu VBA 71 1
i9
'm Obiektu Filesearch nle motna wykanystd w celu sprawdzenia, czy istnieje katalog.
-
Cells(r. 21 'Rozmiar"
Cells(r. 3) 'Datalgodzina"
Range("A1:Cl'). Font .Bold True -
r - r + l
With Pppllcatiar.Fi1eSearch
.N&earch
- - '*.**
.Lookln Directory
.F~lename
.SearchSubFolders Fa1se -
-
.Execute
--
For 1 1 To .FoundFiles.Count
Cells(r. 1) .FwndFTles(i)
-
Cellstr. 2) Fileten{.FoundFiles(i))
Cells(r. 3 ) FileOateTime~.FaundFlles(i))
r - r + l
Next i
End With
End Sub
--
Dim FileSys As Wject
Set FlleSys CreateObject('kriptlng.FileSystrrn0bjfft"l
FlleExists.3 F l l e S y s . F l l e E x l s t s ( f n ~ )
End Function
-
Ma FolderObj As Object
Set F l l eSys Create0bject('Scrlpring.FlleSyst~j#t")
-- -
(h E m r Resue Next
Set FolderObj Fi leSys.GetFoldw[pnm)
PathExlstsZ Err 0
End Fvnction
--
Case 3: Cells(?w. 31 'ST&"
Case 4: Cells(Rcw. 3) 'CD-RCn'
Case 5: CellstRcw. 3 ) 'RaEOysk'
End Select
--
Cells[Rcw. 4) D r v . V o l ~ m e
-
Cells(Rcw, 5) Drv.TotalSize
Cells[bw. 6) Drv.AvailableSpace
Next DN
EM sub
- --
.SearchWolders True
.Textorproperty 'budtgt"
-
.MatchTextExactly Fa1 se
.Filenam '*.XIS'
.Execute
-
For i 1 To .FoundFile5.Count
UserFoml.ListBoxl.AddIten .FcundFlles(l)
Next i
End With
UserFonnl .Shw
End Sub
Do otwierania plikbw do zapisu lub odczytu duty instrukcja VBA Open (nie nal* jej
mylie z metodq %en obiektu Workbook). Qdczyt lub zapis do pljku jest rnotliwy tylko
wtedy. jdli wczeiniej plik mtanie otwmty. Instrukcja Open jest uniwenalna i ma doSC
skomplikowanq skladniq:
Open Lcie2ka For tryb [Access dostgo1 Cblckaddl
As Ctlnur~rplib[Len-rumfar-&ardu] '.
-
Rozdziat 27. Operocje na plikach wykonywane za pomocq kodu VBA 715
Gdy ta inmkcja rostanie wykonana, w daluej cySci kodu motna sic odw- do
pliku jako do #I. Jettli plik jest otwierany w uasie, kiedy inny jest ju2 otwarty, drugi
plik mtna omaayt jako #2:
Opm "1nny.txt' For Iqwt As $2
-
Wlsdchvodci lmportamnla 1 d u p o r t m b pllk6w Ckstowych w Excslu
Excel obstuguje t?qtypy plikr5w tekstowych:
- -
CSV(ang. CommaSepafaM Valve wartoScl mzdzlelane prreclnkarni) kolumny danych
q rozdzielane pnecinkaml, a katdy wlersz ko15czysie znalkiem powr~tukarstkl (w niektdrych
narodowych wersjach Excela zarniast przecinka uiywany jest Srednik);
PRN- kolumny danych s$ wyrdwnywane przez pozycle makdw, a katdy W e n 2 kchczy sic
znakiem powmtu karetkl;
-
TXT(plik[ z darpmi rozddelanymi makami tabulacji) kdumny danych sq rordzldane makami
tabulacjl, a kaidy vuiersz kohzy sie makiern p m t u karetki.
Rdba marcla pllku tekstowego za pomocq polecenla Pllk/Ohvdrzczasami powoduje wfWetlenle
Kreatora impom tekstv, kt&y ulaNa hfiniowanie kolumn. Jetell pllk tekstowy jest mzddelany
makami tabulacji lub spacji. Excel razyczaj otwieta plik bez ySwletlanla kreatora. Kreator konwersji
tekstu na kolumny [dostqpny pa wybrardu polecenia Daneflekst jako kolumny) jest ldentyczny.
ale ddala dla danych zapisanych w pojedynczej kolumnie.
Ustlng 27.3. Zaplsywanie danych z zamaczonego zakresu arkusla do tekstowego pliku CSV
Sub ExportRange( )
Dim Filename As S t r l n g
D i m NumRows AS long. NunCols As Integer
D i m r As Long, c As Integer
D i m Data
-- -
Dim ExpRng As Range
Set ExpRng Selectton
NumCol s ExpRng.Co1urns .Count
-
NmRms ExpRng.Rm .Count
Filename "c: \windows\Pulplt\textfile.txt'
- -
Open Filename For Output As #l
For r 1 To NurnRows
For c
- 1 To NunCals
-
Data ExpRng.Cells(r, cE.Value
If c
Else
-
I f IsNuneric(0ata) Then Cata Val (Data)
IfIsEmpty(ExpRng.Cells(r. c)) Then Data
NumCols
Write $1. Data:
Then
- "
Munek 27.3.
Ten plik tekstowy
zostai wygenerowany
za pomocq kodu VBA
Udng 27.4. Odczytywanie pliku tekstowego z lfstingu 27.3 i zapisywmie wEHtuScl, pocawszy
od aMyrmej komdrki
Sub ImportRangeO
Dim ImpRng As Range
Dim Filename As Str'mg
Dim r As Long. c As Integer
Dim txt As Strtng. Char As String *1
Dim Data
Dim i As lrrteger
-
Set I w n g ActfveCell
-
On Errar Resune Next
F i l m m e "c:\ w l n d ~ s \ P u l p i t l t e x t fle.txtU
Open Filenarne For Input 4 #l
i
I f Err 0 0 Then
M s m x 'Hie maletiono pliku: ' L Filename, v b t r i t i c a l . 'BUD"
Exit Sub
End I f
r-D
c-0
-
t x t '"
Applicatlon.kreenupdating False -
Do Until EOF(1)
--
LIne Input $1. Oata
For 1 1 To Len(Data)
-
Char HidfData. i. 11
I f Char '.' Then ' przecinek
-
PctiveCell .Offsettr, cl txt
c-C+I
txt " --
--
ElseIf 1 Len{Data) Then ' znak t d c a wiersza
I f Char o Chr(34) Then t x t txt & Char
Active@ll.Offset(r, c) t x t
720 CrgfC VII + lnne zagadnienia
i
txt " - I
ElseIf Char 0 Chr(34) Then ' mak d t n y od cudfysla~~
-
txt txt 6 Char
End If
kxt 1
L
m
-
c-0
r r + 1
Close #l
Application.kreenupdating True
End Sub
mma
Rejestrowanle wykonystania Excela
Kod zepmentowany w tym punkcie zapisuje dane do pliku tekstbwego podczas ka2dej
operacji uruchamiania i zamykania Excela Aby zaprncntowana procedura dziatala nie-
zawodnie, musi by6 umieszczona w skomzycie, kt6ry otwiera siq za katdyrn razem,
kiedy uruchamiamy Excela. Idealnie nadaje sic do tego osobisty arkusz makr. Ponitsza
pmedura jest umieszczona w module kodu obiektu Thi sworkbwk i wykonuje siq podczas
otwierania pliku:
Private Sub Workbook-Open0
Open Appl icatlon.Path 6 '\excelusage.txt' -
For Append As #I
Print bl. 'U~chaniana ' & Naw
Close X1
End Sub
Pokazana ponitej procedura wykonuje siq podczas zamykania skoroszytu. Jej dzidanie
polega na dodaniu do pliku tekstowego wiersza zawierajqcego stowo Zakoricrono wraz
z bie4cq datq i godzinq.
Private Sub Workbook-BeforeClose(Cance1 As Boolean)
Open Appl tcatton .Path L "\excelusage.txt" -
For Pppend As #l
Print #l. 'Zakohczono ' 6 Ncw
Close #1
End Sub
Rozdtiot 27. Operacje n a plikach wykonywane za pornocq kodu VBA 721
-
Open 'output.txt' For Output As +2
TextToFind "Styczeh'
Do While Mot EOF(1)
Line Input #l. data
I f InStr(1. data. TextToFind) Then
Print 82. data
End If
LOOP
Close
End Sub
UIffng 27.5. Czytanle den)rch z pllku tekstowego I irnportowanle ich do nowego sk-szyhr
Sub ImportLongLines( )
' Importuje p l i k tekstowy zawierajecy ponad 256 k o l m danych
For t--
Ll~neI n p l t # l , Data
1 To LencData)
Char Mid(0ata. i.1)
-
Czy jest zbyt duto k o l m ?
I f c 0 0 And c Mod 256 0 Then
-
With ActiveUorkbwk.Sheets
Set CurrSheet .AOd(after:-.Sheets( .Count ))
End With
-
Set ImpRange CurrSheet .Range{ 'Al")
c - 0
End If
- '.'
Koniec pola?
I f Char Then
-
--
ImpRange.Offset(r, c) Txt
c c 1
Txt "
Else
Pominiecie cudzyslowOw
-
-
I f Char 0 Chr(34) l h n
Txt Txt 8 Mid{Data. I.1)
Koniec wienza?
If i = Len(Data1 Then
ImpRange.Offset(r. c) - Txt
-
c - c + l
Txt '"
End I f
End If
Next 1
- -
Do Until EOF(11
Set ImpRange ActtveHork~.Sheets(ll. R m t "All)
CurrLine Curdine + 1
Line Input bl. Oata
--
Application.StatusBar
For 1 1 To Len(Data1
-
'Przetwananie wiersra " h CurrLine
Char Md(0ata. 1. 1)
Zbyt duio koltnm?
IfcoOPndcM256-DM
c-0
-
Set InpRange I m n g e . Parent .#ext.Range('A17
End I f
I f Char- '.'
Konfec pola
Then
InvRam.Mfset(r. c l - TxU
c-C+1
! Rozdzial27. Operacje no plikach wykonywone za pamocq kodu VBA 723
Else
Txt - '"
P a i n i e c i e cudzys+&w
-
If Char o Chr(341 Then
Txt Txt & ~id(0ata: i 1) .
-
Koniec mersza?
I f i Len(Data1 Then
ImpRange.OffsetW. c) - Txt
End If
c-c+1
Txt - .,"
End I f
c 0-
Next i
SprzPanlie
-
'
- -
Close #l
Aopl ication.ScreenUpdating T r ~ e
A~llcation.StatusBar False
End Sllb
Prooedura sktada sir; z dw&h czpgci. W piemszej odnytywany jest pierwszy wiersz
danych i d d w a n e nowe arkune. jefli istnieje taka koniecmoff. W drugiej odczyty-
wane sq pozostak dane z pliku teksrowego. Przyjqlem, t e wszystkie wiersze zawiemjq
maksymalnq liczty kolumn.
I Ten przyklad jest d o s t w y na plycie CDROM dolqezonej do ksiqtki wraz z pllkiem
I teksto*ym zawierajqcyn 100 uierszy, kafdy po 6 W kdurnn danych.
I
I
Ekspartowanic zakresu do pnku HTML
i
I do pliku W M L . lak wisdom, plik HTML jest plikiem te).stowym zawitrajqcym specjalne
maczniki formatowania, ktdre opisujqsposdb prezentacji informacji w pmglqdarce.
Dlaszcgo nie skorzystamy z polecenia Excela PlWZbopisr jab Jtronq sieci Web? Po-
niew& zaprezemmwana pmcedura ma istotnqzaletq: nie twony skomplikowanegokodu
WML. Kiedy za parnoq procedury ExpartToHTML wyeksportowa~cmzakres 70 kom6rek,
uyskatem plik o rozmiane 2,6 kB. Nastqpnie do tego samego zadania wykorzystakm
polecenie Excela PliR/Zapisz jnko s t r q sieci Web. Uyskany plik mid rozmiar 15,8 k3
-ponad szesf,razy wiqcej. Tneba jednak pami@&, ke pprocedum ExpartToHlNL nie za-
pisuje formatowania korndrek Jedyrte zapispane elementy formatowania to pogrubienie
i pochylenie. Poza ~ y m
istrnieje dodatkowe powme ograniczenie: pmcedura nie obstuguje
scalonych k o m h k .
'
-
Wykorrystanie zamauwlego zatresu k&r&
Set Rng Appl ication. IntersecttActiveSheet .UsedRange. Selection)
'
-
Pobranle nazny p l i k u
F1lename Appl iation.GetSaveAsFllenwR(
InitlalFi1eLme:-"vrange.htrn". -
-
-
fileFi1ter:-'HX Files(*.hun).
IfFilename False Then E x i t Sub
*.htn")
-
Pnetwarzanie tcmbrdc r pet11
For r 1 To Rng.Raws.Count
- -
Print #I. '<TR>'
For c 1To Rng.Colums.Cant
-
TOOpenTag "<lD ALIGN-RIMT,'
fOC10seTag *<nb"
--
I f Rng.Cells(r. c).Fmt.Bold Then
TCOpenTag TWpenTag & 'cB>'
TKloseTag '<ID' L TDCloseTag
End I f
--
I f Rng.Cells(r. c).Font.Itallc Then
rOOpenTag TDOpenTag L '<I>'
iOCloseTag '</I>' 8 TOCloseTag
End I f
-
Celltontents Rng.Cells(r, c).Text
Prlnt #I. -Tag k Cellcontents 6 TDCloseTag
Next c
Print #l. ' C A W
Next r
Zarmkniecle tabel i
Print #I. '<ITABLE>"
' Z a * n l ~ l ep l l k u
Close #l
I n f o m c j a dla utyttowrlka
MsgBox Rng.Count 6 " Lambrek wyeksportwno do p l i k u ' & Filmanre 1 '.'
End Sub
Rysunek 27.4.
Zakres w arkuszu,
ktdry zostanie
pneksddcony
na pljk HTMC
726 CzefC VII lnne zagadnienio
1.7.98 L. ~ d - n
3594 d b ~ m c b u j l a
Ryrunek 27.7.
Dane z arkusza
pa p k s z t a k e n l u
na fonnat XML
- Choclai! w M u 2003 ulepuorwr obslugq fomratu XML nie m h a hvorryE pliku MGlL
Z dclvolnego z&su da-h be2 zdefiriowania pliku adwzorowali (schernatu) dla danych.
Rozdzid27. + Operocje no plikoeh wykonywone za pomocq kodu VBA 727
Pmoedtq ExpM.tToXK p m t u j e listing 27.7. Jak motna zau- ma ona wiele -1-
ncgo z pracedurq ExportToHTML p o h q w poprzbdnim podrozdziale.
Usnng 27.7. Eksportowanie rakresu Excela do prostego pliku danych XML
Sub EgortToXHL(
Dim Filename As Variant
Dim TDCpenTag As String. TDClaseTag As String
Dim CellContents As St-ing
Dlm Rng As Range
Dlm r As Long, c AS Integer
-
Ustawienie zakresu
Set Rng Rawe("A1:Lll'I
'
-
Pcbranie nazwy p l l k u
Filename ~ltcation.GetSavekFlle~me(
1nitialFileFlame:-*mjzakres.ml".
-
f i l e f i l t e r : - " X M Flles(*.ml I. *.GI*)
-
If F i l e ~ m e False Then E x i t Sub
' W a r c l e p l l k u tekstcwego
Open F i l m a m For Output As tl
-
Przetuarzanie k d r e l : w pet11
For r 2 To Rng.Rows.(bunt
P r i n t tl. 'cPraca*ll t>"
-
For c 1 To Rng.Cclums.Eount
P r i n t d.1. '<' 1ling.Cells(1. c l 8 ,'":
If IsDate(Rng.Cells(r. c ) ) Then
P r i n t #l. Rng.Cellsk. c):
Else
P r i n t bl. h g . C e l l s { r . c1.Text:
End If
P r i n t #I . 1 Rng.CelTs(l, cl 1 ">"
"<I"
Next c
P r i n t #l. '+'Practknik>'
Next r
Zankniecie tabelr
Print $1. * < I L I ~ M P r a c a * rkw'
i
M n I @ e pliku
Close #1
' MySwietlenic k m i t a t u
~ s g Rng.Rm.tount
h -
1 1 ' uierszy wyeksportcwam 6 p l l k u ' 6 F i l m m e
End SUD
Operacje na komponentach
jezyka VBA
W tym rozddale po w ,jak pisaf kod w j ~ k VBA,
u ktdry dziah z elcmtntami pmjektu
VBA. Okate sip, tc bcz wipkszych pmblern6w motna stwonyC kod VBA dodajqcy
moduly, genmjqcy inny kod VBA lub nawet cworqcy fonnularze UserFomw , locie".
C >4 Pcdstawowe Infomacje na temat automatyzacji OLE rnoha maletC w rozdrIab 20.
r
za pornocq makr. Pr6ba wykonania procedur zaprezentowanych w tym rozdziale mote spowodowd
wyfwietlenie nastepujqcego komunikatu o wdzie:
F!--.1OW:
~ m a s ~ p l . N - ~ ( w ~ n ! - i
- , I Dd 1 w I
WSwietlanie tego kornunikatu zaleiy od ustawlenia opcji w oknie dlalogowym Zabezpieczenia
-
On Error Resune Next
Set x ActiveWorkbwk.VEProject
If Err 0 0 Then
HsgMx "Ustabtienla zabezpteczeli w twolm systmie unlanotllwlaj~uruchaienie -
tego makra.'
E x i t Sub
End If
Nle mrystkle przyklady zapemtowane w tym rordziak powinni uruchamla6 rwykll utytkownicy.
Wiele z nich sluty do wspomagania twortenia pmjekt6w przez programist6w. Dia takich pojeM6w
naleiy wt;)c@ opcje Ufaj dostqpowl do programu VJsual Basfc Proj%ct.
d
' Nazwa opcji Ufij d o s t m i dopragramv VisualBmic Prqkijest myl- b I 3m.c Project nie jest
progwncm, a zatem opeja ta powinna m i d n m U f a j p r o g r a m m u d o s t w i doprojektu Visual Basic
-m.rtum.
Rozdzial28. Operacie na kom~onentachiezvka VBA 731
Oeslgner
Property
Reference
Window
,<ST$*
W tym razdzlale zignorowano kolekcj? Uindcws z blbliotekl Ertensibilityoraz kolekcje
CmandBiirs, poniewaz w mnlejsrym stopniu przydajq siq one programistorn Excela.
Wigkszog materialu w rozdziale poSdecono obiektowi VBPmject, kt61yjest bardzo
przydatny. Trzeba jednak pamieta6 o uwagach przedstawionych w rarnce .Waine
informacje dla utytkownik6w Excela 2002 i Excela 2003'.
Kolekcja VBProjecfs
Kakly atwarty skomszyt lub dvdatek jest reprezcntowany p m z obiekt VBProject. Aby
uzyskat dostep do obiektu VBProject ze skoroszytu, nalety utyC wtafciwdci VBProject
obiektu Workbook. Na pnyktad wykonanie poni*ych instrukcji spowoduje utwonenie
miennej obiektowej reprezentujqcej obiekt VBProject aktywnego skoroszytu:
-
D i m VBP As Wroject
Set VBP ACtiveUorkbook .V3Pmject
Jefli wystslpi bfqd podczas pr6by wykonania instrukcji Dim, naleiy spr?nvdziC czy dodano
d w d a n i e do biblioteki Micrarofr Visual Bmicjor Applications Ertensibilip.
Kolekcja References
Kafdy projekt VBA w Excelu &era kilka odwdah. Odwdania pmjektu m o h a prze-
glqdak. dodawak lub usuwat za prnq polecenia Tools/References (rysunek 28.1).
Wszystkie projekty zawierajrl jakid odwobnia (np. VBA, Excel, OLE Automation, czy
tet Microsofr OficeObject Librmy). Ponadto rnotna je dodawat w m i q potszeb.
Rysunek 28.1.
W oknie dialogmyn
References
Mwietlajaje sig
oclwofania pmlckhr
Opaacje z odwdaniami projektu motna takte wykonywaC za porn- kodu VBA. Koldtcja
References zawiera obiekty Reference, kt6n majq odpowiednie whkiwofci i metody.
Na przykM pokazana ponitej procedura wyiwietla okno informacyjne z wMciwo8ciami
Name. Descrlption oraz F u l l Path dla katdego obiektu Reference aktywnego projektu:
Sub L i s t C f e r m s O
- ..
Dim Ref As Reference
nsg
--
For Each Ref In ktiveWorkbool:.VBhject.Refemces
Msg Msg 6 Ref.Name 6 vbCrlf
-
Msg Msg 6 Ref.Oescripticm & vbCrCf
Msg Msg.6 Ref .Fullpath 6 vbCrLf & vbCrLf
Next Ref
HsgBox Msg
End Sub
Efekt dziahia tej prmdury dla akt)Mmego skwotzytu z sz&ioms odwdaniami po-
kazano na rysunku 282.
(.V-
-- Reference, jej dddanie wyrmga zdefiniowania odwotania do blblioteki VBA
octenslbi!lty.W pzypadku zadeklarowania obiektu Ref Jako zrnlsnnej og6lnego typu
Object, odwdanie do biblioteki VBA Extensibilitynie jest potnebne.
Odwdanie mom t a k t ~ dodd ra pomoq j&ej z dwdch metod klasy Reference. Maoda
AddFrorrFi 1e ponvala dodaC odwohnie, kiedy sq mane nazwa pliku i katalog biblioteki.
J e t l i jest many globalny identyfikator biblioteki (GUID), nalety skorzystat z metody
AddF rwnGuid. Wivej informacji na ten temat majduje sit w systemic pomocy.
Rozdziat 28. + Operacje na kornponentach@yka VBA 733
Slrb Shc*CcnpanentsO
- -
Dim \rgP As VBPrOdect
Set V3P ActiwWo&bod:.YBProject
NlmCcmponents ~ P . V ~ e n t s . C o u n t
-
t e l l s . Clearcontents
For i 1 To NMConponCnts
#am
-
tells(i. 1) 11BP.Wqmnents(tJ.Nane
TYP
Select Case VBP.rlBC0npOnents(iJ .Type
Case 1
-
cells(i. 2 ) 'Mudu'l'
Case 2
-
Cells($. 2) 'Mcdut klasy"
Case 3
-
Cells($. 2 ) 'Userform'
Case 100 ,
-
Cells(1. 2) 'Hodul dokuentu"
End Select
Next l
-
Liczba wlerszy kodu
Cells(1. 3) V B P . V B C o n p o n w t s i f ) . ~ l e . C w n t U f L t n e s
End Sub
734 Czgg VII + lnne zagadnienia
Rysunek 28.3.
Wynik wykonania
procedury
Sho components
b.pa Ten pnykfad jest dostepny na Wie CDROM dotqcmnej do kslqtki. Zawiera
c
-, odwohnie do blblioteki V8.4 &renslbillty.
-
Sub @eginUpdate()
Filename "SkoroszytU2ytkownika .xls'
' Uaktywnienie skoroszytu
On Error R e s w Next
Warkbooks(Fi1ename) .Activate
I f Err 0 Then
MsgBox Filename I' musi b y t otwarty!", v b c r i t i c a l
E x i t Sub
End If
--
Msg "Makm zastepuje modul Hcdulel w skoroszycie SkomszytUtytkcwnlta.xls '
-
Msg Hsg & "jego z a k t u a l i z w o * wersjq.' IvbCrLf L vbCrLf
Hsg Msg & 'Klikni j OK. aby kcntynuowat."
IfMsgBox(Msg, vblnfonnation + vbOKCance1) vMK Then -
Call R w l a c e M u l e
Else
MsgBox "Modul n l e zostal zastapiony!', v b c r t t i c a l
End If
End Sub
Kiedy uZytkownik kliknie OK, wywchna zostamie procedura Replacenodule (listing 28.3).
Jej w y k o n a n i e p o w o d u j e zastqpienie istniejqcego modulu Module1 w skoroszycie Skoro-
szytUiytkownika.xls zaktualizowanq wersjq zapisanq w s k o m z y c i e zrrstqp moduf.xls.
-
Eksport modulu M u l e 1 z tegn skoroszytu
Filename ThisWockbmk.Patn 6 "\tempmodxl~x.bas'
ThlsUorkbmk .VEProject .YBCcnponents( - W u l e l ' ) -
.Export Fi lenam
I
'
-
Zastapienfe tmdulu nodule1 w StoroszycleUtytkownita . x l s
Set VBP ActiveUorkbwA .VEPmject
On Error GoTo ErrHandle
With VBP.VKmponents
.Remove VW.VBCmponents('nodulel"1
.Imp~t-t F i l e n a w
End With
ErrHandle:
' Czy w y a p i l Mad?
t4sgbx 'w. H3dul n i e zostal zastqpiony.'. -
vbCrl t i c a l
End Sub
PI.bcedura z listin@ 28.3 wykonuje nastppujzp czynnobci:
1. Eksportuje rnodul nodul el (zaktualizowany modut) do pliku Nanva pliku
(tempmodmrbar) wstah tak wybrana, aby mniejszyt pmwdopodobiefistwo
zastvienia istniejqcego pliku.
I
2. Usuwa modut Module1 (stary rnadut) ze skomzytu S k o r o s z y t U ~ t ~ n i k o . x l s
za pornoca rnetody R m v e kolekcji VBCanponents.
3. Irnportuje mdut (zapisany w kroku 1.) do skoroszytu SkormqvtU~tkownika.xls. I
-
Dodanie przyclsku CumnandEutton
Set Ne*&rtton NewSheet.OLEObjects.Pdd -
t'Fonns.CarmanCButtan.1')
---
W t h NewButton
.Left 4
.Top 4
.Width 100
.Height = 24
.Object.Caption
End u i t h
- "Patrdt do akusza Arlruszl'
'
--
Oodanle procedury obslugi zdarzenia
Code 'Sub CamandButtonl-C1IckI 1' & vbCrLf
-
Code Code h '
--
Code Code h '
W Code h '
On Error Resm Next" & vbCrCf
Sheets('"ArLuszl"").Activatem 1 vbCrLf
I f Err 0 0 Then" 8 vbCrLf
--
Code Code h '
Code Code & '
Hsgbx '"Me m i n d u a h y m i t arkusza Arkuszl.""' b vbCrtf
End I f " 8 vbCrLf
Code Code & 'End Sub'
Rozdzld 28.4 Operacje na komponentachjpzyko VBA 737
Nth IctlwWork~.Wro.iect.-
-
VBConponents(NRIYleet.Nam) .CodeWodule
NextLlne .CouotOfLines + 1
.InsertLines NextLine. Code
End With
End Sub
Uysunek 28.5.
Ten arkusz
m z z p-zJdskiwn
oraz procedum
obshrgi .?damenla
dodano za p o w 4
kodu V8A
Ciekawym elementem tej pmcedwy jest wstawimic kodu VBA do moduh kbdu noweno
arkusza Kod jest zapisanjw nniehej o d e Code, a ! a x 4 instrukch koficzy sekwcn&
mak6w CR, LF. Metoda ImertLines m w i a kod do rnodulu kodu unvorzonego arkusza.
W zmienmj NextLine zapisano numn ostamiego wicrsza w module powiqkszony o je-
den. Ddcki tcmu paaadura zostanie dodana na koncu modulu. Wstawienie kodu od
pienvszego wiersza spowodowabby blqd w przypadku, gdyby w systemie utytkownika
ustawiono autornatycme wstawianie instrukcji Optlon Explicit do katdego moduiu,
poniewa instrukcja ta musi byd zawszc pierwsq instrukcjq w module.
Rysunek 28.6.
Ta pocedura obslugl
rdamnia m s t h
wygenerowana
za parnow kodu W3.4
738 QqfC VII * lnne zagodnienia
Rysunek 28.7.
i rym oknie
P ~ q c l s kw
UserFom Zostaly
W a n e auto^
za p o r n @kcldu VBA
Operacje z formwlarzaml U s e r F m
w fade projektowania i wykonania
Operacje z kontrolkami formularzy U s e r F m w W e pmjehwania macmie r&hiq sip
od podobnych opmcji w fazje wykonania Te astamje E$ widocme podczas wygwietlania
fomularza U'erFmrn,ale miany nie sq tnvale. Motm na w k M napisat kod anie-
n i a j w wl&ciwoSC Caption formulana U s w F m p m djego wygwietleniem. Nowy lytul
jest widoczny, kiedy okno wygwietla sip na eknmie, ale po wejSciu do edytora Visuul
Bmicokazuje siq, te wlaSciwoSE Caption nie mienih sie. Wiele przyklad6w k& wy-
konujqcego operacje z formulammi UserForm i ich kontrolkami w fazie wykonmia
zaprezentowano w cqgci IV niniejszej k s i w i
-
Z kolei operacje wykonywane w h i e pjektowania sq twah efek jest taki saa,
jakby zmiany byly wykonane nymie nr pornocqmqdzi w edytom Visuu1 Baric. Zwykle
pneprowadza sis je, aby zautomatytowat mudne czynndci podczas p j e k t o m i a for-
mulamy b'serFcwm. Aby wykonat opcracje w fazir pmjektowania, nalegf wykorrystat
obiekt Designer.
I Rozdzial28. + Operacje na kornponentoch jezyko VBA 739
-
Dim Butn As ConnandButton
Set Butn UserFonl , f m t r o l s . Add("Fons.CarmandBucCtan . I " )
-- -
WIth Butn
.Caption 'Oodany w fazle wykonywania'
.Uidth 100
.Top 10
End With
UserFoml .Shw
End Sub
-
Dim Etutn Cls CmnandButton
Set Bum lhis'Aorkbaok.VBProject .VKmpments[ 'UserForn11~) -
.bsigner.Cartmls.Add('Forms.ComMndButton.l')
-- -
Y i t h Bwtn
.Captian 'Cbdany w fazie pmjektwanla'
.Width 120
.Top 40
End With
YBA. UserFoms.Add~'UserFoml" .Shew
End Sub
Sub WdlOO&rttonsO
Dim x as Object ' VB Project
Dim UFvbc k Object ' VBCamponent
Dim (Nod As Cbject ' C o d W u l e
D l m ct: As Control
Dim cb As Comndhtton
Dim n As Integer, c As Integer, r As Integer
Dim code As String
-
On Error Resune Next
Set x ktiveYorkbook.V@Froject
I f Err 0 0 Then
M@Jx 'Ustawlenla zabezpluml nie p 0 M l a j 4 na wykonanje tego ~nakra.'. -
vbCri t i c a l
On Error GoTo 0
E x i t Sub
End If
Set UFvbc - Thisworkbock .VBProject .VBCanpolents( IlserFonl')
' k u n l w l e a z y s t k i c h kcntrolek. jeSll jaklef ra
Fw Each c t l I n UFvbc.Designer.Contmls
UFvk.Designer.CMlttols.Rea~ve c t l .NMle
Next c t l
' Usuniwle kodu VBA
UFvbc. CodeHodule.Deletdlnes 1. UFvbc .CodeModule .CnntOfLines
-
For c 1 To 10
Set cb UFvbc.Designer.Cwltrols.Add('Fonns.ComMndhtton.l')
With cb
.Width 22 --
-- -
.Height 22
.Left (c 26) - 16
.Top (r * 26) 16 -
.Caption n
End With
--
Hi t h U F v b c . m u l e
code "
code code L 'Private Sub CamndButton" In & "-Clickm & vbCr
code = code & 'Ftsgbox "To jest przyctsk OmandEuttar n r ' -
-
& n L ""'& vbCr
code code L ' h d Sub'
.InsertLines .CwntOfLines + 1, code
End With
n - n + l
Next c
next r
End Sub
I Rozdzial28. Opemcje no komponentach jezyko V M 74 1
I
I
Pracedura AddlOOButtons wymaga zdefiniowania fonnularn! UserForm o nazwie User-
Forml. NaleS nieco powickszyt rozmiar okna f m u l a m UscrForm w porbrmaniu
z domyflnym tak, aby pnyciski sip nniebity. Procedura rozpoczyna sic od u s u n i ~ i a
wszystkich kontrolek z formularza za pomocq metcdy Remove kolekcji Controls, a na-
stcpnie u s u n i ~ i acatego kodu z modutu kodu za pomocq metody Del eteLines obiektu
CodeModule. Nastcpnie w dw&h ~ t l a c hFor .. . Next sq dodawane pnyciski i bardm
proste proccdury obshgi zdarzch. Ponitcj zaprezentowano przykhd takiej pracedury
dla pnycisku ComnandButtml:
Private Sub CcmandButtonl-Cl Ick( )
Msg80x 'To j e s t przyclsk CannandSutton nr 1'
End Sub
Zrozumienie sposobu wySwiet!ania formulana UserFom zam mi spwb czasu. Gdy for-
mula= UserForm zawierajqcy 100 pllyciskbw jest generowany, w rzecywistoki istnieje
w pamiqci VBA, ale nie jest jeszcze oficjalnq cyfciq projektu. NaleZy zatem wykony-
stad metodp Add w cclu formalnego ddqczenia okna UserForml do kolekcji UserFonm.
Wartoit zwracana pnez tq merod? j e t odwdaniem do formularza. WMnie dziei temu
wywdanie metody Shcw moms umicSciC na koftcu metody Add. Tmba jednak parniqtak,
aby przed w c i e m formularza UserForm d h c z y t go do kolekcji UserFoms.
Sub MakeFmO
Oim TempFon As Object ' VBComponent
O l m NewButton As %Forms.tomnandButton
Dim Line As Integer
Dtm TheFon
npplicatton.Y6€.~lnWind~.Vtsible False -
-
Utworzente f o m l a r m UserFonn
Set TempFonn Thi sIJorkbwk.VBPmject. -
VBCcmponents. Wd(3) ' stala vbext-ct-KFom
---
W t h TempFonn
.Propertles('Capticn') ' F o m l a r z tymczasowy'
.Properttes('Width') 200
.Properties('HeigM') 100
End With
-
Dodanie p n y c l s k u CannandButton
Set Neksutton TenpFonn.Designer.COntro1 s
.Add("Fonns.CmndSutton.l'l
-
-- -
WIth Neweuttm
.Cap:ion 'K1ikni.j rmie'
.Left MI
.Top 40
End With
' Dodanie Qrocedury &lug1 zdarzenla d l a przycf sku
-
W i t h TennForm.CodeMcdule
Llne .CountOfLirws
.InsertLines Line + 1. 'Sub CarmandButtcnl-ClickO'
.InsertLines LIne + 2. "MsgBox ""Uitaj! ""'
.InsertLines Line * 3. "Unload He"
.InsertLines Line + 4. 'End Sub'
End W t h
Usunlecie f o m l a r z a
ThisMrkW.Wmject.VBCcnponents.Mve TenpFom
End Sub
Rozddat 28. + Operacle na komponentachjmka VBA 743
Rysunek 28.8.
Ten fonnulan UserFcmn
o m zwiqzany z nim kod
zostal utworzony
.w locie '
Jedna z pierwszych insbukcji ukrywa okno Visual Basic popmez ustawienie whkiwoki
Visible na wartoit False. Wykonanic tcj instrukcji eliminuje rniganie ekranu, ktore mote
wystilpid podczas generowania formulana i kodu.
-
Ukrycie &na YBE w celu zapobietenia miganlu ekranu
P p p l i c a t i o n . V B E . ~ a i n W i ~ . V i s i b l e False
-
Utwarzenie f o m l a r z a UserFom
Set TmpFon
TempForm.Properties('Width')
t
-
Thi sWorkbook . i B ~ r o j e c.YBCarponents.Add(
300
31 vbext-Et-Worm
-
Malblidth = 0 ' Zapamietuje szemkoSC najszerszef wji
-
For 1 LBwnd(@Array) To U B o u n d ~ ~ r r a y )
Set NMptiPnButton TenpFom.Cmigner.Controls. -
Add('foms.Option8utton.i')
--
With NMIptionButtm
.Yidth 800
--
.Caption Op4rray(i 1
.Height 15
.Left 8
.Top TopPos
.Tag i -- -
.Autosite T n n
-
IfDefault 1 Then .Value T n n - -
If.Width Fbxliidth Then Maxlildth .Width
End With
-
T o m s TopPos + 15
Next i
-- -
With NewCnmandBvttonl
.Caption 'Anuluj'
.Height 10
--
.Width 44
.Left MxWldth 12
.Top 6
End With
-- -
W I t h NewCarmandButtonZ
.Caption "OK'
.Height 18
--
.Width 44
.Left MaxWidth + 12
.Top 28
End Ul t h
' Dadante pfaedur obslugl zdaneh dla przycl4Cw
Code-"
--
Code Code L 'Sub Cnanan4EJuttonl-ClickO" IMrCf
-
Gxle Code L ' GEWT:ON-RET-VPL-False' 6 vbCrLf
Code Code 6 ' Unload He" h vbCrLf
--
Cale -Code & 'End Sub" A vbCrLf
Code Code & 'Sub Cansnd<t0n2_ClickO' & vbCrLf
--
Code Code 8 ' Mn el" 6 vbCrLf
Code Code 1 ' CSmPTIOH-RET-YPL -
False' & MrLf
--
Code Code 8 '
W Code 6 '
-
Code Code I" For Each ctl In Me.Controls' IvbCrCf
-
I f Typer(mIct1) "OptlonButton" Then' 1 vM;rCf
I f ctl Then ~ I O N - f E T R F T V A Lctl .Tag' 8 M r L f
--
Code-&&&' End1f"LvbCrLf
Code Code 6 ' Hext c t l ' & vbCfLf
-
Code Code 8 " Unload Me' & v~Wf
Code Code 6 'End Sub'
Wlth TenpFm.CodeWule
.InsertLlnes .CountWLim + 1. Code
End With
Rozdziol28. Operacie na kornponentach VBA 745
.Properties("Uldtll") --
I f .Pmpertles('Wldth") 160.Then
160
newCmndButtonl.Left
NewCmandButton2.left -106
106
End I f
-
.Pmperties['HeipM') TopPos + 24
End Wlth
a G ~ e t l e n l ef o m l a r z a
VBA.UserFoms.Add(T~Fonn.Nane).Show
' Usunlste f o m l a r z a
Thi sWortbaok .VBPmject .VBtoRponents. Remove YBCanpanent :-TenpFom
'
-
Przekazanle wybranej opcji do prmedury w i u j a c e j
GetOpt ion GUOPTIW-RU-Vbl
End Fvnctlon
Gpsll) --
Dim UserOption
'Pdlnoc'
--
Ops(2) 'Poludnie"
Ops(3) 'Zachbd"
Ops(4)
--
'Wschbd'
Ops(5) "Wszystkie regimy'
UserOption GetOptlon(0ps. 5. "Hyblerr reglcn')
MsgBox Ops(UserOption1
End Sub
Zmienna UserQption zawiera numa indeksu opcji wybranej przez u2ytkownika. Jeteli
utytkownik kliknie AnuIuj, micnna UserOption tostanie ustawiona na wartost Fa1se.
FormuIan UserFonn wygenerowany p m z powytst;l W c j p pokazano na rysunku 28.9.
Rysunek 28.9.
Ten formularz UserFom,
zostat wygemwany
za pomocq funkji
GetOption
sp* Fmulam US& dostosowuje svJd1 rozmler do liczby element& taMicy pnekmmej
jako argument funkcji. Teoretycznie funwa GetCptim mote mqt? tablisp dowlnych
mmiarbw. Jednak w praktyce naleiy ogranic* Ilczbe opcji tak, aby utrryrnaf roaiar
okna na sensownym poziomle.
-
Sub CarnandButtonl-Cl ick()
GI~OPTIOH-RET~YAL Fa1se
Unload He
End Sub
Rozddof 28. Operacje no komponentach jezyka VBA 747
Sub CamndButtonZ-Click0
Dim c t l
G€rOPTI(lY-RET-VAL - Fa1se
If TypeNaMct.1) -
For Each c t l I n Me.Controls
-
'OptionButton" Then
If c t l Then GETI)PTION-RET-VAL c t l .Tag
End I f
Next c t l
Unload Me
End Sub
Wykrycie miany stanu klawisza NwnLock wymaga zastosowania kilku funkcji inter-
fejsu Windows API, a konkretne pmedury r6hiq siq w zaletnoSci od wersji systernu
Windows. M t k o rn6wiqc. jest to zadanie doSC skornplikowane, a modul klasy ma je
uprotit. Wszystkie deklaracje API i kod urnieszczono w module klasy (a nie w nvyktych
rnodulach VBA). K o w c i ? Praca z kodem stanie sip latwiejsm, a nowy rnodul klasy
btdzie m o h a wykonystaf w innych projektach.
M o a a tet mienit stan klawisza NumLoek poprttz mianp wkkiwoki Value. Na ptzyklad
wykonanie ponifszej instrukcji spowoduje wlqczenic klawisza NwnLock
HmLoEl:.Valw - True
Modul Wasy zawiera kad, kt6ry definiuje obi& w@ie z jcgo wlakbdciarni i metoda-
mi. Nastqnie moha utwomyt egzemplarz tego obiektu w module kodu VBA i wykonywak
dzialania z w ~ i w o S c i a r nii metodami obiektu. Aby lepiej zrozurniek proces tworzenia
rnoduiu klasy, przeanalizujcmy instrukcje zapmentowane w kolejnych punktach. Roz-
pocmicmy od utwomnia pustego skoroszytu.
---
Deklaracje stalych
Const VK-NUHLOCK &It90
Const VK-SCROLL bH91
Const UK CAPITAL &HI4
-
- -
Const KE~EVENTF-EXTEWECUEY WI
Const KEYEVENTF-KEYUP &?
Const VER-PLATFORM-WIN32-NT
-
Const UER-PLATFORM-WIN3Z-UIMWS
2
1
%+*
C
Kod VBA z a ~ o w ~ wntyrn
y rnzddale utwwzono ne podstawie przykladu
z a m i e s m n e g o w Mtrynle W Microsoftu.
-
etKeyboardState keystO)
Value keys(YK-WOa:)
End Property
Szczeg6bwe Infonacje o pmaedursdr Property m t n a mat& w dal- -9cl
mxtzlatu. w punkclc .Programowanie IIO1Ciwhl obieLl6wm.
waaaa I
Powytaa procedura, w k t b j do spmwdmia biewego m u klawisza N u m M wyko-
n p a n o fimkcje interfcjsu Windows API GetKeyboardState, jest wywdywana za kaZdyrn
r a m , kiedy w kodde VBA m i & h i e do wi&iwoki Value obiektu. Na pcqkkl
jej uruchomienie spbwodujc pmibza instrukcja VBA:
HsgBox Nunlack .Value
Teraz ustawimy odpowiedni stan klawisza NurnLock wkqczony lub wylqcwny. Mobla
to w b j t za p o m q pmcedury Proprty Let z Iistingu 29.2.
M n g 29.2. U m a n l e adpowtedniego stanu kIawlsza h L o c k
Property Let ValuefbooiVal As Boolean)
D t n 0 AS MYERSIONINFO
-
D i m keys(0 To 255) As Byte
o.du(3SVersionInfoSize Len(ol
GetVersionEx o
GetKeybaardState keys(0)
--
' t r y DieLqcy =an jest o d w e d n i ?
--
I f boolval True &td heys(VK NUnL(XX) 1 Then Exlt Pmperty
I f baalVal False And k e y s ( ~ ~ i i ~D ~Then
l Exit Property
Rozdzid 29. Mod* klas 753
E l s e l f o.dwP1atfonId -
~ e t ~ e y b o a r d ~ t teys[Ol
ate
Proccdura Property Let pobiera jeden argument: True lub False. Po jej wykonaniu po-
nitsza inmkcja ustawia wtalciwoM Value obiektu Mumlock na wart056 True:
HmtOel .Value - True
-
GetKejboardState keys(0l
If o . d 9 l a t f o m I d VER-PLATF~BH-WIU~~~WIMMS Then ' (Wln95)
keys(VK-WaX} -
Prrelpczenie tlWsza Hurlock
-
Ilf(keys('VK-MIMOO:) 0. 1. 0)
Elsel f o.bPlatform1d -
SetKeybarGState keys(0)
YER-PtATFCRJ+-YI#32-hl Then ' (WlnNT)
S y w l a ~ awci <nlwia klawlsza
keybd-went VK-NUMOCK. W45. KETDIEWTF-EXTEHOEOKFI O r 0. 0
Symulac~arwolnienia tlawisza
keybd Gent VK-NUKNK. W45. KEYEYMTF-EXTEMIEEEY Or -
KEYNEW-KEYUP. I)
End I f
End sib
Maada Toggle jest standardow4 p m c d q Sub (a nie pmcsdurq Property Let lub Pro-
perty Get). Zapreantowana pooi2ej instrukcja VBA ptzetqcza stan klawisza N d o t k
papraz wykonanie proccdury Toggle:
Ikmodc.Toggle
N m q typu obiektu jest NurlcckClass (m.namq moduh klasy). Nazwa miennej obiek-
towej mote by6 dowolna, ale N d o c k w tym przypadku wydaje sip mhym wyborem.
Ponitsza p d u r a ustawia wlaSciwoft Value obiektu NumLock na wartoit True. Wyko-
nanie procedury powoduje whczenie klawisza NumLwk:
Sub N~n-mockhO
N~mLock.Value True
End Sub
-
D i m Nurrlock As New NunLadrClass I
Sub Toggl ~ o C t Z (
-
Dim W o c k As 891 WoctClass
NumCock .Value Not NNlanlock.Value
End Sub
1
Kornpktny rnodut klasy dla tego prvkhdu jest dostppny na m i e CDROM dc+wzand ,
I
do ksigtki. Skorosqt &era takle rnodul Wasy rmotli!Ma]qcy y V F m l e i vstawianle I
stanu klawlsry CapsLock orar ScrollLock
Definiowane wlahiwdci obiektu mogq rniet status tylko do odczytu, tytko do zapisu lub
do zapisu i odczytu. WMciwoSf p/ko do odczytu definiuje sip za pomocq jednej proce-
duty z utyckm sbwa kluczowego Property Get. Oto pnyklad:
Pmperty Get FileNamOnly() As String
-- -
F i l e N a M n l y ""
For i LenCFull Name1 To 1 Step -1
If Char -
Char Mid(Ful1Name. i . 1)
"\" Then
Exit Function
Else
-
FlleNamdSlly Char & FlleNameOnly
End If
Next i
End Property
DIa wWciwoici ub d q t u izopiru hvony sic dwie procedury: Proprty Get (do day-
tywmia wartoJci wlaSciwo5ci) m Property Let (do mpisywania wartoSci wkxkiwofci).
Wartoft przypisywana do wMciwo2ci jest przekazywana jako argument procedury.
Ponitej zapaezentowano dwa pryklady procedur:
Dim XLFile As Boolean
SawAsExEelFile XLFlle
End Property
-
Property Get SaveAsExcelFileO As Boolean
-
Property Let S a v ~ E x c e l F i l e t b m l V a lAs Baalean)
XLFiFe boolVal
End Property
.33$?%Jeteli
*
zmlast
MakimrSC Jest typu obiektcwego, nalsty wykonystd procedup Property Set
procedury Prcperty Let.
5mBa
Jako WWWO
E
X obiektu m i n a r6miet wyk- z m i q public- zadeklarowuq
w module k l q . W popnednim pzykladzie m o a a wyeliminowad procedury Property
Get oraz Property Let i zas$pid je deklaracjami podornu modutu:
Public SaveAsExcelFlle As Boolean
-
Property Get ExportRangeO As Range
Set ExportRange RangeToEwrt
End Property
Set RangeToExport r g
End Property
-
Property Let ExportRarge(mg As Range)
-
Property 6et ImportRange() As Range
Set InportRange I~nportTotel1
End Prope-ty
Procedura Export
Procedura Export z listingu 29.5 jest wywdywana w rnomcncie wykonywania metody
Export. Pobiera jeden argument: pdnqnazwq pliku, da kt6rego zostanie zapisany wyeks-
portowany zakres. Pmedura zawicra prostq obshgq MMFd6w. Miedy innymi wymusza
ustawienie wlakiwoki ExwrLRarqe poprntz sprawdzenie zmiermej RangeToExport. W celu
Sledzenia innych bl~d6ww procedune zdefiniowano blok obslugj Wd6w.
Sub Export(UYF11eNme)
'
Eksportuje zakres do pliku CSV
Dim ExpBwk As Workbook
01 E m r GoTo E r M l e
-
Appl Ication.ScreenUp3atiw -
False
Set ExpBool: Workbmt s .PddlxlMrksheet)
RangeToExwrt.Copy
Rozcfiiat 29. + Mod* klas 759
Ppplication.OisplayAlerts
With ExpRwL
- False
.Sheets{l).Paste
.Save& F i leName:-CSVFileName. F i l e F o m t :-xlCSV
.Close Savc0anges:-False
End W l t h
@1 tcatlon.CutCopylWe False --
npoltcation.Screenupdating True
A~lication.DlsplayAlerts True
E x i t Sgb
-
ErrHandle:
Appl ication.CutCopyMode --
ExpBook .Close SaveChanges :-Fa1 se
':alse
Application.0isplayAlerts True -
Appl lcation.ScreenUpdating True
MsgBox "Error " & Err & vbCrLf & vbCrLf & Error(Err). -
.
v b c r i t i c a l 'B1a.d metody Export'
End Sub
Procedura Import
Procedrna Inport z l i g u 29.6 impoituje p l i CSY M l o n y przez argument CSVFileNam
C z a h s u okreSlonego miennq ImportToCel 1, kt6nj warto&
i kopiuje jego ' ~ ~ w a r t ddo
odpowiada wlaSciwoki InportRange. Po wykonaniu tej operacji plik jest m y k a n y .
Poniewat i tym razem aktualizowanie e h u jest wykpmne, utytkownik nie widzi otwar-
tego pliku. Pohbnie jak procedura Export, proccdura Impon zawiera pmsq obshg~
Mcd6w.
I f IlnpdrtTDCell Is M t h l n g Then
MsgBox 'Hie z d e f i n i m n o z a k r e a laportRange'
E x i t Sub
End If
-
Workbooks .Open CSVFi leNatne
Set CSVFile ActiveWorkbook
Activesheet .UsedRange .Copy Destination:-ImportToCel l
--
CSVFi 1e.Close SaveChanges:-Fa1 se
Ppplication.kreenUpdating T N ~
Ppplication.0isplayAlerts True
Ex1t Sub
ErrHandle:
--
CSVFi 1e.Close SaveChanges:-Fa1 se
Ppplication.kreenUpdating True
~plication.0isplayAlerts True
MsgBox "Error " L Err & vbCrlf & vbCrLf & Error(Err). -
.
v b c r l t i c a l 'Bqad metody Import"
End Sub
Motna tet najpinw zadeklarowaf miennq obiektowg a obiekt utworzyf wtedy, kiedy
W z i e potrzebny. Taka operacja wyrnaga utycia instrukcji D i m i Set:
Dim CSYFlle As CSVFileClass
Set CSVFile -
rvtqmduamkieYimrykod
Heu UVFileClass
-
Dtm CSVFlle As NEWCSVFIleClass
CSvfi 1e.ExportRange ActlwWi&u.RangeToExport
CSVFt le.Expf-t 13VFlleName:-Thf s'dorLbook.Path 8 '\temp.csv'
End Sub
--
Dim CSVFile(1 To 3) As Nen CSVFlleClasr
CSVFile(1) .E ~ r t R a n g e Range('A1 :A2D")
-
CSVFi 1e(2). ExportRange Range('01 :B2Du)
CSVFlle(3). ExportRange Range("C1 :C2D")
For r = 1 To 3
CSYFile(i).EXport CSVFi1eNam:-'P11k" L 1 8 '.csv"
Next i
End Sub
S korowidz
IIADR!, 73.767 Addlns, 168,598
#ARG!. 73.268.778 Comments, 600
#DZIEUD!, 73 dodawanie pozycji. 598
#LICZBA!. 73 Fullname, 599
#N/D!. 73 Installed, 600
#NAZWA?, 73 Name,599
#ZERO!. 73 Path, 599
<head>, 93 Titlt, 600
<style, 93 usuwanie pozycji, 599
<rablu, 93 wlaSciwoSci, 599
zdmnia, 602
AddinUninstall. 542
A Additional Controls, 393
Al. 65 AddMenurtern. 655
AbortPmc, 539 Address, 170,702
AbuthgStleetion. 300,301,302 AddShcetAndBunon. 736
Abs, 81 1 ADO, 37,55,579
Accelerator, 375 pobicranit danych z pliku A c c e m 580
Access, 478,580 adm URL. 566
Activate, 294,385,386,490,508,542,543,548, A M M L E x p o n . 542
553.559 AAnXMLlmpon. 542
Activecell, 178 aktualiracja
ClearContents. 179 aplikacji. 133
SeIeclion, 179 modulu VBA. 734
Activechart, 178,485,490 aktywacja
Deseltcq 49 1 aplikaeji. 567
Activesheel 178 Excola, 32
Name, 179 H Y ~ 490 .
ActiveWidw, 17% Alarm, 342
Visible, 491 ALLBOLD, 325
Zoom 403 AllCells, 3 1 1
ActiveWorkbook. 147, 178,486 AlIVisiblt, 213
Nam+ 179 analizq 56
Savcd* 775 Analysis TaolPak, 56
ActiveX. 95, 122 automalycme sumy a@ciowe, 56
ActivcX Data Objects, 37 danych, 37
Add 1aOButtons. 740 funkcji niestandardowj, 264
Addcomment, 177 konspckry, 56
AddConml, 559 narr@zja. 56
AddFromGuid, 732 Solver, 58
AddinInstall, 542 aatystycq 56
tabcle p3-=smwne, 57
838 Oodatti
przetwivranie w p q l i 494
rejatmwanie rnakr, 487 xl24HourClock, 704
samorozszenajqce s i 524 ~ xl4DigitYcars. 705
xria danych, 500 XLA. 37.59 1.594
stcrowanie xriami d a n m 522 XLB, 91
testowanie aktywacji. 492.784 xlColumnSepsrator, 703
twonenie, 52 xlCountryCodq 703
usuwanie arkuszy, 492 xlCountrySetting 703
usuwanie elerncnt6w z koldtcji m b j c c g 492 xlCurrcncyBefo~,704
VBA. 485 xlCurrcncyCode, 704
wyr6wn-vwanie, 494 xlCurrencyDigits, 704
wyiwictlanie ctykict, 503 xlCurrcncyLcadingZms, 704
wySwietlanie telrstu. 5 17 xlCumncyMinusSign, 704
wyhvietlanic w formulam UscrFonn, 505 ~ICumncyNcgative.704
XY. 504,518 xlCunmc$paceBefore. 704
zakres danych, 500 xlCurrcncyTrailing2eraq 704
zapisywanie w pliku. 443 xlDatcOrder, 704
tapisywsnie w pliku GIF, 443,776 xlDateSepamtor. 704
zapisywanie wielu wybcsdw w arkusu-wyltreJic, xlDayCode, 704
521 xlDayLeadingZcro, 705
zdarntnia, 507.553 x l D e c i r n a l S e ~ 703
,
zcgar, 520 xlDialogChartType, 792
miana rozmiar6w. 494 xlDialogFontProperties,362
wyhywanie xDialogFormulaGoto, 361
W d w , 283 xlErrDiv0, 279
wciSnip5a klawiszn Shift, 289 xlErrNA. 279
a y b p a n i e obslugi u k c h , 538 xlErrNamq 279
wymapnia utytkownik 1 18 xlEnNull, 279
wymuszanie deklaracji zmicnnych, 197 xlErrNum. 279
xlErrRef, 279
xlErrValuc, 279
XLFile, 756 zabczpiaztnia mak, 770
xlGencralFormatName, 704 takhikowc o h a dialogowe, 369
xlHourCode. 704 zakoficzmie pracy Excela, 78 1
XLL, 59 1 zakresy, 179
xlLandscapc. 202 aktywacja, 781
xlLeftBrace. 703 Cells, 181
xlLetlBrack*. 703 ekspolt do pl:h HTML.723
xlLiaSeparator. 703 eksport do pliku XLM, 726
xlLowcrCascColumnLener. 703 idcntyfikacja. 294
xlLowerCaseRowLener, 703 kopiowanic, 292
XLM. 34.42.52, 140, 141 monitorowanie rnodyfikacji. 549
xlMDY. 705 monitorowanie pugrubienia zawartoSci k o m k k
xlMaric, 704 z formulami, 549
xlMinutcCode, 704 monitorowanie poprawnofci danych, 550
xlMonthCodc. 704 nazwy, 67.782
xlMonthLeadingZero, 704 odczytywanie, 305
xlMonthNarneChaq 704 okno wprowadzaoia danych 350
xlNoncumncyDigits, 704 okrdlanie typy 300
xlNonEnglishFunctions. 704 porqdkowanie w s+b losowy. 336
xlportrait, 202 prrenoszenie. 293
xlRightBracc. 703 prrenosrcnie zawartofci do mblicy typu Variant,
xlRightBrackct 703 3 08
xlRowScparator. 703 przawarranic, 294
XLS. 40.87.90 przawartanie bm6rek 302
I xlSecondCode, 704 przetwammie VBA, 291
XLStart. 85. 165 Range. 179
xlThousandsSepanrtor, 703 tymcrasowc tablice. 307
xlTimeLeadingZero. 705 w e r y f i k j a poprawnofci danycb. 550
xlTimeSeparator. 704 wypelnianie metodqsiiowq, 306
xlToLeK 295 zapisywanie. 305,306
.xlToRight. 295 z a w i m i e w innym zakmie. 304
xlUp. 295 zaznaczanie, 397,781
xlUppuCascCdumnLenet, 703 z a m a c m i e malcsymalnej wanofci. 309
xlUpperCaseRowLmn; 703 tamaczanic r62rego typu, 294
xlw. 90 zmienna wielkoi& 293
I xlWeekdayNameChars, 704 Zamknij. 400
xlYearCode, 704 ramrotenie okicn, 256
XML, 36.56.94. % zamykanie
dokumenty. % fomulana UscrForm, 375.377
W r t , 96.99 skomsq46w. 3 12
1 imporf 96.97 zapisywanie
I import do listy, 99 plik6w tekstowych 716
! m v y , 97.98
macmiki. 96
njestru systemowego, 342
ustawid narqdzia, 465
Xor. 205 wielu wykrcs6w w nrkuszu-wybesie. 523
XValues, 501 wsrystkich skoroszytbw. 312
XVALUES-FROM-SERIES. 501, 503 wykrcsu do pliku, 443
lvySwietlanie daty, 325
m k n d w , 305.306
Z a p i e jako stronq sicci Web, 95
zaqldzanie
Excelem 576
Word- 573
micg Error, 387,559
funkcji. 266 Exit, 387
proccdury, 228 FollowHypalink, 548
nnicnnych, 197 formularzy UserForm. 385,558
zasoby online, SO1 gcnerowane pnez klawiatuv, 387
mtqpczy P w k menu arkusza kalkulacyjinego, 659 generowane pnez mysz 387
zastepowanie moduiu uaktualnionq wersjg 734 infarmacje, 536
zaznaczanie In~tialize.376,385,386,391. 559.757
kombrek okdlonego formatu. 3 10 KeyDown, 387.559
maksymalnej wartolci zakrcsu, 309 KeyPnss. 387,559
obiekt6w. 49 Key Up, 387.559
ostatniej pozycji w kolumnie~wieazu.785 Layous 559
r6tnego typu rakrrs6w, 294 menu. 652
zakredw. 397 rnodub klas, 757
zbiory. 142, 167. 168. 184 monitorowmic. 535
CommandBars. 142 MouseDown, 508,553,559
Comments. 174 MouseMove. 508,553,559
Controls. 390 Mouseover, 517
Dinlogs. 361 Mouseup. 508.553.559
NoDupeq 407 Newsheet. 542.544
UserFonns, 376 NewWorkbook 555
Workbooks. 143. 168 nienv~apnez obiektami, 559
Worksheets. 142. 168 obstugq 535
zdanenia 378 OnKey. 561
Activate. 385,386,508,542,543,548,553,559 OnT~nw,560
Addcontrol. 559 Open. 541.542
Addin, 602 PivotTablcCldonneaian. 542
AddinInstall. 542 PivotTableOpenConnbctim~.542
AddinUninstall. 542 PivotTableUpdate, 548
AAcrUpdate, 387 poziomu arkusza 547
AAerXMLExporf 542 poziomu skoroszytu. 541
AAerXMLImpon. 542 procedury obslugi, 378. 537
aplikacji. 553 QucqClos. 377,386,400,559
Application, 555 RcmoveConbol. 559
BeforeClosc. 542.546 Resize. 508,553,559
BeforeDoubleClick, 508, 548, 553 Scroll. 404.559
BeforcDragOver. 387,559 sekwenqe. 536
BeforeDropOrPaste, 387,559 Selea 508,553
BeforePrint. 542,545 SelectionChangq 437,548.55 I. 622
BeforeRightClick. 508,548,552,553 ScricsChangc, 508,553
Beforesave, 542.544 ShcetActivatc 542,543,555
BeforeUpdatc, 387 SheelBeforeDoubleClick,542,555
BeforeXMLExport, 542 SheetBefmRightCliclt,542,555
BeforcXMLImpo~t.542 SheetCalcutae, 542,555
Calculate, 508,548,553 Sheelchange, 542,555
Change, 387.388.430.547.548 SheclDeact~Mtc.542 555
Cha* 508 SheeffollowHy~ink,542.555
Click, 378. 559 ShcetPi\otTabkUpdat~542. 555
DblClick, 559 ShectSelectionChange. 542,555
Deactivate, 386,508,542. 544,548,553.559 SpinDown, 387
Dragover, 508,553 SplnUp, 387
DragPlot, 508,553 Sync, 542
Enter. 387 Terminate, 377,384,559,757
Skorowidz 87 1