Sunteți pe pagina 1din 83

Programarea aplica iilor Microsoft Office (Visual Basic for Applications)

Introducere
VBA (Visual Basic for Applications) este un limbaj de programare creat de Microsoft pentru automatizarea aplica iilor. Ataat ini ial componentelor din Microsoft Office, n prezent sunt raportate peste 200 de aplica ii 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 esen ial n versiunea complet VB, oferind suport pentru limbaj, interfa a pentru forme, controale, obiecte, tehnologii de accesare a datelor. Atunci cnd este gzduit de alt aplica ie, cum ar fi Excel, VBA ofer mijloacele de interac iune cu obiectele aplica iei gazd. In acest caz, VBA permite dezvoltatorilor s furnizeze solu ii complete care extind i/sau integreaz aplica iile gazd. Pentru a programa n VBA trebuie totui re inut c o cerin supli-mentar fa de alte limbaje este aceea c trebuie s se cunoasc aplica ia 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 licen iaz VBA pentru utilizarea n alte aplica ii software

Editorul Visual Basic


n aceast sec iune 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 aplica iilor 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 aplica ii similare celor dezvoltate n alte medii de programare, avnd ns la dispozi ie componentele aplica iilor din Office. Cu alte cuvinte, nu este vorba de o limitare a posibilit ilor de prelucrare, ci o poten are a acestora prin apelul posibil la obiectele din Office. O obiec ie la utilizarea VBA este aceea c proiectul se poate executa doar dintr-o aplica ie 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 aplica ie necesit o interfa utilizator (puternic n Microsoft Office) i c aplica iile de baz sunt ntre inute 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 aplica ii RAD.

Interfa a grafic VBE


Pentru a deschide editorul VB, mai nti se va porni o aplica ie din Microsoft Office, apoi se poate ac iona combina ia Alt+F11 (dac nu a fost atribuit altei opera iuni), sau butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizat ntr-o aplica ie Office, sau Meniul Tools, Macro, Visual Basic Editor.

Interfa a 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 propriet ilor 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 n elege o caracteristic a respectivului obiect (cum ar fi culoarea sau vizibilitatea etc.). Fixarea valorii propriet ii se reflect n aparen a obiectului sau n comportamentul lui (de exemplu, fixarea propriet ii ShowSpellingErrors la valoarea True arat n document erorile de scriere). Fereastra Properties poate fi utilizat, n momentul proiectrii, pentru a vizualiza toate propriet ile 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 propriet ile modificabile ale obiectului selectat, n ordine alfabetic. Se poate modifica valoarea unui atribut prin selectarea numelui propriet ii i tastarea sau selectarea noii valori. n fia Categorized sunt listate propriet ile 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, referin ele. 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 interfa a 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 nso it, 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 apar in 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. Ac ionarea 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. Con inutul 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 sec iunea dedicat depanrii programelor.

Immediate Window
Permite scrierea i execu ia imediat a unei linii de cod. Linia poate fi copiat n i dintr-o fereastr de cod. n modul de execu ie Break, instruc iunea din fereastra Immediate este executat n contextul procedurii afiate n Procedure Box. Pentru ac iunile 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 sec iunea dedicat depanrii programelor.

Scrierea procedurilor
Instruc iunile unui proiect se pot nscrie, dup modul lor de creare, n dou mari categorii: scrise de aplica ia de baz (Word, Excel etc.) prin traducerea ac iunilor interfe ei utilizator (meniuri, comenzi etc.) n cod VBA. Aceast opera iune este cea de nregistrare a unui macro. scrise ntr-o fereastr de cod de ctre utilizator (proiectant), cu asisten a mediului VBE.

nregistrarea unui macro


Ac iunea este util att prin aceea c opera iuni simple pot fi traduse uor n instruc iuni 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, propriet ilor i metodelor aplica iei. Pentru a nregistra un macro:

Se afieaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite). Pe bara Visual Basic se ac ioneaz 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 ac iunile menite s fie nregistrate/traduse n VB, n succesiunea dorit.

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

Pentru a vedea liniile de cod generate, se deschide n aplica ia 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 op iunile definitorii (subrutin sau func ie, 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, ac ionarea unui buton etc.), trebuie s se scrie o procedur asociat evenimentului respectiv. O asemenea procedur se va numi procedura evenimentului. Anumite obiecte din aplica iile 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 sec iunea din Help pentru fiecare aplica ie), doa principalele obiecte, cu propriet ile, metodele si evenimentele lor, sunt prezentate i n acest curs, n capitole separate. Modul cum aplica ia 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. Observa ie. 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 sec iunea (General) a documentului respectiv (de exemplu o rutin care s poat fi apelat din mai multe proceduri de eveniment).

Unelte VBE pentru scrierea instruc iunilor


Deoarece multe dintre denumirile obiectelor, propriet ilor 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 ac iuni, executate automat la completarea unei linii de cod: verificarea automat a sintaxei Auto Syntax Check; obligativitatea declarrii tuturor variabilelor, adugarea automat a instruc iunii Option Explicit la orice nou modul Require Variable Declaration; afiarea unei liste cu informa ii utile (logice la pozi ia curent a cursorului) la completarea instruc iunii Auto List Member; afiarea informa iei 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 l imii ntre pozi iile tabulatorului, 1 la 32 de spa ii (implicit fiind 4) Tab Width. Pe bara de unelte Edit exist cteva butoane, care ajut la completarea cuvintelor i expresiilor n timpul scrierii instruc iunilor: List Properties/Methods deschide o cutie n fereastra Code cu propriet ile 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 inser ie, o cutie cu constantele permise pentru proprietatea care precede semnul egal ("=") n instruc iunea curent. Quick Info ofer, ca ajutor, sintaxa pentru o variabil, func ie etc. prin analiza locului punctului de inser ie pe linia curent. Parameter Info arat o cutie, la punctul de inser ie, cu informa ia despre parametrii func iei 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 inser ie este n procedur i se ac ioneaz butonul Run Sub/UserForm de pe bara de unelte Standard sau Debug; ca un macro, Run din dialogul Macros (Tools - Macro) al aplica iei de baz;

apelat din alt procedur. La apelul unei proceduri din alt procedur se va ine seama de interac iunea declara iilor Public, Private, ca i de referin ele la alte proiecte (meniul Tools - References).

Instruc iunile 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 con ine 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 execu ie 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: Observa ii. 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: Observa ii.

