Sei sulla pagina 1di 16

BAZELE PROGRAMRII Visual Basic for Application (VBA)

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

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

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

Currency
Domeniu de valori: -922 337 203 685 477.5808 922 337 203 685 477.5807 Memorie: 8 bytes Declarator de tip: @

Observaii. Utilizate pentru calcule bneti (sau alte situaii n care precizia este foarte important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obine 15 cifre la partea ntreag i 4 cifre la partea zecimal (reprezentare n virgul fix).

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

Decimal
Domeniu de valori: (vezi observaiile) Memorie: 12 bytes Declarator de tip: Observaii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nsoii de un factor de scal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (fr parte zecimal), cea mai mare valoare posibil este +/79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/-7.9228162514264337593543950335 iar cea mai mic valoare nenul este +/0.0000000000000000000000000001. Not: Deocamdat, tipul Decimal poate fi utilizat doar ca subtip n Variant, adic nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin funcia Cdec (funcia foreaz o expresie s fie de un tip specificat, din aceeai categorie de funcii fiind i CBool, CByte etc.).

Double

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

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

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

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

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

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

Variant (default)
Domeniu de valori: aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuri ale tipului Variant, cu meniunea c toate subtipurile numerice au domeniul de la Double. Memorie: n funcie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String necesit 22 bytes plus cte un byte pentru fiecare caracter. Declarator de tip: Observaii. Este tipul specificat implicit (n lipsa unei declaraii explicite) pentru o constant, variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferenele de tip ale argumentelor la apelul procedurilor). Cu excepia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul Variant poate conine orice alt tip de dat. n plus poate s conin valorile speciale Empty, Error, Nothing i Null. Tipul considerat pentru o dat coninut ntr-un Variant poate fi determinat cu funcia VarType sau TypeName. Valorile unei variabile Variant pot s-i converteasc valorile automat. n general, datele numerice sunt memorate n tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac rezultatul unei operaii necesit acest fapt. De

exemplu o valoare declarat iniial drept Integer i atribuit unui Variant va fi memorat ca un ntreg pn cnd, ridicnd-o de exemplu la o putere, valoarea ei excede domeniul tipului Integer. n acest caz are loc promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). Dac depirea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare. Utilizarea tipului Variant permite o tratare mai difereniat a irurilor de cifre: n operaii numerice vor fi considerate numere iar n operaii cu iruri vor fi considerate iruri. Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite. Valorile speciale au semnificaia:
o o o

Empty este valoarea unui Variant care nu a fost iniializat. n calcule numerice este considerat 0 iar n operaii cu iruri este irul de lungime zero. Null este valoarea unui Variant care, n mod programatic, nu conine date. Error este valoarea utilizat pentru a arta ndeplinirea unei condiii de eroare (prin convertirea unui real cu funcia CVErr). Procesarea se va efectua de ctre utilizator, tratarea automat a erorilor nu este activat la setarea acestor valori. Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv.

Tipuri definite de utilizator


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

Declararea constantelor, variabilelor i tablourilor


Nume
La denumirea procedurilor, constantelor, variabilelor i argumentelor ntr-un modul Visual Basic se cere respectarea urmtoarelor reguli:

primul caracter trebuie s fie o liter; nu se utilizeaz spaiu, punct (.), semnul exclamrii(!), sau caracterele @, &, $, # lungimea denumirii nu poate depi 255 de caractere; la acelai nivel de existen nu pot s existe denumiri identice. Pot s existe totui, n acelai modul, o variabil privat i o variabil la nivel de procedur care s poarte acelai nume.

n general, nu se recomand definirea unor denumiri identice cu nume de funcii, instruciuni sau metode existente n Visual Basic. Dac s-a ajuns totui la aceast situaie, atunci utilizarea funciei intrinseci limbajului, a instruciunii sau metodei care intr n conflict cu un nume asignat necesit calificarea ei n raport de biblioteca asociat. De exemplu, VBA.Left este apelul la funcia Left atunci cnd este definit de utilizator i o variabil Left. Not. Visual Basic nu este case-sensitive, deci denumirea unei entiti nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA pstreaz capitalizarea din instruciunea unde este definit un nume.

