Sunteți pe pagina 1din 83

Programarea aplicaiilor Microsoft Office

(Visual Basic for Applications)


Introducere
VBA (Visual Basic for Applications) este un limbaj de programare creat de Microsoft pentru automatizarea
aplicaiilor. Ataat iniial componentelor din Microsoft Office, n prezent sunt raportate peste 200 de aplicaii care
include VBA (CorelDraw, AutoCAD etc.).
VBA este parte a familiei de limbaje Visual Basic, situndu-se sub VB, dar peste VBScript. Totui, VBA este
acum un element esenial n versiunea complet VB, oferind suport pentru limbaj, interfaa pentru forme,
controale, obiecte, tehnologii de accesare a datelor.
Atunci cnd este gzduit de alt aplicaie, cum ar fi Excel, VBA ofer mijloacele de interaciune cu obiectele
aplicaiei gazd. In acest caz, VBA permite dezvoltatorilor s furnizeze soluii complete care extind i/sau
integreaz aplicaiile gazd.
Pentru a programa n VBA trebuie totui reinut c o cerin supli-mentar fa de alte limbaje este aceea c trebuie
s se cunoasc aplicaia gazd (Word, Excel, PowerPoint, Access etc.).

Scurt istoric
1993 VBA apare n Microsoft Excel
1994 VBA este ataat la Microsoft Project
1995 este inclus n Microsoft Access, nlocuind Access Basic
1996 VBA devine element n Visual Basic
1996 este inclus n Word, nlocuind Word Basic
1997VBA este integrat n suita Office 97
1997 Microsoft liceniaz VBA pentru utilizarea n alte aplicaii software

Editorul Visual Basic


n aceast seciune se prezint mediul de dezvoltare Visual Basic for Applications integrat n Microsoft Office.
Utiliznd Visual Basic Editor, numit n continuare VBE, se poate crea, edita, depana i executa cod program
asociat cu documente Microsoft Office.
Proiectele dezvoltate n VBE, dei sunt asociate aplicaiilor din Office, nu pot fi reduse, ca problematic, la
procesarea de texte (Word), calcul tabelar (Excel), prezentri electronice (PowerPoint) sau baze de date (Access).
Este corect s se considere aceste proiecte drept aplicaii similare celor dezvoltate n alte medii de programare,
avnd ns la dispoziie componentele aplicaiilor din Office. Cu alte cuvinte, nu este vorba de o limitare a
posibilitilor de prelucrare, ci o potenare a acestora prin apelul posibil la obiectele din Office.
O obiecie la utilizarea VBA este aceea c proiectul se poate executa doar dintr-o aplicaie Office (deci deschiznd,
chiar formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente disponibile n
dezvoltarea proiectului compenseaz acest neajuns. n plus nu trebuie uitat c orice aplicaie necesit o interfa
utilizator (puternic n Microsoft Office) i c aplicaiile de baz sunt ntreinute i completate de Microsoft, astfel
nct proiectele noastre se vor actualiza i ele o dat cu componentele Office.
Un ultim argument este acela c mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio
(Visual Basic, C++ etc.) astfel c practica n VBA poate fi considerat introductiv ctre alte aplicaii RAD.

Interfaa grafic VBE


Pentru a deschide editorul VB, mai nti se va porni o aplicaie din Microsoft Office, apoi se poate aciona
combinaia Alt+F11 (dac nu a fost atribuit altei operaiuni), sau
butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizat ntr-o
aplicaie Office, sau
Meniul Tools, Macro, Visual Basic Editor.

Interfaa grafic VBE este suficient de complex, asemntoare mediilor de programare din Visual Studio. Pe lng
obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite
categorii de obiecte:
Properties Window pentru vizualizarea i fixarea proprietilor n momentul proiectrii (design-time);
Project Explorer care permite navigarea, vizualizarea i modificarea proiectelor deschise la un moment dat;
Code Window unde este se scrie i este vizibil codul surs al proiectului activ;
Locals Window care permite vizualizarea variabilelor locale cu valorile lor;
Immediate Window care permite executarea imediat a unei linii de cod;
Watch Window unde se afieaz valorile unor expresii specificate (utile n depanarea programelor).

Properties Window
Prin proprietate a unui obiect se nelege o caracteristic a
respectivului obiect (cum ar fi culoarea sau vizibilitatea etc.).
Fixarea valorii proprietii se reflect n aparena obiectului sau n
comportamentul lui (de exemplu, fixarea proprietii
ShowSpellingErrors la valoarea True arat n document erorile de
scriere).
Fereastra Properties poate fi utilizat, n momentul proiectrii,
pentru a vizualiza toate proprietile obiectului activ i a modifica
valorile dorite.
n partea superioar este cutia de obiecte n care se poate selecta
un obiect (sau mai multe) dintre cele vizibile.
n fia Alphabetic se listeaz proprietile modificabile ale
obiectului selectat, n ordine alfabetic. Se poate modifica
valoarea unui atribut prin selectarea numelui proprietii i
tastarea sau selectarea noii valori.
n fia Categorized sunt listate proprietile dup categorii, ntr-un
control de tip Explorer, in care ramurile pot fi expandate sau.
Fereastra Properties poate fi artat (cnd nu este vizibil), prin
comanda Properties Window din meniul View.

Project Explorer
Codul surs asociat cu un workbook, document, template sau
prezentare este asociat ntr-un proiect, care este memorat i salvat n
mod automat o dat cu caietul Excel, documentul Word, ablonul sau
prezentarea respectiv. n fereastra Project Explorer se pot vedea,
modifica i naviga printre toate proiectele asociate oricrui document,
caiet, ablon sau prezentare deschise.
Pentru un proiect se listeaz, ntr-un control de tip Explorer, obiectele
care recunosc evenimente, formele, modulele, referinele. Pentru a
vedea codul dintr-un modul sau codul asociat unui obiect, se selecteaz
respectivul modul sau obiect i se apas butonul View Code (primul
din stnga). Pentru a vedea interfaa utilizator pentru un obiect sau
form se selecteaz i se apas butonul View Object (cel din mijloc).
Pentru a vedea organizarea n foldere a elementelor listate n Project
Explorer se va apsa butonul Toggle Folders.
Fiecare element este nsoit, n arborele de structur, de icoana specific
elementului: proiect, folder, referin, obiect etc.

Code Window

Fereastra principal a Editorului Visual Basic este cea n care se poate scrie codul surs. Deoarece procedurile sunt
asociate unor obiecte de interfa, sau aparin unui modul, mai nti se va selecta, din Project Explorer, modulul sau
forma vizat i apoi se va apsa butonul View Code.
Pentru a vedea mai mult de o procedur n fereastra de cod, se va selecta boxa de control Default to Full Module
View n fia Editor din Options (meniul Tools) (n caz contrar se va vedea doar cte o procedur).

n partea de sus a ferestrei se gsesc dou boxe:


Object Box unde se poate selecta obiectul pentru care se afieaz procedurile asociate;
Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaz/editeaz codul. Procedurile pot
fi de tip eveniment, dac obiectul selectat este o form utilizator. Selectarea unei proceduri produce o defilare a
textului astfel nct pointerul s fie la prima linie a procedurii.
Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat ntre ferestre, ferestrele se pot diviza
utiliznd bara de divizare etc.
Acionarea butonului Procedure View Icon (primul din stnga, pe bara de jos a ferestrei) sau a butonului Full
Module View Icon produce alegerea ntre vizualizarea unei singure proceduri sau a tuturor procedurilor din modul.

Locals Window
Util n procesul de punere la punct a programului, fereastra Locals servete la afiarea automat a tuturor
variabilelor declarate n procedura curent. Coninutul ferestrei este actualizat de fiecare dat cnd se trece din
modul Run n modul Break sau atunci cnd se navigheaz n stiva de apeluri.
Pentru o descriere a ferestrei se va vedea seciunea dedicat depanrii programelor.

Immediate Window
Permite scrierea i execuia imediat a unei linii de cod. Linia poate fi copiat n i dintr-o fereastr de cod.
n modul de execuie Break, instruciunea din fereastra Immediate este executat n contextul procedurii afiate n
Procedure Box.
Pentru aciunile posibile n fereastra Immediate, se va studia Help Immediate Window Keyboard Shortcuts.

Watch Window
Este fereastra unse sunt afiate automat valorile expresiilor urmrite n etapa de depanare a proiectului.
Pentru o descriere a ferestrei Watch se va vedea seciunea dedicat depanrii programelor.

Scrierea procedurilor
Instruciunile unui proiect se pot nscrie, dup modul lor de creare, n dou mari categorii:
scrise de aplicaia de baz (Word, Excel etc.) prin traducerea aciunilor interfeei utilizator (meniuri, comenzi etc.)
n cod VBA. Aceast operaiune este cea de nregistrare a unui macro.
scrise ntr-o fereastr de cod de ctre utilizator (proiectant), cu asistena mediului VBE.

nregistrarea unui macro


Aciunea este util att prin aceea c operaiuni simple pot fi traduse uor n instruciuni VBA, procedurile pot fi
editate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cutare/nlocuire sau formatri de

obiecte grafice) codul generat automat ofer un bun model de utilizare a obiectelor, proprietilor i metodelor
aplicaiei.
Pentru a nregistra un macro:

Se afieaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite).

Pe bara Visual Basic se acioneaz butonul Record Macro.

n dialogul Record Macro se nlocuiete numele dat implicit n boxa Macro Name i apoi OK.
Se poate utiliza boxa Store macro pentru a alege locul de memorare a codului.

Se execut aciunile menite s fie nregistrate/traduse n VB, n succesiunea dorit.

Pe bara Stop Recording (aprut la iniierea procesului de nregistrare) se apas butonul Stop
Recording.

Pentru a vedea liniile de cod generate, se deschide n aplicaia de baz meniul Tools, comanda Macro, apoi
Macros, se selecteaz dup denumire i se apas butonul Edit.
Codul surs poate fi vzut i prin navigarea n VBE prin Project Explorer, ferestre de cod etc.
Din punctul de vedere al programrii se poate spune c un macro este o procedur public fr argumente, deci
poate fi scris i direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care pot
fi executate din dialogul Macros (Tools - Macro - Macros) sunt macro-uri.

Scrierea unei proceduri


Dac se dorete scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific, se ca
crea o procedur ntr-un modul standard.
Pentru a crea un modul standard nou (gol), se merge n Project Explorer n proiectul unde se adaug modulul nou
creat i se d comanda Module din meniul Insert.
Pentru a deschide un modul standard existent, se va selecta modulul din Project Explorer i se apas butonul View
Code (sau dublu click).
Pentru a aduga o procedur la un modul, se selecteaz modulul n Project Explorer, se deschide meniul Insert i se
d comanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta opiunile definitorii (subrutin sau
funcie, public sau nu etc.) i se d OK. Dup aceasta se pot aduga liniile de cod ale procedurii.

Scrierea unei proceduri de eveniment (event procedure)


Dac se dorete scrierea de cod surs care s se execute automat atunci cnd are loc un anumit eveniment (cum ar fi
deschiderea unui document, acionarea unui buton etc.), trebuie s se scrie o procedur asociat evenimentului
respectiv. O asemenea procedur se va numi procedura evenimentului.
Anumite obiecte din aplicaiile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declanate de
ctre sistem sau de ctre utilizator. Evenimentele specifice fiecrui obiect trebuie s fie studiate separat (se va
studia seciunea din Help pentru fiecare aplicaie), doa principalele obiecte, cu proprietile, metodele si
evenimentele lor, sunt prezentate i n acest curs, n capitole separate.
Modul cum aplicaia rspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de
eveniment. O asemenea procedur se va scrie n fereastra Code asociat obiectului. De fiecare dat cnd apare
evenimentul se execut procedura evenimentului respectiv. De exemplu, dac se scrie o procedur asociat cu
evenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere a acelui
documentului.
O procedur de eveniment este memorat n documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc.
unde poate fi declanat evenimentul. Pentru a vedea codul surs al procedurii, se va selecta obiectul n Project
Explorer i click pe butonul View Code pentru a deschide fereastra de cod asociat. Dintr-o fereastr de cod
deschis, asociat, se va selecta obiectul vizat, din boxa de obiecte, i n boxa de proceduri vor fi listate atunci toate
procedurile evenimentelor, chiar dac ele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (dac nu exist)
liniile obligatorii ale procedurii i va fixa cursorul de editare n procedura respectiv.
Numele unei proceduri de eveniment este format din numele obiectului, care recunoate evenimentul, urmat de
caracterul "_" i de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care se
execut la deschiderea unui document.

Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dup ce sau scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte
(Document, Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite.
Observaie. Dac se dorete ca o procedur s fie asociat cu un document specific, dar nu cu un eveniment
specific, atunci procedura se va scrie n seciunea (General) a documentului respectiv (de exemplu o rutin care s
poat fi apelat din mai multe proceduri de eveniment).

Unelte VBE pentru scrierea instruciunilor


Deoarece multe dintre denumirile obiectelor, proprietilor sau metodelor care apar n codul VBA sunt complexe,
mediul de dezvoltare ofer o serie de unelte pentru completarea automat a cuvintelor cheie, pentru oferirea de
ajutor n reamintirea denumirilor etc.
Dac s-au tastat suficient de multe caractere nct VB poate recunoate un cuvnt, atunci prin CTRL+SPACE, sau
click pe butonul Complete Word de pe bara de unelte Edit, completeaz cuvntul.
n dialogul Options (meniul Tools) se pot activa urmtoarele aciuni, executate automat la completarea unei linii de
cod:
verificarea automat a sintaxei Auto Syntax Check;
obligativitatea declarrii tuturor variabilelor, adugarea automat a instruciunii Option Explicit la orice nou modul
Require Variable Declaration;
afiarea unei liste cu informaii utile (logice la poziia curent a cursorului) la completarea instruciunii Auto
List Member;
afiarea informaiei despre proceduri i parametrii lor Auto Quick Info;
afieaz, doar n modul Break, valoarea unei variabile peste care este plasat cursorul Auto Data Tips;
alinierea automat a liniilor noi la nceputul liniei precedente Auto Indent;
fixarea limii ntre poziiile tabulatorului, 1 la 32 de spaii (implicit fiind 4) Tab Width.
Pe bara de unelte Edit exist cteva butoane, care ajut la completarea cuvintelor i expresiilor n timpul scrierii
instruciunilor:
List Properties/Methods deschide o cutie n fereastra Code cu proprietile i metodele permise pentru obiectul
care precede caracterul punct ("."), util atunci cnd se opereaz cu obiecte.
List Constants deschide n fereastra de cod, la punctul de inserie, o cutie cu constantele permise pentru
proprietatea care precede semnul egal ("=") n instruciunea curent.
Quick Info ofer, ca ajutor, sintaxa pentru o variabil, funcie etc. prin analiza locului punctului de inserie pe
linia curent.
Parameter Info arat o cutie, la punctul de inserie, cu informaia despre parametrii funciei n care este
pointerul.
Complete Word accept caracterele pa care le propune VBE drept completare la cuvntul tastat.
Comment Block care transform n comentarii liniile selectate.
Uncomment Block nltur semnul de comentarii la liniile selectate.

Executarea unei proceduri Sub


O procedur poate s se execute:
automat, ca rspuns la declanarea unui eveniment (procedura evenimentului);

din VBE, dac punctul de inserie este n procedur i se acioneaz butonul Run Sub/UserForm de
pe bara de unelte Standard sau Debug;

ca un macro, Run din dialogul Macros (Tools - Macro) al aplicaiei de baz;

apelat din alt procedur.


La apelul unei proceduri din alt procedur se va ine seama de interaciunea declaraiilor Public, Private, ca i de
referinele la alte proiecte (meniul Tools - References).

Instruciunile VBA
Tipuri de date
Variabilele i constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre
deosebire de alte limbaje de programare, exist un tip universal tipul Variant , care poate conine aproape
orice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct declararea
explicit poate fi utilizat atunci cnd se dorete economisirea memoriei (tipul Variant aloc mai mult memorie),
vitez n execuie sau atunci cnd se scriu date ntr-un fiier n acces direct.

Boolean
Domeniu de valori: True sau False (valorile logice)
Memorie: 2 bytes
Declarator de tip:
Observaii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule
produc True.
Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.

Byte
Domeniu de valori: 0255 (numere ntregi, fr semn)
Memorie: 1 byte
Declarator de tip:
Observaii.

Currency
Domeniu de valori: -922 337 203 685 477.5808 922 337 203 685 477.5807
Memorie: 8 bytes
Declarator de tip: @
Observaii. Utilizate pentru calcule bneti (sau alte situaii n care precizia este foarte
important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obine 15 cifre
la partea ntreag i 4 cifre la partea zecimal (reprezentare n virgul fix).

Date
Domeniu de valori: 1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59
Memorie: 8 bytes
Declarator de tip:
Observaii. Informaiile de tip dat calendaristic i/sau timp orar sunt memorate drept numere
flotante, partea ntreag reprezentnd data calendaristic, partea fracionar reprezentnd timpul.
La convertiri, miezul nopii este 0, miezul zilei este .5, numerele negative reprezint date nainte de
30 decembrie 1899.
Poate fi atribuit ca valoare de tip date orice literal care reprezint o dat calendaristic recunoscut
ca atare, literalul trebuind s fie cuprins ntre simboluri #, de exemplu #1 Jan 99#.

Decimal
Domeniu de valori: (vezi observaiile)
Memorie: 12 bytes
Declarator de tip:
Observaii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nsoii de un factor de
scal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (fr parte zecimal), cea mai

mare valoare posibil este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare


valoare este +/-7.9228162514264337593543950335 iar cea mai mic valoare nenul este +/0.0000000000000000000000000001.
Not: Deocamdat, tipul Decimal poate fi utilizat doar ca subtip n Variant, adic nu se pot declara
variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin funcia
Cdec (funcia foreaz o expresie s fie de un tip specificat, din aceeai categorie de funcii fiind i
CBool, CByte etc.).

Double
Domeniu de valori: numere negative de la -1.79769313486232E308 pn la 4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pn la
1.79769313486232E308 (numere flotante n dubl precizie).
Memorie: 8 bytes
Declarator de tip: #
Observaii.

Integer
Domeniu de valori: -32 768 32 767.
Memorie: 2 bytes
Declarator de tip: %
Observaii.

Long
Domeniu de valori: -2 147 483 648 2 147 483 647.
Memorie: 4 bytes
Declarator de tip: &
Observaii.

Object
Domeniu de valori: (vezi observaiile)
Memorie: 4 bytes
Declarator de tip:
Observaii. Adrese pe 32 de bii care se refer la obiecte. Prin instruciunea Set se atribuie unei
variabile declarate de tip Object referina la obiectul dorit.
Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataare
trzie (la timpul execuiei run-time binding). Pentru o ataare timpurie (la timpul compilrii
compile-time binding) se va utiliza o variabil declarat cu numele clasei respective.

Single
Domeniu de valori: numere negative de la -3.402823E38 pn la -1.401298E-45; numere pozitive
de la 1.401298E-45 pn la 3.402823E38.
Memorie: 4 bytes
Declarator de tip: !
Observaii.

String
Domeniu de valori: ir de lungime variabil: pn la 2^31 caractere; ir de lungime fix: pn la
2^16 caractere.
Memorie: 2 bytes
Declarator de tip: $
Observaii. Un ir de lungime fix declarat Public nu poate fi utilizat ntr-un modul de clas.

Variant (default)
Domeniu de valori: aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuri
ale tipului Variant, cu meniunea c toate subtipurile numerice au domeniul de la Double.
Memorie: n funcie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String
necesit 22 bytes plus cte un byte pentru fiecare caracter.
Declarator de tip:
Observaii. Este tipul specificat implicit (n lipsa unei declaraii explicite) pentru o constant,
variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferenele
de tip ale argumentelor la apelul procedurilor).
Cu excepia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul
Variant poate conine orice alt tip de dat. n plus poate s conin valorile speciale Empty, Error,
Nothing i Null. Tipul considerat pentru o dat coninut ntr-un Variant poate fi determinat cu
funcia VarType sau TypeName.
Valorile unei variabile Variant pot s-i converteasc valorile automat. n general, datele numerice
sunt memorate n tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac
rezultatul unei operaii necesit acest fapt. De exemplu o valoare declarat iniial drept Integer i
atribuit unui Variant va fi memorat ca un ntreg pn cnd, ridicnd-o de exemplu la o putere,
valoarea ei excede domeniul tipului Integer. n acest caz are loc promovarea (ca mod de
reprezentare) la tipul superior adecvat (Long sau Double). Dac depirea domeniului are loc
pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare.
Utilizarea tipului Variant permite o tratare mai difereniat a irurilor de cifre: n operaii numerice
vor fi considerate numere iar n operaii cu iruri vor fi considerate iruri.
Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite.
Valorile speciale au semnificaia:
Empty este valoarea unui Variant care nu a fost iniializat. n calcule numerice este considerat 0 iar n operaii cu
iruri este irul de lungime zero.
Null este valoarea unui Variant care, n mod programatic, nu conine date.
Error este valoarea utilizat pentru a arta ndeplinirea unei condiii de eroare (prin convertirea unui real cu funcia
CVErr). Procesarea se va efectua de ctre utilizator, tratarea automat a erorilor nu este activat la setarea acestor
valori.
Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv.

Tipuri definite de utilizator


Un tip de dat definit de utilizator reprezint echivalentul unei nregistrri dintr-un fiier (baz de date), adic o
grupare de entiti de tipuri diferite. Definirea are loc la nivel de modul, prin instruciuni Type. Pentru clauzele care
apar se va vedea discuia de la domeniul variabilelor.
[Private | Public] Type varname
elementname [([subscripts])] As type
[elementname [([subscripts])] As type]
...
End Type
unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utiliza
i componente de tipuri utilizator deja definite. Componentele pot fi i tablouri, caz n care apar definiiile specifice
(vezi declararea variabilelor).

Declararea constantelor, variabilelor i tablourilor


Nume

La denumirea procedurilor, constantelor, variabilelor i argumentelor ntr-un modul Visual Basic


se cere respectarea urmtoarelor reguli:

primul caracter trebuie s fie o liter;


nu se utilizeaz spaiu, punct (.), semnul exclamrii(!), sau caracterele @, &, $, #
lungimea denumirii nu poate depi 255 de caractere;
la acelai nivel de existen nu pot s existe denumiri identice. Pot s existe totui, n acelai modul, o variabil
privat i o variabil la nivel de procedur care s poarte acelai nume.
n general, nu se recomand definirea unor denumiri identice cu nume de funcii, instruciuni sau metode existente
n Visual Basic. Dac s-a ajuns totui la aceast situaie, atunci utilizarea funciei intrinseci limbajului, a
instruciunii sau metodei care intr n conflict cu un nume asignat necesit calificarea ei n raport de biblioteca
asociat. De exemplu, VBA.Left este apelul la funcia Left atunci cnd este definit de utilizator i o variabil Left.
Not. Visual Basic nu este case-sensitive, deci denumirea unei entiti nu are ca atribut distinctiv capitalizarea
literelor, dar mediul de programare VBA pstreaz capitalizarea din instruciunea unde este definit un nume.

Declararea constantelor
Definirea unei constante se realizeaz prin instruciunea Const, n care se poate specifica tipul, domeniul i valoarea
constantei. Valoarea unei constante nu se poate schimba programatic.
[Public | Private] Const constname [As type] = expression
Public cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din toate modulele. Nu este permis n proceduri.
Private cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din modulul n care apare declaraia. Nu este permis n proceduri.
constname numele constantei (obligatoriu).
type tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nc nu este suportat),
Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; n lipsa clauzei se va ataa automat
tipul cel mai apropiat expresiei.
expression combinaie de identificatori, constante, operatori (cu excepia Is) care produce un sir, numr sau
obiect. Nu se pot utiliza variabile, funcii utilizator sau funcii VBA predefinite.
n mod implicit, constantele sunt private. La nivel de procedur, sau de modul clas, domeniul lor nu poate fi
modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public.
Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afara
unei proceduri este definit n modulul respectiv.
Mai multe declaraii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri de
expresii. n acest caz, cuvintele Public sau Private care apar se aplic ntregii linii.

Exemple
Const NrLinii = 15
Public Const MesajInitial = "Tastati numarul de linii"
Private Const NrLinii as Integer = 15
Public Const NrLinii = 15, Pondere as Single = 1.21

Este de remarcat c, n ultima linie, doar Pondere este de tip Single, n timp ce NrLinii este de tip Integer (n lipsa
clauzei As type se atribuie tipul expresiei).

Declararea variabilelor
Variabilele, simple sau tablou, se definesc prin instruciunile Dim, Private, Public, ReDim sau Static. Numele unei
variabile trebuie s respecte regulile generale de formare a identificatorilor, tipul variabilei poate fi definit explicit
(prin clauza As type) sau implicit (ca Variant).
n cazul n care modulul conine instruciunea Option Explicit cu sintaxa
Option Explicit
i care trebuie s apar naintea oricrei proceduri din modul, toate variabilele trebuie s fie declarate prin
instruciunile menionate. Lipsa instruciunii Option Explicit permite ca variabilele s fie definite acolo unde este
nevoie de ele prin simpla menionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim
posibilitate poate produce erori greu detectabile.

Sintaxa instruciunilor de declarare a variabilelor este urmtoarea i se observ asemnarea clauzelor.


Dim [WithEvents] varname[([subscripts])] [As [New] type]
Private [WithEvents] varname[([subscripts])] [As [New] type]
Public [WithEvents] varname[([subscripts])] [As [New] type]
Static varname[([subscripts])] [As [New] type]
ReDim [Preserve] varname(subscripts) [As type]
varname numele variabilei (obligatoriu).
subscripts dimensiunile tabloului de date (dac se declar o variabil tablou). Pot exista pn la 60 de indici,
separai prin virgule, declararea dimensiunilor pentru un indice fiind de forma
[lower To] upper
Limita inferioar este, implicit, 0, dar poate fi controlat prin instruciunea Option Base.
Dac nu se indic limitele indicilor (dar parantezele sunt prezente), se definete o variabil tablou
dinamic (nu i prin Static) ale crei dimensiuni pot fi precizate/redefinite prin instruciunea
ReDim.
New permite crearea implicit a unui obiect (atunci cnd se declar o variabil de tip obiect). O nou instan a
obiectului este creat la prima referin a variabilei definite. Clauza nu poate s apar la declararea variabilelor de
tipuri intrinseci i nici la declararea instanelor obiectelor dependente.
type tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat
nc), Date, String (pentru iruri cu lungime variabil), String * length (pentru iruri cu lungime fix), Object,
Variant, tip utilizator sau tip de obiect.
Dac se definesc mai multe variabile ntr-o instruciune, definiiile se separ prin virgul iar clauza de tip nu este
extins i la variabilele definite ulterior.
Dei toate instruciunile permit declararea unor variabile (simple sau tablou), fiecare instruciune are un efect
distinct n ceea ce privete vizibilitatea variabilelor i persistena valorilor.
Dim definete variabile att la nivel de modul ct i la nivel de procedur. Variabilele definite la nivel de modul
sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedur sunt vizibile doar n procedura
respectiv.
Private este utilizat la nivel de modul pentru a declara variabile accesibile doar n procedurile acelui modul.
Public este utilizat pentru a declara variabile accesibile n toate procedurile din toate modulele i din toate
aplicaiile. Prin includerea instruciunii Option Private Module este posibil ca variabilele publice s fie vizibile doar
n proiectul n care sunt definite.
Static este utilizat la nivel de procedur nestatic pentru a declara variabile care i pstreaz valoarea de la o
execuie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit. Variabilele
definite prin Static sunt vizibile doar n procedura respectiv. Este de remarcat c se poate defini o ntreag
procedur utiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice.
ReDim este utilizat la nivel de procedur pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea
clauzei Preserve permite doar modificarea ultimei dimensiuni i pstreaz valorile deja existente. (Pentru detalii
vezi i VBA Help).

Exemple
Dim x As Double, ColtStanga As Integer
Private I, J As Long
Static Venit As Currency, NumPren As String
Dim Retineri(5) As Currency
Public indicatori(10) As Byte
Dim matrice(1 To 3, 100 To 200) As String
Public fntScris As Font
Dim appWD As Word.Application

Proceduri
Printr-o procedur se nelege, similar altor limbaje de programare, o mulime de instruciuni care este identificat
printr-un nume i care se execut unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o
procedur s efectueze o prelucrare unitar identificabil n logica programului.
Exist trei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unui
obiect i va fi prezentat ulterior. O procedur de tip Sub poate primi i transmite informaii prin intermediul unor
variabile publice sau/i a unor parametri. Numele procedurii nu are ataat nici o valoare. O procedur de tip
Function se deosebete prin aceea c numele procedurii are ataat o valoare (valoarea funciei) i poate fi utilizat
ca orice alt variabil din proiect.
Observaie. Orice instruciune executabil trebuie s aparin unei proceduri. Declaraiile pot s apar i n afara
procedurilor, la nivel de modul.

Proceduri Sub
Organizarea general a unei proceduri de tip Sub este
[Private | Public] [Static] Sub name ([arglist])
[instruciuni]
[Exit Sub]
[instruciuni]
End Sub
Public, Private, Static determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate
modulele (n funcie de Option Private se definete vizibilitatea pentru alte proiecte). Private = vizibil doar pentru
procedurile din modulul unde procedura este declarat. Static = arat c toate variabilele locale i pstreaz
valorile ntre apeluri.
name numele procedurii.
arglist lista de argumente, separate prin virgule.
Prin instruciunea Exit Sub se poate iei din procedur i altminteri dect prin linia final.
Argumentele se definesc dup sintaxa:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
Optional arat c parametrul nu este obligatoriu. Parametrii opionali trebuie s fie grupai la sfritul listei
(apariia clauzei Optional cere ca toi parametrii care urmeaz s aib aceeai clauz).
ByVal arat c apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regsit
dup prsirea procedurii, calculele efectundu-se pe o copie a parametrului).
ByRef arat c apelul paramatrului se face prin referin (orice modificare a valorii transmise este regsit dup
prsirea procedurii). Acesta este modul implicit de transmitere a parametrilor.
ParamArray folosit doar ca ultim argument n list, denot un tablou Optional de elemente de tip Variant.
Clauza ParamArray permite definirea unui numr arbitrar de parametri. ParamArray nu poate fi utilizat mpreun
cu ByVal, ByRef, sau Optional.
varname numele argumentului. Dac este tablou se vor indica parantezele.
type tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String
(doar lungime variabil), Object, Variant. Pentru parametrii obligatorii (fr Optional) poate fi i un tip definit sau
de obiect.
defaultvalue definete valoarea implicit pentru argumentele opionale. Poate fi orice expresie, dar pentru tipul
Object se admite doar Nothing.

