Şerban CRIŞCOTĂ

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 utilizării 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 Do…Loop........................................................................I-27 I.5.2.3.b) Structura repetitivă cu contor. Instruc iunea For…Next ...................................................................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(număr); Fix(număr) ...........................................................................................................................I-37 I.7.1.2. Abs(număr)...............................................................................................................................................I-37 I.7.1.3. Sgn(număr)...............................................................................................................................................I-37 I.7.1.4. Sqr(număr) ...............................................................................................................................................I-38 I.7.1.5. Exp(număr) ..............................................................................................................................................I-38 I.7.1.6. Log(număr) ..............................................................................................................................................I-38 I.7.1.7. Rnd [(număr)] ..........................................................................................................................................I-38 I.7.1.8. Sin(număr) ...............................................................................................................................................I-39 I.7.1.9. Cos(număr) ..............................................................................................................................................I-39 I.7.1.10. Tan(număr) ............................................................................................................................................I-39 I.7.1.11. Atn(număr) .............................................................................................................................................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(număr,caracter) ..........................................................................................................................I-43 I.7.2.13. Space(număr) .........................................................................................................................................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(Număr) ...............................................................................................................................................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 cunoştin 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 maşină) şi le execută. Pentru a îl face cât mai accesibil, au existat variante de Basic care au implementat şi comenzi specifice unui sistem de operare, ajungându-se până la a se realiza calculatoare dedicate pentru lucrul sub Basic, fără sisteme de operare. Evident, fiind conceput pe aceste principii, aplica iile realizate nu erau performante, ele neutilizând eficient facilită ile unui sistem de calcul. Treptat, s-a trecut la realizarea unor implementări, tehnic mai performante, prin realizarea de compilatoare pentru Basic sub diferite sisteme de operare, adică a unor module care transformă un fişier cu instruc iuni sursă Basic într-un fişier 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 acelaşi timp şi anume: compilarea programului sursă şi execu ia programului obiect. Firma Microsoft a realizat o versiune de Basic, numită Visual Basic, care pe lângă principiile ini iale s-a dorit a rezolva următoarea problemă – un limbaj de programare universal, unic, care să poată fi folosit atât în aplica iile de sistem (în locul limbajului C) cât şi în cele utilizator, performant atât din punct de vedere al limbajului (implementând conceptele de programare modulară, programare structurată şi programare la nivel de obiect) cât şi din punct de vedere al utilizării tuturor facilită ilor sistemului de operare. Astfel s-au creat, pe baza aceluiaşi 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 aceleaşi î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 utilizării codului VBA în aplicaţii Access Aplica iile mai simple din Access pot fi scrise fără a fi nevoie de vreo instruc iune, eventual folosind comenzile macro. Deşi comenzile macro sunt foarte bune pentru rezolvarea rapidă a unor prelucrări 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. Câteva 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 împăr ire la zero sau ieşirea 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 apărută, fără a mai fi necesară stoparea modulului respectiv sau a aplica iei. • crearea unor structuri ciclice pentru parcurgerea seturilor de înregistrări. Datele unei tabele sau cereri de selec ie se pot manipula ca pe un fişier specific, numit set de înregistrări; • execu ia proceselor tranzac ionale. Acestea reprezintă practic posibilitatea de a efectua actualizările într-un set de înregistrări, global, la un anumit moment. În cazul apari iei unei erori se pot anula toate actualizările din procesul respectiv, setul de înregistrări rămânând nemodificat; • apelarea func iilor Windows API, prin care se pot folosi module ale sistemului de operare;
I-5

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

5. I. − structuri de control. • crearea şi manipularea colec iilor de obiecte. Codul VBA este practic format din rutine. • instruc iuni: − instruc iunea de atribuire. sunt folosite combina ii de litere mari şi mici.6.1. I. adică nu avem de-a face cu un program clasic. • constante. variabile. care rezolvă paşii unui algoritm. • crearea şi manipularea obiectelor (instan e ale claselor de obiecte). − marcarea recunoaşterii unei denumiri date de utilizator (unei variabile. Există şi mai multe trucuri speciale destinate activită ii de programare. • manipularea datelor organizate în fişiere sau baze de date. Printre cele mai utilizate instrumente ale acestui sistem sunt: Editarea rutinelor Sunt oferite facilită ile curente de editare promovate de Microsoft în produsele sale. printre care: − recunoaşterea cuvintelor cheie ale limbajului. spa iu şi liniu ă cu shift ( _ ). • semnul pentru începutul unui comentariu este apostroful ('). procedură sau func ie. aşa cum este Visual Basic sau VBA. atunci trebuie definite şi elemente referitoare la: • referirea obiectelor. Access oferă proiectantului de aplica ii un sistem complex pentru realizarea şi asistarea activită ii de programare în VBA.4. Dacă limbajul de programare este orientat la nivel de obiect. putem spune că programarea în VBA nu este procedurală. cu început şi sfârşit. Limbajele de programare dezvoltate mai pun la dispozi ie programatorilor: • proceduri specifice de tratare a erorilor.) prin refacerea formei introduse la declararea acesteia. • interac iunea cu sistemul de operare. I. • variabile. care sunt executate numai atunci când se produc anumite evenimente. VBA – mediul de dezvoltare şi depanare Odată intrat într-un modul de cod. Elementele generale ale limbajului VBA Definirea unui limbaj de programare (ca şi a VBA) se face în general prin configurarea următoarelor elemente de bază: • tipuri de date. • rutine (proceduri şi func ii). (după anumite conven ii). Dacă la declararea unui obiect.1. rutine etc. • ultima instruc iune executabilă este End Sub | Function. În VBA sistemul nu face deosebire între literele mari şi mici. Deci codul VBA implică realizarea unui programări discontinue. • crearea modulelor de clase de obiecte. atunci când se vor introduce I-7 . − afişarea listelor cu proprietă ile şi metodele obiectelor utilizate. • proceduri de import/ export de obiecte exterioare aplica iei.1. Sfârşitul comentariului este la sfârşitul rândului. • modalită i de verificare şi depanare a erorilor de programare. • semnul de continuare a unui rând este format din două caractere. Structura rutinelor VBA Scrierea rutinelor se face respectând următoarele reguli: • prima instruc iune defineşte tipul rutinei. constante). • la început se pun de obicei (dar nu este obligatoriu) instruc iunile declarative (tipuri de date.În concluzie. • toate instruc iunile au o anumită sintaxă care ine seama de numărul de rânduri pe care sunt scrise. • biblioteci.

Prezen a erorilor de compilare este marcată punctual şi este înso ită de informa iile necesare unei depanări rapide. − Step Into: execu ia tuturor instruc iunilor rutinei (eventual şi a rutinelor apelate) cu oprire după fiecare instruc iune executată. aşa cum am mai arătat. prin plasarea cursorului pe aceasta. programul se poate executa şi cu oprire după fiecare instruc iune sau la un breakpoint. se poate vedea valoarea pe care o are în acel moment o variabilă. − Step Over: execu ia tuturor instruc iunilor rutinei (eventual şi a rutinelor apelate) cu oprire după fiecare instruc iune executată în rutina apelantă. dar fără oprire în rutinele apelate. în felul acesta rutina se poate executa pornind de la oricare dintre instruc iunile sale executabile.denumirile respective cu acelaşi tip de literă. După oprirea programului pe o instruc iune. Debug Windows. Este posibil ca în ieşirea virtuală. − compilarea întregii aplica ii dar fără modificarea codului obiect existent. Acest marcaj se vizualizează printr-un punct de culoare maro. în vederea depanării.Print expresie. Vizualizarea obiectului Debug Windows se poate face la un moment dat prin Ctrl + G sau prin pictograma specifică (vezi figura). sistemul încă din faza de editare semnalează imediat erorile de compilare depistabile în acel moment (de exemplu cele referitoare la corectitudinea sintaxei instruc iunilor). dar fără oprire la instruc iunile din aceasta. Pentru depanare. I-8 . să se introducă toate expresiile provenite de la instruc iunea: Debug. Pentru a marca acest lucru (program în execu ie şi oprit) sistemul va face galben fondul instruc iunii pe care s-a oprit. se foloseşte când se doreşte reluarea execu iei dintr-o rutină apelată. Ştergerea breakpoint-urilor se face printr-un nou click sau prin comanda specifică din meniu (vezi figura). Compilarea rutinelor Există 3 comenzi de compilare (vezi figura): − compilarea întregii aplica ii şi salvarea codului obiect rezultat. dar cu oprire numai în rutinele de rang superior celei din care s-a dat această comandă. sistemul va reface forma ini ială a lor. Se pot introduce în sursă breakpoint-uri prin instruc iunea STOP. Î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 doreşte oprirea execu iei. Urmărirea traseului programului şi evolu iei încărcării cu date a variabilelor. − Step Out: execu ia tuturor instruc iunilor până la sfârşitul rutinei principale (apelante). − compilarea numai a modulelor de cod deschise (încărcate în memorie). În acest fel programatorul va sesiza imediat eventualele greşeli comise la introducerea denumirii obiectelor. Execu ia după o comandă manuală (deci nu ca urmare a producerii unui eveniment) a rutinelor O rutină fără parametri se poate executa direct din modulul de cod. Acest lucru se face: • prin plasarea cursorului pe instruc iunea de la care se doreşte începerea execu iei. • 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) fără oprire. De asemenea.

prin utilizarea grupurilor de comenzi rapide ce se găsesc în dreptul lor. utilizatorul are posibilitatea vizualizării informa iilor de stare din cadrul procedurii apelante. Lansarea unei ac iuni de pe bara Debug se face printr-un click pe op iunea dorită. rutinele apelate rutina în care este Run Stop Comenzi de compilare Cursorul de marcare a instruc iunii care se va executa. I-9 . Pentru o bună în elegere prezentăm 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 urmări grafic modul în care procedura este executată.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.Meniul de execu ie şi depanare al VBA este prezentat mai jos: Bara Visual Basic Resetează toate variabilele globale ale aplica iei. sau în unele cazuri. Punctul de întrerupere(Breakpoint) Va determina oprirea rulării programului acolo unde este întâlnit. Urmărirea execu iei pas cu pas a unei rutine • În Debug Windows | Locals se permite vizualizarea informa iilor de stare în momentul lansării în execu ie a unei rutine. În aceasta se vor regăsi toate afişările făcute cu instrDebug. Afişează fereastra Debug. Lansarea în execu ie a rutinei. Informa iile vizează: − numele variabilelor folosite în cadrul rutinei curente. − valorile acestora în momentul execu iei rutinei. Pas 1. − tipurile de date corespunzătoare variabilelor folosite. În momentul executării unei proceduri apelate. Se recunoaşte prin culoarea maro a instruc iunii şi a unui punct în fa a ei.

Faptul că în panoul Locals. în acest moment 0. valoarea acestora. se ini ializează cu 0. Culoarea galbenă s-a mutat pe instruc iunea C = A + B. 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ă). valoarea variabilei A este tot 0. Apari ia culorii galbene pe instruc iunea Sub arată începutul execu iei rutinei (cursorul a fost plasat ini ial pe această instruc iune). Pas 2. Cursorul (culoarea galbenă) s-a mutat pe instruc iunea A = 10. B şi C este. aceasta nu este executată. arată că în momentul în care culoarea galbenă se găseşte pe o instruc iune. Pas 3. ele fiind de tip Byte şi respectiv Integer. deoarece acestea determină alocarea pentru variabile a spa iului de memorie necesar înainte de execu ia rutinei şi anume în faza de compilare. 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 căreia dorim să-i aflăm valoarea şi I-10 . Se accesează din nou Step Into (sau comanda rapidă F8). deşi A are valoare 10 iar B are valoare 16. Pas 4. Execu ia rutinei a sărit peste cele trei instruc iuni de declarare a variabilelor. aceasta nu este încă executată. deoarece. Valoarea variabilelor A. ceea ce confirmă încă o dată că în momentul în care culoarea galbenă se găseşte pe o instruc iune. Dacă se va deschide fereastra Debug Windows | Locals (Ctrl + G) se va vedea starea elementelor procedurii (nume variabile. în acest moment. ci numai după ce culoarea galbenă a trecut de instruc iunea respectivă ea se execută. Se observă că. − se execută instruc iunea prin folosirea tastei Step Into ( sau F8). Se accesează din nou Step Into (sau comanda rapidă F8).Se vor efectua următoarele două ac iuni: − se plasează cursorul în cadrul procedurii în locul de unde va porni execu ia acesteia (pe primul rând pentru execu ia de la început). suma lor este tot 0. tipul de date corespunzător).

În continuare vom crea un punct de întrerupere cu ajutorul mouse-ului prin click în partea stângă pe bara verticală în dreptul instruc iunii dorite. La o nouă accesare a op iunii RUN se va afişa mesajul specific (Suma = 26) după care execu ia se va încheia. 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). De asemenea dacă pozi ionăm cursorul mouse-ului pe variabila C din cadrul instruc iunii <<MsgBox "Suma=" & C>>.se aşteaptă un interval scurt de timp. 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 (sărind peste instruc iunile A = 10. C = A + B). Pentru demarcarea punctului de întrerupere vom face click pe acesta. Bara verticală Punctul de întrerupere Dacă se operează la lansarea în execu ie a procedurii conform cu pasul nr. semn că execu ia rutinei s-a încheiat. După executarea instruc iunii <<MsgBox "Suma="& C>> va apărea un mesaj (o casetă) cu stringul "Suma=" la care este concatenată valoarea variabilei C (valoarea 26 – calculată anterior). observăm că s-au executat totuşi toate instruc iunile până la punctul de întrerupere. 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. Se accesează din nou Step Into (sau comanda rapidă F8). Se va observa apari ia unei casete imediat sub variabilă în care este specificată valoarea acesteia. Analizând acum valorile variabilelor. I-11 . Pas 5. La o nouă accesare a butonului Step Into se observă dispari ia culorii galbene. se afişează valoarea 26. B = 16. Pas 6.

1. de nume variabilă tipului de date ocupată Mantisa(M) Exponent(E) ini ială Single 4 octe i aprox 7 cifre E-45…E38 0 sngValue (precizie simplă) zecimale Double 8 octe i aprox 14 cifre E-324…E308 0 dValue (precizie dublă) zecimale Datele numerice reale se exprimă sub forma: +/–M * 10^+/–E I. string.147. Tipuri de date Prin dată se în elege orice entitate asupra căreia poate opera calculatorul. Ex.147. caractere sau booleene (logice). care se introduce direct în codul sursă VBA (de exemplu într-o expresie) fiind evaluată exact aşa cum este scrisă. precum şi opera iile ce se pot efectua asupra acestor date.337. din cele prezentate putem afirma că mediul de depanare reprezintă un instrument foarte eficient în determinarea erorilor de execu ie şi a optimizării aplica iilor. –100. de nume variabilă bRaspuns Tipul de date BOOLEAN este compatibil cu tipul de date INTEGER. precum şi posibilitatea de declarare a unor tipuri de date proprii (definite de programator) cu ajutorul instruc iunii Type.203.283. − structurate – o variabilă de acest tip va con ine mai multe valori elementare. Tipuri de date elementare I. dată etc. În memoria calculatorului orice dată apare ca o succesiune de bi i.1. I-12 . 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. I. Date numerice reale Numele Memoria Domeniu Domeniu Valoare Ex.477.483. 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. În cazul limbajelor de nivel înalt se face abstrac ie de detaliile de reprezentare a datelor. dezvoltând conceptul de tip de date.: &O8.2.647 +/– 922.648 +2.767 – 2. Ex. dimensiunea efectivă pe care o ocupă în memorie datele. Ex. VBA pune la dispozi ia programatorului tipuri de date predefinite (standard). 685. La nivelul limbajelor de programare o astfel de interpretare este reprezentată de tipul datelor. numerele reale.2.: 1000.1. &O17.În concluzie.3. &H9. Modul în care pentru o astfel de succesiune se asociază o valoare depinde de interpretarea ce i se dă. În cod maşină datele se reprezintă sub forma unei secven e de cifre binare.2.. I. de tip numeric. cum ar fi cele pentru numerele întregi. I.5808 Numărul de valori 2^8 2^16 2^32 15 cifre şi 4 zecimale Valoarea Ex. − pentru sistemul octal: prefixul &O.2.1.768…+32. 33.1.2. 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. Tipurile de date pot fi: − elementare (simple) – o variabilă de acest tip va con ine o singură valoare. astfel: − pentru sistemul zecimal: numărul respectiv. − pentru sistemul hexazecimal: prefixul &H. Un literal reprezintă o valoare.: &HA1.2. 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.