Currency
Domeniu de valori: -922 337 203 685 477.5808 922 337 203 685 477.5807 Memorie: 8 bytes Declarator de tip: @ Observa ii. Utilizate pentru calcule bneti (sau alte situa ii n care precizia este foarte important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a ob ine 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: Observa ii. Informa iile de tip dat calendaristic i/sau timp orar sunt memorate drept numere flotante, partea ntreag reprezentnd data calendaristic, partea frac ionar reprezentnd timpul. La convertiri, miezul nop ii 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 observa iile) Memorie: 12 bytes Declarator de tip: Observa ii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nso i i 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 func ia Cdec (func ia for eaz o expresie s fie de un tip specificat, din aceeai categorie de func ii 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: # Observa ii.

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

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

Object
Domeniu de valori: (vezi observa iile) Memorie: 4 bytes Declarator de tip: Observa ii. Adrese pe 32 de bi i care se refer la obiecte. Prin instruc iunea Set se atribuie unei variabile declarate de tip Object referin a la obiectul dorit. Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataare trzie (la timpul execu iei 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: ! Observa ii.

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: $ Observa ii. 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 men iunea c toate subtipurile numerice au domeniul de la Double. Memorie: n func ie 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: Observa ii. Este tipul specificat implicit (n lipsa unei declara ii explicite) pentru o constant, variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferen ele de tip ale argumentelor la apelul procedurilor). Cu excep ia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul Variant poate con ine orice alt tip de dat. n plus poate s con in valorile speciale Empty, Error, Nothing i Null. Tipul considerat pentru o dat con inut ntr-un Variant poate fi determinat cu func ia 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 opera ii necesit acest fapt. De exemplu o valoare declarat ini ial 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 diferen iat a irurilor de cifre: n opera ii numerice vor fi considerate numere iar n opera ii cu iruri vor fi considerate iruri. Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite. Valorile speciale au semnifica ia: Empty este valoarea unui Variant care nu a fost ini ializat. n calcule numerice este considerat 0 iar n opera ii cu iruri este irul de lungime zero. Null este valoarea unui Variant care, n mod programatic, nu con ine date. Error este valoarea utilizat pentru a arta ndeplinirea unei condi ii de eroare (prin convertirea unui real cu func ia 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 entit i de tipuri diferite. Definirea are loc la nivel de modul, prin instruc iuni Type. Pentru clauzele care apar se va vedea discu ia 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 defini iile 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 spa iu, 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 func ii, instruc iuni sau metode existente n Visual Basic. Dac s-a ajuns totui la aceast situa ie, atunci utilizarea func iei intrinseci limbajului, a instruc iunii 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 func ia Left atunci cnd este definit de utilizator i o variabil Left. Not. Visual Basic nu este case-sensitive, deci denumirea unei entit i nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA pstreaz capitalizarea din instruc iunea unde este definit un nume.

Declararea constantelor
Definirea unei constante se realizeaz prin instruc iunea 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, op ional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din toate modulele. Nu este permis n proceduri. Private cuvnt cheie, op ional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din modulul n care apare declara ia. 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 combina ie de identificatori, constante, operatori (cu excep ia Is) care produce un sir, numr sau obiect. Nu se pot utiliza variabile, func ii utilizator sau func ii 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 declara ii 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 instruc iunile 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 con ine instruc iunea Option Explicit cu sintaxa Option Explicit i care trebuie s apar naintea oricrei proceduri din modul, toate variabilele trebuie s fie declarate prin instruc iunile men ionate. Lipsa instruc iunii Option Explicit permite ca variabilele s fie definite acolo unde este nevoie de ele prin simpla men ionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim posibilitate poate produce erori greu detectabile.

Sintaxa instruc iunilor 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, separa i prin virgule, declararea dimensiunilor pentru un indice fiind de forma [lower To] upper Limita inferioar este, implicit, 0, dar poate fi controlat prin instruc iunea 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 instruc iunea 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 instan elor 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 instruc iune, defini iile se separ prin virgul iar clauza de tip nu este extins i la variabilele definite ulterior. Dei toate instruc iunile permit declararea unor variabile (simple sau tablou), fiecare instruc iune are un efect distinct n ceea ce privete vizibilitatea variabilelor i persisten a 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 aplica iile. Prin includerea instruc iunii 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 execu ie 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 n elege, similar altor limbaje de programare, o mul ime de instruc iuni 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 informa ii 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 func iei) i poate fi utilizat ca orice alt variabil din proiect. Observa ie. Orice instruc iune executabil trebuie s apar in unei proceduri. Declara iile 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]) [instruc iuni] [Exit Sub] [instruc iuni] End Sub Public, Private, Static determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate modulele (n func ie 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 instruc iunea 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 op ionali trebuie s fie grupa i la sfritul listei (apari ia clauzei Optional cere ca to i 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 op ionale. 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 discu ia privind vizibilitatea) se men ioneaz, 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 defini ia procedurii. n cazul procedurilor cu multe argumente, dintre care multe op ionale, transferul poate provoca erori de scriere a codului (un argument op ional necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situa ii (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 ini ial a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adic valorile op ionale dorite i toate valorile neop ionale). Pentru apelul unei proceduri se va studia i instruc iunea Call.

Proceduri Function
O procedur de tip Function este similar, ca defini ie, 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 func iei (adic valorii func iei) i se va remarca existen a instruc iunilor prin care se atribuie func iei valorile calculate. Valoarea returnat de o func ie poate fi utilizat ntr-o alt expresie prin includerea numelui func iei urmat, ntre paranteze, de valorile efective ale parametrilor. Dac apelul se face prin intermediul instruc iunii Call, valoarea func iei nu poate fi utilizat. n asemenea situa ii 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 func iei poate fi ntr-o instruc iune 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 aplica ii 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 (ac iunilor) unor aplica ii particulare (Word, Excel etc.), proiectele sunt salvate o dat cu documentele pe care le nso esc. Acest fapt nu reduce aria de probleme abordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nso it (se poate deschide astfel un document Word alb i s se efectueze orice prelucrare dorit, fr a avea obliga ia de a scrie ceva n documentul deschis). ntr-un proiect VBA sunt identificabile urmtoarele componente: Module standard (denumite ini ial module de cod). Con in declara ii i proceduri generale. Exist de asemenea i module care con in tratarea evenimentelor specifice documentului de care este ataat proiectul. Module de clas. Con in definirea obiectelor create de utilizator. Forme. Con in defini iile dialogurilor din interfa a proiectat de utilizator ca i codul program necesar controlrii dialogurilor. Referin e. ntr-un proiect este men inut lista altor proiecte, care sunt referite n proiectul curent. Un modul de cod poate ncepe cu o sec iune de declara ii. Prin declara ii n elegem instruc iuni neexecutabile prin care se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeaz i domeniul de vizibilitate a entit ilor definite. Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat ntr-o sec iune separat.

Domeniul unei variabile, constante sau proceduri


Domeniul unei entit i reprezint mul imea instruc iunilor unde poate fi referit acea entitate. Se poate vorbi astfel de vizibilitatea unei entit i. Domeniul este dependent de locul definirii entit ii, de clauzele care apar la definire i de parametrii globali ai proiectului. Not. Este de remarcat c utilizarea unei denumiri n afara domeniului ini ial prefigurat produce, n lipsa instruc iunii Option Explicit, crearea unei noi entit i, 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 sec iunea 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 instruc iunea Option Private Module (n sec iunea Declarations a modulului) atunci variabilele i procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declara ii, 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 defini ie, 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 excep ie procedurilor de tratare a evenimentelor, care sunt Private n mod implicit. A se vedea i nota anterioar.

Viata unei variabile


Prin via a unei variabile se n elege timpul ct variabila are o valoare. Este evident c valoarea unei variabile se poate modifica pe durata vie ii sale, dar definitoriu este faptul c variabila are o anumit valoare pe ntreaga durat a vie ii sale. La prsirea domeniului, variabila "moare" i nu mai are ataat o valoare. La nceputul execu iei unei proceduri, toate variabilele sunt ini ializate: Variabil numeric ir de lungime variabil ir de lungime fix 0 (zero) "" (ir de lungime zero) Completat cu caracterul Chr(0) (avnd codul ASCII 0) Empty fiecare element este ini ializat separat, potrivit tipului primar Nothing (pn la asignarea unei referin e prin Set)

Variabil Variant Variabile de tip utilizator

Variabil Object

Variabilele care nu sunt modificate i pstreaz valoarea ini ial. Variabilele declarate prin Dim la nivel de procedur au valoare pn la terminarea execu iei 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 execu iei codului (inclusiv de la un apel la altul). Includerea clauzei Static n instruc iunea 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 execu iei. Variabilele declarate la nivel de modul clas i pstreaz valoarea att timp ct exist o instan a clasei. Diferen a 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 existen a obiectului, nu se poate verifica utilizarea corect a propriettilor i metodelor obiectului i nu se poate lega aceast informa ie de variabila obiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execu iei i se efectueaz prin instruc iunea 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 propriet ilor obiectului. Instruc iunea Set are sintaxa: Set objectvar = {[New] objectexpression | Nothing} unde

objectvar este numele variabilei (sau propriet ii) New permite crearea unei noi instan e a clasei Objectexpression este o expresie constnd n numele unui obiect, alt variabil declarat de acelai tip obiect, sau func ie 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 instruc iuni se definete variabila objWord care este legat trziu de o aplica ie 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 instruc iunea Set apeleaz o func ie care creeaz i returneaz o referin la un obiect ActiveX.

Constante predefinite (builtin)


Bibliotecile de obiecte din fiecare aplica ie Office furnizeaz o mul ime de constante predefinite, care pot fi utilizate pentru a stabili proprietti sau pentru a transmite argumente ctre propriet i 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 aplica iilor 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 execu ia unei proceduri. Codul scris astfel este i mai explicit.

Instruc iunile VBA


Exist trei categorii de instruc iuni Visual Basic: instruc iuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru variabile, constante i proceduri; instruc iuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor; instruc iuni executabile (prezentate n continuare) care ini iaz ac iuni: execut metode sau proceduri, controleaz fluxul execu iei codului. n mediul de dezvoltare VBA, sintaxa instruc iunilor este verificat automat dup ce se trece la instruc iunea urmtoare (prin Enter).

Continuarea instruc iunilor


O instruc iune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de un spa iu. 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 colec ia de tabele a documentului.

Dou instruc iuni 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 combina ie de cifre, care ncepe n prima coloan a liniei i este unic n modulul respectiv. Identificatorii de linii pot fi utiliza i n instruc iuni 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 spa iu. Comentariul de pe aceeai linie cu o instruc iune se introduce printr-un apostrof urmat de comentariu.

Operatori
n formarea expresiilor de diverse tipuri, operatorii sunt cei utiliza i aproape general n limbajele de programare de nivel nalt. Pentru fixarea termenilor i nota iilor sunt totui prezenta i, pe categorii, nso i i, acolo unde este cazul de scurte explica ii.

Operatori aritmetici
Operator ^ Semnifica ie Ridicarea la putere nmul irea Observa ii rezultatul este Double sau Variant(Double) cu excep ia: dac un operand este Null, rezultatul este tot Null rezultatul este dat de cel "mai precis" factor, ordinea cresctoare a "preciziei" fiind, pentru nmul ire, Byte, Integer, Long, Single, Currency, Double i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help *(operator). rezultatul este, n general, Double sau Variant(Double). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help /(operator). nainte de mpr ire, operanzii sunt rotunji i 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. operanzii sunt rotunji i la ntregi i se ob ine restul mpr irii. 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. 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

mpr irea

mpr irea ntreag

Mod

Restul mpr irii

Adunarea numeric sau concatenarea irurilor

+(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 excep ii se va studia Help -(operator).

Operatori de comparare
Rela iile care exist ntre diferite tipuri de entit i se pot eviden ia prin compara ii 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 rela ional 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 rela ia), False (dac rela ia este neadevrat), Null (dac cel pu in 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 observa ia 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 instruc iunea 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. Construc ia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere: ? * # un caracter oarecare oricte caractere (chiar nici unul) o cifr oarecare (09). oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea orice caracter care nu este n list

[charlist] cratimei. [!charlist]

Observa ie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construc ii de tip list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ]. Pentru alte observa ii 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 opera iile logice sunt utiliza i urmtorii operatori, uzuali n programare.

Operator And

Semnifica ie conjunc ia logic

Observa ii Null cu False d False, Null cu True sau cu Null d Null. Operatorul And realizeaz i opera ia de conjunc ie bit cu bit pentru expresii numerice. Dac o expresie este Null, rezultatul este Null. Eqv realizeaz i compararea bit cu bit a dou expresii numerice, pozi ionnd cifrele binare ale rezultatului dup regulile de calcul ale echivalen ei logice: 0 Eqv 0 este 1 etc. 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, pozi ionnd cifrele binare ale rezultatului dup regulile de calcul ale implica iei logice: 1 Imp 0 este 0, n rest rezultatul este 1. Not Null este Null. Prin operatorul Not se poate inversa bit cu bit valorile unei variabile, pozi ionndu-se corespunztor un rezultat numeric. Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaz i o compara ie bit cu bit a dou expresii numerice pozi ionnd bi ii corespunztori ai rezultatului dup regulile lui Or logic. Dac un operand este Null, atunci rezultatul este Null. Se poate efectua opera ia de sau exclusiv i bit cu bit pentru dou expresii numerice [b1+b2(mod 2)].

Eqv

echivalen a logic

Imp

implica ia logic

Not

nega ia logic

Or

disjunc ia logic

Xor

disjunc ia exclusiv

Instruc iuni de atribuire


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

Instruc iunea 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. Observa ii. 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 excep ia 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 situa ii se va utiliza instruc iunea Lset. Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n aceast situa ie instruc iunea Set.

Instruc iunea 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 instruc iunea 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 spa ii, iar dac zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate).

Instruc iunea 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 spa ii. Instruc iunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator.

Instruc iuni executabile


Execu ia unui program are loc, n lipsa oricrui control, instruc iune cu instruc iune, de la stnga la dreapta i de sus n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a opera iilor 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 execu iei. Unele instruc iuni au fost pstrate doar din motive de compatibilitate cu versiunile ini iale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare.

Instruc iuni de transfer (GoSubReturn, GoTo, OnError, OnGoSub, OnGoTo)


Aceast categorie cuprinde instruc iunile prin care controlul execu iei este transferat la o alt instruc iune 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 instruc iuni poate fi organizat ca o subrutin (similar unei proceduri on-line, nenumite) identificat prin linia de nceput. Transferul controlului la acest grup de instruc iuni 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 instruc iuni Return, prima executat produce saltul la instruc iunea care urmeaz celei mai recente instruc iuni GoSub executate.

GoTo
Realizeaz tranferul controlului execu iei 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. Observa ie. Este prezentat n sec iunea 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 instruc iunea. 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 instruc iunea On...GoSub sau On...GoTo.

Instruc iuni de terminare sau oprire a programului (DoEvents, End, Exit, Stop)
Terminarea execu iei programului sau oprirea temporar (pauza) se pot realiza prin instruc iunile enumerate aici.

DoEvents
Dei nu este o instruc iune VBA ci este o func ie, includerea ei este natural prin aceea c permite cedarea controlului ctre sistemul de operare, care poate astfel s func ioneze n regim de multitasking. Ac iunea poate fi realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este

DoEvents( )
Func ia 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. Observa ie. Pentru alte observa ii se va studia documenta ia comenzii DoEvents.

End
Termin execu ia 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 execu iei, este:

End
Prin aceast instruc iune, care poate fi plasat oriunde n program, execu ia este terminat imediat, fr a se mai executa eventualele instruc iuni 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 referin ele din alte aplica ii la asemenea obiecte sunt invalidate. Memoria este eliberat.

Exit
Prin instruc iunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execu ie (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 instruc iunea End.

Stop
Efectul instruc iunii este dependent de modul de execu iei a programului. Dac se execut varianta compilat a programului (fiierul .exe) atunci instruc iunea este similar instruc iunii End (suspend execu ia i nchide fiierele deschise). Dac execu ia este din mediul VBA, atunci se suspend execu ia programului, dar nu se nchid fiierele deschise i nu se terge valoarea variabilelor. Execu ia poate fi reluat din punctul de suspendare. Stop Instruc iunea 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 construc iilor de tip bloc prezentate n aceast sec iune se poate repeta, n mod controlat, un grup de instruc iuni. n cazul unui numr nedefinit de repeti ii, condi ia 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 instruc iuni 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 condi ie (despre care se presupune c poate fi modificat n instruc iunile executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condi iei 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 condi ie care este Null se consider False. statements sunt instruc iounile care se repet atta timp (while) sau pn cnd (until) condi ia devine True. Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruc iune 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 condi ia din enun ntruct execu ia 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. Execu ia structurilor este explicat n tabelul urmtor Do WhileLoop Testeaz condi ia la nceputul buclei, execut bucla numai dac rezultatul este True i continu astfel pn cnd o nou evaluare produce False. Testeaz condi ia la nceputul buclei, execut bucla numai dac rezultatul este False i continu astfel pn cnd o nou evaluare produce True. Se execut ntotdeauna bucla o dat, se testeaz condi ia la sfritul buclei i se repet bucla att timp ct condi ia este True. Oprirea este pe condi ie fals. Se execut ntotdeauna bucla o dat, se testeaz condi ia la sfritul buclei i se repet bucla att timp ct condi ia este False. Oprirea este pe condi ie adevrat.

Do UntilLoop

DoLoop While

DoLoop Until

ForNext
Atunci cnd se cunoate numrul de repetri ale unui bloc de instruc iuni, 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 ini ial 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 instruc iunile care se repet. Dac nu se specific, atunci singura ac iune este cea de modificare a contorului de un numr specificat de ori.

Ac iunea este dictat de pasul de incrementare i rela ia dintre valoarea ini ial i cea final. Instruc iunile din corpul structurii se execut dac counter <= end pentru step >= 0 sau counter >= end pentru step < 0. Dup ce toate instruc iunile s-au executat, valoarea step este adugat la valoarea contorului i instruc iunile se execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima instruc iune 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 situa ii, structurile mbricate trebuie s aib variabile contor diferite. Instruc iunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul execu iei se transfer la prima instruc iune de dup linia Next.

For EachNext
Similar structurii ForNext, structura For EachNext repet un grup de instruc iuni pentru fiecare element dintro colec ie de obiecte sau dintr-un tablou (cu excep ia celor de un tip utilizator). Este util atunci cnd nu se cunoate numrul de elemente sau dac se modific, n timpul execu iei, con inutul colec iei. 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 colec ie 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 colec iei de obiecte sau al tabloului. statements este grupul de istruc iuni executate pentru fiecare element. Execu ia 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 instruc iune de dup Next se prsete bucla fr executarea instruc iunilor).
Se execut instruc iunile 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. Instruc iunile Exit For sunt explicate la ForNext. Buclele ForEach...Next pot fi mbricate cu condi ia ca elementele utilizate la iterare s fie diferite. Observa ie. Pentru tergerea tuturor obiectelor dintr-o colec ie se va utiliza ForNext i nu For EachNext. Se va utiliza ca numr de obiecte colec ie.Count.

WhileWend
Execut un grup de instruc iuni att timp ct este adevrat o condi ie. 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, construc ii foarte complexe atunci cnd se numesc propriet ile unui obiect. n cazul modificrilor succesive ale mai multor propriet i 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 instruc iuni 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 instruc iunile care se execut pentru entitatea precizat. Permi nd omiterea recalificrilor din referin ele la obiectul precizat, orice construc ie de tipul ".nume" este interpretat n instruc iunile 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 execu iei dup rezultatul verificrii unei condi ii este o necesitate frecvent n orice implementare. Pe lng structurile prezentate, se pot utiliza trei func ii 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 instruc iuni ca rspuns la ndeplinirea unei condi ii (compus sau nu din mai multe condi ii testate secven ial). 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 instruc iuni executate atunci cnd condi iile corespunztoare sunt True. La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruc iuni, separate de ":", pe aceeai linie. Verificarea condi iilor 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
Instruc iunea Select Case se poate utiliza n locul unor instruc iuni ElseIf multiple (dintr-o structur IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruc iunea Select Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruc iunii 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

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

pentru a specifica un domeniu de valori.

statements-n reprezint una sau mai multe instruc iuni care se vor executa dac testexpression este egal cu un element din expressionlist-n. elsestatements reprezint una sau mai multe instruc iuni 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 instruc iunile care urmeaz aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execu iei trece apoi la instruc iunea 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 semnifica ia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruc iunile care se execut atunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dac aceasta este situa ia i nu este specificat o clauz Case Else, atunci execu ia urmeaz cu prima instruc iune de dup End Select. Instruc iunile 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 sec iune se prezint doar func ia Shell(), deoarece despre proceduri i apelul lor s-a discutat n capitolul 1.

Func ia 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). Con ine 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 VbHide Valoarea 0 Semnifica ia Fereastra este ascuns iar focus-ul este pe fereastra ascuns. Fereastra are focus-ul i este dimensionat i pozi ionat normal. Fereastra este afiat ca o icoan (minimizat) dar are focus-ul. Fereastr maximizat, cu focus. Fereastra este normal (restaurat la mrimea i pozi ia cea mai recent) dar nu are focus-ul. Fereastra activ curent i pstreaz focus-ul. Fereastr minimizat, fr focus. Fereastra activ curent i pstreaz focus-ul.

VbNormalFocus

VbMinimizedFocus

VbMaximizedFocus VbNormalNoFocus

3 4

VbMinimizedNoFocus

Dac func ia 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 execu ia instruc iunilor care urmeaz liniei Shell.

Opera iuni de intrare-ieire


n categoria opera iunilor de I/O se pot deosebi schimbul de informa ii 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 informa ii cu fiiere i/sau baze de date: acesta se realizeaz prin intermediul unor instruc iuni dedicate acestor opera ii.

Dialogul standard cu utilizatorul


n general, utilizatorul rspunde la apari ia unei boxe de dialog prin ac ionarea butonului adecvat rspunsului su i/sau prin nscrierea unei informa ii ntr-o zon dedicat acestui scop. Informa ia nscris este transferat programului ca valoare a func iei care ini iaz dialogul grafic.

Func ia InputBox
Apelul func iei InputBox afieaz o box de dialog care con ine 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 ac ioneze un buton. Textul introdus este transmis ca valoare a func iei la ac ionarea butonului OK (sau Enter), iar ac ionarea 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 combina ii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF.

title

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

default este expresia de tip String, op ional, con innd textul afiat ini ial n zona text rezervat utilizatorului. Textul este, n lipsa modificrii lui, retransmis ca rspuns (ac ionnd butonul OK). xpos este expresia numeric specificnd pozi ia 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 pozi ia vertical a dialogului (n twips, de la latura de sus a ecranului). n lipsa argumentului, boxa de dialog este pozi ionat 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 aplica ii 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 func iei nu este atribuit (sau utilizat ntr-o alt expresie), este evident c se pierde, fr semnalarea vreunei erori.

Func ia MsgBox
Un dialog mai simplu dect InputBox este realizat prin forma predefinit afiat de func ia MsgBox. Se afieaz un mesaj ntr-o box de dialog i se ateapt ca utilizatorul s ac ioneze unul dintre butoanele existente (numrul i tipul lor lor este fixat la proiectarea aplica iei). Func ia returneaz un ntreg indicnd care buton a fost ac ionat. 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 VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation Valoare 0 1 2 3 4 5 16 32 48 64 Descriere Numai butonul OK OK i Cancel Abort, Retry i Ignore Yes, No i Cancel Yes i No Retry i Cancel Icoana de Critical Message Icoana de Warning Query Icoana Warning Message Icoana de Information Message

VbDefaultButton1

Primul buton este cel implicit (echivalent cu Enter) Al doilea buton este cel implicit Al treilea buton este cel implicit Al patrulea buton este cel implicit Application modal: aplicatia curent este oprit pn cnd rspunde utilizatorul System modal: toate aplica iile sunt oprite pn cnd utilizatorul rspunde la dialog

VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 VbApplicationModal

256 512 768 0

VbSystemModal

4096

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 func ie, aceasta trebuie inclus ntr-o expresie (eventual atribuit unei variabile ntregi). Valorile returnate de func ie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorit de utilizator sunt Constanta VbOK VbCancel VbAbort VbRetry VbIgnore VbYes VbNo Valoare 1 2 3 4 5 6 7 Descriere OK Cancel Abort Retry Ignore Yes No

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

Utilizarea fiierelor
Procesrile tipice programate n VBA prelucreaz informa ii din dou mari categorii de fiiere: fiiere ale aplica iilor 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 aplica iei server specifice) poate produce coruperea fiierului, astfel nct nu mai este recunoscut de aplica ia mam. Prelucrarea acestor fiiere trebuie s fie executat n aplica iile care le-au creat.

Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va n elege, fr alte precizri, un fiier utilizator) acesta trebuie mai nti deschis (instruc iunea Open), opera iunea producnd i crearea fiierului n cazul unui fiier inexistent (nou). Dup utilizare fiierul trebuie s fie nchis (opera iune 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 aplica iei i n domeniul 256511 pentru fiiere accesibile din alte aplica ii. Un numr neutilizat (liber) poate fi furnizat de apelul la func ia FreeFile(). Exist trei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia. acces secven ial (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, opera iunile 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). Instruc iunile tipice pentru accesul la informa iile dintr-un fiier sunt
Modul de acces Scriere Citire

Secven ial Random Binar

Print #, Write # Put Put

Input # Get Get

Deoarece gestionarea fiierelor nu se rezum doar la scriere/citire, n tabelul urmtor este un rezumat al principalelor opera iuni pe care le suport fiierele, cu instruc iunile care faciliteaz respectiva ac iune.
Ac iune Instruc iuni

Citire Controlul ieirilor

Get, Input, Input #, Line Input # Format, Print, Print #, Spc, Tab, Width # FileCopy Open FileAttr, GetAttr, SetAttr Seek

Copierea unui fiier Creare, acces Fixarea atributelor Fixarea pozi iei active de citire/scriere Inchidere Informa ii despre un fiier

Close, Reset EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek

Lungimea unui fiier Opera ii asupra fiierelor Scriere

FileLen Dir, Kill, Lock, Unlock, Name Print #, Put, Write #

Doar instruc iunile i func iile 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 instruc iuni 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 op ional specificnd opera iunile I/O permise pentru fiier: Read, Write sau Read Write; lock clauz op ional specificnd opera iile 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 observa ia din partea introductiv); func ia FreeFile furnizeaz urmtorul numr disponibil; reclength numr (<=32,767) exprimnd, n octe i, lungimea nregistrrii (la aceesul Random) sau lungimea bufferului (la accesul secven ial); 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 instruc iuni 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
Func ia 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 aplica ii).

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 op ional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau numrul octetului (modul Binary) de unde ncepe citirea. Prima pozi ie este 1. varname numele variabilei unde se transfer informa ia. Dac nu se specific numrul nregistrrii se va citi din pozi ia activ de dup ultima instruc iune Get, Put sau Seek. Argumentul lips este indicat prin virgule: Get #4,,FileBuffer.