Apelul unei proceduri Sub


Pentru a executa o procedur de tip Sub din alt procedur (vezi i discuia privind vizibilitatea) se menioneaz, pe
o linie separat, numele procedurii urmat sau nu de parametri. Dac este necesar, datorit apelrii unui alt proiect
sau modul, atunci apelul este dup modelul:
Nume_proiect.Nume_modul.Nume_procedur list de argumente

unde lista de argumente poate sau nu s fie inclus ntre paranteze. Argumentele efective sunt separate n list prin
virgule i trebuie s respecte ordinea (i tipul) argumentelor din definiia procedurii. n cazul procedurilor cu multe
argumente, dintre care multe opionale, transferul poate provoca erori de scriere a codului (un argument opional
necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situaii (n special) se
permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alctuind lista
de argumente, la apelul procedurii, din intrri de forma
nume_argument:=valoare_argument
separate prin virgule i la care nu mai conteaz ordinea iniial a argumentelor. Se vor specifica doar parametrii
care se transmit efectiv (adic valorile opionale dorite i toate valorile neopionale).
Pentru apelul unei proceduri se va studia i instruciunea Call.

Proceduri Function
O procedur de tip Function este similar, ca definiie, unei proceduri Sub, dar are particularitatea c returneaz o
valoare prin numele su (care se comport deci ca o variabil).
[Public | Private] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
Este de remarcat c se poate ataa un tip numelui funciei (adic valorii funciei) i se va remarca existena
instruciunilor prin care se atribuie funciei valorile calculate.
Valoarea returnat de o funcie poate fi utilizat ntr-o alt expresie prin includerea numelui funciei urmat, ntre
paranteze, de valorile efective ale parametrilor.
Dac apelul se face prin intermediul instruciunii Call, valoarea funciei nu poate fi utilizat. n asemenea situaii se
activeaz de fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate).

Exemple de proceduri
Public Function AriaCilindru (raza, inaltime) As Double
Const Pi = 3.14159
cilBaza = Pi*raza^2
cilLaterala = 2*Pi*raza*inaltime
AriaCilindru = 2*cilBaza + cilLaterala
End Function

Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, ByRef cilAria As Double)
Const Pi As Single = 3.14159
Dim cilBaza As Single, cilLaterala As Single
cilBaza = Pi*raza^2
cilLaterala = 2*Pi*raza*inaltime
cilAria = 2*cilBaza + cilLaterala
End

Apelul funciei poate fi ntr-o instruciune de genul


CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

n timp ce apelul subrutinei poate fi


AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa

Organizarea general a unui proiect VBA


Obiectele i prelucrrile necesare realizrii unei aplicaii VBA (presupunnd c se dorete atingerea unui ansamblu
coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un
anumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor.
Deoarece prelucrrile proiectate n VBA sunt ataate documentelor (aciunilor) unor aplicaii particulare (Word,
Excel etc.), proiectele sunt salvate o dat cu documentele pe care le nsoesc. Acest fapt nu reduce aria de probleme
abordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nsoit (se poate deschide astfel un
document Word alb i s se efectueze orice prelucrare dorit, fr a avea obligaia de a scrie ceva n documentul
deschis).
ntr-un proiect VBA sunt identificabile urmtoarele componente:
Module standard (denumite iniial module de cod). Conin declaraii i proceduri generale. Exist de asemenea i
module care conin tratarea evenimentelor specifice documentului de care este ataat proiectul.
Module de clas. Conin definirea obiectelor create de utilizator.
Forme. Conin definiiile dialogurilor din interfaa proiectat de utilizator ca i codul program necesar controlrii
dialogurilor.
Referine. ntr-un proiect este meninut lista altor proiecte, care sunt referite n proiectul curent.
Un modul de cod poate ncepe cu o seciune de declaraii. Prin declaraii nelegem instruciuni neexecutabile prin
care se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeaz i domeniul
de vizibilitate a entitilor definite.
Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA,
care este prezentat ntr-o seciune separat.

Domeniul unei variabile, constante sau proceduri


Domeniul unei entiti reprezint mulimea instruciunilor unde poate fi referit acea entitate. Se poate vorbi astfel
de vizibilitatea unei entiti. Domeniul este dependent de locul definirii entitii, de clauzele care apar la definire i
de parametrii globali ai proiectului.
Not. Este de remarcat c utilizarea unei denumiri n afara domeniului iniial prefigurat produce, n
lipsa instruciunii Option Explicit, crearea unei noi entiti, fr nici o legtur cu cea precedent,
surs de erori greu detectabile. Acesta este motivul pentru care se recomand declararea explicit a
tuturor variabilelor.
Exist trei tipuri de domenii:
la nivel de procedur;
la nivel de modul, privat;
la nivel de modul, public.

Nivelul procedur
O variabil sau constant definit ntr-o procedur este vizibil doar n procedur respectiv. Dac o asemenea
entitate trebuie referit i n alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmite
procedurii prin intermediul argumentelor.

Nivel de modul, privat


Variabilele i constantele definite la nivel de modul (n seciunea Declarations) sunt Private n mod implicit, adic
sunt vizibile doar n modulul respectiv. Utilizarea clauzei Private nu este deci necesar, dar este recomandat.
Not. Dac se utilizeaz instruciunea Option Private Module (n seciunea Declarations a modulului) atunci
variabilele i procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declaraii, procedurile
publice (din toate modulele standard sau clas) sunt vizibile n toate proiectele care se refer la proiectul curent.
Procedurile, variabilele i constantele publice din alte module (cum ar fi modulele ataate formelor) sunt Private
pentru proiectul de definiie, deci ele nu sunt accesibile proiectelor care se refer la proiectul unde sunt declarate.

Nivel de modul, public


Variabilele declarate la nivel de modul drept Public sunt vizibile n toate procedurile din proiect. Procedurile sunt
publice n mod implicit, cu excepie procedurilor de tratare a evenimentelor, care sunt Private n mod implicit. A se
vedea i nota anterioar.

Viata unei variabile


Prin viaa unei variabile se nelege timpul ct variabila are o valoare. Este evident c valoarea unei variabile se
poate modifica pe durata vieii sale, dar definitoriu este faptul c variabila are o anumit valoare pe ntreaga durat
a vieii sale. La prsirea domeniului, variabila "moare" i nu mai are ataat o valoare.
La nceputul execuiei unei proceduri, toate variabilele sunt iniializate:
Variabil numeric

0 (zero)

ir de lungime variabil

"" (ir de lungime zero)

ir de lungime fix

Completat cu caracterul Chr(0)


(avnd codul ASCII 0)

Variabil Variant

Empty

Variabile de tip utilizator

fiecare element este iniializat


separat, potrivit tipului primar

Variabil Object

Nothing (pn la asignarea unei


referine prin Set)

Variabilele care nu sunt modificate i pstreaz valoarea iniial.


Variabilele declarate prin Dim la nivel de procedur au valoare pn la terminarea execuiei procedurii (chiar dac
se trece prin apel n alte proceduri).
Variabilele declarate prin Static, la nivel de procedur, au aceeai via ca i variabilele declarate la nivel de modul
i i pstreaz valoarea pn la terminarea execuiei codului (inclusiv de la un apel la altul). Includerea clauzei
Static n instruciunea Sub sau Function are ca efect declararea tuturor variabilelor definite n procedura respectiv
drept variabile statice (deci care i pstreaz valorile ntre apeluri).
Variabilele declarate la nivel de modul standard i pstreaz valoarea pe tot timpul execuiei. Variabilele declarate
la nivel de modul clas i pstreaz valoarea att timp ct exist o instan a clasei. Diferena fa de variabilele
Static este aceea c memoria este utilizat permanent (nu se elibereaz la prsirea domeniului).

Variabile Object
Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object
Dim myDoc As Object

sau specificnd exact numele de clas dintr-o bibliotec de obiecte referit


Dim myDoc As Word.Document

n primul mod de definire (ca Object) nu se poate efectua la momentul compilrii existena obiectului, nu se poate
verifica utilizarea corect a propriettilor i metodelor obiectului i nu se poate lega aceast informaie de variabila
obiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execuiei i se
efectueaz prin instruciunea Set.
Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapid,
se face la momentul compilrii i poate nltura mai rapid erori posibile n utilizarea metodelor i proprietilor
obiectului.
Instruciunea Set are sintaxa:
Set objectvar = {[New] objectexpression | Nothing}
unde

objectvar este numele variabilei (sau proprietii)


New permite crearea unei noi instane a clasei
Objectexpression este o expresie constnd n numele unui obiect, alt variabil declarat de acelai tip obiect, sau
funcie ori metod care returneaz un obiect de acelai tip obiect
Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem i de memorie utilizate.
n general, atunci cnd se utilizeaz Set pentru a asigna o referin de obiect la o variabil, nu se creeaz o copie a
obiectului pentru acea variabil. Este creat doar o referin la obiect. Astfel, mai multe variabile de tip obiect pot
s se refere la acelai obiect: orice schimbare a obiectului se va reflecta n toate variabilele care refer obiectul.
Utiliznd clauza New se va crea efectiv o copie (instan) a obiectului.

Exemple
Prin urmtoarele dou instruciuni se definete variabila objWord care este legat trziu de o aplicaie Word:
Dim objWord As Object
Set obhWord = CreateObject("Word.Application")
Legarea timpurie se poate efectua prin
Dim objWord As Word.Application

Este de remarcat c instruciunea Set apeleaz o funcie care creeaz i returneaz o referin la un obiect ActiveX.

Constante predefinite (builtin)


Bibliotecile de obiecte din fiecare aplicaie Office furnizeaz o mulime de constante predefinite, care pot fi
utilizate pentru a stabili proprietti sau pentru a transmite argumente ctre proprieti sau metode. Constantele sunt,
de regul, grupate n tipuri enumerate care reprezint valorile posibile pentru o proprietate specific. Dei este
posibil s se utilizeze valoarea numeric a constantei este recomandat s se utilizeze constanta numit ntruct
dezvoltri ulterioare ale mediului Microsoft Office (ca i ale aplicaiilor din Visual Studio) tind s pstreze
compatibilitatea ntre denumirile constantelor i nu ntre valorile efective.
De exemplu se prefer
Application.DisplayAlerts = wdAlertAll

n loc de
Application.DisplayAlerts = -1

pentru a fixa ca Word s afieze toate mesajele de alert la execuia unei proceduri. Codul scris astfel este i mai
explicit.

Instruciunile VBA
Exist trei categorii de instruciuni Visual Basic:
instruciuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru
variabile, constante i proceduri;
instruciuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor;
instruciuni executabile (prezentate n continuare) care iniiaz aciuni: execut metode sau proceduri, controleaz
fluxul execuiei codului.
n mediul de dezvoltare VBA, sintaxa instruciunilor este verificat automat dup ce se trece la instruciunea
urmtoare (prin Enter).

Continuarea instruciunilor
O instruciune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de
un spaiu. De exemplu, crearea prin program a unui tabel ntr-un document Word:
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=3, _
NumColumns:= 3

unde, pe lng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare a
unui nou tabel la colecia de tabele a documentului.

Dou instruciuni pot fi scrise pe o aceeai linie dac sunt separate cu caracterul ":".

Etichetarea liniilor
O linie poate fi identificat:
printr-o etichet: orice nume, care respect regulile generale, care ncepe n prima coloan a liniei i se termin cu
caracterul ":"
printr-un numr: orice combinaie de cifre, care ncepe n prima coloan a liniei i este unic n modulul respectiv.
Identificatorii de linii pot fi utilizai n instruciuni de control, desi codul astfel construit nu respect regulile
programrii structurate..

Comentarii
Textele explicative (necesare documentrii codului) pot fi introduse pe linii separate sau n continuarea liniei de
cod.
O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Rem urmat de un spaiu.
Comentariul de pe aceeai linie cu o instruciune se introduce printr-un apostrof urmat de comentariu.

Operatori
n formarea expresiilor de diverse tipuri, operatorii sunt cei utilizai aproape general n limbajele de programare de
nivel nalt. Pentru fixarea termenilor i notaiilor sunt totui prezentai, pe categorii, nsoii, acolo unde este cazul
de scurte explicaii.

Operatori aritmetici
Operator

Semnificaie

Observaii

Ridicarea la
putere

rezultatul este Double sau Variant(Double) cu excepia: dac un


operand este Null, rezultatul este tot Null

nmulirea

rezultatul este dat de cel "mai precis" factor, ordinea cresctoare a


"preciziei" fiind, pentru nmulire, Byte, Integer, Long, Single,
Currency, Double i Decimal. Dac o expresie este Null, rezultatul
este Null. O expresie Empty este considerat ca 0. Pentru excepii se
va studia Help *(operator).

mprirea

rezultatul este, n general, Double sau Variant(Double). Dac o


expresie este Null, rezultatul este Null. O expresie Empty este
considerat ca 0. Pentru excepii se va studia Help /(operator).

mprirea
ntreag

nainte de mprire, operanzii sunt rotunjii la Byte, Integer sau


Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer),
Long, sau Variant(Long). Dac o expresie este Null, rezultatul este
Null. O expresie Empty este considerat ca 0.

Restul mpririi

operanzii sunt rotunjii la ntregi i se obine restul mpririi.


Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long,
sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O
expresie Empty este considerat ca 0.

Adunarea
numeric sau
concatenarea
irurilor

n general, operanzi numerici produc adunarea, iar operanzi iruri


produc concatenarea. n cazul numeric, rezultatul este de tipul cel
"mai precis" al operanzilor, ordinea de "precizie" fiind pentru
adunare i scdere: Byte, Integer, Long, Single, Double, Currency i
Decimal. Deoarece operanzii pot fi orice expresie, pentru o
informare complet (de exemplu operanzi Variant) se va studia Help

Mod

+(operator).
-

Scderea sau
inversarea
semnului

operanzii pot fi doar numerici. Rezultatul este de tipul cel "mai


precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i
scdere: Byte, Integer, Long, Single, Double, Currency i Decimal.
Dac o expresie este Null, rezultatul este Null. O expresie Empty
este considerat ca 0. Pentru excepii se va studia Help -(operator).

Operatori de comparare
Relaiile care exist ntre diferite tipuri de entiti se pot evidenia prin comparaii avnd una dintre formele
urmtoare:
result = expression1 comparisonoperator expression2
result = object1 Is object2
result = string Like pattern
unde
result este o variabil numeric
expression este o expresie oarecare
comparisonoperator este un operator relaional
object este un nume de obiect
string este o expresie ir oarecare
pattern este o expresie String sau un domeniu de caractere.
Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau egal), > (mai mare), >= (mai mare sau egal),
= (egal), <> (diferit, neegal).
Rezultatul este True (dac este adevrat relaia), False (dac relaia este neadevrat), Null (dac cel puin un
operand este Null).
Operatorul Is produce True dac variabilele se refer la acelai obiect i False n caz contrar.
Operatorul Like compar dou iruri cu observaia c al doilea tremen este un ablon. Prin urmare rezultatul este
True dac primul ir operand este format dup ablon, False n caz contrar. Atunci cnd un operand este Null,
rezultatul este tot Null.
Comportarea operatorului Like depinde de instruciunea Option Compare, care poate fi:
Option Compare Binary, ordinea este cea a reprezentrii interne binare, determinat n Windows de codul de
pagin.
Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de setrile
locale ale sistemului.
Construcia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere:
?

un caracter oarecare

oricte caractere (chiar nici unul)

o cifr oarecare (09).

[charlist]
cratimei.

oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea

[!charlist]

orice caracter care nu este n list

Observaie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construcii de tip
list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ].
Pentru alte observaii utile se va studia Help Like operator.

Operatori de concatenare
Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +.
n sintaxa
expression1 & expression2
unde operanzii sunt expresii oarecare, rezultatul este
de tip String, dac ambii operanzi sunt String
de tip Variant(String) n celelalte cazuri
Null, dac ambii operanzi sunt Null.
nainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Empty
sunt tratate ca iruri de lungime zero ("").

Operatori logici
Pentru operaiile logice sunt utilizai urmtorii operatori, uzuali n programare.

Operator

Semnificaie

Observaii

And

conjuncia logic

Null cu False d False, Null cu True sau cu Null d Null.


Operatorul And realizeaz i operaia de conjuncie bit cu
bit pentru expresii numerice.

Eqv

echivalena logic

Dac o expresie este Null, rezultatul este Null. Eqv


realizeaz i compararea bit cu bit a dou expresii
numerice, poziionnd cifrele binare ale rezultatului dup
regulile de calcul ale echivalenei logice: 0 Eqv 0 este 1
etc.

Imp

implicaia logic

True Imp Null este Null, False Imp * este True, Null Imp
True este True, Null Imp False (sau Null) este Null.
Operatorul Imp realizeaz i compararea bit cu bit a dou
expresii numerice, poziionnd cifrele binare ale
rezultatului dup regulile de calcul ale implicaiei logice: 1
Imp 0 este 0, n rest rezultatul este 1.

Not

negaia logic

Not Null este Null. Prin operatorul Not se poate inversa bit
cu bit valorile unei variabile, poziionndu-se
corespunztor un rezultat numeric.

Or

disjuncia logic

Null Or True este True, Null cu False (sau Null) este Null.
Operatorul Or realizeaz i o comparaie bit cu bit a dou
expresii numerice poziionnd biii corespunztori ai
rezultatului dup regulile lui Or logic.

Xor

disjuncia
exclusiv

Dac un operand este Null, atunci rezultatul este Null. Se


poate efectua operaia de sau exclusiv i bit cu bit pentru
dou expresii numerice [b1+b2(mod 2)].

Instruciuni de atribuire
Atribuirea se poate efectua prin instruciunea Let (pentru valori atribuite variabilelor i proprietilor), Set (pentru
atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite
de utilizator).

Instruciunea Let
Atribuie valoarea unei expresii la o variabil sau proprietate.
[Let] varname = expression
unde varname este nume de variabil sau de proprietate.
Este de remarcat forma posibil (i de fapt general utilizat) fr cuvntul Let.
Observaii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu
pot fi atribuite variabilelor de tip String i nici reciproc.
Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dac valoarea expresiei
Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip
String (cu excepia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric.
La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei.
Atribuirea valorilor de tip utilizator poate fi efectuat doar dac ambii termeni au acelai tip definit. Pentru alte
situaii se va utiliza instruciunea Lset.
Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n
aceast situaie instruciunea Set.

Instruciunea LSet
Copie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Deoarece copierea este binar, poate fi utilizat pentru atribuiri ntre tipuri utilizator diferite (rezultatul este
impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este
LSet stringvar = string
LSet varname1 = varname2
unde
stringvar, string reprezint variabila de tip String i expresia de acelai tip implicate ntr-o atribuire de iruri.
varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruciunea Type) diferite.
Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stnga) n zona de memorie a primei
variabile.
Caracterele care rmn neocupate se completeaz cu spaii, iar dac zona de unde se copie este mai mare,
caracterele din dreapta se pierd (sunt trunchiate).

Instruciunea LSet
Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Sintaxa este
RSet stringvar = string
Caracterele rmase neocupate n variabil sunt completate ccu spaii. Instruciunea RSet nu se poate utiliza (analog
lui LSet) pentru tipuri definite de utilizator.

Instruciuni executabile
Execuia unui program are loc, n lipsa oricrui control, instruciune cu instruciune, de la stnga la dreapta i de sus
n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a operaiilor n evaluarea
expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele programrii i din acest
motiv necesitatea structurilor de control a fluxului execuiei. Unele instruciuni au fost pstrate doar din motive de
compatibilitate cu versiunile iniiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare
altor limbaje de programare.

Instruciuni de transfer (GoSubReturn, GoTo, OnError,


OnGoSub, OnGoTo)
Aceast categorie cuprinde instruciunile prin care controlul execuiei este transferat la o alt instruciune din
procedur. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul programrii
structurate) i prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de programare.

GoSubReturn
n cadrul unei proceduri un grup de instruciuni poate fi organizat ca o subrutin (similar unei proceduri on-line,
nenumite) identificat prin linia de nceput. Transferul controlului la acest grup de instruciuni i revenirea la locul
apelului se poate efectua prin GoSubReturn cu sintaxa

GoSub line
...
line
...
Return
unde line este o etichet de linie sau un numr de linie din aceeai procedur.
Pot exista mai multe instruciuni Return, prima executat produce saltul la instruciunea care urmeaz celei mai
recente instruciuni GoSub executate.

GoTo
Realizeaz tranferul controlului execuiei la o linie din aceeai procedur.

GoTo line
unde line este o etichet de linie sau un numr de linie din aceeai procedur.

On Error
Permite controlul erorilor prin transferul controlului la rutine de tratare.
Observaie. Este prezentat n seciunea dedicat controlului erorilor.

OnGoSub, OnGoTo
Permit o ramificare multipl, dup valoarea unei expresii. Se recomand, pentru claritatea codului, utilizarea
structurii Select Case n locul acestor structuri.
On expression GoSub destinationlist
On expression GoTo destinationlist
unde
expression este o expresie numeric avnd valoare ntreag (dup o eventual rotunjire) ntre 0 i 255 inclusiv.
destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele
categorii), din aceeai procedur cu instruciunea.
Dac valoarea expresiei este negativ sau mai mare dect 255 se produce o eroare.
Dac valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfer controlul la linia identificat
de al k-lea element al listei.
Dac valoarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueaz la linia
care urmeaz instruciunea On...GoSub sau On...GoTo.

Instruciuni de terminare sau oprire a programului


(DoEvents, End, Exit, Stop)
Terminarea execuiei programului sau oprirea temporar (pauza) se pot realiza prin instruciunile enumerate aici.

DoEvents
Dei nu este o instruciune VBA ci este o funcie, includerea ei este natural prin aceea c permite cedarea
controlului ctre sistemul de operare, care poate astfel s funcioneze n regim de multitasking. Aciunea poate fi
realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este

DoEvents( )
Funcia returneaz, n general, valoarea 0.
Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de
evenimente, ca i procesarea tuturor caracterelor din coada SendKeys.
Observaie. Pentru alte observaii se va studia documentaia comenzii DoEvents.

End
Termin execuia unei proceduri (sub forma prezentat aici) sau indic sfritul codului unei structuri de tip bloc
(cum ar fi End Function, End If etc., prezentate la structurile respective).
Sintaxa, n ipostaza opririi execuiei, este:

End
Prin aceast instruciune, care poate fi plasat oriunde n program, execuia este terminat imediat, fr a se mai
executa eventualele instruciuni scrise pentru tratarea unor evenimente specifice sfritului de program (Unload,
Terminate etc.).
Fiierele deschise prin Open sunt nchise i toate variabilele sunt eliberate. Obiectele create din modulele clas sunt
distruse, iar referinele din alte aplicaii la asemenea obiecte sunt invalidate. Memoria este eliberat.

Exit
Prin instruciunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execuie (cum ar fi o procedur, o
structur iterativ etc.) pentru a se continua nivelul apelant. Sintaxa este
Exit Do
Exit For
Exit Function
Exit Property
Exit Sub
i efectele sunt prezentate la structurile respective. Nu trebuie confundat cu instruciunea End.

Stop
Efectul instruciunii este dependent de modul de execuiei a programului. Dac se execut varianta compilat a
programului (fiierul .exe) atunci instruciunea este similar instruciunii End (suspend execuia i nchide fiierele
deschise). Dac execuia este din mediul VBA, atunci se suspend execuia programului, dar nu se nchid fiierele
deschise i nu se terge valoarea variabilelor. Execuia poate fi reluat din punctul de suspendare.
Stop
Instruciunea este similar introducerii unui punct de oprire (Breakpoint) n codul surs.

Structuri iterative (Do...Loop, For...Next, For Each...Next,


While...Wend, With)
Prin intermediul construciilor de tip bloc prezentate n aceast seciune se poate repeta, n mod controlat, un grup
de instruciuni. n cazul unui numr nedefinit de repetiii, condiia de oprire poate fi testat la nceputul sau la
sfritul unui ciclu, prin alegerea structurii adecvate.

DoLoop
Se vor utiliza structuri DoLoop pentru a executa un grup de instruciuni de un numr de ori nedefinit aprioric.
Dac se cunoate numrul de cicluri, se va utiliza structura ForNext.
nainte de continuare se va testa o condiie (despre care se presupune c poate fi modificat n instruciunile
executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condiiei i decizia luat.
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
sau
Do
[statements]
[Exit Do]

[statements]
Loop [{While | Until} condition]
unde
condition este o expresie care valoare de adevr True sau False. O condiie care este Null se consider False.
statements sunt instruciounile care se repet atta timp (while) sau pn cnd (until) condiia devine True.
Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruciune care urmeaz ntregii structuri
(deci de dup linia care ncepe cu Loop).
Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax). Dac
apare o comand Exit Do se poate omite chiar i condiia din enun ntruct execuia se va termina prin aceast
decizie.
Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfer
controlul la nivelul Do imediat superior.
Execuia structurilor este explicat n tabelul urmtor
Do WhileLoop

Testeaz condiia la nceputul buclei, execut bucla numai


dac rezultatul este True i continu astfel pn cnd o nou
evaluare produce False.

Do UntilLoop

Testeaz condiia la nceputul buclei, execut bucla numai


dac rezultatul este False i continu astfel pn cnd o nou
evaluare produce True.

DoLoop While

Se execut ntotdeauna bucla o dat, se testeaz condiia la


sfritul buclei i se repet bucla att timp ct condiia este
True. Oprirea este pe condiie fals.

DoLoop Until

Se execut ntotdeauna bucla o dat, se testeaz condiia la


sfritul buclei i se repet bucla att timp ct condiia este
False. Oprirea este pe condiie adevrat.

ForNext
Atunci cnd se cunoate numrul de repetri ale unui bloc de instruciuni, se va folosi structura ForNext.
Structura utilizeaz o variabil contor, a crei valoare se modific la fiecare ciclu, oprirea fiind atunci cnd se
atinge o valoare specificat. Sintaxa este:
For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
unde
counter este variabila contor (numr repetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou.
start este valoarea iniial a contorului.
end este valoarea final a contorului.
step este cantitatea care se adun la contor la fiecare pas. n cazul n care nu se specific este implicit 1. Poate fi i
negativ.
statements sunt instruciunile care se repet. Dac nu se specific, atunci singura aciune este cea de modificare a
contorului de un numr specificat de ori.

Aciunea este dictat de pasul de incrementare i relaia dintre valoarea iniial i cea final.
Instruciunile din corpul structurii se execut dac
counter <= end pentru step >= 0 sau
counter >= end pentru step < 0.
Dup ce toate instruciunile s-au executat, valoarea step este adugat la valoarea contorului i instruciunile se
execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima
instruciune de dup linia Next.
Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd exist structuri
ForNext mbricate.
Corpul unei bucle ForNext poate include (complet) o alt structur ForNext. n asemenea situaii, structurile
mbricate trebuie s aib variabile contor diferite.
Instruciunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul
execuiei se transfer la prima instruciune de dup linia Next.

For EachNext
Similar structurii ForNext, structura For EachNext repet un grup de instruciuni pentru fiecare element dintro colecie de obiecte sau dintr-un tablou (cu excepia celor de un tip utilizator). Este util atunci cnd nu se
cunoate numrul de elemente sau dac se modific, n timpul execuiei, coninutul coleciei.
Sintaxa este:
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
unde
element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colecie de
obiecte, atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect
specific pentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, element poate fi doar
o variabil de tip Variant.
group este numele coleciei de obiecte sau al tabloului.
statements este grupul de istruciuni executate pentru fiecare element.
Execuia unei structuri For EachNext este

1. Se definete element ca numind primul element din grup (dac nu exist nici un element, se
transfer controlul la prima instruciune de dup Next se prsete bucla fr executarea
instruciunilor).
Se execut instruciunile din corpul buclei For.
Se testeaz dac element este ultimul element din grup. Dac rspunsul este afirmatif, se prsete bucla.

2. Se definete element ca numind urmtorul element din grup.


Se repet paii 2 pn la 4.
Instruciunile Exit For sunt explicate la ForNext.
Buclele ForEach...Next pot fi mbricate cu condiia ca elementele utilizate la iterare s fie diferite.
Observaie. Pentru tergerea tuturor obiectelor dintr-o colecie se va utiliza ForNext i nu For EachNext. Se
va utiliza ca numr de obiecte colecie.Count.

WhileWend
Execut un grup de instruciuni att timp ct este adevrat o condiie. Sintaxa

While condition
[statements]
Wend
Este recomandat s se utilizeze o structur DoLoop n locul acestei structuri.

With
Programarea orientat pe obiecte produce, datorit calificrilor succesive, construcii foarte complexe atunci cnd
se numesc proprietile unui obiect. n cazul modificrilor succesive ale mai multor proprieti ale aceluiai obiect,
repetarea zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificat
prin utilizarea structurii WithEnd With. O asemenea structur execut o serie de instruciuni pentru un obiect sau
pentru o variabil de tip utilizator. Sintaxa este:
With object
[statements]
End With
unde
object este numele unui obiect sau a unui tip definit de utilizator
statements sunt instruciunile care se execut pentru entitatea precizat.
Permind omiterea recalificrilor din referinele la obiectul precizat, orice construcie de tipul
".nume" este interpretat n instruciunile structurii drept "object.nume".
ntr-un bloc With nu se poate schimba obiectul procesat.
La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificrile
eventuale la acest obiect vor fi efectuate.
Nu se recomand saltul n i dintr-un bloc With.

Structuri de decizie (IfThenElse, Select Case)


Ramificarea firului execuiei dup rezultatul verificrii unei condiii este o necesitate frecvent n orice
implementare.
Pe lng structurile prezentate, se pot utiliza trei funcii care realizeaz alegeri n mod liniarizat (pe o linie de cod):
Choose(), Iif(), Switch().

IfThenElse
O asemenea structur, ntlnit de altfel n toate limbajele de programare, execut un grup de instruciuni ca
rspuns la ndeplinirea unei condiii (compus sau nu din mai multe condiii testate secvenial). Sintaxa permite o
mare varietate de forme:
If condition Then [statements] [Else elsestatements]
sau
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
unde
condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat
False);
expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat
n objecttype.

