You are on page 1of 38

IDZ DO

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

Rozdzia 2. Architektura aplikacji ..................................................................... 23


Koncepcje ....................................................................................................................... 23
Wnioski .......................................................................................................................... 33

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA .......................... 35


Konwencje nazw ............................................................................................................ 35
Najlepsze praktyki organizacji i tworzenia struktury aplikacji ....................................... 46
Najlepsze praktyki okrelajce oglne zasady tworzenia oprogramowania ................... 50
Wnioski .......................................................................................................................... 66

Rozdzia 4. Projektowanie arkusza .................................................................... 67


Zasady projektowania dobrego interfejsu uytkownika ................................................. 67
Wiersze i kolumny programu: podstawowe techniki
tworzenia interfejsu uytkownika ................................................................................ 68
Nazwy definiowane ........................................................................................................ 69
Style ............................................................................................................................... 75
Techniki krelenia interfejsw uytkownika .................................................................. 79
Weryfikacja danych ........................................................................................................ 83
Formatowanie warunkowe ............................................................................................. 86
Uywanie kontrolek w arkuszu ...................................................................................... 92
Przykad praktyczny ....................................................................................................... 94
Wnioski .......................................................................................................................... 99

Excel. Programowanie dla profesjonalistw

Rozdzia 5. Dodatki funkcyjne, oglne i specjalizowane dla aplikacji ................ 101


Cztery etapy rozwoju i dziaania aplikacji .................................................................... 101
Dodatki bdce bibliotekami funkcji ............................................................................ 104
Dodatki oglne ............................................................................................................. 110
Dodatki specjalizowane dla aplikacji ........................................................................... 111
Przykad praktyczny ..................................................................................................... 117
Wnioski ........................................................................................................................ 128

Rozdzia 6. Aplikacja dyktatorska ................................................................... 129


Struktura aplikacji dyktatorskiej ................................................................................... 129
Przykad praktyczny ..................................................................................................... 142
Wnioski ........................................................................................................................ 147

Rozdzia 7. Uywanie moduw klas do tworzenia obiektw ............................. 149


Tworzenie obiektw ..................................................................................................... 149
Tworzenie kolekcji ....................................................................................................... 153
Wychwytywanie zdarze ............................................................................................. 159
Generowanie zdarze ................................................................................................... 161
Przykad praktyczny ..................................................................................................... 167
Wnioski ........................................................................................................................ 172

Rozdzia 8. Zaawansowane sterowanie paskami polece ................................. 175


Projektowanie paska polece ....................................................................................... 175
Tablicowe sterowanie paskami polece ....................................................................... 177
Zbieranie wszystkiego razem ....................................................................................... 194
adowanie niestandardowych ikon z plikw ................................................................ 201
Podczepianie obsugi zdarze do kontrolek paska polece .......................................... 205
Przykad praktyczny ..................................................................................................... 213
Wnioski ........................................................................................................................ 218

Rozdzia 9. Zrozumienie i uywanie wywoa Windows API .............................. 221


Oglny opis .................................................................................................................. 222
Praca z ekranem ........................................................................................................... 226
Praca z oknami ............................................................................................................. 229
Praca z klawiatur ........................................................................................................ 236
Praca z systemem plikw i sieci ................................................................................. 241
Przykad praktyczny ..................................................................................................... 252
Wnioski ........................................................................................................................ 255

Rozdzia 10. Projektowanie formularzy UserForm i najlepsze praktyki ................. 257


Zasady .......................................................................................................................... 257
Podstawy kontrolek ...................................................................................................... 265
Efekty wizualne ............................................................................................................ 271
Pozycjonowanie i rozmiary formularzy UserForm ....................................................... 278
Kreatory ....................................................................................................................... 283
Dynamiczne formularze UserForm .............................................................................. 287
Niemodalne formularze UserForm ............................................................................... 294
Wyszczeglnienie kontrolek ........................................................................................ 298
Przykad praktyczny ..................................................................................................... 303
Wnioski ........................................................................................................................ 304

Rozdzia 11. Interfejsy ...................................................................................... 305


Co to jest interfejs? ....................................................................................................... 305
Ponowne uycie kodu ................................................................................................... 306
Definiowanie wasnych interfejsw ............................................................................. 308

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 12. Obsuga bdw VBA ..................................................................... 331


Pojcia obsugi bdw ................................................................................................. 331
Zasada pojedynczego punktu wyjcia .......................................................................... 339
Prosta obsuga bdw .................................................................................................. 340
Zoone projekty obsugi bdw ................................................................................. 340
Centralna obsuga bdw ............................................................................................ 344
Obsuga bdw w klasach i formularzach UserForm .................................................. 350
Zbieranie wszystkiego razem ....................................................................................... 351
Przykad praktyczny ..................................................................................................... 356
Wnioski ........................................................................................................................ 364

Rozdzia 13. Programowanie i bazy danych ....................................................... 365


Wprowadzenie do baz danych ...................................................................................... 365
Projektowanie warstwy dostpu do danych .................................................................. 380
Dostp do danych za pomoc SQL i ADO ................................................................... 381
Dalsze pozycje do czytania .......................................................................................... 397
Przykad praktyczny ..................................................................................................... 398
Wnioski ........................................................................................................................ 408

Rozdzia 14. Techniki przetwarzania danych ...................................................... 409


Struktury danych Excela .............................................................................................. 409
Funkcje przetwarzania danych ..................................................................................... 415
Zaawansowane funkcje ................................................................................................ 425
Wnioski ........................................................................................................................ 432

Rozdzia 15. Zaawansowane techniki tworzenia wykresw ................................ 433


Podstawowe techniki .................................................................................................... 433
Techniki VBA .............................................................................................................. 447
Wnioski ........................................................................................................................ 452

Rozdzia 16. Debugowanie kodw VBA ............................................................. 453


Podstawowe techniki debugowania kodw VBA ......................................................... 453
Okno Immediate (Ctrl+G) ............................................................................................ 462
Call Stack stos wywoa (Ctrl+L) ........................................................................... 465
Okno Watch ................................................................................................................. 466
Okno Locals ................................................................................................................. 475
Object Browser przegldarka obiektowa (F2) ......................................................... 476
Tworzenie dziaajcego otoczenia testowego ............................................................... 479
Stosowanie asercji ........................................................................................................ 481
Debugerskie skrty klawiaturowe, ktre powinien zna kady programista ................ 483
Wnioski ........................................................................................................................ 485

Rozdzia 17. Optymalizacja wydajnoci VBA ...................................................... 487


Mierzenie wydajnoci ................................................................................................... 487
Program narzdziowy PerfMon .................................................................................... 488
Mylenie kreatywne ..................................................................................................... 491

Excel. Programowanie dla profesjonalistw


Makrooptymalizacja ..................................................................................................... 496
Mikrooptymalizacja ..................................................................................................... 505
Wnioski ........................................................................................................................ 511

Rozdzia 18. Sterowanie innymi aplikacjami Office ............................................ 513


Podstawy ...................................................................................................................... 513
Modele obiektowe gwnych aplikacji Office .............................................................. 526
Przykad praktyczny ..................................................................................................... 537
Wnioski ........................................................................................................................ 537

Rozdzia 19. XLL i API C ................................................................................... 539


Dlaczego warto tworzy funkcje arkusza na bazie XLL? ............................................. 539
Tworzenie projektu XLL w Visual Studio ................................................................... 540
Struktura XLL .............................................................................................................. 545
Typy danych XLOPER i OPER ................................................................................... 552
Funkcja Excel4 ............................................................................................................. 556
Powszechnie uywane funkcje API C .......................................................................... 558
XLOPER i zarzdzanie pamici ................................................................................. 559
Rejestrowanie i wyrejestrowywanie wasnych funkcji arkusza .................................... 560
Przykadowa funkcja aplikacji ..................................................................................... 562
Debugowanie funkcji arkusza ...................................................................................... 564
Rne tematy ................................................................................................................ 565
Dodatkowe rda informacji ....................................................................................... 566
Wnioski ........................................................................................................................ 568

Rozdzia 20. Poczenie Excela i Visual Basica 6 .............................................. 569


Witaj wiecie ActiveX DLL ......................................................................................... 570
Dlaczego uywa VB6 ActiveX DLL w projektach Excel VBA? ................................ 583
In-process kontra out-of-process .................................................................................. 596
Automatyzacja Excela z VB6 EXE .............................................................................. 597
Przykady praktyczne ................................................................................................... 603
Wnioski ........................................................................................................................ 615

Rozdzia 21. Pisanie dodatkw w Visual Basic 6 ............................................... 617


