Documente Academic
Documente Profesional
Documente Cultură
Scurt istoric
1993 VBA apare n Microsoft Excel
1994 VBA este ataat la Microsoft Project
1995 este inclus n Microsoft Access, nlocuind Access Basic
1996 VBA devine element n Visual Basic
1996 este inclus n Word, nlocuind Word Basic
1997VBA este integrat n suita Office 97
1997 Microsoft liceniaz VBA pentru utilizarea n alte aplicaii software
Interfaa grafic VBE este suficient de complex, asemntoare mediilor de programare din Visual Studio. Pe lng
obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite
categorii de obiecte:
Properties Window pentru vizualizarea i fixarea proprietilor n momentul proiectrii (design-time);
Project Explorer care permite navigarea, vizualizarea i modificarea proiectelor deschise la un moment dat;
Code Window unde este se scrie i este vizibil codul surs al proiectului activ;
Locals Window care permite vizualizarea variabilelor locale cu valorile lor;
Immediate Window care permite executarea imediat a unei linii de cod;
Watch Window unde se afieaz valorile unor expresii specificate (utile n depanarea programelor).
Properties Window
Prin proprietate a unui obiect se nelege o caracteristic a
respectivului obiect (cum ar fi culoarea sau vizibilitatea etc.).
Fixarea valorii proprietii se reflect n aparena obiectului sau n
comportamentul lui (de exemplu, fixarea proprietii
ShowSpellingErrors la valoarea True arat n document erorile de
scriere).
Fereastra Properties poate fi utilizat, n momentul proiectrii,
pentru a vizualiza toate proprietile obiectului activ i a modifica
valorile dorite.
n partea superioar este cutia de obiecte n care se poate selecta
un obiect (sau mai multe) dintre cele vizibile.
n fia Alphabetic se listeaz proprietile modificabile ale
obiectului selectat, n ordine alfabetic. Se poate modifica
valoarea unui atribut prin selectarea numelui proprietii i
tastarea sau selectarea noii valori.
n fia Categorized sunt listate proprietile dup categorii, ntr-un
control de tip Explorer, in care ramurile pot fi expandate sau.
Fereastra Properties poate fi artat (cnd nu este vizibil), prin
comanda Properties Window din meniul View.
Project Explorer
Codul surs asociat cu un workbook, document, template sau
prezentare este asociat ntr-un proiect, care este memorat i salvat n
mod automat o dat cu caietul Excel, documentul Word, ablonul sau
prezentarea respectiv. n fereastra Project Explorer se pot vedea,
modifica i naviga printre toate proiectele asociate oricrui document,
caiet, ablon sau prezentare deschise.
Pentru un proiect se listeaz, ntr-un control de tip Explorer, obiectele
care recunosc evenimente, formele, modulele, referinele. Pentru a
vedea codul dintr-un modul sau codul asociat unui obiect, se selecteaz
respectivul modul sau obiect i se apas butonul View Code (primul
din stnga). Pentru a vedea interfaa utilizator pentru un obiect sau
form se selecteaz i se apas butonul View Object (cel din mijloc).
Pentru a vedea organizarea n foldere a elementelor listate n Project
Explorer se va apsa butonul Toggle Folders.
Fiecare element este nsoit, n arborele de structur, de icoana specific
elementului: proiect, folder, referin, obiect etc.
Code Window
Fereastra principal a Editorului Visual Basic este cea n care se poate scrie codul surs. Deoarece procedurile sunt
asociate unor obiecte de interfa, sau aparin unui modul, mai nti se va selecta, din Project Explorer, modulul sau
forma vizat i apoi se va apsa butonul View Code.
Pentru a vedea mai mult de o procedur n fereastra de cod, se va selecta boxa de control Default to Full Module
View n fia Editor din Options (meniul Tools) (n caz contrar se va vedea doar cte o procedur).
Locals Window
Util n procesul de punere la punct a programului, fereastra Locals servete la afiarea automat a tuturor
variabilelor declarate n procedura curent. Coninutul ferestrei este actualizat de fiecare dat cnd se trece din
modul Run n modul Break sau atunci cnd se navigheaz n stiva de apeluri.
Pentru o descriere a ferestrei se va vedea seciunea dedicat depanrii programelor.
Immediate Window
Permite scrierea i execuia imediat a unei linii de cod. Linia poate fi copiat n i dintr-o fereastr de cod.
n modul de execuie Break, instruciunea din fereastra Immediate este executat n contextul procedurii afiate n
Procedure Box.
Pentru aciunile posibile n fereastra Immediate, se va studia Help Immediate Window Keyboard Shortcuts.
Watch Window
Este fereastra unse sunt afiate automat valorile expresiilor urmrite n etapa de depanare a proiectului.
Pentru o descriere a ferestrei Watch se va vedea seciunea dedicat depanrii programelor.
Scrierea procedurilor
Instruciunile unui proiect se pot nscrie, dup modul lor de creare, n dou mari categorii:
scrise de aplicaia de baz (Word, Excel etc.) prin traducerea aciunilor interfeei utilizator (meniuri, comenzi etc.)
n cod VBA. Aceast operaiune este cea de nregistrare a unui macro.
scrise ntr-o fereastr de cod de ctre utilizator (proiectant), cu asistena mediului VBE.
obiecte grafice) codul generat automat ofer un bun model de utilizare a obiectelor, proprietilor i metodelor
aplicaiei.
Pentru a nregistra un macro:
Se afieaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite).
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.
Pe bara Stop Recording (aprut la iniierea procesului de nregistrare) se apas butonul Stop
Recording.
Pentru a vedea liniile de cod generate, se deschide n aplicaia de baz meniul Tools, comanda Macro, apoi
Macros, se selecteaz dup denumire i se apas butonul Edit.
Codul surs poate fi vzut i prin navigarea n VBE prin Project Explorer, ferestre de cod etc.
Din punctul de vedere al programrii se poate spune c un macro este o procedur public fr argumente, deci
poate fi scris i direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care pot
fi executate din dialogul Macros (Tools - Macro - Macros) sunt macro-uri.
Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dup ce sau scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte
(Document, Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite.
Observaie. Dac se dorete ca o procedur s fie asociat cu un document specific, dar nu cu un eveniment
specific, atunci procedura se va scrie n seciunea (General) a documentului respectiv (de exemplu o rutin care s
poat fi apelat din mai multe proceduri de eveniment).
din VBE, dac punctul de inserie este n procedur i se acioneaz butonul Run Sub/UserForm de
pe bara de unelte Standard sau Debug;
Instruciunile VBA
Tipuri de date
Variabilele i constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre
deosebire de alte limbaje de programare, exist un tip universal tipul Variant , care poate conine aproape
orice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct declararea
explicit poate fi utilizat atunci cnd se dorete economisirea memoriei (tipul Variant aloc mai mult memorie),
vitez n execuie sau atunci cnd se scriu date ntr-un fiier n acces direct.
Boolean
Domeniu de valori: True sau False (valorile logice)
Memorie: 2 bytes
Declarator de tip:
Observaii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule
produc True.
Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.
Byte
Domeniu de valori: 0255 (numere ntregi, fr semn)
Memorie: 1 byte
Declarator de tip:
Observaii.
Currency
Domeniu de valori: -922 337 203 685 477.5808 922 337 203 685 477.5807
Memorie: 8 bytes
Declarator de tip: @
Observaii. Utilizate pentru calcule bneti (sau alte situaii n care precizia este foarte
important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obine 15 cifre
la partea ntreag i 4 cifre la partea zecimal (reprezentare n virgul fix).
Date
Domeniu de valori: 1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59
Memorie: 8 bytes
Declarator de tip:
Observaii. Informaiile de tip dat calendaristic i/sau timp orar sunt memorate drept numere
flotante, partea ntreag reprezentnd data calendaristic, partea fracionar reprezentnd timpul.
La convertiri, miezul nopii este 0, miezul zilei este .5, numerele negative reprezint date nainte de
30 decembrie 1899.
Poate fi atribuit ca valoare de tip date orice literal care reprezint o dat calendaristic recunoscut
ca atare, literalul trebuind s fie cuprins ntre simboluri #, de exemplu #1 Jan 99#.
Decimal
Domeniu de valori: (vezi observaiile)
Memorie: 12 bytes
Declarator de tip:
Observaii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nsoii de un factor de
scal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (fr parte zecimal), cea mai
Double
Domeniu de valori: numere negative de la -1.79769313486232E308 pn la 4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pn la
1.79769313486232E308 (numere flotante n dubl precizie).
Memorie: 8 bytes
Declarator de tip: #
Observaii.
Integer
Domeniu de valori: -32 768 32 767.
Memorie: 2 bytes
Declarator de tip: %
Observaii.
Long
Domeniu de valori: -2 147 483 648 2 147 483 647.
Memorie: 4 bytes
Declarator de tip: &
Observaii.
Object
Domeniu de valori: (vezi observaiile)
Memorie: 4 bytes
Declarator de tip:
Observaii. Adrese pe 32 de bii care se refer la obiecte. Prin instruciunea Set se atribuie unei
variabile declarate de tip Object referina la obiectul dorit.
Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataare
trzie (la timpul execuiei run-time binding). Pentru o ataare timpurie (la timpul compilrii
compile-time binding) se va utiliza o variabil declarat cu numele clasei respective.
Single
Domeniu de valori: numere negative de la -3.402823E38 pn la -1.401298E-45; numere pozitive
de la 1.401298E-45 pn la 3.402823E38.
Memorie: 4 bytes
Declarator de tip: !
Observaii.
String
Domeniu de valori: ir de lungime variabil: pn la 2^31 caractere; ir de lungime fix: pn la
2^16 caractere.
Memorie: 2 bytes
Declarator de tip: $
Observaii. Un ir de lungime fix declarat Public nu poate fi utilizat ntr-un modul de clas.
Variant (default)
Domeniu de valori: aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuri
ale tipului Variant, cu meniunea c toate subtipurile numerice au domeniul de la Double.
Memorie: n funcie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String
necesit 22 bytes plus cte un byte pentru fiecare caracter.
Declarator de tip:
Observaii. Este tipul specificat implicit (n lipsa unei declaraii explicite) pentru o constant,
variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferenele
de tip ale argumentelor la apelul procedurilor).
Cu excepia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul
Variant poate conine orice alt tip de dat. n plus poate s conin valorile speciale Empty, Error,
Nothing i Null. Tipul considerat pentru o dat coninut ntr-un Variant poate fi determinat cu
funcia VarType sau TypeName.
Valorile unei variabile Variant pot s-i converteasc valorile automat. n general, datele numerice
sunt memorate n tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac
rezultatul unei operaii necesit acest fapt. De exemplu o valoare declarat iniial drept Integer i
atribuit unui Variant va fi memorat ca un ntreg pn cnd, ridicnd-o de exemplu la o putere,
valoarea ei excede domeniul tipului Integer. n acest caz are loc promovarea (ca mod de
reprezentare) la tipul superior adecvat (Long sau Double). Dac depirea domeniului are loc
pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare.
Utilizarea tipului Variant permite o tratare mai difereniat a irurilor de cifre: n operaii numerice
vor fi considerate numere iar n operaii cu iruri vor fi considerate iruri.
Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite.
Valorile speciale au semnificaia:
Empty este valoarea unui Variant care nu a fost iniializat. n calcule numerice este considerat 0 iar n operaii cu
iruri este irul de lungime zero.
Null este valoarea unui Variant care, n mod programatic, nu conine date.
Error este valoarea utilizat pentru a arta ndeplinirea unei condiii de eroare (prin convertirea unui real cu funcia
CVErr). Procesarea se va efectua de ctre utilizator, tratarea automat a erorilor nu este activat la setarea acestor
valori.
Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv.
Declararea constantelor
Definirea unei constante se realizeaz prin instruciunea Const, n care se poate specifica tipul, domeniul i valoarea
constantei. Valoarea unei constante nu se poate schimba programatic.
[Public | Private] Const constname [As type] = expression
Public cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din toate modulele. Nu este permis n proceduri.
Private cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din modulul n care apare declaraia. Nu este permis n proceduri.
constname numele constantei (obligatoriu).
type tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nc nu este suportat),
Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; n lipsa clauzei se va ataa automat
tipul cel mai apropiat expresiei.
expression combinaie de identificatori, constante, operatori (cu excepia Is) care produce un sir, numr sau
obiect. Nu se pot utiliza variabile, funcii utilizator sau funcii VBA predefinite.
n mod implicit, constantele sunt private. La nivel de procedur, sau de modul clas, domeniul lor nu poate fi
modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public.
Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afara
unei proceduri este definit n modulul respectiv.
Mai multe declaraii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri de
expresii. n acest caz, cuvintele Public sau Private care apar se aplic ntregii linii.
Exemple
Const NrLinii = 15
Public Const MesajInitial = "Tastati numarul de linii"
Private Const NrLinii as Integer = 15
Public Const NrLinii = 15, Pondere as Single = 1.21
Este de remarcat c, n ultima linie, doar Pondere este de tip Single, n timp ce NrLinii este de tip Integer (n lipsa
clauzei As type se atribuie tipul expresiei).
Declararea variabilelor
Variabilele, simple sau tablou, se definesc prin instruciunile Dim, Private, Public, ReDim sau Static. Numele unei
variabile trebuie s respecte regulile generale de formare a identificatorilor, tipul variabilei poate fi definit explicit
(prin clauza As type) sau implicit (ca Variant).
n cazul n care modulul conine instruciunea Option Explicit cu sintaxa
Option Explicit
i care trebuie s apar naintea oricrei proceduri din modul, toate variabilele trebuie s fie declarate prin
instruciunile menionate. Lipsa instruciunii Option Explicit permite ca variabilele s fie definite acolo unde este
nevoie de ele prin simpla menionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim
posibilitate poate produce erori greu detectabile.
Exemple
Dim x As Double, ColtStanga As Integer
Private I, J As Long
Static Venit As Currency, NumPren As String
Dim Retineri(5) As Currency
Public indicatori(10) As Byte
Dim matrice(1 To 3, 100 To 200) As String
Public fntScris As Font
Dim appWD As Word.Application
Proceduri
Printr-o procedur se nelege, similar altor limbaje de programare, o mulime de instruciuni care este identificat
printr-un nume i care se execut unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o
procedur s efectueze o prelucrare unitar identificabil n logica programului.
Exist trei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unui
obiect i va fi prezentat ulterior. O procedur de tip Sub poate primi i transmite informaii prin intermediul unor
variabile publice sau/i a unor parametri. Numele procedurii nu are ataat nici o valoare. O procedur de tip
Function se deosebete prin aceea c numele procedurii are ataat o valoare (valoarea funciei) i poate fi utilizat
ca orice alt variabil din proiect.
Observaie. Orice instruciune executabil trebuie s aparin unei proceduri. Declaraiile pot s apar i n afara
procedurilor, la nivel de modul.
Proceduri Sub
Organizarea general a unei proceduri de tip Sub este
[Private | Public] [Static] Sub name ([arglist])
[instruciuni]
[Exit Sub]
[instruciuni]
End Sub
Public, Private, Static determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate
modulele (n funcie de Option Private se definete vizibilitatea pentru alte proiecte). Private = vizibil doar pentru
procedurile din modulul unde procedura este declarat. Static = arat c toate variabilele locale i pstreaz
valorile ntre apeluri.
name numele procedurii.
arglist lista de argumente, separate prin virgule.
Prin instruciunea Exit Sub se poate iei din procedur i altminteri dect prin linia final.
Argumentele se definesc dup sintaxa:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
Optional arat c parametrul nu este obligatoriu. Parametrii opionali trebuie s fie grupai la sfritul listei
(apariia clauzei Optional cere ca toi parametrii care urmeaz s aib aceeai clauz).
ByVal arat c apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regsit
dup prsirea procedurii, calculele efectundu-se pe o copie a parametrului).
ByRef arat c apelul paramatrului se face prin referin (orice modificare a valorii transmise este regsit dup
prsirea procedurii). Acesta este modul implicit de transmitere a parametrilor.
ParamArray folosit doar ca ultim argument n list, denot un tablou Optional de elemente de tip Variant.
Clauza ParamArray permite definirea unui numr arbitrar de parametri. ParamArray nu poate fi utilizat mpreun
cu ByVal, ByRef, sau Optional.
varname numele argumentului. Dac este tablou se vor indica parantezele.
type tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String
(doar lungime variabil), Object, Variant. Pentru parametrii obligatorii (fr Optional) poate fi i un tip definit sau
de obiect.
defaultvalue definete valoarea implicit pentru argumentele opionale. Poate fi orice expresie, dar pentru tipul
Object se admite doar Nothing.
unde lista de argumente poate sau nu s fie inclus ntre paranteze. Argumentele efective sunt separate n list prin
virgule i trebuie s respecte ordinea (i tipul) argumentelor din definiia procedurii. n cazul procedurilor cu multe
argumente, dintre care multe opionale, transferul poate provoca erori de scriere a codului (un argument opional
necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situaii (n special) se
permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alctuind lista
de argumente, la apelul procedurii, din intrri de forma
nume_argument:=valoare_argument
separate prin virgule i la care nu mai conteaz ordinea iniial a argumentelor. Se vor specifica doar parametrii
care se transmit efectiv (adic valorile opionale dorite i toate valorile neopionale).
Pentru apelul unei proceduri se va studia i instruciunea Call.
Proceduri Function
O procedur de tip Function este similar, ca definiie, unei proceduri Sub, dar are particularitatea c returneaz o
valoare prin numele su (care se comport deci ca o variabil).
[Public | Private] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
Este de remarcat c se poate ataa un tip numelui funciei (adic valorii funciei) i se va remarca existena
instruciunilor prin care se atribuie funciei valorile calculate.
Valoarea returnat de o funcie poate fi utilizat ntr-o alt expresie prin includerea numelui funciei urmat, ntre
paranteze, de valorile efective ale parametrilor.
Dac apelul se face prin intermediul instruciunii Call, valoarea funciei nu poate fi utilizat. n asemenea situaii se
activeaz de fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate).
Exemple de proceduri
Public Function AriaCilindru (raza, inaltime) As Double
Const Pi = 3.14159
cilBaza = Pi*raza^2
cilLaterala = 2*Pi*raza*inaltime
AriaCilindru = 2*cilBaza + cilLaterala
End Function
Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, ByRef cilAria As Double)
Const Pi As Single = 3.14159
Dim cilBaza As Single, cilLaterala As Single
cilBaza = Pi*raza^2
cilLaterala = 2*Pi*raza*inaltime
cilAria = 2*cilBaza + cilLaterala
End
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.
0 (zero)
ir de lungime variabil
ir de lungime fix
Variabil Variant
Empty
Variabil Object
Variabile Object
Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object
Dim myDoc As Object
n primul mod de definire (ca Object) nu se poate efectua la momentul compilrii existena obiectului, nu se poate
verifica utilizarea corect a propriettilor i metodelor obiectului i nu se poate lega aceast informaie de variabila
obiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execuiei i se
efectueaz prin instruciunea Set.
Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapid,
se face la momentul compilrii i poate nltura mai rapid erori posibile n utilizarea metodelor i proprietilor
obiectului.
Instruciunea Set are sintaxa:
Set objectvar = {[New] objectexpression | Nothing}
unde
Exemple
Prin urmtoarele dou instruciuni se definete variabila objWord care este legat trziu de o aplicaie Word:
Dim objWord As Object
Set obhWord = CreateObject("Word.Application")
Legarea timpurie se poate efectua prin
Dim objWord As Word.Application
Este de remarcat c instruciunea Set apeleaz o funcie care creeaz i returneaz o referin la un obiect ActiveX.
n loc de
Application.DisplayAlerts = -1
pentru a fixa ca Word s afieze toate mesajele de alert la execuia unei proceduri. Codul scris astfel este i mai
explicit.
Instruciunile VBA
Exist trei categorii de instruciuni Visual Basic:
instruciuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru
variabile, constante i proceduri;
instruciuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor;
instruciuni executabile (prezentate n continuare) care iniiaz aciuni: execut metode sau proceduri, controleaz
fluxul execuiei codului.
n mediul de dezvoltare VBA, sintaxa instruciunilor este verificat automat dup ce se trece la instruciunea
urmtoare (prin Enter).
Continuarea instruciunilor
O instruciune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de
un spaiu. De exemplu, crearea prin program a unui tabel ntr-un document Word:
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=3, _
NumColumns:= 3
unde, pe lng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare a
unui nou tabel la colecia de tabele a documentului.
Dou instruciuni pot fi scrise pe o aceeai linie dac sunt separate cu caracterul ":".
Etichetarea liniilor
O linie poate fi identificat:
printr-o etichet: orice nume, care respect regulile generale, care ncepe n prima coloan a liniei i se termin cu
caracterul ":"
printr-un numr: orice combinaie de cifre, care ncepe n prima coloan a liniei i este unic n modulul respectiv.
Identificatorii de linii pot fi utilizai n instruciuni de control, desi codul astfel construit nu respect regulile
programrii structurate..
Comentarii
Textele explicative (necesare documentrii codului) pot fi introduse pe linii separate sau n continuarea liniei de
cod.
O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Rem urmat de un spaiu.
Comentariul de pe aceeai linie cu o instruciune se introduce printr-un apostrof urmat de comentariu.
Operatori
n formarea expresiilor de diverse tipuri, operatorii sunt cei utilizai aproape general n limbajele de programare de
nivel nalt. Pentru fixarea termenilor i notaiilor sunt totui prezentai, pe categorii, nsoii, acolo unde este cazul
de scurte explicaii.
Operatori aritmetici
Operator
Semnificaie
Observaii
Ridicarea la
putere
nmulirea
mprirea
mprirea
ntreag
Restul mpririi
Adunarea
numeric sau
concatenarea
irurilor
Mod
+(operator).
-
Scderea sau
inversarea
semnului
Operatori de comparare
Relaiile care exist ntre diferite tipuri de entiti se pot evidenia prin comparaii avnd una dintre formele
urmtoare:
result = expression1 comparisonoperator expression2
result = object1 Is object2
result = string Like pattern
unde
result este o variabil numeric
expression este o expresie oarecare
comparisonoperator este un operator relaional
object este un nume de obiect
string este o expresie ir oarecare
pattern este o expresie String sau un domeniu de caractere.
Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau egal), > (mai mare), >= (mai mare sau egal),
= (egal), <> (diferit, neegal).
Rezultatul este True (dac este adevrat relaia), False (dac relaia este neadevrat), Null (dac cel puin un
operand este Null).
Operatorul Is produce True dac variabilele se refer la acelai obiect i False n caz contrar.
Operatorul Like compar dou iruri cu observaia c al doilea tremen este un ablon. Prin urmare rezultatul este
True dac primul ir operand este format dup ablon, False n caz contrar. Atunci cnd un operand este Null,
rezultatul este tot Null.
Comportarea operatorului Like depinde de instruciunea Option Compare, care poate fi:
Option Compare Binary, ordinea este cea a reprezentrii interne binare, determinat n Windows de codul de
pagin.
Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de setrile
locale ale sistemului.
Construcia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere:
?
un caracter oarecare
[charlist]
cratimei.
oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea
[!charlist]
Observaie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construcii de tip
list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ].
Pentru alte observaii utile se va studia Help Like operator.
Operatori de concatenare
Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +.
n sintaxa
expression1 & expression2
unde operanzii sunt expresii oarecare, rezultatul este
de tip String, dac ambii operanzi sunt String
de tip Variant(String) n celelalte cazuri
Null, dac ambii operanzi sunt Null.
nainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Empty
sunt tratate ca iruri de lungime zero ("").
Operatori logici
Pentru operaiile logice sunt utilizai urmtorii operatori, uzuali n programare.
Operator
Semnificaie
Observaii
And
conjuncia logic
Eqv
echivalena logic
Imp
implicaia logic
True Imp Null este Null, False Imp * este True, Null Imp
True este True, Null Imp False (sau Null) este Null.
Operatorul Imp realizeaz i compararea bit cu bit a dou
expresii numerice, poziionnd cifrele binare ale
rezultatului dup regulile de calcul ale implicaiei logice: 1
Imp 0 este 0, n rest rezultatul este 1.
Not
negaia logic
Not Null este Null. Prin operatorul Not se poate inversa bit
cu bit valorile unei variabile, poziionndu-se
corespunztor un rezultat numeric.
Or
disjuncia logic
Null Or True este True, Null cu False (sau Null) este Null.
Operatorul Or realizeaz i o comparaie bit cu bit a dou
expresii numerice poziionnd biii corespunztori ai
rezultatului dup regulile lui Or logic.
Xor
disjuncia
exclusiv
Instruciuni de atribuire
Atribuirea se poate efectua prin instruciunea Let (pentru valori atribuite variabilelor i proprietilor), Set (pentru
atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite
de utilizator).
Instruciunea Let
Atribuie valoarea unei expresii la o variabil sau proprietate.
[Let] varname = expression
unde varname este nume de variabil sau de proprietate.
Este de remarcat forma posibil (i de fapt general utilizat) fr cuvntul Let.
Observaii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu
pot fi atribuite variabilelor de tip String i nici reciproc.
Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dac valoarea expresiei
Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip
String (cu excepia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric.
La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei.
Atribuirea valorilor de tip utilizator poate fi efectuat doar dac ambii termeni au acelai tip definit. Pentru alte
situaii se va utiliza instruciunea Lset.
Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n
aceast situaie instruciunea Set.
Instruciunea LSet
Copie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Deoarece copierea este binar, poate fi utilizat pentru atribuiri ntre tipuri utilizator diferite (rezultatul este
impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este
LSet stringvar = string
LSet varname1 = varname2
unde
stringvar, string reprezint variabila de tip String i expresia de acelai tip implicate ntr-o atribuire de iruri.
varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruciunea Type) diferite.
Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stnga) n zona de memorie a primei
variabile.
Caracterele care rmn neocupate se completeaz cu spaii, iar dac zona de unde se copie este mai mare,
caracterele din dreapta se pierd (sunt trunchiate).
Instruciunea LSet
Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Sintaxa este
RSet stringvar = string
Caracterele rmase neocupate n variabil sunt completate ccu spaii. Instruciunea RSet nu se poate utiliza (analog
lui LSet) pentru tipuri definite de utilizator.
Instruciuni executabile
Execuia unui program are loc, n lipsa oricrui control, instruciune cu instruciune, de la stnga la dreapta i de sus
n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a operaiilor n evaluarea
expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele programrii i din acest
motiv necesitatea structurilor de control a fluxului execuiei. Unele instruciuni au fost pstrate doar din motive de
compatibilitate cu versiunile iniiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare
altor limbaje de programare.
GoSubReturn
n cadrul unei proceduri un grup de instruciuni poate fi organizat ca o subrutin (similar unei proceduri on-line,
nenumite) identificat prin linia de nceput. Transferul controlului la acest grup de instruciuni i revenirea la locul
apelului se poate efectua prin GoSubReturn cu sintaxa
GoSub line
...
line
...
Return
unde line este o etichet de linie sau un numr de linie din aceeai procedur.
Pot exista mai multe instruciuni Return, prima executat produce saltul la instruciunea care urmeaz celei mai
recente instruciuni GoSub executate.
GoTo
Realizeaz tranferul controlului execuiei la o linie din aceeai procedur.
GoTo line
unde line este o etichet de linie sau un numr de linie din aceeai procedur.
On Error
Permite controlul erorilor prin transferul controlului la rutine de tratare.
Observaie. Este prezentat n seciunea dedicat controlului erorilor.
OnGoSub, OnGoTo
Permit o ramificare multipl, dup valoarea unei expresii. Se recomand, pentru claritatea codului, utilizarea
structurii Select Case n locul acestor structuri.
On expression GoSub destinationlist
On expression GoTo destinationlist
unde
expression este o expresie numeric avnd valoare ntreag (dup o eventual rotunjire) ntre 0 i 255 inclusiv.
destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele
categorii), din aceeai procedur cu instruciunea.
Dac valoarea expresiei este negativ sau mai mare dect 255 se produce o eroare.
Dac valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfer controlul la linia identificat
de al k-lea element al listei.
Dac valoarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueaz la linia
care urmeaz instruciunea On...GoSub sau On...GoTo.
DoEvents
Dei nu este o instruciune VBA ci este o funcie, includerea ei este natural prin aceea c permite cedarea
controlului ctre sistemul de operare, care poate astfel s funcioneze n regim de multitasking. Aciunea poate fi
realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este
DoEvents( )
Funcia returneaz, n general, valoarea 0.
Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de
evenimente, ca i procesarea tuturor caracterelor din coada SendKeys.
Observaie. Pentru alte observaii se va studia documentaia comenzii DoEvents.
End
Termin execuia unei proceduri (sub forma prezentat aici) sau indic sfritul codului unei structuri de tip bloc
(cum ar fi End Function, End If etc., prezentate la structurile respective).
Sintaxa, n ipostaza opririi execuiei, este:
End
Prin aceast instruciune, care poate fi plasat oriunde n program, execuia este terminat imediat, fr a se mai
executa eventualele instruciuni scrise pentru tratarea unor evenimente specifice sfritului de program (Unload,
Terminate etc.).
Fiierele deschise prin Open sunt nchise i toate variabilele sunt eliberate. Obiectele create din modulele clas sunt
distruse, iar referinele din alte aplicaii la asemenea obiecte sunt invalidate. Memoria este eliberat.
Exit
Prin instruciunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execuie (cum ar fi o procedur, o
structur iterativ etc.) pentru a se continua nivelul apelant. Sintaxa este
Exit Do
Exit For
Exit Function
Exit Property
Exit Sub
i efectele sunt prezentate la structurile respective. Nu trebuie confundat cu instruciunea End.
Stop
Efectul instruciunii este dependent de modul de execuiei a programului. Dac se execut varianta compilat a
programului (fiierul .exe) atunci instruciunea este similar instruciunii End (suspend execuia i nchide fiierele
deschise). Dac execuia este din mediul VBA, atunci se suspend execuia programului, dar nu se nchid fiierele
deschise i nu se terge valoarea variabilelor. Execuia poate fi reluat din punctul de suspendare.
Stop
Instruciunea este similar introducerii unui punct de oprire (Breakpoint) n codul surs.
DoLoop
Se vor utiliza structuri DoLoop pentru a executa un grup de instruciuni de un numr de ori nedefinit aprioric.
Dac se cunoate numrul de cicluri, se va utiliza structura ForNext.
nainte de continuare se va testa o condiie (despre care se presupune c poate fi modificat n instruciunile
executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condiiei i decizia luat.
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
sau
Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
unde
condition este o expresie care valoare de adevr True sau False. O condiie care este Null se consider False.
statements sunt instruciounile care se repet atta timp (while) sau pn cnd (until) condiia devine True.
Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruciune care urmeaz ntregii structuri
(deci de dup linia care ncepe cu Loop).
Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax). Dac
apare o comand Exit Do se poate omite chiar i condiia din enun ntruct execuia se va termina prin aceast
decizie.
Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfer
controlul la nivelul Do imediat superior.
Execuia structurilor este explicat n tabelul urmtor
Do WhileLoop
Do UntilLoop
DoLoop While
DoLoop Until
ForNext
Atunci cnd se cunoate numrul de repetri ale unui bloc de instruciuni, se va folosi structura ForNext.
Structura utilizeaz o variabil contor, a crei valoare se modific la fiecare ciclu, oprirea fiind atunci cnd se
atinge o valoare specificat. Sintaxa este:
For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
unde
counter este variabila contor (numr repetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou.
start este valoarea iniial a contorului.
end este valoarea final a contorului.
step este cantitatea care se adun la contor la fiecare pas. n cazul n care nu se specific este implicit 1. Poate fi i
negativ.
statements sunt instruciunile care se repet. Dac nu se specific, atunci singura aciune este cea de modificare a
contorului de un numr specificat de ori.
Aciunea este dictat de pasul de incrementare i relaia dintre valoarea iniial i cea final.
Instruciunile din corpul structurii se execut dac
counter <= end pentru step >= 0 sau
counter >= end pentru step < 0.
Dup ce toate instruciunile s-au executat, valoarea step este adugat la valoarea contorului i instruciunile se
execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima
instruciune de dup linia Next.
Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd exist structuri
ForNext mbricate.
Corpul unei bucle ForNext poate include (complet) o alt structur ForNext. n asemenea situaii, structurile
mbricate trebuie s aib variabile contor diferite.
Instruciunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul
execuiei se transfer la prima instruciune de dup linia Next.
For EachNext
Similar structurii ForNext, structura For EachNext repet un grup de instruciuni pentru fiecare element dintro colecie de obiecte sau dintr-un tablou (cu excepia celor de un tip utilizator). Este util atunci cnd nu se
cunoate numrul de elemente sau dac se modific, n timpul execuiei, coninutul coleciei.
Sintaxa este:
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
unde
element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colecie de
obiecte, atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect
specific pentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, element poate fi doar
o variabil de tip Variant.
group este numele coleciei de obiecte sau al tabloului.
statements este grupul de istruciuni executate pentru fiecare element.
Execuia unei structuri For EachNext este
1. Se definete element ca numind primul element din grup (dac nu exist nici un element, se
transfer controlul la prima instruciune de dup Next se prsete bucla fr executarea
instruciunilor).
Se execut instruciunile din corpul buclei For.
Se testeaz dac element este ultimul element din grup. Dac rspunsul este afirmatif, se prsete bucla.
WhileWend
Execut un grup de instruciuni att timp ct este adevrat o condiie. Sintaxa
While condition
[statements]
Wend
Este recomandat s se utilizeze o structur DoLoop n locul acestei structuri.
With
Programarea orientat pe obiecte produce, datorit calificrilor succesive, construcii foarte complexe atunci cnd
se numesc proprietile unui obiect. n cazul modificrilor succesive ale mai multor proprieti ale aceluiai obiect,
repetarea zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificat
prin utilizarea structurii WithEnd With. O asemenea structur execut o serie de instruciuni pentru un obiect sau
pentru o variabil de tip utilizator. Sintaxa este:
With object
[statements]
End With
unde
object este numele unui obiect sau a unui tip definit de utilizator
statements sunt instruciunile care se execut pentru entitatea precizat.
Permind omiterea recalificrilor din referinele la obiectul precizat, orice construcie de tipul
".nume" este interpretat n instruciunile structurii drept "object.nume".
ntr-un bloc With nu se poate schimba obiectul procesat.
La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificrile
eventuale la acest obiect vor fi efectuate.
Nu se recomand saltul n i dintr-un bloc With.
IfThenElse
O asemenea structur, ntlnit de altfel n toate limbajele de programare, execut un grup de instruciuni ca
rspuns la ndeplinirea unei condiii (compus sau nu din mai multe condiii testate secvenial). Sintaxa permite o
mare varietate de forme:
If condition Then [statements] [Else elsestatements]
sau
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
unde
condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat
False);
expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat
n objecttype.
statements, elsestatements, elseifstatements sunt blocurile de instruciuni executate atunci cnd condiiile
corespunztoare sunt True.
La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruciuni, separate de ":", pe
aceeai linie.
Verificarea condiiilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor
rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True).
Select Case
Instruciunea Select Case se poate utiliza n locul unor instruciuni ElseIf multiple (dintr-o structur
IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruciunea
Select Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruciunii IfThenElseIf. Totui,
Select Case produce un un cod mai eficient i mai inteligibil. Sintaxa este:
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
unde
testexpression este o expresie numeric sau ir.
expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma:
expression.
prima specificat.
pentru a specifica un domeniu de valori.
statements-n reprezint una sau mai multe instruciuni care se vor executa dac testexpression este egal cu un
element din expressionlist-n.
elsestatements reprezint una sau mai multe instruciuni care se vor executa dac testexpression nu este egal cu
nici un element din listele liniilor Case.
Dac testexpression se potrivete cu un element dintr-o list Case, se vor executa instruciunile care urmeaz
aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execuiei trece apoi la
instruciunea care urmeaz liniei finale End Select. Rezult c dac testexpression se regsete n mai multe liste,
doar prima potrivire este considerat.
Clauza Case Else are semnificaia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruciunile care se
execut atunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dac aceasta este
situaia i nu este specificat o clauz Case Else, atunci execuia urmeaz cu prima instruciune de dup End Select.
Instruciunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structur are
End Select propriu, includerea este complet).
Funcia Shell()
Execut un program executabil i returneaz un Variant(Double) reprezentnd ID-ul de task al programului n caz
de succes; n caz contrar returneaz zero. Sintaxa este
Shell(pathname[,windowstyle])
unde
pathname este Variant (String). Conine numele programului care se execut, argumentele
necesare i poate da calea complet (dac este nevoie).
windowstyle este Variant (Integer) i precizeaz stilul ferestrei n care se va executa programul
(implicit este minimizat, cu focus).
Valorile posibile pentru argumentul windowstyle sunt
Constanta numit
Valoarea
Semnificaia
VbHide
VbNormalFocus
VbMinimizedFocus
VbMaximizedFocus
VbNormalNoFocus
VbMinimizedNoFocus
Dac funcia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut
asincron, deci nu exist certitudinea c acest program se termin nainte de execuia instruciunilor care urmeaz
liniei Shell.
Operaiuni de intrare-ieire
n categoria operaiunilor de I/O se pot deosebi
schimbul de informaii cu utilizatorul: acesta se poate desfura prin intermediul unor formulare (forms) predefinite
(InputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului VBA.
schimbul de informaii cu fiiere i/sau baze de date: acesta se realizeaz prin intermediul unor instruciuni dedicate
acestor operaii.
Funcia InputBox
Apelul funciei InputBox afieaz o box de dialog care conine un mesaj, dou butoane (OK i Cancel) i o zon
text n care se poate tasta un rspuns (de tip String, chiar dac se transmite o valoare numeric). Se ateapt ca
utilizatorul s introduc un text n zona rezervat sau s acioneze un buton. Textul introdus este transmis ca
valoare a funciei la acionarea butonului OK (sau Enter), iar acionarea butonului Cancel (ca i nchiderea
dialogului ca fereastr) transmite un ir de lungime zero (indiferent de valoarea zonei text. Sintaxa este
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
unde
prompt este expresia String cu mesajul afiat n dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai multe
linii prin combinaii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF.
este expresia de tip String cu titlul ferestrei dialogului. Dac este omis se va folosi titlul aplicaiei.
title
default este expresia de tip String, opional, coninnd textul afiat iniial n zona text rezervat utilizatorului.
Textul este, n lipsa modificrii lui, retransmis ca rspuns (acionnd butonul OK).
xpos este expresia numeric specificnd poziia orizontal a dialogului (n twips, de la latura stnga a ecranului).
n lipsa argumentului, boxa de dialog este centrat orizontal.
ypos este expresia numeric specificnd poziia vertical a dialogului (n twips, de la latura de sus a ecranului).
n lipsa argumentului, boxa de dialog este poziionat la aproximativ o treime de ecran.
helpfile este expresia de tip String care identific fiierul Help utilizat.Dac este indicat helpfile, trebuie s fie
precizat i context. Textul de ajutor poate fi vzut prin tasta F1, anumite aplicaii afieaz i un buton Help.
context Expresie numeric cu numrul de context Help al intrrii corespunztoare dialogului afiat. Apare
obligatoriu mpreun cu helpfile.
Dac valoarea funciei nu este atribuit (sau utilizat ntr-o alt expresie), este evident c se pierde, fr semnalarea
vreunei erori.
Funcia MsgBox
Un dialog mai simplu dect InputBox este realizat prin forma predefinit afiat de funcia MsgBox. Se afieaz un
mesaj ntr-o box de dialog i se ateapt ca utilizatorul s acioneze unul dintre butoanele existente (numrul i
tipul lor lor este fixat la proiectarea aplicaiei). Funcia returneaz un ntreg indicnd care buton a fost acionat.
Sintaxa este
[intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context])
unde
prompt este textul mesajului (Vezi InputBox)
buttons este o expresie numeric egalcu suma valorilor care specific numrul, tipul i atributele butoanelor. Aici
se fixeaz i modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz). Valoarea implicit este 0.
title,helpfile, context
Valoare
Descriere
VbOKOnly
Numai butonul OK
VbOKCancel
OK i Cancel
VbAbortRetryIgnore
VbYesNoCancel
Yes, No i Cancel
VbYesNo
Yes i No
VbRetryCancel
Retry i Cancel
VbCritical
16
VbQuestion
32
VbExclamation
48
VbInformation
64
VbDefaultButton1
VbDefaultButton2
256
VbDefaultButton3
512
VbDefaultButton4
768
VbApplicationModal
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 funcie, aceasta trebuie inclus ntr-o expresie (eventual atribuit unei
variabile ntregi).
Valorile returnate de funcie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorit de
utilizator sunt
Constanta
Valoare
Descriere
VbOK
OK
VbCancel
Cancel
VbAbort
Abort
VbRetry
Retry
VbIgnore
Ignore
VbYes
Yes
VbNo
No
Acionarea tastei Esc este echivalent cu acionarea butonului Cancel (dac acesta este prezent). Dac n dialog este
prezent butonul Help, acionarea lui nu termin dialogul.
Utilizarea fiierelor
Procesrile tipice programate n VBA prelucreaz informaii din dou mari categorii de fiiere:
fiiere ale aplicaiilor server (.doc n Word, .xls n Excel etc.)
fiiere utilizator (create i/sau gestionate de proiect pentru date de intrare, temporare sau de ieire).
Accesarea direct a fiierelor din prima categorie (fr apelul aplicaiei server specifice) poate produce
coruperea fiierului, astfel nct nu mai este recunoscut de aplicaia mam. Prelucrarea acestor fiiere
trebuie s fie executat n aplicaiile care le-au creat.
Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va nelege, fr alte precizri, un fiier utilizator)
acesta trebuie mai nti deschis (instruciunea Open), operaiunea producnd i crearea fiierului n cazul unui fiier
inexistent (nou). Dup utilizare fiierul trebuie s fie nchis (operaiune efectuat, la terminarea normal a
programului, n mod automat).
Un fiier are ataat un numr de identificare, unic pentru un proces. Identificare fiierului se poate efectua, n
program, prin numele su sau prin numrul ataat. Numrul poate fi n domeniul 1255 pentru fiierele proprii
aplicaiei i n domeniul 256511 pentru fiiere accesibile din alte aplicaii. Un numr neutilizat (liber) poate fi
furnizat de apelul la funcia FreeFile().
Exist trei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia.
acces secvenial (modurile Input, Output i Append), utilizat de regul pentru scrierea fiierelor text (rapoarte,
jurnale etc.);
acces raandom (aleator) (modul Random), n cazul cnd este necesar s se scrie i s se citeasc nregistrrile ntr-o
ordine nedefinit, operaiunile de intrare/ieire fiind amalgamate ntre ele;
acces binar (modul Binary), utilizat la citirea/scrierea fiierelor byte cu byte (de exemplu fiiere bitmap).
Un fiier deschis cu un mod de acces trebuie exploatat n acest mod pn cnd este nchis i deschis n alt mod
(dac structura lui permite aa ceva).
Instruciunile tipice pentru accesul la informaiile dintr-un fiier sunt
Modul de acces
Scriere
Citire
Secvenial
Print #, Write #
Input #
Random
Put
Get
Binar
Put
Get
Deoarece gestionarea fiierelor nu se rezum doar la scriere/citire, n tabelul urmtor este un rezumat al
principalelor operaiuni pe care le suport fiierele, cu instruciunile care faciliteaz respectiva aciune.
Aciune
Instruciuni
Citire
Controlul ieirilor
FileCopy
Creare, acces
Open
Fixarea atributelor
Seek
Inchidere
Close, Reset
FileLen
Scriere
Doar instruciunile i funciile des utilizate sunt prezentate n continuare, pentru celelalte se va studia intrarea
corespunztoare din Help (n mediul VBA).
Open
Deschide un fiier n sensul c rezerv o zon tampon (buffer) pentru fiier i determin modul de acces utilizat. Nu
se pot efectua instruciuni de I/O pe un fiier dac acesta nu este deschis n prealabil. Sintaxa:
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
unde
pathname
expresie String care specific numele fiierului (poate include ntreaga cale unitate, directoare etc.,
dup regulile uzuale);
mode cuvnt cheie care specific modul de acces la fiier: Append, Binary, Input, Output sau Random; dac nu se
specific nimic se va considera acces Random;
access clauz opional specificnd operaiunile I/O permise pentru fiier: Read, Write sau Read Write;
lock
clauz opional specificnd operaiile asupra fiierului permise altor procese care se execut (cnd fiierul
este deschis): Shared, Lock Read, Lock Write i Lock Read Write.
filenumber
numrul de fiier pentru fiierul deschis (ntre 1 i 511, vezi observaia din partea introductiv);
funcia FreeFile furnizeaz urmtorul numr disponibil;
reclength
numr (<=32,767) exprimnd, n octei, lungimea nregistrrii (la aceesul Random) sau lungimea
bufferului (la accesul secvenial); la accesul Binary, clauza este ignorat.
Dac fiierul indicat nu exist, atunci este creat un fiier cu acest nume n cazurile care presupun o ieire n fiier:
modurile Append, Binary, Output sau Random.
Un fiier poate fi deschis n mai multe moduri simultan (prin instruciuni Open distincte pentru fiecare mod, cu
numere diferite) dac exist compatibilitate ntre moduri: Binary, Input i Random permit acest lucru, Append,
Output nu permit (fiierul trebuie mai nti nchis i abia apoi deschis ntr-un asemenea mod).
FreeFile
Funcia returneaz un ntreg reprezentnd urmtorul numr de fiier disponibil.
FreeFile[(rangenumber)]
rangenumber este un Variant care specific domeniul din care se solicit un numr liber de fiier: 0 (valoarea
implicit) returneaz un numr n 1255 (pentru fiiere proprii, 1 returneaz un numr n 256511 (pentru fiiere
accesate din alte aplicaii).
Get
Citete date dintr-un fiier deschis i le transfer ntr-o variabil. Datele citite cu Get sunt, n general, scrise n fiier
cu comanda Put.
Get [#]filenumber, [recnumber], varname
unde
filenumber
este numrul fiierului de unde se citesc date (fiierul trebuie s fie deschis)
recnumber
numr opional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau
numrul octetului (modul Binary) de unde ncepe citirea. Prima poziie este 1.
varname
Dac nu se specific numrul nregistrrii se va citi din poziia activ de dup ultima instruciune Get, Put sau Seek.
Argumentul lips este indicat prin virgule: Get #4,,FileBuffer.
Pentru observaiile privind aciunea instruciunii Get, separat pentru modul Random i Binary, se va studia Help Get. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.
Put
Scrie valoarea unei variabile date ntr-un fiier deschis n prealabil. Datele scrise cu Put sunt, n general, citite din
fiier cu Get.
Put [#]filenumber, [recnumber], varname
unde
filenumber
este numrul fiierului unde se scriu datele (fiierul trebuie s fie deschis);
recnumber
numr opional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau
numrul octetului (modul Binary) unde ncepe scrierea. Prima poziie este 1.
varname
Dac nu se specific numrul nregistrrii se va scrie n poziia activ de dup ultima instruciune Get, Put sau
Seek. Argumentul lips este indicat prin virgule: Put #4,,FileBuffer.
Pentru observaiile privind aciunea instruciunii Put, separat pentru modul Random i Binary, se va studia Help Put. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.
Input #
Citete date dintr-un fiier secvenial i le transfer n variabilele specificate.
Instruciunea se va utiliza doar cu fiierele deschise n modul Input sau Binary, datele citite cu Input # sunt scrise,
de regul, cu Write #.
Input #filenumber, varlist
unde
filenumber
varlist list de variabile, delimitate de virgule, pentru care se citesc valorile din fiier. Nu se pot include nume de
tablouri sau variabile Object, dar se accept elemente de tablou i variabiel de tipuri utilizator.
Pentru situaiile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz fr modificri.
Pentru alte situaii:
Informaia citit
Valoarea asignat
Empty
#NULL#
Null
#yyyy-mm-dd hh:mm:ss#
#ERROR errornumber#
Funcia Input()
Citete i returneaz un ir de caractere citite dintr-un fiier deschis n mod Input sau Binary. Datele citite prin
aceast funcie sunt scrise, de regul, prin Print # sau Put.
Input(number, [#]filenumber)
unde
orice expresie numeric specificnd numrul de caractere care se citesc.
number
filenumber
Spre deosebire de instruciunea Input #, funcia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF,
ghilimele i spaii de nceput).
Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin funcia Input pn cnd EOF returneaz True
genereaz eroare (procedeul este valid pentru citirea din fiiere binare cu Get). Se vor utiliza funciile LOF and Loc
pentru detectarea sfritului de fiier.
Observaie. Pentru date pe octei din fiiere text se va utiliza funcia InputB, cu o sintax similar, unde number
specific numrul de octei de returnat (n loc de numrul de caractere). A se vedea i Help Returning Strings
from Functions.
Line Input #
Citete o singur linie dintr-un fiier secvenial (deschis) i asigneaz irul obinut unei variabile de tip String. O
linie este considerat terminat la ntlnirea caracterului CR (Chr(13)) sau a combinaiei CR+LF
(Chr(13)&Chr(10)). Caracterele CR i/sau LF nu sunt adugate irului asignat (se poate considera c secvena lor a
fost srit).
Line Input #filenumber, varname
unde
filenumber
varname
Write #
Scrie o nregistrare ntr-un fiier secvenial. Datele scrise prin Write # sunt citite, de regul, cu Input #. Utilizarea
scrierii cu Write # asigur o delimitare corect a fiecrui cmp scris, ceea ce permite regsirea corect (fr alte
artificii) a informaiilor la citirea cu Input #. n acelai timp, informaiile sunt regsite corect indiferent de
configurrile locale.
Sintaxa este
Write #filenumber, [outputlist]
unde
filenumber
outputlist
o list de expresii numerice sau ir, separate prin virgule, spaii sau punct-virgul,
ale cror valori se scriu n fiier.
Specificarea unei virgule dup filenumber fr outputlist produce o linie goala n fiier.
Sunt respectate urtmtoarele reguli de scriere:
datele numerice sunt scrise cu punct ca separator zecimal (indiferent de setrile locale);
datele Boolean sunt scrise ca #TRUE# sau #FALSE#, nefiind traduse dup setrile locale;
datele calendaristice i timpul sunt scrise potrivit formatului de dat universal; dac o component este omis (sau
este zero), se scrie doar partea indicat;
Null se scrie drept #NULL#, iar Empty nu produce nimic n ieire;
Date de tip Error apare #ERROR errorcode#.
Instruciunea Write # insereaz ntre virgule ntre elementele scrise n fiier, ca i ghilimele n jurul irurilor de
caractere (nu este prin urmare nevoie ca utilizatorul s introduc separatori pentru claritate). Dup ce toate valorile
au fost scrise, se insereaz automat o combinaie CR+LF, astfel nct urmtoarea scriere va fi pe un rnd nou.
Print #
Scrie ntr-un fiier secvenial date formatate ca pe ecran (display-formatted). Prin urmare, cu excepiile specificate
n continuare, setrile locale sunt respectate. Datele scrise cu Print # sunt, de regul, citite cu Line Input # sau cu
Input.
Sintaxa este
Print #filenumber, [outputlist]
unde
filenumber
outputlist
list de expresii formatate ale cror valori sunt tiprite. Elementele se separ prin virgule, spaii sau
punct i virgul.
Un element al listei de ieire este de forma
[{Spc(n) | Tab[(n)]}] [expression] [charpos]
unde
Spc(n) insereaz n spaii n ieire
Tab(n) poziioneaz punctul de inserie (nceputul zonei de scriere) la o coloan indicat absolut de n. Utiliznd
doar Tab se trece la urmtoarea zon de ieire.
expression
charpos
Specific poziia punctului de inserie pentru urmtorul caracter care va fi tiprit, potrivit tabelului
care urmeaz. Dac nu se specific, urmtoarea tiprire va fi pe rndul urmtor.
charpos
Tab(n)
Coloana cu numrul n
Tab
Dac se omite outputlist dar se include un separator dup filenumber, se va insera o linie goal n fiier.
Datele logice sunt scrise drept True, False (fr traduceri locale).
Datele calendaristice sunt scrise potrivit setrii locale pentru format scurt.
Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fr traduceri locale).
Informaiile numerice scrise sunt dup configurrile locale (separator zecimal).
Pentru o interpretare corect, utilizatorul trebuie s separe valorile afiate prin formatri adecvate.
Pentru afiari n fereastra Immediate a mediului VBA, se va vedea i metoda Print (vezi Help Print Method).
Close
nchide unul sau mai multe fisiere deschise prin Open pentru instruciuni de I/O. Prin acest operaiune se rupe
legtura ntre fiiere i numerele ataate i se elibereaz zonele tampon rezervate. Pentru un fiier nchis nu se mai
pot executa operaiuni I/O (pn la o nou deschidere).
Sintaxa este
Close [filenumberlist]
unde
Reset
nchide toate fiierele deschise prin instruciuni Open. Sintaxa este
Reset
naine de nchidere se scriu n fiiere toate bufferele nescrise nc.
Seek
Stabilete poziia (nregistrrii sau octetului) ntr-un fiier unde se va efectua urmtoarea operaiune de
intrare/ieire, fiierul fiind deschis prin Open (vezi i funcia Seek). Sintaxa
Seek [#]filenumber, position
unde
filenumber
position
operaii I/O.
Numerele nregistrrilor specificate n instruciunile Get i Put au priorirtate n raport cu poziia fixat prin Seek
(are loc o repoziionare).
Dac operaiunea Seek indic o poziie dup sfritul fiierului, urmtoarea operaiune de scriere (fr
repoziionare) extinde fiierul.
Poziia indicat nu poate fi zero sau negativ.
Funcia Seek
Returneaz, ca un ntreg Long, poziia curent I/O dintr-un fiier specificat. Fiierul trebuie s fie n prealabil
deschis.
Seek(filenumber)
filenumber este un numr de fiier.
Valoarea returnat este ntre 1 i 2,147,483,647 (echivalent cu 2^31 1), inclusiv (vezi i setarea poziiei prin
instruciunea Seek) i are semnificaia din urmtorul tabel.
Modul de acces
Valoarea returnat
Random
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 funcia genereaz mereu True.
EOF(filenumber)
filenumber este un ntreg coninnd numrul fiierului testat.
Utilizarea uzual este
Loop
Pentru acces secvenial (Input) se ntoarce False pn cnd se atinge sfritul de fiier, pentru fiierele Random sau
Binary se returneaz False pn cnd ultima instruciune Get executat nu a putut citi o nregistrare ntreag.
Citirea cu Input dintr-un fiier deschis Binary produce eroare la utilizarea mecanismului general (pn cnd EOF ()
este true): se va utiliza citirea cu Get sau citirea cu Input mpreun cu funciile LOF sau Loc.
Loc
Returneaz, ca Long, poziia curent de citire/scriere ntr-un fiier deschis.
Loc(filenumber)
filenumber este numrul ataat fiierului.
Valoarea funciei depinde de modul de acces
Mod
Valoarea returnat
Random
Sequential
Binary
Funcia Loc este utilizat, mpreun cu funcia LOF, la testarea sfritului de fiier la citiri Binary (schema general
este dat la LOF).
LOF
Returneaz un Long care reprezint, n octei, mrimea unui fiier deschis prin Open. Pentru fiierele nedeschise se
poate utiliza, n acelai scop, funcia FileLen().
LOF(filenumber)
filenumber este numrul ataat fiierului.
Utilizarea acestei funcii, mpreun cu funcia Loc, pentru determinarea sfritului de fiier (similar cu EOF)
accesat Binary este dup schema general:
Loop
Modele de obiecte
Aproape toate aciunile programate n VB implic manevrarea programatic a unor obiecte. Toate aplicaiile din
Microsoft Office sunt alctuite din componente formate din obiecte sau care gestioneaz obiecte.
n aceast seciune se prezint principalele concepte din programarea orientat pe obiecte, ca i uneltele i tehnicile
disponibile pentru a explora i utiliza obiectele specifice din Office.
Deoarece fiecare aplicaie din Office are un model propriu de obiecte, va fi dedicat cte un capitol pentru Word,
Excel etc., n care se vor prezenta particularitile de operare i obiectele specifice aplicaiei.
Privire general
Orice aplicaie poate fi gndit ca ansamblul a dou lucruri: coninut i funcionalitate. Coninutul se refer la
documentele pe care le conine aplicaia, la elementele care compun documentele, la informaiile privind atributele
elementelor. Funcionalitatea se refer la modurile, cile n care se poate lucra cu coninutul aplicaiei, de exemplu:
deschiderea, nchiderea documentelor, adugarea, copierea, formatarea elementelor etc.
Coninutul i funcionalitatea unei aplicaii sunt divizate n uniti discrete de coninut i funcionalitate specific,
numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, seciuni ale unui
document Word etc., fiecare avnd evident un coninut i o funcionalitate specific, cele dou componente fiind
unitar legate ntre ele. Obiectele unei aplicaii sunt ierarhizate n structuri, modelul de obiecte al aplicaiei..
Obiectul de nivel maxim al unei aplicaii este, uzual, obiectul Application, care este aplicaia nsi. Obiectul
Application conine alte obiecte care pot fi accesate numai cnd obiectul Application exist (deci cnd aplicaia se
execut). De exemplu, obiectul Application Excel conine obiecte Workbook, dup cum obiectul Application
Word conine obiecte Document. Deoarece obiectul Document depinde de existena obiectului Application Word,
se spune c obiectul Document este copilul obiectului Application; invers, obiectul Application se zice printele
obiectului Document.
Este uzual ca un obiect, care este copil al altui obiect, s aib, la rndul su, alte obiecte copii. De asemenea, este
posibil ca un copil s aib mai muli prini.
Modul n care obiectele, care alctuiesc o aplicaie, sunt aranjate relativ unele fa de altele, mpreun cu modul n
care coninutul i funcionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte.
Fiecare aplicaie are un model de obiecte propriu, reprezentarea grafic a ierarhiei de obiecte pentru aplicaie poate
fi vzut n Visual Basic Help din aplicaie.
Fiecare obiect din ierarhie are un coninut i o funcionalitate care se aplic, ambele, att obiectului nsui, ct i
tuturor obiectelor descendente din ierarhie. Cu ct obiectul este situat mai sus n ierarhie, cu att este mai vast
domeniul coninutului i funcionalitii sale. Locul unui obiect n model este gndit astfel nct coninutul i
funcionalitatea lui sunt adecvate domeniului su. Se poate gndi i faptul c, dac aplicaia este divizat n obiecte,
fiecare obiect ofer acces la arii specifice de coninut i funcionalitate.
Afirmaiile care implic obiecte utilizeaz i termenii de "coninut n" pentru copil i "conine" pentru printe.
Astfel, obiectul Application Word conine obiecte Document, dar obiectul Selection este coninut n obiectul
Windows etc.
Proprieti i metode
Pentru a avea acces la coninutul i funcionalitatea unui obiect, pentru nceput trebuie s se identifice obiectul
(subiect discutat n continuare). Dup identificare, obiectul este accesibil prin intermediul proprietilor i
metodelor sale.
n general, prin proprietate se nelege un atribut numit al obiectului. Valoarea atributului (proprietii) poate fi
modificat (de cele mai multe ori) sau poate fi obinut (tiut) programatic.
Prin metod se nelege o procedur care acioneaz asupra unui obiect. Pentru a distinge o metod de o procedur
obinuit (care poate de asemenea s acioneze asupra unui obiect, n general vorbind), trebuie precizat c metodele
implementeaz funcionalitatea obiectului, sunt specifice obiectului cruia i se aplic i sunt definite o dat cu
obiectul (deci la proiectarea aplicaiei de baz, n cazul obiectelor Office). Orice procedur utilizator acioneaz
asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect.
n general, se utilizeaz proprietile pentru a accesa coninutul i se apeleaz metodele pentru a realiza
funcionalitatea obiectului. Totui, aceast distincie este relativ: exist proprieti care se apropie de metode i
metode care seamn a fi proprieti. Atunci cnd vom discuta despre obiecte definite de utilizator se va vedea c
este uor s se treac grania dintre metode si proprieti n proiectarea obiectelor.
Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100
se navigheaz n caietul Activitate la foaia Vanzari i se nscrie valoarea 100 n celula A5. Este evident c
nscrierea are loc efectiv doar n momentul execuiei procedurii.
Deoarece ambele moduri de acces, interfaa utilizator a aplicaiei de baz i Visual Basic, ajung la acelai coninut
i funcionalitate, multe dintre obiectele, proprietile i metodele existente n modelele de obiecte Office au
aceleai denumiri cu elementele din interfaa utilizator (denumiri de meniuri, comenzi, aciuni etc.). Se poate
observa, explicabil din punctul de vedere al evoluiei ctre modelele obiectuale, o asemnare global a modelului
de obiecte cu interfaa utilizator. Aceast asemnare este ntrit i de faptul c pentru orice aciune posibil prin
interfaa utilizator exist posibilitatea de a scrie cod Visual Basic echivalent (vezi i discuia cu nregistrarea macrourilor).
Din exemplul prezentat la accesul din VB, este de reinut importana cunoaterii locului ocupat de obiectul procesat
n ierarhia de obiecte: pentru a utiliza proprietile sau metodele lui trebuie identificat corect prin navigarea
(calificarea) de la nivelul cel mai de sus pn la el. ntregul traseu (cu excepia nivelului Application, care este
uneori subneles) trebuie specificat ca n exemplul artat.
Colecii de obiecte
O colecie este un obiect care include obiecte similare (dar nu neaprat), astfel nct se poate opera cu ansamblul
lor. Acest lucru nu nseamn c metodele sau proprietile obiectelor (dac sunt toate de acelai tip) se aplic
tuturor elementelor coleciei. Ca obiect separat, o colecie are proprieti i metode specifice (numrul de elemente,
adugarea unui nou element etc.).
De regul, coleciile definite n Office (exist posibilitatea de a defini noi colecii) se remarc prin aceea c au
forma de plural a denumirii elementelor lor: Workbooks este colecia de obiecte Workbook, Documents este
colecia de obiecte Document etc.
Elementele (membrii) coleciei se pot identifica prin numrul de ordine (ncepnd cu 1) sau prin nume (rezult c
ansamblul elementelor este ordonat). Astfel instruciunea
Presentations.Item("Perspective").Close
utilizat n PowerPoint produce activarea prezentrii cu numele Perspective i apoi o nchide. Exemplul utilizeaz
metoda Item pentru a returna elementul coleciei de prezentri cu numele specificat. De regul, aceast metod este
implicit, deci
Presentations("Perspective").Close
care, ntr-o aplicaie Word, afieaz numele tuturor documentelor deschise cu mai mult de un cuvnt scris.
un loc obinuit pentru a accesa modelul de obiecte este obiectul cu nivelul cel mai nalt,
uzual obiectul Application. Se va utiliza proprietatea Application pentru a returna o
referin la obiectul Application. Urmtoarea expresie returneaz o referin la obiectul
Application (pentru orice bibliotec de obiecte care conine un obiect Application).
Application
pentru a ajunge din vrful ierarhiei pn la un obiect, se vor parcurge obiectele de pe toate
nivelele, utiliznd accesori care returneaz un obiect din altul. De exemplu, proprietatea
Documents a obiectului Word Application returneaz obiectul colecie Documents, care
reprezint toate documentele deschise. Prin urmare urmtoarea expresie ntoarce o
referin la obiectul colecie Documents:
Application.Documents
Exist accesori direci (shortcut accessors) care dau acces direct la obiecte din model fr
s fie necesar un acces prin vrful ierarhiei. Asemenea accesori sunt Documents,
Workbooks, Presentations care dau acces imediat la colecia de documente din Word,
Excel i PowerPoint. Exist i alte proprieti cu rol de accesori direci: ActiveWindow,
ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urmtoarea instruciune
nchide documentul Word activ:
ActiveDocument.Close
Observaie. Se poate utiliza drept shortcut orice accesor care apare n zona Members of din Object Browser atunci
cnd este selectat <globals> n zona Classes; adic nu trebuie s se returneze obiectul cruia i se aplic proprietatea
sau metoda naintea utilizrii proprietii sau metodei, ntruct Visual Basic poate s determine din contextul n
care se execut codul crui obiect i se aplic proprietatea sau metoda respectiv.
o
Pentru a returna un singur element al unei colecii se va utiliza proprietatea sau metoda
Item cu numele sau numrul de ordine al elementului. Pentru cele mai multe colecii, Item
este implicit, deci poate lipsi
Workbooks.Item("Vanzari")
Workbooks("Vanzari")
Prin funcia TypeName (executat eventual n Immediate Window) se poate gsi ce tip de
obiect ntoarce proprietatea Parent (funcia nu este limitat la aceast proprietate, vezi VB
Help).
= 200
fixeaz poziia din stnga a ferestrei active utiliznd proprietatea Left a obiectului Window, referina la acest
obiect fiind returnat de accesorul direct ActiveWindow.
ActiveDocument.Close
nchide documentul activ (n Word) utiliznd metoda Close a obiectului Document la care returneaz o referin
accesorul ActiveDocument.
Proprietile i metodele pot avea argumente care s precizeze valorile sau aciunile. Urmtorul exemplu Word
utilizeaz metoda PrintOut cu specificarea paginilor care se tipresc:
ActiveDocument.PrintOut
Este uneori necesar s se navigheze prin mai multe nivele n modelul de obiecte pentru a ajunge la ceea ce se
consider date reale n aplicaie, cum ar fi valorile din celulele foii de calcul sau textul dintr-un document Word.
Urmtoarele exemple Word arat cum se poate ajunge la text din vrful ierarhiei de obiecte:
o
Deoarece proprietatea Documents este o proprietate global, poate fi utilizat fr calificativul Application;
deoarece Item este proprietate sau metod implicit pentru colecia de obiecte, nu trebuie enunat explicit. Din
aceste considerente, exemplul urmtor realizeaz exact aceeai aciune ca i exemplul precedent:
Documents(1).Words(1).Text = :Primul "
Pentru alte exemple de referine i de utilizare a metodelor i proprietilor se vor urmri exemplificrile de la
capitolele urmtoare.
Object Browser
Fiecare aplicaie din Microsoft Office are o bibliotec de obiecte (object library sau type library), care conine
informaii despre obiectele, proprietile, metodele, evenimentele i constantele predefinite ale aplicaiei. Pentru
accesul la informaia respectiv se poate utiliza Object Browser, unealt din VBE.
Pentru a deschide Object Browser din VBE (n Excel,
Word sau PowerPoint) sau dintr-un modul (Access), se
alege Object Browser din meniul View.
n boxa Project/Library se alege numele bibliotecii care se
consult, sau <All libraries> pentru a vedea o list
complet. Dac biblioteca dorit nu este n lista celor
disponibile, se va crea o referin la aceast bibliotec prin
alegerile corespunztoare n dialogul References (meniul
Tools) al proiectului curent.
n boxa Classes se afieaz numele tuturor obiectelor i
tipurilor enumerate (constantele predefinite) n bibliotecile
referite.
Not. O clas este un tip, o descriere a unui obiect. Un
obiect este o instan efectiv a unei clase. Deseori aceti
termeni sunt utilizai unul n locul celuilalt, dac nu se produc confuzii (uneori chiar i atunci).
n boxa Members of se afieaz toate proprietile, metodele i evenimentele proprii (asociate) clasei selectate n
boxa Classes.
Selectarea unei intrri n list poate fi completat cu F1 pentru a vedea textul ajuttor, iar n zona inferioar (Detail
pane) se afieaz infromaii privind sintaxa, starea read-only sau read-write, biblioteca unde aparine, tipul
rezultatului returnat (dat sau obiect). Dac o informaie este de tip legtur, activarea acesteia produce informaii
suplimentare, lucru util pentru a deduce modul de navigare ctre obiect. n figura prezentat se vede proprietatea
Count a clasei AddIns, proprietatea returnnd o valoare de tip Long. Textul din zona Detail poate fi copiat (prin
Clipboard) sau dus prin drag-and-drop ntr-o fereastr cod.
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).
Se utilizeaz funcia CreateObject cu identificatorul programatic OLE al obiectului cu care se dorete s se lucreze
n cealalt aplicaie, dup modelul
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Visible = True
Pentru informaii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic Identifiers".
Se aplic obiectului, coninut n variabil, proprietile i metodele dup modelul urmtor, care creeaz un nou
document Word:
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Documents.Add
La sfritul lucrului cu cealalt aplicaie, se va utiliza metoda Quit pentru a o nchide, dup modelul
appWD.Quit
Obiectul Application
Cele mai multe proprieti ale obiectului Application Excel controleaz atributele de vizualizare ale ferestrei
aplicaiei sau comporatrea global a aplicaiei. De exemplu, valoarea proprietii DisplayFormulaBar este True
dac bara de formule este vizibil, iar valoarea proprietii ScreenUpdating este False dac actualizarea ecranului
este inhibat.
n plus, proprietile obiectului Application ofer acces la obiectele situate mai jos n ierarhie de obiecte (constituie
ceea ce s-a numit accesori). Astfel, proprietatea Windows d acces la colecia Windows (reprezentnd toate
ferestrele deschise n aplicaie), proprietatea Workbooks d colecia Workbooks a tutror caietelor deschise etc.
Din aceast categorie enumerm:
o
RecentFiles, colecia fiierelor utilizate recent (dup lista din meniul File),
Windows,
Workbooks,
Returnarea unui obiect particular din colecie se efectueaz dup procedurile generale, explicate n capitolele
introductive.
n categoria accesorilor mai pot fi ncadrate proprietile care returneaz un obiect Range: ActiveCell, Cells,
Rows, Columns, Selection (dac este selectat un domeniu de celule).
Proprietile ActiveWorkbook, ActiveSheet, ActiveChart i ActiveWindow returneaz obiectele care reprezint
elementele active corespunztoare din Excel.
Anumite metode i proprieti care se aplic obiectului Application se aplic i unor obiecte situate mai jos n
ierarhie. Utilizarea acestor proprieti i metode la nivelul Application vor modifica toate caietele, foile deschise.
De exemplu, metoda Calculate aplicat la nivelul Application produce recalcularea tuturor foilor, din toate
caietele, pe cnd utilizat la nivel de Workbook sau de Worksheet produce recalcularea doar a foilor locale.
Obiectul Workbook
Dup cum se tie, similarul unui document din Word este n Excel caietul (workbook). Deschiderea sau nchiderea
unui fiier n Excel implic deci deschiderea sau nchiderea unui caiet. In Visual Basic, metodele utilizate la lucrul
cu fiiere sunt metode ale obiectului Workbook sau ale coleciei Workbooks.
Este de remarcat c obiectul Workbook returnat de metod se refer la caietul deschis, care rmne activ.
Asupra utilizrii utilizrii sau nu a cii pe care se gsete fiierul se vor reciti cele spuse la deschiderea
documentelor Word.
Exist dou foldere remarcabile pentru care se poate obine n mod automat calea: folderul cu fiierele Excel
executabile i folderul Library (creat automat la instalarea aplicaiei). Obinerea acestor ci se realizeaz prin
proprietile Path i LibraryPath ale obiectului Application). Astfel
EXEPath = Application.Path & Application.PathSeparator
LibPath = Application.LibraryPath & Application.PathSeparator
returneaz, respectiv, calea ctre fiierele executabile Excel i calea ctre fiierele de bibliotec. O cale returnat se
termin cu separatorul adecvat sistemului pe care se execut aplicaia, astfel nct codul este independent de
platform Windows sau Macintosh). Instruciunile
fName = LibPath & "Book1.xls"
Set myBook = Workbooks.Open(Filename:=fName)
considerate mpreun cu atribuirea variabilei LibPath de mai sus, realizeaz deschiderea fiierului Book1.xls din
folderul Library.
Se poate lsa utilizatorului opiunea de a decide aupra numelui fiierului care se deschide. Acest lucru se poate
realiza prin metoda GetOpenFilename a obiectului Application. Metoda afieaz cutia de dialog standard Open,
dar, n loc s deschid fiierul selectat, returneaz un ir cu numele complet calificat al fiierului. Urmtorul
exemplu demonstreaz metoda:
Sub DemoGEtOpenFilename()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
MsgBox "Opening " & fName
Set myBook = Workbook.Open (Filename:=fName)
End Sub
Metoda GetOpenFilename
Afieaz dialogul Open i returneaz numele de fiier selectat fr a deschide efectiv fiierul.
expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
unde
expression este o expresie care returneaz un obiect Application.
FileFilter este de tip Variant, opional. Este un ir specificnd criteriile de filtrare a fiierelor listate n dialog. irul
const n perechi formate din irul de filtrare i din specificarea filtrului n format MS-DOS, toate elementele fiind
separate prin virgule. n partea rezervat, dou filtre MS-DOS sunt separate prin ";". Exemple: "Text Files
(*.txt),*.txt,Add-In Files (*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se consider "All
Files (*.*),*.*".
FilterIndex este de tip Variant, opional. Specific indexul criteriului de filtrare implicit. de la 1 la numrul de filtre
specificat n FileFilter. Implicit se consider 1.
Title este de tip Variant, opional. Specific titlul boxei de dialog. Implicit este "Open".
ButtonText este specific pentru Macintosh.
MultiSelect este de tip Variant, opional. Este True atunci cnd se pot selecta mai multe nume de fiiere, False dac
este permis selectarea unui singur fiier. Implicit este False. n cazul seleciei multiple se va returna un tablou de
denumiri (chiar dac este selectat un singur fiier).
Metoda returneaz numele fiierului selectat sau numele introdus de utilizator. n cazul cnd utilizatorul anuleaz
boxa (prin Cancel), se returneaz False. Metoda poate schimba att folderul curent ct i unitatea.
Metoda SaveAs
are sintaxa
expression.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup,
AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout)
unde
expression returneaz un obiect Workbook.
Filename, opional, Variant. Conine numele noului fiier, poate include o cale.
FileFormat, opional, Variant. Specific formatul de fiier utilizat la salvare. Lista formatelor admise (cele care se
pot selecta i la salvarea din Excel) se gsete n Help la proprietatea FileFormat.
Password, opional, Variant. Un ir unde capitalizarea este considerat (cel mult 15 caractere) care conine parola
de protejare a fisierului.
WriteResPassword, opional, Variant. Un ir care conine parola necesar pentru scrierea fiierului. Dac la
deschidere nu se d parola exact, fiierul este deschis doar n citire.
ReadOnlyRecommended, opional, Variant. Este True pentru a afia, la deschidere, un mesaj cu recomandarea de a
deschide fiierul doar n citire.
Metoda Save
Salveaz modificrile caietului specificat.
expression.Save
unde
expression returneaz un obiect Workbook.
Pentru marcarea unui fiier drept salvat fr a-l scrie efectiv pe disc, se va atribui valoarea True proprietii Saved.
Metoda GetSaveAsFilename
Similar metodei GetOpenFilename, aceast metod afieaz dialogul standard Save As, returneaz un nume de
fiier, dar nu salveaz nici un fiier.
expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)
unde
expression este o expresie care returneaz un obiect Application.
InitialFilename, opional, Variant. Specific numele de fiier propus. Dac acest nume este omis, atunci se va
utiliza numele caietului activ.
FileFilter, opional, Variant. irul care specific criteriul de filtrare. Pentru structura irului se va revedea metoda
GetOpenFilename de la deschiderea documentelor.
FilterIndex, opional, Variant. Este indicele criteriului de filtrare, de la 1 la numrul de filtre dat la FileFilter.
Implicit este 1.
Title, opional, Variant. Titlul boxei de dialog.
ButtonText este specific Macintosh.
Metoda returneaz numele de fiier selectat sau cel introdus de utilizator. Numele returnat poate include i calea.
Metoda returneaz False dac dialogul este nchis de utilizator prin Cancel. Metoda poate schimba folderul sau
unitatea curent.
Urmtorul exemplu creaz un nou caiet i-l salveaz prin metoda GetSaveAsFilename:
Sub CreateAndSave()
Set newBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
newBook.SaveAs Filename:=fName
End Sub
Metoda Close
Produce nchiderea obiectului. Aplicat coleciei Workbooks are sintaxa
expression.Close
unde
expression returneaz un obiect Workbooks. Dac exist modificri ale caietelor, se va afia dialogul de interogare
asupra eventualei salvri.
Aplicat obiectelor Window i Workbook metoda are sintaxa
expression.Close(SaveChanges, FileName, RouteWorkbook)
unde
expression este o expresie care returneaz un obiect Workbook sau Window.
SaveChanges este opional, Variant. Dac nu exist modificri, argumentul este ignorat. Dac exist modificri n
caiet dar caietul mai apare i n alt fereastr deschis, atunci argumentul este de asemenea ignorat. Dac exist
modificri i caietul nu mai apare n alt fereastr, atunci salvarea se efectueaz dup valorile: True salvarea
modificrilor sub numele dat la FileName sau dialog Save As; False nu se salveaz modificrile; argument omis
interogare utilizator.
FileName este opional, Variant. Salveaz modificrile sub acest nume.
RouteWorkbook este opional, Variant. Dac nu este indicat nici o rutare (nu exist nici un RoutingSlip ataat),
argumentul este ignorat. Altfel, Excel efectueazrutarea documentului dup valorile acestui argument: True
trimite caietul la urmtorul recipient; False caietul nu este transmis mai departe; omis interogarea utilizatorului
asupra trimiterii.
nchiderea unui workbook din Visual Basic nu execut macrourile Auto_Close din workbook. Se va utiliza metoda
RunAutoMacros pentru executarea macrourilor automate de nchidere. Aceste macrouri sunt meninute n Excel
din motive de compatibilitate, deci se refer la foi automatizate n versiuni Excel mai vechi.
Exemplul urmtor arat deschiderea unui caiet, modificri temporare ale caietului i nchiderea fr salvarea
modificrilor:
Sub OpenChangeClose()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
Set myBook = Workbooks.Open (Filename:=fName)
' Aici se modific foile de calcul
myBook.Close SaveChanges:=False
End Sub
Obiectul Range
Prin intermediul unui obiect Range se poate referi o singur celul, un domeniu de celule, o ntreag linie sau
coloan, o selecie cu arii multiple sau un domeniu 3-D. Din acest motiv obiectul Range este oarecum neuzual prin
aceea c poate reprezenta att o singur celul ct i o mulime de celule. Nu exist un obiect colecie pentru
Range, as c un obiect Range poate fi gndit fie ca un obiect, fie ca o colecie, dup situaie.
Exist foarte multe proprieti i metode care returneaz un obiect Range:
ActiveCell
DirectDependents
RowFields
BottomRightCell
DirectPrecedents
RowRange
Cells
EntireColumn
Rows
ChangingCells
EntireRow
Selection
CircularReference
Next
TableRange1
Columns
Offset
TableRange2
CurrentArray
PageRange
TopLeftCell
CurrentRegion
Precedents
UsedRange
Dependents
Range
VisibleRange
Pentru specificarea exact a acestor proprieti i metode se vor cuta subiectele respective n Help.
n continuare sunt menionate, mai mult prin exemple, moduri de lucru cu obiecte Range.
Atribuirea aceleeai valori fiecrei celule dintr-un domeniu numit (la nivel de foaie):
Range("Sheet1!yourRange").Value = 3
Este de menionat c expresiile care nu sunt calificate se refer la foaia curent, deci multe din exemplele de mai
sus nu ar opera dac foaia curent este o foaie de tip chart.
O cauz frecvent de erori este utilizarea proprietii Range ca argument al altei metode fr calificarea complet a
obiectului Worksheet cruia i se aplic Range. Exemplul urmtor
Sub SortRange()
Worksheets("Sheet1").Range("A1:B10").Sort _
Key1:=Range("A1"), Order1:=xlDescending
End Sub
nu va funciona corect dect dac Sheet1 este foaia activ, altminteri calificarea argumentului Key1 nu este
complet. Pentru o execuie independent de context ar trebui folosit
Key1:=Worksheets("Sheet1").Range("A1")
Referinele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instruciuni de ciclare. Exemplul
urmtor anuleaz toate celulele din domeniul A1:D10, cu o valoare mai mic dect 0.01:
Sub RoundToZero()
For rwIndex = 1 to 10
For colIndex = 1 to 4
If Worksheets("Sheet1").Cells(rwIndex,colIndex) < 0.01 Then
Worksheets("Sheet1").Cells(rwIndex,colIndex).Value = 0
End If
Next colIndez
Next rwIndex
End Sub
n exemplul urmtor se arat o soluie la listarea, ntr-o foaie separat, a tuturor denumirilor create n caietul activ i
a domeniilor referite de acestea.
Sub ListNames()
Set newSheet = Worksheets.Add
I = 1
For Each nm in ActiveWorkbook.Names
NewSheet.Cells(i,1).Value = nm.Name
NewSheet.Cells(i,2).Value = "' " & nm.RefersTo
Next nm
NewSheet.Columns("A:B").AutoFit
End Sub
Exemplul care urmeaz presupune c foaia activ conine date dintr-un experiment desfurat n timp: prima
coloan conine datele calendaristice, a doua coloan conine ora nregistrrii valorilor, coloanele a treia i a patra
conin msurtorile experimentului. Procedura prezentat combin primele dou coloane ntr-o singur valoare de
tip Date, convertete valoarea obinut din GMT (Greenwich Mean Time) n PST (Pacific Standard Time) i le
formateaz. Deoarece nu se tie dac exist i coloane goale ntre cele patru coloane cu date, se utilizeaz
UsedRange.
Sub ConvertDates ()
Set myRange = ActiveSheet.UsedRange
myRange.Columns("C").Insert
Set dateCol = myRange.Columns("C")
For Each c In dateCol.Cells
If c.Offset(0,-1).Value <>"" Then
c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)"
End If
Next c
dateCol.NumberFormat = "mmm-dd-yyyy hh:mm"
dateCol.Copy
dateCol.PasteSpecial Paste:=xlValues
myRange.Columns("A:B").Delete
dateCol.AutoFit
End Sub
Exist i alte proprieti i metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range.
Printre acestea enumerm: Areas, Cells, Columns, EntireColumn, EntireRow, Range i Rows.
Pentru ca operaiunea anterioar s aib loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox,
specificndu-i utilizatorului s selecteze un domeniu de celule. Metoda returneaz un obiect Range care reprezint
selecia. Codul este completat cu instruciuni de tratare a erorilor uzuale.
Sub RoundToZero ()
Worksheets("Sheet1").Activate
On Error GoTo PressedCancel
Set r = Application.InputBox( _
Prompt:="Select a range of cells", _
Type:=8)
On Error GoTo 0
For Each c In r.Cells
If Abs(c.Value) < 0.01 Then
c.Value = 0
End If
Next c
Exit Sub
PressedCancel:
Resume
End Sub
Dac nu se dorete selectarea de ctre utilizator a domeniului procesat, se poate utiliza proprietatea CurrentRegion
sau proprietatea UsedRegion pentru a returna obiectul Range prelucrat. De exemplu, dac se tie c domeniul
ncepe cu celula A1 i nu include linii sau coloane vide, atunci se poate utiliza
Set r = Worksheets("Sheet1").Range("A1").CurrentRegion
Acelai efect se poate obine prin stabilirea unor expresii de urmrire (watch expressions) de forma r.Address i
r.Columns(i).Address, valorile respective pot fi examinate n fereastra Immediate. Pentru o discuie mai pe larg se
va studia capitolul dedicat depanrii i manevrrii erorilor.
Utilizarea evenimentelor
Completarea procedurilor implicite de rspuns la evenimente se efectueaz prin accesul la codul procedurilor i
scrierea de cod n mod uzual.
Pentru a vedea procedurile de eveniment ale unei foi (de calcul sau diagram):
click dreapta pe cotorul foii (pe bara de jos, unde se vd cotoarele tuturor foilor din caietul
activ), comanda View Code din meniul contextual, alegerea numelui evenimentului n lista
derulant Procedure, sau
meniul Tools, comanda Macro i selectarea opiunii Visual Basic Editor. Se selecteaz foaia
dorit n Project Explorer, butonul View Code i se alege numele evenimentului din lista
Procedure.
Descriere
Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
SelectionChange
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".
Descriere
Activate
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
Descriere
Activate
AddInInstall
AddInUninstall
BeforeClose
BeforePrint
BeforeSave
Deactivate
NewSheet
Open
SheetActivate
SheetBeforeDoubleClick
SheetBeforeRightClick
SheetCalculate
SheetChange
SheetDeactivate
SheetSelectionChange
WindowActivate
WindowDeactivate
WindowResize
Exemplu
Deschiderea caietului maximizeaz fereastra aplicaiei Excel:
Sub Workbook_Open ()
Application.WindowState = xlMaximized
End Sub
Descriere
NewWorkbook
SheetActivate
SheetBeforeDoubleClick
SheetBeforeRightClick
Apare la click dreapta pe o celul a unei foi dintrun caiet deschis (nu este utilizat cu foile
diagram).
SheetCalculate
SheetChange
SheetDeactivate
SheetSelectionChange
WindowActivate
WindowDeactivate
WindowResize
WorkbookActivate
WorkbookAddInInstall
WorkbookAddInUninstall
WorkbookBeforeClose
WorkbookBeforePrint
WorkbookBeforeSave
WorkbookDeactivate
WorkbookNewSheet
WorkbookOpen
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.
Obiectul nou creat apare n boxa Object din modulul clas i se pot scrie procedurile
evenimentelor pentru noul obiect.
unde EventClass este numele dat, de exemplu, modulului clas creat, similar pentru X.
dup crearea instanei X a obiectului EventClass se poate stabili obiectul App al clasei EventClass
egal cu obiectul Application Microsoft Excel.
Sub InitializeApp ()
Set X.App = Application
End Sub
Dup executarea procedurii de iniializare, obiectul App din modulul EventClass puncteaz ctre
obiectul Application Microsoft Excel i procedurile eveniment din modulul clas vor fi executate
la declanarea evenimentelor.
Dei procedura poate prea laborioas, ideea poate fi utilizat pentru ca aceleai proceduri eveniment s fie asociate
mai multor obiecte.
S presupunem c am efectuat etapele precedente pentru un obiect diagram. S-a utilizat astfel declaraia
Public WithEvents cht As Chart
pentru iniializare.
Aceeai tehnic se poate utiliza i pentru obiectele Worksheet i Workbook pentru a utiliza evenimentele noii
clase cu mai multe foi de calcul, n plus fa de evenimentele implicite.
Funcia Dir returneaz primul fiier care se potrivete numelui specificat sau un ir de lungime zero n cazul cnd
nu exist nici o potrivire.
Codul anterior pare a fi corect i acoperitor pentru toate situaiile posibile. Totu, dac litera de drive specificat nu
este valid, apare eroarea "Device unavailable". Dac unitatea este de floppy disk, funcia va funciona corect doar
dac n unitate este o dischet i poarta este nchis. n caz contrar Visual Basic va semnala eroarea "Disk not
ready" i execuia se oprete.
Pentru a ocoli asemenea situaii, trebuie s se utilizeze modalitile de error-handling din VBE pentru a intercepta
erorile (sau "a prinde" - trapping) i a executa aciuni corective. La apariia unei erori, Visual Basic stabilete
diferite proprieti ale obiectului reprezentnd eroare, Err, cum ar fi numrul erorii, descrierea etc. Obiectul Err
poate fi utilizat ntr-o rutin de tratare a erorii astfel nct aplicaia poate rspunde inteligent la o situaie de eroare.
De exemplu, probleme legate de unitate, cum ar fi o unitate invalid sau o unitate de floppy fr dischet, pot fi
tratate dup modelul urmtor.
n acest cod, proprietatea Number a obiectului Err conine numrul asociat cu eroarea aparut; proprietatea
Description conine o scurt descriere a erorii. Instruciunea Resume returneaz controlul la instruciunea care a
produs eroarea iar Resume Next returneaz controlul la instruciunea urmtoare celei care a produs eroarea.
Corpul rutinei de tratare a erorilor conine cod de identificare a erorii aprute, prin structuri Select Case sau
If...Then...Else. Este obligatoriu ca o alternativ s se refere la erorile neanticipate i care nu sunt tratate
individual.
Proprietatea Number a obiectului Err conine un cod numeric reprezentnd cea mai recent eroare. Utilizarea
obiectului Err n combinaie cu structurile Select Case sau If...Then...Else, se pot lua aciuni specifice fiecrei
erori.
Descriere
Resume [0]
Resume Next
Resume line
Err:Raise Number:=number
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
Dac este gsit un fiier care se potrivete specificaiei, funcia returneaz numele fiierului. Dac nu se potrivete
nici un fiier, funcia returneaz un ir de lungime zero. n cazul apariiei unei dintre erorile anticipate, se afieaz
mesajul corespunztor (prin intermediul variabilei strMsg) i utilizatorul poate ncerca un nou nume prin reluarea
de la eticheta StartHere.
Dac apare o eroare diferit de cele anticipate (i posibile n operaiunea efectuat), pe ramura de program Case
Else se regenereaz eroarea nct urmtoarea capcan de erori din lista de apeluri poate s intre n aciune. Acest
fapt este necesar din cauz c dac eroarea nu ar fi regenerat, codul ar continua s se execute la linia Resume
StartHere. Prin regenerare, eroarea apare din nou i noua eroare va fi captat la urmtorul nivel din stiva de
apeluri.
Rezultatul
Resume
Resume Next
De notat c instruciunea executat este n procedura unde s-a gsit rutina de tratare a erorilor i nu n mod necesar
n procedura unde a aprut eroarea. Dac nu se ine seama de acest aspect esenial al tratrii erorilor, execuia poate
prea de neexplicat n momentul apariiei unei erori. Pentru o verificare mai simpl a codului, se poate trece n
modul break n momentul apariiei unei erori, dup cum este explicat ulterior n acest capitol ("Oprirea tratrii
erorilor").
Dac erorile tratate n secvena error-handler nu includ eroarea aprut, se poate produce o eroare neanticipat n
procedura care are un error handler permis: procedura poate s bucleze la infinit, n special cnd error handlerul
execut o instruciune Resume. Pentru a preveni o asemenea situaie, se va utiliza metoda Raise a obiectului Err
ntr-o secven Case Else (sau similar) din handler. Aceasta genereaz o eroare din secvena de tratare activ,
fornd Visual Basic s caute n lista de apeluri un handler care s se ocupe de eroarea aprut.
Efectul unei cutri regresive n lista de apeluri este greu de prevzut, deoarece depinde de instruciunea Resume
sau Resume Next executat. Trebuie gndit c execuia nu se reia, n mod necesar, n procedura unde a aprut
eroarea, ci n procedura unde este un error-handler activ.
Se va utiliza metoda Clear dac trebuie s se iniializeze n mod explicit obiectul Err dup
tratarea unei erori. Acest fapt este necesar atunci cnd se utilizeaz tratarea pe loc a
erorilor cu On Error Resume Next. Visual Basic apeleaz automat metoda Clear de fiecare
dat cnd execut orice tip de instruciune Resume, Exit Sub, Exit Function, Exit Property
sau orice instruciune On Error.
o
Dac nu se dorete ca alt procedur din lista de apeluri s capteze eroarea, se va utiliza
instruciunea Stop pentru a fora terminarea codului. Instruciunea Stop permite
examinarea contextului erorii n mediul de dezvoltare.
Se va scrie o procedur error handler de siguran (fail-safe) sigur care s fie apelat de
toate secvenele de tratare a erorilor ca ultim aciune pentru erorile care nu sunt
gestionate. Aceast procedur poate efectua o terminare controlat a aplicaiei prin
descrcarea formelor i salvarea datelor.
Se poate utiliza ulterior metoda Raise pentru noile numere de eroare, cu utilizarea eventual a descrierilor proprii
de eroare.
Lucrul esenial n tratarea inline a erorilor este testarea apariiei unei erori imediat dup instruciunea sau apelul de
funcie care poate s produc eroarea. n acest mod se poate proiecta un handler care anticipeaz exact tipul de erori
care pot s apar. Aceast abordare nu necesit ca o eroare de execuie s apar efectiv.
Urmtorul exemplu, mai complex, utilizeaz att valoarea returnat, ct i un argument pentru a detecta apariia
unei erori.
Function Power (X As Long, P As Integer, ByRef Rezult As Long) _
As Long
On Error GoTo ErrorHandler
Result = X^P
Exit Function
ErrorHandler:
Power = conFailure
End Function
' Apelul funciei Power
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.
Instruciunea Case 440 capteaz erorile care apar ntr-un obiect referit extern aplicaiei Visual Basic. n acest
exemplu, eroarea este propagat utiliznd valoarea 9999, deoarece este dificil pentru acest tip de handler central s
determine cauza erorii. Apariia unei astfel de erori este, de obicei, rezultatul unei erori fatale de automatizare (o
eroare care produce oprirea execuiei componentei) sau din cauza unui obiect care nu a tratat corect o eroare
captat. Eroarea 440 nu ar trebui propagat dect n cazul unei erori fatale. Dac aceast secven ar fi scris pentru
un handler inline (vezi seciunea "Tratarea inline a erorilor"), ar fi posibil s se determine cauza erorii i s se
corecteze.
Instruciunea Case Is > vbObjectError And Is < vbObjectError + 65536 capteazerorile care au originea ntr-un
obiect din aplicaia Visual Basic, sau din obiectul care conine handlerul. Numai asemenea obiecte pot produce
erori n domeniul specificat.
Documentaia pentru codul de eroare oferit pentru obiect trebuie s defineasc codurile posibile, semnificaia lor,
astfel nct aceast poriune a handlerului s poat fi scris adecvat erorilor anticipate. Codurile de eroare efective
pot fi documentate fr offsetul vbObjectError sau pot fi documentate dup ce s-a adugat deplasarea, n care caz
instruciunea Case Else trebuie s scad deplasarea vbObjectError. Pe de alt parte, erorile obiectelor pot fi
constante, artate n biblioteca de tipuri a obiectului i vizibile n Object Browser. n acest caz se utilizeaz
constanta de eroare n Case Else i nu codul de eroare.
Orice eroare care nu este tratat trebuie s fie regenerat cu un nou numr, dup cum este n instruciunea Case
Else. n aplicaia proprie se poate proiecta un handler care s anticipeze acest nou numr definit. Dac aplicaia este
o clas public, trebuie s fie inclus n documentaie o explicaie a acestei noi erori.
Ultima instruciune Case Else capteaz i regenereaz orice alt eroare care nu a fost tratat anterior. Deoarece
aceast parte a capcanei va prinde erori care au sau nu adugat deplasarea vbObjectError, remaparea se va
efectua simplu ctre un cod generic "unresolved error". Acest cod se va aduga la vbObjectError indicnd oricrui
handler c aceast eroare provine dintr-un obiect referit.
Depanarea programelor
Tehnicile de depanare prezentate n acest capitol utilizeaz uneltele de analiz oferite de Visual Basic. Mediul de
dezvoltare Visual Basic nu poate s identifice sau s fixeze erorile, dar ofer unelte pentru a analiza fluxul execuiei
i cum se schimb valorile variabilelor i proprietilor. Se poate considera c uneltele de depanare ajut la
examinarea aplicaiei pentru a nelege ce se ntmpl i de ce.
Uneltele de depanare oferite de Visual Basic includ puncte de oprire (breakpoints), expresii de oprire (break
expressions), expresii de urmrire (watch expressions), executarea codului pas cu pas (instruciune cu instruciune
sau procedur cu procedur) i afiarea valorilor variabilelor i proprietilor. Sunt oferite de asemenea posibiliti
speciale cum ar fi editarea codului i continuarea execuiei (edit-and-continue), stabilirea urmtoarei instruciuni
care s se execute dup o eroare i testarea cu aplicaia n modul break.
Tipuri de erori
Exist trei tipuri de erori care se pot intlni ntr-un program.
Erori de compilare. Acestea rezult din scrierea incorect a codului. Aceste erori sunt detectate de Visual Basic la
compilarea codului.
Erori de execuie. Acestea apar n timpul execuiei aplicaiei (i sunt detectate de Visual Basic) atunci cnd o
instruciune ncearc s efectueze o operaiune imposibil (de genul mpririi prin zero).
Erori de logic. Acestea apar atunci cnd aplicaia nu se execut n modul gndit la proiectare. O aplicaie poate s
fie corct sintactic, s se execute fr a efectua operaiuni imposibile i totui s produc rezultate incorecte. Doar
testarea aplicaiei i analiza rezultatelor poate spune c aplicaia funcioneaz corect.
Unelte de depanare
Nu exist artificii magice pentru depanare i nu exist o secven fix de operaiuni care s lucreze ntotdeauna. n
esen, ajutorul oferit n depanare este pentru o mai bun nelegere a mersului aplicaiei. Se poate astfel fotografia
starea aplicaiei la un moment dat, instantaneul obinut cuprinznd valori ale
proprietilor, precum i numele apelurilor active de proceduri.
variabilelor, expresiilor i
n tabelul urmtor se explic pe scurt funcionalitatea uneltelor principale din aceast bar.
Unealta de depanare
Scop
Run/Continue
Break
Reset
Toggle Breakpoint
Step Into
Step Over
Step Out
Locals Window
Immediate Window
Watch Window
Quick Watch
Call Stack
Seciunile urmtoare aduc explicaii suplimentare asupra modului de utilizare efectiv a acestor unelte.
Evitarea "bug"-urilor
Respectarea urmtoarelor reguli poate conduce la evitarea introducerii unor bug-uri n aplicaie.
Aplicaia se proiecteaz cu atenie prin notarea evenimentelor importante i a modului n care codul va rspunde la
fiecare eveniment. Fiecare procedur general, ca i fiecare procedur eveniment trebuie s aib un scop specific,
bine definit.
Se vor include ct mai multe comentarii. La ntoarcerea n cod i analiza comportrii aplicaiei, comentariile
privind scopul fiecrei rutine sunt de un real ajutor.
o
Se vor utiliza, pe ct posibil, referine explicite. Variabilele obiect se declar dup cum
sunt listate obiectele n cutia Classes din Object Browser i nu prin tipuri Variant sau
Object.
Se va dezvolta sau adapta o schem consistent de construcie a denumirilor pentru variabilele i obiectele din
aplicaie.
o
Descriere
Design time
Break mode
Este posibil s se opreasc execuia atunci cnd aplicaia nu are de lucru (idle - este ntre procesarea unor
evenimente). Cnd se ntmpl acest fapt, execuia nu se oprete la o linie specific, dar Visual Basic comut
oricum la modul break.
Se poate intra automat n modul break automat atunci cnd se ntmpl oricare dintre urmtoarele condiii:
O instruciune genereaz o eroare de execuie netratat.
o
O instruciune genereaz o eroare de execuie i a fost selectat Break on All Errors n fia
General (meniul Tools).
O expresie de oprire definit n dialogul Add Watch s-a modificat sau a devenit True, dup
cum a fost definit.
Se poate de asemenea instrui o expresie urmrit s treac aplicaia n modul break atunci valoarea ei se modific
sau devine True (pentru condiii). Acest mod de operare reduce, de obicei, parcurgerea pas cu pas a proiectului
pn cnd se atinge o anumit condiie (de exemplu, o variabil de ciclare ajunge la o anumit valoare, sau un
indicator dintr-o procedur este modificat).
Descriere
Observaie. Se poate aduga o expresie urmrit prin tragerea expresiei dintr-un modul n fereastra Watch.
Se poate stabili sau anula un punct de oprire n modul break, n design time sau n run time dac aplicaia este
inactiv (idle). Pentru a fixa un punct de oprire se efectueaz un click pe marginea din stnga ferestrei modulului,
n dreptul instruciunii (vezi figura de mai sus). Instruciunea astfel marcat este colorat potrivit culorii specificate
n dialogul Options (meniul Tools), fia Editor Format. Prin click pe indicatorul de breakpoint se anuleaz
punctul de oprire respectiv.
Se remarc n figura anterioar c instruciunea curent este i ea marcat prin culoare i un indicator pe latura din
stnga a ferestrei de cod. Atunci cnd se atinge un punct de oprire i aplicaia este oprit, se poate examina starea
curent a aplicaiei, focusul putnd fi mutat ntre forme, module, ferestrele de depanare.
Aplicaia este oprit exact naintea executrii liniei care conine punctul de oprire. Dac se dorete observarea
efectului executrii acestei instruciunii se va aciona Step Into sau Step Over.
Pentru izolarea unei probleme reamintim c o instruciune poate s contribuie indirect la eroare datorit atribuirii
unor valori incorecte. Examinarea valorilor variabilelor i proprietilor se efectueaz n modul break prin ferestrele
Locals, Quick Watch, expresii urmrite i fereastra Immediate.
Descriere
Step Into
Step Over
Step Out
Informaiile sunt afiate ntr-o fereastr separat (Immediate), nct nu se interfereaz cu ieirea
vzut de utilizatori.
Aceast tehnic lucreaz cel mai bine atunci cnd exist un loc particular n aplicaie n care variabila urmrit (aici
Salary) se modific. De exemplu, instruciunea anterioar poate aparine unei structuri repetitive.
executat din Microsoft Word, afieaz n fereastra Immediate numele documentului Word activ.
Atribuirea de valori
n modul break, se pot atribui valori la proprieti i variabile. Urmtorul exemplu prezint o schem de utilizare a
ferestrei Immediate pentru calcule. Fiecare linie (cu excepia celor care afieaz rezultatele) se va termina cu
ENTER:
x
?
5
y
?
6
= 2
x+3
= 3
x*y
Se poate modifica valoarea unei proprieti sau a unei variabile din proiect i relua apoi executarea aplicaiei. Dac
Option Explicit este prezent n modulul curent, toate variabilele invocate n fereastra Immediate trebuie s fie
declarate n modul. Domeniul se aplic apelurilor de proceduri ca i variabilelor.
La apsarea tastei ENTER, Visual Basic comut la run time pentru a executa instruciunea i se ntoarce apoi n
modul break. n acest moment se pot vedea rezultatele i efectele asupra variabilelor i proprietilor.
Se poate apela orice procedur din forma activ curent, ca i orice procedur dintr-un modul, cu excepia cazului n
care procedura este Private, caz n care se poate apela doar n timpul executrii modulului.
O procedur poate fi executat n mod repetat, fiecare apel este meninut de Visual Basic ca o instan separat.
Aceasta permite testarea separat a diferitelor seturi de argumente. Dialogul Call Stack menine o list a
procedurilor executate de fiecare comand din fereastra Immediate. Se poate prin urmare utiliza Call Stack pentru
a selecta orice instan a procedurii i afia apoi valorile variabilelor din procedur.
Observaie. Dei cele mai multe instruciuni sunt suportate de fereastra Immediate, o structur de control este
permis doar dac poate fi exprimat complet pe o linie: se utilizeaz caracterul ":" pentru separarea instruciunilor
care alctuiesc structura de control.
Se poate utiliza mouse-ul sau sgeile pentru a naviga n fereastra Immediate. Nu se apas
ENTER dect pe instruciunea care se execut.
CTRL+HOME mut punctul de inserie la linia de nceput a ferestrei; CTRL+END l mut la ultima linie.
Tastele HOME i END mut punctul de inserie la nceputul i, respectiv, sfritul liniei curente.
Consideraii speciale
Anumite evenimente care sunt o parte comun cu utilizarea Microsoft Windows pot s ridice probleme speciale
pentru depanarea unei aplicaii. Este important s fim contieni de aceste probleme pentru a nu complica procesul
de depanare.
Dac rmnem contieni de modul n care modul break poate pune evenimentele n dezacord cu ceea ce aplicaia
ateapt, avem o ans s gsim soluii. n anumite proceduri de evenimente, trebuie sutilizm instruciuni
Debug.Print pentru a monitoriza valorile variabilelor/proprietilor n loc s utilizm expresii santinel sau puncte
de oprire.
Dac se dorete accesul att la document ct i la cod, se va distribui documentul adic document Word, caiet
Excel sau prezentare PowerPoint. Acest caz este frecvent la scrierea unei soluii verticale o soluie foarte
specific pentru un utilizator foarte specific. De exemplu, dac se creeaz n Microsoft Word un formular de testare
a performanei, atunci att documentul ct i codul care l automatizeaz trebuie s fie accesibil utilizatorului.
Dac, pe de alt parte, se dorete ca numai codul (proiectul) s fie accesibil, atunci se va distribui ca un add-in
(Microsoft Excel i PowerPoint) sau ca un template global (Word).
Observaie. Utilizatorii nu au acces la foile de calcul dintr-un add-in deoarece acestea sunt ascunse automat la
crearea unui add-in dintr-un caiet. n mod similar, atunci cnd o prezentare PowerPoint este organizat ca un addin, slide-urile sale sunt eliminate automat. Pentru o discuie suplimentar se va citi seciunea "Salvarea soluiei ca
un Add-in sau Global Template".
Se poate interzice accesul utilizatorului la documentul asociat proiectului, fie din cauz c documentul nu este
pentru utilizator, fie pentru c el conine date pe care utilizatorul nu trebuie s le modifice sau s le vad. Acesta
este cazul cnd soluia conine proceduri care extind i adapteaz setul de opiuni ale aplicaiei proceduri care
sunt proiectate s aib o larg aplicabilitate, independente de un document specific. De exemplu, dac se scriu
proceduri care automatizeaz sarcini de formatare a foilor de calcul, utilizatorul trebuie s aib acces la aceste
proceduri din orice caiet deschis, dar nu trebuie s acceseze caietul asociat proiectului.
La distribuirea soluiei ca un add-in sau template trebuie s se decid separat dac se va proteja codul proiectului.
unde
/Switch poate fi /R sau /F. Comutatorul /R deschide fiierul read-only iar /F este utilizat pentru a cere ncrcarea
caietelor. Microsoft Excel citeste doar atta informaie dintr-un workbook ct este necesar pentru referirea
funciilor utilizator. Un exemplu este
HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\OPEN = /R
"C:\OFFICE\OFFICE\LIBRARY\ANALYSIS\ANALYS32.XLL"
Comanda OPEN este suportat doar din motive de compatibilitate i este necesar pentru cererea de ncrcare a
macrourilor. Alternativ recomandat este prezentat ulterior n acest capitol, o dat cu Init Commands i Init
Menus.
n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili la True pentru nregistrarea automat, aceeai
valoare dndu-se proprietii Registered pentru a nregistra add-in-ul.
With Addins("C:\\mytools.ppa")
.Loaded = True
.Registered = True
End With
Word are un numr de argumente pe linia de comand. Comutatorul /m execut codul din modulul specificat. De
notat c nu exist nici un spaiu dup "m" i c nu se specific procedura Main; doar o procedur denumit Main se
va executa, n lipsa unei asemenea proceduri nu se execut nimic la ncrcarea modulului. n continuare este un
exemplu de procedur Main.
' numele modulului este Add-inInstall, pentru a funciona cu
' linia de comand din exemplul anterior
Option Explicit
Sub Main()
'Check to see if Add-In is loaded in Add-In list
Dim wkbAddin As Word.AddIn
On Error GoTo ErrorHandler
Set wkbAddin = AddIns(ThisDocument.Name)
If wkbAddin Is Nothing Then
' Add the template to the add-ins collection and install it
Set wkbAddin = AddIns.Add(ThisDocument.FullName, True)
End If
' If template is the active document close it
If ThisDocument.Name = ActiveDocument.Name Then
' The Add-in should not be dirty
ThisDocument.Close
End If
Exit Sub
Errorhandler:
' Only ignore "Subscript out of range" errors
Select Case Err.Number
Case 9, 5941
Err.Clear
Resume Next
Case Else
' Assert the error when in Debug mode
#If DebugMode Then
AssertError
#End If
' Insert other error handling code here
End Select
End Sub
n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili pe False pentru descrcare, iar proprietatea
Registered se va stabili pe False pentru a nltura nregistrarea add-in-ului.
ncrcarea la cerere
ncrcarea unui add-in sau template la pornirea aplicaiei poate s creasc semnificativ timpul pornirii aplicaiei. Se
poate utiliza atunci ncrcarea la cerere pentru a amna ncrcarea pn atunci cnd utilizatorul apeleaz o comand
sau o procedur din add-in.
Este de menionat c wizard-urile i add-in-urile iniiate de o comand din menu sunt ncrcate, n mod automat, la
cerere.
Exist mai multe tehnici pentru a stabili ncrcarea la cerere, specifice diferitelor aplicaii.
Observaie. Dac se intenioneaz utilizarea unui add-in sau template ca o bibliotec de cod, apelat din alte
proiecte, nu trebuie ca aceasta s fie ncrcat explicit deoarece Visual Basic va ncrca add-in-ul sau template-ul
referit la cerere, atunci cnd o procedur din bibliotec este apelat.
Data_Type_ID este ID-ul care determin tipul de dat pe care Excel l accept pentru acest
1. Se selecteaz Insert din bara de meniu i Define din submeniul Name. Se adaug numele
"__DemandLoad" care se refer la "=TRUE" (se tasteaz exact aa n boxa Refers To). Este de
observat c exist dou caractere "_" n faa lui DemandLoad. Click Add, apoi Close.
2. Se stabilete proprietatea IsAddin a obiectului Workbook la TRUE.
Se salveaz caietul.
n continuare este un exemplu de macro care nfoar o funcie VBA.
MyFunction
=ARGUMENT("szArgOne")
=ARGUMENT("intArgTwo")
=RETURN(vMyFunction(szArgOne, intArgTwo))
End Function
Aceti pai permit ca add-in-ul s fie ncrcat la cerere. Dup ce este ncrcat, add-in-ul nu este descrcat din
memorie pn cnd se termin instana curent a aplicaiei Excel.
Descriere
Menu_bar_num
Menu_position
Menu_parent
Descriere
Menu_bar_num
Menu_name
Command_name
Macro
Command_position
Status_text
Help_reference
Descriere
Menu_bar_num
Menu_name
Numele meniu
Menu_position
Observaie. Este recomandabil s nu se elimine comanda Exit din meniul File dac nu s-a creat o cale alternativ
de prsire a aplicaiei Microsoft Excel.
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
Este evident c pentru a utiliza referine la proiecte trebuie ca proiectele implicate s poarte denumiri diferite (de
regul, la nceputul utilizrii VBA, proiectele se las cu denumirile implicite). Numele implicit al unui proiect se
poate vedea/modifica fie n fereastra Properties, fie n Project Name din dialogul Project Properties (obinut prin
click dreapta n VBE i alegerea project name Properties).
Referina la un alt proiect se realizeaz manual prin dialogul References ( meniul Tools) sau programatic prin
metoda AddFromFile a coleciei References. Linia urmtoare stabilete o referin din caietul activ la proiectul
din add-in-ul MyTools.xla:
ActiveWorkbook.VBProject.References.AddFromFile "C:\Tools\MyTools.xla"
Este ns de notat c nainte de a stabili programamtic o referin, trebuie (n Word, Excel, PowerPoint) stabilit o
referin la biblioteca de tipuri Visual Basic for Applications Extensibility. Aceast bibliotec ofer obiectele care
permit lucrul programatic cu proiectul VBA.
Observaie. Rutina Auto_Open dintr-un add-in referit nu este executat la ncrcare prin referin dintr-un alt addin sau prezentare.
AppendEnvironmentPath ThisDocument
End Sub
#End If
'AppExcel is a user defined compile directive
#If AppExcel = True Then
Public Sub Workbook_Open()
AppendEnvironmentPath ThisWorkbook
End Sub
#End If
Private Sub AppendEnvironmentPath (ThisDocObject As Object)
Const ENV_PATH As String = "Path"
Dim iRet As Long
Dim szPath As String
SzPath = String(1024, 0)
' Retrieve the current environment setting.
IRet = GetEnvironmentVariable(ENV_PATH, szPath, 1024)
If iRet Then
' iRet contains the length of the returned string.
' trim any trailing characters
szPath = Mid$(szPath, 1, iRet)
' See if the template path is included in the path statement.
If InStr(1,szPath, ThisDocObject.Path, vbTextCompare) = 0 Then
' Path is not part of the environment.
szPath = szPath & ";" & ThisDocObject.Path
iRet = SetEnvironmentVariable (ENV_PATH, szPath)
If iRet = 0 Then
' Handle error here. Template path was not appended to
' environment.
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"Path environment was not set."
End If
End If
Else
' should raise an error here. This should never happen
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"No path environment was found."
End If
End Sub
Se poate scrie un add-in agent de referin (reference broker) care s adapteze referinele
pentru a main specific. Un asemenea agent de referin ar trebuie s verifica referina i
s lege nainte ca soluia s se execute (sau la momentul ncrcrii). Acest tip de
component este bun pentru soluii trietajate (three-tier). Agentul trebuie s lege dinamic
componenta front-end de componenta back-end pe baza versiunii, nivelului de securitate
sau ali parametri determinai de administrator. Aceast tehnic poate fi utilizat la
actualizarea automat a componentelor. O cale pentru determinarea dac o referin este
valid este utilizarea proprietii IsBroken a obiectului Reference. Proprietatea IsBroken
este True dac referina nu se refer la o intrare valid n Windows Registry.
Dac documentul reprezentat de variabila objDoc nu are, n modulul su ThisDocument, o procedur public
denumit MySub, atunci apare o eroare de execuie. n acest mod se poate apela cod doar din module
ThisDocument sau ThisWorkbook. Dac se dorete apelul unor proceduri din alte module, clase sau forme ale
proiectului asociat documentului/caietului deschis, se vor scrie proceduri intermediare n modulul ThisDocument
sau ThisWorkbook pentru a le accesa.
Observaie. Procedeul descris nu funcioneaz n PowerPoint deoarece nu exist un modul ThisPresentation n
proiect.