statements, elsestatements, elseifstatements sunt blocurile de instruciuni executate atunci cnd condiiile
corespunztoare sunt True.
La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruciuni, separate de ":", pe
aceeai linie.
Verificarea condiiilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor
rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True).

Select Case
Instruciunea Select Case se poate utiliza n locul unor instruciuni ElseIf multiple (dintr-o structur
IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruciunea
Select Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruciunii IfThenElseIf. Totui,
Select Case produce un un cod mai eficient i mai inteligibil. Sintaxa este:
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
unde
testexpression este o expresie numeric sau ir.
expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma:

expression.

expression To expression. Cuvntul To introduce un interval de valori, valoarea minim fiind

Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptnd Is i Like)

prima specificat.
pentru a specifica un domeniu de valori.

statements-n reprezint una sau mai multe instruciuni care se vor executa dac testexpression este egal cu un
element din expressionlist-n.
elsestatements reprezint una sau mai multe instruciuni care se vor executa dac testexpression nu este egal cu
nici un element din listele liniilor Case.
Dac testexpression se potrivete cu un element dintr-o list Case, se vor executa instruciunile care urmeaz
aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execuiei trece apoi la
instruciunea care urmeaz liniei finale End Select. Rezult c dac testexpression se regsete n mai multe liste,
doar prima potrivire este considerat.
Clauza Case Else are semnificaia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruciunile care se
execut atunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dac aceasta este
situaia i nu este specificat o clauz Case Else, atunci execuia urmeaz cu prima instruciune de dup End Select.
Instruciunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structur are
End Select propriu, includerea este complet).

Apeluri de proceduri i programe


n aceast seciune se prezint doar funcia Shell(), deoarece despre proceduri i apelul lor s-a discutat n capitolul
1.

Funcia Shell()
Execut un program executabil i returneaz un Variant(Double) reprezentnd ID-ul de task al programului n caz
de succes; n caz contrar returneaz zero. Sintaxa este
Shell(pathname[,windowstyle])
unde

pathname este Variant (String). Conine numele programului care se execut, argumentele
necesare i poate da calea complet (dac este nevoie).
windowstyle este Variant (Integer) i precizeaz stilul ferestrei n care se va executa programul
(implicit este minimizat, cu focus).
Valorile posibile pentru argumentul windowstyle sunt
Constanta numit

Valoarea

Semnificaia

VbHide

Fereastra este ascuns iar focus-ul este pe


fereastra ascuns.

VbNormalFocus

Fereastra are focus-ul i este dimensionat


i poziionat normal.

VbMinimizedFocus

Fereastra este afiat ca o icoan


(minimizat) dar are focus-ul.

VbMaximizedFocus

Fereastr maximizat, cu focus.

VbNormalNoFocus

Fereastra este normal (restaurat la


mrimea i poziia cea mai recent) dar nu
are focus-ul. Fereastra activ curent i
pstreaz focus-ul.

VbMinimizedNoFocus

Fereastr minimizat, fr focus. Fereastra


activ curent i pstreaz focus-ul.

Dac funcia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut
asincron, deci nu exist certitudinea c acest program se termin nainte de execuia instruciunilor care urmeaz
liniei Shell.

Operaiuni de intrare-ieire
n categoria operaiunilor de I/O se pot deosebi
schimbul de informaii cu utilizatorul: acesta se poate desfura prin intermediul unor formulare (forms) predefinite
(InputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului VBA.
schimbul de informaii cu fiiere i/sau baze de date: acesta se realizeaz prin intermediul unor instruciuni dedicate
acestor operaii.

Dialogul standard cu utilizatorul


n general, utilizatorul rspunde la apariia unei boxe de dialog prin acionarea butonului adecvat rspunsului su
i/sau prin nscrierea unei informaii ntr-o zon dedicat acestui scop. Informaia nscris este transferat
programului ca valoare a funciei care iniiaz dialogul grafic.

Funcia InputBox
Apelul funciei InputBox afieaz o box de dialog care conine un mesaj, dou butoane (OK i Cancel) i o zon
text n care se poate tasta un rspuns (de tip String, chiar dac se transmite o valoare numeric). Se ateapt ca
utilizatorul s introduc un text n zona rezervat sau s acioneze un buton. Textul introdus este transmis ca
valoare a funciei la acionarea butonului OK (sau Enter), iar acionarea butonului Cancel (ca i nchiderea
dialogului ca fereastr) transmite un ir de lungime zero (indiferent de valoarea zonei text. Sintaxa este
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
unde
prompt este expresia String cu mesajul afiat n dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai multe
linii prin combinaii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF.

este expresia de tip String cu titlul ferestrei dialogului. Dac este omis se va folosi titlul aplicaiei.

title

default este expresia de tip String, opional, coninnd textul afiat iniial n zona text rezervat utilizatorului.
Textul este, n lipsa modificrii lui, retransmis ca rspuns (acionnd butonul OK).
xpos este expresia numeric specificnd poziia orizontal a dialogului (n twips, de la latura stnga a ecranului).
n lipsa argumentului, boxa de dialog este centrat orizontal.
ypos este expresia numeric specificnd poziia vertical a dialogului (n twips, de la latura de sus a ecranului).
n lipsa argumentului, boxa de dialog este poziionat la aproximativ o treime de ecran.
helpfile este expresia de tip String care identific fiierul Help utilizat.Dac este indicat helpfile, trebuie s fie
precizat i context. Textul de ajutor poate fi vzut prin tasta F1, anumite aplicaii afieaz i un buton Help.
context Expresie numeric cu numrul de context Help al intrrii corespunztoare dialogului afiat. Apare
obligatoriu mpreun cu helpfile.
Dac valoarea funciei nu este atribuit (sau utilizat ntr-o alt expresie), este evident c se pierde, fr semnalarea
vreunei erori.

Funcia MsgBox
Un dialog mai simplu dect InputBox este realizat prin forma predefinit afiat de funcia MsgBox. Se afieaz un
mesaj ntr-o box de dialog i se ateapt ca utilizatorul s acioneze unul dintre butoanele existente (numrul i
tipul lor lor este fixat la proiectarea aplicaiei). Funcia returneaz un ntreg indicnd care buton a fost acionat.
Sintaxa este
[intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context])
unde
prompt este textul mesajului (Vezi InputBox)
buttons este o expresie numeric egalcu suma valorilor care specific numrul, tipul i atributele butoanelor. Aici
se fixeaz i modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz). Valoarea implicit este 0.
title,helpfile, context

identice cu argumentele similare descrise la InputBox.

Constantele recomandate pentru formarea argumentului buttons sunt


Constanta

Valoare

Descriere

VbOKOnly

Numai butonul OK

VbOKCancel

OK i Cancel

VbAbortRetryIgnore

Abort, Retry i Ignore

VbYesNoCancel

Yes, No i Cancel

VbYesNo

Yes i No

VbRetryCancel

Retry i Cancel

VbCritical

16

Icoana de Critical Message

VbQuestion

32

Icoana de Warning Query

VbExclamation

48

Icoana Warning Message

VbInformation

64

Icoana de Information Message

VbDefaultButton1

VbDefaultButton2

256

Al doilea buton este cel implicit

VbDefaultButton3

512

Al treilea buton este cel implicit

VbDefaultButton4

768

Al patrulea buton este cel implicit

VbApplicationModal

VbSystemModal

4096

Primul buton este cel implicit (echivalent


cu Enter)

Application modal: aplicatia curent este


oprit pn cnd rspunde utilizatorul
System modal: toate aplicaiile sunt oprite
pn cnd utilizatorul rspunde la dialog

Valorile 0-5 descriu butoanele, 16,32,48 i 64 descriu stilul icoanei afiate, 0, 256 i 512 determin butonul
implicit, iar ultimul grup (0 i 4096) determin modalitatea boxei de dialog. La formarea argumentului Buttons se
va adun doar cte un numr din fiecare grup.
Pentru a utiliza valoarea returnat de funcie, aceasta trebuie inclus ntr-o expresie (eventual atribuit unei
variabile ntregi).
Valorile returnate de funcie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorit de
utilizator sunt
Constanta

Valoare

Descriere

VbOK

OK

VbCancel

Cancel

VbAbort

Abort

VbRetry

Retry

VbIgnore

Ignore

VbYes

Yes

VbNo

No

Acionarea tastei Esc este echivalent cu acionarea butonului Cancel (dac acesta este prezent). Dac n dialog este
prezent butonul Help, acionarea lui nu termin dialogul.

Utilizarea fiierelor
Procesrile tipice programate n VBA prelucreaz informaii din dou mari categorii de fiiere:
fiiere ale aplicaiilor server (.doc n Word, .xls n Excel etc.)
fiiere utilizator (create i/sau gestionate de proiect pentru date de intrare, temporare sau de ieire).
Accesarea direct a fiierelor din prima categorie (fr apelul aplicaiei server specifice) poate produce
coruperea fiierului, astfel nct nu mai este recunoscut de aplicaia mam. Prelucrarea acestor fiiere
trebuie s fie executat n aplicaiile care le-au creat.

Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va nelege, fr alte precizri, un fiier utilizator)
acesta trebuie mai nti deschis (instruciunea Open), operaiunea producnd i crearea fiierului n cazul unui fiier
inexistent (nou). Dup utilizare fiierul trebuie s fie nchis (operaiune efectuat, la terminarea normal a
programului, n mod automat).
Un fiier are ataat un numr de identificare, unic pentru un proces. Identificare fiierului se poate efectua, n
program, prin numele su sau prin numrul ataat. Numrul poate fi n domeniul 1255 pentru fiierele proprii
aplicaiei i n domeniul 256511 pentru fiiere accesibile din alte aplicaii. Un numr neutilizat (liber) poate fi
furnizat de apelul la funcia FreeFile().
Exist trei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia.
acces secvenial (modurile Input, Output i Append), utilizat de regul pentru scrierea fiierelor text (rapoarte,
jurnale etc.);
acces raandom (aleator) (modul Random), n cazul cnd este necesar s se scrie i s se citeasc nregistrrile ntr-o
ordine nedefinit, operaiunile de intrare/ieire fiind amalgamate ntre ele;
acces binar (modul Binary), utilizat la citirea/scrierea fiierelor byte cu byte (de exemplu fiiere bitmap).
Un fiier deschis cu un mod de acces trebuie exploatat n acest mod pn cnd este nchis i deschis n alt mod
(dac structura lui permite aa ceva).
Instruciunile tipice pentru accesul la informaiile dintr-un fiier sunt
Modul de acces

Scriere

Citire

Secvenial

Print #, Write #

Input #

Random

Put

Get

Binar

Put

Get

Deoarece gestionarea fiierelor nu se rezum doar la scriere/citire, n tabelul urmtor este un rezumat al
principalelor operaiuni pe care le suport fiierele, cu instruciunile care faciliteaz respectiva aciune.
Aciune

Instruciuni

Citire

Get, Input, Input #, Line Input #

Controlul ieirilor

Format, Print, Print #, Spc, Tab, Width


#

Copierea unui fiier

FileCopy

Creare, acces

Open

Fixarea atributelor

FileAttr, GetAttr, SetAttr

Fixarea poziiei active de


citire/scriere

Seek

Inchidere

Close, Reset

Informaii despre un fiier

EOF, FileAttr, FileDateTime, FileLen,


FreeFile, GetAttr, Loc, LOF, Seek

Lungimea unui fiier

FileLen

Operaii asupra fiierelor

Dir, Kill, Lock, Unlock, Name

Scriere

Print #, Put, Write #

Doar instruciunile i funciile des utilizate sunt prezentate n continuare, pentru celelalte se va studia intrarea
corespunztoare din Help (n mediul VBA).

Open
Deschide un fiier n sensul c rezerv o zon tampon (buffer) pentru fiier i determin modul de acces utilizat. Nu
se pot efectua instruciuni de I/O pe un fiier dac acesta nu este deschis n prealabil. Sintaxa:
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
unde
pathname
expresie String care specific numele fiierului (poate include ntreaga cale unitate, directoare etc.,
dup regulile uzuale);
mode cuvnt cheie care specific modul de acces la fiier: Append, Binary, Input, Output sau Random; dac nu se
specific nimic se va considera acces Random;
access clauz opional specificnd operaiunile I/O permise pentru fiier: Read, Write sau Read Write;
lock
clauz opional specificnd operaiile asupra fiierului permise altor procese care se execut (cnd fiierul
este deschis): Shared, Lock Read, Lock Write i Lock Read Write.
filenumber
numrul de fiier pentru fiierul deschis (ntre 1 i 511, vezi observaia din partea introductiv);
funcia FreeFile furnizeaz urmtorul numr disponibil;
reclength
numr (<=32,767) exprimnd, n octei, lungimea nregistrrii (la aceesul Random) sau lungimea
bufferului (la accesul secvenial); la accesul Binary, clauza este ignorat.
Dac fiierul indicat nu exist, atunci este creat un fiier cu acest nume n cazurile care presupun o ieire n fiier:
modurile Append, Binary, Output sau Random.
Un fiier poate fi deschis n mai multe moduri simultan (prin instruciuni Open distincte pentru fiecare mod, cu
numere diferite) dac exist compatibilitate ntre moduri: Binary, Input i Random permit acest lucru, Append,
Output nu permit (fiierul trebuie mai nti nchis i abia apoi deschis ntr-un asemenea mod).