Pentru observa iile privind ac iunea instruc iunii Get, separat pentru modul Random i Binary, se va studia Help Get. Observa iile 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 op ional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau numrul octetului (modul Binary) unde ncepe scrierea. Prima pozi ie este 1. varname numele variabilei a crei valoare se scrie n fiier. Dac nu se specific numrul nregistrrii se va scrie n pozi ia activ de dup ultima instruc iune Get, Put sau Seek. Argumentul lips este indicat prin virgule: Put #4,,FileBuffer. Pentru observa iile privind ac iunea instruc iunii Put, separat pentru modul Random i Binary, se va studia Help Put. Observa iile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.

Input #
Citete date dintr-un fiier secven ial i le transfer n variabilele specificate. Instruc iunea 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 situa iile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz fr modificri. Pentru alte situa ii:
Informa ia citit Valoarea asignat

Virgul sau linie goal #NULL# #TRUE# sau #FALSE# #yyyy-mm-dd hh:mm:ss# #ERROR errornumber#

Empty Null True sau False Data i/sau timpul reprezentat de expresie 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 opera iunea de citire nu este ncheiat, provoac eroare. ntruct utilizarea fiierelor este, n mod uzual, aceea de memorare controlat a unor informa ii (i nu aceea de a descifra informa ii scrise ntr-o structur necunoscut), se recomand scrierea cu Write # n cazul utilizrii ulterioare a comenzii Input #.

Func ia Input()

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

Spre deosebire de instruc iunea Input #, func ia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF, ghilimele i spa ii de nceput). Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin func ia Input pn cnd EOF returneaz True genereaz eroare (procedeul este valid pentru citirea din fiiere binare cu Get). Se vor utiliza func iile LOF and Loc pentru detectarea sfritului de fiier. Observa ie. Pentru date pe octe i din fiiere text se va utiliza func ia InputB, cu o sintax similar, unde number specific numrul de octe i 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 secven ial (deschis) i asigneaz irul ob inut unei variabile de tip String. O linie este considerat terminat la ntlnirea caracterului CR (Chr(13)) sau a combina iei CR+LF (Chr(13)&Chr(10)). Caracterele CR i/sau LF nu sunt adugate irului asignat (se poate considera c secven a lor a fost srit). Line Input #filenumber, varname unde filenumber varname numrul ataat fiierului (deschis), nume de variabil String sau Variant.

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

Write #
Scrie o nregistrare ntr-un fiier secven ial. 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 informa iilor la citirea cu Input #. n acelai timp, informa iile 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, spa ii 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#.

Instruc iunea 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 combina ie CR+LF, astfel nct urmtoarea scriere va fi pe un rnd nou.

Print #
Scrie ntr-un fiier secven ial date formatate ca pe ecran (display-formatted). Prin urmare, cu excep iile 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, spa ii sau punct i virgul. Un element al listei de ieire este de forma [{Spc(n) | Tab[(n)]}] [expression] [charpos] unde Spc(n) insereaz n spa ii n ieire Tab(n) pozi ioneaz punctul de inser ie (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 pozi ia punctului de inser ie 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 inser ie

; Tab(n) Tab

Imediat dup ultimul caracter tiprit Coloana cu numrul n 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). Informa iile 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 instruc iuni de I/O. Prin acest opera iune se rupe legtura ntre fiiere i numerele ataate i se elibereaz zonele tampon rezervate. Pentru un fiier nchis nu se mai pot executa opera iuni 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 instruc iuni Open. Sintaxa este Reset naine de nchidere se scriu n fiiere toate bufferele nescrise nc.

Seek
Stabilete pozi ia (nregistrrii sau octetului) ntr-un fiier unde se va efectua urmtoarea opera iune de intrare/ieire, fiierul fiind deschis prin Open (vezi i func ia Seek). Sintaxa Seek [#]filenumber, position unde filenumber position opera ii I/O. numrul ataat fiierului. numr ntre 1 i 2,147,483,647, inclusiv, care indic locul urmtoarei

Numerele nregistrrilor specificate n instruc iunile Get i Put au priorirtate n raport cu pozi ia fixat prin Seek (are loc o repozi ionare). Dac opera iunea Seek indic o pozi ie dup sfritul fiierului, urmtoarea opera iune de scriere (fr repozi ionare) extinde fiierul. Pozi ia indicat nu poate fi zero sau negativ.

Func ia Seek
Returneaz, ca un ntreg Long, pozi ia 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 pozi iei prin instruc iunea Seek) i are semnifica ia din urmtorul tabel.
Modul de acces Valoarea returnat

Random

Numrul urmtoarei nregistrri (care va fi citit sau scris) Pozi ia octetului (numerotat de la 1) la care va avea loc urmtoarea opera iune I/O

Binary, Output, Append, Input

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 func ia genereaz mereu True. EOF(filenumber) filenumber este un ntreg con innd numrul fiierului testat. Utilizarea uzual este

Do While Not EOF(filenum)


(instruc iuni, inclusiv citire din fiierul filenum)

Loop
Pentru acces secven ial (Input) se ntoarce False pn cnd se atinge sfritul de fiier, pentru fiierele Random sau Binary se returneaz False pn cnd ultima instruc iune 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 func iile LOF sau Loc.

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

Random Sequential

Numrul ultimei nregistrri scrise sau citite Pozi ia curent mpr it la 128. (Se spune c aceast informa ie nu este niciodat util sau utilizat) Pozi ia ultimului octet citit sau scris.

Binary

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