"). . Dintre acestea primele 32 sunt caractere netipăribile. La ini ializare variabilele de tip string vor avea valoarea şir vid. Literalii string se scriu între ghilimele ("…. totuşi spa iul ocupat de un caracter în memorie este de 2 octe i. deşi în memorie ele sunt în codul UNICODE. astfel: − prima cifră hexazecimală pe primul rând. accente.2. Codul folosit este codul ANSI şi are date în intervalul 0-255. 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 : . vor avea pe primul octet codul ASCII al caracterului iar în al doilea 0. Operatorul pentru concatenarea datelor este & (se poate folosi şi sem.I. cod care ocupă 2 octe i şi care con ine un număr de 2^16 simboluri. litere în alfabete interna ionale etc.nul +). CR – face retur de car (început de rând). I-13 . adică "". Back Space – caracter înapoi. • caracterul cu codul 10. LF – trecerea la rând nou (următor). Aceasta se datorează faptului că memorarea caracterelor se face în codul UNICODE. Bell – semnal sonor. • sistemul de numera ie hexazecimal – pe cele 2 margini.1. Codul ASCII În tabela de mai jos codurile ASCII sunt date în: • sistemul de numera ie zecimal – în celule. − string de lungime fixă. De exemplu: • caracterul cu codul 7. vor avea în al doilea octet 1. Tab – salt la următorul marcaj. Tipul de date STRING – şir de caractere Există două tipuri de date de tip String şi anume: − string de lungime variabilă. • caracterul cu codul 9. La formarea numelor variabilelor de tip string. iar caracterele ANSI cu cod mai mare de 127. De exemplu în memorie caracterele ASCII. < = > ? 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 { | } ~ · ! " # $ % & ' ( ) * + .4. care poate con ine până la 2^31 caractere (aproximativ 2 miliarde). − a doua cifră hexazecimală pe prima coloană. • caracterul cu codul 13. / Deşi ne-am aştepta ca un caracter să ocupe un octet (8 bits) de memorie –codul ANSI are 256 = 2^8 de simboluri (caractere) –. simboluri valutare. se foloseşte de obicei prefixul s. în limbajul Visual Basic. De exemplu sNume. diacriticelor. dar care pot avea efect în afişarea datelor. adică codului ASCII. Următoarele 128 caractere (128-255) corespund caracterelor speciale. Deci. care poate con ine până la 2^16 caractere (aproximativ 64 de mii). Primele 128 caractere (0-127) corespund literelor şi simbolurilor de pe o tastatură US. caracterele se folosesc în codul ANSII (ASCII). înaintea fiecărui caracter. • caracterul cu codul 8.

Exemplu. Implicit un tablou se indexează de la 0. 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. Pentru a stoca cheltuielile pe care le facem în fiecare zi a unui an vom declara o singură variabilă de tip Array.O. I.5. Utilizarea tablourilor se face numai prin referirea fiecărui element în parte (folosind numele tabloului indexat la elementul respectiv). eventual chiar tot array.0 iar ora 12 este 0. Un Array se caracterizează prin 3 elemente dintre care primele două definesc structura: − numărul de dimensiuni. Un Array. poate stoca mai multe date de acelaşi tip în compartimentele (elementele) sale. I.I.2.2.2. deşi se materializează printr-o singură variabilă. decât 365 variabile individuale. De obicei se pune prefixul dt la numele unei variabilele de tip Date. Tipul de date ARRAY – tablou Un Tablou – Array defineşte o mul ime de valori care sunt de acelaşi tip de dată. Numerele negative reprezintă date anterioare celei de 30/Decembrie/1899. − numărul de elemente (celule) ale fiecărei dimensiuni.2. definite de proiectant (utilizator).2. Poate fi orice tip de date. 1993# sau #1 Jan 93#. De exemplu: #January 1. Ora 24 este 0.2. Aceste mecanisme poartă numele de constructori de tipuri şi joacă un rol esen ial în programare.2.5. TYPE – Crearea tipurilor de date definite de utilizator Există posibilitatea să se creeze structuri noi de date. de nume variabilă dtStartDate Literalii date se scriu între diezi (#…. − timpul – în partea din dreapta punctului zecimal. formate din combinări din alte tipuri de date.1. de exemplu o mutare de date dintr-un tablou în altul cu aceeaşi structură se poate face numai prin mutarea separată a tuturor elementelor tabloului. folosindu-se conven ia: − data calendaristică – se află în partea stângă a punctului zecimal. Structura unui asemenea tip poate avea o dimensiune sau mai multe. Windows prin comanda Regional Settings. 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. #). Practic se foloseşte numărul de ordine al primului (implicit 0) şi al ultimului element al fiecărei dimensiuni. Afişarea datelor şi timpului se face conform formatului specificat în S. Declararea unui nou tip de date se face cu instruc iunea TYPE astfel: [Public | Private] Type NumeTip NumeElement1 As type I-14 . Tablourile de octe i constituie o excep ie la ultima afirma ie. prin restrângeri sau combinări ale tipurilor deja definite. Fiecare element din tablou va con ine o singură valoare. Deci în VBA nu se pot efectua opera ii direct cu întreaga structură a tabloului. cu 365 elemente de tip numeric. − tipul de date al elementelor tabloului. Tipuri de date structurate Visual Basic include mecanismele necesare construirii unor tipuri noi.1. Un număr poate fi convertit în tip Date.2.

adică este "". atât ca memorie ocupată cât şi ca timp de execu ie. de nume variabilă vntValue vntNume Variant 22 octe i ca la stringuri Empty (Gol) Valorile EMPTY..Virsta = 21 Doilea = Primul 'se transferă întregul tip de dată Person MsgBox Doilea.NumeElement2 As type . La prima introducere a unei date într-o variabilă de tip variant. I-15 .2. _ varsta=" & Doilea. Tipul de date OBJECT – va fi prezentat în următorul capitol. totuşi folosirea variabilelor de tip variant diminuează performan ele programului. − NULL – reprezintă o valoare pe care o ia o variabilă variant în care datele nu sunt valide. I.Prenume & ". Aceasta înseamnă că variabila a fost declarată dar nu a fost încă introdusă o valoare în ea. NULL. Tipul de date V ARI ANT Acest tip de date. − String de lungime 0 (vid. − pentru fiecare element în parte (folosind numele elementului respectiv calificat – cu semnul punct – cu numele variabilei). STRING VID − EMPTY – reprezintă valoarea pe care o are o variabilă variant care nu este ini ializată.Nume = "Ionescu" 'se folosesc elementele tipului Person Primul. Exemplu. End Type Referirea la variabilele de un tip definit de utilizator. Doilea As Person'se declară 2 var. este deosebit de puternic fiind compatibil cu: − toate tipurile numerice.Nume & " " & Doilea. Numele Spa iul de tipului de date memorare Variant 16 octe i (numere) (string) Domeniu ca la numeric Valoarea ini ială Empty (Gol) Ex. 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. de tip Person Primul.Virsta & " ani"' afişează şi valoriea unei expresie End Sub Caracterul (') se foloseşte pentru marcarea comentariilor. − tipul String. specific limbajului Visual Basic. − tipul Object.3. gol) – string care nu con ine nici o valoare (nici un caracter).Prenume = "Ion" Primul.. se poate face: − pentru întreaga structură (folosind numele variabilei). Caracterele ( _ ) se folosesc pentru continuarea unei instruc iuni pe următorul rând. Deşi uşurează munca de programare. Declararea unui tip de date nu se poate face decât la nivelul unui modul de cod. aceasta se va configura în conformitate cu tipul respectiv de date. − tipul Date. Deci nu se pot declara tipuri de date la nivelul unei rutine.

2. Celelalte variabile sunt declarate de tipul Variant (tipul implicit al unei variabile este variant). iAge. Object. 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). Dim Nume As String Dim Virsta As Integer Dim Anul As Variant ~ Dim Nume$ ~ Dim Virsta% ~ Dim Anul I. se obişnuieşte să se pună un prefix conven ional la nume. dar este obligatorie folosirea explicită a tipului de dată pentru fiecare variabilă.3. Forma acestei instruc iuni este: Dim NumeVariabilă As TipulDeDateAlVariabilei • Numele variabilei respectă regulile folosite la formarea numelor. • Se pot declara mai multe variabile pe acelaşi rând. Când Option Explicit este plasat într-un modul de cod. În rest. toate variabilele din interiorul acestuia trebuie să fie declarate înainte de folosire. Variabile Variabilele sunt nume de loca ii de memorie care con in valori de un anumit tip. intY As Integer. folosesc o asemenea notare pentru a declara toate variabilele de pe aceeaşi linie de acelaşi tip. după care apar şi dispar în func ie de domeniul lor de vizibilitate. • O variabilă poate fi declarată specificându-se următoarele tipuri de date: Byte. Integer. Single.3. 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. String (pentru variabile de lungime variabilă). dar nu este recomandabil. Double. Dim intX As Integer. separate prin virgulă. Dim iCounter. Declararea variabilelor Declararea variabilelor se face de obicei cu instruc iunea declarativă DIM. la sfârşitul numelui variabilei. String * length (pentru variabile de lungime fixă). deoarece unele limbaje de programare (PASCAL).3. ele sunt invizibile şi nu se pot referi. Următoarele declara ii sunt echivalente. fără a se specifica tipul pentru fiecare variabilă declarată ca în exemplul de mai jos. intZ As Integer O greşeală obişnuită este declararea mai multor variabile pe aceeaşi linie. Date. (Vezi exemplele de nume de variabile din modulul Tipuri de date). Variabilele se caracterizează prin: • Domeniul de vizibilitate (valabilitate): se referă la momentul când acestea apar şi dispar din 'codul sursă'. Exemplu. I-16 .I.3.3. Modul şi locul în care se declară o variabilă determină domeniul de vizibilitate. I. Exemplu. li se pot atribui valori de un anumit tip şi pot fi folosite în cadrul instruc iunilor. În practica programării. sau a unui tip de date definit cu declara ia Type. folosindu-se în loc de specifica ia As. în declara ia Dim. Variabilele apar atunci când sunt declarate prima dată. Următoarele subiecte analizate vă vor face să în elege i mai bine declararea variabilelor în limbajul Visual Basic. Această eroare este foarte periculoasă. anumite caractere speciale. ce se modifică în timpul execu iei programului. numai ultima variabilă este declarată ca o variabilă de tip Integer (întreg). iWeight As Integer În acest caz. • Durata de via ă (valabilitate): se referă la timpul cât variabila ocupă loc în memorie. Când se creează variabile trebuie avut în vedere mai multe lucruri. Nespecificarea unui tip de date duce la crearea unor variabile de tip Variant. durata de via ă şi alte caracteristici ale acesteia. I. Long. Caractere folosite ca Type-declaration Anumite variabile mai pot fi create automat de un anumit tip.1. Currency. În momentul când variabilele apar (devin vizibile). denumite caractere de tip. în caz contrar producându-se o eroare de compilare. sau Variant. care să indice tipul de date al variabilei.

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