Dodatek Witaj wiecie .................................................................................................. 617
Projektant dodatkw (Add-in Designer) ....................................................................... 621
Instalacja ...................................................................................................................... 624
Zdarzenia AddinInstance .............................................................................................. 625
Obsuga paska polece ................................................................................................. 628
Dlaczego warto uywa dodatku COM? ...................................................................... 633
Automatyzacja dodatkw ............................................................................................. 634
Przykad praktyczny ..................................................................................................... 637
Wnioski ........................................................................................................................ 637

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 23. Excel, XML i usugi sieciowe ......................................................... 677


XML ............................................................................................................................. 677
Usugi sieciowe ............................................................................................................ 697
Przykad praktyczny ..................................................................................................... 702
Wnioski ........................................................................................................................ 711

Rozdzia 24. Zapewnianie pomocy, bezpieczestwa,


pakowanie i rozpowszechnianie ..................................................... 713
Zapewnianie pomocy ................................................................................................... 713
Bezpieczestwo ............................................................................................................ 721
Pakowanie .................................................................................................................... 725
Rozpowszechnianie ...................................................................................................... 729
Wnioski ........................................................................................................................ 730

Skorowidz ..................................................................................... 731

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

Excel. Programowanie dla profesjonalistw

Przyjrzyjmy si przykadowi, ktry pozwoli pokaza, czym jest konwencja nazw. Co


moesz wywnioskowa o x z podanej niej linii kodu?
x = wksDataSheet.Range("A1").Value

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.

Przykadowa konwencja nazw


Dobra konwencja nazw obejmuje nie tylko zmienne, lecz wszystkie elementy aplikacji.
Przykadowa, pokazana przez nas konwencja obejmuje wszystkie elementy typowej aplikacji Excela. Rozpoczniemy od dyskusji o zmiennych, staych i zwizanych z nimi elementach, gdy to wanie one najczciej wystpuj we wszelkich aplikacjach. W tabeli 3.1
pokazujemy oglny format konwencji nazw. Okrelone elementy i ich cele s opisane dalej.
Tabela 3.1. Konwencja nazw zmiennych, staych, typw definiowanych przez uytkownika i wylicze
Element

Konwencja nazw

Zmienne
Stae
Typy definiowane przez uytkownika

<zakres><tablica><typ danych>NazwaOpisowa

Typ wyliczeniowy

Enum <prefiks projektu>OpisOgolny


<prefiks projektu>OpisOgolnyNazwa1
<prefiks projektu>OpisOgolnyNazwa2
End Num

<zakres><typ danych>NAZWA_OPISOWA
Type NAZWA_OPISOWA
<typ danych>NazwaOpisowa
End Type

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

37

Okrelnik zakresu (<zakres>)


g Public (publiczny)
m Module (na poziomie moduu)

(nic) na poziomie procedury

Okrelnik tablicy (<tablica>)


a Array (tablica)

(nic) nietablica

Okrelnik typu danych (<typ danych>)


Istnieje tak wiele typw danych, e trudno sporzdzi zrozumia list odpowiadajcych im prefiksw. Typy wbudowane s proste. Problem powstaje przy nazywaniu
zmiennych obiektowych odnoszcych si do obiektw z rnych aplikacji. Niektrzy
programici stosuj prefiks obj dla wszystkich nazw obiektowych. Nie mona na to
przysta. Jednake obmylenie zbioru spjnych, niepowtarzajcych si, racjonalnie
uzasadnionych i krtkich prefiksw, okrelajcych kady typ obiektu, jakiego kiedykolwiek bdziesz uywa, okazuje si by zadaniem nad siy. Staraj si tworzy jedno-,
dwu- i trzyliterowe rozsdnie uzasadnione prefiksy dla najczciej uywanych zmiennych
obiektowych, a prefiks obj zarezerwuj dla obiektw rzadko pojawiajcych si w kodzie.
Pisz kod przejrzysty, a przede wszystkim spjny. Twrz prefiksy nie dusze ni trzyliterowe. Stosowanie duszych w kombinacji z okrelnikami zakresu i tablicy prowadzi
do tworzenia nazw nieporcznie dugich. W tabeli 3.2 zawarto list sugerowanych
prefiksw dla najczciej uywanych typw danych.

Stosowanie nazw opisowych


Cho VBA pozwala na stosowanie nazw zmiennych o dugoci do 255 znakw, wykorzystuj jedynie niewielk cz dozwolonej dugoci, ale nie le si i nie skracaj
nazw zmiennych zaledwie do kilku znakw. Robic to, sprawisz, e Twj kod stanie
si trudny do zrozumienia zwaszcza po upywie czasu i w przyszoci sprawi kopot
sobie lub innej osobie, ktra bdzie nad nim pracowa.
Zintegrowane rodowisko programistyczne Visual Basica (Visual Basic IDE Integrated Development Environment) posiada cech autouzupeniania identyfikatorw
(wszystkich nazw uywanych w aplikacji). Zwykle aby wstawi nazw, musisz napisa
jedynie kilka pierwszych znakw. Gdy po napisaniu kilku znakw naciniesz Ctrl+
spacja, ukae si lista autouzupeniania, zawierajca wszystkie nazwy rozpoczynajce
si od podanych znakw. W miar wpisywania kolejnych znakw lista bdzie si skraca.
Na rysunku 3.1 kombinacja Ctrl+spacja zostaa uyta do wywietlenia listy staych
acuchw komunikatw, jakie mona doda do pola komunikatu.

38

Excel. Programowanie dla profesjonalistw

Tabela 3.2. Prefiksy proponowane do uycia w konwencji nazw


Prefiks

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

* Stosowane do kontrolek ComboBox typu DropDownCombo.


** Stosowane do kontrolek ComboBox typu DropDownList.
Rysunek 3.1.
Skrt klawiaturowy
Ctrl+spacja pozwala
na autouzupenianie
dugich nazw

Kilka sw o staych typu wyliczeniowego


W Excelu 2000 i wersjach nowszych s dostpne stae tzw. typu wyliczeniowego. Pozwalaj one na tworzenie listy spokrewnionych wartoci i udostpnienie ich przez logicznie uzasadnione, przyjazne dla uytkownika nazwy. VBA i model obiektowy Excela
szeroko korzystaj z takich wylicze. Moesz to sprawdzi, korzystajc z autouzupeniania, na jakie pozwala VBA przy podawaniu wartoci waciwoci. Jeeli np. w module VBA napiszesz:
Arkusz1.PageSetup.PaperSize =

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

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.

Przykady stosowania konwencji nazw


Abstrakcyjne wyjanienie zwizku deskryptorw konwencji nazw z nazwami rzeczywistymi jest trudne, wic w tym podrozdziale pokaemy kilka praktycznych przykadw. Wszystkie pochodz wprost z komercyjnych aplikacji napisanych przez autorw.

Zmienne
gsErrMsg zmienna publiczna (public variable) typu String uywana

do przechowywania komunikatu o bdzie1.

mauSettings() tablica na poziomie moduu typu zadeklarowanego

przez uytkownika, uywana do przechowywania parametrw (settings).


1

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

Excel. Programowanie dla profesjonalistw


cbrMenu lokalna zmienna typu CommandBar, przechowujca odwoanie

do paska menu.

Stae
gbDEBUG_MODE staa publiczna (public constant) typu booleowskiego

wskazujca, czy projekt dziaa w trybie debugowania.


msCAPTION_FILE_OPEN staa na poziomie moduu z wartoci typu String,

przechowujca tytu (caption) zdefiniowanego przez uytkownika okna


otwierania plikw (w tym przykadzie Application.GetOpenFilename).
lOFFSET_START staa lokalna z dan typu Long, przechowujca punkt,
od ktrego obliczamy przesunicie wzgldem jakiego obiektu typu Range.

Typy definiowane przez uytkownika


Niej zosta podany przykad typu danych zdefiniowanych przez uytkownika, majcych suy do przechowywania wymiarw i pooenia obiektu. Nowy typ danych
skada si z czterech zmiennych typu Double, przechowujcych pooenie gry i lewej
strony obiektu, jego szeroko i wysoko oraz zmienn typu Boolean, suc do
wskazywania, czy dane zostay zapisane.
Public Type WYMIARY_USTAWIENIA
bUstawieniaZapisane As Boolean
dWartGora As Double
dWartLewa As Double
dWartWysokosc As Double
dWartSzerokosc As Double
End Type

Zmienne wewntrz definicji typu uytkownika nazywamy zmiennymi skadowymi


(member variables). Mona je deklarowa w dowolnej kolejnoci, jednake w naszej
konwencji przyjmujemy kolejno alfabetyczn wedug typw danych, jeeli tylko
nie wystpuj wane powody grupowania zmiennych w inny sposb.

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

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

