Sunteți pe pagina 1din 54

erban CRICOT

Programarea n VISUAL BASIC for Application

CUPRINS
CAP.I ELEMENTELE DE BAZA ALE LIMBAJULUI DE PROGRAMARE VBA - VISUAL BASIC FOR APPLICATION I-5 I.1. No iuni generale despre VBA.............................................................................................................. I-5 I.1.1. Utilizarea limbajului de programare VBA....................................................................................... I-5 I.1.2. Necesitatea utilizrii codului VBA n aplica ii Access.................................................................... I-5 I.1.3. Modulele de cod VBA n Access..................................................................................................... I-6 I.1.4. Elementele generale ale limbajului VBA ........................................................................................ I-7 I.1.5. Structura rutinelor VBA .................................................................................................................. I-7 I.1.6. VBA mediul de dezvoltare i depanare ........................................................................................ I-7 I.2. Tipuri de date ..................................................................................................................................... I-12 I.2.1. Tipuri de date elementare .............................................................................................................. I-12
I.2.1.1. Date numerice ntregi ..............................................................................................................................I-12 I.2.1.2. Date numerice reale.................................................................................................................................I-12 I.2.1.3. Tipul de date BOOLEAN logic..............................................................................................................I-12 I.2.1.4. Tipul de date STRING ir de caractere .................................................................................................I-13 I.2.1.5. Tipul de date DATE data calendaristic i timpul ................................................................................I-14

I.2.2. Tipuri de date structurate ............................................................................................................... I-14


I.2.2.1. Tipul de date ARRAY tablou..................................................................................................................I-14 I.2.2.2. TYPE Crearea tipurilor de date definite de utilizator...........................................................................I-14

I.2.3. Tipul de date VARIANT ............................................................................................................... I-15 I.3. Variabile.............................................................................................................................................. I-16 I.3.1. Declararea variabilelor................................................................................................................... I-16 I.3.2. Caractere folosite ca Type-declaration .......................................................................................... I-16 I.3.3. Option Explicit (declararea explicit a variabilelor)...................................................................... I-16 I.3.4. Variabile Locale i Globale ........................................................................................................... I-17 I.3.5. Variabile Publice i Private ........................................................................................................... I-18 I.3.6. Variabile Statice ............................................................................................................................ I-18 I.3.7. Variabile domeniul i durata de valabilitate ............................................................................... I-19 I.3.8. Declararea i folosirea variabilelor ARRAY ................................................................................. I-19 I.4. Constante ............................................................................................................................................ I-21 I.5. Limbajul VBA Instruc iuni executabile........................................................................................ I-22 I.5.1. Instruc iunea de atribuire ............................................................................................................... I-22 I.5.2. Structurile de control ..................................................................................................................... I-24
I.5.2.1. Structura secven ial................................................................................................................................I-24 I.5.2.2. Structura alternativ ................................................................................................................................I-24 I.5.2.2.a) Structura alternativ simpl...............................................................................................................I-24 I.5.2.2.b) Structura alternativ multipl ............................................................................................................I-25 I.5.2.3. Structura repetitiv ..................................................................................................................................I-27 I.5.2.3.a) Structura repetitiv cu test. Instruc iunea DoLoop........................................................................I-27 I.5.2.3.b) Structura repetitiv cu contor. Instruc iunea ForNext ...................................................................I-28

I.6. Rutine proceduri i func ii ............................................................................................................. I-29 I.6.1. Ce este o rutin i ce elemente o definesc?.................................................................................... I-29 I.6.2. Transmiterea datelor prin parametri .............................................................................................. I-30 I.6.3. Crearea (definirea) unei rutine....................................................................................................... I-31
I.6.3.1. Proceduri (Subrutine) ..............................................................................................................................I-31 I.6.3.2. Func ii ......................................................................................................................................................I-32

I.6.4. Apelarea unei rutine....................................................................................................................... I-32


I.6.4.1. Apelarea unei proceduri (subrutine)........................................................................................................I-32 I.6.4.2. Apelarea unei func ii ................................................................................................................................I-33

I.6.5. Domeniul de vizibilitate al rutinelor.............................................................................................. I-33 I.6.6. Durata de via a rutinelor ............................................................................................................. I-33 I.6.7. Rutine definite de utilizator. Introducerea codului VBA ............................................ I-33 I.6.8. Procedurile evenimentelor ............................................................................................................. I-34 I.6.9. Utilizarea combinat a procedurilor eveniment cu rutinele utilizator ........................................... I-35 I.6.10. Parametri op ionali ...................................................................................................................... I-36
I-2

I.7. Biblioteci standard de proceduri i func ii ...................................................................................... I-36 I.7.1. Func ii matematice ........................................................................................................................ I-37
I.7.1.1. Int(numr); Fix(numr) ...........................................................................................................................I-37 I.7.1.2. Abs(numr)...............................................................................................................................................I-37 I.7.1.3. Sgn(numr)...............................................................................................................................................I-37 I.7.1.4. Sqr(numr) ...............................................................................................................................................I-38 I.7.1.5. Exp(numr) ..............................................................................................................................................I-38 I.7.1.6. Log(numr) ..............................................................................................................................................I-38 I.7.1.7. Rnd [(numr)] ..........................................................................................................................................I-38 I.7.1.8. Sin(numr) ...............................................................................................................................................I-39 I.7.1.9. Cos(numr) ..............................................................................................................................................I-39 I.7.1.10. Tan(numr) ............................................................................................................................................I-39 I.7.1.11. Atn(numr) .............................................................................................................................................I-39 I.7.1.12. Calculul func iilor matematice derivate.................................................................................................I-39

I.7.2. Func iile TEXT pentru stringuri ................................................................................................. I-39


I.7.2.1. Asc(string)................................................................................................................................................I-39 I.7.2.2. Chr(CodCaracter)....................................................................................................................................I-40 I.7.2.3. AscB(string ); AscW(strin g ); Ch rB(Cod Ch ); Ch rW(Cod Ch ) .................................................I-40 I.7.2.4. LCase(string) ...........................................................................................................................................I-40 I.7.2.5. UCase(string)...........................................................................................................................................I-41 I.7.2.6. LTrim(string); RTrim(string); Trim(string) .............................................................................................I-41 I.7.2.7. Len(String | NumeVariabila)....................................................................................................................I-41 I.7.2.8. Left(string, lungime).................................................................................................................................I-41 I.7.2.9. Right(string, lungime) ..............................................................................................................................I-42 I.7.2.10. Mid(string, start [,lungime]) ..................................................................................................................I-42 I.7.2.11. InStr([start,]string1,string2[,compare]) ................................................................................................I-43 I.7.2.12. String(numr,caracter) ..........................................................................................................................I-43 I.7.2.13. Space(numr) .........................................................................................................................................I-43 I.7.2.14. Format(expresie[,format]) .....................................................................................................................I-44

I.7.3. Func ii pentru tablouri (array) - UBound i LBound..................................................................... I-45 I.7.4. Func ii de conversie....................................................................................................................... I-45
I.7.4.1. Str(Numr) ...............................................................................................................................................I-45 I.7.4.2. Val(string) ................................................................................................................................................I-45

I.7.5. Func ii pentru mesaje..................................................................................................................... I-46


I.7.5.1. MsgBox(prompt[,buttons][,title]) ............................................................................................................I-46 I.7.5.2. InputBox(prompt[,title][,default][,X][,Y])...............................................................................................I-47

I.7.6. Func ii cu tipul: Date/ Time........................................................................................................... I-48


I.7.6.1. DatePart(interval,date) ............................................................................................................................I-48 I.7.6.2. DateDiff(interval,date1,date2) .................................................................................................................I-48 I.7.6.3. DateAdd(interval,number,date) ...............................................................................................................I-49 I.7.6.4. Day(date); Month(date); Year(date) ........................................................................................................I-49 I.7.6.5. Second(date); Minute(date); Hour(date) .................................................................................................I-49 I.7.6.6. Now(); Date(); Time() ..............................................................................................................................I-49 I.7.6.7. DateSerial(year, month, day) ...................................................................................................................I-49 I.7.6.8. TimeSerial(hour, minute, second) ............................................................................................................I-49

I.7.7. Func ii: structuri de control ........................................................................................................... I-50


I.7.7.1. IIf(condi ie, TruePart, FalsePart) ............................................................................................................I-50 I.7.7.2. Choose(index, caz-1[,caz-2,... [,caz-n]]) .................................................................................................I-50 I.7.7.3. Switch(expr-1,value-1[,expr-2,value-2 [,expr-n,value-n]]..])................................................I-50

I.7.8. Func ii de inspec ie........................................................................................................................ I-51


I.7.8.1. IsNull(expresie) ........................................................................................................................................I-51 I.7.8.2. IsEmpty(NumeVariabila) .........................................................................................................................I-51 I.7.8.3. IsMissing(NumeParametru) .....................................................................................................................I-51 I.7.8.4. VarType(NumeVariabil).........................................................................................................................I-52

I.7.9. Func iile agregate SQL .................................................................................................................. I-52 I.7.10. Func iile agregate de domeniu..................................................................................................... I-53

I-3

I-4

Cap.I Elementele de baz ale limbajului de programare VBA - Visual Basic for Application
I.1. No iuni generale despre VBA
I.1.1. Utilizarea limbajului de programare VBA Basic este unul din cele mai vechi limbaje de programare. El a fost creat n ideea de a se realiza un limbaj de programare necesar unui specialist dintr-un anumit domeniu, care nu are cunotin e aprofundate despre sistemele de calcul. Basic a fost implementat ini ial, n sistemele de operare, ca un interpretor, adic ca un sistem care n momentul n care preia o instruc iune surs Basic, o transform imediat n instruc iuni obiect (cod main) i le execut. Pentru a l face ct mai accesibil, au existat variante de Basic care au implementat i comenzi specifice unui sistem de operare, ajungndu-se pn la a se realiza calculatoare dedicate pentru lucrul sub Basic, fr sisteme de operare. Evident, fiind conceput pe aceste principii, aplica iile realizate nu erau performante, ele neutiliznd eficient facilit ile unui sistem de calcul. Treptat, s-a trecut la realizarea unor implementri, tehnic mai performante, prin realizarea de compilatoare pentru Basic sub diferite sisteme de operare, adic a unor module care transform un fiier cu instruc iuni surs Basic ntr-un fiier care con ine instruc iuni direct executabile, n cod obiect. n felul acesta s-au separat cele dou ac iuni efectuate de un interpretor n acelai timp i anume: compilarea programului surs i execu ia programului obiect. Firma Microsoft a realizat o versiune de Basic, numit Visual Basic, care pe lng principiile ini iale s-a dorit a rezolva urmtoarea problem un limbaj de programare universal, unic, care s poat fi folosit att n aplica iile de sistem (n locul limbajului C) ct i n cele utilizator, performant att din punct de vedere al limbajului (implementnd conceptele de programare modular, programare structurat i programare la nivel de obiect) ct i din punct de vedere al utilizrii tuturor facilit ilor sistemului de operare. Astfel s-au creat, pe baza aceluiai nucleu de programare Basic, trei sisteme: Microsoft Visual Basic (VB), ca limbaj universal de programare; Visual Basic for Application (Visual Basic pentru aplica ii), prescurtat uzual VBA, ca un limbaj complex pentru dezvoltarea aplica iilor n cadrul programelor din Microsoft Office. Aceasta nseamn c nucleul limbajului, componentele sale i mediul sunt aceleai n Access, Word sau Excel. VBA este aproape identic cu limbajul universal de programare Microsoft Visual Basic; Visual Basic Script (VB Script), utilizat n special pentru aplica iile Internet. I.1.2. Necesitatea utilizrii codului VBA n aplicaii Access Aplica iile mai simple din Access pot fi scrise fr a fi nevoie de vreo instruc iune, eventual folosind comenzile macro. Dei comenzile macro sunt foarte bune pentru rezolvarea rapid a unor prelucrri necesare pentru dezvoltarea majorit ii aplica iilor de baz, realizarea unor aplica ii complexe, profesioniste n Access se face folosind limbajul VBA. Acest lucru se datoreaz faptului c, spre deosebire de comenzile macro, VBA ofer posibilit i de lucru specifice limbajelor de nivel nalt de programare orientat pe obiecte. Cteva dintre aceste posibilit i sunt: tratarea erorilor prin proceduri speciale create de proiectant. n timpul execu iei unei aplica ii pot interveni diverse erori (de exemplu o mpr ire la zero sau ieirea din domeniul de defini ie al unei variabile etc.) pe care sistemul le trateaz n general prin stoparea modulului unde apar sau chiar a ntregii aplica ii. VBA ofer posibilitatea ca la apari ia unei erori, controlul s fie dat unui modul de cod VBA, realizat de proiectant, care s rezolve n func ie de context situa ia aprut, fr a mai fi necesar stoparea modulului respectiv sau a aplica iei. crearea unor structuri ciclice pentru parcurgerea seturilor de nregistrri. Datele unei tabele sau cereri de selec ie se pot manipula ca pe un fiier specific, numit set de nregistrri; execu ia proceselor tranzac ionale. Acestea reprezint practic posibilitatea de a efectua actualizrile ntr-un set de nregistrri, global, la un anumit moment. n cazul apari iei unei erori se pot anula toate actualizrile din procesul respectiv, setul de nregistrri rmnnd nemodificat; apelarea func iilor Windows API, prin care se pot folosi module ale sistemului de operare;
I-5

utilizarea variabilelor, constantelor i a literalilor; crearea i manipularea prin program a obiectelor necesare aplica iei; crearea de clase de obiecte; De asemenea VBA uureaz scrierea bibliotecilor de func ii reutilizabile, precum i proiectarea i depanarea proceselor complexe de ctre programatori. n concluzie, dei comenzile macro pot da solu ii rapide problemelor simple, limitrile lor determin necesitatea folosirii limbajului VBA pentru dezvoltarea solu iilor mai complexe. I.1.3. Modulele de cod VBA n Access Codul VBA este scris n unit i numite rutine, care pot fi proceduri (subrutine) sau func ii. Aceste proceduri i func ii sunt pstrate n obiecte numite module de cod, i anume: Module specifice unui anumit formular sau raport. Modulele specifice unui formular sau raport sunt n general numite coduri din spatele formularelor (Code Behind Forms CBF). Rutinele din acest loc pot fi vizibile (cunoscute, apelabile) doar din modulul respectiv de cod. Codul din spatele formularului sau raportului se poate accesa prin ac ionarea pictogramei specifice codului VBA (dup selec ia obiectului respectiv) sau prin apsarea celor trei puncte () din dreptul unui eveniment al paginii respective a unui obiect apar innd formularului sau raportului respectiv. Dac procedura eveniment nu este creat, atunci automat un Wizard va crea structura acesteia, adic instruc iunile de declarare i sfrit precum i completarea listei de parametri dac este cazul. Dac procedura eveniment a fost creat anterior, atunci se va afia por iunea din pagina de cod a formularului sau raportului care con ine respectiva procedur. Modulele globale (generale), se pot afia prin ac ionarea paginii Module, din fereastra Database. Foarte important este faptul c rutinele scrise n aceast zon pot fi vizibile (dac sunt declarate Public) nu numai din toate modulele de cod ale aplica iei, dar chiar din obiecte ale aplica iei, din formulare, rapoarte, cereri sau tabele. Exemplu. Dac n modulul global se gsete o func ie declarat public, cu numele 'Prag', aceasta va putea fi folosit n expresii din orice: modul general sau din spatele unui formular sau raport; controale calculate din formulare sau rapoarte; propriet i ale controalelor sau ale tabelelor (de exemplu Validation Rule, Default Value); criterii din cereri; cmpuri calculate din cereri; practic de oriunde este acceptat o expresie. Orice modul de cod este format din dou pr i: n prima parte se introduc declara iile generale ale modulului, valabile n ntreg modulul. Acestea sunt: Op iunile modulului. De exemplu: Option Explicit, care for eaz declararea tuturor variabilelor folosite n modul. Declararea tipurilor, variabilelor i constantelor, vizibile n tot modulul de cod. n a doua parte se introduc rutinele (proceduri sau func ii) modulului de cod. O procedur (subrutin) este o rutin care execut o ac iune: la apari ia unui eveniment al unui obiect al aplica iei; la apelarea (lansarea) ei dintr-o alt rutin VBA; O func ie este un tip special de rutin, datorit faptului c poate ntoarce o valoare, chiar n numele ei. Deci codul VBA poate fi gsit n rapoarte, formulare i module de cod. n formulare i rapoarte, codul VBA poate fi plasat n rutinele (func ii sau proceduri) definite de utilizator, ca i n procedurile eveniment, pe cnd n modulele generale, codul VBA este plasat numai n rutinele definite de utilizator. De fapt, pentru a construi cu succes rutine n cod VBA, sunt foarte importante dou lucruri: ce determin stabilirea domeniului de vizibilitate (valabilitate) al variabilelor i rutinelor; cum se transmit i se ntorc valorile din rutine;
I-6