FreeFile
Funcia returneaz un ntreg reprezentnd urmtorul numr de fiier disponibil.
FreeFile[(rangenumber)]
rangenumber este un Variant care specific domeniul din care se solicit un numr liber de fiier: 0 (valoarea
implicit) returneaz un numr n 1255 (pentru fiiere proprii, 1 returneaz un numr n 256511 (pentru fiiere
accesate din alte aplicaii).

Get
Citete date dintr-un fiier deschis i le transfer ntr-o variabil. Datele citite cu Get sunt, n general, scrise n fiier
cu comanda Put.
Get [#]filenumber, [recnumber], varname
unde
filenumber

este numrul fiierului de unde se citesc date (fiierul trebuie s fie deschis)

recnumber
numr opional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau
numrul octetului (modul Binary) de unde ncepe citirea. Prima poziie este 1.
varname

numele variabilei unde se transfer informaia.

Dac nu se specific numrul nregistrrii se va citi din poziia activ de dup ultima instruciune Get, Put sau Seek.
Argumentul lips este indicat prin virgule: Get #4,,FileBuffer.

Pentru observaiile privind aciunea instruciunii Get, separat pentru modul Random i Binary, se va studia Help Get. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.

Put
Scrie valoarea unei variabile date ntr-un fiier deschis n prealabil. Datele scrise cu Put sunt, n general, citite din
fiier cu Get.
Put [#]filenumber, [recnumber], varname
unde
filenumber

este numrul fiierului unde se scriu datele (fiierul trebuie s fie deschis);

recnumber
numr opional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau
numrul octetului (modul Binary) unde ncepe scrierea. Prima poziie este 1.
varname

numele variabilei a crei valoare se scrie n fiier.

Dac nu se specific numrul nregistrrii se va scrie n poziia activ de dup ultima instruciune Get, Put sau
Seek. Argumentul lips este indicat prin virgule: Put #4,,FileBuffer.
Pentru observaiile privind aciunea instruciunii Put, separat pentru modul Random i Binary, se va studia Help Put. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.

Input #
Citete date dintr-un fiier secvenial i le transfer n variabilele specificate.
Instruciunea se va utiliza doar cu fiierele deschise n modul Input sau Binary, datele citite cu Input # sunt scrise,
de regul, cu Write #.
Input #filenumber, varlist
unde
filenumber

numrul fiierului (deschis n prealabil);

varlist list de variabile, delimitate de virgule, pentru care se citesc valorile din fiier. Nu se pot include nume de
tablouri sau variabile Object, dar se accept elemente de tablou i variabiel de tipuri utilizator.
Pentru situaiile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz fr modificri.
Pentru alte situaii:
Informaia citit

Valoarea asignat

Virgul sau linie goal

Empty

#NULL#

Null

#TRUE# sau #FALSE#

True sau False

#yyyy-mm-dd hh:mm:ss#

Data i/sau timpul reprezentat de expresie

#ERROR errornumber#

errornumber (variabila este un Variant


considerat drept eroare)

Ghilimelele duble (" ") sunt ignorate n irul de intrare.


Pentru o citire corect, datele din fiier trebuie s apar n aceeai ordine i de acelai tip cu variabilele din list. O
variabil numeric primete valoarea 0 dac intrarea corespunztoare nu este numeric. Atingerea sfritului de
fiier cnd operaiunea de citire nu este ncheiat, provoac eroare.
ntruct utilizarea fiierelor este, n mod uzual, aceea de memorare controlat a unor informaii (i nu aceea de a
descifra informaii scrise ntr-o structur necunoscut), se recomand scrierea cu Write # n cazul utilizrii
ulterioare a comenzii Input #.

Funcia Input()

Citete i returneaz un ir de caractere citite dintr-un fiier deschis n mod Input sau Binary. Datele citite prin
aceast funcie sunt scrise, de regul, prin Print # sau Put.
Input(number, [#]filenumber)
unde
orice expresie numeric specificnd numrul de caractere care se citesc.

number
filenumber

numr de fiier (deschis).

Spre deosebire de instruciunea Input #, funcia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF,
ghilimele i spaii de nceput).
Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin funcia Input pn cnd EOF returneaz True
genereaz eroare (procedeul este valid pentru citirea din fiiere binare cu Get). Se vor utiliza funciile LOF and Loc
pentru detectarea sfritului de fiier.
Observaie. Pentru date pe octei din fiiere text se va utiliza funcia InputB, cu o sintax similar, unde number
specific numrul de octei de returnat (n loc de numrul de caractere). A se vedea i Help Returning Strings
from Functions.

Line Input #
Citete o singur linie dintr-un fiier secvenial (deschis) i asigneaz irul obinut unei variabile de tip String. O
linie este considerat terminat la ntlnirea caracterului CR (Chr(13)) sau a combinaiei CR+LF
(Chr(13)&Chr(10)). Caracterele CR i/sau LF nu sunt adugate irului asignat (se poate considera c secvena lor a
fost srit).
Line Input #filenumber, varname
unde
filenumber

numrul ataat fiierului (deschis),

varname

nume de variabil String sau Variant.

Datele citite cu Line Input # sunt, de regul, scrise cu Print #.

Write #
Scrie o nregistrare ntr-un fiier secvenial. Datele scrise prin Write # sunt citite, de regul, cu Input #. Utilizarea
scrierii cu Write # asigur o delimitare corect a fiecrui cmp scris, ceea ce permite regsirea corect (fr alte
artificii) a informaiilor la citirea cu Input #. n acelai timp, informaiile sunt regsite corect indiferent de
configurrile locale.
Sintaxa este
Write #filenumber, [outputlist]
unde
filenumber

numrul ataat fiierului (deschis n prealabil),

outputlist
o list de expresii numerice sau ir, separate prin virgule, spaii sau punct-virgul,
ale cror valori se scriu n fiier.
Specificarea unei virgule dup filenumber fr outputlist produce o linie goala n fiier.
Sunt respectate urtmtoarele reguli de scriere:
datele numerice sunt scrise cu punct ca separator zecimal (indiferent de setrile locale);
datele Boolean sunt scrise ca #TRUE# sau #FALSE#, nefiind traduse dup setrile locale;
datele calendaristice i timpul sunt scrise potrivit formatului de dat universal; dac o component este omis (sau
este zero), se scrie doar partea indicat;
Null se scrie drept #NULL#, iar Empty nu produce nimic n ieire;
Date de tip Error apare #ERROR errorcode#.

Instruciunea Write # insereaz ntre virgule ntre elementele scrise n fiier, ca i ghilimele n jurul irurilor de
caractere (nu este prin urmare nevoie ca utilizatorul s introduc separatori pentru claritate). Dup ce toate valorile
au fost scrise, se insereaz automat o combinaie CR+LF, astfel nct urmtoarea scriere va fi pe un rnd nou.

Print #
Scrie ntr-un fiier secvenial date formatate ca pe ecran (display-formatted). Prin urmare, cu excepiile specificate
n continuare, setrile locale sunt respectate. Datele scrise cu Print # sunt, de regul, citite cu Line Input # sau cu
Input.
Sintaxa este
Print #filenumber, [outputlist]
unde
filenumber

numrul ataat fiierului (deschis n prealabil),

outputlist
list de expresii formatate ale cror valori sunt tiprite. Elementele se separ prin virgule, spaii sau
punct i virgul.
Un element al listei de ieire este de forma
[{Spc(n) | Tab[(n)]}] [expression] [charpos]
unde
Spc(n) insereaz n spaii n ieire
Tab(n) poziioneaz punctul de inserie (nceputul zonei de scriere) la o coloan indicat absolut de n. Utiliznd
doar Tab se trece la urmtoarea zon de ieire.
expression

expresia a crei valoare se tiprete (numeric sau String).

charpos
Specific poziia punctului de inserie pentru urmtorul caracter care va fi tiprit, potrivit tabelului
care urmeaz. Dac nu se specific, urmtoarea tiprire va fi pe rndul urmtor.
charpos

Locul punctului de inserie

Imediat dup ultimul caracter tiprit

Tab(n)

Coloana cu numrul n

Tab

nceputul urmtoarei zone de tiprire

Dac se omite outputlist dar se include un separator dup filenumber, se va insera o linie goal n fiier.
Datele logice sunt scrise drept True, False (fr traduceri locale).
Datele calendaristice sunt scrise potrivit setrii locale pentru format scurt.
Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fr traduceri locale).
Informaiile numerice scrise sunt dup configurrile locale (separator zecimal).
Pentru o interpretare corect, utilizatorul trebuie s separe valorile afiate prin formatri adecvate.
Pentru afiari n fereastra Immediate a mediului VBA, se va vedea i metoda Print (vezi Help Print Method).

Close
nchide unul sau mai multe fisiere deschise prin Open pentru instruciuni de I/O. Prin acest operaiune se rupe
legtura ntre fiiere i numerele ataate i se elibereaz zonele tampon rezervate. Pentru un fiier nchis nu se mai
pot executa operaiuni I/O (pn la o nou deschidere).
Sintaxa este
Close [filenumberlist]
unde

filenumberlist este lista de numere ataate fiierelor care se nchid, de forma


[[#]filenumber] [, [#]filenumber] ; dac lista nu este prezent, atunci se vor nchide toate fiierele care sunt
deschise.
nainte de nchidere, n fiierele deschise pentru Output sau Append se scriu zonele buffer nescrise nc.

Reset
nchide toate fiierele deschise prin instruciuni Open. Sintaxa este
Reset
naine de nchidere se scriu n fiiere toate bufferele nescrise nc.

Seek
Stabilete poziia (nregistrrii sau octetului) ntr-un fiier unde se va efectua urmtoarea operaiune de
intrare/ieire, fiierul fiind deschis prin Open (vezi i funcia Seek). Sintaxa
Seek [#]filenumber, position
unde
filenumber

numrul ataat fiierului.

position
operaii I/O.

numr ntre 1 i 2,147,483,647, inclusiv, care indic locul urmtoarei

Numerele nregistrrilor specificate n instruciunile Get i Put au priorirtate n raport cu poziia fixat prin Seek
(are loc o repoziionare).
Dac operaiunea Seek indic o poziie dup sfritul fiierului, urmtoarea operaiune de scriere (fr
repoziionare) extinde fiierul.
Poziia indicat nu poate fi zero sau negativ.

Funcia Seek
Returneaz, ca un ntreg Long, poziia curent I/O dintr-un fiier specificat. Fiierul trebuie s fie n prealabil
deschis.
Seek(filenumber)
filenumber este un numr de fiier.
Valoarea returnat este ntre 1 i 2,147,483,647 (echivalent cu 2^31 1), inclusiv (vezi i setarea poziiei prin
instruciunea Seek) i are semnificaia din urmtorul tabel.
Modul de acces

Valoarea returnat

Random

Numrul urmtoarei nregistrri (care va


fi citit sau scris)

Binary, Output,
Append, Input

Poziia octetului (numerotat de la 1) la


care va avea loc urmtoarea operaiune
I/O

EOF
Returneaz un ntreg cu valoarea logic True (-1) atunci cnd se atinge sfritul unui fiier deschis pentru citire
(Random, Binary sau Input). Pentru fiierele dschise n ieire funcia genereaz mereu True.
EOF(filenumber)
filenumber este un ntreg coninnd numrul fiierului testat.
Utilizarea uzual este

Do While Not EOF(filenum)


(instruciuni, inclusiv citire din fiierul filenum)

Loop
Pentru acces secvenial (Input) se ntoarce False pn cnd se atinge sfritul de fiier, pentru fiierele Random sau
Binary se returneaz False pn cnd ultima instruciune Get executat nu a putut citi o nregistrare ntreag.
Citirea cu Input dintr-un fiier deschis Binary produce eroare la utilizarea mecanismului general (pn cnd EOF ()
este true): se va utiliza citirea cu Get sau citirea cu Input mpreun cu funciile LOF sau Loc.

Loc
Returneaz, ca Long, poziia curent de citire/scriere ntr-un fiier deschis.
Loc(filenumber)
filenumber este numrul ataat fiierului.
Valoarea funciei depinde de modul de acces
Mod

Valoarea returnat

Random

Numrul ultimei nregistrri scrise sau citite

Sequential

Poziia curent mprit la 128. (Se spune c


aceast informaie nu este niciodat util sau
utilizat)

Binary

Poziia ultimului octet citit sau scris.

Funcia Loc este utilizat, mpreun cu funcia LOF, la testarea sfritului de fiier la citiri Binary (schema general
este dat la LOF).

LOF
Returneaz un Long care reprezint, n octei, mrimea unui fiier deschis prin Open. Pentru fiierele nedeschise se
poate utiliza, n acelai scop, funcia FileLen().
LOF(filenumber)
filenumber este numrul ataat fiierului.
Utilizarea acestei funcii, mpreun cu funcia Loc, pentru determinarea sfritului de fiier (similar cu EOF)
accesat Binary este dup schema general:

Open filename For Binary As filenum


Do While CurrentLocation < LOF(filenumber)
(citire din fiierul filenum )
CurrentLocation = Loc(filenumber)

Loop

Modele de obiecte
Aproape toate aciunile programate n VB implic manevrarea programatic a unor obiecte. Toate aplicaiile din
Microsoft Office sunt alctuite din componente formate din obiecte sau care gestioneaz obiecte.
n aceast seciune se prezint principalele concepte din programarea orientat pe obiecte, ca i uneltele i tehnicile
disponibile pentru a explora i utiliza obiectele specifice din Office.
Deoarece fiecare aplicaie din Office are un model propriu de obiecte, va fi dedicat cte un capitol pentru Word,
Excel etc., n care se vor prezenta particularitile de operare i obiectele specifice aplicaiei.

Privire general
Orice aplicaie poate fi gndit ca ansamblul a dou lucruri: coninut i funcionalitate. Coninutul se refer la
documentele pe care le conine aplicaia, la elementele care compun documentele, la informaiile privind atributele

elementelor. Funcionalitatea se refer la modurile, cile n care se poate lucra cu coninutul aplicaiei, de exemplu:
deschiderea, nchiderea documentelor, adugarea, copierea, formatarea elementelor etc.
Coninutul i funcionalitatea unei aplicaii sunt divizate n uniti discrete de coninut i funcionalitate specific,
numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, seciuni ale unui
document Word etc., fiecare avnd evident un coninut i o funcionalitate specific, cele dou componente fiind
unitar legate ntre ele. Obiectele unei aplicaii sunt ierarhizate n structuri, modelul de obiecte al aplicaiei..
Obiectul de nivel maxim al unei aplicaii este, uzual, obiectul Application, care este aplicaia nsi. Obiectul
Application conine alte obiecte care pot fi accesate numai cnd obiectul Application exist (deci cnd aplicaia se
execut). De exemplu, obiectul Application Excel conine obiecte Workbook, dup cum obiectul Application
Word conine obiecte Document. Deoarece obiectul Document depinde de existena obiectului Application Word,
se spune c obiectul Document este copilul obiectului Application; invers, obiectul Application se zice printele
obiectului Document.
Este uzual ca un obiect, care este copil al altui obiect, s aib, la rndul su, alte obiecte copii. De asemenea, este
posibil ca un copil s aib mai muli prini.
Modul n care obiectele, care alctuiesc o aplicaie, sunt aranjate relativ unele fa de altele, mpreun cu modul n
care coninutul i funcionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte.
Fiecare aplicaie are un model de obiecte propriu, reprezentarea grafic a ierarhiei de obiecte pentru aplicaie poate
fi vzut n Visual Basic Help din aplicaie.
Fiecare obiect din ierarhie are un coninut i o funcionalitate care se aplic, ambele, att obiectului nsui, ct i
tuturor obiectelor descendente din ierarhie. Cu ct obiectul este situat mai sus n ierarhie, cu att este mai vast
domeniul coninutului i funcionalitii sale. Locul unui obiect n model este gndit astfel nct coninutul i
funcionalitatea lui sunt adecvate domeniului su. Se poate gndi i faptul c, dac aplicaia este divizat n obiecte,
fiecare obiect ofer acces la arii specifice de coninut i funcionalitate.
Afirmaiile care implic obiecte utilizeaz i termenii de "coninut n" pentru copil i "conine" pentru printe.
Astfel, obiectul Application Word conine obiecte Document, dar obiectul Selection este coninut n obiectul
Windows etc.

Proprieti i metode
Pentru a avea acces la coninutul i funcionalitatea unui obiect, pentru nceput trebuie s se identifice obiectul
(subiect discutat n continuare). Dup identificare, obiectul este accesibil prin intermediul proprietilor i
metodelor sale.
n general, prin proprietate se nelege un atribut numit al obiectului. Valoarea atributului (proprietii) poate fi
modificat (de cele mai multe ori) sau poate fi obinut (tiut) programatic.
Prin metod se nelege o procedur care acioneaz asupra unui obiect. Pentru a distinge o metod de o procedur
obinuit (care poate de asemenea s acioneze asupra unui obiect, n general vorbind), trebuie precizat c metodele
implementeaz funcionalitatea obiectului, sunt specifice obiectului cruia i se aplic i sunt definite o dat cu
obiectul (deci la proiectarea aplicaiei de baz, n cazul obiectelor Office). Orice procedur utilizator acioneaz
asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect.
n general, se utilizeaz proprietile pentru a accesa coninutul i se apeleaz metodele pentru a realiza
funcionalitatea obiectului. Totui, aceast distincie este relativ: exist proprieti care se apropie de metode i
metode care seamn a fi proprieti. Atunci cnd vom discuta despre obiecte definite de utilizator se va vedea c
este uor s se treac grania dintre metode si proprieti n proiectarea obiectelor.

Legtura dintre modelul obiectelor i interfaa utilizator


Exist dou ci prin care utilizatorul poate interaciona cu obiectele aplicaiei:
manual (utiliznd interfaa utilizator a aplicaiei);
programatic (utiliznd un limbaj de programare).
n accesul manual se utilizeaz tastatura, mouse-ul sau cheile directe pentru a naviga ctre acea parte i funcie a
aplicaiei care execut ceea ce se dorete (formatarea unui paragraf, tergerea unor formule dintr-o celul,
modificarea unui slide etc.).
n accesul programatic, de exemplu n instruciuni Visual Basic, se navigheaz n ierarhia de obiecte pentru a
identifica obiectul vizat i apoi se utilizeaz proprietatea sau metoda care produce efectul urmrit. De exemplu, prin
linia urmtoare, scris ntr-o procedur,

Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100

se navigheaz n caietul Activitate la foaia Vanzari i se nscrie valoarea 100 n celula A5. Este evident c
nscrierea are loc efectiv doar n momentul execuiei procedurii.
Deoarece ambele moduri de acces, interfaa utilizator a aplicaiei de baz i Visual Basic, ajung la acelai coninut
i funcionalitate, multe dintre obiectele, proprietile i metodele existente n modelele de obiecte Office au
aceleai denumiri cu elementele din interfaa utilizator (denumiri de meniuri, comenzi, aciuni etc.). Se poate
observa, explicabil din punctul de vedere al evoluiei ctre modelele obiectuale, o asemnare global a modelului
de obiecte cu interfaa utilizator. Aceast asemnare este ntrit i de faptul c pentru orice aciune posibil prin
interfaa utilizator exist posibilitatea de a scrie cod Visual Basic echivalent (vezi i discuia cu nregistrarea macrourilor).
Din exemplul prezentat la accesul din VB, este de reinut importana cunoaterii locului ocupat de obiectul procesat
n ierarhia de obiecte: pentru a utiliza proprietile sau metodele lui trebuie identificat corect prin navigarea
(calificarea) de la nivelul cel mai de sus pn la el. ntregul traseu (cu excepia nivelului Application, care este
uneori subneles) trebuie specificat ca n exemplul artat.

Colecii de obiecte
O colecie este un obiect care include obiecte similare (dar nu neaprat), astfel nct se poate opera cu ansamblul
lor. Acest lucru nu nseamn c metodele sau proprietile obiectelor (dac sunt toate de acelai tip) se aplic
tuturor elementelor coleciei. Ca obiect separat, o colecie are proprieti i metode specifice (numrul de elemente,
adugarea unui nou element etc.).
De regul, coleciile definite n Office (exist posibilitatea de a defini noi colecii) se remarc prin aceea c au
forma de plural a denumirii elementelor lor: Workbooks este colecia de obiecte Workbook, Documents este
colecia de obiecte Document etc.
Elementele (membrii) coleciei se pot identifica prin numrul de ordine (ncepnd cu 1) sau prin nume (rezult c
ansamblul elementelor este ordonat). Astfel instruciunea
Presentations.Item("Perspective").Close

utilizat n PowerPoint produce activarea prezentrii cu numele Perspective i apoi o nchide. Exemplul utilizeaz
metoda Item pentru a returna elementul coleciei de prezentri cu numele specificat. De regul, aceast metod este
implicit, deci
Presentations("Perspective").Close

este o form echivalent.


Numrul de elemente ale coleciei se pot afla prin proprietatea Count, se pot aduga noi elemente prin metoda Add
etc.
O utilizare frecvent a coleciilor este parcurgerea tuturor elementelor ntr-o structur For EachNext sau
ForNext:
Public Sub DocScris()
For Each doc In Documents
If doc.Words.Count > 1 Then
MsgBox doc.Name + Str(doc.Words.Count)
End If
Next
End Sub

care, ntr-o aplicaie Word, afieaz numele tuturor documentelor deschise cu mai mult de un cuvnt scris.

Automatizarea aciunilor prin folosirea obiectelor


Prin automatizarea unei aciuni se nelege scrierea unei proceduri care s produc, la executarea ei, aciunea dorit.
Execuia poate fi comandat direct sau ca rspuns la declaarea unui eveniment.
Pentru a automatiza o aciune n Microsoft Office, se va obine o referin la obiectul care dispune de coninutul i
funcionalitatea pe care le urmrim i se vor aplica proprietile i metodele adecvate. Procesul poate necesita o
succesiune de asemenea operaii.

Obinerea unei referine la un obiect


Pentru a obine o referin la un obiect trebuie s se construiasc o expresie care ajunge s acceseze un obiect din
modelul de obiecte i apoi, utiliznd proprieti i/sau metode, s se navigheze n sus sau n jos prin ierarhia de
obiecte pn cnd ajungem la obiectul dorit.
Proprietile i metodele utilizate pentru a returna punctul de start i pentru a parcurge ierarhia de obiecte se
numesc accesori de obiecte (object accessors) sau accesori.
Cteva idei utile pentru construirea expresiei care returneaz referina la un obiect sunt urmtoarele:
o

un loc obinuit pentru a accesa modelul de obiecte este obiectul cu nivelul cel mai nalt,
uzual obiectul Application. Se va utiliza proprietatea Application pentru a returna o
referin la obiectul Application. Urmtoarea expresie returneaz o referin la obiectul
Application (pentru orice bibliotec de obiecte care conine un obiect Application).
Application

pentru a ajunge din vrful ierarhiei pn la un obiect, se vor parcurge obiectele de pe toate
nivelele, utiliznd accesori care returneaz un obiect din altul. De exemplu, proprietatea
Documents a obiectului Word Application returneaz obiectul colecie Documents, care
reprezint toate documentele deschise. Prin urmare urmtoarea expresie ntoarce o
referin la obiectul colecie Documents:
Application.Documents

Exist accesori direci (shortcut accessors) care dau acces direct la obiecte din model fr
s fie necesar un acces prin vrful ierarhiei. Asemenea accesori sunt Documents,
Workbooks, Presentations care dau acces imediat la colecia de documente din Word,
Excel i PowerPoint. Exist i alte proprieti cu rol de accesori direci: ActiveWindow,
ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urmtoarea instruciune
nchide documentul Word activ:
ActiveDocument.Close

Observaie. Se poate utiliza drept shortcut orice accesor care apare n zona Members of din Object Browser atunci
cnd este selectat <globals> n zona Classes; adic nu trebuie s se returneze obiectul cruia i se aplic proprietatea
sau metoda naintea utilizrii proprietii sau metodei, ntruct Visual Basic poate s determine din contextul n
care se execut codul crui obiect i se aplic proprietatea sau metoda respectiv.
o

Pentru a returna un singur element al unei colecii se va utiliza proprietatea sau metoda
Item cu numele sau numrul de ordine al elementului. Pentru cele mai multe colecii, Item
este implicit, deci poate lipsi
Workbooks.Item("Vanzari")
Workbooks("Vanzari")

Pentru a "urca" n ierarhia de obiecte, se utilizeaz, de obicei, proprietatea Parent a


obiectului curent. De notat c proprietatea Parent poate returna uneori, n special dac
obiectul este membru al unei colecii, "bunicul" obiectului n locul printelui (adic
printele coleciei n locul coleciei). De exemplu
Document.Parent

returneaz obiectul Application i nu Documents.

Prin funcia TypeName (executat eventual n Immediate Window) se poate gsi ce tip de
obiect ntoarce proprietatea Parent (funcia nu este limitat la aceast proprietate, vezi VB
Help).

Aplicarea proprietilor i metodelor


Dup obinerea unei referine la obiectul urmrit, acestuia i se pot aplica proprieti i metode pentru a modifica
valoarea unui atribut sau pentru a-l procesa. Se utilizeaz operatorul punct (".") pentru a separa expresia care
returneaz o referin la obiect de proprietatea sau metoda care se aplic obiectului. De exemplu
ActiveWindow.Left

= 200

fixeaz poziia din stnga a ferestrei active utiliznd proprietatea Left a obiectului Window, referina la acest
obiect fiind returnat de accesorul direct ActiveWindow.
ActiveDocument.Close

nchide documentul activ (n Word) utiliznd metoda Close a obiectului Document la care returneaz o referin
accesorul ActiveDocument.
Proprietile i metodele pot avea argumente care s precizeze valorile sau aciunile. Urmtorul exemplu Word
utilizeaz metoda PrintOut cu specificarea paginilor care se tipresc:
ActiveDocument.PrintOut

From:=" 3", To:=" 7"

Este uneori necesar s se navigheze prin mai multe nivele n modelul de obiecte pentru a ajunge la ceea ce se
consider date reale n aplicaie, cum ar fi valorile din celulele foii de calcul sau textul dintr-un document Word.
Urmtoarele exemple Word arat cum se poate ajunge la text din vrful ierarhiei de obiecte:
o

Proprietatea Application returneaz o referin la obiectul Application.

Proprietatea Documents a obiectului Application returneaz o referin la colecia


Documents.

Metoda Item a coleciei Documents returneaz o referin la un songur obiect Document.

Proprietatea Words a obiectului Document returneaz o referin la colecia Words.

Metoda Item a coleciei Words returneaz o referin la un singur obiect Range.

Proprietatea Text a obiectului Range stabilete textul itemului referit.

Astfel, urmtorul exemplu completeaz primul cuvnt din document


Application.Documents.Item(1).Words.Item(1).Text = "Primul "

Deoarece proprietatea Documents este o proprietate global, poate fi utilizat fr calificativul Application;
deoarece Item este proprietate sau metod implicit pentru colecia de obiecte, nu trebuie enunat explicit. Din
aceste considerente, exemplul urmtor realizeaz exact aceeai aciune ca i exemplul precedent:
Documents(1).Words(1).Text = :Primul "

Pentru alte exemple de referine i de utilizare a metodelor i proprietilor se vor urmri exemplificrile de la
capitolele urmtoare.

Ajutor n scrierea programelor


Pentru o imagine complet a uneltelor i mecanismelor prin care mediul de programare VB susine activitatea de
scriere a instruciunilor surs se va citi i capitolul dedicat mediului VBE.

Utilizarea Macro Recorder


nregistrarea unui macro ofer un ajutor important atunci cnd se cunoate realizarea unei aciuni n interfaa
utilizator a aplicaiei de baz i se dorete cunoaterea obiectelor, proprietilor i metodelor care pot s realizeze
acea aciune (sau ceva asemntor).
n general, codul generat de nregistrarea macro nu este foarte eficient i robust, deoarece nregistrarea pleac de la
obiectul selectat n momentul startului i realizeaz doar navigarea n restul modelului de obiecte. Orice utilizare
ulterioar va necesita o selectare sau activare similar pentru a ndeplini aciunea ateptat. Trebuie s se considere
codul nregistrat doar o prim schi a procedurii, modificri ulterioare trebuind s produc o variant mai clar i
mai robust.
Codul generat este mai robust i mai flexibil dac va conine expresii care navigheaz prin ierarhia de obiecte fr
s nceap cu un obiect selectat sau activat. Idei n acest sens pot fi obinute din studierea exemplelor date n Visual
Basic Help: poziionarea punctului de inserie pe o denumire de proprietate sau metod i acionarea tastei F1
afieaz subiectul respectiv din Help.
O cale direct de accesare a fiierului de ajutor pentru un obiect este poziionarea n graficul care prezint ierarhia
de obiecte (specific fiecrei aplicaii) i dublu click pe un obiect afieaz subiectul dedicat obiectului n VB Help.
Exemplele prezentate n Help pot fi copiate, n mod uzual, utiliznd Clipboard, n fereastra de cod.

Object Browser
Fiecare aplicaie din Microsoft Office are o bibliotec de obiecte (object library sau type library), care conine
informaii despre obiectele, proprietile, metodele, evenimentele i constantele predefinite ale aplicaiei. Pentru
accesul la informaia respectiv se poate utiliza Object Browser, unealt din VBE.
Pentru a deschide Object Browser din VBE (n Excel,
Word sau PowerPoint) sau dintr-un modul (Access), se
alege Object Browser din meniul View.
n boxa Project/Library se alege numele bibliotecii care se
consult, sau <All libraries> pentru a vedea o list
complet. Dac biblioteca dorit nu este n lista celor
disponibile, se va crea o referin la aceast bibliotec prin
alegerile corespunztoare n dialogul References (meniul
Tools) al proiectului curent.
n boxa Classes se afieaz numele tuturor obiectelor i
tipurilor enumerate (constantele predefinite) n bibliotecile
referite.
Not. O clas este un tip, o descriere a unui obiect. Un
obiect este o instan efectiv a unei clase. Deseori aceti
termeni sunt utilizai unul n locul celuilalt, dac nu se produc confuzii (uneori chiar i atunci).
n boxa Members of se afieaz toate proprietile, metodele i evenimentele proprii (asociate) clasei selectate n
boxa Classes.
Selectarea unei intrri n list poate fi completat cu F1 pentru a vedea textul ajuttor, iar n zona inferioar (Detail
pane) se afieaz infromaii privind sintaxa, starea read-only sau read-write, biblioteca unde aparine, tipul
rezultatului returnat (dat sau obiect). Dac o informaie este de tip legtur, activarea acesteia produce informaii
suplimentare, lucru util pentru a deduce modul de navigare ctre obiect. n figura prezentat se vede proprietatea
Count a clasei AddIns, proprietatea returnnd o valoare de tip Long. Textul din zona Detail poate fi copiat (prin
Clipboard) sau dus prin drag-and-drop ntr-o fereastr cod.

Legarea timpurie i uneltele de construire a instruciunilor


Atunci cnd se creeaz ntr-o aplicaie o variabil obiect care se refer la un obiect furnizat de alt aplicaie, Visual
Basic trebuie s verifice c obiectul exist i c proprietile i metodele utilizate pentru obiect sunt specificate
corect. Acest proces de verificare se numete legare (binding). Legarea poate s apar n timpul execuiei
proiectului (legare trzie) sau n timpul compilrii (legare timpurie). Codul legat trziu este mai ncet dect codul
legat timpuriu. n plus, uneltele de ajutor n scrierea codului pot s lucreze corect doar n cazul legrii timpurii.
Pentru a lega timpuriu codul se vor parcurge etapele:
Se stabilete o referin la biblioteca de tipuri care conine obiectele referite (Tools - References).

Se declar variabila obiect de un tip specific (de exemplu As Document i nu As Object).


Dac se scrie cod care utilizeaz obiecte din mai multe biblioteci, se va specifica numele aplicaiei
unde sunt declarate obiectele, mai ales dac obiecte cu acelai nume exist n mai multe biblioteci.
(de exemplu As Excel.Window).

Dac o proprietate sau o metod utilizat returneaz un tip generic Object i nu un tip specific, atunci pentru
legarea timpurie se va declara mai nti o variabil de tipul specific i apoi se va atribui rezultatul generic returnat
acestei variabile, dup modelul
Dim testWs As Worksheet
Set testWs = Workbooks(1).Worksheets(1)

necesar deoarece metoda Item a obiectului Worksheets returneaz un tip Object i nu Worksheet (chiar dac se
refer la o foaie de calcul).

Programarea obiectelor altei aplicaii


Se poate executa, ntr-o aplicaie din Office, cod care s lucreze cu obiecte din alt aplicaie. Pentru a realiza acest
lucru, se va urmri schema urmtoare:

Se stabilete o referin la biblioteca de tipuri a celeilate aplicaii (meniul Tools - References).


Se declar variabile obiect care vor referi obiecte din alt aplicaie cu tipuri specifice. Se va urmri calificarea
fiecrui tip cu numele aplicaiei care expune obiectul. Exemplul urmtor declar o variabil care se refer la un
document Word i o variabil care se refer la un caiet Exce:
Dim appWD As Word.Application, wbXL As Excel.Workbook

Se utilizeaz funcia CreateObject cu identificatorul programatic OLE al obiectului cu care se dorete s se lucreze
n cealalt aplicaie, dup modelul
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Visible = True

Pentru informaii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic Identifiers".
Se aplic obiectului, coninut n variabil, proprietile i metodele dup modelul urmtor, care creeaz un nou
document Word:
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Documents.Add

La sfritul lucrului cu cealalt aplicaie, se va utiliza metoda Quit pentru a o nchide, dup modelul
appWD.Quit

Obiectele Microsoft Excel


Visual Basic suport un set de obiecte care corespund direct elementelor din Microsoft Excel, cele mai multe
identificabile dup denumirea uzual din mediul Excel. Astfel, obiectul Workbook reprezint un caiet, obiectul
Worksheet reprezint o foaie de calcul iar obiectul Range reprezint un domeniu de celule dintr-o foaie de calcul.
Fiecare element din Microsoft Excel caiet, foaie, diagram, celul etc. poate fi reprezentat printr-un obiect n
Visual Basic. Prin scrierea unor proceduri, care controleaz aceste obiecte, se pot automatiza operaiile efectuate n
Excel.
Pentru a vedea modelul de obiecte pentru Microsoft Excel, se va cuta "Microsoft Excel Objects" n Help. Pentru a
vedea fiierele de Help necesare se va urma calea: Visual Basic Editor Help Contents and Index
(Contents tab) Microsoft Excel Visual Basic Reference Shortcut to Microsoft Excel Visual Basic
Reference. Fiierele sunt disponibile dac la instalarea aplicaiei s-a marcat boxa Online Help for Visual Basic.
Dintre cele peste 100 de obiecte care alctuiesc ierarhia de obiecte Excel, vom prezenta n acest capitol doar pe cele
mai importante. Prezentarea este simplificat i din cauz c prezentarea obiectelor Word a conturat problematica
modelelor de obiecte Office i a fixat anumite reguli de operare cu aceste obiecte.

Obiectul Application
Cele mai multe proprieti ale obiectului Application Excel controleaz atributele de vizualizare ale ferestrei
aplicaiei sau comporatrea global a aplicaiei. De exemplu, valoarea proprietii DisplayFormulaBar este True
dac bara de formule este vizibil, iar valoarea proprietii ScreenUpdating este False dac actualizarea ecranului
este inhibat.
n plus, proprietile obiectului Application ofer acces la obiectele situate mai jos n ierarhie de obiecte (constituie
ceea ce s-a numit accesori). Astfel, proprietatea Windows d acces la colecia Windows (reprezentnd toate
ferestrele deschise n aplicaie), proprietatea Workbooks d colecia Workbooks a tutror caietelor deschise etc.
Din aceast categorie enumerm:
o

Charts, colecia tuturor foilor de tip chart,

Dialogs, colecia tuturor dialogurilor predefinite n mediul Excel,

Names, colecia tutror numelor create n caietul activ,

RecentFiles, colecia fiierelor utilizate recent (dup lista din meniul File),

Sheets, colecia tutror foilor deschise n caietul activ,

Windows,

Workbooks,

Worksheets, colecia tuturor foilor de calcul din caietul activ.

Returnarea unui obiect particular din colecie se efectueaz dup procedurile generale, explicate n capitolele
introductive.
n categoria accesorilor mai pot fi ncadrate proprietile care returneaz un obiect Range: ActiveCell, Cells,
Rows, Columns, Selection (dac este selectat un domeniu de celule).
Proprietile ActiveWorkbook, ActiveSheet, ActiveChart i ActiveWindow returneaz obiectele care reprezint
elementele active corespunztoare din Excel.
Anumite metode i proprieti care se aplic obiectului Application se aplic i unor obiecte situate mai jos n
ierarhie. Utilizarea acestor proprieti i metode la nivelul Application vor modifica toate caietele, foile deschise.
De exemplu, metoda Calculate aplicat la nivelul Application produce recalcularea tuturor foilor, din toate
caietele, pe cnd utilizat la nivel de Workbook sau de Worksheet produce recalcularea doar a foilor locale.

Obiectul Workbook
Dup cum se tie, similarul unui document din Word este n Excel caietul (workbook). Deschiderea sau nchiderea
unui fiier n Excel implic deci deschiderea sau nchiderea unui caiet. In Visual Basic, metodele utilizate la lucrul
cu fiiere sunt metode ale obiectului Workbook sau ale coleciei Workbooks.

Deschiderea unui Workbook


Pentru a deschide un caiet se utilizeaz metoda Open. Metoda este aplicat ntotdeauna coleciei Workbooks,
returnat prin proprietatea global cu aceeai denumire. Exemplul urmtor deschide caietul "Book1.xls" din
folderul curent i afieaz apoi valoarea din prima celul a primei foi:
Sub OpenBook1()
Set myBook = Workbooks.Open(Filename:="Book1.xls")
MsgBox myBook.Worksheets(1).Range("A1").Value
End Sub

Este de remarcat c obiectul Workbook returnat de metod se refer la caietul deschis, care rmne activ.
Asupra utilizrii utilizrii sau nu a cii pe care se gsete fiierul se vor reciti cele spuse la deschiderea
documentelor Word.
Exist dou foldere remarcabile pentru care se poate obine n mod automat calea: folderul cu fiierele Excel
executabile i folderul Library (creat automat la instalarea aplicaiei). Obinerea acestor ci se realizeaz prin
proprietile Path i LibraryPath ale obiectului Application). Astfel
EXEPath = Application.Path & Application.PathSeparator
LibPath = Application.LibraryPath & Application.PathSeparator

returneaz, respectiv, calea ctre fiierele executabile Excel i calea ctre fiierele de bibliotec. O cale returnat se
termin cu separatorul adecvat sistemului pe care se execut aplicaia, astfel nct codul este independent de
platform Windows sau Macintosh). Instruciunile
fName = LibPath & "Book1.xls"
Set myBook = Workbooks.Open(Filename:=fName)

considerate mpreun cu atribuirea variabilei LibPath de mai sus, realizeaz deschiderea fiierului Book1.xls din
folderul Library.
Se poate lsa utilizatorului opiunea de a decide aupra numelui fiierului care se deschide. Acest lucru se poate
realiza prin metoda GetOpenFilename a obiectului Application. Metoda afieaz cutia de dialog standard Open,
dar, n loc s deschid fiierul selectat, returneaz un ir cu numele complet calificat al fiierului. Urmtorul
exemplu demonstreaz metoda:
Sub DemoGEtOpenFilename()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
MsgBox "Opening " & fName
Set myBook = Workbook.Open (Filename:=fName)
End Sub

Metoda GetOpenFilename
Afieaz dialogul Open i returneaz numele de fiier selectat fr a deschide efectiv fiierul.
expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

unde
expression este o expresie care returneaz un obiect Application.
FileFilter este de tip Variant, opional. Este un ir specificnd criteriile de filtrare a fiierelor listate n dialog. irul
const n perechi formate din irul de filtrare i din specificarea filtrului n format MS-DOS, toate elementele fiind
separate prin virgule. n partea rezervat, dou filtre MS-DOS sunt separate prin ";". Exemple: "Text Files
(*.txt),*.txt,Add-In Files (*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se consider "All
Files (*.*),*.*".
FilterIndex este de tip Variant, opional. Specific indexul criteriului de filtrare implicit. de la 1 la numrul de filtre
specificat n FileFilter. Implicit se consider 1.
Title este de tip Variant, opional. Specific titlul boxei de dialog. Implicit este "Open".
ButtonText este specific pentru Macintosh.
MultiSelect este de tip Variant, opional. Este True atunci cnd se pot selecta mai multe nume de fiiere, False dac
este permis selectarea unui singur fiier. Implicit este False. n cazul seleciei multiple se va returna un tablou de
denumiri (chiar dac este selectat un singur fiier).
Metoda returneaz numele fiierului selectat sau numele introdus de utilizator. n cazul cnd utilizatorul anuleaz
boxa (prin Cancel), se returneaz False. Metoda poate schimba att folderul curent ct i unitatea.

Crearea i salvarea unui Workbook


Se creeaz un nou caiet prin aplicarea metodei Add la colecia Workbooks. Valoarea returnat se va atribui (prin
Set) unei variabile obiect pentru a putea referi noul caiet n program. Noul workbook devine activ.

Metoda Add (colecia Workbooks)


Returneaz un obiect Workbook. Sintaxa
expression.Add(Template)
unde
expression este o expresie care returneaz un obiect Workbooks. (Metoda se poate aplica, cu parametri specifici,
tuturor coleciilor.)
Template este de tip Variant, opional. Determin modul de creare a noului caiet. Dac argumentul este un ir cu
numele (posibil cu cale) unui fiier Excel, noul caiet este deschis dup modelul fiierului specificat. Argumentul
poate fi o constant (de tipul enumerat XlWBATemplate), caz n care se va crea un caiet cu o singur foaie de tipul
determinat de constant. Valorile posibile sunt: xlWBATChart, xlWBATExcel4IntlMacroSheet,
xlWBATExcel4MacroSheet sau xlWBATWorksheet. Dac argumentul este omis, atunci se creeaz un caiet cu un
numr de foi egal cu proprietatea SheetsInNewWorkbook a obiectului Application).
Salvarea unui caiet se efectueaz prin metoda SaveAs (la prima salvare) sau prin metoda Save. Exist, similar
metodei GetOpenFilename, metoda GetSaveAsFilename (pentru Application).

Metoda SaveAs
are sintaxa
expression.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup,
AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout)
unde
expression returneaz un obiect Workbook.
Filename, opional, Variant. Conine numele noului fiier, poate include o cale.
FileFormat, opional, Variant. Specific formatul de fiier utilizat la salvare. Lista formatelor admise (cele care se
pot selecta i la salvarea din Excel) se gsete n Help la proprietatea FileFormat.
Password, opional, Variant. Un ir unde capitalizarea este considerat (cel mult 15 caractere) care conine parola
de protejare a fisierului.
WriteResPassword, opional, Variant. Un ir care conine parola necesar pentru scrierea fiierului. Dac la
deschidere nu se d parola exact, fiierul este deschis doar n citire.
ReadOnlyRecommended, opional, Variant. Este True pentru a afia, la deschidere, un mesaj cu recomandarea de a
deschide fiierul doar n citire.

CreateBackup, opional, Variant. Este True dac se creeaz o copie backup.


AccessMode, opional, Variant. Conine modul de acces la workbook. Poate fi una dintre constantele (din tipul
XlSaveAsAccessMode): xlShared (shared list), xlExclusive (exclusive mode) sau xlNoChange (nu se modific
modul de acces). Ultima valoare este cea implicit. Argumentul este ignorat dac se salveaz xlShared fr a
schimba numele fiierului. Pentru schimbarea modului de acces se utilizeaz metoda ExclusiveAccess.
ConflictResolution, opional, Variant. Specific modul de rezolvare a conflictelor de schimbare n cazul cnd
fiierul este shared. Poate fi una dintre constantele (de tip XlSaveConflictResolution): xlUserResolution (afieaz
un dialog privind conflictul i rezolvarea)), xlLocalSessionChanges (accept automat modificrile locale) sau
xlOtherSessionChanges (accept celelalte schimbri n locul modificrilor locale). Prima constant este valoarea
implicit.
AddToMru, opional, Variant. Este True dac se adaug numele fiierului la lista fiierelor utilizate recent. Implicit
este False.
TextCodePage, TextVisualLayout, opionale, Variant. Neutilizate n versiunea U.S. English.

Metoda Save
Salveaz modificrile caietului specificat.
expression.Save
unde
expression returneaz un obiect Workbook.
Pentru marcarea unui fiier drept salvat fr a-l scrie efectiv pe disc, se va atribui valoarea True proprietii Saved.

Metoda GetSaveAsFilename
Similar metodei GetOpenFilename, aceast metod afieaz dialogul standard Save As, returneaz un nume de
fiier, dar nu salveaz nici un fiier.
expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)
unde
expression este o expresie care returneaz un obiect Application.
InitialFilename, opional, Variant. Specific numele de fiier propus. Dac acest nume este omis, atunci se va
utiliza numele caietului activ.
FileFilter, opional, Variant. irul care specific criteriul de filtrare. Pentru structura irului se va revedea metoda
GetOpenFilename de la deschiderea documentelor.
FilterIndex, opional, Variant. Este indicele criteriului de filtrare, de la 1 la numrul de filtre dat la FileFilter.
Implicit este 1.
Title, opional, Variant. Titlul boxei de dialog.
ButtonText este specific Macintosh.
Metoda returneaz numele de fiier selectat sau cel introdus de utilizator. Numele returnat poate include i calea.
Metoda returneaz False dac dialogul este nchis de utilizator prin Cancel. Metoda poate schimba folderul sau
unitatea curent.
Urmtorul exemplu creaz un nou caiet i-l salveaz prin metoda GetSaveAsFilename:
Sub CreateAndSave()
Set newBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
newBook.SaveAs Filename:=fName
End Sub

nchiderea unui Workbook


Pentru a nchide un workbook, se va aplica metoda Close a obiectului Workbook. nchiderea poate avea loc cu sau
fr salvarea modificrilor.

Metoda Close
Produce nchiderea obiectului. Aplicat coleciei Workbooks are sintaxa
expression.Close

unde
expression returneaz un obiect Workbooks. Dac exist modificri ale caietelor, se va afia dialogul de interogare
asupra eventualei salvri.
Aplicat obiectelor Window i Workbook metoda are sintaxa
expression.Close(SaveChanges, FileName, RouteWorkbook)
unde
expression este o expresie care returneaz un obiect Workbook sau Window.
SaveChanges este opional, Variant. Dac nu exist modificri, argumentul este ignorat. Dac exist modificri n
caiet dar caietul mai apare i n alt fereastr deschis, atunci argumentul este de asemenea ignorat. Dac exist
modificri i caietul nu mai apare n alt fereastr, atunci salvarea se efectueaz dup valorile: True salvarea
modificrilor sub numele dat la FileName sau dialog Save As; False nu se salveaz modificrile; argument omis
interogare utilizator.
FileName este opional, Variant. Salveaz modificrile sub acest nume.
RouteWorkbook este opional, Variant. Dac nu este indicat nici o rutare (nu exist nici un RoutingSlip ataat),
argumentul este ignorat. Altfel, Excel efectueazrutarea documentului dup valorile acestui argument: True