Declararea constantelor
Definirea unei constante se realizeaz prin instruciunea Const, n care se poate specifica tipul, domeniul i valoarea constantei. Valoarea unei constante nu se poate schimba programatic. [Public | Private] Const constname [As type] = expression Public cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din toate modulele. Nu este permis n proceduri. Private cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din modulul n care apare declaraia. Nu este permis n proceduri. constname numele constantei (obligatoriu). type tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nc nu este suportat), Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; n lipsa clauzei se va ataa automat tipul cel mai apropiat expresiei. expression combinaie de identificatori, constante, operatori (cu excepia Is) care produce un sir, numr sau obiect. Nu se pot utiliza variabile, funcii utilizator sau funcii VBA predefinite.

n mod implicit, constantele sunt private. La nivel de procedur, sau de modul clas, domeniul lor nu poate fi modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public. Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afara unei proceduri este definit n modulul respectiv. Mai multe declaraii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri de expresii. n acest caz, cuvintele Public sau Private care apar se aplic ntregii linii. Exemple
Const NrLinii = 15 Public Const MesajInitial = "Tastati numarul de linii" Private Const NrLinii as Integer = 15 Public Const NrLinii = 15, Pondere as Single = 1.21

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

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

Static varname[([subscripts])] [As [New] type] ReDim [Preserve] varname(subscripts) [As type] varname numele variabilei (obligatoriu). subscripts dimensiunile tabloului de date (dac se declar o variabil tablou). Pot exista pn la 60 de indici, separai prin virgule, declararea dimensiunilor pentru un indice fiind de forma [lower To] upper Limita inferioar este, implicit, 0, dar poate fi controlat prin instruciunea Option Base. Dac nu se indic limitele indicilor (dar parantezele sunt prezente), se definete o variabil tablou dinamic (nu i prin Static) ale crei dimensiuni pot fi precizate/redefinite prin instruciunea ReDim. New permite crearea implicit a unui obiect (atunci cnd se declar o variabil de tip obiect). O nou instan a obiectului este creat la prima referin a variabilei definite. Clauza nu poate s apar la declararea variabilelor de tipuri intrinseci i nici la declararea instanelor obiectelor dependente. type tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat nc), Date, String (pentru iruri cu lungime variabil), String * length (pentru iruri cu lungime fix), Object, Variant, tip utilizator sau tip de obiect. Dac se definesc mai multe variabile ntr-o instruciune, definiiile se separ prin virgul iar clauza de tip nu este extins i la variabilele definite ulterior. Dei toate instruciunile permit declararea unor variabile (simple sau tablou), fiecare instruciune are un efect distinct n ceea ce privete vizibilitatea variabilelor i persistena valorilor.

Dim definete variabile att la nivel de modul ct i la nivel de procedur. Variabilele definite la nivel de modul sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedur sunt vizibile doar n procedura respectiv. Private este utilizat la nivel de modul pentru a declara variabile accesibile doar n procedurile acelui modul. Public este utilizat pentru a declara variabile accesibile n toate procedurile din toate modulele i din toate aplicaiile. Prin includerea instruciunii Option Private Module este posibil ca variabilele publice s fie vizibile doar n proiectul n care sunt definite. Static este utilizat la nivel de procedur nestatic pentru a declara variabile care i pstreaz valoarea de la o execuie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit. Variabilele definite prin Static sunt vizibile doar n procedura respectiv. Este de remarcat c se poate defini o ntreag procedur utiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice.

ReDim este utilizat la nivel de procedur pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni i pstreaz valorile deja existente. (Pentru detalii vezi i VBA Help).

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

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

Proceduri Sub
Organizarea general a unei proceduri de tip Sub este [Private | Public] [Static] Sub name ([arglist]) [instruciuni]

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

Apelul unei proceduri Sub

Pentru a executa o procedur de tip Sub din alt procedur (vezi i discuia privind vizibilitatea) se menioneaz, pe o linie separat, numele procedurii urmat sau nu de parametri. Dac este necesar, datorit apelrii unui alt proiect sau modul, atunci apelul este dup modelul: Nume_proiect.Nume_modul.Nume_procedur list de argumente unde lista de argumente poate sau nu s fie inclus ntre paranteze. Argumentele efective sunt separate n list prin virgule i trebuie s respecte ordinea (i tipul) argumentelor din definiia procedurii. n cazul procedurilor cu multe argumente, dintre care multe opionale, transferul poate provoca erori de scriere a codului (un argument opional necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situaii (n special) se permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alctuind lista de argumente, la apelul procedurii, din intrri de forma nume_argument:=valoare_argument separate prin virgule i la care nu mai conteaz ordinea iniial a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adic valorile opionale dorite i toate valorile neopionale). Pentru apelul unei proceduri se va studia i instruciunea Call.

