Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Excel. Programowanie
dla profesjonalistw
Autorzy: Stephen Bullen, Rob Bovey, John Green
Tumaczenie: Robert Grczyski, Krzysztof Masowski
ISBN: 83-246-0079-5
Tytu oryginau: Professional Excel Development:
The Definitive Guide to Developing Applications
Using Microsoft(R) Excel and VBA(R)
Format: B5, stron: 768
Wikszoci uytkownikw Excel kojarzy si wycznie z arkuszem kalkulacyjnym
uywanym w biurach. Zdecydowanie mniej osb wie, e Excel jest rwnie potnym
narzdziem programistycznym, za pomoc ktrego projektuje si rozbudowane
aplikacje, wyposaone w graficzne interfejsy uytkownika i korzystajce z danych
zewntrznych, jzyka XML i usug sieciowych. Dziki jzykowi Visual Basic for
Applications (VBA) mona tworzy na bazie Excela profesjonalne narzdzia bardzo
dobrej jakoci.
Ksika Excel. Programowanie dla profesjonalistw to podrcznik powicony
projektowaniu aplikacji w rodowisku Excela, adresowany do dowiadczonych
uytkownikw tego narzdzia oraz programistw. Autorzy krok po kroku wyjaniaj,
jak tworzy dodatki, implementowa usugi sieciowe, projektowa formularze userform.
Ucz konstruowania wykresw i obsugi bdw, pokazuj, w jaki sposb
zoptymalizowa wydajno aplikacji i jak je dystrybuowa.
Najlepsze praktyki programistyczne w Excelu i VBA
Projektowanie arkusza
Tworzenie dodatkw
Sterowanie paskami narzdzi
Korzystanie z funkcji Windows API
Budowanie interfejsw uytkownika
Poczenia z bazami danych
Usuwanie bdw z kodu rdowego
Sterowanie innymi aplikacjami MS Office
Korzystanie z funkcji Visual Basic 6 i VB.NET
Poczenia z usugami sieciowymi
Tworzenie wersji dystrybucyjnej aplikacji
Poznaj zasady tworzenia aplikacji przy uyciu Excela
z tych narzdzi korzystaj najwiksze firmy wiata
Spis treci
O autorach ....................................................................................... 9
Rozdzia 1. Wstp ............................................................................................ 11
O ksice ........................................................................................................................ 11
Twrca programowania excelowego .............................................................................. 12
Excel jako platforma do tworzenia aplikacji .................................................................. 14
Struktura ......................................................................................................................... 17
Przykady ....................................................................................................................... 18
Wersje obsugiwane ....................................................................................................... 18
Rodzaje kroju pisma ....................................................................................................... 19
Na pycie CD .................................................................................................................. 20
Pomoc i wsparcie ........................................................................................................... 20
Spis treci
5
Wdraanie wasnego interfejsu ..................................................................................... 309
Uywanie wasnych interfejsw ................................................................................... 311
Klasy polimorficzne ..................................................................................................... 312
Polepszanie solidnoci .................................................................................................. 316
Upraszczanie rozwoju .................................................................................................. 317
Architektura moduw rozszerzajcych ....................................................................... 326
Przykad praktyczny ..................................................................................................... 327
Wnioski ........................................................................................................................ 329
Rozdzia 22. Uywanie VB.NET i Visual Studio Tools for Office ........................... 639
Oglny opis .................................................................................................................. 639
Jak wpywa na struktur .NET? .................................................................................. 641
Zarzdzane skoroszyty ................................................................................................. 643
Zarzdzane dodatki Excela ........................................................................................... 658
Hybrydowe rozwizania VBA/VSTO .......................................................................... 659
Model bezpieczestwa VSTO ...................................................................................... 661
Due zagadnienia ......................................................................................................... 666
Dalsze rda informacji .............................................................................................. 672
Przykad praktyczny ..................................................................................................... 672
Wnioski ........................................................................................................................ 675
Spis treci
Rozdzia 3.
Najlepsze praktyki
programowania
w Excelu i VBA
Ten rozdzia umiecilimy niedaleko pocztku ksiki, aby zawczasu wyjani, dlaczego w dalszych rozdziaach pewne rzeczy bdziemy robili tak, a nie inaczej. Niestety,
oznacza to rwnie konieczno poruszenia tutaj pewnych tematw, ktre w peni zostan wyjanione dopiero pniej. Dla osignicia najlepszych rezultatw warto przejrze
ten rozdzia ponownie po przeczytaniu reszty ksiki.
Czytajc ten rozdzia, nie zapominaj, e cho opisane w nim praktyki s oglnie uznane
za najlepsze, zawsze bd istniay przypadki, w ktrych najlepszym rozwizaniem
bdzie postpowanie niezgodne z najlepszymi praktykami. Najczstsze przykady takich
sytuacji staralimy si wskaza w tym rozdziale i dyskusjach dotyczcych najlepszych praktyk omawianych w nastpnych rozdziaach.
Konwencje nazw
Czym jest konwencja nazw i dlaczego jest istotna?
Termin konwencja nazw okrela system, jakiego uywasz, nazywajc rne czci tworzonej aplikacji. Zawsze gdy deklarujesz zmienn lub tworzysz formularz, nadajesz
im nazwy. Niejawnie nazywasz obiekty nawet wtedy, gdy nie nadajesz im nazw
wprost, akceptujc jedynie nazwy domylne, czego przykadem moe by tworzenie
formularza. Jednym ze znakw firmowych dobrej praktyki programowania jest stosowanie dla wszystkich czci aplikacji VBA nazw spjnych i zgodnych z jasno okrelon konwencj.
36
Ze sposobu uycia moesz rozsdnie wnioskowa, e jest zmienn. Ale jaki typ wartoci
ma przechowywa? Czy jest to zmienna publiczna, czy o zasigu na poziomie moduu,
czy moe zmienna prywatna? Do czego suy w programie? W podanej sytuacji nie
jeste w stanie odpowiedzie na adne z tych pyta, bez powicenia nieco czasu na
przeszukanie kodu. Dobra konwencja nazw pozwala na odczytanie takich informacji z samej nazwy zmiennej. Oto przykad poprawiony (szczegy zostan omwione
w nastpnym podrozdziale).
glListCount = wksDataSheet.Range("A1").Value
Teraz ju znasz zakres zmiennej (g oznacza global zmienn globaln, czyli inaczej
publiczn), wiesz, jaki typ danych ma przechowywa (l oznacza Long) i masz oglne
pojcie, do czego ta zmienna ma suy (przechowuje liczb elementw listy).
Konwencja nazw pomaga w szybkim rozpoznawaniu typu i celu uycia blokw, z ktrych
jest budowana aplikacja. To pozwala Ci koncentrowa si raczej na zadaniach kodu
ni na jego strukturze. Konwencje nazw su take samodokumentacji kodu, zmniejszajc liczb komentarzy koniecznych do tego, aby by zrozumiay.
W nastpnym podrozdziale pokazujemy przykad konwencji nazw z przemylan
struktur. Najwaniejsz spraw jest jednak wybranie jednej konwencji i jej konsekwentne przestrzeganie. Jeeli wszyscy uczestniczcy w projekcie rozumiej przyjt
konwencj, nie ma waciwie znaczenia, jakie prefiksy s uywane lub jak i kiedy s
stosowane litery wielkie i mae. Zasady przyjtej konwencji powinny by spjne i konsekwentnie, bez zmian stosowane nie tylko w pojedynczym projekcie, lecz rwnie
w duszym okresie czasu.
Konwencja nazw
Zmienne
Stae
Typy definiowane przez uytkownika
<zakres><tablica><typ danych>NazwaOpisowa
Typ wyliczeniowy
<zakres><typ danych>NAZWA_OPISOWA
Type NAZWA_OPISOWA
<typ danych>NazwaOpisowa
End Type
37
(nic) nietablica
38
Typ danych
Prefiks
Typ danych
Prefiks
Typ danych
Boolean
cm
ADODB.Command
cbo
MSForms.ComboBox*
byt
Byte
cn
ADODB.Connection
chk
MSForms.CheckBox
cur
Currency
rs
ADODB.Recordset
cmd
MSForms.CommandButton
dte
Date
ddn
MSForms.ComboBox**
dec
Decimal
cht
Excel.Chart
fra
MSForms.Frame
Double
rng
Excel.Range
lbl
MSForms.Label
Integer
wkb
Excel.Workbook
lst
MSForms.ListBox
Long
wks
Excel.Worksheet
obj
Object
mpg
MSForms.MultiPage
opt
MSForms.OptionButton
sng
Single
cbr
Office.CommandBar
spn
MSForms.SpinButton
String
ctl
Office.CommandBarControl
txt
MSForms.TextBox
User-defined
type Typ
zdefiniowany
Variant
cls
User-defined
class variable
odwoanie do klasy
ref
Kontrolka RefEdit
frm
UserForm
col
kolekcja, zbir
39
zobaczysz dug list skadowych typu wyliczeniowego podajc rne wymiary papierw do drukowania (rysunek 3.2).
Rysunek 3.2.
Lista wyliczajca
dostpne
rozmiary papieru
Te nazwy w rzeczywistoci reprezentuj stae liczbowe, ktrych wartoci moesz sprawdzi za pomoc przegldarki obiektw (Object Browser), omwionej w rozdziale 16.
Zwr uwag na struktur nazw staych typu wyliczeniowego. Po pierwsze, wszystkie
rozpoczynaj si od przedrostka identyfikujcego aplikacj w tym przypadku xl
oznacza Excela. Po drugie, pocztkowa cz nazwy jest opisowa, co wizualnie wie
ze sob nazwy nalece do tego samego typu wyliczeniowego w tym przypadku
jest to Paper. Ostatni czci nazwy wyliczeniowej jest unikatowy acuch, opisujcy specyficzn warto. Przykadowo xlPaper11x17 opisuje papier o formacie 11x7,
a xlPaperA4, odpowiednio papier o formacie A4. Taka konwencja nazw wyliczeniowych jest bardzo rozpowszechniona i zastosowano j rwnie w tej ksice.
Zmienne
gsErrMsg zmienna publiczna (public variable) typu String uywana
Jeeli aplikacja ma by uywana jedynie w Polsce, warto stosowa opisowe nazwy polskie. Jeeli
jednak nazwy odnosz si do typw, narzdzi itp. rodowiska VBA (ktre pozostaje angielskie),
trzeba wystrzega si uywania cakowicie niestrawnej mieszanki jzykowej, ktra moe okaza si
zrozumiaa jedynie dla autora. Warto wtedy stosowa nazwy angielskie. Decyzja dotyczca czci
opisowej bywa niekiedy trudna. Prociej jest z przedrostkami okrelajcymi zakres i typ zmiennych
bd staych, ktre warto uzalenia od angielskich nazw obiektw i typw (np. zmienne musimy
deklarowa jako Long i String, niezalenie od naszych upodoba jzykowych). To pomieszanie
jzykw utrudnia opracowanie logicznej i przejrzystej konwencji nazw przyp. tum.
40
do paska menu.
Stae
gbDEBUG_MODE staa publiczna (public constant) typu booleowskiego
Typ wyliczeniowy
Poniej zosta zdefiniowany typ wyliczeniowy na poziomie moduu stosowany do opisu
rnego rodzaju dni. Prefiks sch okrela nazw aplikacji. W tym przypadku podane
wyliczenie pochodzi z aplikacji Scheduler. TypDnia jest czci nazwy wskazujc cel
tego typu wyliczeniowego, za indywidualne przyrostki pokazuj indywidualne znaczenie
kadej skadowej typu wyliczeniowego.
Private Enum schTypDnia
schTypDniaPozaplanowy
schTypDniaProdukcyjny
schTypDniaPrzestojowy
schTypDniaWolny
End Enum
41
Procedury
Znamy dwa typy procedur procedury typu Sub (podprogramy) i funkcje. Zawsze
nadawaj procedurom nazwy opisowe. Powtarzamy ponownie, e nazwy procedur mog mie 255 znakw i rwnie pojawiaj si na listach autouzupenie wywietlanych za
pomoc skrtu klawiszowego Ctrl+spacja, zatem nie ma powodw, aby powica
dusze nazwy opisujce cel procedury na rzecz innych, ktrych jedyn zalet jest to,
e s krtkie.
Cho nie jest to powszechn praktyk, uwaamy, e poprzedzanie nazwy funkcji prefiksem okrelajcym typ zwracanej danej jest przydatne i uatwia rozumienie kodu.
Wywoujc funkcj, zawsze po nazwie dajemy par okrgych nawiasw dla odrnienia od nazwy zmiennej lub procedury Sub i robimy to nawet wtedy, gdy funkcja nie
ma argumentw. W listingu 3.1 pokazujemy dobrze nazwan funkcj booleowsk,
uyt jako test w instrukcji If...Then.
42
43
Zawsze nazwa po lewej jest zmienn typu danej klasy, za obiekt po prawej jest klas.
44
osadzone. Ksztaty naley nazywa tak jak zmienne obiektowe, czyli zaczyna nazw
od prefiksu definiujcego typ obiektu, w dalszej czci podajc nazw opisujc cel,
jakiemu obiekt suy w aplikacji.
Wiele kontrolek umieszczanych w formularzu UserForm mona rwnie sadowi w arkuszach. W arkuszu mog si take znale stare kontrolki z paska narzdzi Formularze,
ktre cho podobne do kontrolek ActiveX MSForms, maj swe wasne plusy i minusy,
co bardziej szczegowo zostao omwione w rozdziale 4. Kontrolki umieszczane
w arkuszach powinny by nazywane zgodnie z konwencj stosowan przy nazywaniu
kontrolek umieszczanych w formularzach.
Do arkuszy mona take wprowadza wiele obiektw rysowanych (znanych pod techniczn nazw ksztatw), ktre cile mwic nie s kontrolkami, cho mona
do nich przypisywa makra. Nale do tej samej kategorii konwencji nazw, co wiele
obiektw uywanych w VBA. Byoby bardzo trudno okreli dla nich jednoznaczne
przedrostki nazw, wic uywaj dobrze okrelonych przedrostkw dla obiektw najpowszechniej uywanych, a dla reszty stosuj przedrostki standardowe. Oto przykadowe
przedrostki dla trzech powszechnie uywanych obiektw rysunkowych:
pic
Picture
Obraz.
rec
Rectangle
Prostokt.
txt
Pole tekstowe.
ChartObject
Wykres.
eqn
Equation
Rwnanie.
qry
QueryTable
Tabela zapytania.
pvt
PivotTable
Tabela przestawna.
art
WordArt
WordArt.
Nazwy definiowane
W naszej konwencji nazwy definiowane s traktowane nieco inaczej ni inne elementy. W przypadku nazw definiowanych przedrostek powinien szeroko okrela cel
definiowanej nazwy, a nie typ danych, jakie maj by przechowywane. W aplikacjach
Excela, poza najprostszymi, wystpuje wiele nazw definiowanych i ich grupowanie
45
con
Named constant
Nazwana staa.
err
Error check
Znacznik bdu.
for
Named formula
Nazwana formua.
inp
Input range
Zakres wejciowy.
out
Output range
Zakres wyjciowy.
ptr
rgn
Region
Obszar (zakres).
set
tbl
Table
Tabela.
SDK (Software Development Kit) zestaw narzdzi programistycznych przydatny przy tworzeniu
wasnych aplikacji dla okrelonych platform sprztowych i systemowych przyp. tum.
46
to w caoci kod, ktry wykonuje zadania zasadnicze, dla ktrych caa aplikacja
zostaa zaprojektowana i napisana. Warstwa logiki biznesowej akceptuje dane
wejciowe, pochodzce z warstwy interfejsu uytkownika i tame zwraca
wyniki. W przypadku operacji dugo trwajcych warstwa logiki biznesowej
przekazuje do warstwy interfejsu uytkownika okresowe informacje w postaci
komunikatw statusu lub paska wskazujcego stopie wykonania zadania.
Warstwa dostpu i przechowywania danych. Warstwa dostpu i przechowywania
47
Jeeli np. warstwa dostpu i przechowywania danych wymaga zmiany dotychczasowej bazy accessowej na baz danych na SQL Servera, wszelkie zmiany dotycz jedynie tej warstwy. W dobrze zaprojektowanej aplikacji adna z dwch pozostaych
warstw nie powinna by tknita podczas wprowadzania potrzebnych zmian. W sytuacji idealnej dane midzy warstw dostpu i przechowywania danych a warstw logiki
biznesowej powinny by przekazywane w postaci zmiennych o typie zdefiniowanym
przez uytkownika. To pozwala na najlepsze zrwnowaenie efektywnoci i swobody
powizania. Alternatywnie mona stosowa obiekty ADO Recordset, ale to wprowadza subtelne problemy powiza, takie jak kolejno pl zwracanych z bazy danych,
od czego lepiej nie uzalenia warstwy logiki biznesowej.
I podobnie, jeeli aplikacja ma zawiera alternatywny internetowy interfejs prezentacyjny, swobodne powizanie warstwy interfejsu uytkownika z warstw logiki biznesowej
uatwi Ci wykonanie tego zadania. Bdzie ono atwiejsze z powodu braku niejawnych
zaoe wbudowanych w warstw logiki biznesowej oraz zaoe dotyczcych konstrukcji interfejsu uytkownika. Elementy akceptujce dane wprowadzane przez uytkownika powinny by w peni niezalene i samowystarczalne. Warstwa logiki biznesowej musi przekazywa interfejsowi uytkownika potrzebne dane inicjalizacyjne
jako dane o prostych waciwociach. Interfejs uytkownika powinien zbiera dane wprowadzane przez uytkownika i przekazywa je wstecz do warstwy logiki biznesowej
rwnie jako dane o prostych waciwociach lub, w przypadkach bardziej zoonych,
jako dane o typie zdefiniowanym przez uytkownika (UDT User [defined] Data Type).
Poniewa warstwa logiki biznesowej nie powinna zawiera adnych wewntrznych
informacji o konstrukcji interfejsu uytkownika, bezporednie odwoania z warstwy
logiki biznesowej do kontrolek formularza uytkownika s zakazane.
48
Organizacja aplikacji
w programowaniu proceduralnym
Programowaniem proceduralnym nazywamy metodologi programowania znan
wikszoci twrcw oprogramowania. Polega ona na dzieleniu aplikacji na wiele procedur, z ktrych kada wykonuje oddzielne zadanie. Caa aplikacja moe zosta napisana w ten sposb, a elementy proceduralne mog by kombinowane z elementami
zorientowanymi obiektowo lub caa aplikacja moe zosta napisana metod zorientowan
obiektowo. W tym podrozdziale skupiamy uwag na najlepszych praktykach programowania proceduralnego. Techniki programowania obiektowo zorientowanego omwimy w rozdziale 7.
Funkcjonalna dekompozycja
Funkcjonalna dekompozycja to proces dzielenia aplikacji na oddzielne procedury w taki
sposb, aby kada odpowiadaa za wykonanie pojedynczego zadania. Teoretycznie wiele
aplikacji mgby pisa w postaci wielkich, pojedynczych, monolitycznych procedur.
49
50
Komentowanie kodu
Dobre komentowanie kodu to najwaniejsza z dobrych praktyk tworzenia aplikacji
Excela. Komentarze powinny w sposb prosty i kompletny objania, jak kod jest
zorganizowany, w jaki sposb kady obiekt i procedura powinny by uywane oraz
jaki by cel napisania danego kodu. Komentarze su take do zaznaczania zmian
dokonywanych wraz z upywem czasu, ale tym tematem zajmiemy si w dalszej czci
tego rozdziau.
Komentarze kodu s wane zarwno dla Ciebie, jak i dla innych programistw, ktrzy
by moe bd nad Twoim kodem pracowali. Przydatno komentarzy dla innych zdaje si by oczywista. To, czego moesz sobie nie uwiadamia do czasu
otrzymania pierwszej okrutnej lekcji, to przydatno komentarzy dla Ciebie. Czsto si
zdarza, e po napisaniu pierwszej wersji kodu, po upywie jakiego czasu jego twrcy
s proszeni o dokonanie istotnych zmian. Moesz by wtedy zaskoczony, jak obcy
wyda Ci si wasny kod, nieogldany od duszego czasu. Komentarze pomagaj radzi
sobie z tym problemem.
Komentarze powinny by stosowane we wszystkich trzech gwnych poziomach kodu
aplikacji: na poziomie moduu, procedury i pojedynczych sekcji lub linii kodu. Omwimy
dalej typy komentarzy odpowiednie dla tych wszystkich poziomw.
51
52
Komentarze wewntrzne
Komentarze wewntrzne s umieszczane wewntrz samego kodu, aby opisa jego cel,
jeeli ten moe si zdawa nieoczywisty. Powinny opisywa raczej intencj kodu ni
wykonywane operacje. Rozrnienie intencji i operacji nie zawsze jest jasne, wic
w listingach 3.4 i 3.5 podalimy dwa przykady tego samego kodu, odpowiednio ze
zym i dobrym komentarzem.
Listing 3.4. Przykad zego wewntrznego skomentowania kodu
' Ptla tablicy asPlikiWejsciowe
For lIndex = LBound(asPlikiWejsciowe) To UBound(asPlikiWejsciowe)
' ...
Next lIndex
Komentarz w listingu 3.4 jest cakowicie nieprzydatny. Po pierwsze, przede wszystkim opisuje jedynie lini kodu znajdujc si bezporednio poniej, nie dajc adnej
informacji o celu caej ptli. Po drugie, komentarz jest jedynie dokadnym opisem tej
linii. Jest to informacja, jak atwo uzyska, rzucajc okiem na lini kodu. Usunicie
komentarza pokazanego w listingu 3.4 nie przyniesie adnej szkody.
Listing 3.5. Przykad dobrego wewntrznego skomentowania kodu
' Import okrelonej listy plikw wejciowych
' do obszaru roboczego arkusza danych.
For lIndex = LBound(asPlikiWejsciowe) To UBound(asPlikiWejsciowe)
' ...
Next lIndex
Komentarz z listingu 3.5 wnosi do kodu now warto. Nie tylko opisuje intencj zamiast operacji, lecz rwnie wyjania struktur ptli. Po przeczytaniu tego komentarza
bdziesz wiedzie, czego masz szuka, szperajc w kodzie wntrza ptli.
Ale od kadej zasady s wyjtki, wic rwnie podana wczeniej zasada tworzenia
komentarzy wewntrz kodu nie zawsze obowizuje. Najwaniejsze odstpstwo dotyczy
komentarzy majcych objania struktury sterujce. Instrukcje If...Then i Do...Loops
w miar rozbudowy czyni kod trudniejszym do zrozumienia, gdy staje si niemoliwe ledzenie go w jednym oknie. Trudno wwczas pamita, do jakiego miejsca
kodu jest przekazywane sterowanie aplikacj. Przykadowo podczas testowania dugiej procedury czsto trafiamy na co takiego, co wida na wyimku listingu pokazanym
w listingu 3.6.
Listing 3.6. Trudna do ledzenia struktura sterujca
End If
lLiczbaPlikowWejsc = lLiczbaPlikowWejsc - 1
Loop
End If
53
Z listingu 3.6 nie mona odczyta, jakie testy logiczne steruj dwiema instrukcjami
If...Then oraz jakie wyraenie steruje ptl Do...While. Po wypenieniu tych struktur
rzeczywistym kodem nie bdzie moliwe znalezienie odpowiedzi na powysze pytania bez
przewijania listingu tam i z powrotem, gdy cay blok przestanie by widoczny w jednym
oknie kodu. Moesz atwo zmniejszy t niedogodno, dodajc komentarze w stylu
tych, ktre zostay pokazane w listingu 3.7.
Listing 3.7. Zrozumiaa struktura sterujca
End If
lLiczbaPlikowWejsc = lLiczbaPlikowWejsc - 1
Loop
End If
Cho komentarze w listingu 3.7 s jedynie powtrzeniem kodu, przyczepionym do instrukcji koczcych struktury sterujce, dziki nim sens tych struktur staje si jasny
i oczywisty. Tego typu komentarzy naley uywa wszdzie tam, gdzie struktury sterujce s zbyt rozcignite, aby mona je byo obejrze w jednym oknie kodowym.
Czytelno kodu
Czytelno kodu jest funkcj jego fizycznego ukadu. Dobry wizualny rozkad kodu
pozwala na proste wnioskowanie znacznej iloci informacji o logicznej strukturze
programu. To sprawa kluczowa. Dla komputera rozkad kodu nie ma adnego znaczenia. Jedynym celem jest uatwienie zrozumienia kodu ludziom. Tak samo jak
konwencja nazw, rwnie spjna i dobra konwencja rozkadu kodu jest rodzajem samodokumentacji. Podstawowym narzdziem rozkadu kodu jest puste miejsce (white
54
55
56
Metoda Applicatin.Run pozwala obchodzi instrukcj Option Private Module i uruchamia prywatne procedury mimo wprowadzonego ograniczenia.
Option Base 1. Instrukcja Option Base 1 nadaje warto 1 dolnym granicom
indeksw wszystkich tablic, dla ktrych granica ta nie zostaa oddzielnie ustalona.
Nie uywaj tej instrukcji. Lepiej dla wszystkich uywanych indeksw tablic
okrelaj granice grne i dolne. Procedura utworzona w module, w ktrym uyto
instrukcji Option Base 1, moe nie dziaa poprawnie po skopiowaniu do moduu,
gdzie tej instrukcji brakuje, a to oznacza niespenienie jednej z podstawowych
zasad projektowania aplikacji, jak jest moliwo powtrnego uycia.
Option Compare Text. Instrukcja Option Compare Text w module, w ktrym
Zmienne i stae
Unikaj ponownego uywania zmiennych. Kada zmienna zadeklarowana w programie powinna suy tylko jednemu celowi. Wielokrotne uywanie do rnych celw
tych samych zmiennych oszczdza jedynie lini deklaracji zmiennej, ale sprowadza
na program wielkie niebezpieczestwo potencjalnego zamieszania. Jeeli prbujesz
okreli, w jaki sposb procedura dziaa i pamitasz, do czego suya okrelona zmienna
w innym miejscu, w sposb naturalny zakadasz, e przy kolejnym uyciu ma wykona to samo. Jeeli nie jest to prawd, trudno bdzie zrozumie logik takiego kodu.
Unikaj uywania zmiennych typu Variant. Jeeli tylko jest to moliwe, nie stosuj
zmiennych typu Variant. Niestety, VBA nie jest jzykiem wymagajcym duej dyscypliny pisania kodu. Dlatego moesz po prostu deklarowa zmienne bez okrelania
57
ich typu, a VBA utworzy je jako zmienne typu Variant. Przyczyny unikania uywania
zmiennych Variant s nastpujce.
Zmienne typu Variant s bardzo nieefektywne. Wynika to z faktu, e
zmienne Variant s bardzo skomplikowanymi strukturami, przystosowanymi
Jeeli VBA napotka lini kodu, w ktrej ta zmienna zostanie uyta bez wczeniejszego
zainicjalizowania, automatycznie utworzy jej nowy egzemplarz. Nigdy nie bdzie to
dziaanie, jakiego pragniesz. Dobra praktyka programowania wymaga, aby programista
utrzymywa pen kontrol nad wszystkimi obiektami uywanymi w programie. Jeeli
VBA napotyka w kodzie niezainicjalizowan zmienn obiektow, niemal na pewno
jest to spowodowane przez bd, o ktrym chciaby by natychmiast poinformowany.
Dlatego waciwe deklarowanie zmiennych obiektowych powinno wyglda, tak jak
poniej:
Dim rsData As ADODB.Recordset
Set rsData = New ADODB.Recordset
Jeeli uyjesz takiej deklaracji i inicjalizacji, a zmienna obiektowa zostanie zniszczona gdzie w procedurze, po czym niewiadomie si do tej zmiennej odwoasz, VBA
natychmiast powiadomi Ci o tym, generujc bd egzekucji: Object variable or With
block variable not set.
58
Niestety, gdy tylko VBA sprbuje wykona drug lini kodu, zostanie wygenerowany
bd Type mismatch. Stanie si tak dlatego, e biblioteka obiektowa Excela zawiera
obiekt TextBox, a na licie Tools/References znajduje si przed bibliotek MSForms.
Waciwy sposb zapisania tego kodu jest nastpujcy:
Dim txtBox As MSForms.TextBox
Set txtBox = Me.TextBox1
Nigdy nie ustalaj sztywnych granic indeksw tablic. Jeeli przebiegasz w ptli przez
wartoci tablicy, nigdy nie uywaj sztywnych granic indeksowania. W zamian stosuj
funkcje LBound i UBound, tak jak w listingu 3.11.
Listing 3.11. Waciwy sposb przebiegania w ptli przez wartoci tablicy
Dim lIndex As Long
Dim alListItems(1 To 10) As Long
' Tutaj zaaduj tablic.
For lIndex = LBound(alListItems) To UBound(alListItems)
' Zrb co z kad wartoci.
Next lIndex
Powodem takiego postpowania jest fakt, e dolne i grne granice indeksw tablic
czsto zmieniaj si podczas tworzenia i konserwacji aplikacji. Jeeli w ptli pokazanej
powyej ustalisz sztywne granice 1 i 10, bdziesz musia pamita o aktualizowaniu
tych wartoci po kadej zmianie tablicy alListItems. Ptla utworzona z uyciem LBound
i UBound aktualizuje si sama.
Po kadej instrukcji Next zawsze podawaj nazw licznika ptli. W listingu 3.11 demonstrujemy jeszcze jedn dobr praktyk kodowania. Po instrukcji Next zawsze naley podawa nazw zmiennej indeksowej ptli. Przestrzeganie tej zasady, cho nie jest
to cile wymagane przez VBA, sprawia, e kod jest atwiejszy do zrozumienia,
zwaszcza gdy odlego midzy instrukcjami For i Next jest dua.
59
Nie mona si tego dowiedzie. Moe to wiedzie jedynie autor kodu, jeeli
jeszcze nie zapomnia. Jeli jednak zobaczysz tekst napisany, tak jak poniej,
z atwoci odgadniesz jego sens.
Const lMAKS_LICZBA_PLIKOW_WEJSC As Long = 50
' Jaki kod.
If lIndex < lMAKS_LICZBA_PLIKOW_WEJSC Then
Jeeli podczas pisania kodu bdziesz chcia pozna warto staej, moesz
klikn prawym przyciskiem jej nazw i wybra z menu podrcznego polecenie
Definition, a zostaniesz natychmiast przeniesiony do linii, gdzie ta staa
zostaa zdefiniowana. W trybie przerwania wykonania jest jeszcze atwiej.
Zwyke naprowadzenie kursora myszy na sta spowoduje wywietlenie
okienka podpowiedzi z jej wartoci.
Stae poprawiaj efektywno kodowania i uatwiaj unikanie bdw
Zasig zmiennej
Zmienne publiczne s niebezpieczne. Mog by bez ostrzeenia modyfikowane w dowolnym miejscu aplikacji, z powodu tego ich warto bywa nieprzewidywalna. Przeczy to jednej z podstawowych zasad programowania, czyli hermetyzacji. Zawsze twrz
zmienne z minimalnym moliwym zasigiem. Zaczynaj od zmiennych lokalnych (na
poziomie procedury) i rozszerzaj ten zasig jedynie wtedy, gdy jest to bezwzgldnie
konieczne.
Tak jak w przypadku wikszoci naszych zasad, tak i tym razem istnieje kilka wyjtkw,
gdy zmienne publiczne s przydatne, a nawet konieczne.
Gdy zmienne przed uyciem musz by przekazane daleko w gb stosu.
60
jest znany VBA ju podczas kompilacji, VBA moe poszuka miejsca dla
wszystkich waciwoci i metod obiektu, z jakich w kodzie korzysta i zapisa
je wraz z kodem. Jeeli potem, podczas dziaania programu, nastpi odwoanie
do takiej metody lub wasnoci, VBA po prostu uruchomi kod zapisany lokalnie
61
rwnie samo programowanie. Poniewa VBA wie dokadnie, jaki typ obiektu
zmienna bdzie reprezentowa, moe zanalizowa waciw bibliotek obiektow
i wywietli rozwijan list wszystkich waciwoci i metod dostpnych dla
danego obiektu zaraz po napisaniu kropki po nazwie zmiennej.
Jak moesz oczekiwa, w niektrych przypadkach naley uywa pnego wizania
zamiast wczesnego. Dwie gwne przyczyny uywania raczej pnego ni wczesnego
wizania s nastpujce.
1. Pniejsza wersja biblioteki obiektowej nie jest zgodna z wczeniejsz.
62
Kodowanie defensywne
Kodowanie defensywne odnosi si do wielu praktyk programistycznych obmylanych
w celu zapobieenia powstawaniu bdw i unikaniu ich pniejszego poprawiania.
63
Zawsze deklaruj jawnie argumenty procedury jako ByRef lub ByVal. Jeeli pominiesz
specyfikacj, argumenty zostan domylnie zadeklarowane jako ByRef. Jeeli nie ma
koniecznoci, aby procedura wywoujca znaa zmiany argumentw, deklaruj argumenty jako ByVal, co zabezpieczy Ci przed zmianami przekazywanymi wstecz do
procedury wywoujcej.
Jedyne wyjtki to przekazywanie dugich acuchw, ktre s o wiele efektywniej
przekazywane za pomoc argumentw ByRef, oraz argumenty tablicowe, ktrych nie
mona przekaza w trybie ByVal. Musisz pamita, e deklarowanie argumentw procedury ByVal powoduje wiksze naraenie na narzucanie typu danych (ETC evil
type coercion). Argumenty procedury ByRef musz przekazywa typ danych, jaki zosta zadeklarowany, gdy w przeciwnym razie zostanie zgoszony bd kompilacji.
Natomiast w przypadku przekazywania do procedury wartoci za pomoc argumentu
ByVal VBA bdzie usiowa wymusi zgodno typu danych.
Unikanie niejawnego uywania waciwoci domylnych sprawia, e kod jest czytelniejszy i chroni przed bdami, jakie mog wystpi, jeeli waciwoci domylne zostan zmienione w przyszych wersjach Excela lub VBA.
64
Jedynym celem umieszczenia zmiennej lLicz wewntrz ptli jest wymuszenie zakoczenia jej biegu, jeeli kod w jej wntrzu nie zdoa nada zmiennej sterujcej wartoci
koczcej iteracje zanim ich liczba osignie 10000 (stosowna liczba graniczna moe
by rna i zalena od sytuacji). Ten typ konstrukcji nie jest zbytnim obcieniem dla
ptli, jeeli jednak wydajno jest spraw kluczow, uywaj licznika bezpieczestwa
do czasu uzyskania pewnoci, e kod wewntrz ptli dziaa waciwie, po czym usu
dodatkowe instrukcje lub zamie je w komentarz.
65
Nadzorowanie zmian
Nadzorowanie zmian, zwane take kontrol wersji, na najbardziej elementarnym poziomie polega na stosowaniu dwch praktyk: zachowywaniu zestawu poprzednich
wersji (dziki czemu moesz zawsze powrci do wersji sprzed wprowadzenia zmian
i bdw programistycznych) oraz dokumentowaniu wszystkich zmian dokonywanych
w aplikacji z upywem czasu.
Zachowywanie wersji
Gdy najbardziej dowiadczeni programici rozmawiaj o kontroli wersji, myl o uywaniu
dedykowanego oprogramowania w rodzaju Microsoft Visual Source Safe. Jednake
oprogramowanie tego typu jest drogie, trudne do opanowania i le integruje si z aplikacjami budowanymi w Excelu. Dzieje si tak dlatego, e Excel nie zapisuje w sposb
naturalny moduw w oddzielnych plikach tekstowych. Metoda kontroli wersji, jak
tu zalecamy, jest szybka, prosta, nie wymaga adnego specjalnego oprogramowania,
a przynosi te same zasadnicze korzyci, jak metody tradycyjne.
Najwaniejszym celem stosowania systemu kontroli wersji jest zapewnienie moliwoci
odzyskania wczeniejszej wersji projektu po napotkaniu znaczcych problemw w wersji
biecej. Jeeli po wprowadzeniu znaczcych modyfikacji kodu rzeczy poszy w z
stron i nagle pozostae z powanie uszkodzonym plikiem, Twoja sytuacja moe by
bardzo trudna, jeli nie masz kopii poprzedniej wersji, ktra pozwoliaby na odzyskanie
dziaajcej aplikacji.
66
Wnioski
Niezalenie od tego, czy zastosujesz konwencj nazw zaproponowan w tej ksice,
czy przygotujesz wasn, stosuj j konsekwentnie w caej aplikacji i nie zmieniaj z upywem czasu. Dziki temu kod bdzie samoudokumentowany i atwy do zrozumienia.
Poszczeglne warstwy logiczne aplikacji koduj jako byty niezalene. Dziki temu
zmiany w jednej warstwie nie bd zmuszay do przebudowywania znacznej czci
aplikacji. Suto komentuj kod na wszystkich poziomach. Dziki temu w przyszoci bdzie
atwiej zrozumie cel jakiej sekcji programu bez mudnego odczytywania szczegw
kodu. Postpowanie zgodne z dobrymi praktykami opisanymi w tym rozdziale pozwoli
Ci na budowanie aplikacji odpornych, zrozumiaych i atwych do utrzymania.