trimite caietul la urmtorul recipient; False caietul nu este transmis mai departe; omis interogarea utilizatorului
asupra trimiterii.
nchiderea unui workbook din Visual Basic nu execut macrourile Auto_Close din workbook. Se va utiliza metoda
RunAutoMacros pentru executarea macrourilor automate de nchidere. Aceste macrouri sunt meninute n Excel
din motive de compatibilitate, deci se refer la foi automatizate n versiuni Excel mai vechi.
Exemplul urmtor arat deschiderea unui caiet, modificri temporare ale caietului i nchiderea fr salvarea
modificrilor:
Sub OpenChangeClose()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
Set myBook = Workbooks.Open (Filename:=fName)
' Aici se modific foile de calcul
myBook.Close SaveChanges:=False
End Sub

Obiectul Range
Prin intermediul unui obiect Range se poate referi o singur celul, un domeniu de celule, o ntreag linie sau
coloan, o selecie cu arii multiple sau un domeniu 3-D. Din acest motiv obiectul Range este oarecum neuzual prin
aceea c poate reprezenta att o singur celul ct i o mulime de celule. Nu exist un obiect colecie pentru
Range, as c un obiect Range poate fi gndit fie ca un obiect, fie ca o colecie, dup situaie.
Exist foarte multe proprieti i metode care returneaz un obiect Range:
ActiveCell

DirectDependents

RowFields

BottomRightCell

DirectPrecedents

RowRange

Cells

EntireColumn

Rows

ChangingCells

EntireRow

Selection

CircularReference

Next

TableRange1

Columns

Offset

TableRange2

CurrentArray

PageRange

TopLeftCell

CurrentRegion

Precedents

UsedRange

Dependents

Range

VisibleRange

Pentru specificarea exact a acestor proprieti i metode se vor cuta subiectele respective n Help.
n continuare sunt menionate, mai mult prin exemple, moduri de lucru cu obiecte Range.

Referine de tip A1 sau nume de domeniu


Unul dintre modurile uzuale de returnare a unui obiect Range este acela al utilizrii unei referine de tip A1 sau al
unui nume definit.
inserarea unei valori ntr-o celul:
Worksheets("Sheet1").Range("A1").Value = 3

inserarea unei formule ntr-o celul:


Range("B1").Formula = "=510*RAND()"

inserarea aceleeai valori ntr-un ntreg domeniu de celule:


Range("C1:E3").Value = 6

tergerea coninutului unor celule:


Range("A1","E3").ClearContents

Stabilirea stilului bold pentru un domeniu numit (la nivel de workbook):


Range("myRange").Font.Bold = True

Atribuirea aceleeai valori fiecrei celule dintr-un domeniu numit (la nivel de foaie):
Range("Sheet1!yourRange").Value = 3

Setarea unei variabile obiect la un domeniu:


Set objRange = Range("myRange")

Este de menionat c expresiile care nu sunt calificate se refer la foaia curent, deci multe din exemplele de mai
sus nu ar opera dac foaia curent este o foaie de tip chart.
O cauz frecvent de erori este utilizarea proprietii Range ca argument al altei metode fr calificarea complet a
obiectului Worksheet cruia i se aplic Range. Exemplul urmtor
Sub SortRange()
Worksheets("Sheet1").Range("A1:B10").Sort _
Key1:=Range("A1"), Order1:=xlDescending
End Sub

nu va funciona corect dect dac Sheet1 este foaia activ, altminteri calificarea argumentului Key1 nu este
complet. Pentru o execuie independent de context ar trebui folosit
Key1:=Worksheets("Sheet1").Range("A1")

Utilizarea indicilor de linii i coloane


O celul specific poate fi returnat utiliznd indicii numerici de linie i coloan pentru celula referit.
Pentru a da o valoare celulei A1 se poate utiliza:
Worksheets("Sheet1").Cells(1,1).Value = 3

Pentru a insera o formul n celula B1 din foaia activ:


Cells(1,2).Formula = "=510*RAND()"

Pentru a fixa o variabil obiect la domeniul format din celula A1


Set objRange = Worksheets("Sheet1").Cells(1,1)

Referinele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instruciuni de ciclare. Exemplul
urmtor anuleaz toate celulele din domeniul A1:D10, cu o valoare mai mic dect 0.01:
Sub RoundToZero()
For rwIndex = 1 to 10
For colIndex = 1 to 4
If Worksheets("Sheet1").Cells(rwIndex,colIndex) < 0.01 Then
Worksheets("Sheet1").Cells(rwIndex,colIndex).Value = 0
End If
Next colIndez
Next rwIndex
End Sub

n exemplul urmtor se arat o soluie la listarea, ntr-o foaie separat, a tuturor denumirilor create n caietul activ i
a domeniilor referite de acestea.

Sub ListNames()
Set newSheet = Worksheets.Add
I = 1
For Each nm in ActiveWorkbook.Names
NewSheet.Cells(i,1).Value = nm.Name
NewSheet.Cells(i,2).Value = "' " & nm.RefersTo
Next nm
NewSheet.Columns("A:B").AutoFit
End Sub

Utilizarea proprietii Offset


Atunci cnd este necesar referirea la un domeniu prin deplasri relative la alt domeniu de celule, se poate utiliza
proprietatea Offset, a obiectului Range, care n argumentele RowOffset i ColumnOffset arat deplasarea fa de
obiectul Range curent. Este returnat un nou obiect Range.
Exemplul urmtor determin cteva tipuri de date din celulele domeniului A1:A10, tipurile determinate fiind
nscrise, ca text, n celula corespunztoare din dreapta, B1:B10.
Sub ScanColumn ()
For Each c In Worksheets("Sheet1").Range("A1:A10").Cells
If Application.IsText(c.Value) Then
c.Offset(0,1).Value = "Text"
ElseIf Application.IsNumber (c.Value) Then
c.Offset(0,1).Value = "Number"
ElseIf Application.IsLogical (c.Value) Then
c.Offset(0,1).Value = "Boolean"
ElseIf Application.IsError (c.Value) Then
c.Offset(0,1).Value = "Error"
ElseIf c.Value = "" Then
c.Offset(0,1).Value = "(blank cell)"
End If
Next c
End Sub

Utilizarea proprietilor CurrentRegion i UsedRange


Aceste dou proprieti, explicate n continuare, sunt utile atunci cnd nu se tie de la nceput ct de mare este
domeniul pe care se opereaz.
Prin regiunea curent se nelege un domeniu dreptunghiular de celule, limitat de linii i coloane goale, eventual
de marginile foii de calcul i de linii i coloane goale. Proprietatea CurrentRegion se aplic unui obiect Range i
pot fi mai multe regiuni curente pe o foaie de calcul, dup obiectul Range cruia i se aplic proprietatea.
Proprietatea returneaz un obiect Range, reflectnd extensia, n sensul prezentat mai sus, al obiectului Range
cruia i se aplic proprietatea.
Domeniul utilizat este determinat de celule nevide situate cel mai la stnga sus i cel mai la dreapta jos ntr-o foaie
de calcul. Un asemenea domeniu conine toate celule nevide din foaie, ca i celule vide interpuse pn la
completarea unui domeniu dreptunghiular i este unic pe o foaie de calcul. Este natural ca proprietatea UsedRange
s se aplice obiectului Worksheet i nu unui obiect Range. Proprietatea returneaz un obiect Range.
Urmtorul exemplu aplic celulelor cu valori numerice dintr-o list, care ncepe n celula A1, formatul numeric 0.0:
Sub FormatRange ()
Set myRange = Worksheets("Sheet1").Range("A1").CurrentRegion
MyRange.NumberFormat = "0.0"
End Sub

Exemplul care urmeaz presupune c foaia activ conine date dintr-un experiment desfurat n timp: prima
coloan conine datele calendaristice, a doua coloan conine ora nregistrrii valorilor, coloanele a treia i a patra
conin msurtorile experimentului. Procedura prezentat combin primele dou coloane ntr-o singur valoare de
tip Date, convertete valoarea obinut din GMT (Greenwich Mean Time) n PST (Pacific Standard Time) i le
formateaz. Deoarece nu se tie dac exist i coloane goale ntre cele patru coloane cu date, se utilizeaz
UsedRange.
Sub ConvertDates ()
Set myRange = ActiveSheet.UsedRange
myRange.Columns("C").Insert
Set dateCol = myRange.Columns("C")
For Each c In dateCol.Cells
If c.Offset(0,-1).Value <>"" Then
c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)"
End If
Next c
dateCol.NumberFormat = "mmm-dd-yyyy hh:mm"
dateCol.Copy
dateCol.PasteSpecial Paste:=xlValues
myRange.Columns("A:B").Delete
dateCol.AutoFit

End Sub

Exist i alte proprieti i metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range.
Printre acestea enumerm: Areas, Cells, Columns, EntireColumn, EntireRow, Range i Rows.

Parcurgerea unui domeniu de celule


Dintre multiplele moduri de parcurgere a celulelor dintr-un domeniu, se prezint parcurgerile prin instruciunile
For Each Next i Do Loop, unele fiind deja utilizate n exemplele anterioare.

Utilizarea instruciunii For Each Next


Acesta este modul recomandat de parcurgere a elementelor unei colecii.
Un exemplu anterior devine
Sub RoundToZero ()
For Each r In Worksheets(Sheets1").Range("A1:D10").Cells
If Abs(r.Value) < 0.01 Then
r.Value = 0
End If
Next r
End Sub

Pentru ca operaiunea anterioar s aib loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox,
specificndu-i utilizatorului s selecteze un domeniu de celule. Metoda returneaz un obiect Range care reprezint
selecia. Codul este completat cu instruciuni de tratare a erorilor uzuale.
Sub RoundToZero ()
Worksheets("Sheet1").Activate
On Error GoTo PressedCancel
Set r = Application.InputBox( _
Prompt:="Select a range of cells", _
Type:=8)
On Error GoTo 0
For Each c In r.Cells
If Abs(c.Value) < 0.01 Then
c.Value = 0
End If
Next c
Exit Sub
PressedCancel:
Resume
End Sub

Dac nu se dorete selectarea de ctre utilizator a domeniului procesat, se poate utiliza proprietatea CurrentRegion
sau proprietatea UsedRegion pentru a returna obiectul Range prelucrat. De exemplu, dac se tie c domeniul
ncepe cu celula A1 i nu include linii sau coloane vide, atunci se poate utiliza
Set r = Worksheets("Sheet1").Range("A1").CurrentRegion

pentru a returna ntregul domeniu (compact) de celule care se prelucreaz.


Urmtoarele dou exemple arat cum se poate ascunde fiecare a doua coloan din domeniul utilizat n Sheet1.
Primul exemplu, utiliznd For EachNext
Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For Each col In r.Columns
If col.Column Mod 2 = 0 Then
col.Hidden = True
End If
Next col
End Sub

Al doilea exemplu, utiliznd ForNext:


Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For i = 1 To r.Columns.Count
If i Mod 2 = 0 Then
r.Columns(i).Hidden = True
End If
Next i
End Sub

Utilizarea instruciunii DoLoop


Atunci cnd procesarea unui domeniu modific domeniul (de exemplu prin tergerea unor linii/coloane), utilizarea
instruciunii For EachNext nu produce cele mai bune rezultate. Soluia este atunci utilizarea instruciunii
DoLoop. Exemplul urmtor sorteaz o list i elimin liniile elementelor duplicate:
Sub RemoveDuplicates ()
Worksheets("Sheet1").Range("A1").Sort _
Key1:=Worksheets("Sheet1").Range("A1")

Set currentCell = Worksheets("Sheet1").Range("A1")


Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1,0)
If nextCell.Value = currentCell.Value Then
currentCell.EntireRow.Delete
End If
Set currentCell = nextCell
Loop
End Sub

Este de notat c structura repetitiv poate fi nlocuit prin


Do While currentCell.Value <> ""
' instruciunile de eliminare a liniilor cheilor duplicate
Loop

Utilizarea proprietii Address


Aplicarea proprietii Address returneaz adresa de celule a domeniului, adresa fiind sub forma de ir de caractere.
Aceast utilizare este util, n general, pentru verificare i depanarea codului. Exemplul urmtor arat o form de
completare a unei proceduri anterioare cu instruciuni de control a mersului programului
Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
MsgBox r.Address ' doar pentru depanare
For i = 1 To r.Columns.Count
If i Mod 2 = 0 Then
r.Columns(i).Hidden = True
MsgBox r.Columns(i).Address ' doar pentru depanare
End If
Next i
End Sub

Acelai efect se poate obine prin stabilirea unor expresii de urmrire (watch expressions) de forma r.Address i
r.Columns(i).Address, valorile respective pot fi examinate n fereastra Immediate. Pentru o discuie mai pe larg se
va studia capitolul dedicat depanrii i manevrrii erorilor.

Evenimentele din Excel


O bun parte din codul scris ntr-o aplicaie este coninut n proceduri de rspuns la evenimente. Cunoaterea
evenimentelor i alegerea unor rspunsuri adecvate produc o aplicaie senzitiv, vie, care interacioneaz bine cu
utilizatorul.
n Microsoft Excel se pot scrie proceduri eveniment la nivelurile: worksheet, chart, workbook i application. n
plus fa de versiuni anterioare, sunt posibile i proceduri eveniment cu argumente.
Procedurile de rspuns la evenimente la nivelurile Worksheet i Workbook sunt create n mod implicit pentru orice
foaie de calcul, foaie de diagram sau caiet. Pentru a scrie proceduri de rspuns la evenimentele de la nivelul Chart
sau pentru Application, trebuie s se creeze un nou obiect utiliznd cuvntul cheie WithEvents ntr-un modul
clas. (vezi discuia din seciunea dedicat subiectului n acest capitol).

Permiterea i inhibarea evenimentelor


n mod uzual, toate evenimentele sunt permise. Cu alte cuvinte evenimentele au loc, sunt recunoscute ca atare i se
execut procedurile corespunztoare fiecrui eveniment.
n cazul cnd nu se dorete executarea procedurii de rspuns, acest lucru este controlat prin inhibarea
evenimentului, cu efectul nerecunoaterii evenimentului de ctre sistem i, drept urmare, neexecutarea procedurii
asociate.
Proprietatea EnableEvents, a obiectului Application, poate primi valoarea True sau False dup cum evenimentele
sunt permise sau inhibate.
Urmtorul exemplu execut salvarea caietului fr producerea evenimentului BeforeSave:
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

Utilizarea evenimentelor
Completarea procedurilor implicite de rspuns la evenimente se efectueaz prin accesul la codul procedurilor i
scrierea de cod n mod uzual.
Pentru a vedea procedurile de eveniment ale unei foi (de calcul sau diagram):

click dreapta pe cotorul foii (pe bara de jos, unde se vd cotoarele tuturor foilor din caietul
activ), comanda View Code din meniul contextual, alegerea numelui evenimentului n lista
derulant Procedure, sau

meniul Tools, comanda Macro i selectarea opiunii Visual Basic Editor. Se selecteaz foaia
dorit n Project Explorer, butonul View Code i se alege numele evenimentului din lista
Procedure.

Evenimentele obiectului Worksheet


Eveniment

Descriere

Activate

Apare atunci cnd utilizatorul activeaz foaia.


Acest eveniment se va utiliza n locul
proprietii OnSheetActivate

BeforeDoubleClick

Apare atunci cnd utilizatorul execut un


dublu click ntr-o celul a foii. Se va utiliza n
locul proprietii OnDoubleClick.

BeforeRightClick

Apare atunci cnd utilizatorul execut un click


dreapta ntr-o celul a foii.

Calculate

Apare cnd utilizatorul recalculeaz foaia.


Acest eveniment se va utiliza n locul
proprietii OnCalculate.

Change

Apare atunci cnd utilizatorul schimb o


formul dintr-o celul. Se va utiliza n locul
proprietii OnEntry.

Deactivate

Apare atunci cnd foaia este activ i


utilizatorul activeaz o alt foaie. Nu apare
atunci cnd utilizatorul mut focusul de la o
fereastr la alt fereastr a aceleeai foi. Acest
eveniment se va utiliza n locul proprietii
OnSheetDeactivate.

SelectionChange

Apare atunci cnd utilizatorul selecteaz o


celul din foaie.

O prezentare complet i exemple se gsesc n intrrile respective din Help.

Exemplu
n codul care urmeaz, se reajusteaz dimensiunea coloanelor la fiecare recalculare:
Private Sub Worksheet_Calculate ()
Columns("A:F").AutoFit
End Sub

Este de remarcat c modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea evenimentelor".

Evenimentele obiectului Chart


Declanate atunci cnd utilizatorul activeaz sau modific o diagram, evenimentele recunoscute de obiectul Chart
sunt prezentate n tabelul urmtor.
Eveniment

Descriere

Activate

Apare atunci cnd utilizatorul activeaz foaia


diagram (nu apare la diagramele scufundate). Acest
eveniment se va utiliza n locul proprietii
OnSheetActivate

BeforeDoubleClick

Apare atunci cnd utilizatorul execut un dublu click


pe diagram. Se va utiliza n locul proprietii
OnDoubleClick.

BeforeRightClick

Apare atunci cnd utilizatorul execut un click


dreapta pe diagram.

Calculate

Apare cnd utilizatorul reprezint n diagram date


noi sau modificate.

Deactivate

Apare atunci cnd foaia este activ i utilizatorul


activeaz o alt foaie. Nu apare atunci cnd
utilizatorul mut focusul de la o fereastr la alt
fereastr a aceleeai foi. Acest eveniment se va utiliza
n locul proprietii OnSheetDeactivate.

DragOver

Apare atunci cnd utilizatorul dragheaz date peste


diagram.

DragPlot

Apare atunci cnd utilizatorul dragheaz un domeniu


de celule peste diagram.

MouseDown

Apare atunci cnd utilizatorul execut un click cu un


buton al mouse-ului n timp ce pointerul acestuia este
poziionat pe diagram.

MouseMove

Apare la micarea pointerului mouse-ului peste


diagram.

MouseUp

Apare atunci cnd utilizatorul elibereaz un buton al


mouse-ului n timp ce pointerul acestuia este
poziionat pe diagram.

Resize

Apare la redimensionarea diagramei.

Select

Apare la selectarea unui element al diagramei.

SeriesChanges

Apare atunci cnd utilizatorul modific valoarea unei


punct de pe diagram.

Evenimentele foilor de diagrame sunt permise n mod implicit. Pentru a scrie proceduri de eveniment pentru
diagramele scufundate, trebuie s se creeze un nou obiect utiliznd WithEvents ntr-un modul de clas.

Exemplu
Se schimb culoarea chenarului unui punct atunci cnd utilizatorul schimb valoarea punctului:
Private Sub Chart_SeriesChange (ByVal SeriesIndex As Long, _
ByVal PointIndex As Long)
Set p = ActiveChart.SeriesCollection(SeriesIndex).Points(PointIndex)
p.Border.ColorIndex = 3

End Sub

Evenimentele obiectului Workbook


Aceste evenimente se declaneaz atunci cnd utilizatorul schimb un caiet sau orice foaie din caietul respectiv.
Eveniment

Descriere

Activate

Apare atunci cnd utilizatorul activeaz caietul.

AddInInstall

Apare atunci cnd utilizatorul instaleaz caietul


ca un add-in. Se va utiliza n locul macro-ului
Auto_Add.

AddInUninstall

Apare atunci cnd utilizatorul dezinstaleaz


caietul ca un add-in. Se va utiliza n locul macroului Auto_Remove.

BeforeClose

Apare naintea nchiderii caietului. Se va utiliza


n locul macro-ului Auto_Close.

BeforePrint

Apare naintea tipririi caietului.

BeforeSave

Apare nainte ca utilizatorul s salveze foaia.


Acest eveniment se va utiliza n locul proprietii
OnSave.

Deactivate

Apare atunci cnd caietul este activ i utilizatorul


activeaz un alt caiet.

NewSheet

Apare dup ce utilizatorul creeaz o nou foaie.

Open

Apare la deschiderea caietului. Evenimentul se


va utiliza n locul macroului Auto_Open.

SheetActivate

Apare la activarea unei foi din caiet. Se va utiliza


n locul proprietii OnSheetActivate.

SheetBeforeDoubleClick

Apare la dublu click pe o celul (nu este utilizat


cu foile diagram). Se va utiliza n locul
proprietii OnDoubleClick.

SheetBeforeRightClick

Apare la click dreapta pe o celul a unei foi din


caiet (nu este utilizat cu foile diagram).

SheetCalculate

Apare la recalcularea unei foi (nu este utilizat cu


foile diagram). Se utilizeaz n locul proprietii
OnCalculate.

SheetChange

Apare la modificarea formulei dintr-o celul (nu


este utilizat cu foile diagram). Se utilizeaz n
locul proprietii OnEntry.

SheetDeactivate

Apare la activarea altei foi din caiet. Se utilizeaz


n locul proprietii OnSheetDeactivate.

SheetSelectionChange

Apare la modificarea seleciei dintr-o foaie de


calcul (nu funcioneaz cu foile diagram).

WindowActivate

Apare atunci cnd utilizatorul mut focusul pe


orice fereastr a caietului. Se utilizeaz n locul
proprietii OnWindow.

WindowDeactivate

Apare atunci cnd utilizatorul mut focusul n


afara oricrei fereastre a caietului. Se utilizeaz
n locul proprietii OnWindow.

WindowResize

Apare atunci cnd utilizatorul deschide,


redimensioneaz, maximizeaz sau minimizeaz
orice fereastr a caietului.

Pentru explicaii se vor studia intrrile corespunztoare din Help.

Exemplu
Deschiderea caietului maximizeaz fereastra aplicaiei Excel:
Sub Workbook_Open ()
Application.WindowState = xlMaximized
End Sub

Evenimentele obiectului Application


Aceste evenimente se declaneaz la crearea/deschiderea unui caiet sau atunci cnd este modificat orice foaie din
orice caiet deschis.
Eveniment
(pentru Application)

Descriere

NewWorkbook

Apare la crearea unui nou caiet.

SheetActivate

Apare atunci cnd utilizatorul activeaz o foaie


dintr-un caiet deschis. Se va utiliza n locul
proprietii OnSheetActivate.

SheetBeforeDoubleClick

Apare la dublu click pe o celul dintr-un caiet


deschis (nu este utilizat cu foile diagram). Se va
utiliza n locul proprietii OnDoubleClick.

SheetBeforeRightClick

Apare la click dreapta pe o celul a unei foi dintrun caiet deschis (nu este utilizat cu foile
diagram).

SheetCalculate

Apare la recalcularea unei foi (nu este utilizat cu


foile diagram). Se utilizeaz n locul proprietii
OnCalculate.

SheetChange

Apare la modificarea formulei dintr-o celul (nu


este utilizat cu foile diagram). Se utilizeaz n
locul proprietii OnEntry.

SheetDeactivate

Apare la activarea altei foi dintr-un caiet. Se


utilizeaz n locul proprietii
OnSheetDeactivate.

SheetSelectionChange

Apare la modificarea seleciei dintr-o foaie de


calcul (nu funcioneaz cu foile diagram).

WindowActivate

Apare atunci cnd utilizatorul mut focusul pe


orice fereastr deschis n aplicaie. Se utilizeaz
n locul proprietii OnWindow.

WindowDeactivate

Apare atunci cnd utilizatorul mut focusul n


afara oricrei fereastre a aplicaiei. Se utilizeaz n
locul proprietii OnWindow.

WindowResize

Apare atunci cnd utilizatorul redimensioneaz,


maximizeaz sau minimizeaz orice fereastr
deschis n aplicaie.

WorkbookActivate

Apare atunci cnd se mut focusul pe un caiet


deschis

WorkbookAddInInstall

Apare la instalarea unui workbook ca un add-in.

WorkbookAddInUninstall

Apare la dezinstalarea unui workbook ca un addin.

WorkbookBeforeClose

Apare nainte ca un caiet deschis s fie nchis.

WorkbookBeforePrint

Apare nainte ca un caiet deschis s fie tiprit.

WorkbookBeforeSave

Apare nainte ca un caiet deschis s fie salvat.

WorkbookDeactivate

Apare atunci cnd utilizatorul mut focusul n


afara unui caiet deschis.

WorkbookNewSheet

Apare la adugarea unei noi foi la un caiet deschis.

WorkbookOpen

Apare atunci cnd utilizatorul deschide un caiet.

Utilizarea modulelor clas cu evenimente


Deoarece diagramele scufundate ntr-o foaie de calcul i obiectul Application nu au evenimente permise n mod
implicit, trebuie s se urmeze urmtoarele etape pentru a utiliza evenimentele recunoscute de aceste obiecte.

Se creeaz un modul de tip clas i se declar un obiect de tip Chart sau Application cu
evenimente. Pentru crearea modulului clas se d comanda Class Module din meniul Insert.

Pentru permiterea evenimentelor obiectului Application se adaug declaraia

Public WithEvents App As Application

Obiectul nou creat apare n boxa Object din modulul clas i se pot scrie procedurile
evenimentelor pentru noul obiect.

Se conecteaz obiectul declarat n modul la obiectul Application. Pentru aceast operaiune, n


orice modul se d instruciunea

Public X As New EventClass

unde EventClass este numele dat, de exemplu, modulului clas creat, similar pentru X.

dup crearea instanei X a obiectului EventClass se poate stabili obiectul App al clasei EventClass
egal cu obiectul Application Microsoft Excel.

Sub InitializeApp ()
Set X.App = Application
End Sub

Dup executarea procedurii de iniializare, obiectul App din modulul EventClass puncteaz ctre
obiectul Application Microsoft Excel i procedurile eveniment din modulul clas vor fi executate
la declanarea evenimentelor.

Dei procedura poate prea laborioas, ideea poate fi utilizat pentru ca aceleai proceduri eveniment s fie asociate
mai multor obiecte.
S presupunem c am efectuat etapele precedente pentru un obiect diagram. S-a utilizat astfel declaraia
Public WithEvents cht As Chart

n etapa 2 i codul urmtor


Dim C1 As New EventClass
Dim C2 As New EventClass
Sub InitializeCharts ()
Set C1.cht = Worksheets (1).ChartObjects(1).Chart
Set C2.cht = Worksheets (1).ChartObjects(2).Chart
End Sub

pentru iniializare.
Aceeai tehnic se poate utiliza i pentru obiectele Worksheet i Workbook pentru a utiliza evenimentele noii
clase cu mai multe foi de calcul, n plus fa de evenimentele implicite.

Tratarea erorilor i depanarea programelor


Acest capitol arat cum s se utilizeze uneltele de depanare i verificare a programelor oferite de Visual Basic
Editor. Sunt prezentate i modurile n care se pot controla erorile din execuie (run-time errors) aprute n urma
ncercrii de a executa operaiuni interzise.
Informaiile din acest capitol se aplic proiectelor VBA din Microsoft Excel.

Cum se gestioneaz erorile


n mod ideal, procedurile Visual Basic n-ar trebui s conin cod de tratare a erorilro. Realitatea arat ns c
probleme hardware sau aciuni neanticipate ale utilizatorului pot s produc erori n execuie, ca urmare programul
se oprete i exist puine anse ca utilizatorul s continue execuia aplicaiei. Sunt posibile i erori care dei nu
opresc execuia produc rezultate ulterioare eronate.
De exemplu, procedura urmtoare returneaz True dac fiierul specificat exist i False dac nu, dar nu conine
instruciuni de tratare a erorilor.
Function FileExists (filename) As Boolean
FileExists = (Dir(filename) <>"")
End Function

Funcia Dir returneaz primul fiier care se potrivete numelui specificat sau un ir de lungime zero n cazul cnd
nu exist nici o potrivire.
Codul anterior pare a fi corect i acoperitor pentru toate situaiile posibile. Totu, dac litera de drive specificat nu
este valid, apare eroarea "Device unavailable". Dac unitatea este de floppy disk, funcia va funciona corect doar
dac n unitate este o dischet i poarta este nchis. n caz contrar Visual Basic va semnala eroarea "Disk not
ready" i execuia se oprete.
Pentru a ocoli asemenea situaii, trebuie s se utilizeze modalitile de error-handling din VBE pentru a intercepta
erorile (sau "a prinde" - trapping) i a executa aciuni corective. La apariia unei erori, Visual Basic stabilete
diferite proprieti ale obiectului reprezentnd eroare, Err, cum ar fi numrul erorii, descrierea etc. Obiectul Err
poate fi utilizat ntr-o rutin de tratare a erorii astfel nct aplicaia poate rspunde inteligent la o situaie de eroare.
De exemplu, probleme legate de unitate, cum ar fi o unitate invalid sau o unitate de floppy fr dischet, pot fi
tratate dup modelul urmtor.

Function FileExists (filename) As Boolean


Dim Msg As String
' Trecerea la tratarea erorilor
On Error GoTo CheckError
FileExists = (Dir(filename) <> "")
' nu a aprut nici o eroare
Exit Function
CheckError:
' secvena de tratare a erorii aprute
' definirea constantelor care reprezint eroarea
Const mnErrDiskNotReady = 71, mnErrDeviceUnavailable = 68
' vbExclamation, vbOK, vbCancel, vbCritical i vbOKCancel
' sunt constante definite n biblioteca VBA
If (Err.Number = mnErrDiskNotReady) Then
Msg = "Put a floppy disk in the drive and close the door"
' Afiarea mesajului
If MsgBox(Msg, vbExclamation & vbOKCancel) = vbOK Then
Resume
Else
Resume Next
End If
ElseIf Err.Number = mnErrDeviceUnavailable Then
Msg = "This drive or path does not exist: " & filename
MsgBox Msg, vbExclamation
Resume Next
Else
Msg = "Unexpected error #" & Str(Err.Number) & " occurred: " _
& Error.Description
' Afiarea mesajului
MsgBox Msg, vbCritical
Stop
End If
Resume
End Function

n acest cod, proprietatea Number a obiectului Err conine numrul asociat cu eroarea aparut; proprietatea
Description conine o scurt descriere a erorii. Instruciunea Resume returneaz controlul la instruciunea care a
produs eroarea iar Resume Next returneaz controlul la instruciunea urmtoare celei care a produs eroarea.

Proiectarea unei rutine de tratare a erorilor


O secven de tratare a erorilor, error handler, este o rutin care capteaz i rspunde la erori n aplicaie.
Asemenea secvene se pot aduga la orice procedur unde se anticipeaz posibilitatea unei erori (se poate
presupune c orice instruciune Visual Basic poate produce o eroare, cu excepia cazurilor cnd se tie explicit c
acest fapt nu poate avea loc). Procesul de proiectare a unui error handler necesit trei pai:
1. Stabilirea, sau permiterea, unei captri de erori prin specificarea locului din program unde se va efectua
transferul controlului atunci cnd apare o eroare.
Instruciunea On Error permite captarea erorii i transferul controlului execuiei la eticheta specificat.
2. Scrierea unei rutine de tratare a erorilor, care s rspund tuturor erorilor anticipate. Dac execuia i-a transferat
controlul n aceast secven, se zice c secvena este activ (capcana de prindere a erorii este activ).
3. Ieirea (prsirea) secvenei error-handling.
Detalii sunt oferite n seciunile care urmeaz.