n concluzie, putem spune c programarea n VBA nu este procedural, adic nu avem de-a face cu un program clasic, cu nceput i sfrit, care rezolv paii unui algoritm. Codul VBA este practic format din rutine, care sunt executate numai atunci cnd se produc anumite evenimente. Deci codul VBA implic realizarea unui programri discontinue. I.1.4. Elementele generale ale limbajului VBA Definirea unui limbaj de programare (ca i a VBA) se face n general prin configurarea urmtoarelor elemente de baz: tipuri de date; variabile; constante; instruc iuni: instruc iunea de atribuire; structuri de control; rutine (proceduri i func ii); biblioteci. Dac limbajul de programare este orientat la nivel de obiect, aa cum este Visual Basic sau VBA, atunci trebuie definite i elemente referitoare la: referirea obiectelor; crearea modulelor de clase de obiecte; crearea i manipularea obiectelor (instan e ale claselor de obiecte); crearea i manipularea colec iilor de obiecte. Limbajele de programare dezvoltate mai pun la dispozi ie programatorilor: proceduri specifice de tratare a erorilor; modalit i de verificare i depanare a erorilor de programare; proceduri de import/ export de obiecte exterioare aplica iei; interac iunea cu sistemul de operare; manipularea datelor organizate n fiiere sau baze de date. I.1.5. Structura rutinelor VBA Scrierea rutinelor se face respectnd urmtoarele reguli: prima instruc iune definete tipul rutinei, procedur sau func ie; ultima instruc iune executabil este End Sub | Function; la nceput se pun de obicei (dar nu este obligatoriu) instruc iunile declarative (tipuri de date, variabile, constante); toate instruc iunile au o anumit sintax care ine seama de numrul de rnduri pe care sunt scrise; semnul de continuare a unui rnd este format din dou caractere, spa iu i liniu cu shift ( _ ); semnul pentru nceputul unui comentariu este apostroful ('). Sfritul comentariului este la sfritul rndului. I.1.6. VBA mediul de dezvoltare i depanare Odat intrat ntr-un modul de cod, Access ofer proiectantului de aplica ii un sistem complex pentru realizarea i asistarea activit ii de programare n VBA. Printre cele mai utilizate instrumente ale acestui sistem sunt: Editarea rutinelor Sunt oferite facilit ile curente de editare promovate de Microsoft n produsele sale. Exist i mai multe trucuri speciale destinate activit ii de programare, printre care: recunoaterea cuvintelor cheie ale limbajului; afiarea listelor cu propriet ile i metodele obiectelor utilizate; marcarea recunoaterii unei denumiri date de utilizator (unei variabile, rutine etc.) prin refacerea formei introduse la declararea acesteia; n VBA sistemul nu face deosebire ntre literele mari i mici. Dac la declararea unui obiect, sunt folosite combina ii de litere mari i mici, (dup anumite conven ii), atunci cnd se vor introduce
I-7

denumirile respective cu acelai tip de liter, sistemul va reface forma ini ial a lor. n acest fel programatorul va sesiza imediat eventualele greeli comise la introducerea denumirii obiectelor. Compilarea rutinelor Exist 3 comenzi de compilare (vezi figura): compilarea ntregii aplica ii i salvarea codului obiect rezultat; compilarea ntregii aplica ii dar fr modificarea codului obiect existent; compilarea numai a modulelor de cod deschise (ncrcate n memorie). Prezen a erorilor de compilare este marcat punctual i este nso it de informa iile necesare unei depanri rapide. De asemenea, sistemul nc din faza de editare semnaleaz imediat erorile de compilare depistabile n acel moment (de exemplu cele referitoare la corectitudinea sintaxei instruc iunilor). Execu ia dup o comand manual (deci nu ca urmare a producerii unui eveniment) a rutinelor O rutin fr parametri se poate executa direct din modulul de cod. Acest lucru se face: prin plasarea cursorului pe instruc iunea de la care se dorete nceperea execu iei; n felul acesta rutina se poate executa pornind de la oricare dintre instruc iunile sale executabile; prin ac ionarea uneia dintre cele 4 comenzi de RUN (vezi figura) i anume: Run: execu ia tuturor instruc iunilor rutinei (eventual i a rutinelor apelate) fr oprire; Step Into: execu ia tuturor instruc iunilor rutinei (eventual i a rutinelor apelate) cu oprire dup fiecare instruc iune executat; Step Over: execu ia tuturor instruc iunilor rutinei (eventual i a rutinelor apelate) cu oprire dup fiecare instruc iune executat n rutina apelant, dar fr oprire n rutinele apelate; Step Out: execu ia tuturor instruc iunilor pn la sfritul rutinei principale (apelante), dar cu oprire numai n rutinele de rang superior celei din care s-a dat aceast comand; se folosete cnd se dorete reluarea execu iei dintr-o rutin apelat, dar fr oprire la instruc iunile din aceasta. n rutine se pot introduce breakpoint-uri (puncte de oprire) printr-un click pe marginea formularului modulului de cod n dreptul instruc iunii pe care se dorete oprirea execu iei. Acest marcaj se vizualizeaz printr-un punct de culoare maro. tergerea breakpoint-urilor se face printr-un nou click sau prin comanda specific din meniu (vezi figura). Se pot introduce n surs breakpoint-uri prin instruc iunea STOP. Urmrirea traseului programului i evolu iei ncrcrii cu date a variabilelor, n vederea depanrii. Pentru depanare, aa cum am mai artat, programul se poate executa i cu oprire dup fiecare instruc iune sau la un breakpoint. Pentru a marca acest lucru (program n execu ie i oprit) sistemul va face galben fondul instruc iunii pe care s-a oprit. Dup oprirea programului pe o instruc iune, se poate vedea valoarea pe care o are n acel moment o variabil, prin plasarea cursorului pe aceasta. Este posibil ca n ieirea virtual, Debug Windows, s se introduc toate expresiile provenite de la instruc iunea: Debug.Print expresie. Vizualizarea obiectului Debug Windows se poate face la un moment dat prin Ctrl + G sau prin pictograma specific (vezi figura).

I-8

Meniul de execu ie i depanare al VBA este prezentat mai jos:


Bara Visual Basic
Reseteaz toate variabilele globale ale aplica iei. Afieaz fereastra Debug. n aceasta se vor regsi toate afirile fcute cu instrDebug.Print Execut instruc iune cu instruc iune dar cursorul galben de execu ie se va opri numai pe: Toate Nu va mai intra n Nu se va mai opri n instr. rutinele apelate rutina n care este

Run

Stop

Comenzi de compilare Cursorul de marcare a instruc iunii care se va executa. Punctul de ntrerupere(Breakpoint)
Va determina oprirea rulrii programului acolo unde este ntlnit. Se recunoate prin culoarea maro a instruc iunii i a unui punct n fa a ei.

Lansarea unei ac iuni de pe bara Debug se face printr-un click pe op iunea dorit, sau n unele cazuri, prin utilizarea grupurilor de comenzi rapide ce se gsesc n dreptul lor. Urmrirea execu iei pas cu pas a unei rutine n Debug Windows | Locals se permite vizualizarea informa iilor de stare n momentul lansrii n execu ie a unei rutine. Informa iile vizeaz: numele variabilelor folosite n cadrul rutinei curente; valorile acestora n momentul execu iei rutinei; tipurile de date corespunztoare variabilelor folosite. n momentul executrii unei proceduri apelate, utilizatorul are posibilitatea vizualizrii informa iilor de stare din cadrul procedurii apelante. Pentru o bun n elegere prezentm un exemplu (suma a dou numere): Public Sub SumaNumere() Dim A As Byte Dim B As Byte Dim C As Integer A = 10 B = 16 C=A+B MsgBox "Suma este" & C End Sub n continuare vom urmri grafic modul n care procedura este executat. Pas 1. Lansarea n execu ie a rutinei.

I-9

Se vor efectua urmtoarele dou ac iuni: se plaseaz cursorul n cadrul procedurii n locul de unde va porni execu ia acesteia (pe primul rnd pentru execu ia de la nceput); se execut instruc iunea prin folosirea tastei Step Into ( sau F8). Apari ia culorii galbene pe instruc iunea Sub arat nceputul execu iei rutinei (cursorul a fost plasat ini ial pe aceast instruc iune). Dac se va deschide fereastra Debug Windows | Locals (Ctrl + G) se va vedea starea elementelor procedurii (nume variabile, valoarea acestora, tipul de date corespunztor). Valoarea variabilelor A, B i C este, n acest moment 0, deoarece, ele fiind de tip Byte i respectiv Integer, se ini ializeaz cu 0. Pas 2. Se acceseaz din nou Step Into (sau comanda rapid F8).

Cursorul (culoarea galben) s-a mutat pe instruc iunea A = 10. Execu ia rutinei a srit peste cele trei instruc iuni de declarare a variabilelor, deoarece acestea determin alocarea pentru variabile a spa iului de memorie necesar nainte de execu ia rutinei i anume n faza de compilare. Faptul c n panoul Locals, valoarea variabilei A este tot 0, arat c n momentul n care culoarea galben se gsete pe o instruc iune, aceasta nu este nc executat. Pas 3. Se acceseaz din nou Step Into (sau comanda rapid F8)

Culoarea galben s-a mutat pe instruc iunea B = 16 iar n panoul Locals se observ c valoarea variabilei A este n acest moment 10 iar valoarea variabilei B este tot 0 (instruc iunea nu este executat). Pas 4. Se acceseaz din nou Step Into (sau comanda rapid F8).

Culoarea galben s-a mutat pe instruc iunea C = A + B. Se observ c, dei A are valoare 10 iar B are valoare 16, n acest moment, suma lor este tot 0, ceea ce confirm nc o dat c n momentul n care culoarea galben se gsete pe o instruc iune, aceasta nu este executat, ci numai dup ce culoarea galben a trecut de instruc iunea respectiv ea se execut. Pentru vizualizarea valorii unei variabile n momentul execu iei rutinei se poate utiliza i o alt metod prezentat deja: se pozi ioneaz cursorul mouse-ului pe variabila creia dorim s-i aflm valoarea i
I-10

se ateapt un interval scurt de timp. Se va observa apari ia unei casete imediat sub variabil n care este specificat valoarea acesteia. Pas 5. Se acceseaz din nou Step Into (sau comanda rapid F8)

Dac se pozi ioneaz cursorul mouse-ului pe variabila C se observ cum valoarea acesteia n acest moment este 26 (suma valorilor celor dou variabile A i B: 10 + 16). Pas 6. Se acceseaz din nou Step Into (sau comanda rapid F8).

Dup executarea instruc iunii <<MsgBox "Suma="& C>> va aprea un mesaj (o caset) cu stringul "Suma=" la care este concatenat valoarea variabilei C (valoarea 26 calculat anterior). De asemenea dac pozi ionm cursorul mouse-ului pe variabila C din cadrul instruc iunii <<MsgBox "Suma=" & C>>, se afieaz valoarea 26. La o nou accesare a butonului Step Into se observ dispari ia culorii galbene, semn c execu ia rutinei s-a ncheiat. n continuare vom crea un punct de ntrerupere cu ajutorul mouse-ului prin click n partea stng pe bara vertical n dreptul instruc iunii dorite.

Bara vertical Punctul de ntrerupere Dac se opereaz la lansarea n execu ie a procedurii conform cu pasul nr. 1 se va observa apari ia culorii galbene pe prima instruc iune (semn c execu ia rutinei a nceput). Dup lansarea n execu ie a rutinei, dac se va folosi op iunea RUN (comanda rapid F5) se va observa c marcajul galben trece direct pe instruc iunea care are punctul de ntrerupere (srind peste instruc iunile A = 10, B = 16, C = A + B).

Analiznd acum valorile variabilelor, observm c s-au executat totui toate instruc iunile pn la punctul de ntrerupere. La o nou accesare a op iunii RUN se va afia mesajul specific (Suma = 26) dup care execu ia se va ncheia. Pentru demarcarea punctului de ntrerupere vom face click pe acesta.
I-11

n concluzie, din cele prezentate putem afirma c mediul de depanare reprezint un instrument foarte eficient n determinarea erorilor de execu ie i a optimizrii aplica iilor.

I.2. Tipuri de date


Prin dat se n elege orice entitate asupra creia poate opera calculatorul. n cod main datele se reprezint sub forma unei secven e de cifre binare. n cazul limbajelor de nivel nalt se face abstrac ie de detaliile de reprezentare a datelor, dezvoltnd conceptul de tip de date. n memoria calculatorului orice dat apare ca o succesiune de bi i. Modul n care pentru o astfel de succesiune se asociaz o valoare depinde de interpretarea ce i se d. La nivelul limbajelor de programare o astfel de interpretare este reprezentat de tipul datelor. Un tip de date este no iunea folosit pentru a defini mul imea valorilor pe care le pot avea datele ce apar in acestui tip, dimensiunea efectiv pe care o ocup n memorie datele, precum i opera iile ce se pot efectua asupra acestor date. VBA pune la dispozi ia programatorului tipuri de date predefinite (standard), cum ar fi cele pentru numerele ntregi, numerele reale, caractere sau booleene (logice), precum i posibilitatea de declarare a unor tipuri de date proprii (definite de programator) cu ajutorul instruc iunii Type. Tipurile de date pot fi: elementare (simple) o variabil de acest tip va con ine o singur valoare; structurate o variabil de acest tip va con ine mai multe valori elementare. I.2.1. Tipuri de date elementare I.2.1.1. Date numerice ntregi
Numele tipului de date Byte (octet) Integer (ntreg) Long (ntreg lung) Currency (valut) Memoria ocupat 1 octet 2 octe i 4 octe i 8 octe i Domeniul de valori 0 255 32.768+32.767 2.147.283.648 +2.147.483.647 +/ 922.337.203. 685.477,5808 Numrul de valori 2^8 2^16 2^32 15 cifre i 4 zecimale Valoarea Ex. de nume ini ial variabil 0 0 0 0 btValue iCounter lAmount cValuta

Literalii numere ntregi se scriu func ie de sistemul de numera ie folosit, astfel: pentru sistemul zecimal: numrul respectiv; Ex.: 1000; 100; 33; pentru sistemul hexazecimal: prefixul &H; Ex.: &HA1; &H9; pentru sistemul octal: prefixul &O; Ex.: &O8; &O17. Un literal reprezint o valoare, de tip numeric, string, dat etc., care se introduce direct n codul surs VBA (de exemplu ntr-o expresie) fiind evaluat exact aa cum este scris. I.2.1.2. Date numerice reale Numele Memoria Domeniu Domeniu Valoare Ex. de nume variabil tipului de date ocupat Mantisa(M) Exponent(E) ini ial Single 4 octe i aprox 7 cifre E-45E38 0 sngValue (precizie simpl) zecimale Double 8 octe i aprox 14 cifre E-324E308 0 dValue (precizie dubl) zecimale Datele numerice reale se exprim sub forma: +/M * 10^+/E I.2.1.3. Tipul de date BOOLEAN logic Numele tipului de date Boolean
(logic)

Spa iul de memorare 2 octe i

Domeniu de valori True (1) False (0)

Valoarea ini ial False (0)

Ex. de nume variabil bRaspuns

Tipul de date BOOLEAN este compatibil cu tipul de date INTEGER.

I-12

I.2.1.4. Tipul de date STRING ir de caractere Exist dou tipuri de date de tip String i anume: string de lungime variabil, care poate con ine pn la 2^31 caractere (aproximativ 2 miliarde); string de lungime fix, care poate con ine pn la 2^16 caractere (aproximativ 64 de mii). Codul folosit este codul ANSI i are date n intervalul 0-255. Primele 128 caractere (0-127) corespund literelor i simbolurilor de pe o tastatur US, adic codului ASCII. Dintre acestea primele 32 sunt caractere netipribile, dar care pot avea efect n afiarea datelor. De exemplu: caracterul cu codul 7, Bell semnal sonor; caracterul cu codul 8, Back Space caracter napoi; caracterul cu codul 9, Tab salt la urmtorul marcaj; caracterul cu codul 10, LF trecerea la rnd nou (urmtor); caracterul cu codul 13, CR face retur de car (nceput de rnd). Urmtoarele 128 caractere (128-255) corespund caracterelor speciale, diacriticelor, accente, simboluri valutare, litere n alfabete interna ionale etc. Literalii string se scriu ntre ghilimele ("."). La ini ializare variabilele de tip string vor avea valoarea ir vid, adic "". Operatorul pentru concatenarea datelor este & (se poate folosi i sem- nul +). La formarea numelor variabilelor de tip string, se folosete de obicei prefixul s. De exemplu sNume. Codul ASCII n tabela de mai jos codurile ASCII sunt date n: sistemul de numera ie zecimal n celule, naintea fiecrui caracter; sistemul de numera ie hexazecimal pe cele 2 margini, astfel: prima cifr hexazecimal pe primul rnd; a doua cifr hexazecimal pe prima coloan. H 0 1 2 3 4 5 6 7 8 9 A B C D E F 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Bell BS Tab LF CR 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

1
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

2
[space]

3
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

4
@ A B C D E F G H I J K L M N O 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

5
P Q R S T U V W X Y Z [ \ ] ^ _ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

6
` a b c d e f g h i j k l m n o 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

7
p q r s t u v w x y z { | } ~

! " # $ % & ' ( ) * + , . /

Dei ne-am atepta ca un caracter s ocupe un octet (8 bits) de memorie codul ANSI are 256 = 2^8 de simboluri (caractere) , totui spa iul ocupat de un caracter n memorie este de 2 octe i. Aceasta se datoreaz faptului c memorarea caracterelor se face n codul UNICODE, cod care ocup 2 octe i i care con ine un numr de 2^16 simboluri. De exemplu n memorie caracterele ASCII, vor avea pe primul octet codul ASCII al caracterului iar n al doilea 0, iar caracterele ANSI cu cod mai mare de 127, vor avea n al doilea octet 1. Deci, n limbajul Visual Basic, caracterele se folosesc n codul ANSII (ASCII), dei n memorie ele sunt n codul UNICODE.
I-13

I.2.1.5. Tipul de date DATE data calendaristic i timpul Numele tipului de date Date (data + timpul) Spa iul de memorare 8 octe i Domeniu de valori
Data: 1/1/100 la 12/31/9999 Timp: 0:00:00 la 23:59:59

Ex. de nume variabil dtStartDate

Literalii date se scriu ntre diezi (#. #). De exemplu: #January 1, 1993# sau #1 Jan 93#. Afiarea datelor i timpului se face conform formatului specificat n S.O. Windows prin comanda Regional Settings. De obicei se pune prefixul dt la numele unei variabilele de tip Date. Un numr poate fi convertit n tip Date, folosindu-se conven ia: data calendaristic se afl n partea stng a punctului zecimal; timpul n partea din dreapta punctului zecimal. Ora 24 este 0.0 iar ora 12 este 0.5; Numerele negative reprezint date anterioare celei de 30/Decembrie/1899. I.2.2. Tipuri de date structurate Visual Basic include mecanismele necesare construirii unor tipuri noi, prin restrngeri sau combinri ale tipurilor deja definite. Aceste mecanisme poart numele de constructori de tipuri i joac un rol esen ial n programare. I.2.2.1. Tipul de date ARRAY tablou Un Tablou Array definete o mul ime de valori care sunt de acelai tip de dat. Un Array, dei se materializeaz printr-o singur variabil, poate stoca mai multe date de acelai tip n compartimentele (elementele) sale. Structura unui asemenea tip poate avea o dimensiune sau mai multe. Un Array se caracterizeaz prin 3 elemente dintre care primele dou definesc structura: numrul de dimensiuni; numrul de elemente (celule) ale fiecrei dimensiuni. Practic se folosete numrul de ordine al primului (implicit 0) i al ultimului element al fiecrei dimensiuni; tipul de date al elementelor tabloului. Poate fi orice tip de date, eventual chiar tot array. Utilizarea tablourilor se face numai prin referirea fiecrui element n parte (folosind numele tabloului indexat la elementul respectiv). Deci n VBA nu se pot efectua opera ii direct cu ntreaga structur a tabloului; de exemplu o mutare de date dintr-un tablou n altul cu aceeai structur se poate face numai prin mutarea separat a tuturor elementelor tabloului. Tablourile de octe i constituie o excep ie la ultima afirma ie. Exemplu. Pentru a stoca cheltuielile pe care le facem n fiecare zi a unui an vom declara o singur variabil de tip Array, cu 365 elemente de tip numeric, dect 365 variabile individuale. Fiecare element din tablou va con ine o singur valoare. Implicit un tablou se indexeaz de la 0. Declararea variabilei se va face: Dim cCheltuieli (364) As Currency Cu procedura de mai jos introducem valoarea 22 n primele 100 de zile: Sub ExempluArray () Dim cCheltuieli (364) As Currency Dim intI As Integer For intI = 0 to 99 cCheltuieli (intI) = 22 Next End Sub I.2.2.2. TYPE Crearea tipurilor de date definite de utilizator Exist posibilitatea s se creeze structuri noi de date, definite de proiectant (utilizator), formate din combinri din alte tipuri de date. Declararea unui nou tip de date se face cu instruc iunea TYPE astfel: [Public | Private] Type NumeTip NumeElement1 As type
I-14

NumeElement2 As type ... End Type Referirea la variabilele de un tip definit de utilizator, se poate face: pentru ntreaga structur (folosind numele variabilei); pentru fiecare element n parte (folosind numele elementului respectiv calificat cu semnul punct cu numele variabilei). Declararea unui tip de date nu se poate face dect la nivelul unui modul de cod. Deci nu se pot declara tipuri de date la nivelul unei rutine. Exemplu. Option Compare Database Option Explicit Public Type Person 'se declar tipul de date la nivelul modulului Nume As String Prenume As String Virsta As Integer End Type Sub TypeTest () Dim Primul As Person, Doilea As Person'se declar 2 var. de tip Person Primul.Nume = "Ionescu" 'se folosesc elementele tipului Person Primul.Prenume = "Ion" Primul.Virsta = 21 Doilea = Primul 'se transfer ntregul tip de dat Person MsgBox Doilea.Nume & " " & Doilea.Prenume & ", _ varsta=" & Doilea.Virsta & " ani"' afieaz i valoriea unei expresie End Sub Caracterul (') se folosete pentru marcarea comentariilor. Caracterele ( _ ) se folosesc pentru continuarea unei instruc iuni pe urmtorul rnd. I.2.3. Tipul de date V ARI ANT Acest tip de date, specific limbajului Visual Basic, este deosebit de puternic fiind compatibil cu: toate tipurile numerice; tipul Date; tipul String; tipul Object. Dei uureaz munca de programare, totui folosirea variabilelor de tip variant diminueaz performan ele programului, att ca memorie ocupat ct i ca timp de execu ie. Numele Spa iul de tipului de date memorare Variant 16 octe i
(numere) (string)

Domeniu ca la numeric

Valoarea ini ial Empty (Gol)

Ex. de nume variabil vntValue vntNume

Variant

22 octe i

ca la stringuri Empty (Gol)

Valorile EMPTY, NULL, STRING VID EMPTY reprezint valoarea pe care o are o variabil variant care nu este ini ializat. Aceasta nseamn c variabila a fost declarat dar nu a fost nc introdus o valoare n ea. La prima introducere a unei date ntr-o variabil de tip variant, aceasta se va configura n conformitate cu tipul respectiv de date. NULL reprezint o valoare pe care o ia o variabil variant n care datele nu sunt valide. String de lungime 0 (vid, gol) string care nu con ine nici o valoare (nici un caracter), adic este "". Tipul de date OBJECT va fi prezentat n urmtorul capitol.

I-15

I.3. Variabile
Variabilele sunt nume de loca ii de memorie care con in valori de un anumit tip, ce se modific n timpul execu iei programului. Variabilele se caracterizeaz prin: Domeniul de vizibilitate (valabilitate): se refer la momentul cnd acestea apar i dispar din 'codul surs'. Variabilele apar atunci cnd sunt declarate prima dat, dup care apar i dispar n func ie de domeniul lor de vizibilitate. n momentul cnd variabilele apar (devin vizibile), li se pot atribui valori de un anumit tip i pot fi folosite n cadrul instruc iunilor. n rest, ele sunt invizibile i nu se pot referi. Durata de via (valabilitate): se refer la timpul ct variabila ocup loc n memorie. Cnd se creeaz variabile trebuie avut n vedere mai multe lucruri. Modul i locul n care se declar o variabil determin domeniul de vizibilitate, durata de via i alte caracteristici ale acesteia. Urmtoarele subiecte analizate v vor face s n elege i mai bine declararea variabilelor n limbajul Visual Basic. I.3.1. Declararea variabilelor Declararea variabilelor se face de obicei cu instruc iunea declarativ DIM. Forma acestei instruc iuni este: Dim NumeVariabil As TipulDeDateAlVariabilei Numele variabilei respect regulile folosite la formarea numelor. n practica programrii, se obinuiete s se pun un prefix conven ional la nume, care s indice tipul de date al variabilei. (Vezi exemplele de nume de variabile din modulul Tipuri de date). O variabil poate fi declarat specificndu-se urmtoarele tipuri de date: Byte, Integer, Long, Currency, Single, Double, Date, String (pentru variabile de lungime variabil), String * length (pentru variabile de lungime fix), Object, sau Variant, sau a unui tip de date definit cu declara ia Type. Nespecificarea unui tip de date duce la crearea unor variabile de tip Variant. Se pot declara mai multe variabile pe acelai rnd, separate prin virgul, dar este obligatorie folosirea explicit a tipului de dat pentru fiecare variabil. Exemplu. Dim intX As Integer, intY As Integer, intZ As Integer O greeal obinuit este declararea mai multor variabile pe aceeai linie, fr a se specifica tipul pentru fiecare variabil declarat ca n exemplul de mai jos. Dim iCounter, iAge, iWeight As Integer n acest caz, numai ultima variabil este declarat ca o variabil de tip Integer (ntreg). Celelalte variabile sunt declarate de tipul Variant (tipul implicit al unei variabile este variant). Aceast eroare este foarte periculoas, deoarece unele limbaje de programare (PASCAL), folosesc o asemenea notare pentru a declara toate variabilele de pe aceeai linie de acelai tip. I.3.2. Caractere folosite ca Type-declaration Anumite variabile mai pot fi create automat de un anumit tip, folosindu-se n loc de specifica ia As, anumite caractere speciale, denumite caractere de tip, la sfritul numelui variabilei, n declara ia Dim. Astfel:
Tipul de date Caracterele de tip Integer % Long & Currency @ Single ! Double # String $ Variant implicit

Acest tip de declara ii este importat din variantele mai vechi de Basic, dar nu este recomandabil. Exemplu. Urmtoarele declara ii sunt echivalente. Dim Nume As String Dim Virsta As Integer Dim Anul As Variant ~ Dim Nume$ ~ Dim Virsta% ~ Dim Anul

I.3.3. Option Explicit (declararea explicit a variabilelor) Este o instruc iune declarativ care poate fi inclus n sec iunea General Declarations a unui modul de cod (prima parte a acestuia). Cnd Option Explicit este plasat ntr-un modul de cod, toate variabilele din interiorul acestuia trebuie s fie declarate nainte de folosire, n caz contrar producndu-se o eroare de compilare.

I-16

Introducerea instruc iunii declarative Option Explicit n fiecare modul, formular sau raport se poate face automat prin activarea op iunii Require Variable Declarations (cere declara ii de variabile) din meniul Tools | Options | Module. Este foarte important ca aceast instruc iune (Option Explicit) s fie plasat n toate modulele de cod. Asigura i-v c a i configurat op iunea la valoarea True! Dac proprietatea specificat mai sus nu este setat (False), atunci practic variabilele pot s nu fie de loc declarate. Declararea acestora se face implicit, n func ie de datele cu care se ncarc la prima folosire variabila (ca n limbajul FORTRAN). De exemplu, instruc iunea: x=10 ar genera i declararea unei variabile de tip ntreg. Folosirea acestei metode este foarte periculoas, deoarece poate cauza multe probleme. n concluzie, cea mai eficient i mai sigur metod de declarare a variabilelor este de a folosi n totalitate instruc iunea declarativ Dim, pentru fiecare variabil, ca n exemplul urmtor: Dim iCounter As Integer Dim sName As string Aa cum se vede, acest tip de declara ie con ine att numele variabilei, ct i tipul datelor pe care le poate con ine. Acest lucru permite compilatorului s intercepteze erori de genul memorrii unui ir ntr-o variabil de tip ntreg. De asemenea, prin selectarea celui mai scurt tip de date pentru fiecare variabil, se reduc substan ial resursele necesare executrii programului. I.3.4. Variabile Locale i Globale n func ie de locul de declarare, variabilele pot fi: locale variabile declarate n interiorul rutinei, care sunt vizibile (domeniul de valabilitate) numai n aceasta; globale (modale) variabile declarate n sec ia de declara ii generale de la nceputul unui modul de cod. n acest caz variabila va fi vizibil n toate rutinele modulului respectiv de cod. Exemplu. Fie declararea variabilei: Dim sName As String Dac aceast declara ie se face: ntr-o rutin ea va putea fi folosit numai n aceasta, fiind o variabil local; n sec iunea de declara ii generale ale modulului de cod ea este global i va putea fi utilizat n toate rutinele modulului respectiv, dar nu i n alte module de cod (aceast caracteristic o au numai variabilele declarate Public n modulul general de cod). Deci variabilele globale sunt vizibile din orice rutin apar innd modulului n care au fost declarate. Valoarea variabilei poate fi schimbat de orice subrutin sau func ie din modulul respectiv. n urmtorul exemplu variabila global miCounter: ia valoarea 20 n procedura Fac20; ia valoarea 10 n procedura Fac10; este afiat valoarea care se gsete n ea n procedura Afisez. Option Explicit ' [General Declarations] Dim miCounter As Integer Private Sub Fac20 () miCounter = 20 End Sub Private Sub Fac10 () miCounter = 10 End Sub Private Sub Afisez () MsgBox miCounter End Sub Re ine i cteva observa ii: conven ia de numire a variabilei modale prin folosirea literei m ca prefix al numelui acesteia. Aceasta o face s fie uor recunoscut de programator ca o variabil de nivel modul (global); folosi i declara iile de nivel modul numai pentru variabilele care trebuie s fie vzute din mai multe rutine;
I-17

ncerca i s evita i (atunci cnd este posibil) utilizarea variabilelor globale. Aceast metod face codul mai modular i mai uor de depanat. I.3.5. Variabile Publice i Private O variabil public poate fi accesat (este vizibil, are domeniul de valabilitate) de oriunde din aplica ie. Variabilele publice se folosesc de obicei ca identificatori de acces, valori de configurare pentru mediul de lucru i alte date care trebuie s fie vizibile pentru ntreaga aplica ie. Declara iile variabilelor publice trebuie s fie plasate n sec iunea General Declarations a modulului general de cod. Pentru declararea variabilelor publice se folosete cuvntul cheie PUBLIC, n loc de DIM. Exemplu. O declara ie de variabil public arat aa: Option Explicit Public piCounter As Integer De obicei, conven ional se indic tipul public al unei variabile, folosind prefixul p la numele acesteia. Rutina urmtoare, ataat evenimentului Click al butonului de comand cmdPublic, dup ce face 50 variabila public piCounter, o afieaz. Private Sub cmdPublic_Click () piCounter = 50 Msgbox piCounter End Sub Se poate folosi cuvntul cheie PRIVATE, n loc de DIM, pentru a declara variabile private n sec iunea de declara ii generale a modulului de cod, adic variabile care nu sunt vizibile dect de rutinele apar innd modulului respectiv de cod. Exemplu. Private MyName As String Cuvntul cheie DIM este echivalent cu PRIVATE atunci cnd se folosesc la declararea variabilelor n modulele de cod. Este totui indicat folosirea expresiei private, pentru a face codul mai lizibil (mai uor de citit i mai rapid de interpretat). I.3.6. Variabile Statice Variabile statice se pot declara numai n rutine, prin folosirea cuvntului cheie STATIC, n loc de cuvntul cheie DIM. Variabilele statice au proprietatea de a-i pstra valoarea ntre dou apeluri ale rutinei n care au fost declarate. Exemplul urmtor ilustreaz diferen a dintre variabilele locale i cele statice. Deoarece variabilele locale sunt ini ializate la fiecare apel al codului, de fiecare dat cnd executa i aceast procedur, se va afia numrul 1. Private Sub cmdLocal_Click () Dim iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dat cnd acest cod este executat, instruc iunea declarativ Dim definete variabila iCounter i o ini ializeaz cu 0. Ea este pu in diferit fa de urmtoarea secven de cod, care ilustreaz folosirea variabilelor statice: Private Sub cmdLocal_Click () Static iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dat cnd acest cod este executat, variabila cu numele iCounter este incrementat i re inut. Deci la prima execu ie se va afa 1, la a doua se va afia 2, la a treia se va afia 3 etc. Practic o variabil static este definit numai la primul apel al rutinei n care a fost declarat. Deoarece, fiind static, nu mai este distrus la terminarea rutinei, la urmtoarea apelare nu va mai fi definit i va avea deci valoarea anterioar apelului.

I-18

I.3.7. Variabile domeniul i durata de valabilitate Aa cum am artat, domeniul de valabilitate sau vizibilitate a variabilelor este determinat de cuvntul utilizat n declararea variabilei: Dim, Private, Public i de locul unde acesta e plasat, determinnd ca variabila respectiv s fie local, modal (global) sau public i s poat fi folosit numai ntr-o rutin, la nivelul unui modul de cod sau n toate modulele de cod. Ar trebui s face i tot posibilul ca majoritatea variabilelor din codul dumneavoastr s fie locale, deoarece acestea sunt ferite de o eventual modificare (accidental) de ctre alte rutine. Durata de via sau valabilitate a variabilelor reprezint, aa cum am mai artat, timpul ct variabila are alocat spa iu n memorie. Fr alte instruc iuni speciale, o variabil se creeaz n momentul n care modulul n care este declarat, este apelat i dispare (se distruge, elibereaz spa iul de memorie ocupat) n momentul terminrii modulului respectiv. Astfel: o variabil local, declarat ntr-o procedur eveniment, va fi alocat numai n timpul execu iei procedurii respective (binen eles dac nu este static); o variabil global, declarat ntr-un modul de cod al unui formular, va fi alocat ct timp formularul respectiv va fi n execu ie; o variabil public, declarat ntr-un modul general de cod va fi alocat n tot timpul execu iei aplica iei. I.3.8. Declararea i folosirea variabilelor ARRAY Variabilele Array (tablou) se declar la fel ca orice alt variabil folosindu-se instruc iunile declarative Dim, Static, Private, sau Public. Diferen a fa de declararea unei variabile simple este aceea c la tablouri, ntre paranteze, trebuie s se specifice pentru fiecare dimensiune n ordine i separate prin virgul dac sunt mai multe dimensiuni valoarea minim (de obicei se omite fiind implicit) i maxim a indicelui dimensiunii respective. Declararea tablourilor cu dimensiuni fixe - statice Dim NumeTablou (N1 [, N2 [, N3. ]) As TipDeDat Aa cum se observ, marginea de jos a indicelui a fost omis. Ea implicit se consider a avea valoarea 0. Totui marginea de jos a indicelui se poate fixa la valoarea 1, dac este introdus n modulul respectiv de cod, n sec iunea de declara ii generale, instruc iunea declarativ Option Base 1. Exemplu. Declara ia Dim MyArray (9, 10) As Integer va crea un tabel cu 2 dimensiuni, cu 10 i respectiv 11 elemente, cu primul indice cu valori ntre (0 - 9) i al doilea indice cu valori ntre (0 10), n care toate cele 110 elemente (celule) sunt de tip Integer. Ca orice declara ie care nu specific tipul, i tablourile declarate fr tip sunt de tip Variant. n acest caz, fiind Variant, fiecare element va ocupa 16 bytes dac este numeric sau 22 bytes dac este string. Deci la tablouri mari se poate ajunge la un consum mare de memorie, ceea ce trebuie s determine o rezerv n folosirea tablourilor de Variant. Exemplu. n continuare se prezint ce memorie vor ocupa tablourile. Dim MyVariantArray (10) As Variant ' Tablou Variant cel pu in _ 176 bytes (11 el. * 16 bytes). Dim MyIntegerArray (10) As Integer ' Tablou Integer folosete _ 22 bytes (11 elemenste * 2 bytes). Dim MyDoubleArray (10) As Double ' Tablou Double-precision _ 88 bytes (11 el. * 8 bytes). Dim MyVariantArray (10) ' Tablou Variant cel pu in _ 176 bytes (11 el. * 16 bytes). Dim MyIntegerArray (99, 99) As Integer ' Tablou Integer folosete _ 100 * 100 * 2 bytes (20.000 bytes). Dim MyDoubleArray (99, 99) As Double ' Tablou Double-precision.. _ 100 * 100 * 8 bytes (80.000 bytes). Dim MyVariantArray (99, 99) ' Tablou Variant cel pu in _ 160.000 bytes (100 * 100 * 16 bytes). Se pot declara tablouri specificndu-se explicit i marginea de jos a indicelui. Dim NumeTablou (J1 To N1 [, J2 To N2 . ]) As TipDeDat Cu J s-a notat marginea de jos a indicelui, iar cu N marginea de sus a indicelui.
I-19

Declararea tablourilor cu dimensiuni variabile dinamice n timp ce tablourile cu dimensiuni fixe vor ocupa din etapa de compilare o anumit dimensiune de memorie care nu mai poate fi modificat n timpul execu iei, tablourile dinamice pot s-i modifice dimensiunile n timpul execu iei. Un tablou dinamic se declar la fel, cu Static, Dim, Private sau Public, fr ns a se specifica nimic ntre paranteze. Dim NumeTablou () As TipDeDat Exemplu. Dim sngArray () As Single Cu instruc iunea executabil ReDim (cu o structur asemntoare cu cea a lui Dim), care se poate plasa oriunde n cod dup declararea unui tablou dinamic, se va redimensiona n momentul execu iei acesteia tabloul cu noile dimensiuni, eventual putndu-se schimba i tipul de date. Exemplu. ReDim sngArray(11) redimensioneaz tabloul, dar nu modific tipul de date al elementelor i provoac pierderea datelor din tablou. Instruc iunea ReDim provoac pierderea datelor din tabloul pe care l redimensionm. Pentru a se evita acest lucru se poate folosi clauza Preserve. Folosirea acestei clauze nu permite ns modificarea numrului de dimensiuni sau a marginii de jos ai indecilor. Exemplu. ReDim Preserve sngArray(UBound(sngArray)+10) va redimensiona tabloul, mrind cu 10 numrul lui de elemente i va pstra datele ce erau n tablou nainte de executarea instruc iunii; func ia Ubound ntoarce indicele superior maxim al unui tablou; Utilizarea tablourilor Un tablou poate fi utilizat ca orice variabil simpl de tipul respectiv. Referirea unui element al tabloului se face prin numele tabloului, urmat ntre paranteze de indicele (indicii) elementului respectiv. Exemplu. Sub FillArrayMulti () Dim intI As Integer, intJ As Integer Dim sngMulti (1 To 5, 1 To 10) As Single For intI = 1 To 5 For intJ = 1 To 10 sngMulti (intI, intJ) = intI * intJ ' indroduce n fiecare element _ produsul indicilor elementului. ' afieaz indicii elementului i valoarea din acesta. MegBox " Tablou ( " & intI & ", " & intJ & " ) = " & sngMulti (intI, intJ) Next intJ Next intI End Sub Tablouri de octe i Un tablou de octe i este un tablou dinamic de tipul BYTE. El poate fi utilizat ca orice tablou dinamic, dar mai are o proprietate care l face util n lucrul cu stringuri, i anume: un tablou de octe i se poate referi i direct, numai prin numele lui, fr indici. n felul acesta el devine compatibil cu tipul de date string, permi nd transferurile directe de date ntre tablourile de octe i i stringuri. Trebuie remarcat c n aceast opera ie fiecare caracter al strigului va ocupa 2 elemente din tabloul de octe i, deoarece, aa cum am mai artat, caracterele sunt memorate n UNICODE (deci pe 2 octe i). Exemplu. Pentru n elegerea acestei secven e trebuie studiate mai nti, n capitolul despre func iile text, precizrile fcute pentru codul UNICODE. Public Sub TestMatOcteti () Dim Caracter As String, Sir As String * 3 Dim X() As Byte ' Tablou de octe i, va avea 6 elemente deoarece pentru un caracter din _ string sunt necesare 2 elemente de 1 octet ReDim X(5)
I-20

Dim k As Integer, j As Integer, i As Integer Sir = "1A" X = Sir For i = 0 To 2 j = i + 1 ' n "J" se va calcula numrul caracterului n string.. 1, 2, 3 _ necesar pt. func ia MID Caracter = Mid (Sir, j, 1) ' n "Caracter" se vor introduce caracterele k = 2 * (i)'n Kpozi ia n tablou a primului octet al caracterului:0,2,4 Debug.Print "Caracterul = " & Caracter & "; CodUnicode= " & AscW(Caracter) & "; CodAnsii= " & Asc(Caracter) & "; Octetul 1= " & X(k) & "; Octetul 2= " & X(k+1) ' Ceea ce se afieaz cu Debug.Print se poate vizualiza prin comanda _ View | Debug Window MsgBox "Caracterul = " & Caracter & "; CodUnicode= " & AscW(Caracter) & "; CodAnsii= " & Asc(Caracter) & "; Octetul 1= " & X(k) & "; Octetul 2= " & X(k+1) Next i For i = 0 To 5 Debug.Print "Octetul " & i & " = " & X(i) MsgBox "Octetul " & i & " = " & X(i) Next i End Sub Dup execu ie se va gsi afiat n Debug. Print: Caracterul = 1; CodUnicode= 49; CodAnsii= 49; Octetul 1= 49; Octetul 2= 0 Caracterul = A; CodUnicode= 65; CodAnsii= 65; Octetul 1= 65; Octetul 2= 0 Caracterul = ; CodUnicode= 350; CodAnsii= 170; Octetul 1= 94; Octetul 2= 1 Octetul 0 = 49 Octetul 1 = 0 Octetul 2 = 65 Octetul 3 = 0 Octetul 4 = 94 Octetul 5 = 1 n memoria intern, dac o variabil nestructurat ocup mai mul i octe i (de exemplu o variabil integer ocup 2 octe i), atunci cel mai semnificativ dintre acetia se gsete la dreapta. Deci dac ntr-o variabil integer se gsete valoarea: 266 (zecimal) = 0000.0001.0000.1010 (binar) = 01.0A (hexazecimal) Atunci aceasta se va gsi n memorie sub forma: (0000.1010) (0000.0001) deci cu octetul cel mai semnificativ (0000.0001) aezat la dreapta. Din tabelul de mai jos, se observ cum se gsete n memoria intern, ntr-o variabil de tip tablou de octe i, datele dintr-un string.
Caracterele din string 1 A

Cod ANSI 49 65 170 1octet/caracter - zecimal Cod UNICODE 49 65 350 2 octe i/caracter-zecimal Memorie -Tabloul X 0011.0001 0000.0000 0100.0001 0000.0000 0101.1110 0000.0001 6 octe i - binar Memorie -Tabloul X 31 00 41 00 5E 01 6 octe i - hexa Memorie -Tabloul X 49 0 65 0 94 1 6 octe i - zecimal

I.4. Constante
Prin declararea unei constante, se poate atribui unui nume, o valoare. Aceasta se face prin instruc iunea declarativ Const. Dup declarare, o constant nu i mai poate modifica valoarea. Forma instruc iunii declarative CONST este: [Public | Private] Const NumeConstant [As TipData] = Valoare O constant se comport practic ca o variabil, ini ializat cu o anumit valoare, care nu se mai poate schimba n timpul execu iei aplica iei.
I-21

Regulile aplicate variabilelor privind domeniul i durata de valabilitate sunt efective i n cazul constantelor. Deci vom avea: constante locale sau globale, n func ie de locul de declarare (n rutin sau sec iunea de declara ii generale a modulului de cod); constante publice sau private, dac folosim sau nu n fa a cuvntului cheie Const cuvintele cheie Private, Public. Exemplu. Public Const conAge As Integer = 34 ' conAge este o constant _ Public, Integer, cu valoarea 34. Constantele se pot declara n dou moduri i anume: cu tip explicit, i anume: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, sau Variant, ca n exemplul de mai sus; cu tip implicit, n care clauza As lipsete iar tipul va fi determinat de tipul datei cu care se ncarc constanta. De exemplu dac avem declara iile: Const Ziua = "Miercuri" Const Virsta = 44 atunci prima constant va fi de tip string, iar a doua integer. Ca i la variabile, se pot declara mai multe constante pe acelai rnd, cu specificarea (dac este explicit) a tipului pentru fiecare constant n parte. Const conAge As Integer = 34, conWage As Currency = 35000, _ conNume="Soare" n exemplul de mai sus primele dou constante sunt declarate explicit, Integer respectiv Currency, iar a treia, implicit, string.

I.5. Limbajul VBA Instruc iuni executabile


Limbajele de programare au un set de instruc iuni care constituie lista complet a posibilit ilor de care dispune programatorul pentru a determina rezolvarea unei probleme (aplica ie) pe un sistem de calcul. Instruc iunile unui limbaj de programare sunt de dou feluri: Instruc iuni declarative, care practic nu determin executarea unei ac iuni de ctre sistemul de calcul, ci numai nite indica ii care se dau compilatorului. De exemplu instruc iunile de declarare ale tipurilor de date, variabilelor sau constantelor (Dim, Const, Type etc.), op iunile de compilare (Option Explicit, Option Base, Option Compare Database, etc.) Instruc iuni executabile, care reprezint descrierea unei ac iuni pe care o va efectua sistemul de calcul, n special privind datele aplica iei (If, For, Do etc.). Execu ia unei instruc iuni reprezint efectuarea opera iei specificate de codul instruc iunii, interpretate la un moment dat de unitatea central a unui sistem de calcul sau de un procesor. De obicei, execu ia instruc iunii presupune ob inerea operanzilor din memoria intern sau din registrele unit ii centrale, formarea rezultatului i depunerea acestuia ntr-un registru al unit ii centrale sau n memoria intern. Ca exemplu de opera ii pe care le face unitatea central a sistemului de calcul sunt opera iile de adunare, scdere, citire, scriere, compara ie, etc. Limbajele moderne de programare au un set redus de instruc iuni complexe: declararea structurilor de date; instruc iunea de atribuire prin care se calculeaz expresii; structurile de control prin care se determin "traseul" printre instruc iuni, adic ordinea n care se execut instruc iunile; declararea i apelarea rutinelor; crearea modulelor de clase de obiecte; crearea i manipularea obiectelor. Practic, instruc iunile executabile ale limbajelor moderne de programare sunt instruc iunea de atribuire i instruc iunile prin care se realizeaz structurile de control. Alte opera ii necesare unei aplica ii (ca de exemplu executarea opera iilor de Input/ Output), sunt realizate prin rutine din bibliotecile de obiecte, func ii i proceduri disponibile limbajului respectiv de programare. I.5.1. Instruciunea de atribuire Forma acestei instruc iuni este: NumeVariabil = Expresie
I-22

Ac iunea acestei instruc iuni const n calcularea expresiei (din dreapta semnului =) i depunerea rezultatului n variabil (din stnga semnului =). Pentru a se executa cu succes instruc iunea, este necesar ca rezultatul expresiei s apar in unui tip de date compatibil cu cel al variabilei. n caz contrar se va produce o eroare de execu ie (pe care le vom trata n alt capitol). Totui compilatorul ncearc trecerea peste anumite incompatibilit i, a cror rezolvare este evident, efectund automat conversiile ntre tipuri diferite de date, dac este posibil. Exemplu. Private Sub TestExpresie () Dim Vstr As String Dim Vnr As Integer Vstr = "251" Vnr = 251 + 40 ' prelucrri normale Vstr = 251 + 40 ' nu produce eroare de execu ie; ' efectueaz adunarea dup care transform constanta numeric 291 _ n stringul "291" Vnr = Vstr ' nu produce o eroare de execu ie; ' transform stringul "291" n constanta numeric 291 Vstr = Vnr + "ABC" ' va produce eroare de execu ie _ TYPE-MISMATCH; nu se poate efectua adunarea. Vstr = Vnr & "ABC" ' nu produce eroare. Vnr = "ABC" ' va produce eroare de execu ie TYPE MISMATCH End Sub Formarea expresiilor n Visual Basic O expresie este format din termeni asupra crora se efectueaz anumite opera ii. O expresie a crei evaluare este o valoare logic (True sau False) se mai numete condi ie. Termenii pot fi: variabile, constante, literali (valori date direct) sau func ii (proprii sau din biblioteci). Operatorii sunt de trei tipuri i anume: aritmetici, care ac ionnd asupra unor termeni scalari (numere, stringuri, date calendaristice, etc.) vor determina tot un rezultat de aceeai natur (scalar): ^ * / \ Mod
Restul mpr irii

&

Ridicare la mpr ire mpr ire nmul ire putere real ntreag 5^2=25 5*2=10 5/2=2,5 10\3=3

ConcateAdunare Scdere nare iruri "Ab" & 10 Mod 3=1 5+2=7 5-2=3 2="Ab2"

rela ionali, care ac ionnd asupra unor termeni scalari (numere, stringuri, date calendaristice, etc. ) vor determina un rezultat logic (boolean): < <= > >= = <>
mai mic (1<1) =False mai mic sau egal (5<=5) =True mai mare mai mare sau egal egal ne egal (5<>5) = False (5>4) =True (5>=5) =True (5=5) =True

Is
apartenen a la o mul ime

Like
La fel ca = pt. stringuri/evalueaz caracterele generice din al doilea string

(5 Is [1, 2, 3]) = False

("ARAD" Like "AR*") = True

Caracterele generice genereaz o mul ime de caractere astfel: Un singur caracter. ("a2B3a" Like "a?a") = False ? ("a2B3a" Like "a*a") = True Zero sau mai multe caractere. * Un singur numr (0-9). ("a2a" Like "a#a") = True # [List char] Un singur caracter din list. ("F" Like "[A-Z]") = True ex. [A-R]
[!List caractere] Un singur char care nu este n list. ( ("F" Like "[!A-Z]") = False

logici, avnd valori logice (True, False) ca operanzi, vor determina un rezultat tot logic:
I-23

Op
True False

NOT
False True

Op 1 Op 2 AND
True True False False True False True False True False False False

Op 1 Op 2
True True False False True False True False

OR
True True True False

Op 1 Op 2 XOR
True True False False True False True False False True True False

Mai exist dou func ii logice, mai pu in folosite, i anume: EQV utilizat pentru verificarea echivalen ei logice a dou expresii; IMP utilizat pentru verificarea implicrii logice ntre dou expresii. Operatorii sunt aeza i de la stnga la dreapta n ordinea priorit ii lor n execu ie, care este n general cea obinuit din matematic. Parantezele rotunde sunt folosite pentru stabilirea unei ordini explicite a priorit ii n execu ie a opera iilor. Aa cum am mai artat, dac un termen al unei expresii este NULL, atunci i rezultatul expresiei este tot NULL. Spunem c NULL-ul se propag n expresii. Totui exist o excep ie, i anume la operatorul de concatenare a irurilor, &: dac un termen este NULL, iar cellalt nu este NULL, atunci rezultatul va fi chiar termenul diferit de NULL. Valoarea EMPTY n expresii este considerat, n func ie de tipul de date pe care l reprezint, chiar valoarea cu care se ini ializeaz variabilele de tipul respectiv (astfel, n expresii, dac un termen numeric este EMPTY, atunci se va considera = 0; dac este logic = False; dac este string = ir vid; etc.). I.5.2. Structurile de control Aa cum am mai artat, structurile de control stabilesc ordinea n care se execut instruc iunile. Exist trei structuri de control, i anume: structura secven ial, structura alternativ (decizional) i structura repetitiv (n bucl, n ciclu). I.5.2.1. Structura secven ial Reprezint execu ia secven ial a instruc iunilor, n ordinea n care au fost scrise. Nu necesit folosirea unei instruc iuni. I.5.2.2. Structura alternativ Reprezint execu ia din mai multe grupuri de instruc iuni introduse numai a unui singur grup, n func ie de evaluarea unor condi ii. I.5.2.2.a) Structura alternativ simpl Instruc iunea: If... Then... Else If condi ie Then Grup 1 de instruc iuni [Else Grup 2 de instruc iuni] End IF Structura If... Then... Else evalueaz dac condi ia este adevrat sau fals. Dac: condi ia este adevrat, vor fi executate toate instruc iunile dintre If i Else (Grup 1 de instruc iuni); condi ia este fals, vor fi executate toate instruc iunile dintre Else i End If (Grup 2 de instruc iuni). Folosirea clauzei Else este op ional. O condi ie cu rezultatul NULL este tratat ca i cum ar fi FALSE. Exemplu. Private Sub cmdIf_Click () ' evenimentul click al unui buton de comand If IsNull(Me!txtValue) Then ' Condi ia testeaz dac n controlul txtValue, este introdus o valoare. Acest lucru se face cu func ia IsNULL, studiat n alt modul MsgBox "Trebuie sa introduceti o valoare" Else MsgBox "Ati introdus:" & Me!txtValue
I-24

End If End Sub Un control n care nu este introdus nimic va avea valoarea NULL. I.5.2.2.b) Structura alternativ multipl n locul folosirii a mai multor instruc iuni If... Then... Else, atunci cnd decizia se ia prin evaluarea mai multor condi ii (Structura alternativ multipl), este mult mai simpl, fr ndoial, utilizarea instruc iunii Select Case sau a instruc iunii If... Then... ElseIFElse Instruc iunea Select Case Select Case NumeVariabil Case Valoare1 Grup 1 de instruc iuni [Case Valoare2 Grup 2 de instruc iuni] [Case ValoareX Grup X de instruc iuni] [Case Else Grup else de instruc iuni] End Select Aceast instruc iune evalueaz mai multe condi ii formate prin verificarea egalit ilor ntre valoarea variabilei ataate instruc iunii (NumeVariabil), i valorile din dreptul cuvintelor cheie CASE (ValoareI). Deci: Condi ia I va fi: NumeVariabil=ValoareI Condi iile sunt evaluate pe rnd, n ordinea plasrii lor n instruc iune, pn cnd se gsete una adevrat. Dup gsirea unei condi ii advrate atunci se va executa grupul corespunztor de instruc iuni, dup care instruc iunea Select Case se termin, programul continund cu prima instruc iune plasat dup aceasta. Dac toate condi iile sunt false atunci se vor executa dac exist instruc iunile dintre Else . End Select (Grup else de instruc iuni). Dac mai multe condi ii sunt adevrate, atunci se va executa numai un singur grup de instruc iuni i anume cel aflat dup prima condi ie gsit adevrat. n ValoareI se pot introduce: reuniuni de mul imi operatorul virgul (ex: 1, 2, 5); intervale operatorul TO (ex: 1 To 7); submul imi operatorul IS (ex: Is > 7). Folosirea clauzei Case Else este op ional. O condi ie cu rezultatul NULL este tratat ca i cum ar fi FALSE. Exemplu. Sub TestCase() Dim NumeV As Integer NumeV = 5 Select Case NumeV Case 7 'condi ia: NumeV=7 - False MsgBox "Grup 1 de instruc iuni" Case 5, 9 'condi ia: (NumeV=5) OR (NumeV=9) - True MsgBox "Grup 2 de instruc iuni" 'execu ia instruc iunii(lor) la care condi ia=True 'dup execu ie, instruc iunea Case se termin Case 1 To 9 'condi ia: (NumeV>=1) AND (NumeV<=9) - True 'dei i aceast condi ie=true, acest grup nu va fi executat MsgBox "Grup 3 de instruc iuni"
I-25

Case Else MsgBox "Grup else de instruc iuni" End Select End Sub Exemplu. Procedura urmtoare este ataat evenimentului Click a unui buton de comand cu numele cmdCase, care se afl ntr-un formular, n care se mai afl i un control textbox cu numele txtValue. Aceast secven se va executa numai atunci cnd se va face click pe butonul de comand cu numele cmdCase. Private Sub cmdCase_Click () Dim IResponse As Integer ' Me!NumeControl este o expresie prin care se acceseaz datele aflate _ ntr-un control plasat n formularul respectiv. ' Un control se comport ca o variabil de tip variant. ' Dac controlul este NULL atunci nu este introdus nici o valoare. If IsNull(Me!txtValue) Then iResponse = 0 Else IResponse = Val(Me!txtValue) 'VAL transform n numr un string. End If Select Case iResponse Case 0 MsgBox "Trebuie sa introduceti un numar" Case 1 To 5 MsgBox "Ati introdus o valoare intre 1 si 5" Case 7, 11, 21 MsgBox "Ati introdus 7, 11 sau 21" Case Else MsgBox "Ati introdus un numar incorect" End Select End Sub Aceast procedur utilizeaz n prima parte o instruc iune If pentru a evalua dac txtValue este Null, caz n care se memoreaz un zero ntr-o variabil numit iResponse. n caz contrar, valoarea con inut n controlul txtValue este memorat n iResponse. Instruc iunea Case evalueaz con inutul variabilei iResponse. Dac valoarea este 0, este afiat o caset de text cu mesajul "Trebuie s introduce i un numr". Dac valoarea este ntre 1 i 5 inclusiv, este afiat o caset de text con innd mesajul "A i introdus o valoare ntre 1 i 5". Dac utilizatorul introduce 7, 11 sau 21, este afiat un mesaj corespunztor. n celelalte cazuri, utilizatorul primete un mesaj care indic introducerea unui numr incorect. Instruc iunea If... Then... ElseIFElse If condi ie-1 Then [grup 1 de instruc iuni] ElseIf condi ie-n Then [grup n de instruc iuni] . .. Else [grup else de instruc iuni] End If Instruc iunea func ioneaz similar instruc iunii Select Case, numai c: condi iile introduse sunt independente, ne mai fiind obligatorie prezen a unei variabile ca un termen al condi iei. Deci instruc iunea va evalua pe rnd, n ordine, condi ia 1, 2 etc. Prima condi ie gsit adevrat va determina execu ia grupului respectiv de instruc iuni i terminarea instruc iunii. Dac toate condi iile sunt false, vor fi executate toate instruc iunile dintre Else i End If (Grup else de instruc iuni). Folosirea clauzei Else este op ional.
I-26

O condi ie cu rezultatul NULL este tratat ca i cum ar fi FALSE. Exemplu. Sub TestElseIf() Dim V1 As String Dim V2 As String V1 = InputBox("V1=") V2 = InputBox("V2=") If V1 = "" Then 'nu se introduce valoare n V1- ir gol MsgBox "In V1 nu este nici o valoare" ElseIf V2 = "" Then MsgBox "In V1 este ceva, dar nu si in V2" Else MsgBox "Valorile introduse:V1=" & V1 & "; V2=" & V2 End If End Sub I.5.2.3. Structura repetitiv Reprezint execu ia repetat a unui anumit grup de instruc iuni, numit ciclu sau bucl, pn cnd o condi ie ia o anumit valoare. I.5.2.3.a) Structura repetitiv cu test. Instruc iunea DoLoop Execut n mod repetat un ciclu i anume: ct timp (While) o condi ie este TRUE sau pn cnd (Until) o condi ie devine TRUE Exist dou forme ale instruc iunii Do, n func ie de locul unde se gsete plasat condi ia i anume la nceput sau sfrit: Do [{While | Until} condi ie] Do [grup instruc iuni] [grup instruc iuni] sau [Exit Do] [Exit Do] [grup instruc iuni] [grup instruc iuni] Loop [{While | Until} condi ie] Loop Instruc iunea Exit Do provoac ieirea for at din ciclu. De obicei se execut n func ie de evaluarea unei condi ii ntr-o instruc iune IF. Este permis folosirea instruc iunii Do i fr nici o condi ie. n acest caz este obligatorie inserarea n ciclul Do a unei instruc iuni Exit Do sau Exit Sub | Function, pentru a nu se genera un ciclu fr sfrit. Condi ia este evaluat n func ie de locul unde este plasat n instruc iune i anume: la prima form a instruc iunii (cea din stnga) naintea executrii ciclului; la a doua form a instruc iunii (cea din dreapta) dup executarea ciclului. Ciclul se execut minim de la: prima form a instruc iunii (cea din stnga) se poate ca ciclul s nu se execute de loc; a doua form a instruc iunii (cea din dreapta) ciclul se va executa minim o dat. O condi ie cu rezultatul NULL este tratat ca i cum ar fi FALSE. Exemplu. Private Sub cmdLoop1_Click () Dim iCounter As Integer iCounter = 1 Do While iCounter < 5 MsgBox iCounter ICounter = iCounter + 1 Loop End Sub Procedura va afia patru mesaje, cu numere de la 1 la 4. Aceast structur nu asigur ntotdeauna executarea secven ei de cod din interiorul buclei. Dac n iCounter este introdus o valoare mai mare sau egal cu 5, codul din interiorul buclei nu va fi executat niciodat.
I-27

Dac secven a de cod trebuie s fie executat necondi ionat cel pu in o dat, se va folosi urmtoarea structur: Exemplu. Private Sub cmdLoop2_Click () Dim iCounter As Integer iCounter = 5 Do MsgBox iCounter ICounter = iCounter + 1 Loop While iCounter < 5 End Sub Procedura va afia un mesaj cu numrul 5. Acest cod va fi executat cel pu in o dat, indiferent de valoarea din iCounter, deoarece evaluarea condi iei se face dup executatea ciclului. Structura Do While|Until... Loop face evaluarea condi iei nainte de executarea ciclului i de aceea nu asigur execu ia acestuia. Structura Do... Loop While|Until face evaluarea condi iei dup executarea ciclului i de aceea execu ia acestuia este asigurat cel pu in o dat. I.5.2.3.b) Structura repetitiv cu contor. Instruc iunea ForNext Repet un ciclu de un anumit numr de ori. Mai exist o structur: FOR EACH... NEXT, care se aplic colec iilor de obiecte sau tablourilor i care va fi prezentat n urmtorul capitol. Aceast instruc iune permite parcurgerea automat a tuturor elementelor unei colec ii sau tablou. Forma instruc iunii FOR este: For contor = start To end [Step pas] [grup instruc iuni] [Exit For] [grup instruc iuni] Next [contor] n care: contor variabil numeric folosit pentru stabilirea numrului de execu ii ale ciclului; start valoarea ini ial a contorului; end valoarea final a contorului; pas valoarea cu care contorul se incrementeaz; poate fi pozitiv sau negativ (implicit este 1); incrementarea se efectueaz dup execu ia fiecrui ciclu. Func ionarea instruc iunii FOR se face prin parcurgerea urmtoarelor etape: a) se determin n func ie de valoarea (pozitiv sau negativ) pe care o are pasul (step), condi ia de terminare a ciclului i anume: Dac PAS >=0, condi ia va fi: contor > end; Dac PAS < 0, condi ia va fi: contor < end; b) se evalueaz condi ia de terminare a ciclului; c) n continuare, dac condi ia este: FALSE se execut ciclul i se continu instruc iunea FOR cu etapa d); TRUE nu se execut ciclul i se termin instruc iunea FOR. Programul continu cu instruc iunile de dup NEXT; d) dup executarea ciclului se adun pasul la contor. Dup aceast opera ie instruc iunea FOR continu cu repetarea evalurii condi iei, adic cu etapa b). Deci, practic, la fiecare ciclu, contorul va parcurge toate valorile de la start la end. Dac pasul este: pozitiv, atunci: dinamica contorului va fi cresctoare, prin adugarea valorii pasului la fiecare ciclu; pentru ca s se execute cel pu in un ciclu, trebuie ca la nceput start<=end; numrul de cicluri efectuate va fi: end-start+1. negativ, atunci:
I-28

dinamica contorului va fi descresctoare, prin scderea valorii absolute a pasului la fiecare ciclu; pentru ca s se execute cel pu in un ciclu, trebuie ca la nceput start>=end; numrul de cicluri efectuate va fi: start-end+1. Instruc iunea Exit For provoac ieirea for at din ciclu i continuarea programului cu instruc iunile de dup NEXT. De obicei se execut n func ie de evaluarea unei condi ii ntr-o instruc iune IF. Sunt admise imbricri ale structurilor For, dac sunt folosite variabile contor diferite ca n exemplul urmtor: For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 ... Next K Next J Next I ntr-un For trebuie evitat schimbarea valorii contorului. Structura For... Next este folosit atunci cnd sunt un numr exact de itera ii de executat. Exemplu. Private Sub cmdForNext_Click () Dim iCounter As Integer For iCounter = 1 To 5 MsgBox iCounter Next iCounter End Sub Procedura va afia cinci mesaje, cu numere de la 1 la 5. Observa i c: iCounter se auto-incrementeaz; se pot folosi variabile att pentru valoarea de start, ct i pentru cea de sfrit; dac valoarea de incrementare a contorului este diferit de 1, se d dup cuvntul cheie STEP, printr-un literal sau o variabil (pas). Exemplu. Private Sub cmdForNext_Click () Dim iCounter As Integer For iCounter = 5 To 1 Step -1 MsgBox iCounter Next iCounter End Sub Procedura va afia cinci mesaje, cu numere de la 5 la 1.

I.6. Rutine proceduri i func ii


I.6.1. Ce este o rutin i ce elemente o definesc? Rutina este o structur de sine stttoare, asemntoare unui program, prin care se efectueaz o anumit ac iune. Ea este executat numai atunci cnd este lansat (apelat), de ctre un obiect al aplica iei care poate fi: programul numai n cazul limbajului Visual Basic, dar nu i n cel al VBA; o alt rutin; un eveniment al unui obiect al aplica iei; un macro. Rutina poate fi apelat de un numr nelimitat de ori din diferite locuri. Dup execu ia unei rutine, controlul revine obiectului care a provocat apelarea rutinei. Toate declara iile (variabile, constante) fcute n interiorul rutinei sunt locale, fiind deci vizibile numai din interiorul acesteia. De asemenea, durata de via a datelor locale este numai n intervalul de timp ct rutina se afl n execu ie. La terminarea rutinei, are loc automat eliberarea din memorie a tuturor variabilelor i constantelor locale ale acesteia.
I-29

n Visual Basic nu sunt permise imbricri de rutine. Deci ntr-o rutin nu se poate declara o alt rutin. Diferit fa de programe, rutina interac ioneaz cu obiectul care a provocat lansarea (apelarea) ei, prin transferarea de date din i nspre acesta. Acest lucru se realizeaz n dou moduri i anume: Prin lista de parametri. Aceasta reprezint practic nite variabile, prin intermediul crora se face: un transfer de date de la modulul care apeleaz la rutin parametri de intrare produs n momentul apelrii rutinei; un transfer de date de la rutin nspre modulul apelant parametri de ieire produs n momentul terminrii rutinei i prelurii controlului de ctre modulul apelant; Prin variabile globale sau publice. Aceste variabile fiind vizibile i din modulul apelant i din rutin, evident c prin ele se pot face transferuri de date n ambele sensuri ntre cele dou obiecte. Definirea unei rutine se face prin atribuirea unui nume (obligatoriu) acesteia i prin stabilirea listei de parametri (op ional). Parametrii defini i n rutin se numesc parametri formali. Declararea parametrilor formali se face dup regulile aplicate la declararea variabilelor. Apelarea unei rutine se face prin numele ei. La apelarea unei rutine, corespunztor fiecrui parametru formal, trebuie s existe o dat de acelai tip n modulul apelant, care poate fi o variabil, o constant, o expresie sau un literal. Aceste date formeaz lista parametrilor actuali i este declarat o dat cu apelarea rutinei. Evident parametrii actuali i formali trebuie s fie de acelai tip i s ocupe acelai loc n cele dou liste. Parametrii de intrare ai rutinei pot fi n lista parametrilor actuali: variabile, constante, literali sau expresii. Parametrii de ieire ai rutinei pot fi n lista parametrilor actuali numai variabile, deoarece acetia prin defini ie i pot schimba valoarea n timpul execu iei rutinei. Din punct de vedere al terminologiei se mai obinuiete s se foloseasc n loc de parametru termenul argument. I.6.2. Transmiterea datelor prin parametri Exist dou modalit i de transmitere a datelor prin parametri i anume, prin valoare sau prin adres (referin ). Apelarea rutinelor i transmitera parametrilor prin valoare Din figura urmtoare se obsev c avem perechi de parametri, actuali i formali, care reprezint practic dou variabile care se sincronizeaz de dou ori: prima dat la apelarea rutinei i a doua dat la terminarea rutinei. Astfel la apelarea rutinei se face practic pentru fiecare pereche de parametri opera ia de transfer: ParametruFormal=ParametruActual (de ex: A1=X1 sau A2=X2 etc.) iar la terminarea rutinei transferul invers: ParametruActual=ParametruFormal (de ex: T=B1 sau Y=B1 etc.) Modul apelant . Instr N.. X1=. Instr N+1.. X2=. Apelare rutin - Rtest Instr. .= Y .. Instr J M1=. Instr J+1 M2=. Apelare rutin - Rtest Instr. .= T ..
Parametri actuali:X1, X2, Y

X1,X2

A1,A2

B1

M1,M2

A1,A2

Parametri actuali:M1, M2, T T B1

Rutina Nume: Rtest Parametrii formali: Intrare: A1, A2 Ieire: B1 Instr1 ... ..= A1 + A2 ' folosirea 'parametrilor de intrare .. B1= ' folosirea 'parametrilor de ieire .. Sfrit rutin

I-30

Deci n acest caz se transfer anumite valori, n ambele sensuri, ntre perechile de parametri formal i actuali. Spunem c transmisia parametrilor se face prin valoare. Apelarea rutinelor i transmitera parametrilor prin adres Modul apelant . Instr N.. X1=. Instr N+1.. X2=. Apelare rutin - Rtest
Parametri actuali:X1,X2,Y

Rutina Nume: Rtest Parametri actuali X1 X2 Y a d r e s e A1 A2 B1 Parametri formali Parametri actuali X1 X2 Y a d r e s e A1 A2 B1 Parametri formali
Parametrii formali: Intrare:A1,A2

Ieire:B1 Instr1 .. ..= A1+A2 'folosirea


'parametrilor de intrare

Instr. .= Y .. Instr J M1=. Instr J+1 M2=. Apelare rutin - Rtest


Parametri actuali:M1,M2,T

.. B1= .. 'folosirea
'parametrilor de ieire

Instr. .= T ..

.. Sfrit rutin

n acest caz lucrurile se petrec altfel. Transferul se face numai la apelarea rutinei, dar nu se vor transfera valori, ci rutina va primi adresele parametrilor actuali. n acest fel n rutin parametrii formali se vor genera n memorie peste parametrii actuali. Deci rutina va lucra practic cu parametrii actuali, dei va folosi numele parametrilor formali n expresii. n Visual Basic, dac nu se fac precizri suplimentare, transmiterea parametrilor se face prin adres (referin ). I.6.3. Crearea (definirea) unei rutine Rutinele sunt de dou feluri: proceduri (sau subrutine) i func ii. Diferen a dintre ele const n faptul c: Func iile au un parametru implicit de ieire care este chiar numele func iei. Procedurile sunt apelate prin instruc iuni, iar func iile sunt apelate prin introducerea numelui acesteia ntr-o expresie (ca i cum ar fi o variabil sau constant). Func iile pot fi folosite direct oriunde este cerut o expresie, cu condi ia vizibilit ii ei din locul de apelare. Astfel putem folosi func ii ca: parametri de intrare pentru rutine, la definirea propriet ilor din controale, la cereri etc. I.6.3.1. Proceduri (Subrutine) [Private|Public][Static] Sub NumeProcedura [(ListaParametriFormali)] [declara ii locale de: variabile, constante, etc. ] [instruc iuni] [Exit Sub] [instruc iuni] End Sub Instruc iunea Exit Sub provoac, dac este ntlnit, terminarea procedurii i redarea controlului modulului apelant, la instruc iunea care se gsete imediat dup cea de apelare. n mod normal procedurile se termin la instruc iunea End Sub. Op iunile Private sau Public au acelai rol ca cel prezentat la variabile. Astfel, procedura declarat Public n modulul general de cod va fi vizibil din toate modulele de cod ale aplica iei, iar cea declarat Private va fi vizibil numai din modulul n care este declarat. Dac nu se folosete nici una din cele dou op iuni, procedura va fi considerat Public. Op iunea Static determin ca toate variabilele locale declarate n procedur s func oineze ca variabilele statice. Toate instruc iunile sunt permise n proceduri,folosind date care pot fi: parametrii formali;
I-31

variabilele i constantele globale; variabilele i constantele locale; Este indicat ca s se evite, pe ct posibil, n crearea rutinelor, folosirea variabilelor globale. Pentru schimburile de date dintre rutin i modulul apelant este recomandat utilizarea numai a parametrilor formali. Acest lucru se datoreaz faptului c o rutin care folosete multe variabile globale este de multe ori foarte pu in lizibil, greu de depanat sau de ntre inut. Lista Parametrilor Formali reprezint o list de variabile, declarate dup regulile prezentate la variabile i separate prin virgul. Un parametru se declar conform structurii de mai jos: [ByVal | ByRef] NumeParametru As TipDate Op iunile ByVal sau ByRef precizeaz modalitatea de transmitere a parametrului respectiv i anume: ByVal prin valoare; ByRef prin adres (referin ); Implicit, transferul parametrilor se face prin adres. I.6.3.2. Func ii
[Public|Private][Static]Function NumeF-c ie[(ParFormali)] [As TipFunc ie]

[declara ii locale de: variabile, constante, etc. ] [instruc iuni] [Exit Function] [instruc iuni] End Function Se observ c singura deosebire esen ial fa de proceduri se datoreaz faptului c numele func iei are dou semnifica ii, fiind n acelai timp i numele rutinei i parametru de ieire al rutinei. Din aceast cauz acestuia trebuie s i se precizeze tipul de date. Dac acest lucru nu se face atunci tipul func iei se va considera implicit Boolean. Deci o func ie, dup ce este executat, se va comporta practic ca o variabil care s-a ncrcat cu valoarea parametrului de ieire putnd fi introdus direct n partea dreapt a oricrei expresii. n loc de Exit Sub i End Sub, la func ii sunt Exit Function i End Function, evident cu acelai rol. Exemplu. Urmtorul exemplu reprezint o func ie care va testa dou valori primite ca parametri i va ntoarce suma sau diferen a dintre ele. Function TestF (Numar1 As Integer, Numar2 As Integer) As Integer If Numar1 > Numar2 Then TestF = Numar1 - Numar2 ' valoarea de retur se introduce n numele_ func iei Else TestF = Numar1 + Numar2 ' valoarea de retur se introduce n numele_ func iei End If End Function . Se va folosi aceast func ie astfel. MsgBox TestF (20, 5) ' afieaz 15 MsgBox TestF (2, 5) ' afieaz 7 I.6.4. Apelarea unei rutine Orice func ie poate fi apelat ca o procedur, dar o procedur nu poate fi folosit ca o func ie (n partea din dreapta a unei expresii). I.6.4.1. Apelarea unei proceduri (subrutine) Exist dou modalit i de apelare a unei proceduri: prin instruc iunea Call: Call NumeProcedur (ListaParametrilorActuali) direct, folosind numele procedurii, urmat eventual de lista parametrilor actuali: NumeProcedur ListaParametrilorActuali Parametrii se separ prin virgul.
I-32

Diferen a ntre cele dou forme este c la apelarea cu Call, parametrii actuali ai procedurii trebuie scrii ntre paranteze, pe cnd la apelarea direct prin numele procedurii nu se foloseasc parantezele. I.6.4.2. Apelarea unei func ii O func ie se apeleaz dintr-o expresie, folosindu-se numele ei urmat de lista parametrilor actuali inclui ntre paranteze. Numele func iei, se va comporta n expresie ca o variabil, ncrcat dup execu ia func iei cu o valoare, ca i cum ar fi un parametru de ieire al unei proceduri. Spunem c func ia ntoarce (returneaz) o valoare dup execu ia ei. Aceast valoare va participa la evaluarea expresiei respective. O procedur nu poate fi folosit ntr-o expresie n locul unei func ii, deoarece nu ntoarce valori prin numele ei (chiar dac are parametri de ieire). Func iile pot fi apelate i ca pe o procedur n oricare din cele dou modalit i prezentate. Exemplu. Refacem exemplul prezentat nainte folosind o procedur TestS n locul func iei TestF. Sub TestS (Numar1 As Integer, Numar2 As Integer, Rezultat As Integer) If Numar1 > Numar2 Then Rezultat = Numar1 - Numar2 ' valoarea calculat se introduce n _ parametrul de ieire Else Rezultat = Numar1 + Numar2 ' valoarea calculat se introduce n _ parametrul de ieire End If End Sub . Se va folosi aceast procedur astfel. Dim Rez As Integer Call TestS (20, 5, Rez) ' calculeaz n Rez MsgBox Rez ' afieaz 15 TestS 2, 5, Rez ' calculeaz n Rez MsgBox Rez ' afieaz 7 I.6.5. Domeniul de vizibilitate al rutinelor Regulile prezentate la variabile privind aceast problem sunt valabile i pentru rutine. Codul VBA este scris numai n unit i numite rutine. Aceste rutine sunt pstrate fie n modulul general (global) de cod, fie n modulele specifice din spatele formularelor sau rapoartelor (Code Behind Forms CBF). Domeniul de valabilitate sau de vizibilitate a rutinei este determinat de cuvntul utilizat n declararea acesteia: Private sau Public i de locul unde rutina e plasat. O rutin este public dac este declarat Public i este plasat n modulul general de cod. Ea este vizibil n toat aplica ia. Restul rutinelor sunt locale i sunt vizibile numai din modulul unde au fost declarate. I.6.6. Durata de via a rutinelor Durata de via a unei rutine, adic timpul n care ea se gsete n memorie, este n func ie de locul unde a fost declarat i anume: pe toat durata aplica iei dac se gsete n modulul general de cod; ct timp este n execu ie un formular sau raport, dac se gsete n codul din spatele acestuia. I.6.7. Rutine definite de utilizator. Introducerea codului VBA Pentru a crea o rutin definit de utilizator ntr-un modul general (global) de cod, urma i paii de mai jos: executa i clic pe marcajul de tabulare Modules din fereastra bazei de date; ncepe i un modul nou sau selecta i un modul existent i executa i clic pe op iunea Design; selecta i op iunea Insert Procedure (insereaz rutin) de pe bara cu instrumente sau selecta i op iunea Procedure din meniul Insert. Va aprea pe ecran caseta de dialog prezentat anterior. introduce i numele rutinei i selecta i tipul acesteia: func ie, procedur (subrutin) sau proprietate (se va prezenta n alt capitol).
I-33

Indica i dac dori i ca rutina s fie public (pentru ntreaga aplica ie) sau privat (numai pentru acest modul). De asemenea, specifica i dac toate variabilele locale din rutin sunt statice sau nu. Termina i definirea rutinei cu clic pe OK. Pentru a crea o rutin definit de utilizator n modulul de cod din spatele unui formular sau raport se procedeaz la fel, n afar de afiarea modulului, care se face astfel: n timp ce v afla i n modul de afiare Design al unui formular sau raport, vizualiza i codul din spatele formularului sau raportului executnd clic pe butonul Code de pe bara de instrumente sau prin selectarea op iunii Code din meniul View, sau prin pictograma specific de pe bara de instrumente. I.6.8. Procedurile evenimentelor Procedurile evenimentelor sunt apelate automat cnd are loc un eveniment pentru un anumit obiect. De exemplu, cnd un utilizator execut click cu mouse-ul pe un buton de comand dintr-un formular, este executat automat, dac exist, codul evenimentului Click pentru acel buton de comand, cod care se va gsi plasat sub forma unei proceduri eveniment n modulul de cod din spatele formularului respectiv. Procedura unui eveniment al unui control este creat automat (prima i ultima instruc iune a procedurii, adic Sub i End Sub) cnd se selecteaz dintre propriet ile controlului evenimentul respectiv. Numele procedurii va fi obligatoriu stabilit de sistem, n func ie de numele controlului i al evenimentului respectiv. De asemenea, dac este cazul, este ataat, tot de ctre sistem, lista parametrilor formali. Exemplu. ntr-un formular se gsete un control de tip buton de comand, cu numele cmdOkay (i proprietatea Caption="Apasa") i trei controale de tip textbox, cu numele txtNume, txtVirsta i txtSex. Instruc iunea de declarare a procedurii eveniment: Private Sub cmdOkay_Click, ca i aceea de sfrit (End Sub), sunt create automat atunci cnd se selecteaz evenimentul Click din lista propriet ilor butonului de comand cmdOkay. n continuare programatorul introduce codul surs al procedurii eveniment: Private Sub cmdOkay_Click () If IsNull(Me!txtNume) Or IsNull(Me!txtVirsta) _ Or isNull(Me!txtSex) Then MsgBox "Trebuie introduse numele, virsta i sexul" Exit Sub 'Dac nu sunt date n toate cele trei textbox-uri se afieaz _ mesajul i se termin procedura Else 'Afieaz val. din txtNume i ce ntoarce func ia CalculVirsta MsgBox "Numele d-tra este: " & Me!txtNume & _ Chr(10) & Chr(13) & "Virsta dv este acum de: " & _ CalculVirsta(Int(Val(Me!txtVirsta)), Me!txtSex) & " ani" End If End Sub Procedura de mai sus va fi executat de fiecare dat cnd se va face click pe butonul de comand cmdOkay al formularului. Dac n toate cele trei controale textbox sunt introduse date, atunci se afieaz un mesaj ca n figura alturat; altfel se va afia mesajul: "Trebuie introduse numele, vrsta i sexul" Procedura folosete urmtoarele func ii ce se gsesc n bibliotecile sistem (prezentate n continuarea acestui capitol): IsNull(pm) ntoarce TRUE dac parametrul pm este Null; Chr(10) ntoarce caracterul LF - Line Feed (rnd nou); Chr(13) ntoarce caracterul CR - Carriage Return (retur de car); Val(pm) ntoarce valoarea numeric din stringul pm; Int(pm) ntoarce partea ntreag din pm. Un control se comport ca o variabil de tip variant. Datele din control pot fi accesate cu sintaxa Me!NumeControl, dar numai din codul din spatele formularului respectiv. Dac nu sunt date introduse n control, atunci valoarea acestuia este Null.
I-34

Procedura eveniment utilizeaz o func ie utilizator, declarat n acelai modul de cod din spatele formularului respectiv, care are doi parametri formali de intrare i anume: V n care se va transfera valoarea numeric ntreag din textbox txtVirsta i S n care se va transfera valoarea din textbox txtSex. Function CalculVirsta (V As Integer, S As Variant) As Integer If V > 35 And S = "F" Then CalculVirsta = V - 10 ElseIf V > 25 And S = "F" Then CalculVirsta = V - 5 ElseIf V > 20 And S = "F" Then CalculVirsta = V - 2 ElseIf S = "M" Then CalculVirsta = V + 5 Else CalculVirsta = V End If End Function Pentru a edita codul evenimentului, executa i urmtorii pai: executa i click pe control (cmdOkay) n modul de afiare Design i apoi pe butonul Properties din bara cu instrumente sau executa i click cu butonul drept al mouse-ului pe obiect i selecta i op iunea Properties din meniul contextual; executa i click pe marcajul de tabulare al propriet ilor evenimentului (Event); selecta i proprietatea pentru care dori i s scrie i instruc iuni de cod (de exemplu, evenimentul On Click); selecta i [Event Procedure] din lista derulant; executa i clic pe butonul (). Cursorul dumneavoastr va fi plasat n codul evenimentului pentru obiectul respectiv. Automat sistemul va crea instruc iunea de declarare a procedurii, eventual cu lista de parametri formali, dac este cazul i instruc iunea de sfrit a procedurii. Proiectantul va introduce acum codul VBA necesar tratrii evenimentului. I.6.9. Utilizarea combinat a procedurilor eveniment cu rutinele utilizator Am artat c att subrutinele, ct i func iile pot primi argumente (parametri), dar numai func iile pot ntoarce valori. Exemplu. Subrutina urmtoare primete doi parametri, txtFirst i txtLast. Aceasta afieaz apoi un mesaj cu primul caracter al fiecruia dintre cei primi i. Private Sub Initialele (sFirst As String, sLast As String) MsgBox "Initialele dumneavostr sunt: " & _ Left (sFirst, 1) & Left (sLast, 1) ' Func ia Left ntoarce caracterele_ de la nceputul unui string End Sub Ea va fi apelat din procedura eveniment On Click a butonului de comand cmdNume. Private Sub cmdNume_Click () Initialele Me !txtFirstName, Me!txtLastName End Sub Observa i c textul din controalele txtFirstName i txtLastName din formularul curent (Me) sunt transmise subrutinei cu numele Initialele. Parametrii sunt recep iona i ca sFirst i sLast. Primul caracter din stnga al fiecrui parametru este afiat n caseta de mesaje. Codul precedent transmite pur i simplu valori i apoi opereaz cu ele. Exemplu. n continuare se ilustreaz folosirea unei func ii care ntoarce o valoare. Private Function ReturnInit (sFName As String, sLName As String) As String ReturnInit = Left (sFName, 1) & Left (sLName, 1) End Function Ea va fi apelat din procedura eveniment On Click a butonului de comand cmdNume. Private Sub cmdNume_Click () Dim sInitials As Integer sInitials = ReturnInit (Me!txtFirstName, Me!txtLastName) MsgBox "Initialele dumneavostra sunt: " & sInitials
I-35

End Sub Re ine i c acest exemplu apeleaz o func ie ReturnInit, trimi nd valorile celor dou casete de text ca parametri ai func iei. Func ia asociaz numelui func iei (ReturnInit) o valoare egal cu primele dou caractere ale irurilor. Apoi, func ia ntoarce aceast valoare rutinei apelante (cmdNume_Click) i o atribuie variabilei sInitials. I.6.10. Parametri opionali Visual Basic v permite s utiliza i parametri op ionali. Cu alte cuvinte, nu este necesar s ti i c i parametri vor fi transmii. Func ia numit ReturnInit din secven a de cod urmtoare primete ultimii doi parametri ca op ionali. Apoi evalueaz prezen a sau nu a parametrilor i ac ioneaz n consecin . Function ReturnInit (sFName As String, Optional sMI, Optional sLName) As String If IsMissing (sMI) Then ' IsMissing ntoarce True dac s-a apelat _ func ia fr parametrul sMI SMI = InputBox ("Introduce i initiala cuvantului din mijloc") End If If IsMissing (sLName) Then ' IsMissing ntoarce True dac s-a _ apelat func ia fr parametrul sLName SLName = InputBox ("Introduce i ultimul nume") End If ReturnInit = sLName & " " & sMI & " " sFName End Function Aceast func ie poate fi apelat de exemplu n felul urmtor: sName = ReturnInit ("Bill",, "Gates") Aa cum a i putut vedea, lipsete al doilea parametru. n loc s rezulte o eroare de compilare, func ia ReturnInit va sesiza acest lucru i prin func ia InputBox va cere utilizatorului introducerea valorii respective. Sau mai poate fi apelat i: sName = ReturnInit ("Bill", "X", "Gates") n acest caz func ia, prin folosirea lui IsMissing, va sesiza prezen a tuturor celor trei parametri actuali. Lucrul cu parametri op ionali, deci care pot s lipseasc la apelarea rutinei, necesit: declararea ca op ional a parametrului, prin folosirea clauzei Optional, n fa a numelui parametrului. O restric ie a limbajului este faptul c numai ultimii parametri pot fi declara i op ionali. testarea prin func ia IsMissing, dac a fost sau nu introdus la apelare parametrul respectiv n lista parametrilor actuali. Dac nu se dorete introducerea n lista parametrilor actuali a unui parametru op ional, atunci se va scrie numai separatorul (virgula) parametrului respectiv. Func ia IsMissing este valabil numai pentru parametri de tip variant. pentru parametrii declara i op ional, se poate introduce o valoare implicit, cu care se va ini ializa parametrul dac acesta lipsete din lista parametrilor actuali. Dac se folosesc parametri op ionali, declararea acestora n lista parametrilor formali este: [Optional] NumeParametru As TipDate [ = ValoareImplicita ]

I.7. Biblioteci standard de proceduri i func ii


O bibliotec este un obiect de sine stttor care permite realizarea unei colec ii de func ii, proceduri, clase de obiecte, colec ii de obiecte i obiecte. Noile tehnologii i standarde introduse de Microsoft permit ca modulele unei biblioteci s fie utilizate de toate aplica iile client de pe platforma S.O. care respect standardele de utilizare ale acestora. n Visual Basic, exist posibilitatea crerii mai multor tipuri de biblioteci. Microsoft Office, ofer mai multe biblioteci, care pot fi utilizate n Access, Visual Basic sau alte aplica ii. Pentru aceasta trebuie ca n prealabil aplica ia client s nregistreze i s creeze referin a (adresa) ctre biblioteca respectiv. Acest lucru se face prin comanda References. Implicit, o aplica ie are chiar din faza de instalare create referin ele ctre cele mai utilizate biblioteci specifice. Aplica iile Access au referin e create ctre anumite biblioteci, ale cror module pot fi utilizate oriunde acestea sunt permise. n acest subcapitol, vor fi prezentate n special cele mai utilizate func ii i proceduri ale acestor biblioteci.
I-36

Un bun programator trebuie s cunoasc i s foloseasc ct mai multe din obiectele puse la dispozi ie de biblioteci. De exemplu dac se realizeaz o aplica ie care la un moment dat trebuie s calculeze sinusul dintr-o valoare, un programator neexperimentat ar putea s creeze un modul care s rezolve acest lucru, pe cnd un bun programator, tiind c exist n biblioteci func ia Sin, care calculeaz sinusul unei valori, va rezolva imediat aceast problem, folosind pur i simplu func ia respectiv. Pentru a putea utiliza o func ie dintr-o bibliotec, programatorul trebuie s cunoasc trei lucruri: numele func iei; parametrii i ce reprezint fiecare; ce reprezint valoarea pe care o ntoarce func ia (adic ce opera ii efectueaz func ia). n crearea expresiilor, n Access se poate folosi un constructor de func ii Expressions Builder, lansat de obicei din meniul contextual (Build). Acesta este foarte util, prezentnd toate func iile, parametrii acestora, modulul de Help, opera iile permise etc. n concluzie, n codul VBA, n controalele din formulare sau rapoarte, n propriet ile tabelelor sau cererilor, se pot folosi n crearea expresiilor att func iile definite (create) de utilizator ct i func iile din bibliotecile ctre care exist referin e. Toate acestea se pot vizualiza prin Expressions Builder (prin cele dou foldere din Functions, aa cum se vede din figur). Access are referin e implicite ctre o bibliotec de func ii i proceduri, foarte bogat i cuprinztoare, din care vor fi prezentate n continuare cele mai utilizate. I.7.1. Funcii matematice I.7.1.1. Int(numr); Fix(numr) Ambele func ii ntorc partea ntreag a numrului introdus ca parametru de intrare. Tipul de dat al rezultatului va fi acelai cu cel al parametrului de intrare. Ambele func ii Int i Fix ndeprteaz partea frac ionar a numrului i ntorc valoarea ntreag care rezult. Diferen a ntre Int i Fix se manifest numai n cazul numerelor negative. Astfel: Int ntoarce primul numr negativ de tip ntreg mai mic sau egal cu numrul; Int (8. 4) = 9; Fix ntoarce primul numr negativ de tip ntreg mai mare sau egal cu numrul; Fix (8. 4) = 8. Exemplu. Dim Nr ' variabil declarat fr specificarea tipului de dat-VARIANT. Nr = Int (99. 8) ' ntoarce 99. Nr = Fix (99. 2) ' ntoarce 99. Nr = Int (-99. 8) ' ntoarce -100. Nr = Fix (-99. 8) ' ntoarce -99. I.7.1.2. Abs(numr) ntoarce valoarea absolut a numrului introdus ca parametru de intrare. Tipul de dat al rezultatului va fi acelai cu cel al parametrului de intrare. Exemplu. Dim Nr Nr = Abs (50. 3) ' ntoarce 50. 3. Nr = Abs (-50. 3) ' ntoarce 50. 3. I.7.1.3. Sgn(numr) ntoarce un Variant (Integer) care reprezint semnul unui numr. Dac parametrul este: Sgn ntoarce: Exemplu. Dim Semn aA Variant
I-37

<0
1

>0
1

=0
0

Const Valoare1= 12, Valoare2= -2. 4, Valoare3= 0 Semn = Sgn (Valoare1) ' ntoarce 1. Semn = Sgn (Valoare2) ' ntoarce -1. Semn = Sgn (Valoare3) ' ntoarce 0. I.7.1.4. Sqr(numr) ntoarce o valoare de tip Double (virgul mobil dubl precizie) care reprezint radicalul (square root) unui numr pozitiv ( 0). Exemplu. Dim Radical Radical = Sqr(4) ' ntoarce 2. Radical = Sqr(23) ' ntoarce 4. 79583152331272. Radical = Sqr(0) ' ntoarce 0. Radical = Sqr(-4) ' Genereaz o eroare de execu ie. I.7.1.5. Exp(numr) ntoarce o valoare de tip Double care reprezint constanta e ridicat la o putere (n care e este baza logaritmului natural). Exemplu. Dim Unghi, SinHiper Unghi = 1. 3 ' Definete unghiul n radiani SinHiper = (Exp (Unghi) - Exp (-1 * Unghi) ) / 2' Calcul sin hiperbolic I.7.1.6. Log(numr) ntoarce o valoare de tip Double care reprezint logaritmul natural al unui numr (> 0). Logaritmul natural este logaritmul n baza e. Constanta e~2,718282. Exemplu. Dim Unghi, Logaritm Unghi = 1.3 ' Definete unghiul n radiani Logaritm=Log(Unghi+Sqr(Unghi*Unghi+1))' inversul sin hiperbolic I.7.1.7. Rnd [(numr)] ntoarce o valoare de tip Single (virgul mobil simpl precizie) care va con ine un numr aleator. Valoarea ntoars de Rnd este:
Dac parametrul este: <0 >0 =0 Fr (de obicei) Rnd genereaz Acelai numr de fiecare dat, folosind parametrul ca valoare de ini ializare. Urmtorul numr din secven . Cel mai recent numr generat. Urmtorul numr din secven .

Argumentul (parametrul) este op ional i poate fi un Single sau o expresie numeric corect. Func ia Rnd ntoarce o valoare n intervalul [0.. 1). Valoarea parametrului determin cum Rnd genereaz un numr aleator. Pentru o anumit valoare ini ial, este generat aceeai secven de numere, deoarece fiecare apel succesiv al func iei Rnd folosete numrul generat anterior ca valoare pentru calculul urmtorului numr din secven . nainte de prima folosire a func iei Rnd, dac se dorete generarea unei secven e de numere aleatoare, atunci generatorul de numere aleatoare trebuie ini ializat cu o valoare ntmpltoare. Pentru aceasta se va folosi procedura Randomize, fr parametri, care va folosi pentru ini ializarea generatorului de numere aleatoare ceasul sistemului de calcul. Dac se dorete generarea unor numere ntregi, n intervalul [a.. b], se folosete formula: Int(a + (b - a + 1) * Rnd) Exemplu. Dim Valoare Randomize Valoare=Int(1+(6*Rnd)) ' Genereaz o valoare aleatoare ntre 1 i 6.
I-38

I.7.1.8. Sin(numr) ntoarce o valoare de tip Double care este sinusul unui unghi n radiani. Rezultatul va fi n intervalul [1.. 1]. Pentru a transforma gradele n radiani se nmul esc gradele cu pi/180. Invers se vor nmul i radianii cu 180/pi. Exemplu. Dim Unghi, Cosecanta Unghi = 1.3 ' Definete unghiul n radiani. Cosecanta = 1 / Sin(Unghi) ' Calculeaz cosecanta. I.7.1.9. Cos(numr) ntoarce o valoare de tip Double care este cosinusul unui unghi n radiani. Exemplu. Dim Unghi, S Unghi = 1. 3 ' Definete unghiul n radiani. S = 1 / Cos (MyAngle) ' Calculeaz secanta. I.7.1.10. Tan(numr) ntoarce o valoare de tip Double care este tangenta unui unghi n radiani. Pentru a transforma gradele n radiani se nmul esc gradele cu pi/180. Invers se vor nmul i radianii cu 180/pi. Exemplu. Dim Unghi, Cotangenta Unghi = 1. 3 ' Definete unghiul n radiani Cotangenta = 1 / Tan (Unghi) ' Calculeaz cotangenta I.7.1.11. Atn(numr) ntoarce o valoare de tip Double care reprezint arctangenta unui numr. Exemplu. pi = 4 * Atn(1) ' Calculeaz valoarea lui pi. I.7.1.12. Calculul func iilor matematice derivate
Secant Cosecant Cotangent Inverse Sine Inverse Cosine Inverse Secant Inverse Cosecant Inverse Cotangent Hyperbolic Sine Hyperbolic Cosine Hyperbolic Tangent Hyperbolic Secant Hyperbolic Cosecant Hyperbolic Cotangent Inverse Hyperbolic Sine Inverse Hyperbolic Cosine Inverse Hyperbolic Tangent Inverse Hyperbolic Secant Inverse Hyperbolic Cosecant Inverse Hyperbolic Cotangent Logarithm to base N Sec (X) = 1 / Cos (X) Cosec (X) = 1 / Sin (X) Cotan (X) = 1 / Tan (X) Arcsin (X) = Atn (X / Sqr (-X * X + 1) ) Arccos (X) = Atn (-X / Sqr (-X * X + 1) ) + 2 * Atn (1) Arcsec (X) = Atn(X / Sqr(X*X 1)) + Sgn( (X)1) * (2*Atn(1)) Arccosec (X) = Atn(X / Sqr(X*X-1)) + (Sgn(X)1) * (2*Atn(1)) Arccotan (X) = Atn (X) + 2 * Atn (1) HSin (X) = (Exp (X) Exp (-X) ) / 2 HCos (X) = (Exp (X) + Exp (-X) ) / 2 HTan (X) = (Exp (X) Exp (-X) ) / (Exp (X) + Exp (-X) ) HSec (X) = 2 / (Exp (X) + Exp (-X) ) HCosec (X) = 2 / (Exp (X) Exp (-X) ) HCotan (X) = (Exp (X) + Exp (-X) ) / (Exp (X) Exp (-X) ) HArcsin (X) = Log (X + Sqr (X * X + 1) ) HArccos (X) = Log (X + Sqr (X * X 1) ) HArctan (X) = Log ( (1 + X) / (1 X) ) / 2 HArcsec (X) = Log ( (Sqr (-X * X + 1) + 1) / X) HArccosec (X) = Log ( (Sgn (X) * Sqr (X * X + 1) + 1) / X) HArccotan (X) = Log ( (X + 1) / (X 1) ) / 2 LogN (X) = Log (X) / Log (N)

I.7.2. Funciile TEXT pentru stringuri I.7.2.1. Asc(string) ntoarce o valoare de tip Integer, n intervalul 0255, care reprezint codul n ASCII (ANSI) a primului caracter din irul de caractere ce se afl n argumentul (parametrul de intrare) func iei. Exemplu. Dim Numar Numar = Asc ("A") ' ntoarce 65.
I-39

Numar = Asc ("a") ' ntoarce 97. Numar = Asc ("Apple") ' ntoarce 65. I.7.2.2. Chr(CodCaracter) ntoarce o valoare de tip string care reprezint caracterul asociat codului caracterului n ASCII (ANSI), introdus ca argument al func iei. Codurile dintre 0-31 au ca corespondent n ASCII caractere netipribile, care ns pot s determine anumite ac iuni n timpul afirii. De exemplu: Chr(10) ntoarce caracterul Line Feed (LF) - trecerea pe linie nou; Chr(13) ntoarce Carriage Return (CR) - trecerea la nceput de linie. Intervalul normal pentru parametrul CodCaracter este: 0-255. Exemplu. Dim Caracter Caracter = Chr (65) ' ntoarce A. Caracter = Chr (97) ' ntoarce a. Caracter = Chr (62) ' ntoarce >. Caracter = Chr (37) ' ntoarce %. I.7.2.3. AscB(string); AscW(string); ChrB(CodCh); ChrW(CodCh) Func iile AscB, AscW, ChrB, ChrW in seama c n memorie caracterele sunt codificate pe 2 octe i n standardul UNICODE. Ele consider irul de caractere ca pe un tablou de octe i, n care fiecare caracter ocup doi octe i (byte). Func ia AscB n loc s ntoarc codul pentru primul caracter, ntoarce primul byte, din codul n UNICODE al primului caracter. Func ia AscW ntoarce codul caracterului n UNICODE (pe 2 octe i, n intervalul 02^16). Func ia ChrB n loc s ntoarc un caracter al crui cod (aflat n parametrul func iei) poate fi pe 1 sau 2 bytes, ea va ntoarce ntotdeauna caracterul al crui cod este pe primul byte. Func ia ChrW ntoarce un string care con ine caracterul al crui cod este introdus n argument n standardul UNICODE. Aceste func ii au efect numai pe platformele care accept codul UNICODE. Dac acesta nu este acceptat, atunci ele se comport la fel ca func iile Asc respectiv Chr. Exemplu. Public Sub TestUnicode ()
MsgBox Asc ("A") MsgBox AscB ("A") MsgBox AscW ("A") MsgBox Asc ("") MsgBox AscB ("") MsgBox AscW ("") MsgBox Chr (65) MsgBox ChrB (65) MsgBox ChrW (65) MsgBox Chr (170) MsgBox ChrB (94) MsgBox ChrW (350) ' ntoarce Cod Ascii = 65 ' ntoarce primul byte din Codul Unicode = 65 ' ntoarce Codul Unicode = 65 ' ntoarce Cod Ascii = 170 ' ntoarce primul byte din Codul Unicode = 94 ' ntoarce Codul Unicode = 350 ' ntoarce Caracterul = A ' ntoarce Caracterul = A ' ntoarce Caracterul = A ' ntoarce Caracterul = ' ntoarce Caracterul = ^ ' ntoarce Caracterul =

End Sub Caracterul


Cod ANSI (1 octet) Cod UNICODE (valoare) Cod UNICODE (2 octe i)

A
65 65 65 0

170 350 94 1

Se observ c n codul UNICODE, primele 128 de coduri sunt ca n codul ASCII. I.7.2.4. LCase(string) ntoarce o valoare de tip Variant (String) n care literele mari au fost convertite n litere mici. Restul caracterelor rmn nemodificate.
I-40

Exemplu. Dim Valoare, ValoareMica Valoare = "Nota EXAmen" ' String pentru a fi convertit. ValoareMica = LCase (Valoare) ' ntoarce "nota examen". I.7.2.5. UCase(string) ntoarce o valoare de tip Variant (String) n care literele mici au fost convertite n litere mari. Restul caracterelor rmn nemodificate. Exemplu. Dim Valoare, ValoareMare Valoare = "Nota EXAmen" ' String pentru a fi convertit. ValoareMare = UCase (Valoare) ' ntoarce "NOTA EXAMEN". I.7.2.6. LTrim(string); RTrim(string); Trim(string) ntoarce o valoare de tip Variant (String) care este copia stringului, dar: la func ia LTrim: fr spa iile de nceput; la func ia RTrim: fr spa iile de sfrit; la func ia Trim: fr spa iile din ambele capete. Exemplu. Dim Valoare, Modific Valoare = " <-Trim-> " ' Ini ializeaz stringul. Modific = LTrim(Valoare) ' Modific = "<-Trim-> ". Modific = RTrim(Valoare) ' Modific = " <-Trim->". Modific = LTrim(RTrim(Valoare)) ' Modific = "<-Trim->". ' Utiliznd func ia Trim se ob ine acelai rezultat. Modific = Trim(Valoare)' Modific = "<-Trim->" I.7.2.7. Len(String | NumeVariabila) ntoarce o valoare de tip Long cuprinznd: dac argumentul este un string, cte caractere are; dac argumentul este o variabil, cte caractere pot s fie introduse n ea. Dac argumentul este NULL, func ia va ntoarce tot NULL; aceast regul, aa cum am mai amintit, este comun i celorlalte func ii. Unul (i numai unul) din cele dou argumente posibile trebuie specificat. Se poate utiliza func ia LenB, care ine cont de reprezentarea n memorie n UNICODE a stringului. n loc s ntoarc numrul de caractere dintr-un string, LenB ntoarce numrul de bytes (octe i) utiliza i pentru a reprezenta acel string. Exemplu. Type CustomerRecord ' Definete tipul de date dorit de utilizator. ID As Integer 'Aceast defini ie este la nivelul modului de cod Name As String * 10 Address As String * 30 End Type '-----------------------------Dim Customer As CustomerRecord ' Declararea variabilelor. Dim MyInt As Integer, MyBan As Currency Dim MyString, MyLen MyString = "Hello World" ' Ini ializeaz variabila. MyLen = Len(MyString) ' ntoarce 11. MyLen = Len(Customer) ' ntoarce 42. MyLen = Len(MyInt) ' ntoarce 2. MyLen = Len(MyBan) ' ntoarce 8. I.7.2.8. Left(string, lungime) ntoarce un sub-ir de caractere din partea stng a stringului al cror numr este stabilit de lungime. Lungimea este o expresie numeric indicnd cte caractere se vor ntoarce. Dac:
I-41

Lungimea = 0 se ntoarce un string de lungime 0 cunoscut cu numele de ir vid (""). Lungimea >= Len(string) se ntoarce ntregul string dac lungimea este mai mare dect numrul de caractere din string. Pentru a determina numrul de caractere dintr-un string se va utiliza func ia Len. Exemplu. Dim Sir, Subsir Sir = "Nota examen" ' Definete stringul. Subsir = Left(Sir, 1) ' ntoarce "N". Subsir = Left(Sir, 7) ' ntoarce "Nota ex". Subsir = Left(Sir, Len(Sir)-2) ' ntoarce "Nota exam". Subsir = Left("Sir",1) ' ntoarce "S" A se face distinc ie ntre variabila Sir care este ncrcat cu valoarea "Nota examen" i stringul "Sir" care este scris ntre ghilimele, el fiind astfel tratat ca o valoare de tip String. I.7.2.9. Right(string, lungime) ntoarce un sub-ir de caractere din partea dreapt a stringului al cror numr este stabilit de lungime (vezi explica ia anterioar). Exemplu. Dim Sir, Subsir Sir = "Nota examen" ' Definete stringul. Subsir = Right(Sir, 1) ' ntoarce "n" (caracterul de la final)) Subsir = Right(Sir, 8) ' ntoarce "a examen". Subsir = Right(Sir, Len(Sir)-2) ' ntoarce "ta examen". Subsir = Right("Sir",1) ' Intoarce "r" (vezi observa ie func ia left) I.7.2.10. Mid(string, start [,lungime]) ntoarce o valoare de tip Variant (String) cuprinznd un numr specificat de caractere dintr-un string. Parametrii reprezint: string (obligatoriu). Expresie string din care sunt ntoarse caractere. Dac stringul con ine NULL, atunci NULL se va ntoarce. start (obligatoriu). Este de tip Long. Reprezint pozi ia caracterului din string de la care ncepe partea ce va fi preluat. Dac pozi ia este mai mare dect numrul de caractere din string, Mid va ntoarce un string vid ("") de lungime 0. Numerotarea caracterelor ncepe de la 1. lungime (op ional); Este de tip Variant (Long). Reprezint numrul de caractere ce vor fi ntoarse. Dac lipsete sau dac este mai mare dect numrul maxim de caractere care mai sunt pn la sfritul stringului (inclusiv caracterul de nceput), vor fi ntoarse toate caracterele de la pozi ia de start pn la sfrit. Determinarea numrului de caractere din string se face cu func ia Len. Exemplu. Dim SirPrincipal, SubSir1, SubSir2, SubSir3 SirPrincipal = "Universitatea din Pitesti" ' Creeaz stringul. SubSir1 = Mid(SirPrincipal, 1, 13) ' ntoarce "Universitatea". SubSir2 = Mid(SirPrincipal, 19, 7) ' ntoarce "Pitesti". SubSir3 = Mid(SirPrincipal, 15) ' ntoarce "din Pitesti". Mid poate fi folosit i n partea stng a unei instruc iuni de atribuire, caz n care va nlocui din string subirul specificat, cu stringul specificat de expresia din dreapta instruc iunii, dar n aa fel nct s nu se modifice lungimea irului de caractere. Aceast facilitate nu este implementat i la func iile Left sau Right. Exemplu. Public Sub TestMid () Dim S As String S = "123456789" Mid(S, 4, 2) = "A" MsgBox S ' Afieaz 123A56789 Mid(S, 4, 2) = "AB" MsgBox S ' Afieaz 123AB6789
I-42

Mid(S, 4, 2) = "ABC" MsgBox S ' Afieaz 123AB6789 End Sub I.7.2.11. InStr([start,]string1,string2[,compare]) ntoarce o valoare de tip Variant (Long) reprezentnd pozi ia primei apari ii a string2 n string1. start (op ional). Expresie numeric care stabilete pozi ia de nceput pentru fiecare cutare. Dac este omis, cutarea ncepe de la pozi ia primului caracter. Argumentul este obligatoriu dac se specific o compara ie. string1 (obligatoriu). irul de caractere n care se va face cutarea. string2 (obligatoriu). irul de caractere care este cutat. compare (op ional). Prezint modalitatea n care se poate face compararea a dou stringuri. Poate fi 0, 1, sau 2. 0 implicit comparare binar, senzitiv; 1 comparare textual, ne-senzitiv, adic fr s se in cont de caracterele mari sau mici; 2 comparare bazat pe informa iile din baza de date; dac parametrul compare lipsete, atunci setarea Option Compare din modulul de cod determin tipul compara iei. Dac nu se gsete irul specificat se ntoarce valoarea 0. Dac unul din iruri este NULL, atunci NULL se ntoarce. Exemplu. Dim Sir, SirCautat, Pozitie Sir = "Popescu Panait" ' String n care se caut. SirCautat = "P" ' Se caut "P". 'Urmtoarele 4 instruc iuni ncep cercetarea de la pozi ia 4 Pozitie = Instr (4, Sir, SirCautat, 1) ' Compara ie textual. ntoarce 9. Pozitie = Instr (4, Sir, "P", 1) ' Compara ie textual. ntoarce 9. Pozitie = Instr (4, Sir, "p", 1) ' Compara ie textual. ntoarce 9. Pozitie = Instr (4, Sir, "p", 0) ' Compara ie binar. ntoarce 0. Pozitie = Instr (1, Sir, "W") ' Implicit compara ia e binar _ (lipsete ultimul argument).ntoarce 0. Exemplu. Private Sub cmdInstr_Click () Debug.Print InStr ("Alison Balter", "Balter") ' ntoarce 8 Debug.Print InStr ("Hello", "1") ' ntoarce 3 End Sub I.7.2.12. String(numr,caracter) ntoarce un ir de caractere, care con ine de numr de ori caracterul specificat. Dac n loc de caracter este un numr N caracterul multiplicat va fi Chr(N). Dac N>255 se va folosi Chr(N Mod 256). Dac al doilea argument con ine un ir de mai multe caractere se va multiplica primul. Exemplu. Dim MyString MyString = String(5, "*") ' ntoarce "*****" MyString = String(5, 42) ' ntoarce "*****" codul Ascii al lui * este 42 MyString = String(10, "ABC") ' ntoarce "AAAAAAAAAA". I.7.2.13. Space(numr) ntoarce un ir de caractere care con ine de numr de ori caracterul spa iu. Exemplu. Dim MyString MyString = Space(8) ' ntoarce un string cu 8 spa ii MyString = "Hello" & Space(10) & "World" ' Insereaz 10 spa ii _ ntre cele dou cuvinte.

I-43

I.7.2.14. Format(expresie[,format]) Func ia Format transform o expresie ntr-un ir de caractere care respect un ablon (format). Expresie este expresia pe care dori i s o formata i. Format (op ional) reprezint tipul de format, ablon, pe care dori i s l aplica i. El este ori un nume valid de format (de ex. "Long Time" sau "hh:mm:ss AMPM") ori un format creat (definit) de utilizator. Exemplu. Private Sub cmdFormat_Click () Dim MyTime, MyDate, MyStr MyTime = #5:04:23 PM# MyDate = #1/27/93# ' Se vor folosi i urmtoarele func ii care ntorc timpul i data _ curent a sistemului de calcul: ' NOW () =ntoarce data i timpul ' TIME () =ntoarce timpul ' DATE () =ntoarce data MyStr = Format(Time (), "Long Time") MsgBox MyStr ' Afieaz timpul curent al sistemului de calcul, n _ formatul definit n Windows pentru "Long Time" MyStr = Format(Date, "Long Date") MsgBox MyStr ' Afieaz data curent a sistemului de calcul, n _ formatul definit n Windows pentru "Long Date" MyStr = Format(MyTime, "h:m:s") ' ntoarce "17:4:23". MsgBox MyStr MyStr = Format(MyTime, "hh:mm:ss AMPM") ' ntoarce _ "05:04:23 PM". MsgBox MyStr MyStr = Format(MyDate, "dddd, mmm d yyyy") ' ntoarce _ "Miercuri, Ian 27 1993". MsgBox MyStr ' Dac parametrul format lipsete se va ntoarce un string. MyStr = Format(23) ' ntoarce "23". MsgBox MyStr ' Formate definite de utilizator. Se folosesc n continuare urmtoarele _ caractere pentru format: _ # ntoarce cifra dac exist. Dac nu exist se ntoarce "blanc" _ 0 ntoarce cifra dac exist. Dac nu exist se ntoarce 0 _ , ntoarce separatorul de grupe de cifre (n sistemul romnesc,_ virgula sau american, punctul) definit n Windows (System settings). _ . ntoarce semnul pentru punctul zecimal definit n Windows _ % ntoarce n procente MyStr = Format(5459.4, "##, ##0.00") ' ntoarce "5,459.40" - _ System settings n Windows este U.S. MsgBox MyStr MyStr = Format(334.9, "###0.00") ' ntoarce "334.90". MsgBox MyStr MyStr = Format(5, "0.00%") ' ntoarce "500.00%". MsgBox MyStr ' Formate definite de utilizator. Se folosesc n continuare urmtoarele _ caractere pentru format: ' < ntoarce stringul cu litere mici ' > ntoarce stringul cu litere mari MyStr = Format("HELLO", "<") ' ntoarce "hello". MsgBox MyStr MyStr = Format("This is it", ">") ' ntoarce "THIS IS IT". MsgBox MyStr MsgBox Format(50, "Currency") '50.00 LEI Afieaz n sistemul _ de valut definit n Windows (System settings) MsgBox Format(Now(), "Short Date") ' 8/5/95 Afieaz n _ formatul definit pentru "dat scurt" MsgBox Format(Now(), "DDDD") 'Afieaz cuvntul pentru zi MsgBox Format(Now(), "DDD") 'Afieaz ziua prescurtat (pe 2, 3 _ caractere) MsgBox Format(Now(), "YYYY") 'Afieaz anul din patru cifre End Sub
I-44

I.7.3. Funcii pentru tablouri (array) - UBound i LBound UBound (arrayname[,dimension]) LBound (arrayname[,dimension]) ntorc o valoare de tip Long, care va con ine, pentru o anumit dimensiune a unui tablou: Pentru UBound: valoarea indicelui celui mai mare disponibil (marginea superioar). Pentru LBound: valoarea indicelui celui mai mic disponibil (marginea inferioar). Sintaxa celor dou func ii cuprind: arrayname (obligatoriu). Denumirea variabilei care definete tabloul. dimension (op ional). Este de tip Variant (Long). Indic dimensiunea a crei margine (superioar sau inferioar) este ntoars. Se utilizeaz 1 pentru prima dimensiune, 2 pentru a doua etc. Dac lipsete, automat va fi 1. Func ia UBound se utilizeaz mpreun cu func ia LBound pentru a determina mrimea unui tablou, i anume: LBound pentru a gsi cea mai joas valoare a dimensiunii unui tablou. UBound pentru a gsi cea mai mare valoare a dimensiunii unui tablou. Exemplu. Pentru tabloul cu dimensiunile: Dim A(1 To 100, 0 To 3, -3 To 4) UBound i LBound ntorc urmtoarele valori: Func ia Parametrii Valoarea ntoars
UBound (A, 1) (A, 2) (A, 3) (A, 1) (A, 2) (A, 3) 100 3 4 1 0 3

LBound

Marginea cea mai de jos, implicit, pentru orice dimensiune a unui tablou creat prin declara ie (Dim, Private, Public, ReDim sau Static), este 0 sau 1. Ea depinde de setarea declara iei Option Base (de obicei 0). Excep ie. Baza unui tablou creat cu func ia Array este 0, ea nefiind afectat de Option Base. Tablourile pentru care dimensiunile sunt setate folosind To n declara iile Dim, Private, Public, ReDim sau Static pot lua orice valoare ntreag ca fiind marginea cea mai de jos (cel mai mic indice). I.7.4. Funcii de conversie I.7.4.1. Str(Numr) Transform un numr ntr-un ir de caractere. Numr argumentul func iei, de tip Long, va con ine o expresie numeric ce va fi convertit ntr-un ir de caractere. Dup conversie, la nceputul stringului va fi un spa iu pentru numerele pozitive sau semnul () pentru numerele negative. Punctul zecimal va fi reprezentat ntotdeauna de semnul punct(.), indiferent de cum este setat acesta n Windows (ca punct sau ca virgul). Pentru transformarea numerelor n stringuri, cu folosirea altor reguli de prezentare, se folosete func ia Format. Exemplu. Dim MyString MyString = Str(459) ' ntoarce "459". MyString = Str(-459.65) ' ntoarce "-459.65". MyString = Str(459.001) ' ntoarce " 459.001". I.7.4.2. Val(string) ntoarce numrul con inut n string, ca pe o valoare numeric de tipul cel mai apropiat reprezentrii valorii respective. Func ia Val, n momentul n care ntlnete un caracter care nu poate face parte din reprezentarea unui numr, oprete inspec ia i face conversia numai pn la acest caracter. Printre caracterele care nu sunt recunoscute de func ia Val, sunt i virgula (,) sau semnul dolar ($).
I-45

&O i &H, sunt considerate ca rdcin pentru numere n reprezentarea octal, respectiv hexazecimal. Spa iile, tab-ul i LF nu se iau n considerare (se sar). Punctul zecimal va fi reprezentat ntotdeauna de semnul punct (.). Exemplu. Dim MyValue MyValue = Val("2457") ' ntoarce 2457. MyValue = Val(" 2 45 7") ' ntoarce 2457. MyValue = Val("24 and 57") ' ntoarce 24. MyValue = Val(" 1615 198th Street N. E.") ' ntoarce 1615198 I.7.5. Funcii pentru mesaje I.7.5.1. MsgBox(prompt[,buttons][,title]) Afieaz un mesaj ntr-o csu de dialog, ateapt utilizatorul s apese un buton i ntoarce o valoare de tip Integer care indic codul butonului apsat. Sintaxa func iei MsgBox cuprinde urmtoarele argumente: Prompt (obligatoriu). Expresie de tip string afiat ca mesaj n caseta de dialog. Lungimea sa maxim este de aproximativ 1024 caractere, depinznd de mrimea caracterelor folosite. Dac promptul este compus din mai mult de un rnd, se pot separa liniile utiliznd un caracter CR=Chr(13), un caracter LF=Chr(10), sau o combina ie (Chr(13) & Chr(10) ) dup fiecare rnd. n VBA, exist definit constanta de tip string: vbCr=Chr(13) & Chr(10) Buttons (op ional - implicit este 0). Expresie numeric care este suma valorilor reprezentnd patru caracteristici ale csu ei de mesaj i anume: ce butoane se afieaz (OK, Cancel, Yes, No, Retry, Ignore); care este butonul care se va considera implicit; ce pictogram se afieaz; fa de ce este modal caseta de mesaj: aplica ie sau sistem (nu se poate iei din aceasta n aplica ie/ sistem pn nu se nchide). Setrile pentru butoanele argument sunt:
Constanta VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 VbApplicationModal Val 0 1 2 3 4 5 16 32 48 64 0 256 512 768 0 Descrierea Ce reprezint Afieaz numai butonul OK. Afieaz butoanele OK i Cancel. Numrul i tipul Afieaz butoanele Abort, Retry i Ignore. butoanelor afiate Afieaz butoanele Yes, No i Cancel. n caseta de dialog Afieaz butoanele Yes i No. Afieaz butoanele Retry i Cancel. Afieaz pictograma Critical Message. Felul pictogramei Afieaz pictograma Warning Query. utilizate n partea Afieaz pictograma Warning Message din stnga sus Afieaz pictograma Information Message. Primul buton este implicit. Al doilea buton este implicit. Care este butonul implicit Al treilea buton este implicit. Al patrulea buton este implicit.

VbSystemModal

Aplica ie modal utilizatorul trebuie s Dac caseta de text rspund casetei de mesaj nainte de a continua s lucreze n aplica ia curent. este modal la nivelul aplica iei curente sau a Sistem modal toate aplica iile sunt 4096 blocate pn cnd utilizatorul rspunde tuturor taskurilor casetei de mesaj.

Title (op ional). Expresie de tip string afiat pe bara de titlu a casetei de dialog. Dac lipsete, se va plasa pe bara de titlu numele aplica iei. Valoarea ntoars de func ie este:

I-46

Constanta vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo

Valoare 1 2 3 4 5 6 7

Butonul pe care s-a apsat OK Cancel Abort Retry Ignore Yes No

Aceste constante sunt definite n VBA. n consecin , numele acestea pot fi utilizate oriunde n program n locul valorilor respective. MsgBox poate fi utilizat i ca procedur. n acest caz parametrii nu se mai scriu ntre paranteze. n aceast form este folosit numai pentru afiarea unui mesaj. Exemplu. Public Sub TestMsgBox () Dim Rasp As Integer Dim Nr As Integer Const LimInf = -100 Const LimSup = 100 ' Genereaz o valoare aleatoare ntreag ntre LimInf i LimSup Randomize Nr = Int((LimSup - LimInf + 1) * Rnd + LimInf) ' MsgBox folosit ca func ie ' Afieaz mesaj, i introduce n Rasp, butonul apsat de utilizator _ Se observ folosirea lui at ( @ ) ca separator de rnduri!! Rasp = MsgBox("Doriti modificarea semnului numarului " & _ Nr & " extras? @ -Yes=Il face pozitiv; @ -No=Il face negativ; ", _
vbYesNoCancel + vbQuestion + vbDefaultButton3 + vbSystemModal, _

"Exemplu parametrii MsgBox") If Rasp = vbYes Then Nr = Abs(Nr) ElseIf Rasp = vbNo Then Nr = Abs(Nr) * -1 Else 'Cancel - Las numrul neschimbat End If MsgBox "Numarul prelucrat este: " & Nr, vbInformation End Sub 'Se observ mai sus folosirea lui MsgBox ca pe o procedur I.7.5.2. InputBox(prompt[,title][,default][,X][,Y]) Afieaz un mesaj ntr-o caset, ateapt ca utilizatorul s introduc un text sau/i s apese un buton i ntoarce o valoare (string) ce con ine acest text. Sintaxa func iei InputBox cuprinde urmtoarele argumente: Prompt (obligatoriu). Expresie de tip string afiat ca mesaj n caseta de dialog. Lungimea sa maxim este de aproximativ 1024 caractere, depinznd de mrimea caracterelor folosite. Dac promptul este compus din mai mult de un rnd, se pot separa liniile utiliznd un caracter CR(carriage return) Chr(13), un caracter LF(line feed) Chr(10), sau o combina ie (Chr(13) & Chr(10) ) dup fiecare rnd. Title (op ional). Expresie de tip string afiat pe bara de titlu a casetei de dialog. Dac titlul lipsete, se va plasa pe bara de titlu numele aplica iei. Default (op ional). Expresie de tip string afiat n caseta de text ca rspuns implicit dac utilizatorul nu introduce nimic. Dac lipsete, caseta de text va fi afiat goal. X (op ional). Expresie numeric care reprezint, n twips, distan a pe orizontal de la marginea din stnga a casetei de dialog la marginea din stnga a ecranului. Dac lipsete, caseta de dialog este centrat orizontal. Y (op ional). Expresie numeric care reprezint, n twips, distan a pe vertical de la marginea de sus a casetei de dialog la marginea de sus a ecranului. Dac lipsete, caseta de dialog este pozi ionat vertical la aproximativ o treime din distan a pn n subsolul ecranului. Exemplu.
I-47

Urmtorul exemplu utilizeaz InputBox pentru a citi o dat introdus de utilizator i folosirea lui MsgBox i ca func ie i ca procedur (pentru afiarea unor mesaje). Se observ utilizarea semnului @ pentru a delimita diversele pr i ale irului de caractere. Sub CustomMessage () Dim strMsg As String, strInput As String ' Ini ializeaz stringul. strMsg = "Numr n afara intervalului. @ A i introdus un numr _ care este mai mic dect 1 i mai mare ca 10. @ Apsa i OK pentru a _ introduce numrul din nou." ' @ - rol de delimitator de rnduri ' Se cere utilizatorului s introduc o valoare. strInput = InputBox("Introduce i un numr ntre 1 i 10. ") If strInput <> "" Then ' Testeaz ca valoarea intodus s nu fie ir vid Do While (strInput < 0 Or strInput > 10) If MsgBox(strMsg, vbOKCancel, "Error!") = vbOK Then strInput = InputBox("Introduce i numr ntre 1i 10") Else Exit Sub End If Loop ' Afieaz data corect introdus de utilizator. MsgBox "A i introdus numrul" & strInput & ". " Else ' nu s-a introdus nimic Exit Sub End If End Sub I.7.6. Funcii cu tipul: Date/ Time I.7.6.1. DatePart(interval,date) Func ia DatePart ntoarce o parte dintr-o dat, care este specificat de argumentul interval. Argumentul interval, de tip string, poate lua urmtoarele valori:
interval yyyy q m y d Descriere Anul Trimestrul Luna Ziua din an Ziua interval w ww h n s Descriere Ziua din sptmn Sptmna Ora Minute Secunde

Exemplu. Private Sub cmdDatePart_Click () MsgBox DatePart("YYYY", Now) MsgBox DatePart("M", Now) MsgBox DatePart("Q", Now) MsgBox DatePart("Y", Now) End Sub I.7.6.2. DateDiff(interval,date1,date2)

' Afieaz anul curent ' Afieaz numrul lunii curente ' Afieaz nr. trimestrului curent ' Afieaz ziua din anul curent

Func ia DateDiff ntoarce intervalul de timp dintre dou date, deci date2-date1. Unitatea de timp este specificat de argumentul interval. Exemplu. Private SubcmdDateDiff_Click () MsgBox DateDiff("d",Now,#12/31/02#) ' Nr. zile pn la 12/31/02 MsgBox DateDiff("m",Now,#12/31/02#) ' Nr. luni pn la 12/31/02 ' Numrul de ani pn la 12/31/02 MsgBox DateDiff("yyyy",Now,#12/31/02#) ' Numarul trimestrelor pn la 12/31/02 MsgBox DateDiff("q",Now,#12/31/02#) End Sub
I-48

I.7.6.3. DateAdd(interval,number,date) Func ia DateAdd ntoarce rezultatul adugrii sau scderii unei perioade specifice de timp, precizate prin argumentul interval, la o (dintr-o) dat stabilit. Private Sub cmdDateAdd_Click () MsgBox DateAdd("d", 3, Now) ' Ziua de azi plus 3 zile MsgBox DateAdd("m", 3, Now) ' Ziua de azi plus 3 luni MsgBox DateAdd("yyyy", 3, Now) ' Ziua de azi plus 3 ani MsgBox DateAdd("q", 3, Now) ' Ziua de azi plus 3 trimestre End Sub I.7.6.4. Day(date); Month(date); Year(date) ntoarce un Variant (Integer), care con ine ziua sau luna sau anul, din data care se gsete n argumentul func iei. I.7.6.5. Second(date); Minute(date); Hour(date) ntoarce un Variant (Integer), care con ine secunda sau minutul sau ora, din data care se gsete n argumentul func iei. I.7.6.6. Now(); Date(); Time() Now() - ntoarce un Variant (Date), care con ine data i timpul curent (cu care este setat n momentul respectiv sistemul de calcul). Date() - ntoarce un Variant (Date), care con ine data curent (cu care este setat n momentul respectiv sistemul de calcul). Time() - ntoarce un Variant (Date), care con ine timpul curent (cu care este setat n momentul respectiv sistemul de calcul). I.7.6.7. DateSerial(year, month, day) ntoarce un Variant(Date) care va con ine data calendaristic specificat n argumentele: year, month i day. Descrierea argumentelor: Year (obligatoriu); Integer. Numr ntre 100 i 9999 inclusiv, sau expresie numeric. Month (obligatoriu); Integer. Orice expresie numeric. Day (obligatoriu); Integer. Orice expresie numeric. Pentru a specifica o dat, de exemplu December 31, 1991, valoarea fiecrui parametru trebuie s fie valid, adic ziua ntre 1-31 i luna ntre 1-12. Exemplul urmtor va ntoarce o dat, exprimat relativ fa de alt dat. Se observ c opera iile se fac specific pentru zile i luni, inndu-se cont de numrul de zile i luni. Astfel ziua (1 - 1) din luna (8 2), ar trebui s fie 0/6, dar practic dac scdem o zi din 1 iunie, avem 31/Mai. Deci, DateSerial(1990 10, 8 - 2, 1 - 1) va fi: 31/Mai/1980. Dac argumentul pentru an este ntre 0 i 99, se vor considera anii din dou cifre seta i n Windows. Pentru ceilal i ani trebuiesc introduse 4 cifre. Dac un argument este dat n afara intervalului acceptat, atunci se va ntoarce o dat care este practic mrit cu numrul de zile sau luni care depesc valoarea maxim pentru argumentul respectiv. De exemplu MsgBox (DateSerial(1998, 11, 32) ) va afia 2/12/1998. Exemplu. Dim OData As Date OData = DateSerial(1969, 2, 12) 'ntoarce data - February 12, 1969. I.7.6.8. TimeSerial(hour, minute, second) ntoarce un Variant(Date) care va con ine timpul pentru o anumit or, minut i secund, specificat n argumentele: hour, minute, second. Exemplu. Dim Timpul As Date Timpul = TimeSerial(16, 35, 17) 'Reprezentatre timp - 4:35:17 PM

I-49

I.7.7. Funcii: structuri de control I.7.7.1. IIf(condi ie, TruePart, FalsePart) Func ia IIf are o ac iune asemntoare cu a instruc iunii IfThenElse Func ia IIf ntoarce unul din cele dou argumente, TruePart sau FalsePart, n func ie de rezultatul evalurii condi iei ce se gsete n primul argument. Astfel, dac: condi ie = true func ia ntoarce parametrul TruePart; condi ie = false func ia ntoarce parametrul FalsePart. To i cei trei parametri ai func iei sunt obligatorii. TruePart sau FalsePart pot la rndul lor s con in o alt func ie, deci i un alt IIF, ceea ce permite realizarea unor structuri complexe de teste. Exemplu. Function TestIF(TestMe As Integer) as String TestIF = IIf(TestMe > 1000, "Large", "Small") End Function Dac va fi folosit n: MsgBox TestIF(1500) ' afieaz Large MsgBox TestIF(500) ' afieaz Small I.7.7.2. Choose(index, caz-1[,caz-2,... [,caz-n]]) Func ia Choose ntoarce unul din argumentele listei (caz-1 sau caz-2, sau caz_n) n func ie de valoarea pe care o are argumentul index, i anume: dac index = 1 atunci se ntoarce caz-1; dac index = 2 atunci se ntoarce caz-2; dac index = n atunci se ntoarce caz-n. Dac index < 1, sau index > n, atunci Choose ntoarce valoarea Null. Exemplu. Function GetChoice(Ind As Integer) as String GetChoice = Choose(Ind, "Speedy", "United", "Federal") End Function 'La apelul func iei vom avea: MsgBox GetChoice(2) ' afieaz United Dim X As Variant X = GetChoice(5) ' X se va face Null I.7.7.3. Switch(expr-1,value-1[,expr-2,value-2 [,expr-n,value-n]]..]) Aceast func ie are o ac iune asemntoare cu a instruc iunii: IfThenElseIfElse Func ia Switch va evalua n ordine condi iile expr-1, expr-2, expr-n, pn cnd va ob ine o valoare True. n acest moment, cercetarea se oprete, i func ia ntoarce valoarea pereche care se gsete n argumentul value_?. Deci: Dac expr-1 = True atunci se ntoarce value-1, i gata Dac expr-1 = False atunci trece la evaluarea urmtoare Dac expr-2 = True atunci se ntoarce value-2, i gata Dac expr-2 = False atunci trece la evaluarea urmtoare, etc. Dac nici una din expresiile evaluate nu este True, Switch ntoarce Null. Exemplu. Function MatchUp(CityName As String) as String MatchUp = Switch(CityName = "London","English",CityName _ = "Rome", "Italian", CityName = "Paris", "French") End Function 'La apelul func iei vom avea: MsgBox MatchUp("Paris") ' afieaz French

I-50

I.7.8. Funcii de inspecie I.7.8.1. IsNull(expresie) ntoarce o valoare de tip Boolean care indic dac expresia transmis ca parametru de intrare con ine date care nu sunt valide, adic au valoarea Null. Parametrul este de tip Variant i con ine o expresie de tip numeric sau string. Func ia IsNull ntoarce: True dac parametrul are valoarea Null; False dac parametrul nu are valoarea Null; Aa cum am mai artat, dac un termen al expresiei este Null, atunci expresia va fi tot Null, i func ia va ntoarce evident True. Valoarea Null, ndic faptul c un Variant nu con ine date valide. Mai exist nc dou valori speciale, Empty i String vid (gol) care pot fi uor confundate cu Null, ceea ce constituie o eroare. Deci reamintim c: NULL variabil variant n care datele nu sunt valide; EMPTY variabil variant care nu a fost ni ializat; String de lungime 0 (vid, gol) string care nu are nimic n el, adic este "". Exemplu. Dim Valoare, Situatie ' variabile variant Situatie = IsNull(Valoare) ' ntoarce False, deoarece este Empty Valoare = "" Situatie = IsNull(Valoare) ' ntoarce False, deoarece este string vid _ (de lungime 0). Valoare = Null Situatie = IsNull(Valoare) ' ntoarce True. I.7.8.2. IsEmpty(NumeVariabila) ntoarce o valoare de tip Boolean care indic dac o variabil, transmis ca parametru de intrare, este sau nu EMPTY, adic ini ializat. Parametrul este de tip variant i con ine o dat de tip numeric sau string. Func ia IsEmpty ntoarce: True dac variabila NumeVariabila nu este ini ializat, sau a fost introdus n ea direct Empty; False variabila a fost ini ializat (chiar cu Null sau un string vid). Exemplu. Dim Valoare, Situatie ' variabile variant Situatie = IsEmpty(Valoare) ' ntoarce True. Valoare = Null ' Assign Null. Situatie = IsEmpty(Valoare) ' ntoarce False. Valoare = Empty ' Assign Empty. Situatie = IsEmpty(Valoare) ' ntoarce True. I.7.8.3. IsMissing(NumeParametru) IsMissing se folosete ntr-o rutin, pentru a testa dac un parametru op ional al acesteia a fost sau nu introdus n lista parametrilor actuali de la apelarea acestei rutine. Parametrul func iei IsMissing, NumeParametru, este de tip variant. Aceste (NumeParametru) reprezint parametrul formal optional care se testeaz dac a fost introdus sau nu n lista parametrilor actuali la apelul func iei. Func ia IsMissing ntoarce o valoare de tip Boolean, care va avea valoarea TRUE numai dac parametrul op ional testat nu a fost introdus n lista parametrilor actuali, deci el practic lipsete. Exemplu. Apelarea func iei ReturnTwice, definit cu un parametru op ional. Dim ReturnValue ReturnValue = ReturnTwice() ' ntoarce Null. ReturnValue = ReturnTwice(2) ' ntoarce 4. ' Declararea func iei. Function ReturnTwice(Optional A) If IsMissing (A) Then ' Func ia a fost apelat fr parametrul A ReturnTwice = Null Else ' Func ia a fost apelat cu parametrul A
I-51

ReturnTwice = A * 2 End If End Function Func ia IsMissing se aplic numai dac parametrul op ional este de tip variant. Dac parametrul op ional nu este de tip variant ea va ntoarce ntotdeauna (fie c parametrul op ional este sau nu este folosit la apelarea func iei) valoarea FALSE. I.7.8.4. VarType(NumeVariabil) ntoarce un Integer, care precizeaz tipul de date ce se gsete n variabila de tip variant: NumeVariabil (care este argumentul func iei). Reamintim c variabilele de tip variant se caracterizeaz prin faptul c n ele se pot introduce valori de diferite tipuri. Func ia VarType tocmai acest rol are, s ne indice la un moment dat ce tip de date se gsesc ntr-o variabil de tip variant. Rezultatul ntors de func ia VarType:
Constanta vbEmpty vbNull vbInteger vbLong vbSingle vbDouble vbCurrency vbDate vbString Val Descriere
Empty (neini ializat) Null (lipsa datelor valide) Integer Long integer Single-precision Double-precision Currency valoare Date val. de tip Date/Text String

Constanta vbObject vbError vbBoolean vbVariant vbDataObject vbDecimal vbByte vbArray

Val

Descriere
Object Error Boolean valoare Variant (n tablouri) Obiect de acces la date Decimal valoare Byte valoare Array Tablou

0 1 2 3 4 5 6 7 8

9 10 11 12 13 14 17 8192

Constantele fiind definite n VBA, ele pot fi utilizate oriunde n loc de valorile specificate. Exemplu. ' Variabile declarate variant, deoarece lipsete tipul de data Dim IntVar, StrVar, DateVar, MyCheck ' Ini ializarea variabilelor IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69# ' !!! Aa se pot scrie mai multe instruc iuni pe un rnd, separndu-le, _ aa cum se vede, cu dou puncte. MyCheck = VarType(IntVar) ' ntoarce 2. MyCheck = VarType(StrVar) ' ntoarce 8. MyCheck = VarType(DateVar) ' ntoarce 7. I.7.9. Funciile agregate SQL O func ie agregat SQL este specific prin faptul c datele ei de intrare sunt valorile unui cmp dintr-o tabel (cerere) care este legat de obiectul n care se folosete, adic cerere, tabel, formular sau raport , din toate sau o parte din nregistrri. Ele calculeaz expresii al cror domeniu de aplicabilitate este un cmp al tabelei (cererii) care se utilizeaz n obiectul unde sunt folosite. n cazul rapoartelor sau formularelor, func iile agregate SQL se calculeaz pe tabela (cererea) legat la acesta. Func iile agregate SQL au ca argument numele cmpului pe care sunt definite. Totui, n cazul cererilor cu clauz total, n care introducerea func iei agregate SQL se face ntr-o coloan ataat cmpului de defini ie, ele se folosesc fr argument. Func iile agregate SQL sunt: Sum calculeaz suma valorilor pe un cmp; Max, Min ntoarce valoarea maxim/ minim a unui cmp; Avg calculeaz media aritmetic a valorilor unui cmp; Count numrul de nregistrri ale cmpului (diferite de NULL). Dac se dorete s se ia n calcul i cmpurile cu valoarea NULL, atunci se va folosi expresia COUNT(*). Var, VarP, StDev, StDevPcalcule statistice (varian a i devia ia standard).

I-52

Valoarea NULL, n func iile agregate (SQL sau de domeniu), nu se ia n considerare. n celelalte func ii sau opera ii, valoarea NULL a unui termen duce la rezultatul NULL al expresiei, indiferent de felul n care e constituit aceasta. I.7.10. Funciile agregate de domeniu Func iile agregate de domeniu ntorc date de calcul agregate, la fel ca i func iile agregate SQL. Diferen a rezult din faptul c domeniul de defini ie al acestor func ii este reprezentat de un cmp al unei tabele (cereri) din baza de date curent asupra cruia se aplic, eventual, un criteriu de selec ie a nregistrrilor. Domeniul de defini ie este stabilit de valorile ce se gsesc n parametrii (argumentele) func iei. Func iile agregate de domeniu, (au aceiai denumire ca a func iilor agregate SQL, dar cu litera D n fa ) sunt: DSum calculeaz suma valorilor pe un cmp; DMax, Dmin ntoarce valoarea maxim/ minim a unui cmp; DAvg calculeaz media aritmetic a valorilor unui cmp; DCount numrul de nregistrri ale cmpului (diferite de NULL); DVar, DVarP, DStDev, DStDevP calcule statistice (varian a i devia ia standard); DLookUp ntoarce prima valoare ntlnit n domeniul selec ionat. (aceasta nu are echivalent n func iile agregate SQL). Argumentele folosite sunt aceleai n toate aceste func ii i stabilesc, aa cum am mai artat, care este domeniul de defini ie pe care se calculeaz valoarea agregat. DFunc ie (NumeCmp, NumeTabela[, Criteriu]) NumeCmp, NumeTabela sunt stringuri care stabilesc care este cmpul i tabela (cererea) asupra creia se fac calculele agregate. Criteriu este un string prin care se introduce un criteriu de selec ie a nregistrrilor din domeniul specificat de primii doi parametri. Dac nu este prezent acest parametru, se vor lua n calcul datele din cmpul respectiv din toate nregistrrile tabelei specificate. Dac nu se selec ioneaz datorit criteriului nici o nregistrare, func ia ntoarce valoarea NULL. Exemplu. Dim varX As Variant, iNr As Integer, sSir As String ' cazul 1 selec ia nregistrrilor din tabela Studenti cu CodStudent _ avnd valoarea <100 ntoarce dintre acestea valoarea Nume cea mai mare n ordinea de _ sortare. CodStudent (care e folosit n criteriu) este de tip numeric i a fost _ comparat cu un LITERAL varX = DMax ("[Nume]", "Studenti", "[CodStudent]<100") ' cazul 2 selec ia nregistrrilor cu Nume avnd valoarea 'Doru' _ ntoarce dintre acestea valoarea Anul cea mai mic Nume (care e folosit n criteriu) este de tip text i a fost comparat cu un _ LITERAL varX = DMin ("[Anul]", "Studenti", "[Nume]='Doru' ") ' cazul 3 selec ia nregistrrilor cu CodStudent avnd valoarea < cea din _ variabila numeric iNr ntoarce dintre acestea valoarea Nume cea mai mare n ordinea de _ sortare. CodStudent (care e folosit n criteriu) este de tip numeric i a fost _ comparat cu o dat care se gsete ntr-o variabil iNr = 100 varX = DMax ("[Nume]", "Studenti", "[CodStudent]<" & Nr) ' cazul 4 selec ia nregistrrilor cu Nume avnd valoarea ce se gsete _ n variabila string sSir ntoarce dintre acestea valoarea Anul cea mai mic Nume (care e folosit n criteriu) este de tip text i a fost comparat cu o dat care se gsete ntr-o variabil sSir = "Doru" varX = DMin ("[Anul]", "Studenti", "[Nume]='" & sSir & "'") Se observ c n formarea criteriului este foarte important dac criteriul se va aplica pe un cmp numeric sau de tip text. n cazul cnd avem de-a face cu un cmp text valoarea cu care se face compararea trebuie la rndul ei s fie string, deci ncadrat din nou ntre ghilimele (2 ghilimele ntr-un string delimitat
I-53

de ghilimele sunt considerate ca un semn ghilimea) sau un apostrof. Deci "[Nume]='Doru' " este echivalent cu "[Nume]=""Doru"" " Lucrurile se complic n momentul n care criteriul pe care l introducem va compara un cmp cu o valoare ce se afl ntr-o variabil, ca n cazurile 3 i 4. Important este s tim c forma de scriere a criteriului este diferit n func ie de natura cmpului folosit de criteriu, numr sau text. Reamintesc c valoarea NULL, n func iile agregate (de domeniu sau SQL), nu se ia n considerare. n celelalte func ii sau opera ii, valoarea NULL a unui termen duce la rezultatul NULL al expresiei, indiferent de felul n care e constituit aceasta.

I-54

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