LOF
Returneaz un Long care reprezint, n octe i, mrimea unui fiier deschis prin Open. Pentru fiierele nedeschise se poate utiliza, n acelai scop, func ia FileLen(). LOF(filenumber) filenumber este numrul ataat fiierului. Utilizarea acestei func ii, mpreun cu func ia 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 ac iunile programate n VB implic manevrarea programatic a unor obiecte. Toate aplica iile din Microsoft Office sunt alctuite din componente formate din obiecte sau care gestioneaz obiecte. n aceast sec iune 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 aplica ie din Office are un model propriu de obiecte, va fi dedicat cte un capitol pentru Word, Excel etc., n care se vor prezenta particularit ile de operare i obiectele specifice aplica iei.

Privire general
Orice aplica ie poate fi gndit ca ansamblul a dou lucruri: con inut i func ionalitate. Con inutul se refer la documentele pe care le con ine aplica ia, la elementele care compun documentele, la informa iile privind atributele

elementelor. Func ionalitatea se refer la modurile, cile n care se poate lucra cu con inutul aplica iei, de exemplu: deschiderea, nchiderea documentelor, adugarea, copierea, formatarea elementelor etc. Con inutul i func ionalitatea unei aplica ii sunt divizate n unit i discrete de con inut i func ionalitate specific, numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, sec iuni ale unui document Word etc., fiecare avnd evident un con inut i o func ionalitate specific, cele dou componente fiind unitar legate ntre ele. Obiectele unei aplica ii sunt ierarhizate n structuri, modelul de obiecte al aplica iei.. Obiectul de nivel maxim al unei aplica ii este, uzual, obiectul Application, care este aplica ia nsi. Obiectul Application con ine alte obiecte care pot fi accesate numai cnd obiectul Application exist (deci cnd aplica ia se execut). De exemplu, obiectul Application Excel con ine obiecte Workbook, dup cum obiectul Application Word con ine obiecte Document. Deoarece obiectul Document depinde de existen a 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 mul i prin i. Modul n care obiectele, care alctuiesc o aplica ie, sunt aranjate relativ unele fa de altele, mpreun cu modul n care con inutul i func ionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte. Fiecare aplica ie are un model de obiecte propriu, reprezentarea grafic a ierarhiei de obiecte pentru aplica ie poate fi vzut n Visual Basic Help din aplica ie. Fiecare obiect din ierarhie are un con inut i o func ionalitate 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 con inutului i func ionalit ii sale. Locul unui obiect n model este gndit astfel nct con inutul i func ionalitatea lui sunt adecvate domeniului su. Se poate gndi i faptul c, dac aplica ia este divizat n obiecte, fiecare obiect ofer acces la arii specifice de con inut i func ionalitate. Afirma iile care implic obiecte utilizeaz i termenii de "con inut n" pentru copil i "con ine" pentru printe. Astfel, obiectul Application Word con ine obiecte Document, dar obiectul Selection este con inut n obiectul Windows etc.

Propriet i i metode
Pentru a avea acces la con inutul i func ionalitatea unui obiect, pentru nceput trebuie s se identifice obiectul (subiect discutat n continuare). Dup identificare, obiectul este accesibil prin intermediul propriet ilor i metodelor sale. n general, prin proprietate se n elege un atribut numit al obiectului. Valoarea atributului (propriet ii) poate fi modificat (de cele mai multe ori) sau poate fi ob inut (tiut) programatic. Prin metod se n elege o procedur care ac ioneaz asupra unui obiect. Pentru a distinge o metod de o procedur obinuit (care poate de asemenea s ac ioneze asupra unui obiect, n general vorbind), trebuie precizat c metodele implementeaz func ionalitatea obiectului, sunt specifice obiectului cruia i se aplic i sunt definite o dat cu obiectul (deci la proiectarea aplica iei de baz, n cazul obiectelor Office). Orice procedur utilizator ac ioneaz asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect. n general, se utilizeaz propriet ile pentru a accesa con inutul i se apeleaz metodele pentru a realiza func ionalitatea obiectului. Totui, aceast distinc ie este relativ: exist propriet i care se apropie de metode i metode care seamn a fi propriet i. Atunci cnd vom discuta despre obiecte definite de utilizator se va vedea c este uor s se treac grani a dintre metode si propriet i n proiectarea obiectelor.

Legtura dintre modelul obiectelor i interfa a utilizator


Exist dou ci prin care utilizatorul poate interac iona cu obiectele aplica iei: manual (utiliznd interfa a utilizator a aplica iei); programatic (utiliznd un limbaj de programare). n accesul manual se utilizeaz tastatura, mouse-ul sau cheile directe pentru a naviga ctre acea parte i func ie a aplica iei 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 instruc iuni 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 execu iei procedurii. Deoarece ambele moduri de acces, interfa a utilizator a aplica iei de baz i Visual Basic, ajung la acelai con inut i func ionalitate, multe dintre obiectele, propriet ile i metodele existente n modelele de obiecte Office au aceleai denumiri cu elementele din interfa a utilizator (denumiri de meniuri, comenzi, ac iuni etc.). Se poate observa, explicabil din punctul de vedere al evolu iei ctre modelele obiectuale, o asemnare global a modelului de obiecte cu interfa a utilizator. Aceast asemnare este ntrit i de faptul c pentru orice ac iune posibil prin interfa a utilizator exist posibilitatea de a scrie cod Visual Basic echivalent (vezi i discu ia cu nregistrarea macrourilor). Din exemplul prezentat la accesul din VB, este de re inut importan a cunoaterii locului ocupat de obiectul procesat n ierarhia de obiecte: pentru a utiliza propriet ile sau metodele lui trebuie identificat corect prin navigarea (calificarea) de la nivelul cel mai de sus pn la el. ntregul traseu (cu excep ia nivelului Application, care este uneori subn eles) trebuie specificat ca n exemplul artat.

Colec ii de obiecte
O colec ie 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 propriet ile obiectelor (dac sunt toate de acelai tip) se aplic tuturor elementelor colec iei. Ca obiect separat, o colec ie are propriet i i metode specifice (numrul de elemente, adugarea unui nou element etc.). De regul, colec iile definite n Office (exist posibilitatea de a defini noi colec ii) se remarc prin aceea c au forma de plural a denumirii elementelor lor: Workbooks este colec ia de obiecte Workbook, Documents este colec ia de obiecte Document etc. Elementele (membrii) colec iei se pot identifica prin numrul de ordine (ncepnd cu 1) sau prin nume (rezult c ansamblul elementelor este ordonat). Astfel instruc iunea
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 colec iei de prezentri cu numele specificat. De regul, aceast metod este implicit, deci
Presentations("Perspective").Close

este o form echivalent. Numrul de elemente ale colec iei se pot afla prin proprietatea Count, se pot aduga noi elemente prin metoda Add etc. O utilizare frecvent a colec iilor 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 aplica ie Word, afieaz numele tuturor documentelor deschise cu mai mult de un cuvnt scris.

Automatizarea ac iunilor prin folosirea obiectelor


Prin automatizarea unei ac iuni se n elege scrierea unei proceduri care s produc, la executarea ei, ac iunea dorit. Execu ia poate fi comandat direct sau ca rspuns la declaarea unui eveniment. Pentru a automatiza o ac iune n Microsoft Office, se va ob ine o referin la obiectul care dispune de con inutul i func ionalitatea pe care le urmrim i se vor aplica propriet ile i metodele adecvate. Procesul poate necesita o succesiune de asemenea opera ii.

Ob inerea unei referin e la un obiect


Pentru a ob ine o referin la un obiect trebuie s se construiasc o expresie care ajunge s acceseze un obiect din modelul de obiecte i apoi, utiliznd propriet i i/sau metode, s se navigheze n sus sau n jos prin ierarhia de obiecte pn cnd ajungem la obiectul dorit. Propriet ile 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 referin a 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 con ine 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 colec ie Documents, care reprezint toate documentele deschise. Prin urmare urmtoarea expresie ntoarce o referin la obiectul colec ie Documents:
Application.Documents

Exist accesori direc i (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 colec ia de documente din Word, Excel i PowerPoint. Exist i alte propriet i cu rol de accesori direc i: ActiveWindow, ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urmtoarea instruc iune nchide documentul Word activ:
ActiveDocument.Close

Observa ie. 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 propriet ii 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 colec ii se va utiliza proprietatea sau metoda Item cu numele sau numrul de ordine al elementului. Pentru cele mai multe colec ii, 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 colec ii, "bunicul" obiectului n locul printelui (adic printele colec iei n locul colec iei). De exemplu
Document.Parent

o o

returneaz obiectul Application i nu Documents. Prin func ia TypeName (executat eventual n Immediate Window) se poate gsi ce tip de obiect ntoarce proprietatea Parent (func ia nu este limitat la aceast proprietate, vezi VB Help).

Aplicarea propriet ilor i metodelor


Dup ob inerea unei referin e la obiectul urmrit, acestuia i se pot aplica propriet i 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 pozi ia din stnga a ferestrei active utiliznd proprietatea Left a obiectului Window, referin a 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. Propriet ile i metodele pot avea argumente care s precizeze valorile sau ac iunile. 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 aplica ie, 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 o o o o o

Proprietatea Application returneaz o referin la obiectul Application. Proprietatea Documents a obiectului Application returneaz o referin la colec ia Documents. Metoda Item a colec iei Documents returneaz o referin la un songur obiect Document. Proprietatea Words a obiectului Document returneaz o referin la colec ia Words. Metoda Item a colec iei 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 colec ia de obiecte, nu trebuie enun at explicit. Din aceste considerente, exemplul urmtor realizeaz exact aceeai ac iune ca i exemplul precedent:
Documents(1).Words(1).Text = :Primul "

Pentru alte exemple de referin e i de utilizare a metodelor i propriet ilor 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 sus ine activitatea de scriere a instruc iunilor 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 ac iuni n interfa a utilizator a aplica iei de baz i se dorete cunoaterea obiectelor, propriet ilor i metodelor care pot s realizeze acea ac iune (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 ac iunea 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 con ine expresii care navigheaz prin ierarhia de obiecte fr s nceap cu un obiect selectat sau activat. Idei n acest sens pot fi ob inute din studierea exemplelor date n Visual Basic Help: pozi ionarea punctului de inser ie pe o denumire de proprietate sau metod i ac ionarea tastei F1 afieaz subiectul respectiv din Help. O cale direct de accesare a fiierului de ajutor pentru un obiect este pozi ionarea n graficul care prezint ierarhia de obiecte (specific fiecrei aplica ii) 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 aplica ie din Microsoft Office are o bibliotec de obiecte (object library sau type library), care con ine informa ii despre obiectele, propriet ile, metodele, evenimentele i constantele predefinite ale aplica iei. Pentru accesul la informa ia 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 utiliza i unul n locul celuilalt, dac nu se produc confuzii (uneori chiar i atunci). n boxa Members of se afieaz toate propriet ile, 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 infroma ii privind sintaxa, starea read-only sau read-write, biblioteca unde apar ine, tipul rezultatului returnat (dat sau obiect). Dac o informa ie este de tip legtur, activarea acesteia produce informa ii 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 instruc iunilor


Atunci cnd se creeaz ntr-o aplica ie o variabil obiect care se refer la un obiect furnizat de alt aplica ie, Visual Basic trebuie s verifice c obiectul exist i c propriet ile i metodele utilizate pentru obiect sunt specificate corect. Acest proces de verificare se numete legare (binding). Legarea poate s apar n timpul execu iei 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 con ine 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 aplica iei 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 aplica ii


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

Se stabilete o referin la biblioteca de tipuri a celeilate aplica ii (meniul Tools - References). Se declar variabile obiect care vor referi obiecte din alt aplica ie cu tipuri specifice. Se va urmri calificarea fiecrui tip cu numele aplica iei 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 func ia CreateObject cu identificatorul programatic OLE al obiectului cu care se dorete s se lucreze n cealalt aplica ie, dup modelul
Dim appWD As Word.Application Set appWD = CreateObject("Word.Application.8") appWD.Visible = True

Pentru informa ii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic Identifiers". Se aplic obiectului, con inut n variabil, propriet ile 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 aplica ie, 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 opera iile 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 aplica iei 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 propriet i ale obiectului Application Excel controleaz atributele de vizualizare ale ferestrei aplica iei sau comporatrea global a aplica iei. De exemplu, valoarea propriet ii DisplayFormulaBar este True dac bara de formule este vizibil, iar valoarea propriet ii ScreenUpdating este False dac actualizarea ecranului este inhibat. n plus, propriet ile 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 colec ia Windows (reprezentnd toate ferestrele deschise n aplica ie), proprietatea Workbooks d colec ia Workbooks a tutror caietelor deschise etc. Din aceast categorie enumerm:
o o o o o

Charts, colec ia tuturor foilor de tip chart, Dialogs, colec ia tuturor dialogurilor predefinite n mediul Excel, Names, colec ia tutror numelor create n caietul activ, RecentFiles, colec ia fiierelor utilizate recent (dup lista din meniul File), Sheets, colec ia tutror foilor deschise n caietul activ,

o o o

Windows, Workbooks, Worksheets, colec ia tuturor foilor de calcul din caietul activ.

Returnarea unui obiect particular din colec ie se efectueaz dup procedurile generale, explicate n capitolele introductive. n categoria accesorilor mai pot fi ncadrate propriet ile care returneaz un obiect Range: ActiveCell, Cells, Rows, Columns, Selection (dac este selectat un domeniu de celule). Propriet ile ActiveWorkbook, ActiveSheet, ActiveChart i ActiveWindow returneaz obiectele care reprezint elementele active corespunztoare din Excel. Anumite metode i propriet i care se aplic obiectului Application se aplic i unor obiecte situate mai jos n ierarhie. Utilizarea acestor propriet i 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 colec iei Workbooks.

Deschiderea unui Workbook


Pentru a deschide un caiet se utilizeaz metoda Open. Metoda este aplicat ntotdeauna colec iei 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 ob ine n mod automat calea: folderul cu fiierele Excel executabile i folderul Library (creat automat la instalarea aplica iei). Ob inerea acestor ci se realizeaz prin propriet ile 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 aplica ia, astfel nct codul este independent de platform Windows sau Macintosh). Instruc iunile
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 op iunea 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, op ional. 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, op ional. 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, op ional. Specific titlul boxei de dialog. Implicit este "Open". ButtonText este specific pentru Macintosh. MultiSelect este de tip Variant, op ional. 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 selec iei 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 colec ia 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 (colec ia 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 colec iilor.) Template este de tip Variant, op ional. 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, op ional, Variant. Con ine numele noului fiier, poate include o cale. FileFormat, op ional, 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, op ional, Variant. Un ir unde capitalizarea este considerat (cel mult 15 caractere) care con ine parola de protejare a fisierului. WriteResPassword, op ional, Variant. Un ir care con ine parola necesar pentru scrierea fiierului. Dac la deschidere nu se d parola exact, fiierul este deschis doar n citire. ReadOnlyRecommended, op ional, Variant. Este True pentru a afia, la deschidere, un mesaj cu recomandarea de a deschide fiierul doar n citire.

CreateBackup, op ional, Variant. Este True dac se creeaz o copie backup. AccessMode, op ional, Variant. Con ine 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, op ional, 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, op ional, Variant. Este True dac se adaug numele fiierului la lista fiierelor utilizate recent. Implicit este False. TextCodePage, TextVisualLayout, op ionale, 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 propriet ii 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, op ional, Variant. Specific numele de fiier propus. Dac acest nume este omis, atunci se va utiliza numele caietului activ. FileFilter, op ional, Variant. irul care specific criteriul de filtrare. Pentru structura irului se va revedea metoda GetOpenFilename de la deschiderea documentelor. FilterIndex, op ional, Variant. Este indicele criteriului de filtrare, de la 1 la numrul de filtre dat la FileFilter. Implicit este 1. Title, op ional, 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 colec iei 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 op ional, 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 op ional, Variant. Salveaz modificrile sub acest nume. RouteWorkbook este op ional, 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 men inute 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 selec ie 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 mul ime de celule. Nu exist un obiect colec ie pentru Range, as c un obiect Range poate fi gndit fie ca un obiect, fie ca o colec ie, dup situa ie. Exist foarte multe propriet i i metode care returneaz un obiect Range: ActiveCell BottomRightCell Cells ChangingCells CircularReference Columns CurrentArray CurrentRegion DirectDependents DirectPrecedents EntireColumn EntireRow Next Offset PageRange Precedents RowFields RowRange Rows Selection TableRange1 TableRange2 TopLeftCell UsedRange

Dependents

Range

VisibleRange

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

Referin e de tip A1 sau nume de domeniu


Unul dintre modurile uzuale de returnare a unui obiect Range este acela al utilizrii unei referin e 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 con inutului 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 men ionat 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 propriet ii 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 func iona corect dect dac Sheet1 este foaia activ, altminteri calificarea argumentului Key1 nu este complet. Pentru o execu ie 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)