are domeniul de valabilitate) de oriunde din aplica ie. Deoarece variabilele locale sunt ini ializate la fiecare apel al codului. Exemplu.3. se va afişa numărul 1. care ilustrează folosirea variabilelor statice: Private Sub cmdLocal_Click () Static iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dată când acest cod este executat. la a treia se va afişa 3 etc. I-18 . valori de configurare pentru mediul de lucru şi alte date care trebuie să fie vizibile pentru întreaga aplica ie. Această metodă face codul mai modular şi mai uşor de depanat. variabila cu numele iCounter este incrementată şi re inută. Private Sub cmdPublic_Click () piCounter = 50 Msgbox piCounter End Sub Se poate folosi cuvântul cheie PRIVATE. Variabile Statice Variabile statice se pot declara numai în rutine. după ce face 50 variabila publică piCounter. Exemplul următor ilustrează diferen a dintre variabilele locale şi cele statice. Variabile Publice şi Private O variabilă publică poate fi accesată (este vizibilă.6. la următoarea apelare nu va mai fi definită şi va avea deci valoarea anterioară apelului. Variabilele publice se folosesc de obicei ca identificatori de acces. Declara iile variabilelor publice trebuie să fie plasate în sec iunea General Declarations a modulului general de cod. Rutina următoare. I. Pentru declararea variabilelor publice se foloseşte cuvântul cheie PUBLIC. instruc iunea declarativă Dim defineşte variabila iCounter şi o ini ializează cu 0. Ea este pu in diferită fa ă de următoarea secven ă de cod. nu mai este distrusă la terminarea rutinei. Private MyName As String Cuvântul cheie DIM este echivalent cu PRIVATE atunci când se folosesc la declararea variabilelor în modulele de cod. Exemplu. Variabilele statice au proprietatea de a-şi păstra valoarea între două apeluri ale rutinei în care au fost declarate. în loc de cuvântul cheie DIM. Practic o variabilă statică este definită numai la primul apel al rutinei în care a fost declarată. ataşată evenimentului Click al butonului de comandă cmdPublic.− încerca i să evita i (atunci când este posibil) utilizarea variabilelor globale. prin folosirea cuvântului cheie STATIC. folosind prefixul p la numele acesteia. Este totuşi indicată folosirea expresiei private. pentru a declara variabile private în sec iunea de declara ii generale a modulului de cod. I. fiind statică. pentru a face codul mai lizibil (mai uşor de citit şi mai rapid de interpretat). adică variabile care nu sunt vizibile decât de rutinele apar inând modulului respectiv de cod. de fiecare dată când executa i această procedură. Deoarece. o afişează. la a doua se va afişa 2.5.3. conven ional se indică tipul public al unei variabile. O declara ie de variabilă publică arată aşa: Option Explicit Public piCounter As Integer De obicei. Private Sub cmdLocal_Click () Dim iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dată când acest cod este executat. în loc de DIM. Deci la prima execu ie se va afşa 1. în loc de DIM.

000 bytes). Fără alte instruc iuni speciale. sau Public. este apelată şi dispare (se distruge. ceea ce trebuie să determine o rezervă în folosirea tablourilor de Variant.7. Dim MyIntegerArray (10) As Integer ' Tablou Integer foloseşte _ 22 bytes (11 elemenste * 2 bytes). Static. 99) As Integer ' Tablou Integer foloseşte _ 100 * 100 * 2 bytes (20. o variabilă se creează în momentul în care modulul în care este declarată. modală (globală) sau publică şi să poată fi folosită numai într-o rutină. ]) As TipDeDată Cu J s-a notat marginea de jos a indicelui. Ar trebui să face i tot posibilul ca majoritatea variabilelor din codul dumneavoastră să fie locale.3. Declararea şi folosirea variabilelor ARRAY Variabilele Array (tablou) se declară la fel ca orice altă variabilă folosindu-se instruc iunile declarative Dim. Public şi de locul unde acesta e plasat. N3…. 99) ' Tablou Variant – cel pu in _ 160. 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. iar cu N marginea de sus a indicelui. − o variabilă globală. Dim NumeTablou (J1 To N1 [. dacă este introdusă în modulul respectiv de cod. fiind Variant. 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. ]) As TipDeDată Aşa cum se observă. declarată într-un modul de cod al unui formular. la nivelul unui modul de cod sau în toate modulele de cod. timpul cât variabila are alocat spa iu în memorie. Private. aşa cum am mai arătat.. I. declarată într-o procedură eveniment. Dim MyVariantArray (10) ' Tablou Variant – cel pu in _ 176 bytes (11 el. eliberează spa iul de memorie ocupat) în momentul terminării modulului respectiv.8. _ 100 * 100 * 8 bytes (80.3.I. instruc iunea declarativă Option Base 1. 10) As Integer va crea un tabel cu 2 dimensiuni. va fi alocată numai în timpul execu iei procedurii respective (bineîn eles dacă nu este statică). Dim MyDoubleArray (10) As Double ' Tablou Double-precision _ 88 bytes (11 el. declarată într-un modul general de cod va fi alocată în tot timpul execu iei aplica iei.000 bytes). Ea implicit se consideră a avea valoarea 0. În continuare se prezintă ce memorie vor ocupa tablourile. va fi alocată cât timp formularul respectiv va fi în execu ie. Declararea tablourilor cu dimensiuni fixe . Totuşi marginea de jos a indicelui se poate fixa la valoarea 1. determinând ca variabila respectivă să fie locală. Dim MyDoubleArray (99. în sec iunea de declara ii generale. În acest caz. Dim MyVariantArray (10) As Variant ' Tablou Variant – cel pu in _ 176 bytes (11 el. N2 [. J2 To N2 …. Dim MyVariantArray (99. Diferen a fa ă de declararea unei variabile simple este aceea că la tablouri.9) şi al doilea indice cu valori între (0 10). * 16 bytes). şi tablourile declarate fără tip sunt de tip Variant. Astfel: − o variabilă locală. Declara ia Dim MyArray (9.000 bytes (100 * 100 * 16 bytes).statice Dim NumeTablou (N1 [. cu 10 şi respectiv 11 elemente. Private. 99) As Double ' Tablou Double-precision. Se pot declara tablouri specificându-se explicit şi marginea de jos a indicelui. în care toate cele 110 elemente (celule) sunt de tip Integer. I-19 . cu primul indice cu valori între (0 . Ca orice declara ie care nu specifică tipul. Durata de via ă sau valabilitate a variabilelor reprezintă. * 8 bytes). marginea de jos a indicelui a fost omisă. Dim MyIntegerArray (99. între paranteze. Exemplu. Variabile – domeniul şi durata de valabilitate Aşa cum am arătat. − o variabilă publică. domeniul de valabilitate sau vizibilitate a variabilelor este determinat de cuvântul utilizat în declararea variabilei: Dim. deoarece acestea sunt ferite de o eventuală modificare (accidentală) de către alte rutine. * 16 bytes). Exemplu.

Sub FillArrayMulti () Dim intI As Integer. aşa cum am mai arătat. care se poate plasa oriunde în cod după declararea unui tablou dinamic. şi anume: − un tablou de octe i se poate referi şi direct. Pentru în elegerea acestei secven e trebuie studiate mai întâi. Exemplu. permi ând transferurile directe de date între tablourile de octe i şi stringuri. eventual putându-se schimba şi tipul de date.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. Private sau Public. Exemplu. mărind cu 10 numărul lui de elemente şi va păstra datele ce erau în tablou înainte de executarea instruc iunii. Exemplu. Public Sub TestMatOcteti () Dim Caracter As String. Pentru a se evita acest lucru se poate folosi clauza Preserve. Dim NumeTablou () As TipDeDată Exemplu. − func ia Ubound întoarce indicele superior maxim al unui tablou. 1 To 10) As Single For intI = 1 To 5 For intJ = 1 To 10 sngMulti (intI. Dim sngArray () As Single Cu instruc iunea executabilă ReDim (cu o structură asemănătoare cu cea a lui Dim). MegBox " Tablou ( " & intI & ". intJ As Integer Dim sngMulti (1 To 5. cu Static. Utilizarea tablourilor Un tablou poate fi utilizat ca orice variabilă simplă de tipul respectiv. intJ) = intI * intJ ' indroduce în fiecare element _ produsul indicilor elementului. dar mai are o proprietate care îl face util în lucrul cu stringuri. Sir As String * 3 Dim X() As Byte ' Tablou de octe i. fără indici. în capitolul despre func iile text. intJ) Next intJ Next intI End Sub Tablouri de octe i Un tablou de octe i este un tablou dinamic de tipul BYTE. precizările făcute pentru codul UNICODE. Trebuie remarcat că în această opera ie fiecare caracter al strigului va ocupa 2 elemente din tabloul de octe i. El poate fi utilizat ca orice tablou dinamic. " & intJ & " ) = " & sngMulti (intI. dar nu modifică tipul de date al elementelor şi provoacă pierderea datelor din tablou. fără însă a se specifica nimic între paranteze. Referirea unui element al tabloului se face prin numele tabloului. numai prin numele lui. Exemplu. Dim. Un tablou dinamic se declară la fel. se va redimensiona în momentul execu iei acesteia tabloul cu noile dimensiuni. Instruc iunea ReDim provoacă pierderea datelor din tabloul pe care îl redimensionăm. ' afişează indicii elementului şi valoarea din acesta. ReDim Preserve sngArray(UBound(sngArray)+10) − va redimensiona tabloul. deoarece. tablourile dinamice pot să-şi modifice dimensiunile în timpul execu iei. ReDim sngArray(11) redimensionează tabloul. Folosirea acestei clauze nu permite însă modificarea numărului de dimensiuni sau a marginii de jos ai indecşilor. va avea 6 elemente deoarece pentru un caracter din _ string sunt necesare 2 elemente de 1 octet ReDim X(5) I-20 . urmat între paranteze de indicele (indicii) elementului respectiv. În felul acesta el devine compatibil cu tipul de date string. caracterele sunt memorate în UNICODE (deci pe 2 octe i).

CodAnsii= 65.Print "Octetul " & i & " = " & X(i) MsgBox "Octetul " & i & " = " & X(i) Next i End Sub După execu ie se va găsi afişat în Debug. După declarare. func ia MID Caracter = Mid (Sir. j. CodAnsii= " & Asc(Caracter) & ". Octetul 2= " & X(k+1) ' Ceea ce se afişează cu Debug. CodAnsii= 49.Print se poate vizualiza prin comanda _ View | Debug Window MsgBox "Caracterul = " & Caracter & ". 3 _ necesar pt.0001 0000.Dim k As Integer. CodAnsii= 170.0A (hexazecimal) Atunci aceasta se va găsi în memorie sub forma: (0000. Octetul 1= " & X(k) & ".0000 0101. Octetul 2= " & X(k+1) Next i For i = 0 To 5 Debug. Aceasta se face prin instruc iunea declarativă Const. datele dintr-un string. într-o variabilă de tip tablou de octe i. Octetul 1= 49.1110 0000. CodAnsii= " & Asc(Caracter) & ".4 Debug. 1) ' în "Caracter" se vor introduce caracterele k = 2 * (i)'În K–pozi ia în tablou a primului octet al caracterului:0.binar Memorie -Tabloul X 31 00 41 00 5E 01 6 octe i . 1. se poate atribui unui nume. o valoare. Print: Caracterul = 1.0000. CodUnicode= " & AscW(Caracter) & ". atunci cel mai semnificativ dintre aceştia se găseşte la dreapta. Constante Prin declararea unei constante..hexa Memorie -Tabloul X 49 0 65 0 94 1 6 octe i .0001. CodUnicode= 49. 2. CodUnicode= 65. Octetul 1= 65. Deci dacă într-o variabilă integer se găseşte valoarea: 266 (zecimal) = 0000. Octetul 1= 94. dacă o variabilă nestructurată ocupă mai mul i octe i (de exemplu o variabilă integer ocupă 2 octe i).4. Octetul 1= " & X(k) & ".zecimal I. CodUnicode= 350. Forma instruc iunii declarative CONST este: [Public | Private] Const NumeConstantă [As TipData] = Valoare O constantă se comportă practic ca o variabilă.0001) – deci cu octetul cel mai semnificativ (0000.2. I-21 .zecimal Cod UNICODE 49 65 350 2 octe i/caracter-zecimal Memorie -Tabloul X 0011. i As Integer Sir = "1AŞ" X = Sir For i = 0 To 2 j = i + 1 ' în "J" se va calcula numărul caracterului în string. se observă cum se găseşte în memoria internă.0001) aşezat la dreapta. Caracterele din string ‘1’ ‘A’ ‘Ş’ Cod ANSI 49 65 170 1octet/caracter . o constantă nu îşi mai poate modifica valoarea. care nu se mai poate schimba în timpul execu iei aplica iei. Din tabelul de mai jos. Octetul 2= 0 Caracterul = Ş.1010) (0000.0001 0000. CodUnicode= " & AscW(Caracter) & ". j As Integer.0000 0100. Octetul 2= 0 Caracterul = A.0001 6 octe i . Octetul 2= 1 Octetul 0 = 49 Octetul 1 = 0 Octetul 2 = 65 Octetul 3 = 0 Octetul 4 = 94 Octetul 5 = 1 În memoria internă.Print "Caracterul = " & Caracter & ".1010 (binar) = 01. ini ializată cu o anumită valoare.

etc. sunt realizate prin rutine din bibliotecile de obiecte. adică ordinea în care se execută instruc iunile. De exemplu dacă avem declara iile: Const Ziua = "Miercuri" Const Virsta = 44 atunci prima constantă va fi de tip string. _ conNume="Soare" În exemplul de mai sus primele două constante sunt declarate explicit.). Currency. scriere. Public Const conAge As Integer = 34 ' conAge este o constantă _ Publică. op iunile de compilare (Option Explicit.Regulile aplicate variabilelor privind domeniul şi durata de valabilitate sunt efective şi în cazul constantelor. Option Compare Database.5. I. For. etc. implicit. Integer. scădere. Const. − structurile de control – prin care se determină "traseul" printre instruc iuni. dacă folosim sau nu în fa a cuvântului cheie Const cuvintele cheie Private. ca în exemplul de mai sus. Date. citire. cu valoarea 34. Alte opera ii necesare unei aplica ii (ca de exemplu executarea opera iilor de Input/ Output).). Double. Exemplu. instruc iunile executabile ale limbajelor moderne de programare sunt instruc iunea de atribuire şi instruc iunile prin care se realizează structurile de control. Type etc. Practic. Byte. Public. ci numai nişte indica ii care se dau compilatorului.) − Instruc iuni executabile. în func ie de locul de declarare (în rutină sau sec iunea de declara ii generale a modulului de cod). Instrucţiunea de atribuire Forma acestei instruc iuni este: NumeVariabilă = Expresie I-22 . cu specificarea (dacă este explicită) a tipului pentru fiecare constantă în parte. execu ia instruc iunii presupune ob inerea operanzilor din memoria internă sau din registrele unită ii centrale. De obicei. string. care reprezintă descrierea unei ac iuni pe care o va efectua sistemul de calcul. Integer respectiv Currency. − crearea şi manipularea obiectelor. conWage As Currency = 35000. − constante publice sau private. Do etc.1. interpretate la un moment dat de unitatea centrală a unui sistem de calcul sau de un procesor. care practic nu determină executarea unei ac iuni de către sistemul de calcul. − cu tip implicit. De exemplu instruc iunile de declarare ale tipurilor de date. I. se pot declara mai multe constante pe acelaşi rând. − declararea şi apelarea rutinelor. − instruc iunea de atribuire – prin care se calculează expresii. Long. Single. Const conAge As Integer = 34. − crearea modulelor de clase de obiecte. Instruc iunile unui limbaj de programare sunt de două feluri: − Instruc iuni declarative. Limbajele moderne de programare au un set redus de instruc iuni complexe: − declararea structurilor de date. Deci vom avea: − constante locale sau globale. în care clauza As lipseşte iar tipul va fi determinat de tipul datei cu care se încarcă constanta. compara ie.5. Execu ia unei instruc iuni reprezintă efectuarea opera iei specificate de codul instruc iunii. iar a doua integer. Integer. String. Option Base. Ca şi la variabile. sau Variant. iar a treia. în special privind datele aplica iei (If. func ii şi proceduri disponibile limbajului respectiv de programare. şi anume: Boolean. variabilelor sau constantelor (Dim. formarea rezultatului şi depunerea acestuia într-un registru al unită ii centrale sau în memoria internă. Constantele se pot declara în două moduri şi anume: − cu tip explicit. Ca exemplu de opera ii pe care le face unitatea centrală a sistemului de calcul sunt opera iile de adunare. 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.

stringuri. având valori logice (True. • Operatorii sunt de trei tipuri şi anume: − aritmetici. ("a2a" Like "a#a") = True # [Listă char] Un singur caracter din listă. efectuând automat conversiile între tipuri diferite de date. Totuşi compilatorul încearcă trecerea peste anumite incompatibilită i. [A-R] [!Listă caractere] Un singur char care nu este în listă. a căror rezolvare este evidentă. ) 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. Private Sub TestExpresie () Dim Vstr As String Dim Vnr As Integer Vstr = "251" Vnr = 251 + 40 ' prelucrări normale Vstr = 251 + 40 ' nu produce eroare de execu ie. În caz contrar se va produce o eroare de execu ie (pe care le vom trata în alt capitol). literali (valori date direct) sau func ii (proprii sau din biblioteci). etc. date calendaristice.) vor determina tot un rezultat de aceeaşi natură (scalar): ^ * / \ Mod Restul împăr irii + - & Ridicare la Împăr ire Împăr ire Înmul ire putere reală întreagă 5^2=25 5*2=10 5/2=2. • Termenii pot fi: variabile. stringuri/evaluează caracterele generice din al doilea string (5 Is [1. ' transformă stringul "291" în constanta numerică 291 Vstr = Vnr + "ABC" ' va produce eroare de execu ie – _ TYPE-MISMATCH. care ac ionând asupra unor termeni scalari (numere.Ac iunea acestei instruc iuni constă în calcularea expresiei (din dreapta semnului =) şi depunerea rezultatului în variabilă (din stânga semnului =). ("a2B3a" Like "a?a") = False ? ("a2B3a" Like "a*a") = True Zero sau mai multe caractere. ( ("F" Like "[!A-Z]") = False − logici. dacă este posibil. nu se poate efectua adunarea. O expresie a cărei evaluare este o valoare logică (True sau False) se mai numeşte condi ie. * Un singur număr (0-9). False) ca operanzi. ' efectuează adunarea după care transformă constanta numerică 291 _ în stringul "291" Vnr = Vstr ' nu produce o eroare de execu ie. care ac ionând asupra unor termeni scalari (numere. constante. 2. date calendaristice. 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. Vstr = Vnr & "ABC" ' nu produce eroare. 3]) = False ("ARAD" Like "AR*") = True Caracterele generice generează o mul ime de caractere astfel: Un singur caracter. ("F" Like "[A-Z]") = True ex. vor determina un rezultat tot logic: I-23 . stringuri. Vnr = "ABC" ' va produce eroare de execu ie – TYPE MISMATCH End Sub Formarea expresiilor în Visual Basic O expresie este formată din termeni asupra cărora se efectuează anumite opera ii.5 10\3=3 ConcateAdunare Scădere nare şiruri "Ab" & 10 Mod 3=1 5+2=7 5-2=3 2="Ab2" − rela ionali. Exemplu. etc.

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

în ordinea plasării lor în instruc iune. 9 'condi ia: (NumeV=5) OR (NumeV=9) . până când se găseşte una adevărată.. I. Dacă toate condi iile sunt false atunci se vor executa – dacă există – instruc iunile dintre Else …. instruc iunea Case se termină Case 1 To 9 'condi ia: (NumeV>=1) AND (NumeV<=9) .2. programul continuând cu prima instruc iune plasată după aceasta.. End Select (Grup else de instruc iuni). După găsirea unei condi ii advărate atunci se va executa grupul corespunzător de instruc iuni. Dacă mai multe condi ii sunt adevărate. Exemplu. − intervale – operatorul TO (ex: 1 To 7). după care instruc iunea Select Case se termină.. În ValoareI se pot introduce: − reuniuni de mul imi – operatorul virgulă (ex: 1.5. ElseIF…Else 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 ataşate instruc iunii (NumeVariabilă). Then.End If End Sub Un control în care nu este introdus nimic va avea valoarea NULL..b) Structura alternativă multiplă În locul folosirii a mai multor instruc iuni If.2. acest grup nu va fi executat MsgBox "Grup 3 de instruc iuni" I-25 . Else. Then. utilizarea instruc iunii Select Case sau a instruc iunii If..True 'deşi şi această condi ie=true. 2. este mult mai simplă... atunci când decizia se ia prin evaluarea mai multor condi ii (Structura alternativă multiplă). fără îndoială. O condi ie cu rezultatul NULL este tratată ca şi cum ar fi FALSE. atunci se va executa numai un singur grup de instruc iuni şi anume cel aflat după prima condi ie găsită adevărată. şi valorile din dreptul cuvintelor cheie CASE (ValoareI). Folosirea clauzei Case Else este op ională.. − submul imi – operatorul IS (ex: Is > 7). 5). Deci: Condi ia I va fi: NumeVariabilă=ValoareI Condi iile sunt evaluate pe rând.False MsgBox "Grup 1 de instruc iuni" Case 5. Sub TestCase() Dim NumeV As Integer NumeV = 5 Select Case NumeV Case 7 'condi ia: NumeV=7 .True MsgBox "Grup 2 de instruc iuni" 'execu ia instruc iunii(lor) la care condi ia=True 'după execu ie.

Then. Deci instruc iunea va evalua pe rând. 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. 11. 2 etc. condi ia 1. Dacă valoarea este 0. este afişat un mesaj corespunzător. ' Dacă controlul este NULL atunci nu este introdusă nici o valoare. în ordine. caz în care se memorează un zero într-o variabilă numită iResponse.. I-26 . Această secven ă se va executa numai atunci când se va face click pe butonul de comandă cu numele cmdCase. care se află într-un formular. în care se mai află şi un control textbox cu numele txtValue. Folosirea clauzei Else este op ională. ne mai fiind obligatorie prezen a unei variabile ca un termen al condi iei. este afişată o casetă de text con inând mesajul "A i introdus o valoare între 1 şi 5". Procedura următoare este ataşată evenimentului Click a unui buton de comandă cu numele cmdCase. Dacă utilizatorul introduce 7. ElseIF…Else If condi ie-1 Then [grup 1 de instruc iuni] ElseIf condi ie-n Then [grup n de instruc iuni] ……………. În celelalte cazuri. If IsNull(Me!txtValue) Then iResponse = 0 Else IResponse = Val(Me!txtValue) 'VAL transformă în număr un string. vor fi executate toate instruc iunile dintre Else şi End If (Grup else de instruc iuni). valoarea con inută în controlul txtValue este memorată în iResponse. …. • Dacă toate condi iile sunt false.. Instruc iunea If. ' Un control se comportă ca o variabilă de tip variant. În caz contrar. 11 sau 21. • Prima condi ie găsită adevărată va determina execu ia grupului respectiv de instruc iuni şi terminarea instruc iunii. Else [grup else de instruc iuni] End If Instruc iunea func ionează similar instruc iunii Select Case.. 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.Case Else MsgBox "Grup else de instruc iuni" End Select End Sub Exemplu.. este afişată o casetă de text cu mesajul "Trebuie să introduce i un număr". 21 MsgBox "Ati introdus 7. Instruc iunea Case evaluează con inutul variabilei iResponse. numai că: − condi iile introduse sunt independente. 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.. Dacă valoarea este între 1 şi 5 inclusiv. utilizatorul primeşte un mesaj care indică introducerea unui număr incorect.

şir gol MsgBox "In V1 nu este nici o valoare" ElseIf V2 = "" Then MsgBox "In V1 este ceva.5.2. până când o condi ie ia o anumită valoare. De obicei se execută în func ie de evaluarea unei condi ii într-o instruc iune IF. dar nu si in V2" Else MsgBox "Valorile introduse:V1=" & V1 & ". Exemplu. numit ciclu sau buclă. 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 afişa patru mesaje. 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. codul din interiorul buclei nu va fi executat niciodată.2. V2=" & V2 End If End Sub I. − 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 stânga) – se poate ca ciclul să nu se execute de loc. pentru a nu se genera un ciclu fără sfârşit. O condi ie cu rezultatul NULL este tratată ca şi cum ar fi FALSE.O condi ie cu rezultatul NULL este tratată ca şi cum ar fi FALSE. în func ie de locul unde se găseşte plasată condi ia şi anume la început sau sfârşit: 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ă ieşirea for ată din ciclu.a) Structura repetitivă cu test. Această structură nu asigură întotdeauna executarea secven ei de cod din interiorul buclei. − a doua formă a instruc iunii (cea din dreapta) – ciclul se va executa minim o dată. Dacă în iCounter este introdusă o valoare mai mare sau egală cu 5. Este permisă folosirea instruc iunii Do şi fără nici o condi ie.3. 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 stânga) – înaintea executării ciclului. I. Instruc iunea Do…Loop Execută în mod repetat un ciclu şi anume: • cât timp (While) o condi ie este TRUE sau • până când (Until) o condi ie devine TRUE Există două forme ale instruc iunii Do. În acest caz este obligatorie inserarea în ciclul Do a unei instruc iuni Exit Do sau Exit Sub | Function.3. Structura repetitivă Reprezintă execu ia repetată a unui anumit grup de instruc iuni. cu numere de la 1 la 4. I-27 .5.

. Private Sub cmdLoop2_Click () Dim iCounter As Integer iCounter = 5 Do MsgBox iCounter ICounter = iCounter + 1 Loop While iCounter < 5 End Sub Procedura va afişa un mesaj cu numărul 5. Această instruc iune permite parcurgerea automată a tuturor elementelor unei colec ii sau tablou.2.5. − TRUE – nu se execută ciclul şi se termină instruc iunea FOR. • negativ. condi ia va fi: contor > end. atunci: − dinamica contorului va fi crescătoare. d) după executarea ciclului se adună pasul la contor. practic. Func ionarea instruc iunii FOR se face prin parcurgerea următoarelor etape: a) se determină în func ie de valoarea (pozitivă sau negativă) pe care o are pasul (step). Deci.. condi ia de terminare a ciclului şi anume: − Dacă PAS >=0. prin adăugarea valorii pasului la fiecare ciclu. adică cu etapa b). c) în continuare. poate fi pozitivă sau negativă (implicit este 1). NEXT. După această opera ie instruc iunea FOR continuă cu repetarea evaluării condi iei. Structura Do While|Until. − pas – valoarea cu care contorul se incrementează. − start – valoarea ini ială a contorului. − Dacă PAS < 0. care se aplică colec iilor de obiecte sau tablourilor şi care va fi prezentată în următorul capitol..Dacă secven a de cod trebuie să fie executată necondi ionat cel pu in o dată.. I. Programul continuă cu instruc iunile de după NEXT. incrementarea se efectuează după execu ia fiecărui ciclu. b) se evaluează condi ia de terminare a ciclului. Dacă pasul este: • pozitiv. Loop While|Until face evaluarea condi iei după executarea ciclului şi de aceea execu ia acestuia este asigurată cel pu in o dată.. Structura Do. − end – valoarea finală a contorului. − pentru ca să se execute cel pu in un ciclu.b) Structura repetitivă cu contor. condi ia va fi: contor < end. Loop face evaluarea condi iei înainte de executarea ciclului şi de aceea nu asigură execu ia acestuia. − numărul de cicluri efectuate va fi: end-start+1. deoarece evaluarea condi iei se face după executatea ciclului. Acest cod va fi executat cel pu in o dată. se va folosi următoarea structură: Exemplu. atunci: I-28 .. 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 numărului de execu ii ale ciclului.3. Mai există o structură: FOR EACH. trebuie ca la început start<=end. indiferent de valoarea din iCounter. Instruc iunea For…Next Repetă un ciclu de un anumit număr de ori. contorul va parcurge toate valorile de la start la end. la fiecare ciclu. dacă condi ia este: − FALSE – se execută ciclul şi se continuă instruc iunea FOR cu etapa d).