Stabilirea capcanei de erori


O capcan de erori este activat atunci cnd se execut o instruciune On Error, care specific o secven de tratare
a erorilor. Capcana rmne deschis att timp ct procedura care o conine este activ, adic pn cnd este
executat o instruciune Exit Sub, Exit Function, Exit Property, End Sub, End Function sau End Property din
procedura care include secvena de tratare a erorilor. Dei numai o capcan de erori poate fi permis la un moment
dat n orice procedur, se pot crea mai multe capcane alternative care s fie activate la diferite momente. O capcan
de erori poate fi inhibat prin utilizarea instruciunii On Error GoTo 0.
Pentru activarea unei capcane de erori se utilizeaz instruciunea On Error GoTo line, unde line este eticheta care
identific secvena de instruciuni, din procedur, care trateaz erorile.

Scrierea unei rutine de tratare a erorilor


Primul pas n scrierea unei rutine error-handling este adugarea unei etichete de linii pentru marcarea nceputului
secvenei de tratare a erorilor. O convenie comun este aceea de a plasa codul error-handler la sfritul procedurii
i a-l preceda de o instruciune Exit Sub, Exit Function sau Exit Property. Aceasta permite procedurii s nu
execute codul de tratare a erorilor atunci cnd nu apar erori.

Corpul rutinei de tratare a erorilor conine cod de identificare a erorii aprute, prin structuri Select Case sau
If...Then...Else. Este obligatoriu ca o alternativ s se refere la erorile neanticipate i care nu sunt tratate
individual.
Proprietatea Number a obiectului Err conine un cod numeric reprezentnd cea mai recent eroare. Utilizarea
obiectului Err n combinaie cu structurile Select Case sau If...Then...Else, se pot lua aciuni specifice fiecrei
erori.

Ieirea din rutina de tratare a erorilor


Urmtorul tabel cuprinde instruciunile prin care se poate iei dintr-o secven error-handling. Acest fapt nseamn,
n general, cedarea controlului execuiei ctre alt instruciune din procedura activ.
Instruciunea

Descriere

Resume [0]

Execuia programului se reia cu instruciunea


care a cauzat eroarea sau cel mai recent apel al
procedurii coninnd rutina error-handling. Este
utilizat pentru a repeta o operaiune dup ce sa corectat situaia care a produs eroarea.

Resume Next

Reia execuia programului cu instruciunea


imediat urmtoare celei care a cauzat eroarea.
Dac eroarea a aprut n afara procedurii care
conine codul de eroare, execuia se reia cu
instruciunea imediat urmtoare apelului la
procedura unde a aprut eroarea, dac
procedura apelat nu are activat o secven de
eroare.

Resume line

Reia execuia programului cu instruciunea


avnd eticheta specificat n line, unde line este
o etichet de linie (sau un numr de linie diferit
de zero) care se gsete n aceeai procedur ca
i error-handler-ul.

Err:Raise Number:=number

Declaneaz eroarea de execuie avnd numrul


specificat. Atunci cnd o asemenea instruciune
este executat n interiorul rutinei de eroare,
Visual Basic caut lista de apeluri pentru alt
rutin de tratare a erorilor. (Lista de apeluri este
lanul de proceduri apelate pentru a ajunge n
punctul curent de execuie. Informaii
suplimentare se gsesc n seciunea "Ierarhia
tratrii erorilor.)

Diferena dintre Resume i Resume Next


Diferena este c Resume continu execuia cu instruciunea care a generat eroarea (instruciunea este reexecutat),
n timp ce Resume Next continu cu instruciunea care urmeaz celei care a generat eroarea. n general, se
utilizeaz Resume atunci cnd eroarea poate fi corectat. Se poate scrie cod care s nu arate utilizatorului ca avut
loc o eroare, sau cod care s permit utilizatorului s corecteze eroarea.
Exemplul urmtor ncearc efectuarea unei mpriri "sigure", fr a afia erorile care pot s apar: "Division by
zero" (numitor egal cu zero, numrtor nenul), "Overflow" (i numitorul i numrtorul sunt egali cu zero) sau
"Illegal procedure call" (un operand este o valoare nenumeric, sau nu poate fi considerat numeric). In toate cele
trei cazuri procedura urmtoare returneaz Null.
Function Divide (numer, denom) As Variant
Const mnErrDivByZero = 11, mnErrOverFlow = 6, mnErrBadCall = 5
On Error GoTo MathHandler
Divide = numer / denom
Exit Function

MathHandler:
If Err.Number = mnErrDivByZero Or Err.Number = mnErrOverFlow _
Or Err.Number = mnErrBadCall Then
Divide = Null
Else
MsgBox "Unanticipated error " & Err.Number & ": " & _
Err.Description, vbExclamation
End If
Resume Next
End Function

Reluarea execuiei la o linie specificat


Prin Resume line se d controlul execuiei la linia specificat. Urmtorul exemplu ilustreaz utilizarea acestei
instruciuni ntr-o variant a procedurii FileExists prezentat ntr-un exemplu anterior.
Function VerifyFile As String
Const mnErrBadFileName = 52, mnErrDriveDoorOpen = 71
Const mnErrDeviceUnavailable = 68, mnErrInvalidFileName = 64
Dim strPrompt As String, strMsg As String, strFileSpec As String
strPrompt = "Enter file specification to check:"
StartHere:
strFileSpec = "*.*"
strMsg = strMsg & vbCRLF & strPrompt
' Let the user modify the default
strFileSpec = inputBox(strMsg, "File Search", strFileSpec, 100, _
100)
' Exit if user deletes default
If strFileSpec = "" Then Exit Function
On Error GoTo Handler
VerifyFile = Dir(FileSpec)
Exit Function
Handler:
Select Case Err.Number
Case ErrInvalidFileName, ErrBadFileName
strMsg = "Your file specification was invalid; _
try another."
Case mnErrDriveDoorOpen
strMsg = "Close the disk drive door and try again."
Case mnErrDeviceUnavailable
strMsg = "The drive you specified was not found. _
Try again."
Case Else
Dim intErrNum As Integer
intErrNum = Err.Number
Err.Clear
Err.Raise Number:=intErrNum ' Regenerate the error
End Select
Resume StartHere ' The user can try another file name
End Function

Dac este gsit un fiier care se potrivete specificaiei, funcia returneaz numele fiierului. Dac nu se potrivete
nici un fiier, funcia returneaz un ir de lungime zero. n cazul apariiei unei dintre erorile anticipate, se afieaz
mesajul corespunztor (prin intermediul variabilei strMsg) i utilizatorul poate ncerca un nou nume prin reluarea
de la eticheta StartHere.
Dac apare o eroare diferit de cele anticipate (i posibile n operaiunea efectuat), pe ramura de program Case
Else se regenereaz eroarea nct urmtoarea capcan de erori din lista de apeluri poate s intre n aciune. Acest
fapt este necesar din cauz c dac eroarea nu ar fi regenerat, codul ar continua s se execute la linia Resume
StartHere. Prin regenerare, eroarea apare din nou i noua eroare va fi captat la urmtorul nivel din stiva de
apeluri.

Ierarhia de tratare a erorilor


Un error-handler permis este unul care a fost activat prin executarea unei instruciuni On Error i nu a fost interzis
(prin On Error GoTo 0 sau prin prsirea procedurii care l conine). Un error-handler activ este cel care se
execut curent. Pentru a fi activ, o secven error-handling trebuie s fie mai nti permis, dar nu toate secvenele
permise sunt i active. De exemplu, dup o instruciune Resume, un handler este dezactivat dar rmne permis.
La apariia unei erori ntr-o procedur, care nu are o secven error-handling permis, sau ntr-o rutin errorhandling activ, Visual Basic caut lista de apeluri pentru a gsi o alt rutin permis de tratare a erorilor. Lista de
apeluri este secvena de apeluri care conduce la procedura curent; ea este afiat n dialogul Call Stack, disponibil
n modul break prin meniul View, comanda Call Stack.

Cutarea n lista de apeluri


Presupunem urmtoarea succesiune de apeluri:

1. O procedur eveniment apeleaz procedura A.


2. Procedura A cheam procedura B.
3. Procedura B apeleaz procedura C.
n timp ce se execut C, celelalte proceduri sunt suspendate. Dac apare o eroare n procedura C iar procedura nu
are un error- handler, Visual Basic caut napoi n lista de apeluri - mai nti B, apoi A, apoi procedura de
eveniment, dar att - i execut prima secven ntlnit de tratare a erorii. Dac nu exist nici o asemenea secven,
atunci se afieaz un mesaj implicit de eroare i se oprete execuia aplicaiei.
Dac Visual Basic gsete o secven error-handling, execuia continu n acea rutin, ca i cum eroarea ar fi aprut
n procedura care conine rutina error handling respectiv. Dac o instruciune Resume sau Resume Next este
executat n rutina error handling, execuia continu dup cum este artat n tabelul urmtor.
Instruciunea

Rezultatul

Resume

Apelul la procedura pe care Visual Basic tocmai a


cercetat-o n lista de apeluri este reexecutat.
n apelurile considerate mai sus, dac procedura A are
un error handler permis care include o instruciune
Resume, Visual Basic reexecut apelul la procedura B.

Resume Next

Execuia se ntoarce la instruciunea care urmeaz


ultimei instruciuni executate n acea procedur.
Aceasta este instruciunea care urmeaz apelului la
procedura pe care Visual Basic tocmai a cercetat-o n
lista de apeluri.
n lista de apeluri exemplificat, dac procedura A are
un error handler permis care include o instruciune
Resume Next, execuia se ntoarce la instruciunea de
dup apelul la procedura B.