Referin ele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instruc iuni 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 solu ie 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 propriet ii 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 propriet ilor CurrentRegion i UsedRange


Aceste dou propriet i, 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 n elege 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 con ine 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 con ine date dintr-un experiment desfurat n timp: prima coloan con ine datele calendaristice, a doua coloan con ine ora nregistrrii valorilor, coloanele a treia i a patra con in msurtorile experimentului. Procedura prezentat combin primele dou coloane ntr-o singur valoare de tip Date, convertete valoarea ob inut 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 propriet i 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 instruc iunile For Each Next i Do Loop, unele fiind deja utilizate n exemplele anterioare.

Utilizarea instruc iunii For Each Next


Acesta este modul recomandat de parcurgere a elementelor unei colec ii. 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 opera iunea 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 selec ia. Codul este completat cu instruc iuni 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 instruc iunii DoLoop


Atunci cnd procesarea unui domeniu modific domeniul (de exemplu prin tergerea unor linii/coloane), utilizarea instruc iunii For EachNext nu produce cele mai bune rezultate. Solu ia este atunci utilizarea instruc iunii 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 <> "" ' instruc iunile de eliminare a liniilor cheilor duplicate Loop

Utilizarea propriet ii Address


Aplicarea propriet ii 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 instruc iuni 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 ob ine 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 discu ie mai pe larg se va studia capitolul dedicat depanrii i manevrrii erorilor.

Evenimentele din Excel


O bun parte din codul scris ntr-o aplica ie este con inut n proceduri de rspuns la evenimente. Cunoaterea evenimentelor i alegerea unor rspunsuri adecvate produc o aplica ie senzitiv, vie, care interac ioneaz 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 discu ia din sec iunea 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 op iunii 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 Activate Descriere Apare atunci cnd utilizatorul activeaz foaia. Acest eveniment se va utiliza n locul propriet ii OnSheetActivate Apare atunci cnd utilizatorul execut un dublu click ntr-o celul a foii. Se va utiliza n locul propriet ii OnDoubleClick. Apare atunci cnd utilizatorul execut un click dreapta ntr-o celul a foii. Apare cnd utilizatorul recalculeaz foaia. Acest eveniment se va utiliza n locul propriet ii OnCalculate. Apare atunci cnd utilizatorul schimb o formul dintr-o celul. Se va utiliza n locul propriet ii OnEntry. 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 propriet ii OnSheetDeactivate. Apare atunci cnd utilizatorul selecteaz o celul din foaie.

BeforeDoubleClick

BeforeRightClick

Calculate

Change

Deactivate

SelectionChange

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 propriet ii OnSheetActivate Apare atunci cnd utilizatorul execut un dublu click pe diagram. Se va utiliza n locul propriet ii OnDoubleClick. Apare atunci cnd utilizatorul execut un click dreapta pe diagram. Apare cnd utilizatorul reprezint n diagram date noi sau modificate. 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 propriet ii OnSheetDeactivate. Apare atunci cnd utilizatorul dragheaz date peste diagram. Apare atunci cnd utilizatorul dragheaz un domeniu de celule peste diagram. Apare atunci cnd utilizatorul execut un click cu un buton al mouse-ului n timp ce pointerul acestuia este pozi ionat pe diagram. Apare la micarea pointerului mouse-ului peste diagram. Apare atunci cnd utilizatorul elibereaz un buton al mouse-ului n timp ce pointerul acestuia este pozi ionat pe diagram. Apare la redimensionarea diagramei. Apare la selectarea unui element al diagramei. Apare atunci cnd utilizatorul modific valoarea unei punct de pe diagram.

BeforeDoubleClick

BeforeRightClick

Calculate

Deactivate

DragOver

DragPlot

MouseDown

MouseMove

MouseUp

Resize Select SeriesChanges

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 Activate AddInInstall Descriere Apare atunci cnd utilizatorul activeaz caietul. Apare atunci cnd utilizatorul instaleaz caietul ca un add-in. Se va utiliza n locul macro-ului Auto_Add. Apare atunci cnd utilizatorul dezinstaleaz caietul ca un add-in. Se va utiliza n locul macroului Auto_Remove. Apare naintea nchiderii caietului. Se va utiliza n locul macro-ului Auto_Close. Apare naintea tipririi caietului. Apare nainte ca utilizatorul s salveze foaia. Acest eveniment se va utiliza n locul propriet ii OnSave. Apare atunci cnd caietul este activ i utilizatorul activeaz un alt caiet. Apare dup ce utilizatorul creeaz o nou foaie. Apare la deschiderea caietului. Evenimentul se va utiliza n locul macroului Auto_Open. Apare la activarea unei foi din caiet. Se va utiliza n locul propriet ii OnSheetActivate. Apare la dublu click pe o celul (nu este utilizat cu foile diagram). Se va utiliza n locul propriet ii OnDoubleClick. Apare la click dreapta pe o celul a unei foi din caiet (nu este utilizat cu foile diagram). Apare la recalcularea unei foi (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnCalculate. Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnEntry.

AddInUninstall

BeforeClose

BeforePrint BeforeSave

Deactivate

NewSheet Open

SheetActivate

SheetBeforeDoubleClick

SheetBeforeRightClick

SheetCalculate

SheetChange

SheetDeactivate

Apare la activarea altei foi din caiet. Se utilizeaz n locul propriet ii OnSheetDeactivate. Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram). Apare atunci cnd utilizatorul mut focusul pe orice fereastr a caietului. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul mut focusul n afara oricrei fereastre a caietului. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul deschide, redimensioneaz, maximizeaz sau minimizeaz orice fereastr a caietului.

SheetSelectionChange

WindowActivate

WindowDeactivate

WindowResize

Pentru explica ii se vor studia intrrile corespunztoare din Help.

Exemplu
Deschiderea caietului maximizeaz fereastra aplica iei 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) NewWorkbook SheetActivate Descriere

Apare la crearea unui nou caiet. Apare atunci cnd utilizatorul activeaz o foaie dintr-un caiet deschis. Se va utiliza n locul propriet ii OnSheetActivate. Apare la dublu click pe o celul dintr-un caiet deschis (nu este utilizat cu foile diagram). Se va utiliza n locul propriet ii OnDoubleClick. Apare la click dreapta pe o celul a unei foi dintrun caiet deschis (nu este utilizat cu foile diagram). Apare la recalcularea unei foi (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnCalculate. Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnEntry.

SheetBeforeDoubleClick

SheetBeforeRightClick

SheetCalculate

SheetChange

SheetDeactivate

Apare la activarea altei foi dintr-un caiet. Se utilizeaz n locul propriet ii OnSheetDeactivate. Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram). Apare atunci cnd utilizatorul mut focusul pe orice fereastr deschis n aplica ie. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul mut focusul n afara oricrei fereastre a aplica iei. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul redimensioneaz, maximizeaz sau minimizeaz orice fereastr deschis n aplica ie. Apare atunci cnd se mut focusul pe un caiet deschis Apare la instalarea unui workbook ca un add-in. Apare la dezinstalarea unui workbook ca un addin. Apare nainte ca un caiet deschis s fie nchis. Apare nainte ca un caiet deschis s fie tiprit. Apare nainte ca un caiet deschis s fie salvat. Apare atunci cnd utilizatorul mut focusul n afara unui caiet deschis. Apare la adugarea unei noi foi la un caiet deschis. Apare atunci cnd utilizatorul deschide un caiet.

SheetSelectionChange

WindowActivate

WindowDeactivate

WindowResize

WorkbookActivate

WorkbookAddInInstall WorkbookAddInUninstall

WorkbookBeforeClose WorkbookBeforePrint WorkbookBeforeSave WorkbookDeactivate

WorkbookNewSheet WorkbookOpen

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 declara ia Obiectul nou creat apare n boxa Object din modulul clas i se pot scrie procedurile evenimentelor pentru noul obiect.

Public WithEvents App As Application

Se conecteaz obiectul declarat n modul la obiectul Application. Pentru aceast opera iune, n orice modul se d instruc iunea
unde EventClass este numele dat, de exemplu, modulului clas creat, similar pentru X.

Public X As New EventClass

dup crearea instan ei 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 ini ializare, 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 declara ia
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 ini ializare. 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 execu ie (run-time errors) aprute n urma ncercrii de a executa opera iuni interzise. Informa iile din acest capitol se aplic proiectelor VBA din Microsoft Excel.

Cum se gestioneaz erorile


n mod ideal, procedurile Visual Basic n-ar trebui s con in cod de tratare a erorilro. Realitatea arat ns c probleme hardware sau ac iuni neanticipate ale utilizatorului pot s produc erori n execu ie, ca urmare programul se oprete i exist pu ine anse ca utilizatorul s continue execu ia aplica iei. Sunt posibile i erori care dei nu opresc execu ia produc rezultate ulterioare eronate. De exemplu, procedura urmtoare returneaz True dac fiierul specificat exist i False dac nu, dar nu con ine instruc iuni de tratare a erorilor.
Function FileExists (filename) As Boolean FileExists = (Dir(filename) <>"") End Function