Proceduri Function
O procedur de tip Function este similar, ca definiie, unei proceduri Sub, dar are particularitatea c returneaz o valoare prin numele su (care se comport deci ca o variabil). [Public | Private] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function Este de remarcat c se poate ataa un tip numelui funciei (adic valorii funciei) i se va remarca existena instruciunilor prin care se atribuie funciei valorile calculate. Valoarea returnat de o funcie poate fi utilizat ntr-o alt expresie prin includerea numelui funciei urmat, ntre paranteze, de valorile efective ale parametrilor.

Dac apelul se face prin intermediul instruciunii Call, valoarea funciei nu poate fi utilizat. n asemenea situaii se activeaz de fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate).

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

Apelul funciei poate fi ntr-o instruciune de genul


CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

n timp ce apelul subrutinei poate fi


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

Organizarea general a unui proiect VBA


Obiectele i prelucrrile necesare realizrii unei aplicaii VBA (presupunnd c se dorete atingerea unui ansamblu coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un anumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor.

Deoarece prelucrrile proiectate n VBA sunt ataate documentelor (aciunilor) unor aplicaii particulare (Word, Excel etc.), proiectele sunt salvate o dat cu documentele pe care le nsoesc. Acest fapt nu reduce aria de probleme abordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nsoit (se poate deschide astfel un document Word alb i s se efectueze orice prelucrare dorit, fr a avea obligaia de a scrie ceva n documentul deschis). ntr-un proiect VBA sunt identificabile urmtoarele componente:

Module standard (denumite iniial module de cod). Conin declaraii i proceduri generale. Exist de asemenea i module care conin tratarea evenimentelor specifice documentului de care este ataat proiectul. Module de clas. Conin definirea obiectelor create de utilizator. Forme. Conin definiiile dialogurilor din interfaa proiectat de utilizator ca i codul program necesar controlrii dialogurilor. Referine. ntr-un proiect este meninut lista altor proiecte, care sunt referite n proiectul curent.

Un modul de cod poate ncepe cu o seciune de declaraii. Prin declaraii nelegem instruciuni neexecutabile prin care se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeaz i domeniul de vizibilitate a entitilor definite. Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat ntr-o seciune separat.

Domeniul unei variabile, constante sau proceduri


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

la nivel de procedur; la nivel de modul, privat; la nivel de modul, public.

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

Nivel de modul, privat


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

Nivel de modul, public


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

Viata unei variabile


Prin viaa unei variabile se nelege timpul ct variabila are o valoare. Este evident c valoarea unei variabile se poate modifica pe durata vieii sale, dar definitoriu este faptul c variabila are o anumit valoare pe ntreaga durat a vieii sale. La prsirea domeniului, variabila "moare" i nu mai are ataat o valoare. La nceputul execuiei unei proceduri, toate variabilele sunt iniializate: Variabil numeric ir de lungime variabil ir de lungime fix 0 (zero) "" (ir de lungime zero) Completat cu caracterul Chr(0) (avnd codul ASCII 0) Empty fiecare element este iniializat separat, potrivit tipului primar Nothing (pn la asignarea unei referine prin Set)

Variabil Variant Variabile de tip utilizator

Variabil Object

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

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

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


Dim myDoc As Word.Document

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

objectvar este numele variabilei (sau proprietii) New permite crearea unei noi instane a clasei Objectexpression este o expresie constnd n numele unui obiect, alt variabil declarat de acelai tip obiect, sau funcie ori metod care returneaz un obiect de acelai tip obiect

Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem i de memorie utilizate.

n general, atunci cnd se utilizeaz Set pentru a asigna o referin de obiect la o variabil, nu se creeaz o copie a obiectului pentru acea variabil. Este creat doar o referin la obiect. Astfel, mai multe variabile de tip obiect pot s se refere la acelai obiect: orice schimbare a obiectului se va reflecta n toate variabilele care refer obiectul. Utiliznd clauza New se va crea efectiv o copie (instan) a obiectului.

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

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

Constante predefinite (builtin)


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

n loc de
Application.DisplayAlerts = -1

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

Potrebbero piacerti anche