De notat c instruciunea executat este n procedura unde s-a gsit rutina de tratare a erorilor i nu n mod necesar
n procedura unde a aprut eroarea. Dac nu se ine seama de acest aspect esenial al tratrii erorilor, execuia poate
prea de neexplicat n momentul apariiei unei erori. Pentru o verificare mai simpl a codului, se poate trece n
modul break n momentul apariiei unei erori, dup cum este explicat ulterior n acest capitol ("Oprirea tratrii
erorilor").
Dac erorile tratate n secvena error-handler nu includ eroarea aprut, se poate produce o eroare neanticipat n
procedura care are un error handler permis: procedura poate s bucleze la infinit, n special cnd error handlerul
execut o instruciune Resume. Pentru a preveni o asemenea situaie, se va utiliza metoda Raise a obiectului Err
ntr-o secven Case Else (sau similar) din handler. Aceasta genereaz o eroare din secvena de tratare activ,
fornd Visual Basic s caute n lista de apeluri un handler care s se ocupe de eroarea aprut.
Efectul unei cutri regresive n lista de apeluri este greu de prevzut, deoarece depinde de instruciunea Resume
sau Resume Next executat. Trebuie gndit c execuia nu se reia, n mod necesar, n procedura unde a aprut
eroarea, ci n procedura unde este un error-handler activ.

Indicaii pentru o tratare complex a erorilor


La scrierea unei aplicaii Visual Basic mari, care utilizeaz diverse module, codul de tratare a erorilor poate fi
foarte complex. Se vor urmri urmtoarele linii generale:
o

n timpul verificrii/depanrii codului, se va utiliza metoda Raise a obiectului Err pentru a


regenera eroarea n toate secvenele de eroare pentru cazurile neanticipate. Pe lng o
cutare ierarhic pentru un handler care s trateze eroarea, Visual Basic va afia un mesaj
de eroare pentru acele erori care nu sunt tratate n cod. Se pot identifica astfel erori posibile
i care pot fi considerate la o nou dezvoltare a aplicaiei.

Se va utiliza metoda Clear dac trebuie s se iniializeze n mod explicit obiectul Err dup
tratarea unei erori. Acest fapt este necesar atunci cnd se utilizeaz tratarea pe loc a

erorilor cu On Error Resume Next. Visual Basic apeleaz automat metoda Clear de fiecare
dat cnd execut orice tip de instruciune Resume, Exit Sub, Exit Function, Exit Property
sau orice instruciune On Error.
o

Dac nu se dorete ca alt procedur din lista de apeluri s capteze eroarea, se va utiliza
instruciunea Stop pentru a fora terminarea codului. Instruciunea Stop permite
examinarea contextului erorii n mediul de dezvoltare.

Se va scrie o procedur error handler de siguran (fail-safe) sigur care s fie apelat de
toate secvenele de tratare a erorilor ca ultim aciune pentru erorile care nu sunt
gestionate. Aceast procedur poate efectua o terminare controlat a aplicaiei prin
descrcarea formelor i salvarea datelor.

Testarea tratrii erorilor prin generarea de erori


Simularea erorilor este util n timpul verificrii aplicaiei sau cnd se doreste tratarea unei condiii particulare ca i
cum ar fi echivalent unei erori de execuie. De exemplu, se scrie un modul care utilizeaz un obiect definit ntr-o
aplicaie extern i se dorete ca erorile returnate de acel obiect s fie tratate de restul aplicaiei precum erorile
Visual Basic.
Pentru a testa toate erorile posibile se vor genera erorile prin cod. Aceast operaiune implic metoda Raise a
obiectului Err. Metoda are sintaxa
object.Raise number, source, description, helpfile, helpcontext
unde
object este obiectul Err.
number este un ntreg Long identificnd natura erorii. Erorile Visual Basic (att Visual Basic ct i definite de
utilizator) sunt n domeniul 0-65535. La stabilirea proprietii Number pentru coduri proprii de eroare n module
clas se va aduga numrul de cod propriu la constanta vbObjectError. De exemplu, generarea erorii cu numrul
1050 implic atribuirea valorii vbObjectError + 1050 la proprietatea Number.
source este opional, ir denumind obiectul sau aplicaia care genereaz eroarea. La stabilirea acestei proprieti
pentru un obiect se va utiliza project.class. Dac nu se precizeaz sursa se utilizeaz ID-ul proiectului Visual Basic
curent.
description este optional, ir care descrie eroarea. n cazul cnd nu se specific acest argument se atribuie irul
implicit pentru o eroare Visual Basic (cum este returnat de funcia Error) sau "Application-defined or objectdefined error" n cazul unei cod propriu de eroare.
helpfile este optional, calea complet ctre un fiier Microsoft Windows Help n care se poate gsi ajutor pentru
eroarea generat. Implicit se va utiliza informaia asociat cu fiierul Visual Basic Help.
helpcontext este optional, ID de context pentru intrarea din fiierul de ajutor. n mod implicit se consider
informaia unei erori Visual Basic, dac exist.
n cazul utilizrii metodei Raise fr specificarea anumitor argumente iar valorile proprietilor obiectului Err
conin valori care nu au fost curate, aceste valori sunt luate n considerare.
Este de menionat c instruciunea Error poate fi utilizat de asemenea pentru generarea de erori, dar obiectul Err
dispune de o informaie mai bogat. Acest fapt este util n special la crearea modulelor clas.
Se poate simula orice eroare Visual Basic prin considerarea numrului de cod al erorii respective.

Definirea erorilor proprii


n afara erorilor definite de Visual Basic, utilizatorul poate s defineasc erori proprii, care s permit identificarea
unor condiii proprii aplicaiei proiectate, captarea acestor erori efectundu-se mai departe dup procedura general.
Procesul de definire se realizeaz prin adugarea de noi numere de eroare la constanta vbObjectError.
Constanta vbObjectError rezerv numere de la offsetul propriu la suma offsetului cu 512. Utiliznd un numr mai
mare dect acesta asigur c numerele proprii de eroare nu intr n conflict cu viitoarele versiuni de Visual Basic.
Pentru a defini numere de eroare proprii se adaug constante la seciunea de declaraii a modulului:
' Error constants
Const gLostCarrier = 1 + vbObjectError + 512
Const gNoDialTone = 2 + vbObjectError + 512

Se poate utiliza ulterior metoda Raise pentru noile numere de eroare, cu utilizarea eventual a descrierilor proprii
de eroare.

Tratarea inline a erorilor


Atunci cnd se testeaz apariia erorilor imediat dup fiecare linie de cod care poate produce erori, se zice c
tratarea erorilor este inline. Utiliznd acest mod de tratare a erorilor, se pot scrie funcii i instruciuni care
returneaz numerele de eroare aprute; se poate genera o eroare Visual Basic ntr-o procedur i gestiona eroarea n
procedura apelant; se poate scrie o funcie care s returneze o dat de tip Variant i utiliza acest rezultat n
procedura apelant.

Returnarea numerelor de eroare


Cea mai simpl metod de acest gen este crearea unor funcii i instruciuni care returneaz, atunci cnd apar erori,
numere de eroare (sau constante cu aceast semnificaie) n loc de valorile uzuale. De exemplu
Function FileExists (p As String) As Long
If Dir (p) <> "" Then
FileExists = conSuccess
Else
FileExists = conFailure
End If
End Function

care poate fi utilizat prin


Dim ResultValue As long
ResultValue = FileExists ("C:\Testfile.txt")
If ResultValue = conFailure Then
... ' se trateaaz eroarea
Else
... ' se proceseaz fiierul
End If

Lucrul esenial n tratarea inline a erorilor este testarea apariiei unei erori imediat dup instruciunea sau apelul de
funcie care poate s produc eroarea. n acest mod se poate proiecta un handler care anticipeaz exact tipul de erori
care pot s apar. Aceast abordare nu necesit ca o eroare de execuie s apar efectiv.

Tratarea erorilor n procedura apelant


Alt metod pentru a indica apariia unei erori este s se genereze o eroare Visual Basic n procedur activ i s se
trateze eroarea ntr-un handler inline din procedura apelant.
Exemplul urmtor arat o variant a procedurii FileExists n care se genereaz un numr de eroare n cazul
eecului. naintea apelului funciei, instruciunea On Error Resume Next stabilete proprietile obiectului Err dar
nu precizeaz o rutin error-handling.
Instruciunea On Error Resume Next este urmat de codul de tratare a erorii. Acesta testeaz proprietile
obiectului Err pentru a vedea dac a aprut o eroare. Dac Err.Number nu conine zero, atunci a aprut o eroare.
Function FileExists (p As String)
If Dir (p) <> "" Then
Err.Raise conSuccess
Else
Err.Raise conFailure
End If
End Function
Dim ResultValue As Long
On Error Resume Next
ResultValue = FileExists ("C:\Testfile.txt")
If Err.Number = conFailure Then
... ' se trateaz eroarea
Else
... ' se continu programul
End If

Urmtorul exemplu, mai complex, utilizeaz att valoarea returnat, ct i un argument pentru a detecta apariia
unei erori.
Function Power (X As Long, P As Integer, ByRef Rezult As Long) _
As Long
On Error GoTo ErrorHandler
Result = X^P
Exit Function
ErrorHandler:
Power = conFailure
End Function
' Apelul funciei Power

Dim lngReturnValue As Long, lngErrorMayBe As Long


lngErrorMayBe = Power (10, 2, lngReturnValue)
If lngErrorMayBe = conFailure Then
... ' tratarea erorii
Else
... ' continuarea programului
End If

Utilizarea datelor de tip Variant


Alt cale pentru a returna informaii despre erorile eventuale este utilizarea datelor de tip Variant i funciile
asociate, potrivit exemplului urmtor. O variabil de tip Variant are un indicator privind tipul de dat coninut i
acest tag poate fi fixat ca un cod de eroare Visual Basic.
Function Power (X As Long, P As Integer) As Variant
On Error GoTo ErrorHandler
Result = X^P
Exit Function
ErrorHandler:
Power = CVErr(Err.Number)
' convertete codul de eroare n tagged Variant
End Function
' Apelul funciei Power
Dim varReturnValue As Variant
varReturnValue = Power (10, 2)
If IsError (varReturnValue) Then
... ' tratarea erorii
Else
... ' continuarea programului
End If

Tratarea centralizat a erorilor


Atunci cnd se adaug cod de tratare a erorilor la o aplicaie, tratarea inline produce tratri repetate ale acelorai
erori. Codul poate fi redus prin scrierea unor proceduri apelate repetat de secvenele error handling.
Funcia FileErrors din exemplul urmtor afieaz un mesaj adecvat erorii produse i, cnd este posibil, permite
acoperirea erorii. Este returnat procedurii apelante un cod cu aciunea de urmat. Este de notat c, undeva n
program, se vor defini constantele utilizate.
Function FileErrors () As Integer
Dim intMsgType As Integer, strMsg As String
Dim intResponse As Integer
' Valoarea returnat neles
' 0 Resume
' 1 Resume Next
' 2 Eroare netratabil
' 3 Eroare necunoscut
intMsgType = vbExclamation
Select Case Err.Number
Case mnErrDeviceUnavailable ' error 68
strMsg = " That device appears unavailable."
intMsgType = vbExclamation + 4
Case mnErrDiskNotReady
'error 71
strMsg = "Insert a disk in the drive and close the door."
Case mnErrDeviceIO 'error 57
strMsg = " Internal disk error."
intMsgType = vbExclamation + 4
Case mnErrDiskFull ' error 61
strMsg = " Disk is full. Continue?"
intMsgType = vbExclamation + 3
Case mnErrBadFileName, mnErrBadFileNameOrNumber ' error 64, 52
strMsg = " That filename is illegal."
Case mnErrPathDoesNotExist
' error 76
strMsg = " That path doesn't exist."
Case mnErrBadFileMode
' error 54
strMsg = " Can't open your file for that type of access."
Case mnErrFileAlreadyOpen
' error 55
strMsg = " This file is already open."
Case mnErrInputPastEndOfFile ' error 62
strMsg = " This file has a nonstandard end-of-file marker,"
strMsg = strMsg & "or an attempt was made to read beyond"
strMsg = strMsg & "the end-of-file marker."
Case Else
FileErrors = 3
Exit Function
End Select
intResponse = MsgBox (strMsg, intMsgType, "Disk Error")
Select Case intResponse
Case 1, 4 ' butoanele OK, Retry
FileErrors = 0
Case 5
' butonul Ignore

FileErrors = 1
Case 2, 3 ' butoanele Cancel, End
FileErrors = 2
Case Else
FileErrors = 3
End Select
End Function

Aceast procedur trateaz erorile comune legate de fiiere i unitatea de dischet. Pentru celelalte erori se
returneaz valoarea 3. Procedura apelant va trebui apoi s trateze aceast eroare, s o genereze nc o dat prin
metoda Raise sau s cheme alt procedur care s trateze eroarea neanticipat.

Inhibarea tratrii erorilor


Dac o capcan de erori a fost permis ntr-o procedur, aceasta este scoas automat la prsirea procedurii. Sunt
situaii cnd este necesar anularea capcanei nainte de prsirea procedurii gazd. Acest fapt este realizat de
instruciunea On Error GoTo 0. Dup executarea acestei instruciuni, Visual Basic detecteaz erorile dar nu sunt
captate n procedur. Instruciunea poate fi utilizat oriunde, inclusiv n interiorul unei rutine error handler.

Depanarea programelor care au rutine de tratare a erorilor


Atunci cnd se depaneaz programe, analiza comportrii poate fi complicat n cazul captrii erorilor de ctre
rutinele error handler. Posibilitatea de a transforma n comentarii liniile On Error din fiecare modul simplific
analiza dar este stnjenitoare.
Este de preferat modalitatea prin care tratarea erorilor este inhibat i, de fiecare dat cnd apare o eroare, se intr
n modul break. Pentru aceasta, se va selecta opiunea Break on All Errors din fia General a dialogului Options
(meniul Tools). Selectarea acestei opiuni are ca efect, la apariia unei erori, intrarea n modul break i afiarea
ferestrei Watch cu codul care a produs eroarea.

Tratarea erorilor din obiectele referite


n procedurile care fac referin la unul sau mai multe obiecte este mult mai dificil s se determine unde apare o
eroare, mai ales dac eroarea apare ntr-un obiect al altei aplicaii. De exemplu, s considerm o aplicaie care
const dintr-un modul form (MyForm), care face referin la un modul clas (MyClassA), care face referin la un
obiect Microsoft Excel Worksheet.
Dac obiectul Worksheet nu rezolv o eroare particular aprut n foaia de calcul ci o regenereaz, Visual Basic
va trece eroarea ctre obiectul care se refer la obiectul Worksheet., adic MyClassA. Visual Basic remapeaz n
mod automat erorile netratate aprute n obiecte din afara Visual Basic ctre codul de eroare 440.
Obiectul MyClassA poate fie s trateze eroarea (ceea ce este preferabil), fie s o regenereze. Interfaa specific
faptul c orice obiect care regenereaz o eroare aprut ntr-un obiect referit nu poate s propage pur i simplu
eroarea (s transmit codul de eroare 440), ci trebuie s o remapeze la un numr de eroare cu semnificaie definit.
Acest numr poate fi un numr Visual Basic (dac se poate efectua o asemenea echivalare), sau un numr propriu,
adugat dup procedura explicat anterior.
De cte ori este posibil, un modul clas va trebui s trateze orice eroare care apare n interiorul modulului i orice
eroare care apr n obiecte referite i nerezolvate de obiectele nsele. Exist totui erori care nu pot fi tratate din
cauz c nu pot fi anticipate. Exist i cazuri cnd este mai potrivit o tratare a erorii de ctre obiectul care face
referina dect de obiectul referit.
Atunci cnd apare o eroare n modulul unei forme, Visual Basic genereaz unul dintre numerele de eroare
predefinite.
Observaie. Dac se creeaz o clas public, trebuie ca fiecare secven care trateaz o eroare non-Visual Basic s
fie bine documentat. Ali programatori care se refer la aceast clas trebuie s cunoasc cum s trateze erorile
transmise de obiectul respectiv.
La regenerarea unei erori, celelalte proprieti ale obiectului Err se vor lsa neschimbate. Dac eroarea transmis
nu este tratat, proprietile Source i Description pot fi afiate pentru a ajuta utilizatorul s ia msuri corective.

Tratarea erorilor transmise din obiecte referite


Un modul clas ar putea s includ urmtoarea secven pentru tratarea erorilor pe care le poate aborda i
regenerarea celor care nu pot fi rezolvate. Secvena este explicat dup prezentarea codului.
MyServerHandler:
Select Case ErrNum
Case 7
' eroarea out-of-memory
...
Case 440 ' erori din obiecte externe

Err.Raise Number:=vbObjectError + 9999


' eroare din alt obiect Visual Basic
Case Is > vbObjectError And Is < vbObjectError + 65536
ObjectError = ErrNum
Select Case ObjectError
' acest obiect trateaz erorile pe baza
' documentaiei obiectului de unde provine eroarea
Case vbObjectError + 10
...
Case Else
' remaparea erorii ca o eroare obiect generic i
regenerarea ei
Err.Raise Number:=vbObjectError + 9999
End Select
Case Else
' remaparea erorii ca o eroare obiect generic i regenerarea ei
Err.Raise Number:=vbObjectError + 9999
End Select
Err.Clear
Resume Next

Instruciunea Case 440 capteaz erorile care apar ntr-un obiect referit extern aplicaiei Visual Basic. n acest
exemplu, eroarea este propagat utiliznd valoarea 9999, deoarece este dificil pentru acest tip de handler central s
determine cauza erorii. Apariia unei astfel de erori este, de obicei, rezultatul unei erori fatale de automatizare (o
eroare care produce oprirea execuiei componentei) sau din cauza unui obiect care nu a tratat corect o eroare
captat. Eroarea 440 nu ar trebui propagat dect n cazul unei erori fatale. Dac aceast secven ar fi scris pentru
un handler inline (vezi seciunea "Tratarea inline a erorilor"), ar fi posibil s se determine cauza erorii i s se
corecteze.
Instruciunea Case Is > vbObjectError And Is < vbObjectError + 65536 capteazerorile care au originea ntr-un
obiect din aplicaia Visual Basic, sau din obiectul care conine handlerul. Numai asemenea obiecte pot produce
erori n domeniul specificat.
Documentaia pentru codul de eroare oferit pentru obiect trebuie s defineasc codurile posibile, semnificaia lor,
astfel nct aceast poriune a handlerului s poat fi scris adecvat erorilor anticipate. Codurile de eroare efective
pot fi documentate fr offsetul vbObjectError sau pot fi documentate dup ce s-a adugat deplasarea, n care caz
instruciunea Case Else trebuie s scad deplasarea vbObjectError. Pe de alt parte, erorile obiectelor pot fi
constante, artate n biblioteca de tipuri a obiectului i vizibile n Object Browser. n acest caz se utilizeaz
constanta de eroare n Case Else i nu codul de eroare.
Orice eroare care nu este tratat trebuie s fie regenerat cu un nou numr, dup cum este n instruciunea Case
Else. n aplicaia proprie se poate proiecta un handler care s anticipeze acest nou numr definit. Dac aplicaia este
o clas public, trebuie s fie inclus n documentaie o explicaie a acestei noi erori.
Ultima instruciune Case Else capteaz i regenereaz orice alt eroare care nu a fost tratat anterior. Deoarece
aceast parte a capcanei va prinde erori care au sau nu adugat deplasarea vbObjectError, remaparea se va
efectua simplu ctre un cod generic "unresolved error". Acest cod se va aduga la vbObjectError indicnd oricrui
handler c aceast eroare provine dintr-un obiect referit.

Depanarea tratrii erorilor din obiecte referite


Deoarece depanarea aplicaiilor care se refer la obiecte create n Visual Basic sau la clase definit n module clas
este dificil, se recomand selectarea opiunii Break in Class Module din fia General a dialogului Options
(meniul Tools). Cu aceast opiune selectat, orice eroare dintr-un modul clas duce la intrarea clasei n modul
break a debuggerului, permind analiza erorii.

Depanarea programelor
Tehnicile de depanare prezentate n acest capitol utilizeaz uneltele de analiz oferite de Visual Basic. Mediul de
dezvoltare Visual Basic nu poate s identifice sau s fixeze erorile, dar ofer unelte pentru a analiza fluxul execuiei
i cum se schimb valorile variabilelor i proprietilor. Se poate considera c uneltele de depanare ajut la
examinarea aplicaiei pentru a nelege ce se ntmpl i de ce.
Uneltele de depanare oferite de Visual Basic includ puncte de oprire (breakpoints), expresii de oprire (break
expressions), expresii de urmrire (watch expressions), executarea codului pas cu pas (instruciune cu instruciune
sau procedur cu procedur) i afiarea valorilor variabilelor i proprietilor. Sunt oferite de asemenea posibiliti
speciale cum ar fi editarea codului i continuarea execuiei (edit-and-continue), stabilirea urmtoarei instruciuni
care s se execute dup o eroare i testarea cu aplicaia n modul break.

Tipuri de erori
Exist trei tipuri de erori care se pot intlni ntr-un program.
Erori de compilare. Acestea rezult din scrierea incorect a codului. Aceste erori sunt detectate de Visual Basic la
compilarea codului.
Erori de execuie. Acestea apar n timpul execuiei aplicaiei (i sunt detectate de Visual Basic) atunci cnd o
instruciune ncearc s efectueze o operaiune imposibil (de genul mpririi prin zero).
Erori de logic. Acestea apar atunci cnd aplicaia nu se execut n modul gndit la proiectare. O aplicaie poate s
fie corct sintactic, s se execute fr a efectua operaiuni imposibile i totui s produc rezultate incorecte. Doar
testarea aplicaiei i analiza rezultatelor poate spune c aplicaia funcioneaz corect.

Unelte de depanare
Nu exist artificii magice pentru depanare i nu exist o secven fix de operaiuni care s lucreze ntotdeauna. n
esen, ajutorul oferit n depanare este pentru o mai bun nelegere a mersului aplicaiei. Se poate astfel fotografia
starea aplicaiei la un moment dat, instantaneul obinut cuprinznd valori ale
proprietilor, precum i numele apelurilor active de proceduri.

variabilelor, expresiilor i

Bara de unelte Debug


Imaginea alturat arat bara de unelte Debug din mediul Visual Basic Editor.

n tabelul urmtor se explic pe scurt funcionalitatea uneltelor principale din aceast bar.
Unealta de depanare

Scop

Run/Continue

Comut din modul design n modul run (Run) sau din


modul break n modul run (Continue).

Break

Comut din run time n modul break.

Reset

Comut din run time sau modul break n modul design.

Toggle Breakpoint

Definete o linie ntr-un modul, unde Visual Basic


suspend execuia aplicaiei.

Step Into

Execut urmtoarea linie executabil din aplicaie i intr


n proceduri.

Step Over

Execut urmtoarea linie executabil din aplicaie dar nu


intr n proceduri.

Step Out

Execut restul de cod din procedura curent i se opreste


la linia urmtoare din procedura apelant.

Locals Window

Afieaz valoarea curent a variabilelor locale.

Immediate Window

Permite executarea de cod sau interogarea unei valori n


timp ce aplicaia este n break mode.

Watch Window

Afieaz valorile unor expresii selectate.

Quick Watch

Listeaz valoarea curent a unei expresii n timp ce


aplicaia este n modul break.

Call Stack

n timp ce aplicaia este n modul break, afieaz o cutie


de diaolg care arat toate procedurile care au fost apelate
dar nc nu s-au executat complet.

Seciunile urmtoare aduc explicaii suplimentare asupra modului de utilizare efectiv a acestor unelte.

Evitarea "bug"-urilor
Respectarea urmtoarelor reguli poate conduce la evitarea introducerii unor bug-uri n aplicaie.
Aplicaia se proiecteaz cu atenie prin notarea evenimentelor importante i a modului n care codul va rspunde la
fiecare eveniment. Fiecare procedur general, ca i fiecare procedur eveniment trebuie s aib un scop specific,
bine definit.
Se vor include ct mai multe comentarii. La ntoarcerea n cod i analiza comportrii aplicaiei, comentariile
privind scopul fiecrei rutine sunt de un real ajutor.
o

Se vor utiliza, pe ct posibil, referine explicite. Variabilele obiect se declar dup cum
sunt listate obiectele n cutia Classes din Object Browser i nu prin tipuri Variant sau
Object.

Se va dezvolta sau adapta o schem consistent de construcie a denumirilor pentru variabilele i obiectele din
aplicaie.
o

Se va utiliza declaraia Option Explicit pentru a ocoli erorile de tastare a identificatorilor i


confundarea unui control cu altul.

Design Time, Run Time i Break Mode


Se utilizeaz Visual Basic n design time pentru a crea o aplicaie i n run time pentru a o executa. n break mode
execuia programului este suspendat astfel nct se pot examina i modifica date. Bara de titlu Visual Basic arat
ntotdeauna modul utilizat curent.
Caracteristicile celor trei moduri i tehnicile pentru comutarea ntre ele sunt listate n urmtorul tabel.
Mod

Descriere

Design time

Lucrul la crearea unei aplicaii se execut n


acest mod. Se pot proiecta formulare, trasa
controale, scrie cod etc. Nu se poate executa
cod sau utiliza unelte de depanare, cu excepia
stabilirii de puncte de oprire i crerii de
expresii de urmrire.
Pentru a trece la run time click pe butonul
Run. Pentru trecerea n break mode click pe

Step Into din meniul meniul Run i aplicaia


intr n modul break la prima instruciune
executabil.
Run time

n timpul execuiei, cnd aplicaia are


controlul, se interacioneaz cu aplicaia ca
orice alt utilizator. Se poate vedea codul dar nu
se poate schimba.
Pentru a trece n design time se acioneaz
butonul Reset iar pentru a trece n break mode
click pe butonul Break.

Break mode

Execuia este suspendat n timpul rulrii


aplicaiei. Se poate vedea i edita codul,
examina sau modifica date, reporni aplicaia,
sfri execuia sau continua din punctul de
oprire.
Pentru comutarea n run time, click pe butonul
Continue (acelai cu Run). Trecerea n design
time se obine prin butonul Reset.
Se poat fixa puncte de oprire i expresii de
urmrit n design time, dar celelalte unelte de
depanare lucreaz doar n modul break.

Utilizarea ferestrelor de depanare


Cu ajutorul ferestrelor de depanare se pot monitoriza valorile expresiilor i variabilelor n timp ce se parcurg
instruciunile aplicaiei. Exist trei ferestre de depanare: Immediate, Watch i Locals. Pentru afiarea oricreia
dintre aceste ferestre se activeaz comanda corespunztoare din meniul View sau butonul corespunztor de pe bara
Debug.
Fereastra Immediate arat informaia care rezult din instruciunile de depanare din cod sau care este cerut prin
instruciuni scrise direct n fereastr.
Fereastra Watch arat valorile curente ale expresiilor urmrite (watch expressions), acelea pentru care s-a hotrt
monitorizarea. O expresie de oprire (break expression) este o expresie santinel care produce intrarea Visual Basic
n modul break atunci cnd o anumit condiie definit devine adevrat. n fereastra Watch, coloana Context
indic procedura, modulul, sau modulele n care fiecare expresie santinel este evaluat. Fereastra Watch poate
afia o valoare pentru o expresie urmrit numai dac instruciunea curent este n contextul specificat; n caz
contrar, coloana Value afieazun mesaj indicnd c instruciunea nu este n context.
Fereastra Locals arat valorile oricrei variabile din domeniul procedurii curente. Dup cum execuia trece din
procedur n procedur, coninutul ferestrei Locals se modific pentru a reflecta doar variabilele aplicabile
procedurii curente. O variabil care reprezint un obiect apare n fereastra Locals cu un semn plus (+) n stnga
numelui su. Se poate efectua click pe semn pentru a expanda variabila, afia proprietile obiectului i valorile
curente. Dac o proprietate a obiectului conine un alt obiect, acesta poate fi expandat de asemenea. Aceeai
examinare se poate aplica pentru variabilele care conin tablouri sau tipuri definite de utilizator.

Utilizarea modului break


n design time se poate schimba aspectul sau codul aplicaiei, dar nu se pot vedea efectele schimbrilor. n run time
se poate urmri cum se comport aplicaia, dar nu se poate interveni direct n cod.
Modul Break oprete execuia aplicaiei i ofer un instantaneu al condiiilor n orice moment. Variabilele i
valorile proprietilor sunt pstrate, astfel nct se poate analiza starea curent a aplicaiei i introduce modificri
care afecteaz execuia aplicaiei. Cnd aplicaia este n modul break se pot efectua urmtoarele aciuni:
Modificarea codului aplicaiei.
Observarea strii interfeei.

Determinarea apelurilor procedurilor.


Urmrirea valorilor variabilelor, proprietilor i instruciunilor.
Schimbarea valorilor variabilelor i proprietilor.
Controlarea fluxului execuiei prin aflarea/stabilirea instruciunii urmtoare.
Execuia imediat a unor instruciuni Visual Basic.
Controlarea manual a operrii aplicaiei.

Intrarea n modul break la o instruciune cu probleme


n timpul depanrii unui program este uneori de dorit oprirea aplicaiei n acel loc din cod unde se bnuiete
existena unei probleme. Acesta este unul dintre motivele pentru care Visual Basic prevede puncte de oprire i
instruciuni Stop. Un punct de oprire (breakpoint) definete o instruciune sau o mulime de condiii unde Visual
Basic oprete execuia n mod automat i trece aplicaia n modul break fr a executa instruciunea care conine
punctul de oprire.
Se poate intra n modul break i manual, prin oricare dintre aciunile
CTRL+BREAK
o

Comanda Break din meniul Run

Butonul Break de pe bara de unelte Debug.

Este posibil s se opreasc execuia atunci cnd aplicaia nu are de lucru (idle - este ntre procesarea unor
evenimente). Cnd se ntmpl acest fapt, execuia nu se oprete la o linie specific, dar Visual Basic comut
oricum la modul break.
Se poate intra automat n modul break automat atunci cnd se ntmpl oricare dintre urmtoarele condiii:
O instruciune genereaz o eroare de execuie netratat.
o

O instruciune genereaz o eroare de execuie i a fost selectat Break on All Errors n fia
General (meniul Tools).

O expresie de oprire definit n dialogul Add Watch s-a modificat sau a devenit True, dup
cum a fost definit.

Execuia atinge o linie cu un punct de oprire.


o

Execuia atinge o instruciune Stop.

Fixarea unei erori run-time i continuare


Anumite erori din execuie rezult din neglijena cu care este scris codul. Aceste erori pot fi corectate uor prin
declararea variabilelor, modificarea denumirilor etc. Dup o asemenea corectur programul poate continua chiar
din linia unde s-a oprit. Acest fapt se realizeaz prin acionarea comenzii Continue (meniul Run) sau butonul
Continue. La continuarea aplicaiei se poate verifica fixarea erorii.
Dac se selecteaz opiunea Break on All Errors, Visual Basic inhib tratarea erorilor din cod, nct la orice
eroare semnalat se intr n modul break. Erorile vor fi captate de secvenele de tratare doar dac opiunea Break
on All Errors nu este selectat.
Anumite erori, cum ar fi schimbarea declaraiilor de variabile, adugarea unor noi variabile etc., necesit repornirea
aplicaiei. n acest caz Visual Basic prezint un mesaj care las repornirea aplicaiei la voia utilizatorului.

Monitorizarea datelor prin expresii de urmrire


Atunci cnd un calcul nu produce rezultatul ateptat sau apar probleme cnd o anumit proprietate sau variabil ia o
valoare particular, este de interes s se poat identifica momentul n care o expresie i schimb sau atinge o
valoare.
Visual Basic monitorizeaz n mod automat expresiile definite de utilizator drept expresii santinel (de urmrit). La
trecerea aplicaiei n modul break, aceste expresii apar n fereastra Watch.

Se poate de asemenea instrui o expresie urmrit s treac aplicaia n modul break atunci valoarea ei se modific
sau devine True (pentru condiii). Acest mod de operare reduce, de obicei, parcurgerea pas cu pas a proiectului
pn cnd se atinge o anumit condiie (de exemplu, o variabil de ciclare ajunge la o anumit valoare, sau un
indicator dintr-o procedur este modificat).

Adugarea, editarea sau eliminarea unei expresii urmrite


Toate operaiunile din titlu se pot efectua att n design time, ct i n modul break. Pentru a aduga o expresie
santinel se utilizeaz dialogul Add Watch afiat din meniul Debug.
Se utilizeaz dialogul Edit Watch, afiat tot din meniul Debug, pentru modificarea sau eliminarea unei expresii
definite. Cele dou dialoguri, Add Watch i Edit Watch, au aceeai structur de controale cu excepia butonului
Delete care apare doar n dialogul Edit Watch.
Componentele comune celor dou dialoguri sunt prezentate n tabelul urmtor.
Componenta

Descriere

Zona text Expression

Conine expresia pe care expresia urmrit o


evelueaz. Aceast expresie este o variabil, o
proprietate, un apel de funcie sau orice alt
expresie valid. n dialogul Add Watch
aceast box de text conine expresia curent
(dac exist).

Grupul de opiuni Context

Stabilete domeniul variabilelor urmrite n


expresie. Se va completa atunci cnd exist
variabile sinonime cu domenii diferite. Se
poate restrnge domeniul la o procedur
specific sau la un modul anumit, sau se poate
extinde la ntreaga aplicaie prin selectarea
intrrilor All Procedures i All Modules.
Visual Basic poate evalua mai uor o variabil
ntr-un context restrns.

Grupul de opiuni Watch Type

Stabilete cum rspunde Visual Basic la


expresia urmrit:
- urmrete expresia i afieaz valoarea n
fereastra Watch atunci cnd aplicaia intr n
modul break;
- aplicaia intr n modul break automat atunci
cnd se modific valoarea expresiei sau cnd
aceasta devine True.

Observaie. Se poate aduga o expresie urmrit prin tragerea expresiei dintr-un modul n fereastra Watch.

Utilizarea urmririi rapide


Cnd aplicaia este n modul break, se poate verifica valoarea unei proprieti, variabile sau expresii pentru care nu
s-a definit n prealabil o expresie de urmrire. Se folosete n acest scop dialogul Quick Watch (din meniul Debug
sau de pe bara sinonim). Dialogul arat valoarea expresiei selectate nrtr-un modul. Pentru a continua urmrirea
acestei expresii, se acioneaz butonul Add (inhibat dac operaiunea de urmrire nu este posibil); fereastra
Watch este afiat etc.

Utilizarea unui punct de oprire


n execuie, un punct de oprire (breakpoint) produce oprirea execuiei programului exact naintea unei linii
specifice de cod. Atunci Visual Basic execut o procedur i se ajunge la o linie de cod care are fixat un punct de
oprire, atunci aplicaia este trecut n modul break.

Se poate stabili sau anula un punct de oprire n modul break, n design time sau n run time dac aplicaia este
inactiv (idle). Pentru a fixa un punct de oprire se efectueaz un click pe marginea din stnga ferestrei modulului,
n dreptul instruciunii (vezi figura de mai sus). Instruciunea astfel marcat este colorat potrivit culorii specificate
n dialogul Options (meniul Tools), fia Editor Format. Prin click pe indicatorul de breakpoint se anuleaz
punctul de oprire respectiv.
Se remarc n figura anterioar c instruciunea curent este i ea marcat prin culoare i un indicator pe latura din
stnga a ferestrei de cod. Atunci cnd se atinge un punct de oprire i aplicaia este oprit, se poate examina starea
curent a aplicaiei, focusul putnd fi mutat ntre forme, module, ferestrele de depanare.
Aplicaia este oprit exact naintea executrii liniei care conine punctul de oprire. Dac se dorete observarea
efectului executrii acestei instruciunii se va aciona Step Into sau Step Over.
Pentru izolarea unei probleme reamintim c o instruciune poate s contribuie indirect la eroare datorit atribuirii
unor valori incorecte. Examinarea valorilor variabilelor i proprietilor se efectueaz n modul break prin ferestrele
Locals, Quick Watch, expresii urmrite i fereastra Immediate.

Utilizarea instruciunii Stop


O alternativ la fixarea unui punct de oprire este plasarea unei instruciuni Stop. La ntlnirea unei instruciuni
Stop, Visual Basic oprete execuia i comut n modul break. Dei Stop acioneaz ca un breakpoint, instruciunea
nu poate fi fixat sau inhibat n acelai mod.
Reamintim c o instruciune Stop oprete doar temporar execuia n timp ce o instruciune End oprete execuia,
reiniializeaz variabilele i produce ntoarcerea la modul design. O aplicaie oprit prin Stop poate fi continuat
prin Continue din meniul Run.

Executarea unor secvene de cod selectate


Dac se poate identifica instruciunea care a cauzat eroarea, un singur breakpoint poate localiza problema ivit.
Este mai frecvent situaia n care o ntreag secven de cod este bnuit c produce execuia incorect a aplicaiei.
n acest caz, un breakpoint izoleaz zona de cod i se parcurge apoi ntreaga poriune pas cu pas prin Step Into i
Step Over. Dac este necesar, se poate de asemenea sri peste instruciuni sau rentoarce execuia la o nou linie.
Pentru comenzile descrise n tabelul urmtor trebuie ca aplicaia s fie n modul break.
Modul de parcurgere

Descriere

Step Into

Execut instruciunea curent i se oprete la


urmtoarea linie, chiar dac ea este n alt
procedur.

Step Over

Execut ntreaga procedur apelat de linia


curent i se oprete la linia urmtoare liniei
curente.

Step Out

Execut restul procedurii curente i se oprete la


instruciunea urmtoare celei care a apelat
procedura curent.

Utilizarea comenzii Step Into


Se utilizeaz Step Into pentru a executa o singur instruciune. Visual Basic trece temporar n run time, execut
instruciunea curent i avanseaz la urmtoarea instruciune, revine n modul break. Pentru acest tip de operaiune
se acioneaz butonul Step Into din bara Debug.
n cazul scrierii mai multor instruciuni pe o aceeai linie, Visual Basic le va considera separat (punctele de oprire
apar doar la prima instruciune din linie).

Utilizarea comenzii Step Over


Comanda Step Over se aplic tot instruciunii curente, dar aceasta trebuie s conin un apel la o procedur. Dac
prin comanda Step Into s-ar trece n procedur pas cu pas, prin Step Over procedura este executat ca o unitate i
se trece apoi la instruciunea urmtoare n procedura curent. Pentru acest tip de operaiune se acioneaz butonul
Step Over din bara Debug.
Acest tip de aciune este util atunci cnd procedura apelat este verificat. Totui, dac n procedura apelat exist o
instruciune Stop sau este definit un punct de oprire, atunci execuia este stopat n acele locuri.

Utilizarea comenzii Step Out


Prin comanda Step Out se mrete viteza de parcurgere a secvenelor de cod n sensul c dac se tie c restul
instruciunilor dintr-o procedur nu pot crea probleme, atunci ele pot fi executate n bloc i nu pas cu pas. Se revine
n procedura apelant, la instruciunea urmtoare apelului. Pentru acest tip de operaiune se acioneaz butonul Step
Out din bara Debug.

Trecerea peste seciuni de cod


n modul break se poate selecta o instruciune oarecare, mai departe pe firul execuiei, i click pe Run To Cursor
din meniul Debug permite reluarea execuiei din punctul selectat. Se pot astfel sri secvene neinteresante de cod.

Stabilirea instruciunii urmtoare


O aciune similar celei descrise n seciunea anterioar este selectarea unei instruciuni oriunde n procedura
curent i click Set Next Statement din meniul Debug. Se pot astfel urmri doar anumite fire de execuie sau se
pot reexecuta anumite secvene pentru alte valori date variabilelor/proprietilor.

Indicarea instruciunii urmtoare


Prin click pe Show Next Statement din meniul Debug se plaseaz punctul de inserie n linia care urmeaz a fi
executat. Este o modalitate util mai ales cnd se depaneaz o secven error handler i nu se tie exact care este
urmtoarea instruciune. Comanda este disponibil doar n modul break.

Monitorizarea listei de apeluri (Call Stack)


Dialogul Call Stack, afiat prin meniul/bara de unelte Debug, arat o list a apelurilor active de proceduri.
Dialogul poate fi afiat doar n modul break. Apelurile active sunt cele care au iniiat proceduri care nu au fost
complet executate. Prin lista afiat se poate trasa ordinea de apeluri care au dus la instruciunea curent. Cu ct
asemenea lanuri de apeluri sunt mai lungi, cu att depanarea aplicaiei este mai dificil.
n lista din dialogul Call Stack toate apelurile active sunt prezentate ntr-o serie de apeluri nlnuite. Ea plaseaz
cea mai timpurie procedur apelat la baza listei i adaug apelurile urmtoare n topul listei. Informaia dat pentru
fiecare procedur ncepe cu numele modulului, urmat de numele procedurii. Prin butonul Show din dialog se
afieaz instruciunea dintr-o procedur care trece controlul aplicaiei ctre urmtoarea procedur din list.
Observaie. Deoarece dialogul Call Stack nu indic variabila asignat unei instane a unei clase, nu se poate
distinge ntre instane multiple ale claselor.

Testarea datelor i procedurilor cu fereastra


Immediate
n procesul de depanare sau de experimentare a unei aplicaii, este adesea necesar s se execute proceduri
individuale, s se evalueze expresii sau s se atribuie noi valori variabilelor sau proprietilor. Toate aceste aciuni
pot fi executate din fereastra Immediate. Expresiile sunt evaluate i rezultatele sunt tiprite n fereastra Immediate.

Tiprirea informaiilor n fereastra Immediate


Exist dou metode pentru tiprirea n fereastra Immediate

Includerea unor instruciuni Debug.Print n codul aplicaiei,

Introducerea direct n fereastra Immediate a instruciunilor care utilizeaz metoda Print.

Aceste tehnici ofer urmtoarele avantaje n raport cu utilizarea expresiilor urmrite:


Aplicaia nu trebuie oprit pentru a obine informaii. Datele i mesajele sunt afiate pe msur ce aplicaia se
execut.

Informaiile sunt afiate ntr-o fereastr separat (Immediate), nct nu se interfereaz cu ieirea
vzut de utilizatori.

Tiprirea din codul aplicaiei


Metoda Print trimite ieirea ctre fereastra Immediate atunci cnd se include calificarea cu obiectul Debug. De
exemplu
Debug.Print "Salary = "; Salary

Aceast tehnic lucreaz cel mai bine atunci cnd exist un loc particular n aplicaie n care variabila urmrit (aici
Salary) se modific. De exemplu, instruciunea anterioar poate aparine unei structuri repetitive.

Tiprirea din fereastra Immediate


Dac aplicaia este n modul break, se poate muta focalizarea n fereastra Immediate pentru a examina date. Aici se
pot evalua expresii valide, inclusiv expresii care se refer la proprieti. Modulul activ curent determin domeniul
de referin.
Orice instruciune care utilizeaz metoda Print poate fi nscris i la terminarea cu ENTER se va evalua expresia i
se va afia rezultatul. Un semn de ntrebare (?) poate nlocui metoda Print:
? ActiveDocument.Name

executat din Microsoft Word, afieaz n fereastra Immediate numele documentului Word activ.

Atribuirea de valori
n modul break, se pot atribui valori la proprieti i variabile. Urmtorul exemplu prezint o schem de utilizare a
ferestrei Immediate pentru calcule. Fiecare linie (cu excepia celor care afieaz rezultatele) se va termina cu
ENTER:
x
?
5
y
?
6

= 2
x+3
= 3
x*y

Se poate modifica valoarea unei proprieti sau a unei variabile din proiect i relua apoi executarea aplicaiei. Dac
Option Explicit este prezent n modulul curent, toate variabilele invocate n fereastra Immediate trebuie s fie
declarate n modul. Domeniul se aplic apelurilor de proceduri ca i variabilelor.

Testarea procedurilor cu fereastra Immediate


n fereastra Immediate se poate evalua orice instruciune executabil valid Visual Basic, dar nu se accept
declaraii de date. Se pot utiliza apeluri la proceduri care permit astfel testarea procedurii cu diverse seturi de
argumente.
X = Quadratic(2,8,8)
DisplayGraph 50, Arr1
Form_MouseDown 1,0,100,100

La apsarea tastei ENTER, Visual Basic comut la run time pentru a executa instruciunea i se ntoarce apoi n
modul break. n acest moment se pot vedea rezultatele i efectele asupra variabilelor i proprietilor.
Se poate apela orice procedur din forma activ curent, ca i orice procedur dintr-un modul, cu excepia cazului n
care procedura este Private, caz n care se poate apela doar n timpul executrii modulului.
O procedur poate fi executat n mod repetat, fiecare apel este meninut de Visual Basic ca o instan separat.
Aceasta permite testarea separat a diferitelor seturi de argumente. Dialogul Call Stack menine o list a
procedurilor executate de fiecare comand din fereastra Immediate. Se poate prin urmare utiliza Call Stack pentru
a selecta orice instan a procedurii i afia apoi valorile variabilelor din procedur.
Observaie. Dei cele mai multe instruciuni sunt suportate de fereastra Immediate, o structur de control este
permis doar dac poate fi exprimat complet pe o linie: se utilizeaz caracterul ":" pentru separarea instruciunilor
care alctuiesc structura de control.

Verificarea numerelor de eroare


Se poate utiliza fereastra Immediate pentru a afia mesajul asociat cu un numr specific de eroare. De exemplu,
tastarea instruciunii
Error 58

produce o caset cu mesajul asociat erorii


File already exists

Trucuri utile n fereastra Immediate


Dup introducerea unei instruciuni, aceasta se poate reexecuta prin mutarea punctului de inserie napoi n
instruciune i ENTER.
nainte de ENTER se poate edita instruciunea curent.
o

Se poate utiliza mouse-ul sau sgeile pentru a naviga n fereastra Immediate. Nu se apas
ENTER dect pe instruciunea care se execut.

CTRL+HOME mut punctul de inserie la linia de nceput a ferestrei; CTRL+END l mut la ultima linie.
Tastele HOME i END mut punctul de inserie la nceputul i, respectiv, sfritul liniei curente.

Consideraii speciale
Anumite evenimente care sunt o parte comun cu utilizarea Microsoft Windows pot s ridice probleme speciale
pentru depanarea unei aplicaii. Este important s fim contieni de aceste probleme pentru a nu complica procesul
de depanare.
Dac rmnem contieni de modul n care modul break poate pune evenimentele n dezacord cu ceea ce aplicaia
ateapt, avem o ans s gsim soluii. n anumite proceduri de evenimente, trebuie sutilizm instruciuni
Debug.Print pentru a monitoriza valorile variabilelor/proprietilor n loc s utilizm expresii santinel sau puncte
de oprire.

Oprirea execuiei n procedurile evenimentelor


MouseDown sau KeyDown
Dac se oprete execuia n timpul unei proceduri eveniment MouseDown, se poate lsa butonul mouse-ului sau
utiliza mouse-ul pentru alte taskuri. Cnd se continu execuia, totui, aplicaia presupune c butonul mouse-ului
este nc apsat. Nu se va obine evenimentul MouseUp pn cnd nu se apas din nou butonul mouse-ului i apoi
se elibereaz.
Cnd se apas butonul mouse-ului n run time, se oprete execuia n evenimentul MouseDown dac aici este un
breakpoint. n acest scenariu nu se va obine niciodat evenimentul MouseUp. Soluia este eliminarea breakpointului din procedura MouseDown.
Dac execuia se oprete n timpul procedurii KeyDown, se aplic din nou consideraiile anterioare. Dac exist un
breakpoint n procedura evenimentului KeyDown, nu se va obine niciodat evenimentul KeyUp.

Oprirea execuiei n procedurile evenimentelor


GotFocus i LostFocus
Dac se oprete execuia n procedurile evenimentelor GotFocus sau LostFocus, temporizarea sistemului de
mesaje poate cauza rezultate inconsistente. Pentru aceasta se vor utiliza instruciuni Debug.Print n locul punctelor
de oprire din procedurile care trateaz evenimentele GotFocus i LostFocus.

Distribuirea soluiilor Microsoft Excel


n acest capitol se discut probleme privind distribuirea soluiilor dezvoltate pentru Microsoft Excel . Pe lng
modul efectiv de distribuire sunt reamintite i operaiuni preparatorii cum ar fi protejarea codului, erori posibile etc.

Pregtirea soluiei pentru distribuire


n momentul n care s-a nchegat o soluie trebuie s se ia o serie de decizii n vederea distribuirii soluiei. Prima
decizie este cum s se mpacheteze proiectul: ca un simplu document sau ca un add-in (sau template n Word).
Dac se decide distribuirea ca un add-in, este important s se decid cum i cnd se va ncrca: automat sau la
cerere.
n sfrit, trebuie s se decid asupra modului de protejare a codului i, evident, asupra unei ultime verificri n
ceea ce privete corectitudinea codului (de obicei ultimul bug apare chiar nainte de punctul final al proiectului).

Alegerea modului de mpachetare a soluiei


Atunci cnd se ascrie o soluie n Visual Basic for Applications, se obine un proiect asociat unui document. La
distribuirea soluiei trebuie s se decid dac utilizatorul trebuie s aib acces la document i codul asociat sau
numai la cod.

Dac se dorete accesul att la document ct i la cod, se va distribui documentul adic document Word, caiet
Excel sau prezentare PowerPoint. Acest caz este frecvent la scrierea unei soluii verticale o soluie foarte
specific pentru un utilizator foarte specific. De exemplu, dac se creeaz n Microsoft Word un formular de testare
a performanei, atunci att documentul ct i codul care l automatizeaz trebuie s fie accesibil utilizatorului.
Dac, pe de alt parte, se dorete ca numai codul (proiectul) s fie accesibil, atunci se va distribui ca un add-in
(Microsoft Excel i PowerPoint) sau ca un template global (Word).
Observaie. Utilizatorii nu au acces la foile de calcul dintr-un add-in deoarece acestea sunt ascunse automat la
crearea unui add-in dintr-un caiet. n mod similar, atunci cnd o prezentare PowerPoint este organizat ca un addin, slide-urile sale sunt eliminate automat. Pentru o discuie suplimentar se va citi seciunea "Salvarea soluiei ca
un Add-in sau Global Template".
Se poate interzice accesul utilizatorului la documentul asociat proiectului, fie din cauz c documentul nu este
pentru utilizator, fie pentru c el conine date pe care utilizatorul nu trebuie s le modifice sau s le vad. Acesta
este cazul cnd soluia conine proceduri care extind i adapteaz setul de opiuni ale aplicaiei proceduri care
sunt proiectate s aib o larg aplicabilitate, independente de un document specific. De exemplu, dac se scriu
proceduri care automatizeaz sarcini de formatare a foilor de calcul, utilizatorul trebuie s aib acces la aceste
proceduri din orice caiet deschis, dar nu trebuie s acceseze caietul asociat proiectului.
La distribuirea soluiei ca un add-in sau template trebuie s se decid separat dac se va proteja codul proiectului.

Controlul ncrcrii unui Add-in sau Global Template


Dac se decide distribuirea soluiei proprii ca un add-in sau template, este normal s se decid momentul ncrcrii
acestuia. Utilizatorul poate ntotdeauna s ncarce un add-in utiliznd dialogul Template and Add-Ins sau AddIns (meniul Tools), dar nu aceasta este soluia cea mai bun. Sa alternativ se poate stabili ca un add-in sau
template global s se ncarce automat la pornirea aplicaiei. Sau, pentru a nu ncetini pornirea aplicaiei, se poate
alege ncrcarea ca rspuns la un eveniment anumit sau prin alegerea unei comenzi. n sfrit, se poate ncrca un
add-in sau un template global n mod programatic.

ncrcarea unui Add-In sau Global Template la start


Posibilitile unui add-in devin accesibile unui utilizator doar dup ce add-in-ul este ncrcat. De exemplu, cnd un
template global este ncrcat, Word mixeaz meniurile, barele de unelte, intrrile AutoText i macrourile din
template cu meniul Word. Din acest motiv se poate inteniona ca ncrcarea add-inului sau a template-ului s aib
loc la activarea aplicaiei Word, Excel sau PowerPoint.
Pentru a ncrca add-inuri sau template-uri n mod automat la pornirea aplciaiei, trebuie s se palseze n folderul
Office Startup, localizat de obicei pe calea "Program Files\Microsoft Office\ Office\Startup".
n Microsoft Excel se poate de asemenea palsa un add-in n folderul Xlstart sau n folderul desemnat ca un folder
de pornire alternativ. Acest fapt se realizeaz prin atribuirea unei ci i a unui nume de folder la cheia
HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\AltStartup
din Windows registry.

ncrcarea automat a unui Add-In n Microsoft Excel


prin comanda OPEN din Windows Registry
n plus fa de memorarea unui add-in ntr-unul dintre folderele de pornire (vezi seciuena precedent), se poate
utiliza comanda OPEN din Windows Registry pentru a specifica fiierele addn care se ncarc automat la pornirea
aplicaiei Excel.
Trebuie s se creeze cte o comand OPEN n cheia de registru
HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel
pentru fiecare fiier add-in. Pentru cazul mai multor fiiere se utilizeaz OPEN pentru primul fiier, OPEN1 pentru
al doilea, OPEN2 pentru al treilea etc.
Sintaxa pentru comanda OPEN este
OPEN =[ /Switch] pathandfilename

unde
/Switch poate fi /R sau /F. Comutatorul /R deschide fiierul read-only iar /F este utilizat pentru a cere ncrcarea
caietelor. Microsoft Excel citeste doar atta informaie dintr-un workbook ct este necesar pentru referirea
funciilor utilizator. Un exemplu este

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\OPEN = /R
"C:\OFFICE\OFFICE\LIBRARY\ANALYSIS\ANALYS32.XLL"

Comanda OPEN este suportat doar din motive de compatibilitate i este necesar pentru cererea de ncrcare a
macrourilor. Alternativ recomandat este prezentat ulterior n acest capitol, o dat cu Init Commands i Init
Menus.

ncrcarea automat a unui Add-In n Microsoft PowerPoint


utiliznd valoarea AutoLoad din Windows Registry
Operaiunea de ncrcare automat a unui add-in prin valorile din Windows Registry se poate efectua i n
PowerPoint, dar valorile fixate sunt altele dect n Excel.
Numele fiierului add-in se va da, n Windows Registry, ca subcheie fie sub HKEY_CURRENT_USER, fie sub
HKEY_LOCAL_MACHINE. Valoarea Path a cheii trebuie s fie locaia add-in-ului. Valoarea AutoLoad se va fixa
pe 1 pentru o ncrcare automat.

ncrcarea Add-In-urilor care au fost ncrcate n sesiunea precedent


Un add-in ncrcat i nregistrat n sesiunea curent Excel sau PowerPoint va fi ncrcat automat la o nou pornire a
aplicaiei.
Un template global ncrcat n Word rmne disponibil pentru sesiunea curent, dar nu este rencrcat automat la o
nou pornire a aplicaiei.
Observaie. Un add-in adugat listei din dialogul Add-Ins (utiliznd butonul Add New) din Excel sau PowerPoint
este nregistrat sub HKEY_CURRENT_USER. n continuare, aceste add-in-uri nregistrate vor fi accesibile doar
pentru utilizatorul intrat pe main n momentul adugrii.

ncrcarea programatic a unui Add-In sau Global Template


Colecia Addins permite instalarea prin program a unui add-in sau template global.
n Word sau Microsoft Excel se va stabili la True proprietatea Installed a obiectului Addin:
Addins("C:\\Gallery.dot").Installed = True

n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili la True pentru nregistrarea automat, aceeai
valoare dndu-se proprietii Registered pentru a nregistra add-in-ul.
With Addins("C:\\mytools.ppa")
.Loaded = True
.Registered = True
End With

ncrcarea programatic a unui add-in ca rspuns la un eveniment


Dac se dorete ncrcarea programatic a unui add-in ca rspuns la un eveniment, codul care comand aceast
operaiune se plaseaz n procedura de eveniment.

Deschiderea i ncrcarea programatic a unui template global


prin linia de comand
Se utilizeaz urmtoarea linie de comand, de exemplu, unde path este locaia fiierului Add-in.dot, pentru a instala
un add-in numit Add-in.dot, i executarea unei proceduri numit Main din modulul denumit Add-inInstall:
WinWord "<Path>\Add-in.dot" /mAdd-inInstall

Word are un numr de argumente pe linia de comand. Comutatorul /m execut codul din modulul specificat. De
notat c nu exist nici un spaiu dup "m" i c nu se specific procedura Main; doar o procedur denumit Main se
va executa, n lipsa unei asemenea proceduri nu se execut nimic la ncrcarea modulului. n continuare este un
exemplu de procedur Main.
' numele modulului este Add-inInstall, pentru a funciona cu
' linia de comand din exemplul anterior
Option Explicit
Sub Main()
'Check to see if Add-In is loaded in Add-In list
Dim wkbAddin As Word.AddIn
On Error GoTo ErrorHandler
Set wkbAddin = AddIns(ThisDocument.Name)
If wkbAddin Is Nothing Then
' Add the template to the add-ins collection and install it
Set wkbAddin = AddIns.Add(ThisDocument.FullName, True)
End If
' If template is the active document close it
If ThisDocument.Name = ActiveDocument.Name Then
' The Add-in should not be dirty
ThisDocument.Close

End If
Exit Sub
Errorhandler:
' Only ignore "Subscript out of range" errors
Select Case Err.Number
Case 9, 5941
Err.Clear
Resume Next
Case Else
' Assert the error when in Debug mode
#If DebugMode Then
AssertError
#End If
' Insert other error handling code here
End Select
End Sub

Descrcarea programatic a unui Add-in sau Template


Un add-in rmne ncrcat pn cnd se termin sesiunea curent, pn la descrcarea prin program sau pn la
descrcarea prin dialogul Add-Ins (sau Templates and Add-ins) activat prin meniul Tools. Prin descrcarea unui
add-in se salveaz memoria disponibil.
n Word sau Microsoft Excel, pentru descrcarea unui add-in sau template global, se stabilete la False proprietatea
Installed a obiectului Addin.
Addins(C:\\Gallery.dot").Installed = False

n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili pe False pentru descrcare, iar proprietatea
Registered se va stabili pe False pentru a nltura nregistrarea add-in-ului.

ncrcarea la cerere
ncrcarea unui add-in sau template la pornirea aplicaiei poate s creasc semnificativ timpul pornirii aplicaiei. Se
poate utiliza atunci ncrcarea la cerere pentru a amna ncrcarea pn atunci cnd utilizatorul apeleaz o comand
sau o procedur din add-in.
Este de menionat c wizard-urile i add-in-urile iniiate de o comand din menu sunt ncrcate, n mod automat, la
cerere.
Exist mai multe tehnici pentru a stabili ncrcarea la cerere, specifice diferitelor aplicaii.
Observaie. Dac se intenioneaz utilizarea unui add-in sau template ca o bibliotec de cod, apelat din alte
proiecte, nu trebuie ca aceasta s fie ncrcat explicit deoarece Visual Basic va ncrca add-in-ul sau template-ul
referit la cerere, atunci cnd o procedur din bibliotec este apelat.

Utilizarea referinelor explicite n Microsoft Excel


Prima metod de ncrcare la cerere este utilizarea unei referine explicite atunci cnd se atribuie un nume de macro
la o unealt. Urmtoarea linie cheam procedura MySub care st n modulul ThisWorkbook din caietul (add-in)
"C:\My Documents\MyTools.xla":
'C:\My Documents\MyTools.xla'!ThisWorkbook.MySub

Add-in-ul este ncrcat doar atunci cnd este executat macro-ul.


Pentru soluii care sunt distribuite utiliznd un program de instalare se va vedea seciunea "Adugarea de meniuri i
submeniuri la Microsoft Excel fr ncrcarea unui Add-In".

ncrcarea la cerere a bibliotecilor de funcii n Microsoft Excel


Dac se distribuie o soluie care conine o bibliotec de funcii macro ar fi de dorit ncrcarea la cerere a acestei
biblioteci. De asemenea, n mod normal este de dorit ca funciile s fie listate n Function Wizard. Pentru ncrcarea
la cerere a funciilor este nevoie de macro-uri XLM (Microsoft Excel 4.0 macro sheets). Aceste macro-uri sunt de
obicei doar "nveliuri" pentru funcii Visual Basic.
Atunci cnd Microsoft Excel vede c un Add-In este marcat pentru ncrcarea la cerere, el citete doar anteturile
macro-urilor funcii; raiunea de prezentare sub form XLM este aceea c informaia din anteturi poate fi citit fr
a ncrca Visual Basic for Applications (care se va ncrca doar atunci cnd este necesar).

Modificarea unui add-in pentru a beneficia de ncrcare la cerere


1. Se adaug la caietul add-in o foaie Microsoft Excel 4.0 macro: click dreapta pe un tab Worksheet
i selectare Insert, din dialog se va selecta Ms Excel 4.0 Macro.
Crearea unui macro funcie care nvelete o funcie Visual Basic.
n prima celul se scrie numele funciei.

n celula de sub numele funciei se insereaz funcia Argument(Name_Text,


Data_Type_ID).

Name_Text este numele parametrului. Ideal ar fi ca acesta s fie numele parametrului

funciei din VBA pe care se presupune c-l reprezint.


o

Data_Type_ID este ID-ul care determin tipul de dat pe care Excel l accept pentru acest

argument; acest parametru este opional.


Se repet paii b, c i d pentru fiecare parametru din funcia VBA.
o

Dac este necesar s se specifice tipul rezultatului se va utiliza funcia


Result(Data_Type_ID).

Funcia Return(value) semnaleaz sfnritul macro-ului funcie.

Se selecteaz toate celulele care conin macro-ul.


o

Se selecteaz Define din submeniul Name (meniul Insert).

Se denumete domeniul cu numele funciei.


o

Se selecteaz butonul radio Function din grupul Macro.

Click pe Add i apoi OK.

1. Se selecteaz Insert din bara de meniu i Define din submeniul Name. Se adaug numele
"__DemandLoad" care se refer la "=TRUE" (se tasteaz exact aa n boxa Refers To). Este de
observat c exist dou caractere "_" n faa lui DemandLoad. Click Add, apoi Close.
2. Se stabilete proprietatea IsAddin a obiectului Workbook la TRUE.
Se salveaz caietul.
n continuare este un exemplu de macro care nfoar o funcie VBA.
MyFunction
=ARGUMENT("szArgOne")
=ARGUMENT("intArgTwo")
=RETURN(vMyFunction(szArgOne, intArgTwo))

Funcia VBA fiind de forma


Function vMyFunction (szArgOne As String, intArgTwo As Integer) As String

End Function

Aceti pai permit ca add-in-ul s fie ncrcat la cerere. Dup ce este ncrcat, add-in-ul nu este descrcat din
memorie pn cnd se termin instana curent a aplicaiei Excel.

Adugarea meniurilor n Excel fr ncrcarea unui Add-in


Microsoft Excel are dou chei noi de registru, care sunt citite la pornirea aplicaiei i care creeaz intrri de meniu
oferind puncte de intrare ntr-un add-in; acest add-in se ncarc doar atunci cnd este cerut de o comand dintr-un
meniu, care se refer la add-in. Cheile respective sunt Init Menus i Init Commands. n continuare se prezint de
asemenea i cheia Delete Commands, care permite eliminarea unor intrri de meniu.

Cheia Init Menus


(HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Menus) conine cte o valoare String pentru
fiecare menu adugat unei mare de meniu built-in. Fiecare nume de valoare este unic i identific meniul creat.
irul are sintaxa:
Value_name = Menu_bar_num, Menu_name,Menu_position[, Menu_parent]
Argument

Descriere

Menu_bar_num

Numrul barei de meniu built-in la care se dorete


adugarea meniului. Barele de meniu se schimb
dup tipul foii active. Numerele sunt:
3 Nil menu bar (nu exist caiet deschis)

10 worksheet, dialog sheet, macro sheet 4.0


11 chart sheet
12 modul Visual Basic
Menu_name

Numele noului meniu

Menu_position

Poziia noului meniu pe bara meniu. Aceasta poate fi


numele unui meniu dup care se plaseaz cel nou, sau
un numr indicnd poziia noului meniu de la stnga
barei meniu.

Menu_parent

Este opional: dac se definete un submeniu, acesta


este numele sau numrul meniului care va conine
noul submeniu, definirea cruia fiind controlat de
restul parametrilor.

Cheia Init Comands


(HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Commands) conine cte o valoare de tip
string pentru fiecare comand adugat unui meniu. Fiecare nume de valoare este unic i identific comanda
adugat. irul are sintaxa
Value_name = Menu_bar_num,Menu_name,Command_name,Macro,
Command_position,[ Macro_key] ,[ Status_text] ,[ Help_reference]

parametrii fiind explicai n tabelul urmtor.


Argument

Descriere

Menu_bar_num

Numrul barei de meniu built-in la care se dorete


adugarea meniului. Barele de meniu se schimb
dup tipul foii active. Numerele sunt:
10 Worksheet, dialog sheet, macro sheet 4.0
11 Chart sheet
12 modul Visual Basic

Menu_name

Numele meniului sau submeniului. Submeniurile sunt


indicate printr-un ir "meniu\submeniu", caracterul
backslash delimitnd numele meniului de cel al
submeniului. Submeniul trebuie s fie existent deja
sau s fie declarat n cheia Init Menu.

Command_name

Numele noii comenzi.

Macro

Referina la o procedur dintr-un caiet add-in.


Alegerea comenzii deschide add-in-ul i execut
procedura. Procedura va terge comanda adugat de
aceast cheie de registru i o va nlocui cu o comand
care va executa procedura necesar.

Command_position

Poziia noii comenzi n meniu. Aceasta poate fi


numele unei comenzi dup care se plaseaz cea nou,
sau un numr indicnd poziia noii comenzi pe

meniu. Dac este omis, comanda apare la sfritul


meniului.
Macro_key

Este opional, cheia ataat procedurii, dac exist.

Status_text

Este opional, mesajul afiat n bara de stare atunci


cnd se selecteaz comanda.

Help_reference

Este opional, numele fiierului i numrul intrrii


pentru un Help ataat comenzii.

Cheia Delete Commands


Se poate utiliza cheia Delete Commands pentru a terge comenzi din meniurile buil-in. Add-In Manager
(comanda Add-Ins din meniul Tools) citete i scrie valori n cheia Delete Commands. Cheia conine cte un ir
pentru fiecare comand care este tears din meniu. Fiecare nume de valoare este unic i identific comanda
eliminat. irul are sintaxa
Value_name = Menu_bar_num,Menu_name,Command_position
Argument

Descriere

Menu_bar_num

Numrul barei de meniu built-in unde se dorete


modificarea meniului. Barele de meniu se schimb
dup tipul foii active. Numerele sunt:
3 Nil menu bar (nu exist caiet deschis)
10 worksheet, dialog sheet, macro sheet 4.0
11 chart sheet
12 modul Visual Basic

Menu_name

Numele meniu

Menu_position

Poziia comenzii pe bara meniu. Aceasta poate fi


numele unei comenzi sau un numr indicnd poziia
comenzii n meniu.

Observaie. Este recomandabil s nu se elimine comanda Exit din meniul File dac nu s-a creat o cale alternativ
de prsire a aplicaiei Microsoft Excel.

Scrierea codului executat la ncrcarea sau descrcarea


unui Add-in sau Global Template
Se poate scrie cod care s se execute ca rspuns la ncrcarea sau descrcarea unui add-in. De exemplu, atunci cnd
se ncarc un add-in se poate executa o procedur care s afieze o bar de unelte dnd acces la funciunile add-inului. n mod similar, la descrcarea add-in-ului, aceeai bar de unelte se poate elimina prin executarea unei
proceduri speciale. Fiecare aplicaie are totui un mod propriu de realizare a acestor aciuni.

Microsoft Excel evenimentele AddinInstall i AddinUninstall


Fiecare add-in are dou evenimente, AddinInstall i AddinUninstall, care sunt declanate la ncrcarea i,
respectiv, descrcarea add-in-ului, att prin dialogul Add-ins ct i programatic. Aceste evenimente sunt locurile
ideale de plasare a intrrilor n cheile Init Menus i Init Commands din Windows Registry.
Se poate utiliza evenimentul Open a unui caiet pentru a efectua nregistrarea caietului i adugarea lui la dialogul
Add-In. n urmtorul exemplu se prezint o structur general de utilizare a procedurilor evenimentelor
AddinInstall i AddinUninstall.
Option Explicit
Private Sub Workbook_AddinInstall()
' Add code to customize the Microsoft Excel User Interface (UI) here

MsgBox "Addin Installed"


End Sub
Private Sub Workbook_AddinUninstall()
' Add code to remove customization of the Microsoft Excel UI here
MsgBox "Addin Uninstalled"
End Sub
Private Sub Workbook_Open()
' Check to see if add-in is loaded in Microsoft Excel's AddIn list
Dim wkbAddIn As Excel.AddIn
On Error GoTo Errorhandler
Set wkbAddIn = AddIns(ThisWorkbook.Name)
If wkbAddIn Is Nothing Then
' Setting the CopyFile argument to true will cause the add-in
' to be copied to the local harddisk if it is on a removeable
' medium.
Set wkbAddIn = AddIns.Add(ThisWorkbook.FullName, True)
' Thenext line will cause the Workbook.AddInInstalled event
' to fire.
wkbAddIn.Installed = True
End If
' Initialize add-in here.
Exit Sub
Errorhandler:
' Only ignore "Subscript out of range" errors.
If Err.Number = 9 Then
Err.Clear
Resume Next
Else
' Assrt the error when in Debug mode.
#If DebugMode Then
AssertError
#End If
' Insert other error handling code here.
End If
End Sub

Verificarea final a codului


naintea mpachetrii soluiei ca un add-in sau un template global, este util o ultim verificare pentru eliminarea
unor erori frecvente, amintite n continuare.

Verificarea referinelor la ActiveWorkbook sau ActiveDocument


Reamintim c dac proiectul VB dintr-un add-in sau template global conine o referin explicit sau implicit la
documentul activ sau la caietul activ, el sa ve referi n execuie la acel document sau caiet care se va ntmpla s fie
activ n momentul aplicrii referinei. Pentru referina la add-in sau template se va utiliza prin urmare
ThisWorkbook sau ThisDocument.
De exemplu, ambele proceduri scrise n continuare apeleaz foaia denumit "Addin Definition" n caietul care este
activ n momentul execuiei codului. Prima procedur conine o referin explicit, prin ActiveWorkbook. A doua
procedur are o referin implicit: deoarece nu se refer explicit la un caiet anumit, referina este presupus n
caietul activ.
Sub ExplicitReference()
Set rMnuTable = ActiveWorkbook.Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub
Sub ImplicitCode()
Set rMnuTable = Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub

Urmtorul cod utilizeaz proprietatea ThisWorkbook pentru a realiza o referin la caietul n care se execut codul
adic n caietul add-in.
Sub CorrectCode()
Set rMnuTable = ThisWorkbook.Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub

Apelul rutinelor din alte proiecte


Dac se dorete apelarea unor funcii, proceduri i clase care sunt definite n alt proiect, proiectul apelant trebuie s
aib o referin la proiectul apelat. Este de notat c nu se pot crea referine la prezentri PowerPoint dect n cazul
n care acestea sunt salvate ca add-in-uri PowerPoint; dup salvarea ca un add-in prezentarea poate fi referit din
alte prezentri.

Este evident c pentru a utiliza referine la proiecte trebuie ca proiectele implicate s poarte denumiri diferite (de
regul, la nceputul utilizrii VBA, proiectele se las cu denumirile implicite). Numele implicit al unui proiect se
poate vedea/modifica fie n fereastra Properties, fie n Project Name din dialogul Project Properties (obinut prin
click dreapta n VBE i alegerea project name Properties).
Referina la un alt proiect se realizeaz manual prin dialogul References ( meniul Tools) sau programatic prin
metoda AddFromFile a coleciei References. Linia urmtoare stabilete o referin din caietul activ la proiectul
din add-in-ul MyTools.xla:
ActiveWorkbook.VBProject.References.AddFromFile "C:\Tools\MyTools.xla"

Este ns de notat c nainte de a stabili programamtic o referin, trebuie (n Word, Excel, PowerPoint) stabilit o
referin la biblioteca de tipuri Visual Basic for Applications Extensibility. Aceast bibliotec ofer obiectele care
permit lucrul programatic cu proiectul VBA.
Observaie. Rutina Auto_Open dintr-un add-in referit nu este executat la ncrcare prin referin dintr-un alt addin sau prezentare.

Evitarea referinelor nerezolvate


La salvarea i distribuirea unui add-in sau template, referinele stabilite pentru proiectul asociat rmn valabile.
Totui, dac add-in-urile sau abloanele referite nu sunt la aceleai locaii pe maina utilizatorului cum erau pe
maina de dezvoltare, referinele nu vor putea fi rezolvate la beneficiar i soluia nu va fi executat.
n Microsoft Excel, Visual Basic ncearc rezolvarea referinelor prin cutare n locaiile:
n acela folder cu add-in-ul sau template-ul apelant.
n folderul rdcin a aplicaiei gazd.
n folderul System i Windows.
n toate folderele variabilei de mediu Path.
n Microsoft Excel, Visual Basic privete de asemenea n folderele adugate la valoarea Add-in Path din registry.
Dac o referin nu este rezolvat dup completarea cutrii prezentate, execuia este oprit.
n continuare sunt enumerate cteva metode care pot fi utilizate n evitarea/rezolvarea referinelor nerezolvate.
Toate fiierele se vor livra n acelai folder. Aceasta este soluia comun.
n Excel se poate actualiza cheia de registry Add-ins Path. Microsoft Excel ofer cheia de registru
HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Add-in Path
care puncteaz ctre folderele unde Microsoft Excel privete pentru add-in-uri. Valoarea
Add-in Path este un ir care const din ci multiple delimitate de caractere ";". La
instalarea aplicaiei Excel, programul Setup adaug cile ctre folderele Library, Analysis
i Solver. Alte programe de instalare pot s modifice valoarea Add-in Path. Modificarea
trebuie s fie "politicoas": noile intrri se vor aduga celor existente. Programele de tip
uninstall trebuie s elimine doar poriunea din valoare adugat la instalare.
Adugarea folderului soluiei la variabila de mediu Path.
Se pot utiliza funciile API GetEnvironmentVariable i SetEnvironmentVariable
pentru adugarea temporar a folderului soluiei, sau se poate utiliza scrierea n
instruciunea Path din Autoexec.bat pentru o adugare permanent.
Exemplul urmtor utilizeaz funciile GetEnvironmentVariable i SetEnvironmentVariable pentru a modifica
temporar variabila de mediu Path.
Option Explicit
Private Declare Function GetEnvironmentVariable Lib "kernel32" _
Alias "GetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" _
Alias "SetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpValue As String) As Long
' AppWord is a user defined compile directive
#If AppWord = True Then
Public Sub AutoExec()

AppendEnvironmentPath ThisDocument
End Sub
#End If
'AppExcel is a user defined compile directive
#If AppExcel = True Then
Public Sub Workbook_Open()
AppendEnvironmentPath ThisWorkbook
End Sub
#End If
Private Sub AppendEnvironmentPath (ThisDocObject As Object)
Const ENV_PATH As String = "Path"
Dim iRet As Long
Dim szPath As String
SzPath = String(1024, 0)
' Retrieve the current environment setting.
IRet = GetEnvironmentVariable(ENV_PATH, szPath, 1024)
If iRet Then
' iRet contains the length of the returned string.
' trim any trailing characters
szPath = Mid$(szPath, 1, iRet)
' See if the template path is included in the path statement.
If InStr(1,szPath, ThisDocObject.Path, vbTextCompare) = 0 Then
' Path is not part of the environment.
szPath = szPath & ";" & ThisDocObject.Path
iRet = SetEnvironmentVariable (ENV_PATH, szPath)
If iRet = 0 Then
' Handle error here. Template path was not appended to
' environment.
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"Path environment was not set."
End If
End If
Else
' should raise an error here. This should never happen
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"No path environment was found."
End If
End Sub

Se poate scrie un add-in agent de referin (reference broker) care s adapteze referinele
pentru a main specific. Un asemenea agent de referin ar trebuie s verifica referina i
s lege nainte ca soluia s se execute (sau la momentul ncrcrii). Acest tip de
component este bun pentru soluii trietajate (three-tier). Agentul trebuie s lege dinamic
componenta front-end de componenta back-end pe baza versiunii, nivelului de securitate
sau ali parametri determinai de administrator. Aceast tehnic poate fi utilizat la
actualizarea automat a componentelor. O cale pentru determinarea dac o referin este
valid este utilizarea proprietii IsBroken a obiectului Reference. Proprietatea IsBroken
este True dac referina nu se refer la o intrare valid n Windows Registry.

Apelul unei rutine dintr-un Add-in PowerPoint fr fixarea unei referine


Dac se dorete ncrcarea temporar a unui fiier add-in i executarea unei rutine din fiier, se va utiliza o
instruciune Application.Run i imediat apoi se va descrca fiierul add-in. La executarea Application.Run,
Microsoft PowerPoint va ncrca add-in-ul i Va executa macroul specificat. Pentru a descrca fiierul se utilizeaz
proprietatea Loaded, dup modelul:
Sub CallAddInMacro()
Application.Run "\MyAddIn.ppa!MyMacro"
AddIns("MyAddIn").Loaded = False
End Sub

Ultima instruciune poate fi nlocuit i cu


AddIns(AddIns.Count).Loaded = False

Apelul rutinelor folosind referine legate trziu


Se poate apela orice procedur public, proprietate sau variabil din modulul ThisDocument sau ThisWorkbook
al unui document sau caiet utiliznd o referin trzie la obiectul asociat Document sau Workbook. De exemplu,
urmtoarele instruciuni atribuie obiectul Document, returnat de Open, unei variabile obiect. Dup aceea se
apeleaz procedura MySub din modulul clas ThisDocument al documentului:
Dim objDoc As Object
Set objDoc = Documents.Open(szFileName)
objDoc.MySub

Dac documentul reprezentat de variabila objDoc nu are, n modulul su ThisDocument, o procedur public
denumit MySub, atunci apare o eroare de execuie. n acest mod se poate apela cod doar din module

ThisDocument sau ThisWorkbook. Dac se dorete apelul unor proceduri din alte module, clase sau forme ale
proiectului asociat documentului/caietului deschis, se vor scrie proceduri intermediare n modulul ThisDocument
sau ThisWorkbook pentru a le accesa.
Observaie. Procedeul descris nu funcioneaz n PowerPoint deoarece nu exist un modul ThisPresentation n
proiect.

Protejarea sau neprotejarea codului


Stabilirea proprietii IsAddin nu protejeaz codul surs al proiectului. Pentru protejarea codului se va marca Lock
project for viewing (meniul Tools, project Properties, fia Protection) i se va fixa o parol. Dac se fixeaz doar
parola, fr blocarea accesului la cod, acesta poate fi vzut dar nu pot s deschid dialogul project Properties fr
cunoaterea parolei. Dup stabilirea parolei proiectul se va salva obinuit prin Save (meniul File din Visual Basic
Editor).
Pentru nlturarea proteciei se va elimina marcarea boxei de control Lock project for viewing i parola introdus.

Salvarea soluiei ca un Add-in sau Global Template


Fiecare aplicaie din Microsoft Office are un mod propriu de creare a unui add-in. n Microsoft Excel i PowerPoint
se salveaz fiierul ntr-un format specific. n Word se salveaz documentul ca un fiier template (.dot).

Crearea unui Add-in n Excel


La transformarea unui caiet ntr-un add-in, foile caietului sunt ascunse i procedurile din proiect sunt ascunse
utilizatorului (procedurile nu mai apar n dialogul Macros).
Pentru crearea unui add-in Excel, se fixeaz pe True proprietatea IsAddIn a caietului care conine codul. O cale de
realizare a acestui lucru este salvarea unei copii a caietului respectiv ca un add-in Excel prin selectarea tipului de
fiier Microsoft Excel Add-In (*.xla) n dialogul Save As.
Proprietatea poate fi stabilit i manual din VBE: se selecteaz "ThisWorkbook" n Project Explorer i se modific
proprietatea IsAddIn n Properties Window. Dup ce proprietatea IsAddIn este fixat pe True, caietul este ascuns
n Microsoft Excel.
Proprietatea se poate stabili i programatic.
Observaie. Dac este nevoie s se modifice elementele caietului dup crearea add-in-ului, se fixeaz proprietatea
IsAddIn la False, caietul devine vizibil i editabil. Dup modificare se reface proprietatea IsAddIn i se salveaz
caietul.

Depanarea unui Add-in sau Global Template


Pentru depanare se utilizeaz, cu unele particulariti, deprotejarea codului i efectuarea aciunilor uzuale de
verificare a codului.

Depanarea unui Add-in Excel


Pentru depanarea unui add-in Excel o dat ncrcat, se nltur protecia proiectului respectiv. Dac este necesar s
se vad caietul asociat se fixeaz proprietatea IsAddIn la False.

S-ar putea să vă placă și