Func ia 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 situa iile posibile. Totu, dac litera de drive specificat nu este valid, apare eroarea "Device unavailable". Dac unitatea este de floppy disk, func ia va func iona corect doar dac n unitate este o dischet i poarta este nchis. n caz contrar Visual Basic va semnala eroarea "Disk not ready" i execu ia se oprete. Pentru a ocoli asemenea situa ii, trebuie s se utilizeze modalit ile de error-handling din VBE pentru a intercepta erorile (sau "a prinde" - trapping) i a executa ac iuni corective. La apari ia unei erori, Visual Basic stabilete diferite propriet i 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 aplica ia poate rspunde inteligent la o situa ie 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: ' secven a 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 con ine numrul asociat cu eroarea aparut; proprietatea Description con ine o scurt descriere a erorii. Instruc iunea Resume returneaz controlul la instruc iunea care a produs eroarea iar Resume Next returneaz controlul la instruc iunea 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 aplica ie. Asemenea secven e se pot aduga la orice procedur unde se anticipeaz posibilitatea unei erori (se poate presupune c orice instruc iune Visual Basic poate produce o eroare, cu excep ia 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. Instruc iunea On Error permite captarea erorii i transferul controlului execu iei la eticheta specificat. 2. Scrierea unei rutine de tratare a erorilor, care s rspund tuturor erorilor anticipate. Dac execu ia i-a transferat controlul n aceast secven , se zice c secven a este activ (capcana de prindere a erorii este activ). 3. Ieirea (prsirea) secven ei error-handling. Detalii sunt oferite n sec iunile care urmeaz.

Stabilirea capcanei de erori


O capcan de erori este activat atunci cnd se execut o instruc iune On Error, care specific o secven de tratare a erorilor. Capcana rmne deschis att timp ct procedura care o con ine este activ, adic pn cnd este executat o instruc iune Exit Sub, Exit Function, Exit Property, End Sub, End Function sau End Property din procedura care include secven a 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 instruc iunii On Error GoTo 0. Pentru activarea unei capcane de erori se utilizeaz instruc iunea On Error GoTo line, unde line este eticheta care identific secven a de instruc iuni, 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 secven ei de tratare a erorilor. O conven ie comun este aceea de a plasa codul error-handler la sfritul procedurii i a-l preceda de o instruc iune 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 con ine 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 con ine un cod numeric reprezentnd cea mai recent eroare. Utilizarea obiectului Err n combina ie cu structurile Select Case sau If...Then...Else, se pot lua ac iuni specifice fiecrei erori.

Ieirea din rutina de tratare a erorilor


Urmtorul tabel cuprinde instruc iunile prin care se poate iei dintr-o secven error-handling. Acest fapt nseamn, n general, cedarea controlului execu iei ctre alt instruc iune din procedura activ.
Instruc iunea Descriere

Resume [0]

Execu ia programului se reia cu instruc iunea care a cauzat eroarea sau cel mai recent apel al procedurii con innd rutina error-handling. Este utilizat pentru a repeta o opera iune dup ce sa corectat situa ia care a produs eroarea. Reia execu ia programului cu instruc iunea imediat urmtoare celei care a cauzat eroarea. Dac eroarea a aprut n afara procedurii care con ine codul de eroare, execu ia se reia cu instruc iunea imediat urmtoare apelului la procedura unde a aprut eroarea, dac procedura apelat nu are activat o secven de eroare. Reia execu ia programului cu instruc iunea 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. Declaneaz eroarea de execu ie avnd numrul specificat. Atunci cnd o asemenea instruc iune este executat n interiorul rutinei de eroare, Visual Basic caut lista de apeluri pentru alt rutin de tratare a erorilor. (Lista de apeluri este lan ul de proceduri apelate pentru a ajunge n punctul curent de execu ie. Informa ii suplimentare se gsesc n sec iunea "Ierarhia tratrii erorilor.)

Resume Next

Resume line

Err:Raise Number:=number

Diferen a dintre Resume i Resume Next


Diferen a este c Resume continu execu ia cu instruc iunea care a generat eroarea (instruc iunea este reexecutat), n timp ce Resume Next continu cu instruc iunea 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 mpr iri "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 execu iei la o linie specificat


Prin Resume line se d controlul execu iei la linia specificat. Urmtorul exemplu ilustreaz utilizarea acestei instruc iuni 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 specifica iei, func ia returneaz numele fiierului. Dac nu se potrivete nici un fiier, func ia returneaz un ir de lungime zero. n cazul apari iei 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 opera iunea efectuat), pe ramura de program Case Else se regenereaz eroarea nct urmtoarea capcan de erori din lista de apeluri poate s intre n ac iune. 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 instruc iuni On Error i nu a fost interzis (prin On Error GoTo 0 sau prin prsirea procedurii care l con ine). 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 secven ele permise sunt i active. De exemplu, dup o instruc iune Resume, un handler este dezactivat dar rmne permis. La apari ia 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 secven a 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 execu ia aplica iei. Dac Visual Basic gsete o secven error-handling, execu ia continu n acea rutin, ca i cum eroarea ar fi aprut n procedura care con ine rutina error handling respectiv. Dac o instruc iune Resume sau Resume Next este executat n rutina error handling, execu ia continu dup cum este artat n tabelul urmtor.
Instruc iunea 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 instruc iune Resume, Visual Basic reexecut apelul la procedura B.

Resume Next

Execu ia se ntoarce la instruc iunea care urmeaz ultimei instruc iuni executate n acea procedur. Aceasta este instruc iunea 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 instruc iune Resume Next, execu ia se ntoarce la instruc iunea de dup apelul la procedura B.

De notat c instruc iunea 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 esen ial al tratrii erorilor, execu ia poate prea de neexplicat n momentul apari iei unei erori. Pentru o verificare mai simpl a codului, se poate trece n modul break n momentul apari iei unei erori, dup cum este explicat ulterior n acest capitol ("Oprirea tratrii erorilor"). Dac erorile tratate n secven a 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 instruc iune Resume. Pentru a preveni o asemenea situa ie, se va utiliza metoda Raise a obiectului Err ntr-o secven Case Else (sau similar) din handler. Aceasta genereaz o eroare din secven a de tratare activ, for nd 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 instruc iunea Resume sau Resume Next executat. Trebuie gndit c execu ia nu se reia, n mod necesar, n procedura unde a aprut eroarea, ci n procedura unde este un error-handler activ.

Indica ii pentru o tratare complex a erorilor


La scrierea unei aplica ii 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 secven ele 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 aplica iei. Se va utiliza metoda Clear dac trebuie s se ini ializeze 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 instruc iune Resume, Exit Sub, Exit Function, Exit Property sau orice instruc iune On Error.
o

Dac nu se dorete ca alt procedur din lista de apeluri s capteze eroarea, se va utiliza instruc iunea Stop pentru a for a terminarea codului. Instruc iunea 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 secven ele de tratare a erorilor ca ultim ac iune pentru erorile care nu sunt gestionate. Aceast procedur poate efectua o terminare controlat a aplica iei prin descrcarea formelor i salvarea datelor.

Testarea tratrii erorilor prin generarea de erori


Simularea erorilor este util n timpul verificrii aplica iei sau cnd se doreste tratarea unei condi ii particulare ca i cum ar fi echivalent unei erori de execu ie. De exemplu, se scrie un modul care utilizeaz un obiect definit ntr-o aplica ie extern i se dorete ca erorile returnate de acel obiect s fie tratate de restul aplica iei precum erorile Visual Basic. Pentru a testa toate erorile posibile se vor genera erorile prin cod. Aceast opera iune 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 propriet ii 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 op ional, ir denumind obiectul sau aplica ia care genereaz eroarea. La stabilirea acestei propriet i 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 func ia 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 informa ia asociat cu fiierul Visual Basic Help. helpcontext este optional, ID de context pentru intrarea din fiierul de ajutor. n mod implicit se consider informa ia unei erori Visual Basic, dac exist. n cazul utilizrii metodei Raise fr specificarea anumitor argumente iar valorile propriet ilor obiectului Err con in valori care nu au fost cur ate, aceste valori sunt luate n considerare. Este de men ionat c instruc iunea Error poate fi utilizat de asemenea pentru generarea de erori, dar obiectul Err dispune de o informa ie 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 condi ii proprii aplica iei 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 sec iunea de declara ii 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 apari ia 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 func ii i instruc iuni 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 func ie 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 func ii i instruc iuni care returneaz, atunci cnd apar erori, numere de eroare (sau constante cu aceast semnifica ie) 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 esen ial n tratarea inline a erorilor este testarea apari iei unei erori imediat dup instruc iunea sau apelul de func ie 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 execu ie s apar efectiv.

Tratarea erorilor n procedura apelant


Alt metod pentru a indica apari ia 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 func iei, instruc iunea On Error Resume Next stabilete propriet ile obiectului Err dar nu precizeaz o rutin error-handling. Instruc iunea On Error Resume Next este urmat de codul de tratare a erorii. Acesta testeaz propriet ile obiectului Err pentru a vedea dac a aprut o eroare. Dac Err.Number nu con ine 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 apari ia 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 func iei 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 informa ii despre erorile eventuale este utilizarea datelor de tip Variant i func iile asociate, potrivit exemplului urmtor. O variabil de tip Variant are un indicator privind tipul de dat con inut 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 func iei 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 aplica ie, tratarea inline produce tratri repetate ale acelorai erori. Codul poate fi redus prin scrierea unor proceduri apelate repetat de secven ele error handling. Func ia FileErrors din exemplul urmtor afieaz un mesaj adecvat erorii produse i, cnd este posibil, permite acoperirea erorii. Este returnat procedurii apelante un cod cu ac iunea 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 n eles ' 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 situa ii cnd este necesar anularea capcanei nainte de prsirea procedurii gazd. Acest fapt este realizat de instruc iunea On Error GoTo 0. Dup executarea acestei instruc iuni, Visual Basic detecteaz erorile dar nu sunt captate n procedur. Instruc iunea 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 op iunea Break on All Errors din fia General a dialogului Options (meniul Tools). Selectarea acestei op iuni are ca efect, la apari ia 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 aplica ii. De exemplu, s considerm o aplica ie 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. Interfa a 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 semnifica ie 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 referin a dect de obiectul referit. Atunci cnd apare o eroare n modulul unei forme, Visual Basic genereaz unul dintre numerele de eroare predefinite. Observa ie. Dac se creeaz o clas public, trebuie ca fiecare secven care trateaz o eroare non-Visual Basic s fie bine documentat. Al i programatori care se refer la aceast clas trebuie s cunoasc cum s trateze erorile transmise de obiectul respectiv. La regenerarea unei erori, celelalte propriet i ale obiectului Err se vor lsa neschimbate. Dac eroarea transmis nu este tratat, propriet ile 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. Secven a 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 ' documenta iei 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

Instruc iunea Case 440 capteaz erorile care apar ntr-un obiect referit extern aplica iei Visual Basic. n acest exemplu, eroarea este propagat utiliznd valoarea 9999, deoarece este dificil pentru acest tip de handler central s determine cauza erorii. Apari ia unei astfel de erori este, de obicei, rezultatul unei erori fatale de automatizare (o eroare care produce oprirea execu iei 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 sec iunea "Tratarea inline a erorilor"), ar fi posibil s se determine cauza erorii i s se corecteze. Instruc iunea Case Is > vbObjectError And Is < vbObjectError + 65536 capteazerorile care au originea ntr-un obiect din aplica ia Visual Basic, sau din obiectul care con ine handlerul. Numai asemenea obiecte pot produce erori n domeniul specificat. Documenta ia pentru codul de eroare oferit pentru obiect trebuie s defineasc codurile posibile, semnifica ia lor, astfel nct aceast por iune 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 instruc iunea 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 instruc iunea Case Else. n aplica ia proprie se poate proiecta un handler care s anticipeze acest nou numr definit. Dac aplica ia este o clas public, trebuie s fie inclus n documenta ie o explica ie a acestei noi erori. Ultima instruc iune 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 aplica iilor care se refer la obiecte create n Visual Basic sau la clase definit n module clas este dificil, se recomand selectarea op iunii Break in Class Module din fia General a dialogului Options (meniul Tools). Cu aceast op iune selectat, orice eroare dintr-un modul clas duce la intrarea clasei n modul break a debuggerului, permi nd 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 execu iei i cum se schimb valorile variabilelor i propriet ilor. Se poate considera c uneltele de depanare ajut la examinarea aplica iei pentru a n elege 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 (instruc iune cu instruc iune sau procedur cu procedur) i afiarea valorilor variabilelor i propriet ilor. Sunt oferite de asemenea posibilit i speciale cum ar fi editarea codului i continuarea execu iei (edit-and-continue), stabilirea urmtoarei instruc iuni care s se execute dup o eroare i testarea cu aplica ia 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 execu ie. Acestea apar n timpul execu iei aplica iei (i sunt detectate de Visual Basic) atunci cnd o instruc iune ncearc s efectueze o opera iune imposibil (de genul mpr irii prin zero). Erori de logic. Acestea apar atunci cnd aplica ia nu se execut n modul gndit la proiectare. O aplica ie poate s fie corct sintactic, s se execute fr a efectua opera iuni imposibile i totui s produc rezultate incorecte. Doar testarea aplica iei i analiza rezultatelor poate spune c aplica ia func ioneaz corect.