41

Jeeli nie okrelisz wartoci skadowych typu wyliczeniowego, VBA automatycznie


przypisuje pierwszej skadowej warto zero, a kolejnym skadowym wartoci zwikszane o jeden. Moesz to atwo zmieni, przypisujc inn warto startow, od ktrej
VBA rozpocznie inkrementacj. Aby nakaza VBA zwikszanie wartoci od 1 zamiast
od zera, powiniene napisa:
Private Enum schTypDnia
schTypDniaPozaplanowy = 1
schTypDniaProdukcyjny
schTypDniaPrzestojowy
schTypDniaWolny
End Enum

VBA rozpoczyna inkrementacj o jeden, zaczynajc od ostatniej okrelonej przez


Ciebie wartoci. Moesz uniemoliwi automatyczne przypisywanie wartoci przez
proste ich okrelenie dla wszystkich skadowych.
Na rysunku 3.3. pokazujemy jedn z korzyci, jakie daje stosowanie typu wyliczeniowego.
VBA dostarcza list potencjalnych wartoci dla kadej zmiennej zadeklarowanej jako
naleca do danego typu wyliczeniowego.
Rysunek 3.3.
Nawet deklarowany
przez uytkownika
typ wyliczeniowy jest
obsugiwany przez
autouzupenianie VBA

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

Excel. Programowanie dla profesjonalistw

Listing 3.1. Przykad funkcji nazwanej zgodnie z konwencj nazw


If bWeryfikacjaSciezki("C:\Pliki") Then
'Jeeli podana cieka istnieje
'blok instrukcji If...Then jest wykonywany
End Sub

Podprogramy (procedury Sub) powinny otrzymywa nazwy opisujce zadania, jakie


wykonuj. Przykadowo nazwa procedury ZamykanieAplikacji nie pozostawia wiele
wtpliwoci dotyczcych wykonywanego zadania. Nazwy funkcji powinny opisywa
zwracane wartoci. Moemy oczekiwa, e funkcja sPodajNieuzywanaNazwePliku()
poda nazw pliku.
Konwencja nazw stosowana do argumentw procedur jest taka sama, jak dla zmiennych na poziomie procedury, np. funkcja bWeryfikacjaSciezki pokazana w listingu
3.1 moe by zadeklarowana w nastpujcy sposb:
Function bWeryfikacjaSciezki(ByVal sSciezka As String) As Boolean

Moduy, klasy i formularze UserForm


W naszej przykadowej konwencji nazw nazwy standardowych moduw kodu powinny by poprzedzane przedrostkiem M, moduy klas przedrostkiem C, za formularze
UserForm przedrostkiem F. Daje to po zrezygnowaniu z wywietlania folderw
dodatkowy, przyjemny efekt sortowania nazw w oknie Project edytora VBA, co zostao pokazane na rysunku 3.4.
Rysunek 3.4.
Moduy klas,
formularze UserForm
i moduy standardowe
posortowane w oknie
Project edytora VBA

Ta konwencja uatwia rozumienie kodu uywajcego moduw klas i formularzy


UserForm. Podany niej przykad pokazuje, jak konwencja uatwia rozpoznanie, e
deklarowana jest zmienna obiektowa klasy okrelonego typu, a potem tworzony nowy
egzemplarz tej klasy.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

43

Dim clsMojaKlasa As CMojaKlasa


Set clsMojaKlasa = New CMojaKlasa

Zawsze nazwa po lewej jest zmienn typu danej klasy, za obiekt po prawej jest klas.

Arkusze zwyke i arkusze wykresw


Poniewa stosowane w kodzie nazwy (CodeNames) arkuszy zwykych i arkuszy wykresw uytych w aplikacji s przez VBA traktowane jako wewntrzne zmienne obiektowe, powinny by nadawane zgodnie z przyjt konwencj nazywania zmiennych.
Nazwy arkuszy s poprzedzane przedrostkiem wks (worksheet), ktry w kodzie bdzie
identyfikowa ich przynaleno do obiektw arkuszy. Odpowiednio nazwy arkuszy
wykresw (chart sheets) s poprzedzane przedrostkiem cht, identyfikujcym je jako
przynalene do obiektw typu wykres (chart).
W obu typach arkuszy po prefiksie powinna by umieszczona nazwa opisowa, okrelajca cel arkusza w aplikacji. Przykadowo na rysunku 3.4 wida nazw arkusza
wksCommandBars, zawierajcego tablic definiujc paski narzdziowe tworzone przez
aplikacj. W przypadku arkuszy zawartych w dodatkach oraz arkuszy ukrytych nazwy
podane na zakadkach arkuszy powinny by identyczne z nazwami kodowymi. Nazwy
zakadkowe arkuszy widocznych dla uytkownika powinny by dla niego przyjazne
i zrozumiae, a poza tym musisz by przygotowany, e mog by przez uytkownika
zmienione. Pniej dokadnie wyjanimy, dlaczego wewntrz kodu powiniene zawsze polega na kodowych nazwach arkuszy, a nie na ich nazwach zakadkowych.

Projekt VBA (VBA Project)


Zauwa na rysunku 3.4, e projekt VBA otrzyma t sam nazw co skoroszyt z nim
powizany. Zawsze powiniene projektowi VBA nadawa nazw pozwalajc na
jasne zidentyfikowanie aplikacji, do ktrej naley. Nie ma nic gorszego jak grupa
otwartych skoroszytw, ktrych wszystkie projekty maj w VBA domyln nazw
VBAProject. Jeeli bdziesz chcia tworzy odwoania midzy projektami, bdziesz
musia nada im unikatowe nazwy.

Konwencje nazw interfejsu uytkownika Excela


Elementy interfejsu uytkownika Excela uywane podczas tworzenia aplikacji powinny
rwnie otrzymywa nazwy zgodne z dobrze opracowan i spjn wewntrznie konwencj. W poprzednim podrozdziale omwilimy arkusze zwyke i arkusze wykresw. Trzy
nastpne gwne elementy interfejsu uytkownika Excela, jakie musimy omwi, to
ksztaty (obiekty shape), obiekty osadzone (embedded objects) i nazwy definiowane.

Ksztaty obiekty Shape


Termin ksztaty (Shapes) okrela zbir, ktry moe zawiera wiele rnorodnych obiektw, jakie moesz umieszcza nad arkuszem lub arkuszem wykresu. Ksztaty moemy
podzieli oglnie na trzy gwne kategorie: kontrolki, obiekty rysowane i obiekty

44

Excel. Programowanie dla profesjonalistw

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

TextBox (ale nie kontrolka ActiveX)

Pole tekstowe.

Obiekty osadzone (Embedded Objects)


Termin obiekty osadzone jest tu uywany w odniesieniu do obiektw Excela, takich
jak tabele przestawne (PivotTables), tabele zapyta (QueryTables) i wykresy (ChartObjects), jak rwnie obiekty kreowane przez aplikacje rne od Excela. Arkusze
mog przechowywa wiele rnych osadzonych obiektw. Znanym przykadem obiektw
osadzonych w arkuszu, ktre nie powstay w Excelu, s rwnania tworzone przez
edytor rwna (Equation Editor) oraz rysunki, ktre powstaj za pomoc WordArt. Oto
przykadowe przedrostki dla nazw obiektw osadzonych:
cht

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

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

45

wedug celu w oknie dialogowym Definiowanie nazw (Definiuj nazwy w wersjach


starszych ni Excel 2003) znacznie uatwia prac. Jeeli arkusz zawiera dziesitki lub
setki nazw definiowanych, takie pogrupowanie funkcjonalne przez zastosowanie odpowiednich przedrostkw przynosi widoczne korzyci.
Opisowa cz nazwy zdefiniowanej dokadne okrela, do czego ta nazwa suy w ramach
szerszej kategorii. Na podanej niej licie widzimy kilka przedrostkw celu nazw definiowanych.
cht

Chart data range

Zakres danych wykresu.

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

Specific cell location

Okrelony adres komrki.

rgn

Region

Obszar (zakres).

set

UI setting (User Interface)

Ustawienie interfejsu uytkownika.

tbl

Table

Tabela.

Wyjtki kiedy nie stosuje si konwencji nazw