constante) făcute în interiorul rutinei sunt locale. controlul revine obiectului care a provocat apelarea rutinei. asemănătoare unui program. − se pot folosi variabile atât pentru valoarea de start. − dacă valoarea de incrementare a contorului este diferită de 1. are loc automat eliberarea din memorie a tuturor variabilelor şi constantelor locale ale acesteia. dar nu şi în cel al VBA. Rutine – proceduri şi func ii I. cât şi pentru cea de sfârşit. de către un obiect al aplica iei care poate fi: − programul – numai în cazul limbajului Visual Basic. − pentru ca să se execute cel pu in un ciclu. se dă după cuvântul cheie STEP. trebuie ca la început start>=end. fiind deci vizibile numai din interiorul acesteia. Instruc iunea Exit For provoacă ieşirea for ată din ciclu şi continuarea programului cu instruc iunile de după NEXT.. Next este folosită atunci când sunt un număr exact de itera ii de executat. printr-un literal sau o variabilă (pas). Structura For. − numărul de cicluri efectuate va fi: start-end+1. Ce este o rutină şi ce elemente o definesc? Rutina este o structură de sine stătătoare. prin scăderea valorii absolute a pasului la fiecare ciclu. Exemplu. dacă sunt folosite variabile contor diferite ca în exemplul următor: For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 . prin care se efectuează o anumită ac iune. La terminarea rutinei.1. După execu ia unei rutine. I-29 .. I. Exemplu. durata de via ă a datelor locale este numai în intervalul de timp cât rutina se află în execu ie. Private Sub cmdForNext_Click () Dim iCounter As Integer For iCounter = 1 To 5 MsgBox iCounter Next iCounter End Sub Procedura va afişa cinci mesaje. Ea este executată numai atunci când este lansată (apelată). De asemenea..− dinamica contorului va fi descrescătoare. Rutina poate fi apelată de un număr nelimitat de ori din diferite locuri. cu numere de la 1 la 5. Sunt admise imbricări ale structurilor For. − o altă rutină. cu numere de la 5 la 1. De obicei se execută în func ie de evaluarea unei condi ii într-o instruc iune IF.6. Next K Next J Next I Într-un For trebuie evitată schimbarea valorii contorului.6. Private Sub cmdForNext_Click () Dim iCounter As Integer For iCounter = 5 To 1 Step -1 MsgBox iCounter Next iCounter End Sub Procedura va afişa cinci mesaje.. Toate declara iile (variabile. − un macro. Observa i că: − iCounter se auto-incrementează. − un eveniment al unui obiect al aplica iei.

Parametrii defini i în rutină se numesc parametri formali. prin valoare sau prin adresă (referin ă). Apelarea rutinelor şi transmitera parametrilor prin valoare Din figura următoare se obsevă că avem perechi de parametri. • Parametrii de intrare ai rutinei pot fi în lista parametrilor actuali: variabile.X2 A1. Prin variabile globale sau publice. X2. Din punct de vedere al terminologiei se mai obişnuieşte să se folosească în loc de parametru termenul argument. Apelare rutină . literali sau expresii.) Modul apelant ………. o expresie sau un literal.. B1= …… ' folosirea 'parametrilor de ieşire ……….A2 Y B1 M1. X1=…. Apelare rutină .M2 A1.A2 Parametri actuali:M1. Aceste variabile fiind vizibile şi din modulul apelant şi din rutină. Instr J…… M1=…. actuali şi formali. Instr J+1… M2=…. T T B1 Rutina Nume: Rtest Parametrii formali: Intrare: A1. rutina interac ionează cu obiectul care a provocat lansarea (apelarea) ei. Y X1. o constantă. Diferit fa ă de programe. • Declararea parametrilor formali se face după regulile aplicate la declararea variabilelor.. A2 Ieşire: B1 Instr1 ……….= A1 + A2 ' folosirea 'parametrilor de intrare ……….2. Aceasta reprezintă practic nişte variabile. evident că prin ele se pot face transferuri de date în ambele sensuri între cele două obiecte. Acest lucru se realizează în două moduri şi anume: Prin lista de parametri. • Definirea unei rutine se face prin atribuirea unui nume (obligatoriu) acesteia şi prin stabilirea listei de parametri (op ional). • La apelarea unei rutine. …. prin transferarea de date din şi înspre acesta.În Visual Basic nu sunt permise imbricări de rutine... X2=…. − un transfer de date de la rutină înspre modulul apelant – parametri de ieşire – produs în momentul terminării rutinei şi preluării controlului de către modulul apelant. deoarece aceştia prin defini ie îşi pot schimba valoarea în timpul execu iei rutinei.. ….. Parametri actuali:X1. M2. 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. corespunzător fiecărui parametru formal. Instr N+1..= …Y ………. Aceste date formează lista parametrilor actuali şi este declarată o dată cu apelarea rutinei. Instr N….. Transmiterea datelor prin parametri Există două modalită i de transmitere a datelor prin parametri şi anume.6. • Parametrii de ieşire ai rutinei pot fi în lista parametrilor actuali numai variabile. care reprezintă practic două variabile care se sincronizează de două ori: prima dată la apelarea rutinei şi a doua dată la terminarea rutinei. prin intermediul cărora se face: − un transfer de date de la modulul care apelează la rutină – parametri de intrare – produs în momentul apelării rutinei.Rtest Instr.= …T ……. I. • Apelarea unei rutine se face prin numele ei. constante. . Deci într-o rutină nu se poate declara o altă rutină. Sfârşit rutină I-30 .Rtest Instr.. Evident parametrii actuali şi formali trebuie să fie de acelaşi tip şi să ocupe acelaşi loc în cele două liste.) iar la terminarea rutinei transferul invers: ParametruActual=ParametruFormal (de ex: T=B1 sau Y=B1 etc. care poate fi o variabilă. trebuie să existe o dată de acelaşi tip în modulul apelant.

în ambele sensuri. X2=…. ……….M2.Deci în acest caz se transferă anumite valori.A2 Ieşire:B1 Instr1 ……….X2. transmiterea parametrilor se face prin adresă (referin ă). I. Instr N+1. • Procedurile sunt apelate prin instruc iuni. Transferul se face numai la apelarea rutinei. În mod normal procedurile se termină la instruc iunea End Sub. În acest fel în rutină parametrii formali se vor genera în memorie peste parametrii actuali.6.Rtest Parametri actuali:M1.3. Spunem că transmisia parametrilor se face prin valoare.= …Y ………. B1= …. cu condi ia vizibilită ii ei din locul de apelare. la instruc iunea care se găseşte imediat după cea de apelare. I-31 . Proceduri (Subrutine) [Private|Public][Static] Sub NumeProcedura [(ListaParametriFormali)] [declara ii locale de: variabile. între perechile de parametri formal şi actuali. Apelarea rutinelor şi transmitera parametrilor prin adresă Modul apelant ………. Apelare rutină . Instr J…… M1=…. procedura va fi considerată Public.. la definirea proprietă ilor din controale. deşi va folosi numele parametrilor formali în expresii. …. Func iile pot fi folosite direct oriunde este cerută o expresie. În Visual Basic.. iar func iile sunt apelate prin introducerea numelui acesteia într-o expresie (ca şi cum ar fi o variabilă sau constantă)..T ………. Astfel putem folosi func ii ca: parametri de intrare pentru rutine. dar nu se vor transfera valori. etc.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.1.. I.folosind date care pot fi: − parametrii formali. Diferen a dintre ele constă în faptul că: • Func iile au un parametru implicit de ieşire care este chiar numele func iei. iar cea declarată Private va fi vizibilă numai din modulul în care este declarată. Astfel... Apelare rutină . la cereri etc. Deci rutina va lucra practic cu parametrii actuali. • Op iunea Static determină ca toate variabilele locale declarate în procedură să func oineze ca variabilele statice. procedura declarată Public în modulul general de cod va fi vizibilă din toate modulele de cod ale aplica iei. ci rutina va primi adresele parametrilor actuali..= A1+A2 'folosirea 'parametrilor de intrare Instr. dacă nu se fac precizări suplimentare. Sfârşit rutină În acest caz lucrurile se petrec altfel. X1=….. . 'folosirea 'parametrilor de ieşire Instr. Instr N…. ] [instruc iuni] [Exit Sub] [instruc iuni] End Sub • Instruc iunea Exit Sub provoacă.= …T ………. dacă este întâlnită. • Op iunile Private sau Public au acelaşi rol ca cel prezentat la variabile. Crearea (definirea) unei rutine Rutinele sunt de două feluri: proceduri (sau subrutine) şi func ii. terminarea procedurii şi redarea controlului modulului apelant. Instr J+1… M2=….. constante.3.6. …. Dacă nu se foloseşte nici una din cele două op iuni.Rtest Parametri actuali:X1. • Toate instruc iunile sunt permise în proceduri.

Apelarea unei proceduri (subrutine) Există două modalită i de apelare a unei proceduri: prin instruc iunea Call: Call NumeProcedură (ListaParametrilorActuali) direct. Acest lucru se datorează faptului că o rutină care foloseşte multe variabile globale este de multe ori foarte pu in lizibilă. I-32 . Implicit. folosirea variabilelor globale. Deci o func ie.3. Dacă acest lucru nu se face atunci tipul func iei se va considera implicit Boolean. urmat eventual de lista parametrilor actuali: NumeProcedură ListaParametrilorActuali Parametrii se separă prin virgulă. etc. după ce este executată. MsgBox TestF (20. Numar2 As Integer) As Integer If Numar1 > Numar2 Then TestF = Numar1 . ] [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.6.4. I.4. Pentru schimburile de date dintre rutină şi modulul apelant este recomandată utilizarea numai a parametrilor formali. În loc de Exit Sub şi End Sub.6.2.6. I. evident cu acelaşi rol. Din această cauză acestuia trebuie să i se precizeze tipul de date. se va comporta practic ca o variabilă – care s-a încărcat cu valoarea parametrului de ieşire – putând fi introdusă direct în partea dreaptă a oricărei expresii. constante. fiind în acelaşi timp şi numele rutinei şi parametru de ieşire al rutinei. Este indicat ca să se evite. greu de depanat sau de între inut. dar o procedură nu poate fi folosită ca o func ie (în partea din dreapta a unei expresii). declarate după regulile prezentate la variabile şi separate prin virgulă. Func ii [Public|Private][Static]Function NumeF-c ie[(ParFormali)] [As TipFunc ie] [declara ii locale de: variabile. • Lista Parametrilor Formali – reprezintă o listă de variabile. Apelarea unei rutine Orice func ie poate fi apelată ca o procedură. folosind numele procedurii. 5) ' afişează 15 MsgBox TestF (2.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 ……. − variabilele şi constantele locale. Function TestF (Numar1 As Integer.1.− variabilele şi constantele globale. Exemplu. la func ii sunt Exit Function şi End Function. pe cât posibil. − ByRef – prin adresă (referin ă). Se va folosi această func ie astfel…. Următorul exemplu reprezintă o func ie care va testa două valori primite ca parametri şi va întoarce suma sau diferen a dintre ele. 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. 5) ' afişează 7 I. în crearea rutinelor. transferul parametrilor se face prin adresă.

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

• Val(pm) – întoarce valoarea numerică din stringul pm. sau prin pictograma specifică de pe bara de instrumente. ca şi aceea de sfârşit (End Sub). altfel se va afişa mesajul: "Trebuie introduse numele. în afară de afişarea modulului. • Int(pm) – întoarce partea întreagă din pm. tot de către sistem. cu numele txtNume. Pentru a crea o rutină definită de utilizator în modulul de cod din spatele unui formular sau raport se procedează la fel.Carriage Return (retur de car). De exemplu. este executat automat. Î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. 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)). Instruc iunea de declarare a procedurii eveniment: Private Sub cmdOkay_Click. Dacă nu sunt date introduse în control. Datele din control pot fi accesate cu sintaxa Me!NumeControl. I-34 .Line Feed (rând nou). Termina i definirea rutinei cu clic pe OK. virsta şi sexul" Exit Sub 'Dacă nu sunt date în toate cele trei textbox-uri se afişează _ mesajul şi se termină procedura Else 'Afişează val. atunci se afişează un mesaj ca în figura alăturată.Indica i dacă dori i ca rutina să fie publică (pentru întreaga aplica ie) sau privată (numai pentru acest modul). când un utilizator execută click cu mouse-ul pe un buton de comandă dintr-un formular. cu numele cmdOkay (şi proprietatea Caption="Apasa") şi trei controale de tip textbox. în func ie de numele controlului şi al evenimentului respectiv. • Chr(10) – întoarce caracterul LF . dacă există. adică Sub şi End Sub) când se selectează dintre proprietă ile controlului evenimentul respectiv. vizualiza i codul din spatele formularului sau raportului executând clic pe butonul Code de pe bara de instrumente sau prin selectarea op iunii Code din meniul View. atunci valoarea acestuia este Null. De asemenea. txtVirsta şi txtSex. Dacă în toate cele trei controale textbox sunt introduse date.8. codul evenimentului Click pentru acel buton de comandă. care se face astfel: • în timp ce vă afla i în modul de afişare Design al unui formular sau raport. specifica i dacă toate variabilele locale din rutină sunt statice sau nu. sunt create automat atunci când se selectează evenimentul Click din lista proprietă ilor butonului de comandă cmdOkay. dar numai din codul din spatele formularului respectiv. cod care se va găsi plasat sub forma unei proceduri eveniment în modulul de cod din spatele formularului respectiv. Un control se comportă ca o variabilă de tip variant. Procedurile evenimentelor Procedurile evenimentelor sunt apelate automat când are loc un eveniment pentru un anumit obiect. Procedura unui eveniment al unui control este creată automat (prima şi ultima instruc iune a procedurii.6. De asemenea. Numele procedurii va fi obligatoriu stabilit de sistem. Exemplu. I. Me!txtSex) & " ani" End If End Sub Procedura de mai sus va fi executată de fiecare dată când se va face click pe butonul de comandă cmdOkay al formularului. • Chr(13) – întoarce caracterul CR . lista parametrilor formali. este ataşată. Într-un formular se găseşte un control de tip buton de comandă. dacă este cazul. vârsta şi sexul" Procedura foloseşte următoarele func ii ce se găsesc în bibliotecile sistem (prezentate în continuarea acestui capitol): • IsNull(pm) – întoarce TRUE dacă parametrul pm este Null.