Unelte de depanare
Nu exist artificii magice pentru depanare i nu exist o secven fix de opera iuni care s lucreze ntotdeauna. n esen , ajutorul oferit n depanare este pentru o mai bun n elegere a mersului aplica iei. Se poate astfel fotografia starea aplica iei la un moment dat, instantaneul ob inut cuprinznd valori ale propriet ilor, 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 func ionalitatea 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). Comut din run time n modul break. Comut din run time sau modul break n modul design. Definete o linie ntr-un modul, unde Visual Basic suspend execu ia aplica iei. Execut urmtoarea linie executabil din aplica ie i intr n proceduri. Execut urmtoarea linie executabil din aplica ie dar nu intr n proceduri.

Break Reset Toggle Breakpoint

Step Into

Step Over

Step Out

Execut restul de cod din procedura curent i se opreste la linia urmtoare din procedura apelant. Afieaz valoarea curent a variabilelor locale. Permite executarea de cod sau interogarea unei valori n timp ce aplica ia este n break mode. Afieaz valorile unor expresii selectate. Listeaz valoarea curent a unei expresii n timp ce aplica ia este n modul break. n timp ce aplica ia este n modul break, afieaz o cutie de diaolg care arat toate procedurile care au fost apelate dar nc nu s-au executat complet.

Locals Window Immediate Window

Watch Window Quick Watch

Call Stack

Sec iunile urmtoare aduc explica ii suplimentare asupra modului de utilizare efectiv a acestor unelte.

Evitarea "bug"-urilor
Respectarea urmtoarelor reguli poate conduce la evitarea introducerii unor bug-uri n aplica ie. Aplica ia se proiecteaz cu aten ie 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 aplica iei, comentariile privind scopul fiecrei rutine sunt de un real ajutor.
o

Se vor utiliza, pe ct posibil, referin e 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 construc ie a denumirilor pentru variabilele i obiectele din aplica ie.
o

Se va utiliza declara ia 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 aplica ie i n run time pentru a o executa. n break mode execu ia 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 aplica ii 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 excep ia 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 aplica ia intr n modul break la prima instruc iune executabil. Run time n timpul execu iei, cnd aplica ia are controlul, se interac ioneaz cu aplica ia ca orice alt utilizator. Se poate vedea codul dar nu se poate schimba. Pentru a trece n design time se ac ioneaz butonul Reset iar pentru a trece n break mode click pe butonul Break. Break mode Execu ia este suspendat n timpul rulrii aplica iei. Se poate vedea i edita codul, examina sau modifica date, reporni aplica ia, sfri execu ia sau continua din punctul de oprire. Pentru comutarea n run time, click pe butonul Continue (acelai cu Run). Trecerea n design time se ob ine 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 instruc iunile aplica iei. 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 informa ia care rezult din instruc iunile de depanare din cod sau care este cerut prin instruc iuni 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 condi ie 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 instruc iunea curent este n contextul specificat; n caz contrar, coloana Value afieazun mesaj indicnd c instruc iunea nu este n context. Fereastra Locals arat valorile oricrei variabile din domeniul procedurii curente. Dup cum execu ia trece din procedur n procedur, con inutul 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 propriet ile obiectului i valorile curente. Dac o proprietate a obiectului con ine un alt obiect, acesta poate fi expandat de asemenea. Aceeai examinare se poate aplica pentru variabilele care con in tablouri sau tipuri definite de utilizator.

Utilizarea modului break


n design time se poate schimba aspectul sau codul aplica iei, dar nu se pot vedea efectele schimbrilor. n run time se poate urmri cum se comport aplica ia, dar nu se poate interveni direct n cod. Modul Break oprete execu ia aplica iei i ofer un instantaneu al condi iilor n orice moment. Variabilele i valorile propriet ilor sunt pstrate, astfel nct se poate analiza starea curent a aplica iei i introduce modificri care afecteaz execu ia aplica iei. Cnd aplica ia este n modul break se pot efectua urmtoarele ac iuni: Modificarea codului aplica iei. Observarea strii interfe ei.

Determinarea apelurilor procedurilor. Urmrirea valorilor variabilelor, propriet ilor i instruc iunilor. Schimbarea valorilor variabilelor i propriet ilor. Controlarea fluxului execu iei prin aflarea/stabilirea instruc iunii urmtoare. Execu ia imediat a unor instruc iuni Visual Basic. Controlarea manual a operrii aplica iei.

Intrarea n modul break la o instruc iune cu probleme


n timpul depanrii unui program este uneori de dorit oprirea aplica iei n acel loc din cod unde se bnuiete existen a unei probleme. Acesta este unul dintre motivele pentru care Visual Basic prevede puncte de oprire i instruc iuni Stop. Un punct de oprire (breakpoint) definete o instruc iune sau o mul ime de condi ii unde Visual Basic oprete execu ia n mod automat i trece aplica ia n modul break fr a executa instruc iunea care con ine punctul de oprire. Se poate intra n modul break i manual, prin oricare dintre ac iunile CTRL+BREAK
o o

Comanda Break din meniul Run Butonul Break de pe bara de unelte Debug.

Este posibil s se opreasc execu ia atunci cnd aplica ia nu are de lucru (idle - este ntre procesarea unor evenimente). Cnd se ntmpl acest fapt, execu ia 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 condi ii: O instruc iune genereaz o eroare de execu ie netratat.
o o

O instruc iune genereaz o eroare de execu ie 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. Execu ia atinge o instruc iune Stop.

Execu ia atinge o linie cu un punct de oprire.


o

Fixarea unei erori run-time i continuare


Anumite erori din execu ie rezult din neglijen a 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 ac ionarea comenzii Continue (meniul Run) sau butonul Continue. La continuarea aplica iei se poate verifica fixarea erorii. Dac se selecteaz op iunea 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 secven ele de tratare doar dac op iunea Break on All Errors nu este selectat. Anumite erori, cum ar fi schimbarea declara iilor de variabile, adugarea unor noi variabile etc., necesit repornirea aplica iei. n acest caz Visual Basic prezint un mesaj care las repornirea aplica iei 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 aplica iei n modul break, aceste expresii apar n fereastra Watch.

Se poate de asemenea instrui o expresie urmrit s treac aplica ia n modul break atunci valoarea ei se modific sau devine True (pentru condi ii). Acest mod de operare reduce, de obicei, parcurgerea pas cu pas a proiectului pn cnd se atinge o anumit condi ie (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 opera iunile 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 excep ia butonului Delete care apare doar n dialogul Edit Watch. Componentele comune celor dou dialoguri sunt prezentate n tabelul urmtor.
Componenta Descriere

Zona text Expression

Con ine expresia pe care expresia urmrit o evelueaz. Aceast expresie este o variabil, o proprietate, un apel de func ie sau orice alt expresie valid. n dialogul Add Watch aceast box de text con ine expresia curent (dac exist). 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 aplica ie prin selectarea intrrilor All Procedures i All Modules. Visual Basic poate evalua mai uor o variabil ntr-un context restrns. Stabilete cum rspunde Visual Basic la expresia urmrit: - urmrete expresia i afieaz valoarea n fereastra Watch atunci cnd aplica ia intr n modul break; - aplica ia intr n modul break automat atunci cnd se modific valoarea expresiei sau cnd aceasta devine True.

Grupul de op iuni Context

Grupul de op iuni Watch Type

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

Utilizarea urmririi rapide


Cnd aplica ia este n modul break, se poate verifica valoarea unei propriet i, 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 ac ioneaz butonul Add (inhibat dac opera iunea de urmrire nu este posibil); fereastra Watch este afiat etc.

Utilizarea unui punct de oprire


n execu ie, un punct de oprire (breakpoint) produce oprirea execu iei 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 aplica ia 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 aplica ia este inactiv (idle). Pentru a fixa un punct de oprire se efectueaz un click pe marginea din stnga ferestrei modulului, n dreptul instruc iunii (vezi figura de mai sus). Instruc iunea 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 instruc iunea 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 aplica ia este oprit, se poate examina starea curent a aplica iei, focusul putnd fi mutat ntre forme, module, ferestrele de depanare. Aplica ia este oprit exact naintea executrii liniei care con ine punctul de oprire. Dac se dorete observarea efectului executrii acestei instruc iunii se va ac iona Step Into sau Step Over. Pentru izolarea unei probleme reamintim c o instruc iune poate s contribuie indirect la eroare datorit atribuirii unor valori incorecte. Examinarea valorilor variabilelor i propriet ilor se efectueaz n modul break prin ferestrele Locals, Quick Watch, expresii urmrite i fereastra Immediate.

Utilizarea instruc iunii Stop


O alternativ la fixarea unui punct de oprire este plasarea unei instruc iuni Stop. La ntlnirea unei instruc iuni Stop, Visual Basic oprete execu ia i comut n modul break. Dei Stop ac ioneaz ca un breakpoint, instruc iunea nu poate fi fixat sau inhibat n acelai mod. Reamintim c o instruc iune Stop oprete doar temporar execu ia n timp ce o instruc iune End oprete execu ia, reini ializeaz variabilele i produce ntoarcerea la modul design. O aplica ie oprit prin Stop poate fi continuat prin Continue din meniul Run.

Executarea unor secven e de cod selectate


Dac se poate identifica instruc iunea care a cauzat eroarea, un singur breakpoint poate localiza problema ivit. Este mai frecvent situa ia n care o ntreag secven de cod este bnuit c produce execu ia incorect a aplica iei. n acest caz, un breakpoint izoleaz zona de cod i se parcurge apoi ntreaga por iune pas cu pas prin Step Into i Step Over. Dac este necesar, se poate de asemenea sri peste instruc iuni sau rentoarce execu ia la o nou linie. Pentru comenzile descrise n tabelul urmtor trebuie ca aplica ia s fie n modul break.
Modul de parcurgere Descriere

Step Into

Execut instruc iunea curent i se oprete la urmtoarea linie, chiar dac ea este n alt procedur. Execut ntreaga procedur apelat de linia curent i se oprete la linia urmtoare liniei curente. Execut restul procedurii curente i se oprete la instruc iunea urmtoare celei care a apelat procedura curent.

Step Over

Step Out

Utilizarea comenzii Step Into


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

Utilizarea comenzii Step Over


Comanda Step Over se aplic tot instruc iunii curente, dar aceasta trebuie s con in 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 instruc iunea urmtoare n procedura curent. Pentru acest tip de opera iune se ac ioneaz butonul Step Over din bara Debug. Acest tip de ac iune este util atunci cnd procedura apelat este verificat. Totui, dac n procedura apelat exist o instruc iune Stop sau este definit un punct de oprire, atunci execu ia este stopat n acele locuri.

Utilizarea comenzii Step Out


Prin comanda Step Out se mrete viteza de parcurgere a secven elor de cod n sensul c dac se tie c restul instruc iunilor 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 instruc iunea urmtoare apelului. Pentru acest tip de opera iune se ac ioneaz butonul Step Out din bara Debug.

Trecerea peste sec iuni de cod


n modul break se poate selecta o instruc iune oarecare, mai departe pe firul execu iei, i click pe Run To Cursor din meniul Debug permite reluarea execu iei din punctul selectat. Se pot astfel sri secven e neinteresante de cod.

Stabilirea instruc iunii urmtoare


O ac iune similar celei descrise n sec iunea anterioar este selectarea unei instruc iuni oriunde n procedura curent i click Set Next Statement din meniul Debug. Se pot astfel urmri doar anumite fire de execu ie sau se pot reexecuta anumite secven e pentru alte valori date variabilelor/propriet ilor.

Indicarea instruc iunii urmtoare


Prin click pe Show Next Statement din meniul Debug se plaseaz punctul de inser ie 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 instruc iune. 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 ini iat proceduri care nu au fost complet executate. Prin lista afiat se poate trasa ordinea de apeluri care au dus la instruc iunea curent. Cu ct asemenea lan uri de apeluri sunt mai lungi, cu att depanarea aplica iei este mai dificil. n lista din dialogul Call Stack toate apelurile active sunt prezentate ntr-o serie de apeluri nln uite. Ea plaseaz cea mai timpurie procedur apelat la baza listei i adaug apelurile urmtoare n topul listei. Informa ia dat pentru fiecare procedur ncepe cu numele modulului, urmat de numele procedurii. Prin butonul Show din dialog se afieaz instruc iunea dintr-o procedur care trece controlul aplica iei ctre urmtoarea procedur din list. Observa ie. Deoarece dialogul Call Stack nu indic variabila asignat unei instan e a unei clase, nu se poate distinge ntre instan e multiple ale claselor.

Testarea datelor i procedurilor cu fereastra Immediate


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

Tiprirea informa iilor n fereastra Immediate


Exist dou metode pentru tiprirea n fereastra Immediate

Includerea unor instruc iuni Debug.Print n codul aplica iei, Introducerea direct n fereastra Immediate a instruc iunilor care utilizeaz metoda Print.

Aceste tehnici ofer urmtoarele avantaje n raport cu utilizarea expresiilor urmrite: Aplica ia nu trebuie oprit pentru a ob ine informa ii. Datele i mesajele sunt afiate pe msur ce aplica ia se execut.

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

Tiprirea din codul aplica iei


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 aplica ie n care variabila urmrit (aici Salary) se modific. De exemplu, instruc iunea anterioar poate apar ine unei structuri repetitive.

Tiprirea din fereastra Immediate


Dac aplica ia 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 propriet i. Modulul activ curent determin domeniul de referin . Orice instruc iune 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 propriet i i variabile. Urmtorul exemplu prezint o schem de utilizare a ferestrei Immediate pentru calcule. Fiecare linie (cu excep ia celor care afieaz rezultatele) se va termina cu ENTER:
x ? 5 y ? 6 = 2 x+3 = 3 x*y

Se poate modifica valoarea unei propriet i sau a unei variabile din proiect i relua apoi executarea aplica iei. 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 instruc iune executabil valid Visual Basic, dar nu se accept declara ii 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 instruc iunea i se ntoarce apoi n modul break. n acest moment se pot vedea rezultatele i efectele asupra variabilelor i propriet ilor. Se poate apela orice procedur din forma activ curent, ca i orice procedur dintr-un modul, cu excep ia 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 men inut de Visual Basic ca o instan separat. Aceasta permite testarea separat a diferitelor seturi de argumente. Dialogul Call Stack men ine 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. Observa ie. Dei cele mai multe instruc iuni 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 instruc iunilor 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 instruc iunii
Error 58

produce o caset cu mesajul asociat erorii


File already exists

Trucuri utile n fereastra Immediate


Dup introducerea unei instruc iuni, aceasta se poate reexecuta prin mutarea punctului de inser ie napoi n instruc iune i ENTER. nainte de ENTER se poate edita instruc iunea curent.
o

Se poate utiliza mouse-ul sau sge ile pentru a naviga n fereastra Immediate. Nu se apas ENTER dect pe instruc iunea care se execut.

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

Considera ii speciale
Anumite evenimente care sunt o parte comun cu utilizarea Microsoft Windows pot s ridice probleme speciale pentru depanarea unei aplica ii. Este important s fim contien i de aceste probleme pentru a nu complica procesul de depanare. Dac rmnem contien i de modul n care modul break poate pune evenimentele n dezacord cu ceea ce aplica ia ateapt, avem o ans s gsim solu ii. n anumite proceduri de evenimente, trebuie sutilizm instruc iuni Debug.Print pentru a monitoriza valorile variabilelor/propriet ilor n loc s utilizm expresii santinel sau puncte de oprire.

Oprirea execu iei n procedurile evenimentelor MouseDown sau KeyDown


Dac se oprete execu ia n timpul unei proceduri eveniment MouseDown, se poate lsa butonul mouse-ului sau utiliza mouse-ul pentru alte taskuri. Cnd se continu execu ia, totui, aplica ia presupune c butonul mouse-ului este nc apsat. Nu se va ob ine 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 execu ia n evenimentul MouseDown dac aici este un breakpoint. n acest scenariu nu se va ob ine niciodat evenimentul MouseUp. Solu ia este eliminarea breakpointului din procedura MouseDown. Dac execu ia se oprete n timpul procedurii KeyDown, se aplic din nou considera iile anterioare. Dac exist un breakpoint n procedura evenimentului KeyDown, nu se va ob ine niciodat evenimentul KeyUp.

Oprirea execu iei n procedurile evenimentelor GotFocus i LostFocus


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

Distribuirea solu iilor Microsoft Excel


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

Pregtirea solu iei pentru distribuire


n momentul n care s-a nchegat o solu ie trebuie s se ia o serie de decizii n vederea distribuirii solu iei. 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 solu iei


Atunci cnd se ascrie o solu ie n Visual Basic for Applications, se ob ine un proiect asociat unui document. La distribuirea solu iei 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 solu ii verticale o solu ie foarte specific pentru un utilizator foarte specific. De exemplu, dac se creeaz n Microsoft Word un formular de testare a performan ei, 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). Observa ie. 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 discu ie suplimentar se va citi sec iunea "Salvarea solu iei 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 con ine date pe care utilizatorul nu trebuie s le modifice sau s le vad. Acesta este cazul cnd solu ia con ine proceduri care extind i adapteaz setul de op iuni ale aplica iei 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 solu iei 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 solu iei 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 solu ia cea mai bun. Sa alternativ se poate stabili ca un add-in sau template global s se ncarce automat la pornirea aplica iei. Sau, pentru a nu ncetini pornirea aplica iei, 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