W dwch przypadkach zechcesz zama ogln konwencj nazw. Po pierwsze, gdy
masz do czynienia z elementami dotyczcymi wywoa Windows API. Elementy te
zostay nazwane przez Microsoft i s szeroko znane w spoecznoci programistw.
Stae Windows API, typy deklarowane przez uytkownika, deklaracje i argumenty
procedur powinny pojawia si w kodzie dokadnie w takiej postaci, w jakiej znajdujemy je w SDK2 dla platformy Microsoftu (Microsoft Platform SDK), co moemy
sprawdzi w serwisie internetowym MSDN pod adresem:
http://msdn.microsoft.com/library/
en-us/winprog/winprog/windows_api_start.page.asp

Zauwa, e s to odwoania w formacie C/C++.


Drugim przypadkiem, gdy nie zechcesz uy wasnej konwencji nazw, jest stosowanie kodu pochodzcego ze rde zewntrznych, sucego do realizacji specjalnych
zada. Jeeli zmodyfikujesz nazwy w tej czci kodu i bdziesz si do nich odwoywa w reszcie aplikacji, ewentualna aktualizacja wstawki, jeeli pojawi si jej nowa
wersja, bdzie bardzo trudna.

SDK (Software Development Kit) zestaw narzdzi programistycznych przydatny przy tworzeniu
wasnych aplikacji dla okrelonych platform sprztowych i systemowych przyp. tum.

46

Excel. Programowanie dla profesjonalistw

Najlepsze praktyki organizacji


i tworzenia struktury aplikacji
Struktura aplikacji
Aplikacja jednoskoroszytowa, a aplikacja n-skoroszytowa
Liczba skoroszytw uytych w aplikacji Excela zaley przede wszystkim od dwch
czynnikw: zoonoci samej aplikacji i ogranicze naoonych przez warunki dystrybucji i aktualizacji wersji. Aplikacje proste i takie, dla ktrych nie mona wymusi
okrelonej kolejnoci dziaa instalacyjnych, wymagaj moliwie najmniejszej liczby
skoroszytw. Aplikacje zoone i takie, ktrych procesem instalacyjnym mona w peni
sterowa, mog by dzielone na wiele skoroszytw lub plikw innego typu, np. DLL.
W rozdziale 2. zostay omwione rne typy aplikacji Excela i odpowiednie dla nich
struktury.
Jeeli moesz swobodnie dzieli aplikacj na pliki wedug wasnego uznania, wiele
przemawia za tym, aby to czyni. Przyczyny, jakie warto bra pod uwag, to: podzia
aplikacji na warstwy logiczne, oddzielenie kodu od danych, oddzielenie elementw
interfejsu uytkownika od kodu, hermetyzacja funkcjonalnych elementw aplikacji i nadzr nad konfliktami wynikajcymi ze zmian przy pracy zespoowej.

Rozdzielenie warstw logicznych


Niemal kada nietrywialna aplikacja Excela ma trzy wyrane logiczne warstwy czy
sekcje. S to:
Warstwa interfejsu uytkownika. Warstwa ta skada si z kodu i widocznych

elementw potrzebnych aplikacji do interakcji z uytkownikiem. W aplikacji


Excela warstwa interfejsu ma cz widoczn, do ktrej nale elementy, takie
jak arkusze, wykresy, paski narzdziowe, formularze uytkownika oraz
niewidoczn, ktr stanowi kod potrzebny do sterowania elementami widocznymi.
Warstwa interfejsu uytkownika jest jedyn warstw logiczn zawierajc
elementy widoczne dla uytkownika.
Warstwa logiki biznesowej (warstwa aplikacji). Warstwa logiki biznesowej

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

danych jest odpowiedzialna za przechowywanie i dostarczanie na danie


danych potrzebnych aplikacji. Moe to by tak proste, jak odczytywanie

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

47

danych z komrek i ich zapisywanie w komrkach lokalnego lub ukrytego


arkusza czy tak skomplikowane, jak egzekucja przez sie procedur na serwerze
bazodanowym (SQL Server). Warstwa dostpu i przechowywania danych
komunikuje si bezporednio jedynie z warstw logiki biznesowej.
Na rysunku 3.5 moesz zobaczy, e wszystkie trzy warstwy s konieczne do stworzenia kompletnej aplikacji, ale nie musz by ze sob nierozerwalnie powizane.
Trzy warstwy s luno czone i istotna zmiana w jednej nie musi wymaga istotnej
zmiany w innej. Silne wizanie warstw aplikacji w sposb nieunikniony komplikuje
jej konserwacj i uaktualnianie.
Rysunek 3.5.
Relacje midzy
trzema warstwami
logicznymi
aplikacji Excela

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.

Oddzielenie danych i interfejsu uytkownika od kodu


W wielu aplikacjach uytkownika wewntrz warstwy interfejsu uytkownika bywaj
stosowane dwie podwarstwy. Stanowi je skoroszyt i elementy arkusza uywane do
budowania interfejsu oraz kod obsugujcy te elementy. Podzia na podwarstwy musi

48

Excel. Programowanie dla profesjonalistw

by tu rygorystycznie przestrzegany. Interfejs uytkownika korzystajcy z arkusza nie


powinien zawiera adnego kodu, za kod kontrolujcy ten interfejs naley umieci
w cakowicie oddzielonym dodatku.
Powd tej separacji jest dokadnie taki sam, jak opisany poprzednio dla separacji gwnych warstw logicznych aplikacji jest to izolacja efektw wprowadzanych zmian.
Ze wszystkich warstw aplikacji najczciej zmieniana jest warstwa interfejsu uytkownika. Dlatego nie jest wystarczajce oddzielenie jej w caoci i naley odseparowa
take zmiany widocznych elementw interfejsu uytkownika od kodu te elementy
kontrolujcego.
W nastpnych rozdziaach podamy wzite z ycia przykady oddzielenia warstw aplikacji, wic nie przejmuj si, jeeli teraz jaki element dyskusji nie jest dla Ciebie w peni
zrozumiay.

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.

Organizowanie kodu w moduy za pomoc funkcji (kategorii)


Gwnym powodem dzielenia kodu na moduy jest zwikszenie jego przejrzystoci
i uatwienie pniejszego utrzymania aplikacji. W aplikacji proceduralnej procedury
powinny by umieszczane w oddzielnych moduach, zgodnie z logik dziaania. W moduach najlepiej grupowa procedury penice podobne funkcje.
VBA ma nieudokumentowane mikkie ograniczenie maksymalnego rozmiaru
standardowego moduu, ktrego wielko nie powinna przekracza 64 kB, przy
czym wielko ta dotyczy pliku tekstowego eksportowanego z projektu (narzdzia
VBE, zapisane na pycie CD, automatycznie podaj wielko moduu). Twj projekt
nie zaamie si natychmiast, gdy pojedynczy modu przekroczy wielko 64 kB,
lecz cige przekraczanie tej granicy niemal na pewno doprowadzi do niestabilnoci
aplikacji.

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.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

49

Jednak takie postpowanie znacznie utrudniaoby proces debugowania i pniejszego


utrzymania aplikacji. Stosujc funkcjonaln dekompozycj, planujesz aplikacj tak,
by skadaa si z wielu procedur, z ktrych kada bdzie odpowiedzialna za cile
okrelone zadanie, atwe do zrozumienia, weryfikacji, udokumentowania i utrzymania.

Najlepsze praktyki tworzenia procedur


Zrozumiay zestaw wskazwek opisujcych waciwy sposb tworzenia procedur z atwoci wypeniby cay rozdzia. Niej podamy jedynie list najwaniejszych.
Hermetyzowanie (enkapsulacja). Jeeli tylko jest to moliwe, procedura

powinna by zaprojektowana tak, aby zapewni pen hermetyzacj


wykonywanej operacji. Oznacza to np., e odpowiednio hermetyzowana
procedura moe zosta skopiowana do kompletnie rnego projektu, gdzie
bdzie dziaa rwnie dobrze, jak w projekcie, w ktrym powstaa. Hermetyzacja
pomaga w wielokrotnym stosowaniu kodu, a dziki logicznemu odizolowaniu
operacji upraszcza debugowanie.
Eliminowanie duplikowaniu kodu. Piszc nietrywialn aplikacj Excela,

czsto bdziesz odkrywa, e ju w wielu miejscach pisae kod wykonujcy


t sam operacj. Jeeli to odkryjesz, powiniene wydzieli powtarzajcy si
kod, tworzc oddzieln procedur. Czynic to, zmniejszysz liczb miejsc,
gdzie ta szczeglna operacja musi by weryfikowana lub modyfikowana.
Wsplna procedura moe by modyfikowana tylko w jednym miejscu aplikacji.
Wszystko to prowadzi do znacznego podniesienia jakoci kodu. Suy to
rwnie drugiemu wanemu celowi wielokrotnej stosowalnoci kodu.
Jeeli powszechnie stosowane operacje wydzielisz w oddzielnych procedurach,
przekonasz si, e bdziesz mg te procedury wykorzysta w wielu innych
aplikacjach. Taki kod tworzy rodzaj biblioteki, ktrej moesz uywa w celu
podniesienia wasnej produktywnoci przy pisaniu nastpnych aplikacji.
Im wicej logicznie oddzielonych operacji zapiszesz w postaci kompletnych,
w peni przetestowanych procedur bibliotecznych, tym mniej czasu bdzie Ci
zajmowa tworzenie kolejnych aplikacji.
Izolowanie zoonych operacji. W wielu rzeczywistych aplikacjach