10 ElseIf V > 25 And S = "F" Then CalculVirsta = V . – eventual cu lista de parametri formali. Private Sub Initialele (sFirst As String. evenimentul On Click). Primul caracter din stânga al fiecărui parametru este afişat în caseta de mesaje.2 ElseIf S = "M" Then CalculVirsta = V + 5 Else CalculVirsta = V End If End Function Pentru a edita codul evenimentului. Private Function ReturnInit (sFName As String. Codul precedent transmite pur şi simplu valori şi apoi operează cu ele. cât şi func iile pot primi argumente (parametri). Me!txtLastName) MsgBox "Initialele dumneavostra sunt: " & sInitials I-35 . În continuare se ilustrează folosirea unei func ii care întoarce o valoare. S As Variant) As Integer If V > 35 And S = "F" Then CalculVirsta = V . Parametrii sunt recep iona i ca sFirst şi sLast. Function CalculVirsta (V As Integer. 1) End Function • Ea va fi apelată din procedura eveniment On Click a butonului de comandă cmdNume. 1) & Left (sLName. Private Sub cmdNume_Click () Dim sInitials As Integer sInitials = ReturnInit (Me!txtFirstName. Exemplu. I. • selecta i [Event Procedure] din lista derulantă. executa i următorii paşi: • executa i click pe control (cmdOkay) în modul de afişare 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. txtFirst şi txtLast. Automat sistemul va crea instruc iunea de declarare a procedurii. Subrutina următoare primeşte doi parametri.6. dacă este cazul – şi instruc iunea de sfârşit a procedurii. • executa i clic pe butonul (…). • selecta i proprietatea pentru care dori i să scrie i instruc iuni de cod (de exemplu. Aceasta afişează apoi un mesaj cu primul caracter al fiecăruia dintre cei primi i. sLast As String) MsgBox "Initialele dumneavostră sunt: " & _ Left (sFirst. dar numai func iile pot întoarce valori. declarată în acelaşi modul de cod din spatele formularului respectiv. Exemplu. Proiectantul va introduce acum codul VBA necesar tratării evenimentului. 1) & Left (sLast. 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.5 ElseIf V > 20 And S = "F" Then CalculVirsta = V . 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. Me!txtLastName End Sub Observa i că textul din controalele txtFirstName şi txtLastName din formularul curent (Me) sunt transmise subrutinei cu numele Initialele. sLName As String) As String ReturnInit = Left (sFName. Utilizarea combinată a procedurilor eveniment cu rutinele utilizator Am arătat că atât subrutinele. Private Sub cmdNume_Click () Initialele Me !txtFirstName.9.Procedura eveniment utilizează o func ie utilizator. Cursorul dumneavoastră va fi plasat în codul evenimentului pentru obiectul respectiv. • executa i click pe marcajul de tabulare al proprietă ilor evenimentului (Event).

Apoi. Optional sMI. Biblioteci standard de proceduri şi func ii O bibliotecă este un obiect de sine stătător care permite realizarea unei colec ii de func ii. Parametri opţionali Visual Basic vă permite să utiliza i parametri op ionali. trimi ând valorile celor două casete de text ca parametri ai func iei. I. Function ReturnInit (sFName As String.6. atunci se va scrie numai separatorul (virgula) parametrului respectiv. nu este necesar să şti i câ i parametri vor fi transmişi. ale căror module pot fi utilizate oriunde acestea sunt permise. oferă mai multe biblioteci. va sesiza prezen a tuturor celor trei parametri actuali. Pentru aceasta trebuie ca în prealabil aplica ia client să înregistreze şi să creeze referin a (adresa) către biblioteca respectivă. Func ia IsMissing este valabilă numai pentru parametri de tip variant. deci care pot să lipsească la apelarea rutinei.7. "Gates") Aşa cum a i putut vedea. "X". Cu alte cuvinte. În Visual Basic. în fa a numelui parametrului. Visual Basic sau alte aplica ii. • Sau mai poate fi apelată şi: sName = ReturnInit ("Bill". care pot fi utilizate în Access. Func ia numită ReturnInit din secven a de cod următoare primeşte ultimii doi parametri ca op ionali. Apoi evaluează prezen a sau nu a parametrilor şi ac ionează în consecin ă. func ia ReturnInit va sesiza acest lucru şi prin func ia InputBox va cere utilizatorului introducerea valorii respective. În loc să rezulte o eroare de compilare. colec ii de obiecte şi obiecte. Implicit. Lucrul cu parametri op ionali. Dacă se folosesc parametri op ionali. prin folosirea clauzei Optional. − pentru parametrii declara i op ional. − testarea prin func ia IsMissing. vor fi prezentate în special cele mai utilizate func ii şi proceduri ale acestor biblioteci. func ia întoarce această valoare rutinei apelante (cmdNume_Click) şi o atribuie variabilei sInitials. I-36 . În acest subcapitol. proceduri. declararea acestora în lista parametrilor formali este: [Optional] NumeParametru As TipDate [ = ValoareImplicita ] I. "Gates") În acest caz func ia. care respectă standardele de utilizare ale acestora. clase de obiecte. Aplica iile Access au referin e create către anumite biblioteci. necesită: − declararea ca op ional a parametrului. Func ia asociază numelui func iei (ReturnInit) o valoare egală cu primele două caractere ale şirurilor. Microsoft Office. o aplica ie are chiar din faza de instalare create referin ele către cele mai utilizate biblioteci specifice. dacă a fost sau nu introdus la apelare parametrul respectiv în lista parametrilor actuali. O restric ie a limbajului este faptul că numai ultimii parametri pot fi declara i op ionali. prin folosirea lui IsMissing. lipseşte al doilea parametru.. Acest lucru se face prin comanda References.10. cu care se va ini ializa parametrul dacă acesta lipseşte din lista parametrilor actuali.End Sub Re ine i că acest exemplu apelează o func ie ReturnInit. Dacă nu se doreşte introducerea în lista parametrilor actuali a unui parametru op ional. se poate introduce o valoare implicită. Noile tehnologii şi standarde introduse de Microsoft permit ca modulele unei biblioteci să fie utilizate de toate aplica iile client de pe platforma S. există posibilitatea creării mai multor tipuri de biblioteci. Optional sLName) As String If IsMissing (sMI) Then ' IsMissing întoarce True dacă s-a apelat _ func ia fără 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 fără 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 următor: sName = ReturnInit ("Bill".O.

Nr = Abs (-50. Diferen a între Int şi Fix se manifestă numai în cazul numerelor negative.1. În crearea expresiilor. Int (–8. va rezolva imediat această problemă. Funcţii matematice I. Ambele func ii Int şi Fix îndepărtează partea frac ionară a numărului şi întorc valoarea întreagă care rezultă. Dim Nr ' variabilă declarată fără specificarea tipului de dată-VARIANT. opera iile permise etc.Un bun programator trebuie să cunoască şi să folosească cât mai multe din obiectele puse la dispozi ie de biblioteci. − ce reprezintă valoarea pe care o întoarce func ia (adică ce opera ii efectuează func ia). folosind pur şi simplu func ia respectivă.7. De exemplu dacă se realizează o aplica ie care la un moment dat trebuie să calculeze sinusul dintr-o valoare.1.3. Nr = Int (99. Tipul de dată al rezultatului va fi acelaşi cu cel al parametrului de intrare. Fix (–8. Toate acestea se pot vizualiza prin Expressions Builder (prin cele două foldere din Functions. 4) = –8. 8) ' Întoarce -99. ştiind că există în biblioteci func ia Sin. programatorul trebuie să cunoască trei lucruri: − numele func iei. lansat de obicei din meniul contextual (Build). Dim Semn aA Variant I-37 <0 –1 >0 1 =0 0 . 3.1. din care vor fi prezentate în continuare cele mai utilizate. în Access se poate folosi un constructor de func ii – Expressions Builder. Acesta este foarte util. Sgn(număr) Întoarce un Variant (Integer) care reprezintă semnul unui număr. se pot folosi în crearea expresiilor atât func iile definite (create) de utilizator cât şi func iile din bibliotecile către care există referin e. Tipul de dată al rezultatului va fi acelaşi cu cel al parametrului de intrare. Nr = Fix (99. 2) ' Întoarce 99. I. Exemplu. În concluzie. Dacă parametrul este: Sgn întoarce: Exemplu. Astfel: • Int întoarce primul număr negativ de tip întreg mai mic sau egal cu numărul. care calculează sinusul unei valori. Access are referin e implicite către o bibliotecă de func ii şi proceduri. în proprietă ile tabelelor sau cererilor. în controalele din formulare sau rapoarte. − parametrii şi ce reprezintă fiecare. foarte bogată şi cuprinzătoare.1. aşa cum se vede din figură). pe când un bun programator.7. Nr = Fix (-99.1. 3. Int(număr). Fix(număr) Ambele func ii întorc partea întreagă a numărului introdus ca parametru de intrare.7. • Fix întoarce primul număr negativ de tip întreg mai mare sau egal cu numărul. 8) ' Întoarce 99. parametrii acestora. în codul VBA. 3) ' Întoarce 50. I. 8) ' Întoarce -100. Exemplu. Dim Nr Nr = Abs (50. un programator neexperimentat ar putea să creeze un modul care să rezolve acest lucru. 3) ' Întoarce 50. 4) = –9.7. prezentând toate func iile. Nr = Int (-99. Pentru a putea utiliza o func ie dintr-o bibliotecă.2. modulul de Help. I. Abs(număr) Întoarce valoarea absolută a numărului introdus ca parametru de intrare.

1.7. Dim Radical Radical = Sqr(4) ' Întoarce 2. Radical = Sqr(-4) ' Generează o eroare de execu ie. Valoarea parametrului determină cum Rnd generează un număr aleator. Valoare2= -2.7. I. 1). Următorul număr din secven ă. Logaritmul natural este logaritmul în baza e. Următorul număr din secven ă. Rnd [(număr)] Întoarce o valoare de tip Single (virgulă mobilă simplă precizie) care va con ine un număr aleator. deoarece fiecare apel succesiv al func iei Rnd foloseşte numărul generat anterior ca valoare pentru calculul următorului număr din secven ă. care va folosi pentru ini ializarea generatorului de numere aleatoare ceasul sistemului de calcul.. Înainte de prima folosire a func iei Rnd. Logaritm Unghi = 1. fără parametri. în intervalul [a. se foloseşte formula: Int(a + (b .1. Dim Unghi. Func ia Rnd întoarce o valoare în intervalul [0.. Exemplu. Constanta e~2. Radical = Sqr(0) ' Întoarce 0. Sqr(număr) Întoarce o valoare de tip Double (virgulă mobilă dublă precizie) care reprezintă radicalul (square root) unui număr pozitiv (≥ 0).6.718282. 79583152331272. 3 ' Defineşte unghiul în radiani SinHiper = (Exp (Unghi) .3 ' Defineşte unghiul în radiani Logaritm=Log(Unghi+Sqr(Unghi*Unghi+1))' inversul sin hiperbolic I. Valoarea întoarsă de Rnd este: Dacă parametrul este: <0 >0 =0 Fără (de obicei) Rnd generează Acelaşi număr de fiecare dată. Dim Valoare Randomize Valoare=Int(1+(6*Rnd)) ' Generează o valoare aleatoare între 1 şi 6. Log(număr) Întoarce o valoare de tip Double care reprezintă logaritmul natural al unui număr (> 0).Exp (-1 * Unghi) ) / 2' Calcul sin hiperbolic I. Semn = Sgn (Valoare3) ' Întoarce 0. b].7.a + 1) * Rnd) Exemplu. Pentru aceasta se va folosi procedura Randomize. I. Valoare3= 0 Semn = Sgn (Valoare1) ' Întoarce 1.1. Dacă se doreşte generarea unor numere întregi. Cel mai recent număr generat. Exp(număr) Întoarce o valoare de tip Double care reprezintă constanta e ridicată la o putere (în care e este baza logaritmului natural). Radical = Sqr(23) ' Întoarce 4. atunci generatorul de numere aleatoare trebuie ini ializat cu o valoare întâmplătoare. Argumentul (parametrul) este op ional şi poate fi un Single sau o expresie numerică corectă.1. Semn = Sgn (Valoare2) ' Întoarce -1. Dim Unghi. Pentru o anumită valoare ini ială. folosind parametrul ca valoare de ini ializare. dacă se doreşte generarea unei secven e de numere aleatoare. 4. Exemplu.4. I-38 . Exemplu. este generată aceeaşi secven ă de numere.7.5.Const Valoare1= 12.7. SinHiper Unghi = 1.

I. Asc(string) Întoarce o valoare de tip Integer. I-39 . Sin(număr) Întoarce o valoare de tip Double care este sinusul unui unghi în radiani. 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. Invers se vor înmul i radianii cu 180/pi. Cos(număr) Întoarce o valoare de tip Double care este cosinusul unui unghi în radiani..1. Exemplu. Cosecanta = 1 / Sin(Unghi) ' Calculează cosecanta. 3 ' Defineşte unghiul în radiani. 3 ' Defineşte unghiul în radiani Cotangenta = 1 / Tan (Unghi) ' Calculează cotangenta I.1. 1]. Dim Unghi. I. în intervalul 0…255.2.1.7. Invers se vor înmul i radianii cu 180/pi. S Unghi = 1.7.7. Rezultatul va fi în intervalul [–1.11.10. Dim Numar Numar = Asc ("A") ' Întoarce 65.7. Funcţiile TEXT – pentru stringuri I.3 ' Defineşte unghiul în radiani.8.1. Dim Unghi. Pentru a transforma gradele în radiani se înmul esc gradele cu pi/180. Pentru a transforma gradele în radiani se înmul esc gradele cu pi/180.2.I. Exemplu.7. Dim Unghi. Cotangenta Unghi = 1. Exemplu. Exemplu.1. Atn(număr) Întoarce o valoare de tip Double care reprezintă arctangenta unui număr. pi = 4 * Atn(1) ' Calculează valoarea lui pi.7.7. Tan(număr) Întoarce o valoare de tip Double care este tangenta unui unghi în radiani. Exemplu. I. care reprezintă codul în ASCII (ANSI) a primului caracter din şirul de caractere ce se află în argumentul (parametrul de intrare) func iei.12.1.9. S = 1 / Cos (MyAngle) ' Calculează secanta. Cosecanta Unghi = 1.

în care fiecare caracter ocupă doi octe i (byte). Exemplu.2. introdus ca argument al func iei.trecerea la început de linie. Ele consideră şirul de caractere ca pe un tablou de octe i.2. I. Chr(CodCaracter) Întoarce o valoare de tip string care reprezintă caracterul asociat codului caracterului în ASCII (ANSI). primele 128 de coduri sunt ca în codul ASCII. • Func ia ChrB – în loc să întoarcă un caracter al cărui cod (aflat în parametrul func iei) poate fi pe 1 sau 2 bytes. Numar = Asc ("Apple") ' Întoarce 65.2. I. 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. I. ChrW in seama că în memorie caracterele sunt codificate pe 2 octe i în standardul UNICODE. De exemplu: • Chr(10) întoarce caracterul Line Feed (LF) . Intervalul normal pentru parametrul CodCaracter este: 0-255. întoarce primul byte. LCase(string) Întoarce o valoare de tip Variant (String) în care literele mari au fost convertite în litere mici. • Chr(13) întoarce Carriage Return (CR) . în intervalul 0…2^16). Caracter = Chr (37) ' Întoarce %. care însă pot să determine anumite ac iuni în timpul afişării.7.7.3. Exemplu.4. Aceste func ii au efect numai pe platformele care acceptă codul UNICODE. AscW(string). ChrB(CodCh). Dacă acesta nu este acceptat. Caracter = Chr (62) ' Întoarce >. ChrB.Numar = Asc ("a") ' Întoarce 97. din codul în UNICODE al primului caracter. ea va întoarce întotdeauna caracterul al cărui cod este pe primul byte. Restul caracterelor rămân nemodificate. AscB(string). I-40 . AscW. • Func ia AscB – în loc să întoarcă codul pentru primul caracter.7. • Func ia AscW – întoarce codul caracterului în UNICODE (pe 2 octe i. ChrW(CodCh) Func iile AscB.trecerea pe linie nouă. Dim Caracter Caracter = Chr (65) ' Întoarce A.2. atunci ele se comportă la fel ca func iile Asc respectiv Chr. Codurile dintre 0-31 au ca corespondent în ASCII caractere netipăribile. Caracter = Chr (97) ' Întoarce a. • Func ia ChrW – întoarce un string care con ine caracterul al cărui cod este introdus în argument în standardul UNICODE.

Unul (şi numai unul) din cele două argumente posibile trebuie specificat. este comună şi celorlalte func ii. MyLen = Len(MyString) ' Întoarce 11. dar: − la func ia LTrim: fără spa iile de început. ' Utilizând func ia Trim se ob ine acelaşi rezultat. În loc să întoarcă numărul de caractere dintr-un string.6. − la func ia RTrim: fără spa iile de sfârşit.2. Trim(string) Întoarce o valoare de tip Variant (String) care este copia stringului.7. Modific = LTrim(RTrim(Valoare)) ' Modific = "<-Trim->". Left(string. care ine cont de reprezentarea în memorie în UNICODE a stringului.2.7.7. MyLen = Len(MyBan) ' Întoarce 8.Exemplu. Se poate utiliza func ia LenB. RTrim(string). func ia va întoarce tot NULL. Dim Valoare. câte caractere pot să fie introduse în ea. Exemplu. Restul caracterelor rămân nemodificate. Dim MyInt As Integer. MyLen MyString = "Hello World" ' Ini ializează variabila. MyLen = Len(Customer) ' Întoarce 42. − la func ia Trim: fără spa iile din ambele capete. Dim Valoare.7. I. Modific = LTrim(Valoare) ' Modific = "<-Trim-> ". LenB întoarce numărul de bytes (octe i) utiliza i pentru a reprezenta acel string. ValoareMica = LCase (Valoare) ' Întoarce "nota examen". Lungimea este o expresie numerică indicând câte caractere se vor întoarce. Exemplu. MyLen = Len(MyInt) ' Întoarce 2. MyBan As Currency Dim MyString.8. aşa cum am mai amintit. • dacă argumentul este o variabilă. ValoareMare Valoare = "Nota EXAmen" ' String pentru a fi convertit. Modific = RTrim(Valoare) ' Modific = " <-Trim->".5.7. 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. Len(String | NumeVariabila) Întoarce o valoare de tip Long cuprinzând: • dacă argumentul este un string. ValoareMica Valoare = "Nota EXAmen" ' String pentru a fi convertit. Modific Valoare = " <-Trim-> " ' Ini ializează stringul. ValoareMare = UCase (Valoare) ' Întoarce "NOTA EXAMEN". Dacă: I-41 .2. LTrim(string). Exemplu. Modific = Trim(Valoare)' Modific = "<-Trim->" I. I. Dacă argumentul este NULL. Dim Valoare. Type CustomerRecord ' Defineşte tipul de date dorit de utilizator. I.2. această regulă. UCase(string) Întoarce o valoare de tip Variant (String) în care literele mici au fost convertite în litere mari. lungime) Întoarce un sub-şir de caractere din partea stângă a stringului al căror număr este stabilit de lungime. câte caractere are.

4. Această facilitate nu este implementată şi la func iile Left sau Right. Mid va întoarce un string vid ("") – de lungime 0. Exemplu. 19. atunci NULL se va întoarce. 15) ' Întoarce "din Pitesti". SubSir1. cu stringul specificat de expresia din dreapta instruc iunii. Right(string. SubSir2. 1) ' Întoarce "N". − start (obligatoriu). Public Sub TestMid () Dim S As String S = "123456789" Mid(S. Dim Sir. 1. 7) ' Întoarce "Nota ex". Dacă lipseşte sau dacă este mai mare decât numărul maxim de caractere care mai sunt până la sfârşitul stringului (inclusiv caracterul de început). Este de tip Variant (Long). Pentru a determina numărul de caractere dintr-un string se va utiliza func ia Len. Reprezintă pozi ia caracterului din string de la care începe partea ce va fi preluată. 4. Subsir = Left(Sir. Len(Sir)-2) ' Întoarce "Nota exam". 7) ' Întoarce "Pitesti".2.− Lungimea = 0 – se întoarce un string de lungime 0 – cunoscut cu numele de şir vid (""). el fiind astfel tratat ca o valoare de tip String.10. vor fi întoarse toate caracterele de la pozi ia de start până la sfârşit. Dacă stringul con ine NULL. 13) ' Întoarce "Universitatea". 2) = "A" MsgBox S ' Afişează 123A56789 Mid(S.1) ' Intoarce "r" (vezi observa ie func ia left) I. Dim Sir. Dim SirPrincipal.7. Mid(string. − Lungimea >= Len(string) – se întoarce întregul string dacă lungimea este mai mare decât numărul de caractere din string. Subsir Sir = "Nota examen" ' Defineşte stringul.lungime]) Întoarce o valoare de tip Variant (String) cuprinzând un număr specificat de caractere dintr-un string. Subsir = Right(Sir.7. SubSir1 = Mid(SirPrincipal. 1) ' Întoarce "n" (caracterul de la final)) Subsir = Right(Sir. Dacă pozi ia este mai mare decât numărul de caractere din string. start [. Len(Sir)-2) ' Întoarce "ta examen". Subsir = Right("Sir". Subsir = Left("Sir". Parametrii reprezintă: − string (obligatoriu). Subsir Sir = "Nota examen" ' Defineşte stringul. Subsir = Left(Sir. Subsir = Left(Sir. Subsir = Right(Sir. caz în care va înlocui din string subşirul specificat. Reprezintă numărul de caractere ce vor fi întoarse.2. SubSir3 = Mid(SirPrincipal. Mid poate fi folosit şi în partea stângă a unei instruc iuni de atribuire. SubSir3 SirPrincipal = "Universitatea din Pitesti" ' Creează stringul. 8) ' Întoarce "a examen". I.9.1) ' Întoarce "S" A se face distinc ie între variabila Sir care este încărcată cu valoarea "Nota examen" şi stringul "Sir" care este scris între ghilimele. − lungime (op ional). lungime) Întoarce un sub-şir de caractere din partea dreaptă a stringului al căror număr este stabilit de lungime (vezi explica ia anterioară). SubSir2 = Mid(SirPrincipal. dar în aşa fel încât să nu se modifice lungimea şirului de caractere. Este de tip Long. Exemplu. Expresie string din care sunt întoarse caractere. Exemplu. 2) = "AB" MsgBox S ' Afişează 123AB6789 I-42 . Exemplu. Numerotarea caracterelor începe de la 1. Determinarea numărului de caractere din string se face cu func ia Len.

1) ' Compara ie textuală. adică fără să se ină cont de caracterele mari sau mici. • start (op ional). 42) ' Întoarce "*****" – codul Ascii al lui * este 42 MyString = String(10. Sir. 1) ' Compara ie textuală. Întoarce 9. SirCautat = "P" ' Se caută "P".7.caracter) Întoarce un şir de caractere.11. Dacă nu se găseşte şirul specificat se întoarce valoarea 0.Mid(S. Exemplu. • compare (op ional). Space(număr) Întoarce un şir de caractere care con ine de număr de ori caracterul spa iu.Print InStr ("Alison Balter". 1. Şirul de caractere în care se va face căutarea. Întoarce 0. "p". − 1 – comparare textuală.]string1. 4. 2) = "ABC" MsgBox S ' Afişează 123AB6789 End Sub I. String(număr.13. Pozitie = Instr (4. Dacă N>255 se va folosi Chr(N Mod 256). Pozitie = Instr (4. − dacă parametrul compare lipseşte.2. Sir. Dim MyString MyString = String(5. 0) ' Compara ie binară. ne-senzitivă. atunci NULL se întoarce.7. "W") ' Implicit compara ia e binară _ (lipseşte ultimul argument). SirCautat. atunci setarea Option Compare din modulul de cod determină tipul compara iei. Argumentul este obligatoriu dacă se specifică o compara ie. − 2 – comparare bazată pe informa iile din baza de date. • string1 (obligatoriu).compare]) Întoarce o valoare de tip Variant (Long) reprezentând pozi ia primei apari ii a string2 în string1. 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. − 0 – implicit – comparare binară. Exemplu. Dacă unul din şiruri este NULL. sau 2. Şirul de caractere care este căutat. Prezintă modalitatea în care se poate face compararea a două stringuri. senzitivă. Dacă al doilea argument con ine un şir de mai multe caractere se va multiplica primul. Dacă este omis. căutarea începe de la pozi ia primului caracter.string2[. Expresie numerică care stabileşte pozi ia de început pentru fiecare căutare. care con ine de număr de ori caracterul specificat. Dacă în loc de caracter este un număr N caracterul multiplicat va fi Chr(N).12. Exemplu. Exemplu.2. SirCautat. I. I-43 . "ABC") ' Întoarce "AAAAAAAAAA". Pozitie = Instr (4. Sir. Dim Sir. "P". Întoarce 9. InStr([start.Întoarce 0.Print InStr ("Hello". "*") ' Întoarce "*****" MyString = String(5. Sir. "Balter") ' întoarce 8 Debug. "1") ' întoarce 3 End Sub I.2. "p". Pozitie Sir = "Popescu Panait" ' String în care se caută. Sir.7. Poate fi 0. • string2 (obligatoriu). Private Sub cmdInstr_Click () Debug. 1) ' Compara ie textuală. Pozitie = Instr (1. 'Următoarele 4 instruc iuni încep cercetarea de la pozi ia 4 Pozitie = Instr (4. Întoarce 9.

"DDDD") 'Afişează cuvântul pentru zi MsgBox Format(Now(). MsgBox MyStr ' Dacă parametrul format lipseşte se va întoarce un string. "##. "###0. MsgBox MyStr MsgBox Format(50. 3 _ caractere) MsgBox Format(Now(). MsgBox MyStr MyStr = Format("This is it". Ian 27 1993". "Long Time") MsgBox MyStr ' Afişează timpul curent al sistemului de calcul. • Expresie – este expresia pe care dori i să o formata i.format]) Func ia Format transformă o expresie într-un şir de caractere care respectă un şablon (format). "Short Date") ' 8/5/95 – Afişează în _ formatul definit pentru "dată scurtă" MsgBox Format(Now(). "Long Time" sau "hh:mm:ss AMPM") ori un format creat (definit) de utilizator. El este ori un nume valid de format (de ex.00%") ' Întoarce "500. MyStr = Format(23) ' Întoarce "23". "dddd. în _ formatul definit în Windows pentru "Long Date" MyStr = Format(MyTime. MsgBox MyStr ' Formate definite de utilizator._ virgula sau american. "h:m:s") ' Întoarce "17:4:23".459. MsgBox MyStr MyStr = Format(334. MsgBox MyStr MyStr = Format(MyDate. punctul) definit în Windows (System settings).00 LEI – Afişează în sistemul _ de valută definit în Windows (System settings) MsgBox Format(Now(). • Format (op ional) reprezintă tipul de format. MyDate.00%". MsgBox MyStr ' Formate definite de utilizator.2.S. pe care dori i să îl aplica i. în _ formatul definit în Windows pentru "Long Time" MyStr = Format(Date. – Întoarce semnul pentru punctul zecimal definit în Windows _ % – Întoarce în procente MyStr = Format(5459. Private Sub cmdFormat_Click () Dim MyTime. Se folosesc în continuare următoarele _ caractere pentru format: ' < – Întoarce stringul cu litere mici ' > – Întoarce stringul cu litere mari MyStr = Format("HELLO"._ System settings în Windows este U. Se folosesc în continuare următoarele _ caractere pentru format: _ # – Întoarce cifra dacă există.14.90". "0.00") ' Întoarce "334.I. Dacă nu există se întoarce "blanc" _ 0 – Întoarce cifra dacă există. "DDD") 'Afişează ziua prescurtat (pe 2. ##0.00") ' Întoarce "5. "hh:mm:ss AMPM") ' Întoarce _ "05:04:23 PM".40" . Format(expresie[. Dacă nu există se întoarce 0 _ . MyStr MyTime = #5:04:23 PM# MyDate = #1/27/93# ' Se vor folosi şi următoarele 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 ().9. "YYYY") 'Afişează anul din patru cifre End Sub I-44 . şablon. "Currency") '50. – Întoarce separatorul de grupe de cifre (în sistemul românesc. _ . "<") ' Întoarce "hello". MsgBox MyStr MyStr = Format(5.7. MsgBox MyStr MyStr = Format(MyTime. "Long Date") MsgBox MyStr ' Afişează data curentă a sistemului de calcul. mmm d yyyy") ' Întoarce _ "Miercuri.4. ">") ' Întoarce "THIS IS IT". Exemplu.

Funcţii pentru tablouri (array) . sunt şi virgula (. I-45 . opreşte inspec ia şi face conversia numai până la acest caracter.65". 2) (A.). MyString = Str(459. Indică dimensiunea a cărei margine (superioară sau inferioară) este întoarsă. ca pe o valoare numerică de tipul cel mai apropiat reprezentării valorii respective. 3) (A.3.4. va con ine o expresie numerică ce va fi convertită într-un şir de caractere.4.UBound şi LBound UBound (arrayname[. indiferent de cum este setat acesta în Windows (ca punct sau ca virgulă). -3 To 4) UBound şi LBound întorc următoarele valori: Func ia Parametrii Valoarea întoarsă UBound (A.7. I. Excep ie.4. Public. cu folosirea altor reguli de prezentare. 2 pentru a doua etc. de tip Long. Public. Tablourile pentru care dimensiunile sunt setate folosind To în declara iile Dim.001". • Punctul zecimal va fi reprezentat întotdeauna de semnul punct(. ReDim sau Static pot lua orice valoare întreagă ca fiind marginea cea mai de jos (cel mai mic indice). Ea depinde de setarea declara iei Option Base (de obicei 0). ReDim sau Static). 2) (A. Exemplu. • Printre caracterele care nu sunt recunoscute de func ia Val. Val(string) Întoarce numărul con inut în string. 1) (A.7. ea nefiind afectată de Option Base. în momentul în care întâlneşte un caracter care nu poate face parte din reprezentarea unui număr. Se utilizează 1 pentru prima dimensiune. Str(Număr) Transformă un număr într-un şir de caractere.001) ' Întoarce " 459. pentru o anumită dimensiune a unui tablou: Pentru UBound: valoarea indicelui celui mai mare disponibil (marginea superioară). Este de tip Variant (Long). • Număr – argumentul func iei.7.dimension]) Întorc o valoare de tip Long.1. Funcţii de conversie I.) sau semnul dolar ($). Private. se foloseşte func ia Format. 0 To 3. Dacă lipseşte.2. pentru orice dimensiune a unui tablou creat prin declara ie (Dim. • Pentru transformarea numerelor în stringuri. la începutul stringului va fi un spa iu pentru numerele pozitive sau semnul (–) pentru numerele negative.7. • Func ia Val. 3) 100 3 4 1 0 –3 LBound Marginea cea mai de jos. implicită. Sintaxa celor două func ii cuprind: − arrayname (obligatoriu). MyString = Str(-459. care va con ine. I. Denumirea variabilei care defineşte tabloul. Private. Pentru LBound: valoarea indicelui celui mai mic disponibil (marginea inferioară). Dim MyString MyString = Str(459) ' Întoarce "459".65) ' Întoarce "-459. Exemplu.dimension]) LBound (arrayname[. Baza unui tablou creat cu func ia Array este 0. este 0 sau 1. Func ia UBound se utilizează împreună cu func ia LBound pentru a determina mărimea unui tablou. • UBound – pentru a găsi cea mai mare valoare a dimensiunii unui tablou.I. • După conversie. 1) (A. Pentru tabloul cu dimensiunile: Dim A(1 To 100. şi anume: • LBound – pentru a găsi cea mai joasă valoare a dimensiunii unui tablou. automat va fi 1. − dimension (op ional).

în caseta de dialog Afişează butoanele Yes şi No. tab-ul şi LF nu se iau în considerare (se sar). butoanelor afişate Afişează butoanele Yes. există definită constanta de tip string: vbCr=Chr(13) & Chr(10) • Buttons (op ional . No.7. un caracter LF=Chr(10).). sunt considerate ca rădăcină pentru numere în reprezentarea octală. este modală la nivelul aplica iei curente sau a Sistem modal – toate aplica iile sunt 4096 blocate până când utilizatorul răspunde tuturor taskurilor casetei de mesaj. Expresie numerică care este suma valorilor reprezentând patru caracteristici ale căsu ei de mesaj şi anume: − ce butoane se afişează (OK.implicit este 0).1. depinzând de mărimea caracterelor folosite. Expresie de tip string afişată pe bara de titlu a casetei de dialog. respectiv hexazecimală. Afişează butoanele OK şi Cancel. − fa ă de ce este modală caseta de mesaj: aplica ie sau sistem (nu se poate ieşi din aceasta în aplica ie/ sistem până nu se închide). Lungimea sa maximă este de aproximativ 1024 caractere. Expresie de tip string afişată ca mesaj în caseta de dialog. − Title (op ional). Exemplu. − ce pictogramă se afişează. sau o combina ie (Chr(13) & Chr(10) ) după fiecare rând. Numărul şi tipul Afişează butoanele Abort. Retry şi Ignore. Yes. Al patrulea buton este implicit. • Punctul zecimal va fi reprezentat întotdeauna de semnul punct (.5.7. se va plasa pe bara de titlu numele aplica iei. Felul pictogramei Afişează pictograma Warning Query.• &O şi &H. Cancel. Care este butonul implicit Al treilea buton este implicit.") ' Întoarce 1615198 I. VbSystemModal Aplica ie modală – utilizatorul trebuie să Dacă caseta de text răspundă casetei de mesaj înainte de a continua să lucreze în aplica ia curentă. Dim MyValue MyValue = Val("2457") ' Întoarce 2457. se pot separa liniile utilizând un caracter CR=Chr(13). utilizate în partea Afişează pictograma Warning Message din stânga sus Afişează pictograma Information Message. Primul buton este implicit. aşteaptă utilizatorul să apese un buton şi întoarce o valoare de tip Integer care indică codul butonului apăsat. E. În VBA. No şi Cancel. Dacă lipseşte. Setările 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ă Afişează numai butonul OK. • Spa iile. Ignore).title]) Afişează un mesaj într-o căsu ă de dialog. Dacă promptul este compus din mai mult de un rând. Funcţii pentru mesaje I. Sintaxa func iei MsgBox cuprinde următoarele argumente: • Prompt (obligatoriu).buttons][. Afişează pictograma Critical Message. Afişează butoanele Retry şi Cancel. − care este butonul care se va considera implicit. Retry.5. Valoarea întoarsă de func ie este: I-46 . MsgBox(prompt[. Al doilea buton este implicit. MyValue = Val("24 and 57") ' Întoarce 24. MyValue = Val(" 2 45 7") ' Întoarce 2457. MyValue = Val(" 1615 198th Street N.

• Default (op ional). În consecin ă. @ -No=Il face negativ. în twips. Dacă titlul lipseşte. caseta de dialog este centrată orizontal.X][. un caracter LF(line feed) Chr(10).Y]) Afişează un mesaj într-o casetă. • Y (op ional).default][. Dacă promptul este compus din mai mult de un rând. aşteaptă ca utilizatorul să introducă un text sau/şi să apese un buton şi întoarce o valoare (string) ce con ine acest text. şi introduce în Rasp. _ vbYesNoCancel + vbQuestion + vbDefaultButton3 + vbSystemModal. vbInformation End Sub 'Se observă mai sus folosirea lui MsgBox ca pe o procedură I. se pot separa liniile utilizând un caracter CR(carriage return) Chr(13).title][. Lungimea sa maximă este de aproximativ 1024 caractere. Dacă lipseşte. distan a pe orizontală de la marginea din stânga a casetei de dialog la marginea din stânga a ecranului. Expresie de tip string afişată ca mesaj în caseta de dialog.7. sau o combina ie (Chr(13) & Chr(10) ) după fiecare rând. Expresie numerică care reprezintă. butonul apăsat de utilizator _ Se observă folosirea lui at ( @ ) ca separator de rânduri!! Rasp = MsgBox("Doriti modificarea semnului numarului " & _ Nr & " extras? @ -Yes=Il face pozitiv. 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 . depinzând de mărimea caracterelor folosite.5.Lasă numărul neschimbat End If MsgBox "Numarul prelucrat este: " & Nr. _ "Exemplu parametrii MsgBox") If Rasp = vbYes Then Nr = Abs(Nr) ElseIf Rasp = vbNo Then Nr = Abs(Nr) * -1 Else 'Cancel . în twips. ". I-47 . caseta de text va fi afişată goală. MsgBox poate fi utilizată şi ca procedură. Sintaxa func iei InputBox cuprinde următoarele argumente: • Prompt (obligatoriu). InputBox(prompt[. Dacă lipseşte. • X (op ional). • Title (op ional).LimInf + 1) * Rnd + LimInf) ' MsgBox folosit ca func ie ' Afişează mesaj. În acest caz parametrii nu se mai scriu între paranteze. caseta de dialog este pozi ionată vertical la aproximativ o treime din distan a până în subsolul ecranului. Expresie de tip string afişată în caseta de text ca răspuns implicit dacă utilizatorul nu introduce nimic. Dacă lipseşte. Exemplu. În această formă este folosită numai pentru afişarea unui mesaj. numele acestea pot fi utilizate oriunde în program în locul valorilor respective.Constanta vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Valoare 1 2 3 4 5 6 7 Butonul pe care s-a apăsat OK Cancel Abort Retry Ignore Yes No Aceste constante sunt definite în VBA. distan a pe verticală de la marginea de sus a casetei de dialog la marginea de sus a ecranului. Expresie numerică care reprezintă. Expresie de tip string afişată pe bara de titlu a casetei de dialog. se va plasa pe bara de titlu numele aplica iei. Exemplu.2.

"Error!") = vbOK Then strInput = InputBox("Introduce i număr între 1şi 10") Else Exit Sub End If Loop ' Afişează data corectă introdusă de utilizator.Now.Următorul exemplu utilizează InputBox pentru a citi o dată introdusă de utilizator şi folosirea lui MsgBox şi ca func ie şi ca procedură (pentru afişarea unor mesaje). Sub CustomMessage () Dim strMsg As String. de tip string.date1.date2) ' Afişează anul curent ' Afişează numărul lunii curente ' Afişează nr. Unitatea de timp este specificată de argumentul interval. " Else ' nu s-a introdus nimic Exit Sub End If End Sub I.date) Func ia DatePart întoarce o parte dintr-o dată.2.7.#12/31/02#) ' Nr. Now) MsgBox DatePart("M". DateDiff(interval. vbOKCancel.Now. Private Sub cmdDatePart_Click () MsgBox DatePart("YYYY".Now.#12/31/02#) ' Numarul trimestrelor până la 12/31/02 MsgBox DateDiff("q". Now) MsgBox DatePart("Q".6. @ A i introdus un număr _ care este mai mic decât 1 şi mai mare ca 10. strMsg = "Număr în afara intervalului. Now) End Sub I.7.Now. Funcţii cu tipul: Date/ Time I.#12/31/02#) End Sub I-48 . ") If strInput <> "" Then ' Testează ca valoarea intodusă să nu fie şir vid Do While (strInput < 0 Or strInput > 10) If MsgBox(strMsg.#12/31/02#) ' Nr. luni până la 12/31/02 ' Numărul de ani până la 12/31/02 MsgBox DateDiff("yyyy". care este specificată de argumentul interval. trimestrului curent ' Afişează ziua din anul curent Func ia DateDiff întoarce intervalul de timp dintre două date. Se observă utilizarea semnului @ pentru a delimita diversele păr i ale şirului de caractere.7. strInput = InputBox("Introduce i un număr între 1 şi 10.rol de delimitator de rânduri ' Se cere utilizatorului să introducă o valoare.6. poate lua următoarele valori: interval yyyy q m y d Descriere Anul Trimestrul Luna Ziua din an Ziua interval w ww h n s Descriere Ziua din săptămână Săptămâna Ora Minute Secunde Exemplu. @ Apăsa i OK pentru a _ introduce numărul din nou. Private SubcmdDateDiff_Click () MsgBox DateDiff("d". strInput As String ' Ini ializează stringul. Now) MsgBox DatePart("Y".1.6. deci date2-date1. Exemplu. zile până la 12/31/02 MsgBox DateDiff("m". DatePart(interval." ' @ . MsgBox "A i introdus numărul" & strInput & ". Argumentul interval.

I. Hour(date) Întoarce un Variant (Integer). Integer. dar practic dacă scădem o zi din 1 iunie. Now) ' Ziua de azi plus 3 trimestre End Sub I. care con ine data şi timpul curent (cu care este setat în momentul respectiv sistemul de calcul). second.2. Orice expresie numerică.4:35:17 PM I-49 . 3. Now) ' Ziua de azi plus 3 luni MsgBox DateAdd("yyyy". Pentru ceilal i ani trebuiesc introduse 4 cifre. second) Întoarce un Variant(Date) care va con ine timpul pentru o anumită oră.4.1) va fi: 31/Mai/1980.number.7. Se observă că opera iile se fac specific pentru zile şi luni. Year(date) Întoarce un Variant (Integer). DateSerial(1990 10. Dacă un argument este dat în afara intervalului acceptat. month şi day. TimeSerial(hour. care con ine timpul curent (cu care este setat în momentul respectiv sistemul de calcul). 35. 1 . I. Pentru a specifica o dată.February 12.8. Descrierea argumentelor: − Year (obligatoriu). Dim Timpul As Date Timpul = TimeSerial(16. Integer.6. 1969. se vor considera anii din două cifre seta i în Windows.date) Func ia DateAdd întoarce rezultatul adăugării sau scăderii unei perioade specifice de timp. Date() . Deci.5. specificată în argumentele: hour. valoarea fiecărui parametru trebuie să fie validă. I. care con ine ziua sau luna sau anul.I. minute.6. din data care se găseşte în argumentul func iei. Exemplu. − Month (obligatoriu). Time() . ar trebui să fie 0/6. DateSerial(year. Now(). Orice expresie numerică. 11. sau expresie numerică. Now) ' Ziua de azi plus 3 zile MsgBox DateAdd("m".întoarce un Variant (Date). Minute(date). la o (dintr-o) dată stabilită.6. day) Întoarce un Variant(Date) care va con ine data calendaristică specificată în argumentele: year. 1991. minut şi secundă. Second(date).7. 12) 'Întoarce data . care con ine data curentă (cu care este setat în momentul respectiv sistemul de calcul). exprimată relativ fa ă de altă dată.întoarce un Variant (Date). − Day (obligatoriu).întoarce un Variant (Date). Număr între 100 şi 9999 inclusiv. I. precizate prin argumentul interval.7. 3. adică ziua între 1-31 şi luna între 1-12.6. month.7. 3.1) din luna (8 2). Astfel ziua (1 . Time() Now() . Exemplul următor va întoarce o dată.7.6. 2. avem 31/Mai. 17) 'Reprezentatre timp . Integer. de exemplu December 31. inându-se cont de numărul de zile şi luni.6. Day(date). 32) ) va afişa 2/12/1998. Exemplu. Dim OData As Date OData = DateSerial(1969. Private Sub cmdDateAdd_Click () MsgBox DateAdd("d".7. Month(date). De exemplu MsgBox (DateSerial(1998. 3. Date(). atunci se va întoarce o dată care este practic mărită cu numărul de zile sau luni care depăşesc valoarea maximă pentru argumentul respectiv. care con ine secunda sau minutul sau ora.3. 8 . minute. Now) ' Ziua de azi plus 3 ani MsgBox DateAdd("q". din data care se găseşte în argumentul func iei.6. Dacă argumentul pentru an este între 0 şi 99.7. DateAdd(interval.

"French") End Function 'La apelul func iei vom avea: MsgBox MatchUp("Paris") ' afişează French I-50 . "Italian". caz-1[. CityName = "Paris". dacă: − condi ie = true – func ia întoarce parametrul TruePart. To i cei trei parametri ai func iei sunt obligatorii. − condi ie = false – func ia întoarce parametrul FalsePart. Dacă nici una din expresiile evaluate nu este True.. pînă când va ob ine o valoare True. Function TestIF(TestMe As Integer) as String TestIF = IIf(TestMe > 1000.value-1[.7. expr-n..7. Exemplu. atunci Choose întoarce valoarea Null. Switch(expr-1. ceea ce permite realizarea unor structuri complexe de teste. − dacă index = 2 atunci se întoarce caz-2. Function MatchUp(CityName As String) as String MatchUp = Switch(CityName = "London". "United". IIf(condi ie. TruePart sau FalsePart pot la rândul lor să con ină o altă func ie.I.1.3. şi gata… − Dacă expr-2 = False atunci trece la evaluarea următoare.7. "Large".7.7. Choose(index.2. "Speedy". Exemplu.caz-2.7. TruePart sau FalsePart. sau index > n. sau … caz_n) în func ie de valoarea pe care o are argumentul index. "Federal") End Function 'La apelul func iei vom avea: MsgBox GetChoice(2) ' afişează United Dim X As Variant X = GetChoice(5) ' X se va face Null I. Dacă index < 1. [.. "Small") End Function Dacă va fi folosită în: MsgBox TestIF(1500) ' afişează Large MsgBox TestIF(500) ' afişează Small I. TruePart.7. Function GetChoice(Ind As Integer) as String GetChoice = Choose(Ind.expr-n. Switch întoarce Null. expr-2.caz-n]]) Func ia Choose întoarce unul din argumentele listei (caz-1 sau caz-2.CityName _ = "Rome". şi gata… − Dacă expr-1 = False atunci trece la evaluarea următoare − Dacă expr-2 = True atunci se întoarce value-2. În acest moment.7.value-2… [.. FalsePart) Func ia IIf are o ac iune asemănătoare cu a instruc iunii If…Then…Else Func ia IIf întoarce unul din cele două argumente.]) Această func ie are o ac iune asemănătoare cu a instruc iunii: If…Then…ElseIf…Else Func ia Switch va evalua în ordine condi iile expr-1. deci şi un alt IIF. şi func ia întoarce valoarea pereche care se găseşte în argumentul value_?. cercetarea se opreşte. Deci: − Dacă expr-1 = True atunci se întoarce value-1. etc. − dacă index = n atunci se întoarce caz-n. şi anume: − dacă index = 1 atunci se întoarce caz-1."English". Funcţii: structuri de control I.value-n]].expr-2. Astfel. în func ie de rezultatul evaluării condi iei ce se găseşte în primul argument. Exemplu.

Apelarea func iei ReturnTwice. adică ini ializată. Situatie ' variabile variant Situatie = IsEmpty(Valoare) ' Întoarce True. Deci reamintim că: • NULL – variabilă variant în care datele nu sunt valide.7. care va avea valoarea TRUE numai dacă parametrul op ional testat nu a fost introdus în lista parametrilor actuali. Dim Valoare. adică este "". ' Declararea func iei. I. • EMPTY – variabilă variant care nu a fost îni ializată. Valoare = Null Situatie = IsNull(Valoare) ' Întoarce True. IsEmpty(NumeVariabila) Întoarce o valoare de tip Boolean care indică dacă o variabilă. gol) – string care nu are nimic în el. False – variabila a fost ini ializată (chiar cu Null sau un string vid). False – dacă parametrul nu are valoarea Null.7. Dim ReturnValue ReturnValue = ReturnTwice() ' Întoarce Null. Exemplu. IsNull(expresie) Întoarce o valoare de tip Boolean care indică dacă expresia transmisă ca parametru de intrare con ine date care nu sunt valide. Valoarea Null. deoarece este Empty Valoare = "" Situatie = IsNull(Valoare) ' Întoarce False. Situatie = IsEmpty(Valoare) ' Întoarce True. transmisă ca parametru de intrare. şi func ia va întoarce evident True. ceea ce constituie o eroare. ReturnValue = ReturnTwice(2) ' Întoarce 4. Funcţii de inspecţie I. Aşa cum am mai arătat. deci el practic lipseşte. definită cu un parametru op ional. Function ReturnTwice(Optional A) If IsMissing (A) Then ' Func ia a fost apelată fără parametrul A ReturnTwice = Null Else ' Func ia a fost apelată cu parametrul A I-51 .2. Dim Valoare. Situatie = IsEmpty(Valoare) ' Întoarce False. Parametrul este de tip variant şi con ine o dată de tip numeric sau string. Mai există încă două valori speciale.7.1. Func ia IsNull întoarce: True – dacă parametrul are valoarea Null.3. îndică faptul că un Variant nu con ine date valide. Situatie ' variabile variant Situatie = IsNull(Valoare) ' Întoarce False.I. • String de lungime 0 (vid. este de tip variant. deoarece este string vid _ (de lungime 0). adică au valoarea Null. atunci expresia va fi tot Null.7. Valoare = Empty ' Assign Empty. Func ia IsMissing întoarce o valoare de tip Boolean. sau a fost introdusă în ea direct Empty. Valoare = Null ' Assign Null. Exemplu.8. NumeParametru. Parametrul func iei IsMissing.8.8. IsMissing(NumeParametru) IsMissing se foloseşte într-o rutină.8. Exemplu. dacă un termen al expresiei este Null. 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 este de tip Variant şi con ine o expresie de tip numeric sau string. Aceste (NumeParametru) reprezintă parametrul formal optional care se testează dacă a fost introdus sau nu în lista parametrilor actuali la apelul func iei. este sau nu EMPTY. I. Func ia IsEmpty întoarce: True – dacă variabila NumeVariabila nu este ini ializată. Empty şi String vid (gol) care pot fi uşor confundate cu Null.

În cazul rapoartelor sau formularelor. Ele calculează expresii al căror domeniu de aplicabilitate este un câmp al tabelei (cererii) care se utilizează în obiectul unde sunt folosite. VarP. − Count – numărul de înregistrări ale câmpului (diferite de NULL). Func iile agregate SQL au ca argument numele câmpului pe care sunt definite. Reamintim că variabilele de tip variant se caracterizează prin faptul că în ele se pot introduce valori de diferite tipuri. în care introducerea func iei agregate SQL se face într-o coloană ataşată câmpului de defini ie. MyCheck ' Ini ializarea variabilelor IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69# ' !!! Aşa se pot scrie mai multe instruc iuni pe un rând. StDevP–calcule statistice (varian a şi devia ia standard). Exemplu. − Max. StDev. ele se folosesc fără argument. 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.7. Funcţiile agregate SQL O func ie agregată SQL este specifică prin faptul că datele ei de intrare sunt valorile unui câmp dintr-o tabelă (cerere) – care este legată de obiectul în care se foloseşte. I. 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. tabel. MyCheck = VarType(IntVar) ' Întoarce 2. deoarece lipseşte tipul de data Dim IntVar.ReturnTwice = A * 2 End If End Function Func ia IsMissing se aplică numai dacă parametrul op ional este de tip variant. să ne indice la un moment dat ce tip de date se găsesc într-o variabilă de tip variant. StrVar.9. − Var. − Avg – calculează media aritmetică a valorilor unui câmp. MyCheck = VarType(StrVar) ' Întoarce 8. func iile agregate SQL se calculează pe tabela (cererea) legată la acesta. I-52 .4. ' Variabile declarate variant.8. MyCheck = VarType(DateVar) ' Întoarce 7. 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. DateVar. atunci se va folosi expresia COUNT(*). în cazul cererilor cu clauză total. adică cerere. Func ia VarType tocmai acest rol are. _ aşa cum se vede. Min – întoarce valoarea maximă/ minimă a unui câmp. Totuşi. formular sau raport –.7. din toate sau o parte din înregistrări. care precizează tipul de date ce se găseşte în variabila de tip variant: NumeVariabilă (care este argumentul func iei). Func iile agregate SQL sunt: − Sum – calculează suma valorilor pe un câmp. separându-le. ele pot fi utilizate oriunde în loc de valorile specificate. VarType(NumeVariabilă) Întoarce un Integer. Dacă se doreşte să se ia în calcul şi câmpurile cu valoarea NULL. cu două puncte. I.

− DAvg – calculează media aritmetică a valorilor unui câmp. DFunc ie (NumeCâmp. Diferen a rezultă din faptul că domeniul de defini ie al acestor func ii este reprezentat de un câmp al unei tabele (cereri) – din baza de date curentă – asupra căruia se aplică. "Studenti". "Studenti". Dacă nu se selec ionează datorită criteriului nici o înregistrare. (aceasta nu are echivalent în func iile agregate SQL). deci încadrată din nou între ghilimele (2 ghilimele într-un string delimitat I-53 . dar cu litera D în fa ă) sunt: − DSum – calculează suma valorilor pe un câmp. aşa cum am mai arătat. iNr As Integer. Dim varX As Variant. nu se ia în considerare. (au aceiaşi denumire ca a func iilor agregate SQL.10. care este domeniul de defini ie pe care se calculează valoarea agregată. − DLookUp – întoarce prima valoare întâlnită în domeniul selec ionat. "Studenti". În celelalte func ii sau opera ii.7. − DVar. "[CodStudent]<" & Nr) ' cazul 4 – selec ia înregistrărilor cu Nume având valoarea ce se găseşte _ î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 găseşte într-o variabilă sSir = "Doru" varX = DMin ("[Anul]". "Studenti". – CodStudent (care e folosit în criteriu) este de tip numeric şi a fost _ comparat cu un LITERAL varX = DMax ("[Nume]". un criteriu de selec ie a înregistrărilor. Func iile agregate de domeniu. "[Nume]='" & sSir & "'") Se observă că în formarea criteriului este foarte important dacă criteriul se va aplica pe un câmp numeric sau de tip text. Dmin – întoarce valoarea maximă/ minimă a unui câmp. − DCount – numărul de înregistrări ale câmpului (diferite de NULL). valoarea NULL a unui termen duce la rezultatul NULL al expresiei. În cazul când avem de-a face cu un câmp text valoarea cu care se face compararea trebuie la rândul ei să fie string. la fel ca şi func iile agregate SQL. I. Dacă nu este prezent acest parametru. Exemplu. "[Nume]='Doru' ") ' cazul 3 – selec ia înregistrărilor cu CodStudent având valoarea < cea din _ variabila numerică iNr – întoarce dintre acestea valoarea Nume cea mai mare în ordinea de _ sortare. DStDevP – calcule statistice (varian a şi devia ia standard). NumeTabela[. se vor lua în calcul datele din câmpul respectiv din toate înregistrările tabelei specificate. eventual. func ia întoarce valoarea NULL. Domeniul de defini ie este stabilit de valorile ce se găsesc în parametrii (argumentele) func iei. Argumentele folosite sunt aceleaşi în toate aceste func ii şi stabilesc. Criteriu]) • NumeCâmp. "[CodStudent]<100") ' cazul 2 – selec ia înregistrărilor cu Nume având 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]". indiferent de felul în care e constituită aceasta. NumeTabela – sunt stringuri care stabilesc care este câmpul şi tabela (cererea) asupra căreia se fac calculele agregate.Valoarea NULL. DVarP. DStDev. în func iile agregate (SQL sau de domeniu). sSir As String ' cazul 1 – selec ia înregistrărilor din tabela Studenti cu CodStudent _ având valoarea <100 – întoarce dintre acestea valoarea Nume cea mai mare în ordinea de _ sortare. − DMax. Funcţiile agregate de domeniu Func iile agregate de domeniu întorc date de calcul agregate. • Criteriu – este un string prin care se introduce un criteriu de selec ie a înregistrărilor din domeniul specificat de primii doi parametri. – CodStudent (care e folosit în criteriu) este de tip numeric şi a fost _ comparat cu o dată care se găseşte într-o variabilă iNr = 100 varX = DMax ("[Nume]".

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