Posibilit ile 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 inten iona ca ncrcarea add-inului sau a template-ului s aib loc la activarea aplica iei Word, Excel sau PowerPoint. Pentru a ncrca add-inuri sau template-uri n mod automat la pornirea aplcia iei, 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 sec iuena precedent), se poate utiliza comanda OPEN din Windows Registry pentru a specifica fiierele addn care se ncarc automat la pornirea aplica iei 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 informa ie dintr-un workbook ct este necesar pentru referirea func iilor 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
Opera iunea 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 loca ia 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 aplica iei. Un template global ncrcat n Word rmne disponibil pentru sesiunea curent, dar nu este rencrcat automat la o nou pornire a aplica iei. Observa ie. 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


Colec ia 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 propriet ii 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 opera iune 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 loca ia 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 spa iu 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 func iona 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 aplica iei poate s creasc semnificativ timpul pornirii aplica iei. 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 men ionat c wizard-urile i add-in-urile ini iate de o comand din menu sunt ncrcate, n mod automat, la cerere. Exist mai multe tehnici pentru a stabili ncrcarea la cerere, specifice diferitelor aplica ii. Observa ie. Dac se inten ioneaz 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 referin elor explicite n Microsoft Excel


Prima metod de ncrcare la cerere este utilizarea unei referin e 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 solu ii care sunt distribuite utiliznd un program de instalare se va vedea sec iunea "Adugarea de meniuri i submeniuri la Microsoft Excel fr ncrcarea unui Add-In".

ncrcarea la cerere a bibliotecilor de func ii n Microsoft Excel


Dac se distribuie o solu ie care con ine o bibliotec de func ii macro ar fi de dorit ncrcarea la cerere a acestei biblioteci. De asemenea, n mod normal este de dorit ca func iile s fie listate n Function Wizard. Pentru ncrcarea la cerere a func iilor este nevoie de macro-uri XLM (Microsoft Excel 4.0 macro sheets). Aceste macro-uri sunt de obicei doar "nveliuri" pentru func ii Visual Basic. Atunci cnd Microsoft Excel vede c un Add-In este marcat pentru ncrcarea la cerere, el citete doar anteturile macro-urilor func ii; ra iunea de prezentare sub form XLM este aceea c informa ia 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 func ie care nvelete o func ie Visual Basic. n prima celul se scrie numele func iei.

o o o

n celula de sub numele func iei se insereaz func ia Argument(Name_Text,


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

func iei din VBA pe care se presupune c-l reprezint.


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

argument; acest parametru este op ional.


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

Dac este necesar s se specifice tipul rezultatului se va utiliza func ia Result(Data_Type_ID). Func ia Return(value) semnaleaz sfnritul macro-ului func ie. Se selecteaz Define din submeniul Name (meniul Insert). Se selecteaz butonul radio Function din grupul Macro. Click pe Add i apoi OK.

Se selecteaz toate celulele care con in macro-ul.


o

Se denumete domeniul cu numele func iei.


o o

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 fa a 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 func ie VBA.
MyFunction =ARGUMENT("szArgOne") =ARGUMENT("intArgTwo") =RETURN(vMyFunction(szArgOne, intArgTwo))

Func ia 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 instan a curent a aplica iei Excel.

Adugarea meniurilor n Excel fr ncrcarea unui Add-in


Microsoft Excel are dou chei noi de registru, care sunt citite la pornirea aplica iei 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) con ine 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 Menu_position Numele noului meniu Pozi ia noului meniu pe bara meniu. Aceasta poate fi numele unui meniu dup care se plaseaz cel nou, sau un numr indicnd pozi ia noului meniu de la stnga barei meniu. Este op ional: dac se definete un submeniu, acesta este numele sau numrul meniului care va con ine noul submeniu, definirea cruia fiind controlat de restul parametrilor.

Menu_parent

Cheia Init Comands


(HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Commands) con ine 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 explica i 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. Numele noii comenzi. Referin a 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. Pozi ia noii comenzi n meniu. Aceasta poate fi numele unei comenzi dup care se plaseaz cea nou, sau un numr indicnd pozi ia noii comenzi pe

Command_name Macro

Command_position

meniu. Dac este omis, comanda apare la sfritul meniului. Macro_key Status_text Este op ional, cheia ataat procedurii, dac exist. Este op ional, mesajul afiat n bara de stare atunci cnd se selecteaz comanda. Este op ional, numele fiierului i numrul intrrii pentru un Help ataat comenzii.

Help_reference

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 con ine 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 Menu_position

Numele meniu Pozi ia comenzii pe bara meniu. Aceasta poate fi numele unei comenzi sau un numr indicnd pozi ia comenzii n meniu.

Observa ie. Este recomandabil s nu se elimine comanda Exit din meniul File dac nu s-a creat o cale alternativ de prsire a aplica iei 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 func iunile add-inului. n mod similar, la descrcarea add-in-ului, aceeai bar de unelte se poate elimina prin executarea unei proceduri speciale. Fiecare aplica ie are totui un mod propriu de realizare a acestor ac iuni.

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 solu iei ca un add-in sau un template global, este util o ultim verificare pentru eliminarea unor erori frecvente, amintite n continuare.

Verificarea referin elor la ActiveWorkbook sau ActiveDocument


Reamintim c dac proiectul VB dintr-un add-in sau template global con ine o referin explicit sau implicit la documentul activ sau la caietul activ, el sa ve referi n execu ie la acel document sau caiet care se va ntmpla s fie activ n momentul aplicrii referin ei. Pentru referin a 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 execu iei codului. Prima procedur con ine o referin explicit, prin ActiveWorkbook. A doua procedur are o referin implicit: deoarece nu se refer explicit la un caiet anumit, referin a 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 func ii, 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 referin e 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 referin e 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 (ob inut prin click dreapta n VBE i alegerea project name Properties). Referin a la un alt proiect se realizeaz manual prin dialogul References ( meniul Tools) sau programatic prin metoda AddFromFile a colec iei 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. Observa ie. Rutina Auto_Open dintr-un add-in referit nu este executat la ncrcare prin referin dintr-un alt addin sau prezentare.

Evitarea referin elor nerezolvate


La salvarea i distribuirea unui add-in sau template, referin ele stabilite pentru proiectul asociat rmn valabile. Totui, dac add-in-urile sau abloanele referite nu sunt la aceleai loca ii pe maina utilizatorului cum erau pe maina de dezvoltare, referin ele nu vor putea fi rezolvate la beneficiar i solu ia nu va fi executat. n Microsoft Excel, Visual Basic ncearc rezolvarea referin elor prin cutare n loca iile: n acela folder cu add-in-ul sau template-ul apelant. n folderul rdcin a aplica iei 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, execu ia este oprit. n continuare sunt enumerate cteva metode care pot fi utilizate n evitarea/rezolvarea referin elor nerezolvate. Toate fiierele se vor livra n acelai folder. Aceasta este solu ia 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 aplica iei 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 por iunea din valoare adugat la instalare. Adugarea folderului solu iei la variabila de mediu Path. Se pot utiliza func iile API GetEnvironmentVariable i SetEnvironmentVariable pentru adugarea temporar a folderului solu iei, sau se poate utiliza scrierea n instruc iunea Path din Autoexec.bat pentru o adugare permanent. Exemplul urmtor utilizeaz func iile 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 referin ele pentru a main specific. Un asemenea agent de referin ar trebuie s verifica referin a i s lege nainte ca solu ia s se execute (sau la momentul ncrcrii). Acest tip de component este bun pentru solu ii trietajate (three-tier). Agentul trebuie s lege dinamic componenta front-end de componenta back-end pe baza versiunii, nivelului de securitate sau al i parametri determina i de administrator. Aceast tehnic poate fi utilizat la actualizarea automat a componentelor. O cale pentru determinarea dac o referin este valid este utilizarea propriet ii IsBroken a obiectului Reference. Proprietatea IsBroken este True dac referin a nu se refer la o intrare valid n Windows Registry.

Apelul unei rutine dintr-un Add-in PowerPoint fr fixarea unei referin e


Dac se dorete ncrcarea temporar a unui fiier add-in i executarea unei rutine din fiier, se va utiliza o instruc iune 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 instruc iune poate fi nlocuit i cu


AddIns(AddIns.Count).Loaded = False

Apelul rutinelor folosind referin e 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 instruc iuni 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 execu ie. 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. Observa ie. Procedeul descris nu func ioneaz n PowerPoint deoarece nu exist un modul ThisPresentation n proiect.

Protejarea sau neprotejarea codului


Stabilirea propriet ii 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 protec iei se va elimina marcarea boxei de control Lock project for viewing i parola introdus.

Salvarea solu iei ca un Add-in sau Global Template


Fiecare aplica ie 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 con ine 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. Observa ie. 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 particularit i, deprotejarea codului i efectuarea ac iunilor uzuale de verificare a codului.

Depanarea unui Add-in Excel


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

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