znajdziesz sekcje logiki biznesowej bardzo zoone i bardzo specyficzne


dla danej aplikacji, dla ktrej zostay zaprojektowane, co oznacza take
niemoliwo powtrnego ich uycia w innych projektach. Takie sekcje
naley izolowa w oddzielnych procedurach w celu uatwienia debugowania
i dalszego utrzymania.
Redukcja rozmiarw procedury. Zbyt dugie procedury s trudne do

zrozumienia, debugowania i utrzymania nawet dla programistw, ktrzy je


napisali. Jeeli odkryjesz procedur liczca ponad 150 lub 200 linii kodu,
przekonasz si, e zwykle wykonuje ona kilka zada, a wic powinna by
podzielona na kilka jednocelowych procedur.
Ograniczanie liczby argumentw procedury. Im wicej argumentw

procedura akceptuje, tym trudniej j zrozumie i mniej efektywnie bdzie


uywana. W zasadzie powiniene ogranicza liczb argumentw do piciu

50

Excel. Programowanie dla profesjonalistw

lub mniej. I nie stosuj prostego zastpowania argumentw procedur przez


zmienne publiczne lub dostpne na poziomie moduu. Jeeli okae si, e
procedura wymaga wicej ni piciu argumentw, bdzie to znak, e sama
procedura lub logika aplikacji powinny zosta ponownie zaprojektowane.

Najlepsze praktyki okrelajce oglne


zasady tworzenia oprogramowania
W tym podrozdziale s omawiane najlepsze praktyki dziaania wsplne dla wszystkich
obszarw i etapw tworzenia aplikacji. Wikszo dalszych rozdziaw zaleca stosowanie najlepszych praktyk odnoszcych si do tematw poruszonych w tym rozdziale.

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.

Komentarze na poziomie moduu


Jeeli uye, opisanej wczeniej w tym rozdziale, konwencji nazywania moduw,
kady sprawdzajcy kod bdzie mia z grubsza pojcie o celu kodu zawartego w module.
Powiniene to wesprze krtkim komentarzem na pocztku kadego moduu, gdzie
zawrzesz dokadniejszy opis celu kodu zapisanego w module.
Gdy mwic o komentarzach, uywamy terminu modu, okrelamy nim moduy
standardowe, moduy klas i moduy kodu zwizanego z formularzami uytkownika.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

51

Dobry komentarz na poziomie moduu powinien by umieszczony na samym pocztku


i wyglda tak, jak przykad pokazany w listingu 3.2.
Listing 3.2. Przykadowy komentarz na poziomie moduu
'
' Opis: Krtki opis celu kodu
'
zapisanego w tym module.
'
Option Explicit

Komentarze na poziomie procedury


Zwykle komentarze na poziomie procedury s najdokadniejszymi komentarzami w caej
aplikacji. Tam opisujesz cel procedury, uwagi o jej uywaniu, szczegow list argumentw i informacje o celu ich uycia oraz w przypadku funkcji oczekiwan
zwracan warto. Komentarze na poziomie procedury mog take suy jako podstawowe narzdzie rejestrowania zmian, gdzie mona podawa daty i opisy zmian
wprowadzanych w procedurze. Dobry komentarz na poziomie procedury, taki jak pokazany w listingu 3.3, moe by umieszczony bezporednio nad pierwsz lini kodu
procedury. Komentarz w listingu 3.3 zosta napisany dla funkcji. Komentarz dla procedury typu Sub od komentarza dla funkcji rni si jedynie brakiem bloku Zwraca
(Returns), gdy jak wiadomo procedury tego typu nie zwracaj adnych wartoci.
Listing 3.3. Przykadowy komentarz na poziomie procedury
''''''''''''''''''''''''''''''''''''''''''''''''''''
' Komentarze: Lokalizuje wykres, ktry ma by
'
obiektem dziaania lub - jeeli
'
wykresw jest wiele - prosi
'
o wybranie waciwego.
'
' Argumenty: chtWykres Warto zwracana przez
'
funkcj. Odwoanie do
'
wykresu, na ktrym ma by
'
wykonane dziaanie lub
'
nic, jeeli uytkownik
'
anuluje dziaanie.
'
' Zwraca:
Boolean Prawda gdy powodzenie,
'
Fasz gdy bd lub
'
anulowanie przez
'
uytkownika.
'
' Data Programista Dziaanie.
'----------------------------------------------------' 04/07/02 Rob Bovey
Utworzenie.
' 14/10/03 Rob Bovey
Wychwytywanie bdu,
'
gdy wykres bez serii.
' 18/11/03 Rob Bovey
Wychwytywanie bdu,
'
gdy brak aktywnego
'
arkusza.

52

Excel. Programowanie dla profesjonalistw

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

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

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

' If bZawartoscWazna Then

lLiczbaPlikowWejsc = lLiczbaPlikowWejsc - 1
Loop
End If

' Do While lLiczbaPlikowWejsc > 0


' If bPlikiWejscZnalezione Then

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.

Unikanie najgorszego bdu komentowania kodu


Problem jest oczywisty, mimo to jednak najpowaniejszym, najczstszym i najbardziej
szkodliwym bdem komentowania jest brak aktualizacji komentarzy przy modyfikacji kodu. Czsto spotykamy projekty na pierwszy rzut oka przygotowane zgodnie
z dobr praktyk komentowania kodu, w ktrych po bliszym sprawdzeniu okazuje
si, e komentarze dotycz jakiej pierwotnej wersji projektu i ich zwizek z wersj
biec jest niemal aden.
Jeeli staramy si zrozumie kod, bdne komentarze s gorsze ni ich brak, gdy
prowadz na mylne cieki. Dlatego zawsze aktualizuj komentarze, za stare albo kasuj,
albo utrzymuj w formie pozwalajcej ledzi cig wprowadzanych kolejno zmian.
Zalecamy kasowanie nieaktualnych komentarzy wewntrz kodu, aby unikn zamiecania go nieprzydatnymi informacjami, bowiem nadmiar linii komentujcych sprawia,
e kod jest trudny do zrozumienia.
Do ledzenia wprowadzanych zmian uywaj komentarzy na poziomie procedury.

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

Excel. Programowanie dla profesjonalistw

space). Pustymi miejscami s znaki spacji, tabulatory i puste linie. W nastpnych


akapitach omwimy najwaniejsze sposoby uywania pustych miejsc w celu zbudowania dobrze zaprojektowanego rozkadu kodu.
Grupuj spokrewnione elementy kodu, za elementy niemajce ze sob zwizku oddzielaj pustymi liniami. Mona uzna, e sekcje kodu procedury oddzielone pustymi
liniami peni tak sam rol, jak akapity w tekcie ksiki. Pozwalaj okreli, co
jest ze sob powizane. W listingu 3.8 widzimy przykad pokazujcy, jak puste linie
zwikszaj czytelno kodu. Nawet bez dodawania komentarzy wiadomo, ktre linie
kodu s ze sob powizane.
Listing 3.8. Uycie pustych linii do grupowania kodu w sekcje
' Ustawianie waciwoci aplikacji.
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
Application.StatusBar = False
Application.Caption = Empty
Application.EnableCancelKey = xlInterrupt
Application.Cursor = xlDefault
' Usuwanie wszystkich paskw narzdziowych uytkownika.
For Each cbrBar In Application.CommandBars
If Not cbrBar.BuiltIn Then
cbrBar.Delete
Else
cbrBar.Enabled = True
End If
Next cbrBar
' Przywrcenie paska menu arkusza.
With Application.CommandBars(1)
.Reset
.Enabled = True
.Visible = True
End With

Wewntrz sekcji spokrewnionych linii zwizek poszczeglnych grup pokazujemy za


pomoc wyrwnania. Wcicia su do pokazania logicznej struktury kodu. W listingu
3.9 demonstrujemy jedn sekcj listingu 3.8, gdzie wyrwnania i wcicia daj dobry
efekt. Przygldajc si temu fragmentowi kodu, od razu zrozumiesz, ktre elementy
tworz caoci oraz rozpoznasz logiczny bieg wykonywanego kodu.
Listing 3.9. Waciwe uycie wyrwnania i wci
' Usuwanie wszystkich paskw narzdziowych uytkownika.
For Each cbrBar In Application.CommandBars
If Not cbrBar.BuiltIn Then
cbrBar.Delete
Else
cbrBar.Enabled = True
End If
Next cbrBar

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

55

W celu uatwienia czytania kodu dugie instrukcje i deklaracje dzielimy za pomoc


znaku kontynuacji linii. Pamitaj, e dzielenie kodu w ten sposb jedynie dla pokazywania caych linii bez koniecznoci przewijania okna niekoniecznie musi by dobr
praktyk. W listingu 3.10 wida przykad rozsdnego stosowania kontynuacji linii.
Listing 3.10. Rozsdne stosowanie kontynuacji linii
' Zoone wyraenia atwiej zrozumie,
' jeeli s waciwie kontynuowane.
If (uData.lMaxLocationLevel > 1) Or _
uData.bHasClientSubsets Or _
(uData.uDemandType = bcDemandTypeCalculate) Then
End If
' Stosowanie kontynuacji linii uatwia czytanie
' dugich deklaracji API.
Declare Function SHGetSpecialFolderPath Lib "Shell32.dll" _
(ByVal hwndOwner As Long, _
ByRef szBuffer As String, _
ByVal lFolder As Long, _
ByVal bCreate As Long) As Long

Najlepsze praktyki programowania w VBA


Najlepsze oglne praktyki programowania w VBA
Dyrektywy dla moduu
Option Explicit. Zawsze w kadym module uywaj instrukcji Option Explicit.
Nie sposb przeceni wanoci takiego postpowania. Bez Option Explicit

kada literwka spowoduje utworzenie przez VBA nowej zmiennej typu


Variant. Tego rodzaju bd jest bardzo zdradziecki, gdy czasem nawet nie
powoduje natychmiastowego bdu wykonania. Jednak ostatecznie rezultaty
dziaania aplikacji bd bdne. Bd tego rodzaju ma wielkie szanse, by nie
zosta zauwaonym a do rozpowszechnienia aplikacji i w niektrych
okolicznociach bdzie go trudno wykry.
Instrukcja Option Eplicit wymusza jawne deklarowanie wszystkich uywanych
zmiennych i powoduje wywietlenie przez VBA bdu kompilacji (po wybraniu
z menu VBE polecenia Debug/Compile) natychmiast po zidentyfikowaniu
nierozpoznawalnej nazwy. Dziki temu znajdowanie literwek staje si atwe.
Aby mie pewno, e instrukcja Option Explicit bdzie automatycznie
umieszczana na grze kadego tworzonego moduu, powiniene z menu VBE
wybra polecenie Tools/Options/Editor i wczy opcj Require Variable
Declaration. Takie postpowanie jest bardzo zalecane.
Option Private Module. Instrukcja Option Private Module sprawia, e wszystkie

procedury z moduu, w ktrym zostaa uyta, s niedostpne za pomoc menu


uytkownika Excela oraz w innych projektach Excela. Uywaj tej instrukcji,
aby ukry procedury, ktre nie mog by wywoywane spoza aplikacji.

56

Excel. Programowanie dla profesjonalistw

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

zostaa uyta, wymusza tekstowe, zamiast binarnego, porwnywanie acuchw


tekstowych. Przy takim porwnaniu litery wielkie i mae s traktowane jako
tosame, za przy porwnaniu binarnym s uznawane za rne. Instrukcji
Option Compare Text naley unika z takich samych powodw, jak instrukcji
Option Base 1. Powoduje ona inne dziaanie procedur po umieszczeniu ich
w moduach, gdzie nie zostaa uyta. Ponadto porwnania tekstowe s o wiele
bardziej kosztowne obliczeniowo ni porwnania binarne. Zatem uycie
instrukcji Option Compare Text powoduje spowolnienie wszystkich porwna
tekstowych dokonywanych w module, w ktrym zostaa uyta. Wikszo
funkcji Excela i VBA wykorzystywanych do porwnywania tekstw posiada
argument pozwalajcy na okrelenie, czy ma by wykonane porwnanie binarne,
czy tekstowe. Gdy trzeba uy porwnania tekstowego, o wiele lepiej uywa
tych argumentw.
Jedynie w kilku rzadkich przypadkach uycie Option Compare Text jest wymagane.
Najczstszym jest porwnywanie acuchw za pomoc operatora VBA Like, bez
rozrniania liter wielkich i maych. Jedynym sposobem zmuszenia operatora Like do
nieodrniania liter wielkich i maych jest zastosowanie instrukcji Option Compare Text.
Powiniene wwczas procedury wymagajce uycia tej instrukcji umieci w oddzielnym
module, aby je odseparowa od innych, ktrym skaenie t instrukcj nie jest potrzebne.
Upewnij si, e przyczyny takiego dziaania wyjanie odpowiednio w komentarzu na
poziomie moduu.

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

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

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

do przechowywania danych wszelkich typw, ktre mog by stosowane


w jzyku programowania VBA. Do wartoci Variant nie ma bezporedniego
dostpu i nie mog by one modyfikowane bezporednio, jak w przypadku
zmiennych podstawowych typw, takich jak Long i Double. Do wykonania
jakiejkolwiek operacji na zmiennej Variant VBA musi uywa ukrytej
przed uytkownikiem serii wywoa Windows API.
Dane przechowywane w zmiennych typu Variant mog zachowywa si
w sposb niespodziewany. Poniewa zmienne Variant s zaprojektowane do

przechowywania danych dowolnego typu, to, co wkadamy do takiej zmiennej,


nie zawsze jest tym samym, co otrzymamy z powrotem. Uzyskujc dostp do
danej Variant, VBA usiuje narzuci (coerce) typ, jaki uwaa za najbardziej
sensowny w kontekcie danego dziaania. Jeeli musisz stosowa zmienne Variant,
zawsze przed uyciem dokonuj jawnego rzutowania danych na waciwy typ.
Bd wiadom diaba, ktry tkwi w szczegach narzucania typu danych (ETC
evil type corecion). ETC to kolejny objaw wynikajcy z faktu, e VBA nie jest jzykiem
wymagajcym cisej dyscypliny pisania kodu. W rezultacie zdarza si, e VBA dokonuje automatycznej konwersji jednego typu danych na inny, cakowicie niezwizany
z poprzednim. Najczciej zdarza, e zmienne String przechowujce liczby s konwertowane na typ Integer, a zmienne Boolean na rwnowaniki typu String. Nie
mieszaj zmiennych rnego typu, bez informowania VBA, w jaki sposb te zmienne
maj by traktowane, co powiniene robi przez ich rzutowanie na waciwy typ za
pomoc specjalnych funkcji rzutowania (np. CStr, CLng lub CDbl).
Unikaj deklaracji o skadni As New. Nigdy do deklarowania zmiennych nie stosuj
skadni As New. Przykadowo podana niej posta deklaracji zmiennej obiektowej nie
powinna by nigdy uyta:
Dim rsData As new ADODB.Recordset

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

Excel. Programowanie dla profesjonalistw

Zawsze przeprowadzaj pen kwalifikacj nazw obiektowych. Zawsze w deklaracjach


zmiennych i w kodzie stosuj pen kwalifikacj nazw obiektowych, podajc nazw
wraz z przedrostkiem klasy. Naley tak robi, gdy wiele bibliotek posiada obiekty
tak samo nazwane. Jeeli zadeklarujesz zmienn obiektow, podajc jedynie nazw
obiektu, a aplikacja odwouje si do wielu bibliotek, VBA utworzy zmienn z pierwszej biblioteki z listy Tools/References, w jakiej znajdzie tak nazwany obiekt. Nie
zawsze jest to obiekt, jakiego potrzebujesz.
Kontrolki formularzy UserForm s przykadem najczstszych bdw powodowanych
przez deklarowanie nazw nie w peni kwalifikowanych. Jeeli np. chcesz zadeklarowa zmienn obiektow odwoujc si do kontrolki TextBox na Twoim formularzu,
moesz prbowa zrobi to nastpujco:
Dim txtBox As TextBox
Set txtBox = Me.TextBox1

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.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

59

Uywaj staych. Stae s bardzo przydatnymi elementami programowania. Su midzy


innymi nastpujcym celom.
Eliminuj magiczne liczby, zastpujc je rozpoznawalnymi nazwami, np.

co moe oznacza liczba 50 w podanej niej linii kodu?


If lIndex < 50 Then

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

duplikacji danych. Zamy, e w poprzednim przykadzie odwoywae si


wielokrotnie do maksymalnej liczby plikw wejciowych i w pewnym momencie
bdziesz musia przystosowa program do obsugi wikszej liczby plikw.
Jeeli w rnych miejscach wpisae na sztywno maksymaln liczb plikw
wejciowych, bdziesz musia odszuka wszystkie te miejsca i zmieni podan
warto. Jeli uye staej, musisz zmieni jej warto tylko w jednej deklaracji,
a zostanie ona automatycznie zaktualizowana we wszystkich miejscach kodu,
gdzie wystpuje. Taka sytuacja jest bardzo czst przyczyn bdw, ktrych
z atwoci moesz unikn, uywajc staych zamiast wartoci wpisywanych
na sztywno.

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.

Jeeli np. procedura A czyta pewne dane, potem przekazuje je procedurze B,


ktra przekazuje je procedurze C, ktra przekazuje je procedurze D, gdzie
ostatecznie s w jakim celu uyte, lepiej przekaza je bezporednio z procedury
A do D za pomoc zmiennej publicznej.

60

Excel. Programowanie dla profesjonalistw


Pewne naturalnie publiczne klasy, jak klasa obsugi zdarze na poziomie

aplikacji, wymagaj publicznych zmiennych obiektowych, ktre nigdy nie


znajd si poza zasigiem podczas dziaania aplikacji.

Wczesne i pne wizanie


Rozrnienie midzy wczesnym wizaniem (early binding) a pnym wizaniem (late
binding) jest czsto le rozumiane i mylone ze sposobem tworzenia obiektu. Wczesne
lub pne wizanie zmiennej zaley jedynie od sposobu zadeklarowania zmiennej
przechowujcej odwoanie do obiektu. Zmienne zadeklarowane z typem okrelonego
obiektu s zawsze wczenie wizane. Zmienne zadeklarowane jako zmienne typu Object
lub Variant s zawsze pno wizane. W listingu 3.12 pokazujemy przykad pnego
wizania odwoania, a w listingu 3.13 wczesnego.
Listing 3.12. Pne wizanie odwoania do obiektu ADO Connection
Dim objPolaczenie As Object
' Niezalenie od sposobu utworzenia obiektu, bdzie on
' pno wizany z powodu zadeklarowania zmiennej
' As Object.
Set objPolaczenie = New ADODB.Connection
Set objPolaczenie = CreateObject("ADODB.Connection")

Listing 3.13. Wczesne wizanie odwoania do obiektu ADO Connection


Dim cnPolaczenie As ADODB.Connection
' Niezalenie od sposobu utworzenia obiektu, bdzie on
' wczenie wizany z powodu typu danych uytego
' w deklaracji zmiennej.
Set cnPolaczenie = New ADODB.Connection
Set cnPolaczenie = CreateObject("ADODB.Connection")

Jeeli uywasz wczesnego wizania z obiektem spoza modelu obiektowego Excela,


pamitaj, e wczeniej musisz ustanowi odwoanie do odpowiedniej biblioteki obiektowej za pomoc polecenia Tools/References z menu Visual Basic Editora. Aby np. utworzy wczesne wizanie zmiennej odwoujcej si do obiektw ADO, musisz ustanowi
odwoanie do biblioteki Microsoft ActiveX Data Objects 2.x Library, gdzie x oznacza
wersj ADO, jakiej zamierzasz uywa.
Powiniene stosowa wczesne wizania zmiennych wszdzie, gdzie jest to moliwe.
Wczesne wizanie zmiennych, w porwnaniu z pnym wizaniem, daje nastpujce
korzyci.
Poprawa wydajnoci. Jeeli uywasz zmiennej obiektowej, ktrej typ danych

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

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

61

(jest to pewne uproszczenie, gdy w rzeczywistoci VBA przechowuje offset


kodu, ktry ma by uruchamiany ze znanego punktu startowego w pamici,
bdcego pocztkiem struktury nazywanej VTable danego obiektu).
Jeeli stosujesz pne wizanie zmiennej obiektowej, VBA nie moe z gry
przewidzie, jaki typ obiektu zmienna bdzie przechowywa, wic w czasie
kompilacji nie moe optymalizowa wywoania adnej waciwoci ani
metody. Oznacza to, e podczas dziaania programu po kadym wywoaniu
metody lub waciwoci zmiennej wizanej pno VBA musi poszuka tej
zmiennej, aby ustali, jaki typ obiektu zawiera, wyszuka nazw wywoanej
metody lub waciwoci, by odnale j w pamici i wykona kod przechowywany
pod danym adresem. Jest to proces znacznie wolniejszy ni w przypadku
zmiennej wczenie wizanej.
cise weryfikowanie typu. Jeeli w przykadzie pnego wizania z listingu

3.12 przypadkowo przypiszesz zmiennej obiektowej odwoanie do obiektu


ADO Command zamiast ADO Connection, VBA nie wykryje bdu. O tym, e zosta
popeniony bd, dowiesz si pniej w dalszej czci kodu, gdy sprbujesz
uy metody lub waciwoci nieobsugiwanej przez obiekt Command. W przypadku
wczesnego wizania VBA natychmiast wykryje, e prbujesz przypisa do
zmiennej obiektowej odwoanie bdnego typu i powiadomi Ci o tym
komunikatem Type mismatch. Nieprawidowe odwoania do waciwoci
i metod mog by wykrywane wczeniej, jeszcze przed uruchomieniem kodu.
VBA sprbuje odnale w bibliotece nazw waciwoci lub metody ju
w czasie kompilacji i zgosi bd, jeeli takiej nazwy nie uda si odszuka.
Dostpno IntelliSense. Wczesne wizanie zmiennych obiektowych uatwia

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.

Taka sytuacja zdarza si a nazbyt czsto. Jeeli ustalisz odwoania do pniejszej


wersji biblioteki obiektowej, a potem sprbujesz uruchomi aplikacj na
komputerze z wczeniejsz wersj, natychmiast pojawi si bd kompilacji
Cant find project or library i odwoanie na maszynie docelowej zostanie
oznaczone prefiksem MISSING. W przypadku tego bdu najbardziej zdradzieckie
jest to, e linia kodu rdowego oznaczona jako bdna zwykle nie ma nic
wsplnego z bibliotek obiektow, ktra jest rzeczywist przyczyn problemu.
Jeeli musisz uywa obiektw aplikacji, ktra powoduje takie bdy i chcesz
umoliwi uytkownikom korzystanie z dowolnej wersji aplikacji, powiniene
zastosowa wycznie pne wizania dla wszystkich zmiennych odwoujcych
si do obiektw w tej aplikacji. Jeeli tworzysz nowe obiekty, powiniene
uy funkcji CreateObject z niezalenym od wersji identyfikatorem ProgID
obiektu, jaki chcesz utworzy, zamiast skadni = New ObjectName.

62

Excel. Programowanie dla profesjonalistw


2. Chcesz uy aplikacji, ktrej by moe nie ma na komputerze

uytkownika i sam nie moesz jej zainstalowa.


W takim przypadku powiniene skorzysta z pnego wizania, co pozwoli
unikn bdu kompilacji, jaki wystpiby natychmiast po prbie uruchomienia
aplikacji odwoujcej si do nieistniejcej na danym komputerze biblioteki
obiektowej. Twoja aplikacja moe wwczas sprawdzi istnienie potrzebnej
biblioteki obiektowej i jeeli nie bdzie ona zainstalowana spokojnie
zakoczy dziaanie.
Jeeli nawet ostatecznie uyjesz w kodzie pnego wizania, wczesne wizanie
tak bardzo zwiksza efektywno programowania, e warto je stosowa podczas
pisania i testowania aplikacji. Zamiany na pne wizania dokonaj dopiero w ostatniej
fazie testw przed dystrybucj.

Kodowanie defensywne
Kodowanie defensywne odnosi si do wielu praktyk programistycznych obmylanych
w celu zapobieenia powstawaniu bdw i unikaniu ich pniejszego poprawiania.

Pisz aplikacj w najstarszej wersji Excela,


w jakiej jak oczekujesz moe by uruchamiana
Cho zesp Microsoftu tworzcy Excela bardziej ni inne przyoy si do zapewnienia
zgodnoci z poprzednimi wersjami, nie udao si jednak wykluczy wielu subtelnych
rnic. Jeeli dobrze znasz najnowsz wersj, jest bardzo prawdopodobne, e napiszesz
aplikacj, ktra nie bdzie dziaaa w wersjach poprzednich, gdy uyjesz jakiej cechy,
jaka kiedy nie istniaa.
Rozwizaniem jest rozpoczynanie tworzenia aplikacji od najstarszej wersji, w jakiej
ma ona dziaa. Moe to zmusi Ci do utrzymywania na jednym komputerze wielu
wersji Excela lub, co jest o wiele lepsze, posiadania kilku komputerw z zainstalowanymi
rnymi wersjami. Tak czy inaczej, w praktyce jest to sprawa podstawowa. Jeeli utworzysz aplikacj w Excelu 2000, po czym dasz j uytkownikowi Excela 97 i przekonasz
si, e nie dziaa, bdziesz musia debugowa i usuwa wiele fragmentw niesprawnego kodu. Oszczdzisz wiele czasu i nerww przez rozpoczcie tworzenia aplikacji
w Excelu 97.

Jawnie uywaj ByRef i ByVal


Jeeli procedura posiada argumenty, mona je deklarowa jako ByRef i ByVal.
ByRef oznacza przekazywanie adresu zmiennej w pamici zamiast wartoci tej
zmiennej. Jeeli wywoana procedura modyfikuje argument ByRef, modyfikacja

bdzie widoczna w procedurze wywoujcej.


ByVal oznacza przekazywanie do procedury wartoci zmiennej. Procedura
moe zmienia argument ByVal, ale te zmiany nie bd widoczne w procedurze
wywoujcej. W rzeczywistoci procedura uywa argumentw ByVal, tak jak

zmiennych deklarowanych lokalnie.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

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.

Jawnie wywouj domyln waciwo obiektu


Z wyjtkiem waciwoci Item obiektu Collection, nigdy nie naley wywoywa waciwoci obiektu w sposb niejawny jedynie przez uywanie w wyraeniu jego nazwy. W listingu 3.14 pokazujemy waciwy i niewaciwy dostpu do waciwoci
obiektu na przykadzie kontrolki MSForms.TextBox (Text jest domyln waciwoci
MSForms.TextBox).
Listing 3.14. Waciwoci domylne
' Sposb waciwy.
txtUsername.Text = "moje nazwisko"
' Sposb niewaciwy.
txtUsername = "moje nazwisko"

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.

Weryfikacja argumentw przed ich uyciem w procedurach


Jeeli procedura akceptuje tylko argumenty wejciowe o pewnych okrelonych waciwociach, np. wartociach z okrelonego przedziau, sprawdzaj, czy te warunki s
spenione przed prb uycia tych argumentw w procedurze. Chodzi o to, aby wychwyci bdne dane wejciowe tak wczenie, jak to tylko moliwe, aby wygenerowa
zrozumiay komunikat o bdzie i uproci debugowanie.
Gdziekolwiek to moliwe, twrz narzdzia do weryfikowania zachowania procedur.
Takie narzdzia s nakadan na procedury uprz, ktra pozwala na ich wielokrotne wywoywania i testowanie z rnymi zestawami argumentw oraz sprawdzanie prawdziwoci uzyskiwanych wynikw. Budowanie takich uprzy omwilimy
w rozdziale 16.

64

Excel. Programowanie dla profesjonalistw

Uywaj licznikw chronicych przed nieskoczonymi ptlami


Twrz ptle z automatycznymi zabezpieczeniami przed uyciem warunkw powodujcych
nieskoczone dziaanie ptli. Jednym z najpowszechniejszych bdw spotykanych
w ptlach Do...While lub While...Wend jest tworzenie sytuacji, w ktrych warunki
sterujce ptl nigdy nie zostan spenione. Wwczas ptla moe dziaa w nieskoczono (albo do czasu, gdy bdziesz mia szczcie przerwa dziaanie aplikacji
przez nacinicie kombinacji klawiszy Ctrl+Break, lub gdy tego szczcia zabraknie przez jej zamknicie za pomoc Menadera Zada systemu Windows). Zawsze
doczaj licznik, ktry automatycznie przerwie dziaanie, gdy liczba przebiegw ptli
przekroczy najwiksz warto, jak mona uzna za moliw do osignicia w praktyce.
W listingu 3.15 pokazujemy ptl Do..While ze struktur zabezpieczajc przed nieskoczonym dziaaniem.
Listing 3.15. Licznik zabezpieczajcy przed nieskoczonym dziaaniem ptli
Dim bKontynuujPetle As Boolean
Dim lLicz As Long
bKontynuujPetle = True
lLicz = 1
Do
' Kod umieszczony w tym miejscu powinien
' nada zmiennej bKontynuujPetle warto False,
' gdy ptla wykona swoje zadanie.
' Licznik zabezpieczajcy powoduje bezwarunkowe
' wyjcie z ptli po wykonaniu 10000 iteracji.
lLicz = lLicz + 1
If lLicz > 10000 Then Exit Do
Loop While bKontynuujPetle

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.

Wczenie i czsto uywaj polecenia Debug/Compile


Nigdy nie pozwl na to, aby Twj kod pobdzi wicej ni o kilka zmian od czasu
bezbdnego wykonania polecenia Debug/Compile. Odchodzenie od tej zasady grozi
dugimi i nieefektywnymi sesjami debugowania.

Rozdzia 3. Najlepsze praktyki programowania w Excelu i VBA

65

Odwoujc si do obiektw arkuszy, uywaj nazw kodowych


Do arkuszy roboczych i arkuszy wykresw odwouj si zawsze przez nazwy kodowe
(CodeNames). Uzalenianie odwoa od nazw na zakadkach arkuszy jest ryzykowne,
poniewa Ty sam lub inni uytkownicy mog te nazwy zmieni, niszczc w ten sposb
kod korzystajcy z takich odwoa.

Weryfikuj typy danych obiektw wybieranych


Jeeli tworzona procedura ma operowa na obiektach okrelonego typu wybieranych
przez uytkownika, zawsze sprawdzaj typ wybranego obiektu za pomoc funkcji TypeName
lub konstrukcji If TypeOf...Is. Jeeli np. musisz dziaa na zakresach wybieranych
przez uytkownika, zawsze przed pjciem dalej sprawdzaj, czy wybierane obiekty
s rzeczywicie typu Range. Zostao to pokazane na listingu 3.16.
Listing 3.16. Sprawdzanie, czy wybrany obiekt jest waciwego typu
' Kod zosta zaprojektowany do dziaania na obiektach Range.
If TypeOf Selection Is Excel.Range Then
' OK, to jest obiekt Range.
' Kontynuuj dziaanie.
Else
' Bd, to nie jest obiekt Range.
MsgBox "Prosz wybra zakres komrek", vbCritical, "Bd!"
End If

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

Excel. Programowanie dla profesjonalistw

Prosty rodzaj systemu kontroli wersji, pozwalajcy na uwolnienie si od kopotw tego


rodzaju, moe zosta wdroony w sposb nastpujcy. Po pierwsze, w folderze, ktrego uywasz do zapisywania wersji biecej, utwrz folder o nazwie KopieZapasowe
(Backup). Zawsze, gdy zamierzasz wprowadza znaczce rozszerzenia lub modyfikacje projektu, a przynajmniej raz dziennie uywaj programu kompresujcego, np.
WinZipa, do skompresowania wszystkich plikw z folderu roboczego do pliku z nazw:
Kopia_RRRRMMDDGG.zip, gdzie R oznacza rok, M miesic, D dzie, a G
godzin. Taki format nazw zapewni ich niepowtarzalno i pozwoli na atwe sortowanie w oknie Eksploratora Windows. Utworzony plik przesu do podfolderu KopieZapasowe i wr do pracy.
Po napotkaniu problemu bdziesz mg wrci do najnowszej wersji kopii. Oczywicie
wymaga to powicenia nieco czasu, ale jeeli bdziesz pilnie wykonywa kopie, zminimalizujesz straty. Za kadym razem, gdy bdziesz pewien, e masz ju w peni przetestowan now wersj projektu, bdziesz mg wykasowa z folderu KopieZapasowe
wikszo zapisanych tam plikw. Warto jednak pozostawia przynajmniej pojedyncze kopie z kadego tygodnia pracy przez cay okres ycia projektu.

Dokumentowanie zmian za pomoc komentarzy


Gdy utrzymujesz kod, dokonujesz znaczcych zmian w logice procedur, naley rwnie doda krtk notatk z opisem zmiany, dat i nazwiskiem dokonujcego zmiany,
umieszczon w komentarzu na poziomie procedury, co mona zobaczy w listingu
3.3. Wszystkie nietrywialne modyfikacje kodu powinny by opatrzone wewntrznymi
komentarzami, zawierajcymi dat dokonania zmiany, nazwisko osoby, ktra zmian
wprowadzia, zwaszcza gdy nad projektem pracuje grupa.

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.

You might also like