You are on page 1of 60

"Limbaje de programare folosite n informatice de gestiune" P A R T E A -ICUPRINS Cap I. Programarea n Visual Basic for Application(VBA)...................................

5
I.1 Domeniul de folosire al VBA ......................................................................................................5 I.1.1 Modulele de cod n Access.......................................................................................................6 I.2 Elementele generale ale limbajului Visual Basic ....................................................................7 I.2.1 Tipuri de date. ..........................................................................................................................8
I.2.1.1 Date numerice ntregi...............................................................................................................8 I.2.1.2 Date numerice reale.................................................................................................................8 I.2.1.3 Tipul de date BOOLEAN - logic.............................................................................................8 I.2.1.4 Tipul de date STRING - ir de caractere...............................................................................8 I.2.1.5 Tipul de date DATE - data calendaristic i timpul..........................................................10 I.2.1.6 Tipul de date ARRAY - tablou...............................................................................................10 I.2.1.7 TYPE - Crearea tipurilor de date definite de utilizator. ..................................................11 I.2.1.8 Tipul de date VARIANT..........................................................................................................11 I.2.1.8.1 Valorile EMPTY, NULL, STRING VID.........................................................................12 I.2.1.9 Tipul de date OBJECT............................................................................................................12 I.2.2.1 Declararea variabilelor.........................................................................................................12 I.2.2.2 Caractere folosite ca Type-declaration...............................................................................13 I.2.2.3 Option Explicit (Opiune de explicitare).............................................................................13 I.2.2.4 Variabile Locale i Globale..................................................................................................13 I.2.2.5 Variabile Publice i Private..................................................................................................14 I.2.2.6 Variabila Statice.....................................................................................................................15 I.2.2.7 Domeniul i durata de valabilitate a variabilelor ............................................................15 I.2.2.8 Declararea i folosirea variabilelor ARRAY - TABLOU..................................................16 I.2.2.8.1 Declararea tablourilor cu dimensiuni fixe - statice........................................................16

I.2.2 Variabile...................................................................................................................................12

Observaia 1. Ca orice declaraie care nu specific tipul i tablourile declarate fr tip sunt de tip Variant. n acest caz fiind Variant, fiecare element va ocupa 16 bytes, dac este numeric sau 22 bytes, dac este string. Deci la tablouri mari se poate ajunge la un consum mare de memorie, ceea ce determin o rezerv n folosirea tablourilor de Variant........................................16
I.2.2.8.2 Declararea tablourilor cu dimensiuni variabile - dinamice............................................16 I.2.2.8.3 Utilizarea tablourilor.........................................................................................................17 I.2.2.8.4 Tablouri de octei..............................................................................................................17

I.2.3 Constante..................................................................................................................................19 I.2.4 Instruciunile executive ale limbajului Visual Basic........................................................19


I.2.4.1 Instruciunea de atribuire......................................................................................................20 I.2.4.1.1 Formarea expresiilor n Visual Basic..............................................................................20

Observaia 1. Aa cum am mai artat, dac un termen al unei expresii este NULL, atunci i rezultatul expresiei este tot NULL. Spunem c NULL-ul se propag n expresii. Totui exist o excepie, i anume la operatorul de concatenare a irurilor, &: Dac un termen este NULL, iar cellalt nu este NULL, atunci rezultatul va fi chiar termenul diferit de NULL...........................22 Observaia 2. Valoarea EMPTY, n expresii este considerat, funcie de tipul de date pe care l reprezint, chiar valoarea cu care se iniializeaz variabilele de tipul respectiv(astfel n expresii dac un termen numeric este EMPTY

Created by Serban Criscota

Page 1

19 ianuarie 2001

atunci se va considera =0; dac este logice =False; dac este string = ir vid; etc.) 22
I.2.4.2 Structurile de control.............................................................................................................22 I.2.4.2.1 Structura secvenial.........................................................................................................22 I.2.4.2.2 Structura alternativ..........................................................................................................22

I.2.4.2.2.1 Structura alternativ simpl. Instruciunea: If...Then...Else............................................................22 I.2.4.2.2.2 Structura alternativ multipl. Instruciunile: Select Case i If...Then...ElseIFElse...................23

Observaia 1. Dac mai multe condiii sunt adevrate, atunci se vor executa toate grupurile corespunztoare de instruciuni. Deci instruciunea Select Case nu se oprete la ntlnirea primei condiii adevrate, ci va evalua toate condiiile............................................................................................................................23 Observaia 2. n ValoareX se pot folosi reuniuni de mulimi (operator virgula - ex: 1,2,5) intervale (operator TO - ex: 1 To 7), sau submulimi(operator IS ex: Is > 7)...........................................................................................................................23
I.2.4.2.3 Structura repetitiv............................................................................................................24
I.2.4.2.3.1 Structura repetitiv cu test. Instruciunea DO.................................................................................24

Observaia 1. Instruciunea Exit Do, provoac ieirea forat din ciclu. De obicei se execut funcie de evaluarea unei condiii ntr-o instruciune IF.......25 Observaia 2. Condiia este evaluat funcie de locul unde este plasat n instruciune i anume:....................................................................................................25 Observaia 3. Ciclul se execut minim de................................................................25
I.2.4.2.3.2 Structura repetitiv cu contor. Instruciunea FOR...NEXT.............................................................26

Observaia 1. Instruciunea Exit For, provoac ieirea forat din ciclu i continuarea programului cu instruciunile de dup NEXT. De obicei se execut funcie de evaluarea unei condiii ntr-o instruciune IF.......................................26 Observaia 2. Sunt admise imbricri ale structurilor For, dac sunt folosite variabile contor diferite ca n exemplul urmtor:...................................................26 Observaia 3. ntr-un For, trebuie evitat schimbarea valorii contorului......27 Observaia 4. Structura For ... Next este folosit atunci cnd sunt un numr exact de iteraii de executat..........................................................................................27
I.2.5 Rutine - proceduri i funcii.................................................................................................27
I.2.5.1 Ce este o rutin? Elementele care definesc o rutin.........................................................27

Observaia 1. Definirea unei rutine se face prin atribuirea unui nume(obligatoriu) acesteia i prin stabilirea listei de parametrii(opional). Parametrii definii n rutin se numesc parametrii formali. ...............................27 Observaia 2. Declararea parametrilor formali se face dup regulile aplicate la declararea variabilelor..............................................................................................28 Observaia 3. Apelarea unei rutine se face prin numele ei.................................28 Observaia 4. n momentul apelrii, trebuie s se realizeze o coresponden ntre nite date(variabile, constante, literali) ale modulului apelant cu parametrii formali ai rutinei. Aceasta se face prin stabilirea unei liste de parametrii actuali, declarai n momentul apelrii. Evident parametrii actuali i formali trebuie s fie de acelai tip i s ocupe acelai loc n cele dou liste. 28
Created by Serban Criscota Page 2 19 ianuarie 2001

Observaia 5. Parametrii de intrare ai rutinei pot fi n lista parametrilor actuali: variabile, constante, literali sau expresii....................................................28 Observaia 6. Parametrii de ieire ai rutinei pot fi n lista parametrilor actuali numai variabile, deoarece acetia prin definiie i pot schimba valoarea n timpul execuiei rutinei............................................................................28
I.2.5.1.1 Transmiterea datelor prin parametrii...............................................................................28 I.2.5.2 Crearea(definirea) unei rutine.............................................................................................29 I.2.5.2.1 Proceduri(Subrutine).........................................................................................................29 I.2.5.2.2 Funcii................................................................................................................................30

Observaia 1. Se observ c singura deosebire esenial fa de proceduri, se datoreaz faptului c numele funciei are dou semnificaii fiind n acelai timp i numele rutinei i parametru de ieire al rutinei. Din aceast cauz acestuia trebuie s i se precizeze tipul de date. Dac acest lucru nu se face atunci implicit se va considera Boolean tipul funciei............................................30 Observaia 2. n loc de Exit Sub i End Sub, la funcii sunt Exit Function i End Function, evident cu acelai rol. ........................................................................30
I.2.5.3 Apelarea unei rutine...............................................................................................................31 I.2.5.3.1 Apelarea unei proceduri(subrutine).................................................................................31

Observaia 1. Diferena ntre cele dou apeluri este c la apelarea cu Call, parametrii actuali ai procedurii trebuie scrii ntre paranteze, pe cnd la apelarea direct prin numele procedurii, este obligatoriu s nu se foloseasc paranteze...........................................................................................................................31
I.2.5.3.2 Apelarea unei funcii........................................................................................................31

Observaia 1. O procedur nu poate fi folosit n locul unei funcii ntr-o expresie, deoarece nu retureaz valori (chiar dac are parametrii de ieire). .31 Observaia 2. Funciile pot fi apelate i ca pe o procedur n oricare din cele dou modaliti prezentate...........................................................................................31
I.2.5.4 I.2.5.5 I.2.5.6 I.2.5.7 I.2.5.8 Domeniul de valabilitate(vizibilitatea) al rutinelor..........................................................32 Rutine definite de utilizator. Introducerea codului VBA...................................................32 Procedurile evenimentelor.....................................................................................................32 Utilizarea combinat a rutinelor utilizator i a procedurilor eveniment.......................34 Parametri opionali................................................................................................................35

I.2.6 Bibliotecile standard de funcii i proceduri. ...................................................................36


I.2.6.1 Funcii matematice.................................................................................................................37 I.2.6.1.1 Int(numr); Fix(numr)....................................................................................................37 I.2.6.1.2 Abs(numr)........................................................................................................................37 I.2.6.1.3 Sgn(numr)........................................................................................................................37 I.2.6.1.4 Sqr(numr).........................................................................................................................37 I.2.6.1.5 Exp(numr)........................................................................................................................38 I.2.6.1.6 Log(numr)........................................................................................................................38 I.2.6.1.7 Rnd[(numr)].....................................................................................................................38 I.2.6.1.8 Sin(numr).........................................................................................................................39 I.2.6.1.9 Cos(numr)........................................................................................................................39 I.2.6.1.10 Tan(numr)......................................................................................................................39 I.2.6.1.11 Atn(numr)......................................................................................................................39 I.2.6.1.12 Expresii pentru calculul funciilor matematice derivate..............................................40 I.2.6.2 Funcii TEXT - pentru stringuri............................................................................................40 I.2.6.2.1 Asc(string).........................................................................................................................40 I.2.6.2.2 Chr(CodCaracter)..............................................................................................................40 I.2.6.2.3 AscB(string); AscW(string); ChrB(CodChar); ChrW(CodChar)..................................41

Observaia 1. Se observ c n codul UNICODE, primele 128 de coduri sunt ca n codul ASCII............................................................................................................41
Created by Serban Criscota Page 3 19 ianuarie 2001

I.2.6.2.4 LCase(string).....................................................................................................................42 I.2.6.2.5 UCase(string).....................................................................................................................42 I.2.6.2.6 LTrim(string); RTrim(string); Trim(string)....................................................................42 I.2.6.2.7 Len(string | NumeVariabila)............................................................................................42 I.2.6.2.8 Left(string, lungime).........................................................................................................43 I.2.6.2.9 Right(string, lungime)......................................................................................................43 I.2.6.2.10 Mid(string, start[,lungime])............................................................................................44 I.2.6.2.11 InStr([start, ]string1, string2[, compare])......................................................................44 I.2.6.2.12 String(numr, caracter)...................................................................................................45 I.2.6.2.13 Space (numr)..................................................................................................................45 I.2.6.2.14 Format(expresie[, format])............................................................................................46 I.2.6.3 Funcii pentru tablouri(array)..............................................................................................47 I.2.6.3.1 UBound(arrayname[, dimension])...................................................................................47 I.2.6.3.2 LBound(arrayname[, dimension])...................................................................................47 I.2.6.4 Funcii pentru mesaje.............................................................................................................48 I.2.6.4.1 MsgBox(prompt[, buttons] [, title] )................................................................................48

Observaia 2. Aceste constante sunt specificate de Visual Basic for Applications. n consecin, numele acestea pot fi utilizate oriunde n program n locul valorilor respective..........................................................................................49 Observaia 3. MsgBox poate fi utilizat i ca procedur. n acest caz parametrii nu se mai scriu ntre paranteze. n aceast form este folosit pentru afiarea unui mesaj...........................................................................................49
I.2.6.4.2 InputBox(prompt[, title] [, default] [, xpos] [, ypos] )...................................................50 I.2.6.5 Funcii cu tipul: Date/Time ..................................................................................................51 I.2.6.5.1 DatePart(interval, date).....................................................................................................51 I.2.6.5.2 DateDiff(interval, date1, date2).......................................................................................51 I.2.6.5.3 DateAdd(interval, number, date).....................................................................................52 I.2.6.5.4 Day(date); Month(date); Year(date)................................................................................52 I.2.6.5.5 Second(date); Minute(date); Hour(date).........................................................................52 I.2.6.5.6 Now....................................................................................................................................52 I.2.6.5.7 Date....................................................................................................................................52 I.2.6.5.8 Timp...................................................................................................................................52 I.2.6.5.9 DateSerial(year, month, day)...........................................................................................52 I.2.6.6 Funcii: structuri de control..................................................................................................53 I.2.6.6.1 IIf(condiie, TruePart, FalsePart).....................................................................................53

Observaia 1. TruePart sau FalsePart, pot la rndul lor s conin o alt funcie, deci i IIF, ceea ce permite realizarea unor structuri complexe de teste. 53
I.2.6.6.2 Choose(index, caz-1[, caz-2, ... [, caz-n]])......................................................................53 I.2.6.6.3 Switch(expr-1, value-1[, expr-2, value-2 [, expr-n,value-n]])..................................54 I.2.6.7 Funcii de inspecie................................................................................................................54 I.2.6.7.1 VarType(NumeVariabil).................................................................................................54 I.2.6.7.2 IsNull(expresie).................................................................................................................55

Observaia 1. Valoarea Null, ndic faptul c un Variant nu conine date valide. Mai exist nc dou valori Empty i String vid(gol) care pot fi uor confundate cu Null, ceea ce constituie o eroare. Deci vom avea:.........................56
I.2.6.7.3 IsEmpty(NumeVariabila).................................................................................................56 I.2.6.7.4 IsMissing(NumeParametru)..............................................................................................56

Observaia 1. Funcia IsMissing, se aplic numai dac parametrul opional este de tip variant. Dac parametrul opional nu este de tip variant ea va ntoarce ntotdeauna(fie c parametrul opional este sau nu este folosit la apelarea funciei) valoarea FALSE. ...........................................................................57
I.2.6.8 Funciile agregate SQL..........................................................................................................57 I.2.6.9 Funciile agregate de domeniu.............................................................................................57 I.2.6.10 Funcii de conversie.............................................................................................................58
Created by Serban Criscota Page 4 19 ianuarie 2001

I.2.6.10.1 Str(Numr).......................................................................................................................58

Observaia 1. Dup conversie, la nceputul stringului va fi un spaiu pentru numerele pozitive / sau semnul (-) pentru numerele negative..............................59 Observaia 2. Punctul zecimal va fi reprezentat ntotdeauna de semnul punct(.), indiferent de cum este setat acesta n Windows(ca punct sau ca virgul). 59
I.2.7 Mediul de depanare i dezvoltare VBA..............................................................................60
I.2.6.10.2 Val(string)........................................................................................................................59

Cap I.

Programarea n Visual Basic for Application(VBA).

Basic, este unul din cele mai vechi limbaje de programare. El a fost creat n idea de a se realiza un limbaj de programare necesar unui specialist dintr-un anumit domeniu, care nu are cunotine aprofundate despre sistemele de calcul. Basic a fost implementat iniial, n sistemele de operare, ca un interpretor, adic ca un sistem care n momentul n care preia o instruciune surs Basic, o transform imediat n instruciuni obiect(cod main) i le execut. Pentru a l face ct mai accesibil, au existat variante de Basic care au implementat i comenzi specifice unui sistem de operare, ajungndu-se pn a se realiza calculatoare dedicate pentru lucrul sub Basic, fr sisteme de operare. Evident, fiind conceput pe aceste principii, aplicaiile realizate nu erau performante, ele ne utiliznd eficient facilitile unui sistem de calcul. Treptat, s-a trecut la realizare unor implementri, tehnic mai performante, prin realizarea de compilatoare pentru Basic sub diferite sisteme de operare, adic a unor module care transform un fiier cu instruciuni surs Basic ntr-un fiier care conine instruciuni direct executabile, n cod obiect. Firma Microsoft, a realizat o versiune de Basic, numit Visual Basic, care pe lng principiile iniiale s-a dorit a rezolva urmtoarea problem: Un limbaj de programare universal, unic, care s poat fi folosit att n aplicaiile de sistem(n locul limbajului C) ct i n cele utilizator, performant att din punct de vedere a limbajului(implementnd conceptele de programare modular, programare structurat i programare la nivel de obiect) ct i din punct de vedere al utilizrii tuturor facilitilor sistemului de operare. Astfel s-au creat, pe baza aceluiai nucleu de programare Basic, trei sisteme: Microsoft Visual Basic, ca limbaj universal de programare; Visual Basic for Application(Visual Basic pentru aplicaii), prescurtat uzual VBA, ca un limbaj complex pentru dezvoltarea aplicaiilor n cadrul programelor din Microsoft Office. Aceasta nseamn c nucleul limbajului, componentele sale i mediul sunt aceleai n Access, Word sau Excel. VBA este aproape identic cu limbajul universal de programare Microsoft Visual Basic; Visual Basic Script(VB Script), utilizat n special pentru aplicaiile Internet; I.1 Domeniul de folosire al VBA Aplicaiile mai simple din Access pot fi scrise fr a fi nevoie de vre-o instruciune, eventual folosind comenzile macro. Dei comenzile macro sunt foarte bune pentru rezolvarea rapid a unor prelucrri necesare pentru dezvoltarea majoritii aplicaiilor de baz, realizarea unor aplicaii complexe, profesioniste n Access se face folosind limbajul VBA. Acest lucru se datoreaz faptului c, spre deosebire de comenzile macro, Visual Basic for Application ofer posibiliti de lucru specifice limbajelor de nivel nalt de programare orientat pe obiecte. Cteva dintre aceste posibiliti sunt: Tratarea erorilor prin proceduri speciale create de proiectant. n timpul execuiei unei aplicaii pot interveni diverse erori(de exemplu o mprire la zero sau ieirea din domeniul de definiie al unei variabile, etc.) pe care sistemul le trateaz n general prin stoparea modulului unde apar sau chiar a ntregii aplicaii. VBA ofer posibilitatea ca la apariia unei erori, controlul s fie dat unui modul de cod
Created by Serban Criscota Page 5 19 ianuarie 2001

VBA, realizat de proiectant care s rezolve n funcie de context situaia aprut, fr a mai fi necesar stoparea modulului respectiv sau a aplicaiei. crearea unor structuri ciclice pentru parcurgerea seturilor de nregistrri . Datele unei tabele sau cereri de selecie se pot manipula ca pe un fiier specific, numit set de nregistrri. execuia proceselor tranzacionale. Acestea reprezint practic posibilitatea de a efectua actualizrile ntr-un set de nregistrri, global, la un anumit moment. n cazul apariiei unei erori se pot anula toate actualizrile din procesul respectiv, setul de nregistrri rmnnd ne modificat. apelarea funciilor Windows API, prin care se pot folosi module ale sistemului de operare. crearea i manipularea prin program a obiectelor necesare aplicaiei utilizarea constantelor i a variabilelor crearea de clase de obiecte De asemenea VBA uureaz scrierea bibliotecilor de funcii reutilizabile, precum i proiectarea i depanarea proceselor complexe de ctre programatori. n concluzie, dei comenzile macro pot da soluii rapide problemelor simple, limitrile lor determin necesitatea folosirii limbajului VBA pentru dezvoltarea soluiilor mai complexe. I.1.1 Modulele de cod n Access Codul VBA este scris n uniti numite rutine, care pot fi subrutine(proceduri) sau funcii. Aceste subrutine i funcii sunt pstrate n obiecte numite module de cod, i anume: Module specifice unui anumit formular sau raport. Modulele specifice unui formular sau raport sunt n general numite coduri din spatele formularelor (Code Behind Forms CBF). Rutinele din acest loc pot fi vizibile(cunoscute, apelabile) doar din modulul respectiv de cod. Codul din spatele formularului sau raportului se poate accesa prin acionarea pictogramei specifice codului VBA (dup selecia obiectului respectiv) sau prin apsarea celor trei puncte () din dreptul unui eveniment al paginii respective a unui obiect aparinnd formularului sau raportului respectiv *. Not: * Dac procedura eveniment nu este creat, atunci automat un Wizard, va crea structura acesteia, adic instruciunile de declarare i sfrit precum i completarea listei de parametrii dac este cazul. Dac procedura eveniment a fost creat anterior, atunci se va afia poriunea din pagina de cod a formularului sau raportului care conine respectiva procedur. Modulele globale, se pot afia prin acionarea paginii Module, din fereastra Database. Foarte important este faptul c rutinele scrise n aceast zon pot fi vizibile (dac sunt declarate Public) nu numai din toate modulele de cod ale aplicaiei, dar chiar din obiecte ale aplicaiei, din formulare, rapoarte, cereri sau tabele. Exemplu. De exemplu dac n modulul global se gsete o funcie declarat public, cu numele 'Prag', aceasta va putea fi folosit n expresii din orice: modul general sau din spatele unui formular sau raport; controale calculate din formulare sau rapoarte; proprieti ale controalelor sau ale tabelelor(de exemplu Validation Rule, Default Value); criterii din cereri; cmpuri calculate din cereri; practic de oriunde este acceptat o expresie. Orice modul de cod, este format din dou pri: n prima parte se introduc declaraiile generale ale modulului, valabile n ntreg modulul. Acestea sunt: Opiunile modulului. De exemplu: Option Explicit, care foreaz declararea tuturor variabilelor folosite n modul.
Created by Serban Criscota Page 6 19 ianuarie 2001

Declararea tipurilor, variabilelor i constantelor, vizibile n tot modulul de cod. n a doua parte se introduc rutinele modulului de cod. O subrutin(procedur) este o rutin care execut o aciune: la apariia unui eveniment al unui obiect al aplicaiei ori la apelarea(lansarea) ei dintr-o alt rutin VBA. O funcie este un tip special de rutin, datorit faptului c poate ntoarce o valoare, chiar n numele ei. Deci codul VBA poate fi gsit n rapoarte, formulare i module de cod. n formulare i rapoarte, codul VBA poate fi plasat n funciile definite de utilizator, n subrutine, ca i n procedurile eveniment, pe cnd n modulele generale codul VBA este plasat numai n rutine(funcii sau proceduri) definite de utilizatori. De fapt, pentru a construi cu succes rutine n cod VBA, sunt foarte importante dou lucruri: cum se stabilete domeniul de valabilitate al variabilelor i rutinelor cum se transmit i se ntorc valorile din rutine. Toate aceste componente vor fi analizate n cadrul prezentului capitol. n concluzie, putem spune c programarea n VBA nu este procedural, adic nu avem de a face cu un program clasic, cu nceput i sfrit, care rezolv paii unui algoritm. Codul VBA este practic format din rutine, care sunt executate numai atunci cnd se produc anumite evenimente. Deci codul VBA implic realizarea unui programri discontinue. I.2 Elementele generale ale limbajului Visual Basic Definirea unui limbaj de programare, se face n general prin configurarea urmtoarelor elemente de baz: Tipuri de date, Variabile; Constante; Instruciuni Instruciunea de atribuire; Structuri de control; Rutine(proceduri i funcii) Biblioteci; Dac limbajul de programare este orientat la nivel de obiect, aa cum este Visual Basic sau VBA, atunci trebuiesc definite i elemente referitoare la: Referirea obiectelor; Crearea claselor de module de obiecte; Crearea i manipularea obiectelor (instane ale claselor de obiecte); Crearea i manipularea coleciilor de obiecte Limbajele de programare dezvoltate mai pun la dispoziie programatorilor: Proceduri specifice de tratare ale erorilor; Modaliti de verificare i depanare a erorilor de programare; Proceduri de import/export de obiecte exterioare aplicaiei; Interaciunea cu sistemul de operare. Manipularea datelor organizate n fiiere sau baze de date.

Created by Serban Criscota

Page 7

19 ianuarie 2001

I.2.1 Tipuri de date. Prin dat se nelege orice entitate asupra creia poate opera calculatorul. n cod main datele se reprezint sub forma unei secvene de cifre binare. n cazul limbajelor de nivel nalt se face abstracie de detaliile de reprezentare a datelor, dezvoltnd conceptul de tip de date. n memoria calculatorului orice dat apare ca o succesiune de bii. Modul n care pentru o astfel de succesiune se asociaz o valoare depinde de interpretarea ce i se d. La nivelul limbajelor de programare o astfel de interpretare este reprezentat de tipul datelor. Un tip de date este noiunea folosit pentru a defini mulimea valorilor pe care le pot avea datele ce aparin acestui tip, dimensiunea efectiva pe care o ocup n memorie datele, precum i operaiile ce se pot efectua asupra acestor date. Orice limbaj de programare pune la dispoziia programatorului cteva tipuri de date predefinite (standard), cum ar fi tipurile pentru datele ntregi, reale, caracter sau booleene(logice). Acestea sunt tipuri simple de date care se refer la valori elementare. Limbajul VBA ofer mai multe tipuri simple de date predefinite, cele mai folosite fiind prezentate n continuare:
I.2.1.1 Date numerice ntregi

Numele tipului de date Byte (octet) Integer (ntreg) Long (ntreg lung) Currency (valut) ------------------

Spaiul de memorare 1 octet 2 octei 4 octei 8 octei

Domeniul de valori 0 255 32,76832,767 - 2,147,283,648 . 2,147,483,647 +/- 922,337,203, 685,477.5808

Numrul de valori 2^8 2^16 2^32 15 cifre i 4 zecimale

Valoarea iniial 0 0 0 0

Ex. de nume variabil btValue iCounter lAmount cValuta

I.2.1.2 Date numerice reale

Datele numerice reale se exprim sub forma: Numele tipului de date Single (precizie simpl) Double (precizie dubl) -----------------Spaiul de memorare 4 octet 8 octei

+/-M * 10^+/-E
Domeniu Exponent(E) E-45E38 E-324E308 Valoarea iniial 0 0 Ex. de nume variabil sngValue dValue

Domeniu Mantisa(M) Aproximativ 7 cifre zecimale Aproximativ 14 cifre zecimale

I.2.1.3 Tipul de date BOOLEAN - logic

Numele tipului de date Boolean (logic) ------------------

Spaiul de memorare 2 octet

Domeniu De valori True(-1); False(0)

Valoarea iniial False(0)

Ex. de nume variabil bRaspuns

I.2.1.4 Tipul de date STRING - ir de caractere

Exist dou tipuri de date de tip String i anume: String de lungime variabil, care poate conine pn la aproximativ 2 milioane caractere (2^31). String de lungime fix, care poate conine pn la aproximativ 64,000 caractere (2^16).
Created by Serban Criscota Page 8 19 ianuarie 2001

Codul folosit este codul ANSI i are date n intervalul 0-255, Primele 128 caractere (0127) corespund literelor i simbolurilor de pe o tastatur US, adic codului ASCII. Dintre acestea primele 32 sunt caractere netipribile, dar care pot avea efect n afiarea datelor. De exemplu: caracterul cu codul 13, CR - retur de car, care produce trecerea la nceput de rnd caracterul cu codul 10, LF - rnd nou, care produce trecerea rndul urmtor caracterul cu codul 7, Bell - semnal sonor caracterul cu codul 8, Back Space - napoi caracterul cu codul 9, Tab - salt la urmtorul marcaj Codul ASCII 0 16 32 [space] 48 0 64 @ 80 P 96 ` 112 p 1 17 33 ! 49 1 65 A 81 Q 97 a 113 q 2 18 34 " 50 2 66 B 82 R 98 b 114 r 3 19 35 # 51 3 67 C 83 S 99 c 115 s 4 20 36 $ 52 4 68 D 84 T 100 d 116 t 5 21 37 % 53 5 69 E 85 U 101 e 117 u 6 22 38 & 54 6 70 F 86 V 102 f 118 v 7 Bell 23 39 ' 55 7 71 G 87 W 103 g 119 w 8 BS 24 40 ( 56 8 72 H 88 X 104 h 120 x 9 Tab 25 41 ) 57 9 73 I 89 Y 105 i 121 y 10 LF 26 42 * 58 : 74 J 90 Z 106 j 122 z 11 27 43 + 59 ; 75 K 91 [ 107 k 123 { 12 28 44 , 60 < 76 L 92 \ 108 l 124 | 13 CR 29 45 61 = 77 M 93 ] 109 m 125 } 14 30 46 . 62 > 78 N 94 ^ 110 n 126 ~ 15 31 47 / 63 ? 79 O 95 _ 111 o 127 -----------------Urmtoarele 128 caractere (128255) corespund caracterelor speciale, diacriticelor, accente, simboluri valutare, litere n alfabete internaionale etc. Literalii string se scriu ntre ghilimele("."). La iniializare variabilele de tip string, vor avea valoarea ir vid, adic "". Operatorul pentru concatenarea datelor este & (se poate folosi i semnul + )La formarea numelor variabilelor de tip string, se folosete de obicei prefixul s. De exemplu sNume. Not: Dei ne-am atepta ca un caracter s ocupe un octet(8 bits) de memorie(fiind 256=2^8 caractere n codul ANSI), totui spaiul ocupat de un caracter n memorie este de 2 octei. Aceasta se datoreaz faptului c n memorie caracterele sunt n codul UNICODE, cod care are 2^16 caractere. De exemplu n memorie caracterele ASCII, vor avea pe primul octet codul ASCII al caracterului iar n al doilea 0, iar caracterele ANSI cu cod mai mare de 127, vor avea n al doilea octet 1. Deci, n limbajul Visual Basic, caracterele se folosesc n codul ANSII(ASCII), dei n memorie ele sunt n codul UNICODE. ------------------

Created by Serban Criscota

Page 9

19 ianuarie 2001

I.2.1.5 Tipul de date DATE - data calendaristic i timpul

Numele Spaiul de Domeniu Ex. de nume tipului de date memorare de valori variabil Date Data: 1/1/100 la 12/31/9999 8 octet dtStartDate (data + timpul) Timp: 0:00:00 la 23:59:59. -----------------Literalii date se scriu ntre diezi(#.#). De exemplu: #January 1, 1993# sau #1 Jan 93#. Afiarea datelor i timpului se face conform formatului specificat n Windows. Not: Un numr poate fi convertit n tip Date, partea din stnga punctului zecimal reprezentnd data, iar cea din stnga timpul. Ora 24 este 0.0, ora 12 este 0.5, numerele negative reprezint date anterioare celei de 30/Decembrie/1899. La formarea numelor variabilelor de tip string, se folosete de obicei prefixul dt. De exemplu dtStop. -----------------Visual Basic include mecanismele necesare construirii unor tipuri noi, prin restrngeri sau combinri ale tipurilor deja definite. Aceste mecanisme poart numele de constructori de tipuri i joac un rol esenial n programare.
I.2.1.6 Tipul de date ARRAY - tablou

Un Tablou - Array, definete o mulime de valori care sunt de acelai tip de dat. Un Array, dei reprezint o singur variabil poate stoca mai multe date de acelai tip n compartimentele(elementele) sale. Structura unui asemenea tip poate avea o dimensiune sau mai multe. Un Array, se caracterizeaz prin 3 elemente dintre care primele dou definesc structura: Numrul de dimensiuni. Numrul de elemente(celule) al fiecrei dimensiuni. Practic numrul de ordine al primului(implicit 0) i al ultimului element al fiecrei dimensiuni. Tipul de date al elementelor tabloului. Poate fi orice tip de date, eventual chiar tot array. Referirea la un tablou se poate face fie pentru ntreaga structur(folosind numele tabloului), fie pentru fiecare element n parte(folosind numele tabloului indexat la elementul respectiv). Exemplu. Pentru a stoca cheltuielile pe care le facem n fiecare zi al unui an vom declara bineneles o singur variabil de tip Array, cu 365 elemente de tip numeric, dect 365 variabile individuale. Fiecare element din tablou va conine o singur valoare. Implicit un tablou se indexeaz de la 0. Declararea variabilei se va face: Dim cCheltuieli(364) As Currency Pentru a introduce n primele 100 de zile valoarea 22 vom folosi urmtoarea procedur: Sub ExempluArray() Dim cCheltuieli (364) As Currency Dim intI As Integer For intI = 0 to 99 cCheltuieli (intI) = 22 Next End Sub ------------------

Created by Serban Criscota

Page 10

19 ianuarie 2001

I.2.1.7 TYPE - Crearea tipurilor de date definite de utilizator.

Exist posibilitatea ca s se creeze structuri noi de date, definite de proiectant, formate din combinri din alte tipuri de date. ------------------

[Public | Private] Type NumeTip NumeElement1 As type NumeElement2 As type ... End Type
-----------------Referirea la variabilele de un tip definit de utilizator, se poate face fie pentru ntreaga structur (folosind numele variabilei), fie pentru fiecare element n parte(folosind numele elementul respectiv calificat -cu semnul punct - cu numele variabilei). Not: Declararea unui tip de date nu se poate face dect la nivelul unui modul de cod. Deci nu se pot declara tipuri de date la nivelul unei rutine. Exemplu. Option Compare Database Option Explicit Public Type Person 'se declar tipul de date la nivelul modulului Nume As String Prenume As String Virsta As Integer End Type Sub TypeTest() Dim Primul As Person, Doilea As Person 'se declar 2 variabile de tipul de date Person Primul.Nume = "Ionescu" ' se folosesc elementele tipului de dat Person Primul.Prenume = "Ion" Primul.Virsta = 21 Doilea = Primul ' se refer ntregul tip de dat Person MsgBox Doilea.Nume & " " & Doilea.Prenume & ", varsta=" & Doilea.Virsta & " ani" End Sub -----------------I.2.1.8 Tipul de date VARIANT

Acest tip de date, specific limbajului Visual Basic, este deosebit de puternic fiind compatibil cu: toate tipurile numerice tipul Date tipul String tipul Object Dei uureaz munca de programare, totui folosirea variabilelor de tip variant, diminueaz performanele programului, att ca memorie ocupat ct i ca timp de execuie.

Created by Serban Criscota

Page 11

19 ianuarie 2001

Numele tipului de date Variant (numere) Variant (string) ------------------

Spaiul de memorare 16 octet 22 octei

Domeniu La fel ca la tipul numeric La fel ca la tipul string

Valoarea iniial Empty (Gol) Empty (Gol)

Ex. de nume variabil vntValue vntNume

I.2.1.8.1 Valorile EMPTY, NULL, STRING VID. EMPTY - reprezint valoarea pe care o are o variabil variant care nu a fost nc niializat. La prima introducere a unei date ntr-o variabil de tip variant, aceasta se va configura n conformitate cu tipul respectiv de date. NULL - reprezint o valoare pe care o ia o variabil variant n care datele nu sunt valide. String de lungime 0 (vid, gol) - string care nu are nimic n el, adic este "". -----------------I.2.1.9 Tipul de date OBJECT

Acest tip de date va fi prezentat ntr-un alt modul. -----------------I.2.2 Variabile. Variabilele sunt nume de locaii de memorie care conin valori de un anumit tip, ce se modific n timpul execuiei programului. Variabilele se caracterizeaz prin: Domeniul de valabilitate(vizibilitate) : se refer la momentul cnd acestea apar i dispar din 'codul surs'. Variabilele apar atunci cnd sunt declarate prima dat, dup care apar i dispar n funcie de domeniu. n momentul cnd acestea apar, variabilele devin vizibile, li se pot atribui valori de un anumit tip i pot fi folosite n cadrul instruciunilor. n rest, ele sunt invizibile. Durata de via(valabilitate) : se refer la timpul ct variabila ocup loc n memorie. Cnd se creeaz variabile trebuiesc avute n vedere mai multe lucruri. Modul i locul n care se declar o variabil determin domeniul de valabilitate, durata de valabilitate i alte caracteristici ale acesteia. Urmtoarele subiecte analizate v vor s nelegei mai bine declararea variabilelor n limbajul Visual Basic.
I.2.2.1

Declararea variabilelor
Forma acestei

Declararea variabilelor se face de obicei cu instruciunea declarativ DIM. instruciuni este:

Dim NumeVariabil As TipulDeDateAlVariabilei


Numele variabilei respect regulile folosite la formarea numelor. n practica programrii, se obinuiete s se pun un prefix convenional la nume, care s indice tipul de date al variabilei. (Vezi exemplele de nume de variabile din modulul ' Tipuri de date '). O variabil poate fi declarat specificndu-se urmtoarele tipuri de date: Byte, Integer, Long, Currency, Single, Double, Date, String (pentru variabile de lungime variabil), String * length (pentru variabile de lungime fix), Object, sau Variant, sau a unui tip de date definit cu declaraia Type. Not: Ne specificarea unui tip de date duce la crearea unor variabile de tip Variant. Se pot declara mai multe variabilele pe acelai rnd, separate prin virgul, dar este obligatorie folosirea explicit a tipului de dat pentru fiecare variabil. Exemplu. Dim intX As Integer, intY As Integer, intZ As Integer O greeal obinuit este declararea mai multor variabile pe aceeai linie, fr a se specifica tipul pentru fiecare variabil declarat ca n exemplul de mai jos
Created by Serban Criscota Page 12 19 ianuarie 2001

Dim iCounter, iAge, iWeight As Integer n acest caz, numai ultima variabil este declarat ca o variabil de tip Integer (ntreg). Celelalte variabile sunt declarate de tipul Variant.(tipul implicit al unei variabile este variant). Aceast eroare este foarte periculoas, deoarece unele limbaje de programare(PASCAL), folosesc o asemenea notare pentru a declara toate variabilele de pe aceiai linie de acelai tip.
I.2.2.2 Caractere folosite ca Type-declaration.

Anumite variabilele mai pot fi create automat de un anumit tip, folosindu-se n loc de specificaia As, anumite caractere speciale, denumite caractere de tip, la sfritul numelui variabilei, n declaraia Dim. Astfel: Tipul de date Caracterele de tip Integer Long Currency Single Double String Variant

&

implicit

Acest tip de declaraii este importat din variantele mai vechi de Basic, dar nu este recomandabil. Exemplu. Urmtoarele declaraii sunt echivalente. Dim Nume As String - Dim Nume$ Dim Virsta As Integer - Dim Virsta% Dim Anul As Variant - Dim Anul -----------------I.2.2.3 Option Explicit (Opiune de explicitare)

Este o instruciune declarativ care poate fi inclus n seciunea General Declarations a unui modul, formular sau raport. Cnd Option Explicit este plasat ntr-un modul de cod, toate variabilele din interiorul obiectului respectiv (modul, formular sau raport) trebuie s fie declarate nainte de folosire, altfel producndu-se o eroare de compilare. Introducerea instruciunii Option Explicit n fiecare modul, formular sau raport, se poate face automat Acest lucru se face prin activarea opiunii Require Variable Declarations (cere declaraii de variabile) din meniul Tools | Options | Module. Este foarte important ca aceast comand (Option Explicit) s fie plasat n toate modulele de cod. Asigurai-v c ai configurat opiunea la valoarea True ! Dac proprietatea specificat mai sus nu este setat(False), atunci practic se poate s nu se declare deloc variabilele. Declararea acestora se face implicit, funcie de datele cu care se ncarc la prima folosire variabila(ca n limbajul FORTRAN). De exemplu, instruciunea: x=10, ar genera i declararea unei variabile de tip ntreg. Folosirea acestei metode este foarte periculoas, deoarece poate cauza multe probleme. n concluzie, cea mai eficient i mai lipsit de erori metod de declarare a variabilelor este de a folosi n totalitate instruciunea declarativ Dim, pentru fiecare declarare de variabil, ca n exemplul urmtor: Dim iCounter As Integer Dim sName As string Aa cum se vede, acest tip de declaraie conine att numele variabilei, ct i tipul datelor pe care le poate conine. Acest lucru permite compilatorului s intercepteze erori de genul memorrii unui ir ntr-o variabil de tip ntreg. La o implementare corespunztoare, prin selectarea celui mai scurt tip de date folosit pentru fiecare variabil, se pot reduce resursele necesare executrii programului.
I.2.2.4 Variabile Locale i Globale.

Funcie de locul de declarare, variabilele pot fi: Locale - variabile declarate n interiorul rutinei, vizibile(domeniul de valabilitate) numai n interiorul acesteia.

Created by Serban Criscota

Page 13

19 ianuarie 2001

Globale(nivel modul) - variabile declarate n secia de declaraii generale de la nceputul unui modul de cod. n acest caz variabila va fi vizibil n interiorul tuturor rutinelor din modulul respectiv de cod. Exemplu. Fie declararea variabilei: Dim sName As String Dac aceast declaraie se face ntr-o rutin, atunci ea va putea fi folosit numai n aceasta. Dac declararea ei se face n seciunea de declaraii generale ale modulului de cod, atunci ea se va putea folosi n toate rutinele modulului, dar nu i n alte module de cod. Aceast caracteristic o au numai variabilele declarate Public. Exemplu. Variabilele de nivel global(modul) sunt declarate prin plasarea unei comenzi Dim n seciunea General Declarations a formularului, raportului sau modulului de cod, ca mai jos: [ General Declarations] Option Explicit Dim miCounter As Integer -----------------Variabilele de nivel modul pot fi vizualizate din orice rutin aparinnd modulului n care au fost declarate.. Valoarea variabilei poate fi schimbat de orice subrutin sau funcie din modulul respective. De exemplu, urmtoarea subrutin schimb valoarea variabilei de nivel modul miCounter la 20. Reinei convenia de numire a variabilei prin folosirea literei m ca prefix al numelui acesteia. Aceasta o face s fie recunoscut ca o variabil de nivel modul. Ar trebui s folosii declaraii de nivel modul numai pentru variabilele care trebuie s fie vzute de mai multe rutine. Ar trebui s ncercai s declarai majoritatea variabilelor dumneavoastr de tip local. Aceast metod face codul dumneavoastr mai modular i mai uor de depanat. Private Sub cmdModule_Click() miCounter = 20 MsgBox miCounter End Sub -----------------I.2.2.5 Variabile Publice i Private.

O variabil public poate fi accesat (este vizibil, are domeniul de valabilitate) de oriunde din aplicaie. Variabilele publice se folosesc de obicei pentru identificatori de acces, valori de configurare pentru mediul de lucru i alte variabile care trebuie s fie vizibile pentru ntreaga aplicaie. Declaraiile variabilelor publice trebuie s fie plasate n seciunea General Declarations a modulului general de cod. Pentru declararea variabilelor publice se folosete cuvntul cheie PUBLIC, n loc de DIM. Exemplu. O declaraie de variabil public arat aa: Option Explicit Public piCounter As Integer Reinei folosirea prefixului p, cu care convenional se poate indica tipul public al variabilei. Secvena de cod urmtoare, plasat n evenimentul Click al butonului de comand cmdPublic schimb valoarea variabilei publice piCounter la 50, i o afieaz. Private Sub cmdPublic_Click () piCounter = 50 Msgbox piCounter End Sub -----------------Created by Serban Criscota Page 14 19 ianuarie 2001

Se poate folosi cuvntul cheie PRIVATE, n loc de DIM, pentru a declara variabile private n seciunea de declaraii generale a modulul de cod, adic variabile care nu sunt vizibile, dect de rutinele aparinnd modulului respectiv de cod. Exemplu. Private MyName As String Not: Cuvntul cheie DIM, este echivalent cu PRIVATE, atunci cnd se folosesc la declararea variabilelor n modulele de cod. Este totui indicat folosirea expresiei private, pentru a face codul mai lizibil.(mai uor de citit i mai rapid de interpretat) -----------------I.2.2.6 Variabila Statice

Se poate folosi cuvntul cheie STATIC, n loc de cuvntul cheie DIM, pentru a declara variabile statice n rutine, adic variabile care au proprietatea de ai reine valoarea ntre dou chemri ale respectivei rutine, Exemplul urmtor ilustreaz diferena dintre variabilele locale i cele statice. Variabilele locale sunt iniializate la fiecare apel al codului. De fiecare dat cnd lansai n execuie aceast procedur, se va afia numrul 1. Private Sub cmdLocal_Click () Dim iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dat cnd acest cod este executat, instruciunea declarativ Dim reiniializeaz variabila iCounter. Este puin diferit fa de urmtoarea secven de cod, care ilustreaz folosirea variabilelor statice: Private Sub cmdLocal_Click () Static iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare dat cnd acest cod este executat, variabila cu numele iCounter este incrementat i reinut. -----------------I.2.2.7 Domeniul i durata de valabilitate a variabilelor

Aa cum am artat, domeniul de valabilitate sau vizibilitatea variabilelor, este determinat de cuvntul utilizat n declararea variabilei: Dim, Private, Public i de locul unde acesta e plasat, determinnd ca variabila respectiv s fie local, modular(global) sau public i s poat fi folosit numai ntr-o rutin, la nivelul unui modul de cod, sau n toate modulele de cod. Ar trebui s facei tot posibilul ca majoritatea variabilelor din codul dumneavoastr s fie locale, deoarece acestea sunt ferite de o eventual modificare (accidental) de ctre alte rutine. Durata de via(valabilitate) a variabilelor, reprezint, aa cum am mai artat, timpul ct variabila are alocat spaiu n memorie. Fr alte instruciuni speciale, o variabil se creeaz n momentul n care modulul n care este declarat, este apelat, i dispare n momentul terminrii modulului respectiv. Astfel, o variabil local declarat ntr-o procedur eveniment, va fi alocat numai n timpul execuiei procedurii respective (bineneles dac nu este static). O variabil global declarat ntr-un modul de cod al unui formular, va fi alocat ct timp formularul respectiv va fi n execuie. O variabil public declarat ntr-un modul general de cod al va fi alocat n tot timpul execuiei aplicaiei.
Created by Serban Criscota Page 15 19 ianuarie 2001

I.2.2.8 Declararea i folosirea variabilelor ARRAY - TABLOU.

Tablourile se declar la fel ca orice alt variabil folosindu-se instruciunile declarative Dim, Static, Private, sau Public. Diferena fa de declararea unei variabile simple, este aceea c la tablouri, ntre paranteze, trebuie s se specifice pentru fiecare dimensiune - n ordine i separate prin virgul dac sunt mai multe dimensiuni - valoarea minim i maxim a indicelui dimensiunii respective. I.2.2.8.1 Declararea tablourilor cu dimensiuni fixe - statice.

Dim NumeTablou(N1 [, N2 [, N3.]) As TipDe Dat


Aa cum se observ marginea de jos a indicelui a fost omis. Ea se consider a avea valoarea 0. Totui poate fi luat i 1, numai dac este introdus n modulul respectiv de cod, instruciunea declarativ Option Base 1. Exemplu. Declaraia Dim MyArray(9, 10) As Integer va crea un tabel cu 2 dimensiuni cu 10 pe 11 elemente, cu primul indice cu valori ntre (0 - 9) i al doilea indice cu valori ntre (0 - 10), n care toate cele 110 elemente(celule) sunt de tip Integer. Observaia 1. Ca orice declaraie care nu specific tipul i tablourile declarate fr tip sunt de tip Variant. n acest caz fiind Variant, fiecare element va ocupa 16 bytes, dac este numeric sau 22 bytes, dac este string. Deci la tablouri mari se poate ajunge la un consum mare de memorie, ceea ce determin o rezerv n folosirea tablourilor de Variant. Exemplu. n continuare se prezint ce memorie vor ocupa tablourile. Tablou Variant - cel puin 176 bytes(11 el. * 16 bytes). Dim MyIntegerArray(10) As Integer ' Tablou Integer folosete 22 bytes (11 elemenste * 2 bytes). ReDim MyDoubleArray(10) As Double ' Tablou Double-precision .. 88 bytes(11 el. * 8 bytes). ReDim MyVariantArray(10) ' Tablou Variant .. cel puin 176 bytes(11 el. * 16 bytes). ReDim MyIntegerArray (99, 99) As Integer ' Tablou Integer folosete 100 * 100 * 2 bytes (20,000 bytes). ReDim MyDoubleArray (99, 99) As Double ' Tablou Double-precision .. 100 * 100 * 8 bytes (80,000 bytes). ReDim MyVariantArray(99, 99) ' Tablou Variant .. cel puin 160,000 bytes (100 * 100 * 16 bytes). -----------------Se pot declara tablouri specificndu-se explicit i marginea de jos a indicelui.

Dim NumeTablou(J1 To N1 [, J2 To N2 [, J3 To N3.]) As TipDe Dat Cu J s-a notat marginea de jos a indicelui, iar cu N marginea de sus a indicelui
I.2.2.8.2 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 execuiei, tablourile dinamice pot s-i modifice dimensiunile n timpul execuiei. Un tablou dinamic se declar la fel, cu Static, Dim, Private sau Public, fr a se specifica ns nimic ntre paranteze.

Dim NumeTablou() As TipDe Dat


Exemplu. Dim sngArray() As Single

Created by Serban Criscota

Page 16

19 ianuarie 2001

Not: Cu instruciunea executabil ReDim (cu o structur asemntoare cu cea a lui Dim), care se poate plasa oriunde n cod dup declararea unui tablou dinamic, se va redimensiona n momentul execuiei acesteia tabloul cu noile dimensiuni, eventual putndu-se schimba i tipul de date. Exemplu. ReDim sngArray(11) va redimensiona tabloul, ns nu modific tipul de date al elementelor i provoac pierderea datelor din tablou. Not: Folosirea lui ReDim, va provoca pierderea datelor din tabloul pe care l redimensionm. Pentru a se evita acest lucru se poate folosi clauza Preserve. Folosirea acestei clauze nu permite modificarea numrului de dimensiuni sau a marginii de jos ai indecilor. Exemplu. ReDim Preserve sngArray (UBound(sngArray) + 10) - va redimensiona tabloul, mrind cu 10 numrul lui de elemente i va pstra datele ce erau n tablou nainte de executarea instruciunii. I.2.2.8.3 Utilizarea tablourilor Un tablou poate fi utilizat ca pe orice variabil simpl de tipul respectiv. Referirea unui element al tabloului se face prin numele tabloului, urmat ntre paranteze de indicele(indicii) elementului respectiv. Exemplu. Sub FillArrayMulti() Dim intI As Integer, intJ As Integer Dim sngMulti(1 To 5, 1 To 10) As Single For intI = 1 To 5 For intJ = 1 To 10 sngMulti(intI, intJ) = intI * intJ ' indroduce n fiecre element produsul indicilor elementului. ' afieaz indicii elementului i valoarea din acesta. MegBox " Tablou( " & intI & " , " & intJ & " ) = " & sngMulti(intI, intJ) Next intJ Next intI End Sub I.2.2.8.4 Tablouri de octei Un tablou de octei este un tablou dinamic de tipul BYTE. El poate fi utilizate ca orice tablou dar mai are o proprietate care l face util n lucrul cu stringuri, i anume: Un tablou de octei se poate referi i direct, numai prin numele lui, fr indici. n felul acesta n el se poate muta direct un string. Trebuie remarcat c n aceast operaie fiecare caracter este codificat pe 2 octei n UNICODE, deci va ocupa 2 elemente din string. Exemplu. Pentru nelegerea acestei secvene trebuie studiat mai nti, n capitolul despre funciile text, precizrile fcute pentru codul UNICODE. Public Sub TestMatOcteti() Dim Caracter As String, Sir As String * 3 Dim X() As Byte ' Tablou de octei, va avea 6 elemente deoarece pentru ReDim X(5) ' un caracter din string sunt necesare 2 elemente de 1 octet Dim k As Integer, j As Integer, i As Integer Sir = "1A" X = Sir For i = 0 To 2
Created by Serban Criscota Page 17 19 ianuarie 2001

j = i + 1 ' In J se va calcula numrul caracterului in string ... 1, 2, 3 - necesar pt. MID Caracter = Mid(Sir, j, 1) ' in "Caracter" se vor introduce caracterele k = 2 * (i) n K poziia n tablou a caracterelor 0, 2, 4 Debug.Print "Caracterul = " & Caracter & "; CodUnicode= " & AscW(Caracter) & _ "; CodAnsii= " & Asc(Caracter) & "; Octetul 1= " & X(k) & "; Octetul 2= " & X(k + 1) ' Ceea ce se afieaz cu Debug.Print se poate vizualiza prin comanda View | Debug Window MsgBox "Caracterul = " & Caracter & "; CodUnicode= " & AscW(Caracter) & _ "; CodAnsii= " & aSc(Caracter) & "; Octetul 1= " & X(k) & "; Octetul 2= " & X(k + 1) Next I For i = 0 To 5 Debug.Print "Octetul " & i & " = " & X(i) MsgBox "Octetul " & i & " = " & X(i) Next i End Sub -------------------Dup execuie se va gsi afiat n Debug.Print: Caracterul = 1; CodUnicode= 49; CodAnsii= 49; Octetul 1= 49; Octetul 2= 0 Caracterul = A; CodUnicode= 65; CodAnsii= 65; Octetul 1= 65; Octetul 2= 0 Caracterul = ; CodUnicode= 350; CodAnsii= 170; Octetul 1= 94; Octetul 2= 1 Octetul 0 = 49 Octetul 1 = 0 Octetul 2 = 65 Octetul 3 = 0 Octetul 4 = 94 Octetul 5 = 1 -----------------Explicaie. n memoria intern, dac o variabil nestructurat ocup mai muli octei(de exemplu o variabil integer ocup 2 octei), atunci cel mai semnificativ dintre acetia se gsete la dreapta. Deci dac ntr-o variabil integer se gsete valoarea: 266(zecimal)=0000.0001.0000.1010(binar)=01.0A(hexazecimal) atunci aceasta se va gsi n memorie: (0000.1010)(0000.0001) - deci cu octetul cel mai semnificativ(0000.0001) aezat la dreapta. Din tabelul de mai jos, se observ cum se gsete n memoria intern, ntr-o variabil de tip tablou de octei, datele dintr-un string.
Caracterele din string Cod ANSI(1 octet/caracter) - zecimal Cod UNICODE(2 octei/caracter) -zecimal Memorie -Tabloul X (6 octei) - binar Memorie -Tabloul X (6 octei) - hexa Memorie -Tabloul X (6 octei) - zecimal

1 49 49
0011.0001 0000.0000

A 65 65
0100.0001 0000.0000

170 350
0101.1110 0000.0001

31 49

00 0

41 65

00 0

5E 94

01 1

Created by Serban Criscota

Page 18

19 ianuarie 2001

I.2.3 Constante Prin declararea unei constante, se poate atribui unui nume, o valoare. Aceasta se face prin instruciunea declarativ Const. Dup declarare, o constant nu i mai poate modifica valoarea. Forma acestei instruciuni este:

[Public | Private] Const NumeConstant [As TipulDeDateAlVariabilei] = Valoare


O constant, se comport practic ca o variabil, iniializat cu o anumit valoare, care nu se mai poate schimba n timpul execuiei aplicaiei. Regulile aplicate variabilelor privind domeniul i durata de valabilitate, sunt efective i n cazul constantelor. Deci vom avea: constante locale sau globale, funcie de locul de declarare(n rutin sau seciunea de declaraii generale a modulului de cod). constante publice sau private, dac folosim sau nu n faa cuvntului cheie Const, cuvintele cheie Private, Public. Exemplu. Constanta conAge, este o constant public, Integer, cu valoarea 34. Public Const conAge As Integer = 34 -----------------Constantele se pot declara : Cu tip explicit, i anume: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, sau Variant, ca n exemplul de mai sus sau; Cu tip implicit, n care clauza As lipsete iar tipul va fi determinat de tipul datei cu care se ncarc variabila. De exemplu dac avem declaraiile: Const Ziua = "Miercuri" Const Virsta = 44 atunci prima constant va fi de tip string, iar a doua integer. Ca i la variabile se pot declara mai multe constante pe acelai rnd, cu specificarea (dac este explicit) a tipului pentru fiecare constant n parte, Const conAge As Integer = 34, conWage As Currency = 35000, conNume="Soare" n exemplul de mai sus primele dou constante sunt declarate explicit Integer respectiv Currency, iar a treia, implicit, string. I.2.4 Instruciunile executive ale limbajului Visual Basic. Limbajele de programare au un set de instruciuni care constituie lista complet a posibilitilor de care dispune programatorul pentru a determina rezolvarea unei probleme(aplicaie) pe un sistem de calcul. Instruciunile unui limbaj de programare sunt de dou feluri: Instruciuni declarative, care practic nu determin executarea unei aciuni de ctre sistemul de calcul, ci numai nite indicaii care se dau compilatorului. De exemplu instruciunile de declarare ale tipurilor de date, variabilelor sau constantelor(Dim, Const, Type etc.), opiunile de compilare(Option Explicit, Option Compare Database, etc.) Instruciuni executive, care reprezint descrierea unei aciuni pe care o va efectua sistemul de calcul, n special privind datele aplicaiei(If, For, Do etc.). Execuia unei instruciuni reprezint efectuarea operaiei specificate de codul instruciunii, interpretate la un moment dat de unitatea central a unui sistem de calcul sau de un procesor. De obicei, execuia instruciunii presupune obinerea operanzilor din memoria intern sau din registrele unitii centrale, formarea rezultatului i depunerea acestuia ntr-un registru al unitii centrale sau n memoria intern. Ca exemplu de operaii pe care le face unitatea central a sistemului de calcul sunt operaiile de adunare, scdere, citire, scriere, comparaie, etc.
Created by Serban Criscota Page 19 19 ianuarie 2001

Limbajele moderne de programare au un set redus de instruciuni complexe: Declararea structurilor de date. Instruciunea de atribuire - prin care se calculeaz expresii. Structurile de control - prin care se determin 'traseul' printre instruciuni, adic ordinea n care se execut instruciunile. Declararea i apelarea rutinelor Crearea claselor de module de obiecte Crearea i manipularea obiectelor Practic, instruciunile executive ale limbajelor moderne de programare sunt instruciunea de atribuire i instruciunile prin care se realizeaz structurile de control. Alte operaii necesare unei aplicaii(ca de exemplu executarea operaiilor de Input / Output), sunt realizate prin rutine din bibliotecile de obiecte, funcii i proceduri disponibile limbajului respectiv de programare.
I.2.4.1 Instruciunea de atribuire

Forma acestei instruciuni este:

NumeVariabil = Expresie
Aciunea acestei instruciuni const n calcularea expresiei (din dreapta semnului =) i depunerea rezultatului n variabila (din dreapta semnului =). Pentru a se executa cu succes instruciunea, este necesar ca rezultatul expresei s aparin unui tip de date compatibil cu cel al variabilei. n caz contrar se va produce o eroare de execuie(pe care le vom trata n alt modul). Totui compilatorul ncearc trecerea peste anumite incompatibiliti, a cror rezolvare este evident, efectund automat conversiile ntre tipuri diferite de date, dac este posibil. Exemplu. Private Sub TestExpresie() Dim Vstr As String Dim Vnr As Integer Vstr = "251" Vnr = 251 + 40 ' prelucrari normale Vstr = 251 + 40 ' nu produce eroare de execuie.Transforma constanta numeric 291 n stringul "291" Vnr = Vstr ' nu produce o eroare de execuie. Transforma stringul "291" n constanta numeric 291 Vstr = Vnr + "ABC" ' va produce eroare de execuie- TYPE MISMATCH. Nu se poate efectua adunarea. Vstr = Vnr & "ABC" ' nu produce eroare. Vnr = "ABC" ' va produce eroare de execuie- TYPE MISMATCH End Sub I.2.4.1.1 Formarea expresiilor n Visual Basic. O expresie este format din termeni, asupra crora se efectueaz anumite operaii. O expresie al crei evaluare este o valoare logic(True sau False) se mai numete condiie. Termenii pot fi : variabile, constante, literali(valori date direct) sau funcii(proprii sau din biblioteci) Operatorii sunt de trei tipuri

Created by Serban Criscota

Page 20

19 ianuarie 2001

Operatorii aritmetici, care acionnd asupra unor termeni scalari(numere, stringuri, date calendaristice, etc.) vor determina tot un rezultat de aceiai natur(scalar).

/
mprire real 5/2=2.5

\
mprire ntreag 10\3=3

Mod
Restul mpririi 10 Mod 3=1

+
Adunare 5+2=7

Scder e 5-2=3

&
Concatenare iruri. "Ab"&2="Ab2"

Ridicare nmulire la putere 5^2=25 5*2=10 ------------------

Operatorii relaionali, care acionnd asupra unor termeni scalari(numere, stringuri, date calendaristice, etc.) vor determina un rezultat logic(boolean)

<
mai mic (1<1) =False

<=
mai mic sau egal (5<=5) =True

>
mai mare (5>4) =True

>=
mai mare sau egal (5>=5) =True

=
egal (5=5) =True

<>
ne egal (5<>5) = False

Is
apartenena la o mulime (5 Is [1,2,3]) = False

Like
compar dou stringuri, dar ine cont de caracterele generice(*,?,#) din al doilea string ("ARAD" Like "AR*") = True

Caracterele generice genereaz o mulime de caractere astfel: ? Un singur caracter. ("a2B3a" Like "a?a") = False * Zero sau mai multe caractere. ("a2B3a" Like "a*a") = True # Un singur numr (09). ("a2a" Like "a#a") = True [List char] ex. [A-R] Un singur caracter din list. ("F" Like "[A-Z]") = True [!List caractere] Un singur char care nu este n list. (("F" Like "[!A-Z]") = False ----------------- Operatorii logici, avnd valori logice(True , False) ca operanzi, vor determina un rezultat tot logic.

Op

Op 1Op 2ANDTrueTrueTrueTrueFalse FalseFalseTrueFalseFalseFalseFa lse

Op 1Op 2ORTrueTrueTrueTrueFalse TrueFalseTrueTrueFalseFalse False

NOTTrueFalse
FalseTrue

Mai exist dou funcii logice, mai puin folosite, i anume: Op 1 Op 2 XOR EQV - utilizat pentru verificarea echivalenei True True False logice a dou expresii IMP - utilizat pentru verificarea implicrii True False True logic ntre dou expresii False True True -----------------Not: Operatorii sunt aezai de la stnga la dreapta n False False False ordinea prioritii lor n execuie, care este n general cea obinuit din matematic. Parantezele rotunde sunt folosite pentru stabilirea unei ordini explicite a prioritii n execuie a operaiilor.
Created by Serban Criscota Page 21 19 ianuarie 2001

Observaia 1. Aa cum am mai artat, dac un termen al unei expresii este NULL, atunci i rezultatul expresiei este tot NULL. Spunem c NULL-ul se propag n expresii. Totui exist o excepie, i anume la operatorul de concatenare a irurilor, &: Dac un termen este NULL, iar cellalt nu este NULL, atunci rezultatul va fi chiar termenul diferit de NULL. Observaia 2. Valoarea EMPTY, n expresii este considerat, funcie de tipul de date pe care l reprezint, chiar valoarea cu care se iniializeaz variabilele de tipul respectiv(astfel n expresii dac un termen numeric este EMPTY atunci se va considera =0; dac este logice =False; dac este string = ir vid; etc.)
I.2.4.2 Structurile de control

Aa cum am mai artat, structurile de control stabilesc ordinea n care se execut instruciunile. Exist trei structuri de control, i anume: structura secvenial, structura alternativ(decizional) i structura repetitiv(n bucl, n ciclu) I.2.4.2.1 Structura secvenial Reprezint execuia secvenial a instruciunilor, n ordinea n care au fost scrise. -----------------I.2.4.2.2 Structura alternativ Reprezint execuia unui anumit grup de instruciuni sau a altuia, funcie de evaluarea unor condiii. I.2.4.2.2.1 Structura alternativ simpl. Instruciunea:

If...Then...Else If condiie Then Grup 1 de instruciuni [Else Grup 2 de instruciuni] End IF


-----------------Structura If ... Then ... Else evalueaz dac condiia este adevrat sau fals. Dac condiia este adevrat, vor fi executate toate instruciunile dintre If i Else (Grup 1 de instruciuni). Dac condiia este fals, vor fi executate toate instruciunile dintre Else i End If (Grup 2 de instruciuni). Not: Folosirea comenzii Else este opional. Not: O condiie cu rezultatul NULL este tratat ca i cum ar fi FALSE Exemplu. Private Sub cmdIf_Click() ' evenimentul click al unui buton de comand If IsNull (Me!txtValue) Then ' Condiia testeaz dac n controlul txtValue, este introdus o valoare. ' Acest lucru se face cu funcia IsNULL, studiat n alt modul MsgBox Trebuie sa introduceti o valoare Else MsgBox Ati introdus: & Me!txtValue End If End Sub Not: Un control, n care nu este introdus nimic va avea valoarea NULL
Created by Serban Criscota Page 22 19 ianuarie 2001

-----------------I.2.4.2.2.2 Structura alternativ multipl. Instruciunile: Select Case i If...Then...ElseIFElse n locul folosirii mai multe instruciuni If ... Then ... Else atunci cnd decizia se ia prin evaluarea mai multor condiii(Structura alternativ multipl) este mult mai simplu, fr ndoial, utilizarea instruciunii Select Case sau a instruciunii If ... Then ... ElseIFElse Instruciunea Select Case

Select Case NumeVariabil Case Valoare1 Grup 1 de instruciuni [Case Valoare2 Grup 2 de instruciuni] [Case ValoareX Grup X de instruciuni] [Case Else Grup else de instruciuni] End Select
Aceast instruciune evalueaz mai multe condiii formate prin verificarea egalitii ntre valoarea variabilei ataate instruciunii (NumeVariabil), i valorile din dreptul cuvintelor cheie CASE (ValoareI). Deci: Condiia I va fi: NumeVariabil= ValoareI Dac o condiie este advrat atunci se va executa grupul corespunztor de instruciuni. Dac toate condiiile sunt false atunci se vor executa - dac exist - instruciunile dintre Else . End Select (Grup else de instruciuni) Observaia 1. Dac mai multe condiii sunt adevrate, atunci se vor executa toate grupurile corespunztoare de instruciuni. Deci instruciunea Select Case nu se oprete la ntlnirea primei condiii adevrate, ci va evalua toate condiiile. Observaia 2. n ValoareX se pot folosi reuniuni de mulimi (operator virgula - ex: 1,2,5) intervale (operator TO - ex: 1 To 7), sau submulimi(operator IS ex: Is > 7) Exemplu. Private Sub cmdCase_Click () Dim IResponse As Integer if IsNull (Me!txtValue) Then iResponse = 0 Else IResponse = Val (Me!txtValue) 'Funcia VAL transform ntr-o valoare numeric un string. End If Select Case iResponse Case 0 MsgBox "Trebuie sa introduceti un numar Case 1 To 5 MsgBox "Ati introdus o valoare intre 1 si 5
Created by Serban Criscota Page 23 19 ianuarie 2001

Case 7, 11, 21 MsgBox "Ati introdus 7, 11 sau 21 Case Else MsgBox "Ati introdus un numar incorect End Select End Sub -----------------Aceast procedur utilizeaz n prima parte o instruciune If pentru a evalua dac txtValue este nul. n acest caz, procedur memoreaz un zero ntr-o variabil numit iResponse. n caz contrar, valoarea coninut n txtValue este memorat n iResponse. Instruciunea Case evalueaz coninutul variabilei iResponse. Dac valoarea este 0, este afiat o caset de text cu mesajul Trebuie s introducei un numr. Dac valoarea este ntre 1 i 5 inclusiv, este afiat o caset de text coninnd mesajul Ai introdus o valoare ntre 1 i 5. Dac utilizatorul introduce 7, 11 sau 21, este afiat un mesaj corespunztor. n celelalte cazuri, utilizatorul primete un mesaj care indic introducerea unui numr incorect. Instruciunea If ... Then ... ElseIF Else

If condiie-1 Then [grup 1 de instruciuni] [ElseIf condiie-n Then [grup n de instruciuni] ... [Else [grup else de instruciuni]] End If
-----------------Instruciunea funcioneaz similar instruciunii Select Case, numai c : o dat gsit o condiie adevrat, execuia instruciunii este terminat condiiile introduse sunt independente, ne mai fiind obligatorie prezena ca un termen a unei anumite variabile. Deci instruciunea va evalua pe rnd, n ordine, condiia 1, 2, etc. Prima condiie gsit adevrat va determina execuia grupului respectiv de instruciuni, i terminarea instruciunii. Dac toate condiiile sunt false, vor fi executate toate instruciunile dintre Else i End If (Grup else de instruciuni). Not: Folosirea comenzii Else este opional. Not: O condiie cu rezultatul NULL este tratat ca i cum ar fi FALSE -----------------I.2.4.2.3 Structura repetitiv Reprezint execuia repetat a unui anumit grup de instruciuni numit ciclu sau bucl pn cnd o condiie ia o anumit valoare. I.2.4.2.3.1 Structura repetitiv cu test. Instruciunea DO Execut n mod repetat un ciclu i anume ct timp(While) o condiie este TRUE sau
Created by Serban Criscota Page 24 19 ianuarie 2001

pn cnd(Until) o condiie devine TRUE Exist dou forme ale instruciunii Do: ------------------

Do [{While | Until} conditie] [grup instruciuni] [Exit Do] [grup instruciuni] Loop
------------------

Do SAU [grup instruciuni] [Exit Do] [grup instruciuni] Loop [{While | Until} conditie]

Observaia 1. Instruciunea Exit Do, provoac ieirea forat din ciclu. De obicei se execut funcie de evaluarea unei condiii ntr-o instruciune IF. Observaia 2. Condiia este evaluat funcie de locul unde este plasat n instruciune i anume: la prima form a instruciunii(cea din stnga) - naintea executrii ciclului sau la a doua form a instruciunii(cea din dreapta) - dup executarea ciclului Observaia 3. Ciclul se execut minim de la prima form a instruciunii(cea din stnga) - se poate ca ciclul s nu se execute de loc la a doua form a instruciunii(cea din dreapta) - ciclul se va executa minim o dat. Not: O condiie cu rezultatul NULL este tratat ca i cum ar fi FALSE Exemplu. Private Sub cmdLoop1_Click() Dim iCounter As Integer iCounter = 1 Do While iCounter < 5 MsgBox iCounter ICounter = iCounter + 1 Loop End Sub -----------------Procedura va afia 4 mesaje, cu numere de la 1 la 4. Aceast structur nu asigur ntotdeauna executarea secvenei de cod din interiorul buclei. Dac iCounter este iniializat cu o valoare mai mare sau egal cu 5, codul din interiorul buclei nu va fi executat niciodat. Dac dorii ca secvena de cod s fie executat necondiionat cel puin o dat, va trebui s folosii urmtoarea structur: Exemplu. Private Sub cmdLoop2_Click() Dim iCounter As Integer iCounter = 5 Do MsgBox iCounter ICounter = iCounter + 1 Loop While iCounter < 5 End Sub -----------------Procedura va afia 1 mesaj, cu numrul 1.
Created by Serban Criscota Page 25 19 ianuarie 2001

Acest cod va fi executat cel puin o dat, chiar dac iCounter are valoarea 5. Structura Do While ... Loop face evaluarea nainte de executarea codului i de aceea nu asigur execuia codului din interiorul buclei. Structura Do ... Loop While face evaluarea la sfritul buclei i de aceea execuia codului este asigurat. -----------------I.2.4.2.3.2 Structura repetitiv cu contor. Instruciunea FOR...NEXT Repet un ciclu de un anumit numr de ori. Not: Mai exist o structur: FOR EACH...NEXT, care se aplic coleciilor de obiecte sau tablourilor. Acesta permite parcurgerea automat a tuturor elementelor unei colecii sau tablou. Se va prezenta ulterior n modulul referitor la programarea orientat pe obiecte.

For contor = start To end [Step pas] [grup instruciuni] [Exit For] [grup instruciuni] Next [contor]
----------------- contor - Variabil numeric folosit pentru stabilirea numrului de execuii ale ciclului. start - Valoarea iniial a contorului end - Valoarea final a contorului pas - Valoarea de incrementare a controlului dup execuia fiecrui ciclu (implicit este 1) Explicaie. Se ncepe prin executarea ciclului. Dup aceasta va avea loc adunarea pasului la contor. Acum se va evalua urmtoarea condiie, funcie de semnul(+/-) pe care l are pasul i anume Dac PAS >=0, condiia va fi: contor <= end Dac PAS < 0, condiia va fi: contor >= end Dac condiia este TRUE, atunci se va repeta ciclul, iar dac condiia este FALSE, se va termina instruciunea FOR, programul continund cu instruciunile de dup NEXT. Deci, practic dac pasul, este : pozitiv, atunci contorul va parcurge la fiecare ciclu, cresctor (prin adugarea valorii pasului), toate valorile dintre start i end (start < end) negativ, atunci contorul va parcurge la fiecare ciclu, descresctor (prin scderea valorii absolute a pasului), toate valorile dintre start i end (start > end) Observaia 1. Instruciunea Exit For, provoac ieirea forat din ciclu i continuarea programului cu instruciunile de dup NEXT. De obicei se execut funcie de evaluarea unei condiii ntro instruciune IF. Observaia 2. Sunt admise imbricri ale structurilor For, dac sunt folosite variabile contor diferite ca n exemplul urmtor: For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 ... Next K Next J Next I -----------------Created by Serban Criscota Page 26 19 ianuarie 2001

Observaia 3. ntr-un For, trebuie evitat schimbarea valorii contorului. Observaia 4. Structura For ... Next este folosit atunci cnd sunt un numr exact de iteraii de executat. Exemplu. Private Sub cmdForNext_Click() Dim iCounter As Integer For iCounter = 1 To 5 MsgBox iCounter Next iCounter End Sub -----------------Procedura va afia 5 mesaje, cu numere de la 1 la 5 Observai c iCounter se auto-incrementeaz. Att valoarea de start, ct i cea de sfrit pot fi ambele variabile. Unei structuri For ... Next i se poate da, de asemenea, o valoare de incrementare (pas) Exemplu. Private Sub cmdForNext_Click() Dim iCounter As Integer For iCounter = 5 To 1 Step -1 MsgBox iCounter Next iCounter End Sub Procedura va afia 5 mesaje, cu numere de la 5 la 1 -----------------I.2.5 Rutine - proceduri i funcii.
I.2.5.1 Ce este o rutin? Elementele care definesc o rutin.

Rutina este o structur de sine stttoare, asemntoare unui program, prin care se execut o anumit aciune. Ea este executat numai atunci cnd este lansat, apelat de ctre un obiect al aplicaiei. Rutina poate fi apelat de un numr nelimitat de ori din diferite locuri(obiecte). Toate declaraiile(variabile, constante) fcute n interiorul rutinei sunt locale, fiind vizibile numai din interiorul acesteia. De asemenea, durata de via a datelor locale, este numai n intervalul de timp ct rutina se afl n execuie, la terminarea rutinei, avnd loc automat i eliberarea din memorie a tuturor variabilelor i constantelor locale ale acesteia. Not: n Visual Basic nu sunt permise imbricri de rutine. Deci ntr-o rutin nu se poate declara o alt rutin. Diferit fa de programe, rutina inter-acioneaz cu obiectul care a provocat lansarea(apelarea) ei, prin transferarea de date din i nspre acesta. Acest lucru se realizeaz n dou moduri i anume: Prin lista de parametrii. Aceasta reprezint practic nite variabile, prin intermediul crora se face: n momentul apelrii rutinei, un transfer de date de la modulul care apeleaz - parametrii de intrare. n momentul terminrii rutinei i prelurii controlului de modulul apelant, un transfer de date de la rutin nspre modulul apelant - parametrii de ieire. Prin variabile globale. Aceste variabile fiind vizibile i din modulul apelant i din rutin, evident c prin ele se pot face transferuri de date n ambele sensuri ntre cele dou obiecte. Observaia 1. Definirea unei rutine se face prin atribuirea unui nume(obligatoriu) acesteia i prin stabilirea listei de parametrii(opional). Parametrii definii n rutin se numesc parametrii formali.
Created by Serban Criscota Page 27 19 ianuarie 2001

Observaia 2. Declararea parametrilor formali se face dup regulile aplicate la declararea variabilelor. Observaia 3. Apelarea unei rutine se face prin numele ei. Observaia 4. n momentul apelrii, trebuie s se realizeze o coresponden ntre nite date(variabile, constante, literali) ale modulului apelant cu parametrii formali ai rutinei. Aceasta se face prin stabilirea unei liste de parametrii actuali, declarai n momentul apelrii. Evident parametrii actuali i formali trebuie s fie de acelai tip i s ocupe acelai loc n cele dou liste. Observaia 5. Parametrii de intrare ai rutinei pot fi n lista parametrilor actuali: variabile, constante, literali sau expresii. Observaia 6. Parametrii de ieire ai rutinei pot fi n lista parametrilor actuali numai variabile, deoarece acetia prin definiie i pot schimba valoarea n timpul execuiei rutinei. I.2.5.1.1 Transmiterea datelor prin parametrii Exist dou modaliti de transmitere a datelor prin parametrii i anume prin valoare sau prin adres(referin).

Apelarea rutinelor i transmitera parametrilor (prin valoare)


Modul apelant . Instr N.. X1=. Instr N+1.. X2=. Apelare rutin - Nume: Rtest Parametri actuali:X1, X2, Y Instr. .= Y .. Instr J M1=. Instr J+1 M2=. Apelare rutin - Nume: Rtest Parametri actuali:M1, M2, T Instr. .= T ..

X1,X2 Y

A1,A2 B1

M1,M2 T

A1,A2 B1

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

Transmiterea prin valoare. Din figura de mai sus se obsev c avem perechi de parametrii, actuali i formali, care reprezint practic dou variabile care se sincronizeaz la apelarea i terminarea rutinei. Astfel observm c la apelarea rutinei se face practic pentru fiecare pereche de parametrii operaia de transfer: ParametruFormal=ParametruActual (de ex: A1=X1 sau A2=X2 etc.), iar la terminarea rutinei transferul invers: ParametruActual=ParametruFormal (de ex: T=B1 sau Y=B1 etc.). Deci avem de a face cu transferarea unei valori ntre parametrii formali i cei actuali. Spunem c facem transmiterea prin valoare a parametrilor.

Created by Serban Criscota

Page 28

19 ianuarie 2001

Apelarea rutinelor i transmitera parametrilor (prin adres)


Transmiterea prin adres (referin).. n acest caz lucrurile se petrec altfel. Transferul se face numai la apelarea rutinei, dar nu se vor transfera valori, ci rutina va primi adresele

Modul apelant . Instr N.. X1=. Instr N+1.. X2=. Apelare rutin - Nume: Rtest Parametri actuali:X1, X2, Y Instr. .= Y .. Instr J M1=. Instr J+1 M2=. Apelare rutin - Nume: Rtest Parametri actuali:M1, M2, T Instr. .= T ..

Parametrii actualiX1X2Y a d

r e s eA1A2B1Parametrii
formali Parametrii actualiM1M2T a d

r e s eA1A2B1Parametrii
formali

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

parametrilor actuali. n acest fel n rutin parametrii formali se vor genera n memorie peste parametrii actuali. Deci rutina va lucra practic cu parametrii actuali, dei va folosi numele parametrii formali n expresii. Not: n Visual Basic, dac nu se fac precizri suplimentare, transmiterea parametrilor se face prin adres (referin). -----------------I.2.5.2 Crearea(definirea) unei rutine.

Rutinele sunt de dou feluri: proceduri(sau subrutine) i funcii. Diferena dintre ele const n faptul c : Funciile au un parametru implicit de ieire care este chiar numele funciei. Procedurile sunt apelate prin instruciuni, iar funciile sunt apelate prin introducerea numelui acesteia ntr-o expresie(ca i cum ar fi o variabil sau constant). Not: Funciile pot fi folosite direct aproape oriunde unde este cerut o expresie, cu condiia vizibilitii ei din locul de unde este apelat. Astfel putem folosi funcii ca: parametrii de intrare pentru rutine, la definirea proprietilor din controale, la cereri etc. I.2.5.2.1 Proceduri(Subrutine)

[Private | Public] [Static] Sub NumeProcedura [(ListaParametriiFormali)] [declaraii locale de: variabile, constante, etc.] [instruciuni] [Exit Sub] [instruciuni] End Sub
----------------- Instruciunea, Exit Sub, provoac dac este ntlnit terminarea procedurii i redarea controlului modulului apelant, la instruciunea care se gsete imediat dup cea de apelare. n mod normal procedurile se termin la instruciunea End Sub.
Created by Serban Criscota Page 29 19 ianuarie 2001

Opiunile Private sau Public, au acelai rol ca cel prezentat la variabile. Adic, procedurile declarate Public n modulul general de cod vor fi vizibile din toate modulele de cod ale aplicaiei. Declararea Private a unei proceduri o face local, adic vizibil numai din modulul n care este declarat. Dac nu se folosete nici una din cele dou opiuni, procedura va fi considerat public. Opiunile Static face ca toate variabilele locale declarate n procedur s fie statice. Toate instruciunile sunt permise. Datele cu care lucreaz acestea pot fi : parametrii formali; variabilele i constantele globale; variabilele i constantele locale; Not: Este indicat ca s se evite pe ct posibil n crearea rutinelor folosirea variabilelor globale, fiind recomandat utilizarea numai a parametrilor formali pentru schimburile de date ale rutinei cu modulul apelant. Aceasta deoarece o rutin care folosete variabile globale este de multe ori foarte puin lizibil, greu de depanat sau de ntreinut. Lista Parametrilor Formali: Reprezint o list de variabile, declarate dup regulile prezentate la variabile i separate prin virgul. Un parametru se declar conform structurii de mai jos:

[ByVal | ByRef] NumeParametru As TipDate Opiunile ByVal sau ByRef, precizeaz modalitatea de transmitere a parametrului
respectiv i anume prin valoare sau prin adres(referin). Aceasta din urm se ia implicit dac nu se face nici o precizare. I.2.5.2.2 Funcii

[Public | Private] [Static] Function NumeFuncie [(ListaParametriiFormali)] [As TipFuncie] [declaraii locale de: variabile, constante, etc.] [instruciuni] [Exit Function] [instruciuni] End Function
-----------------Observaia 1. Se observ c singura deosebire esenial fa de proceduri, se datoreaz faptului c numele funciei are dou semnificaii fiind n acelai timp i numele rutinei i parametru de ieire al rutinei. Din aceast cauz acestuia trebuie s i se precizeze tipul de date. Dac acest lucru nu se face atunci implicit se va considera Boolean tipul funciei. Deci o funcie, dup ce este executat se va comporta practic ca o variabil - care s-a ncrcat cu valoarea parametrului de ieire - putnd fi introdus direct n partea dreapt a oricrei expresii. Observaia 2. n loc de Exit Sub i End Sub, la funcii sunt Exit Function i End Function, evident cu acelai rol. Exemplu. Urmtorul exemplu reprezint o funcie care va testa dou valori primite ca parametrii i va returna suma sau diferena dintre ele. Function TestF(Numar1 As Integer, Numar2 As Integer) As Integer If Numar1 > Numar2 then TestF = Numar1 - Numar2 ' valoarea de retur se introduce n numele funciei Else TestF = Numar1 + Numar2 ' valoarea de retur se introduce n numele funciei End If End Function
Created by Serban Criscota Page 30 19 ianuarie 2001

.Se va folosi aceast funcie astfel. MsgBox TestF(20, 5) ' afieaz 15 MsgBox TestF(2, 5) ' afieaz 7 -----------------I.2.5.3 Apelarea unei rutine.

Not: Orice funcie poate fi apelat ca o procedur, dar o procedur nu poate fi folosit ca o funcie (n partea din dreapta a unei expresii). I.2.5.3.1 Apelarea unei proceduri(subrutine) Exist dou modaliti de apelare a unei proceduri: Prin instruciunea Call

Call NumeProcedur (ListaParametrilorActuali)


Direct folosind numele procedurii.

NumeProcedur ListaParametrilorActuali
Not: Parametrii se separ prin virgul. Observaia 1. Diferena ntre cele dou apeluri este c la apelarea cu Call, parametrii actuali ai procedurii trebuie scrii ntre paranteze, pe cnd la apelarea direct prin numele procedurii, este obligatoriu s nu se foloseasc paranteze. I.2.5.3.2 Apelarea unei funcii. O funcie se apeleaz n partea dreapta a unei expresie, folosindu-se numele ei urmat de lista parametrilor actuali inclui ntre paranteze. Numele funciei, se va comporta n expresie ca o variabil, ncrcat n timpul execuiei funciei cu o valoare, ca i cum ar fi un parametru de ieire al unei proceduri. Spunem c funcia ntoarce(retureaz) o valoare dup execuia ei. Aceast valoare va participa la evaluarea expresiei respective. Observaia 1. O procedur nu poate fi folosit n locul unei funcii ntr-o expresie, deoarece nu retureaz valori (chiar dac are parametrii de ieire) Observaia 2. Funciile pot fi apelate i ca pe o procedur n oricare din cele dou modaliti prezentate. Exemplu. Refacem exemplul prezentat nainte folosind o procedura TestS n locul funciei TestF Sub TestS(Numar1 As Integer, Numar2 As Integer, Rezultat As Integer) If Numar1 > Numar2 then Rezultat = Numar1 - Numar2 ' valoarea calculat se introduce n parametru de ieire Else Rezultat = Numar1 + Numar2 ' valoarea calculat se introduce n parametru de ieire End If End Sub .Se va folosi aceast procedur astfel. Dim Rez As Integer Call TestS(20, 5, Rez) ' calculeaz n Rez MsgBox Rez ' afieaz 15 TestS 2, 5, Rez ' calculeaz n Rez MsgBox Rez ' afieaz 7 ------------------

Created by Serban Criscota

Page 31

19 ianuarie 2001

I.2.5.4 Domeniul de valabilitate(vizibilitatea) al rutinelor.

Regulile prezentate la variabile, privind aceast problem sunt valabile i pentru rutine. Codul VBA este scris numai n uniti numite rutine. Aceste rutine sunt pstrate fie n modulul general (global), fie n modulele specifice din spatele formularelor (Code Behind Forms CBF). Domeniul de valabilitate sau de vizibilitatea a rutinei, este determinat de cuvntul utilizat n declararea acesteia: Private sau Public i de locul unde rutina e plasat. Rutina este modular(global), numai dac este declarat Public i este plasat n modulul global(general), ea fiind vizibil n toat aplicaia. Restul rutinelor, sunt locale i sunt vizibile numai din modulul unde au fost declarate.
I.2.5.5 Rutine definite de utilizator. Introducerea codului VBA

Explicaie. Pentru a crea o rutin definit de utilizator ntr-un modul global de cod, urmai paii de mai jos: Executai clic pe marcajul de tabulare Modules (Module) din fereastra bazei de date. ncepei un modul nou sau selectai un modul existent i executai clic pe opiunea Design. Selectai opiunea Insert Procedure (Insereaz procedur) de pe bara cu instrumente sau selectai opiunea Procedure din meniul Insert (Insereaz). Va aprea pe ecran caseta de dialog alturat. Introducei numele procedurii i selectai tipul acesteia: funcie, subrutin sau proprietate. Indicai dac dorii ca procedura dumneavoastr s fie public (pentru ntreaga aplicaie) sau privat (numai pentru acest modul). n final, specificai dac dorii ca toate variabilele din rutina dumneavoastr s fie Apoi, executai clic pe OK. Explicaie. Pentru a crea o rutin definit de utilizator n modulul de cod din spatele unui formular sau raport, se procedeaz la fel, n afar de afiarea modulului care se face astfel: n timp ce v aflai n modul de afiare Design al unui formular sau raport, vizualizai codul din spatele formularului sau raportului executnd clic pe butonul Code (Cod) de pe bara cu instrumente sau prin selectarea opiunii Code din meniul View, sau prin pictograma specific de pe bara cu instrumente.
I.2.5.6 Procedurile evenimentelor

Procedurile evenimentelor sunt apelate automat cnd are loc un eveniment pentru un obiect. De exemplu, cnd un utilizator execut clic pe un buton de comand, este executat codul evenimentului Click pentru acel buton de comand. Procedurile evenimentelor sunt create automat cnd scriei codul evenimentului pentru un control. De exemplu, rutina: Private Sub cmdOkay_Click este creat atunci cnd plasai instruciuni de cod n evenimentul Click al butonului de comand cu Caption = 'Apasa' i numele cmdOkay. Exemplu. Codul evenimentului Click, al butonului cmdOkay. Private Sub cmdOkay_Click() If IsNull (Me!txtNume) Or IsNull (Me!txtVirsta) _ Or isNull(Me!txtSex) Then MsgBox "Trebuie introduse numele, virsta i sexul Exit Sub Else MsgBox "Numele d-tra este: " & Me!txtNume & _ Chr(10) & Chr(13) & Virsta dv este acum de : " & _
Created by Serban Criscota Page 32 19 ianuarie 2001

CalculVirsta(Fix(Val(Me!txtVirsta)), Me!txtSex) & " ani" End If End Sub -----------------Function CalculVirsta(V As Integer, S As Variant) As Integer If V > 35 And S = "F" Then CalculVirsta = V - 10

Created by Serban Criscota

Page 33

19 ianuarie 2001

ElseIf V > 25 And S = "F" Then CalculVirsta = V - 5 ElseIf V > 20 And S = "F" Then CalculVirsta = V - 2 ElseIf S = "M" Then CalculVirsta = V + 5 Else CalculVirsta = V End If End Function -----------------Explicaie. Pentru a edita codul unui eveniment , executai paii urmtori: Executai click pe control(cmdOkay) n modul de afiare Design i apoi pe butonul Properties din bara cu instrumente sau executai click cu butonul drept al mouse-ului pe obiect i selectai opiunea Properties din meniul contextual. Executai click pe marcajul de tabulare al proprietilor evenimentului (Event). Selectai proprietatea pentru care dorii s scriei instruciuni de cod (de exemplu, evenimentul On Click). Selectai [Event Procedure] din lista derulant. Executai clic pe butonul (). Cursorul dumneavoastr va fi plasat n codul evenimentului pentru obiectul respectiv. Automat sistemul va crea instruciunea de declarare a procedurii, eventual cu lista de parametrii formali . daca este cazul - i instruciunea de sfrit a procedurii. Proiectantul va introduce acum codul VBA necesar tratrii evenimentului. -----------------I.2.5.7 Utilizarea combinat a rutinelor utilizator i a procedurilor

eveniment. Am artat c att subrutinele, ct i funciile pot primi argumente(parametrii), dar numai funciile pot returna valori. Exemplu. Subrutina urmtoare primete doi parametri, txtFirst i txtLast. Aceasta afieaz apoi un mesaj cu primul caracter al fiecruia dintre cei primii. Private Sub Initialele (sFirst As String, sLast As String) MsgBox Initialele dumneavostr sunt: & _ Left (sFirst, 1) & Left (sLast, 1) ' Funcia Left retureaz caracterele de la inceputul unui string End Sub Ea va fi apelat din procedura eveniment On Click a butonului de comand cmdNume. Private Sub cmdNume_Click() Initialele Me !txtFirstName, Me!txtLastName End Sub -----------------Explicaie. Observai c textul din controalele txtFirstName i txtLastName din formularul curent (Me) sunt transmise subrutinei cu numele Initialele. Parametrii sunt recepionai ca sFirst i sLast. Primul caracter din stnga al fiecrui parametru este afiat n caseta de mesaje. Codul precedent transmite pur i simplu valori i apoi opereaz cu ele. Exemplu. n continuare se ilustreaz folosirea unei funcii care ntoarce o valoare.
Created by Serban Criscota Page 34 19 ianuarie 2001

Private Function ReturnInit (sFName As String, sLName As String) As String ReturnInit = Left (sFName, 1) & Left (sLName, 1) End Function Ea va fi apelat din procedura eveniment On Click a butonului de comand cmdNume. Private Sub cmdNume_Click() Dim sInitials As Integer sInitials = ReturnInit (Me!txtFirstName, Me!txtLastName) MsgBox "Initialele dumneavostra sunt: " & sInitials End Sub Explicaie. Reinei c acest exemplu apeleaz o funcie ReturnInit, trimind valorile celor dou casete de text ca parametri ai funciei. Funcia asociaz numelui funciei (ReturnInit) o valoare egal cu primele dou caractere ale irurilor. Apoi, funcia returneaz aceast valoare, rutinei apelante (cmdNume_Click) i o atribuie variabilei sInitials. -----------------I.2.5.8 Parametri opionali

Visual Basic v permite s utilizai parametri opionali. Cu alte cuvinte, nu este necesar s tii ci parametri vor fi transmii. Funcia numit ReturnInit din secvena de cod urmtoare primete ultimii doi parametri ca opionali. Apoi evalueaz prezena sau nu a parametrilor i acioneaz n consecin. Function ReturnInit (sFName As String, Optional sMI, Optional sLName) As String If IsMissing (sMI) Then ' IsMissing retureaz True dac s-a apelat funcia fara parametrul sMI SMI = InputBox ("Introducei initiala cuvantului din mijloc) End If If IsMissing (sLName) Then ' IsMissing retureaz True dac s-a apelat funcia fara parametrul sLName SLName = InputBox (Introducei ultimul nume) End If ReturnInit = sLName & " " & sMI & " " sFName End Function ----------------- Aceast funcie poate fi apelat de exemplu n felul urmtor:

sName = ReturnInit ("Bill , , "Gates)


Explicaie. Aa cum ai putut vedea, lipsete al doilea parametru. n loc s rezulte o eroare de compilare, funcia ReturnInit va sesiza acest lucru i prin funcia InputBox va cere utilizatorului introducerea valorii respective. Sau mai poate fi apelat i:

sName = ReturnInit ("Bill , "X", "Gates)


Explicaie. n acest caz funcia prin folosirea lui IsMissing, va sesiza prezena tuturor celor trei parametrii actuali. -----------------Not: Lucrul cu parametrii opionali, deci care pot s lipseasc la apelarea rutinei, necesit: Declararea ca opional a parametrului, prin folosirea clauzei Optional, n faa numelui parametrului. O restricie a limbajului este faptul c numai ultimii parametrii pot fi declarai opionali. Testarea prin funcia IsMissing, dac a fost sau nu introdus la apelare parametrul respectiv n lista parametrilor actuali. Dac nu se dorete introducerea n lista parametrilor
Created by Serban Criscota Page 35 19 ianuarie 2001

actuali a unui parametru opional, atunci se va scrie numai separatorul(virgula) parametrului respectiv. Numai pentru parametrii declarai opional, se poate introduce o valoare implicit, cu care se va iniializa parametrul dac acesta lipsete din lista parametrilor actuali. Dac se folosesc parametrii opionali, declararea acestora n lista parametrilor formali este:

[Optional] NumeParametru As TipDate [ = ValoareImplicita ]


I.2.6 Bibliotecile standard de funcii i proceduri. O bibliotec este un obiect de sine stttor care permite realizarea unei colecii de funcii, proceduri, clase de module de obiecte i obiecte. Noile tehnologii i standarde introduse de Microsoft, permit ca modulele unei biblioteci s poat s fie utilizate de toate aplicaiile client de pe platforma S.O., care respect standardele de utilizare a unei biblioteci. n Visual Basic, exist posibilitatea crerii mai multor tipuri de biblioteci. Microsoft Office, ofer mai multe biblioteci, care pot fi utilizate n Access, Visual Basic sau alte aplicaii. Pentru aceasta trebuie ca n prealabil aplicaia client s nregistreze i s creeze referina(adresa) ctre biblioteca respectiv. Acest lucru se face prin comanda References. Implicit, o aplicaie are chiar din faza de instalare create referinele ctre cele mai utilizate biblioteci specifice. Aplicaiile Access au referine create ctre anumite biblioteci, ale cror module pot fi utilizate oriunde acestea sunt permise. n acest subcapitol, vor fi prezentate n special cele mai utilizate funcii ale acestor biblioteci. Un bun programator, trebuie s cunoasc i s foloseasc ct mai multe din obiectele puse la dispoziie de biblioteci. De exemplu dac avem de realizat o aplicaie care trebuie la un moment dat s calculeze SINUSUL dintr-o valoare, un programator ne experimentat s-ar putea apuca s creeze un modul care s rezolve acest lucru, pe cnd un bun programator tiind c exist n biblioteci funcia Sin, care calculeaz sinusul unei valori, va rezolva instantaneu aceast problem, folosind pur i simplu funcia din bibliotec. Pentru a putea utiliza o funcie dintr-o bibliotec, programatorul trebuie s cunoasc trei lucruri: Numele funciei; Parametrii i ce reprezint fiecare; Ce reprezint valoarea pe care o returneaz funcia (adic ce operaii efectueaz funcia). n crearea expresiilor, n Access se poate folosi un constructor de funcii Expressions Builder, lansat de obicei din meniul contextual (Build). Acesta este foarte util, prezentnd toate funciile, parametrii acestora modulul de Help referitor la obiectul respectiv, operaiile permise, etc. n concluzie, n codul VBA, n controalele din formulare sau rapoarte, n proprietile tabelelor sau cererilor, se pot folosi n crearea expresiilor att funciile definite(create) de utilizator ct i funciile din bibliotecile ctre care exist referine. Toate acestea se pot vizualiza prin Expressions Builder ( prin cele dou foldere din Functions, aa cum se vede din figur) Access are referine implicite ctre o bibliotec de funcii foarte bogat i cuprinztoare. Cteva dintre cele mai utilizate funcii sunt prezentate n continuare.
Created by Serban Criscota Page 36 19 ianuarie 2001

I.2.6.1 Funcii matematice

I.2.6.1.1

I n t ( n u m r ) ; F i x ( n u m r )

ntoarce partea ntreag a numrului introdus ca parametrul de intrare. Tipul de dat al rezultatului va fi acelai cu tipul de dat al parametrul de intrare. Ambele funcii Int i Fix ndeprteaz partea fracionar a numrului i ntorc valoarea ntreag care rezult. Diferena ntre Int i Fix este c numai dac numrul este negativ. Astfel: Int ntoarce primul numr negativ de tip ntreg mai mic sau egal cu numrul; Int(8.4) = -9 Fix ntoarce primul numr negativ de tip ntreg mai mare sau egal cu numrul; Fix (8.4) = -8 Exemplu. Dim MyNumber ' variabilele declarate fr specificarea tipului de dat sunt VARIANT. MyNumber = Int(99.8) ' ntoarce 99. MyNumber = Fix(99.2) ' ntoarce 99. MyNumber = Int(-99.8) ' ntoarce -100. MyNumber = Fix(-99.8) ' ntoarce -99. -----------------I.2.6.1.2 Abs(numr) ntoarce valoarea absolut a numrului introdus ca parametrul de intrare. Tipul de dat al rezultatului va fi acelai cu tipul de dat al parametrul de intrare. Exemplu. Dim MyNumber MyNumber = Abs(50.3) ' ntoarce 50.3. MyNumber = Abs(-50.3) ' ntoarce 50.3. -----------------I.2.6.1.3 Sgn(numr) ntoarce un Variant (Integer) care reprezint semnul unui numr. Dac parametrul <0 >0 =0 este: Sgn ntoarce Exemplu. Dim MyVar1, MyVar2, MyVar3, MySign MyVar1 = 12: MyVar2 = -2.4: MyVar3 = 0 MySign = Sgn(MyVar1) ' ntoarce 1. MySign = Sgn(MyVar2) ' ntoarce -1. MySign = Sgn(MyVar3) ' ntoarce 0. -----------------I.2.6.1.4 Sqr(numr) ntoarce o valoare de tip Double(virgul mobil dubl precizie) care reprezint radicalul(square root) unui numr(>=0). Exemplu.
Created by Serban Criscota Page 37 19 ianuarie 2001

-1

Dim MySqr MySqr = Sqr(4) ' ntoarce 2. MySqr = Sqr(23) ' ntoarce 4.79583152331272. MySqr = Sqr(0) ' ntoarce 0. MySqr = Sqr(-4) ' Genereaz o eroare. -----------------I.2.6.1.5 Exp(numr) ntoarce o valoare de tip Double care reprezint e (baza logaritmului natural) ridicat la o putere. Exemplu. Dim MyAngle, MyHSin ' Definete unghiul n radiani. MyAngle = 1.3 ' Calculeaz sinusul hiperbolic. MyHSin = (Exp(MyAngle) - Exp(-1 * MyAngle)) / 2 -----------------I.2.6.1.6 Log(numr) ntoarce o valoare de tip Double care reprezint logaritmul natural al unui numr (>0). Logaritmul natural este logaritmul n baza e. Constanta e este aproximativ 2.718282. Exemplu. Dim MyAngle, MyLog ' Definete unghiul n radiani. MyAngle = 1.3 ' Calculeaz inversul sinusului hiperbolic. MyLog = Log(MyAngle + Sqr(MyAngle * MyAngle + 1)) -----------------I.2.6.1.7 Rnd[(numr)] ntoarce o valoare de tip Single(virgul mobil simpl precizie) care va conine un numr aleator. Argumentul(parametrul) este opional i poate fi un Single sau o expresie numeric corect. Valoarea ntoars de Rnd Dac parametrul este Rnd genereaz

<0 Acelai numr de fiecare dat, folosind numrul ca valoare de iniializare. >0 Urmtorul numr din secven. =0 Cel mai recent numr generat. Fr (de obicei) Urmtorul numr din secven. -----------------Funcia Rnd ntoarce o valoare n intervalul [0..1) Valoarea parametrului determin cum Rnd genereaz un numr aleator. Pentru orice valoare iniial, aceiai secven de numere este generat din cauza faptului c fiecare apel succesiv al funciei Rnd, folosete numrul generat anterior ca valoare pentru calculul urmtorului numr din secven.
Created by Serban Criscota Page 38 19 ianuarie 2001

nainte de prima folosire a funciei Rnd, dac se dorete generarea unei secvene de numere aleatoare, atunci generatorul de numere aleatoare trebuie iniializat cu o valoare ntmpltoare. Pentru aceasta se va folosi procedura Randomize, fr parametrii, care va folosi pentru iniializarea generatorului de numere aleatoare, ceasul sistemului de calcul. Not: Dac se dorete generarea unor numere ntregi, n intervalul [a.. b], se folosete formula: Int((b - a + 1) * Rnd + a) Exemplu. Dim MyValue Randomize MyValue = Int((6 * Rnd) + 1) ' Genereaz o valoare aleatoare ntre 1 i 6. -----------------I.2.6.1.8 Sin(numr) ntoarce o valoare de tip Double care reprezint sinusul unui unghi n radiani Rezultatul va fi n intervalul [-1..1] Pentru a transforma gradele n radiani se nmulesc gradele cu pi/180. Invers se vor nmuli radianii cu 180/pi. Exemplu. Dim MyAngle, MyCosecant MyAngle = 1.3 ' Definete unghiul n radiani. MyCosecant = 1 / Sin(MyAngle) ' Calculeaz cosecanta. -----------------I.2.6.1.9 Cos(numr) ntoarce o valoare de tip Double care reprezint cosinusul unui unghi n radiani Exemplu. Dim MyAngle, MySecant MyAngle = 1.3 ' Definete unghiul n radiani. MySecant = 1 / Cos(MyAngle) ' Calculeaz secanta. -----------------I.2.6.1.10 Tan(numr) ntoarce o valoare de tip Double care reprezint tangenta unui unghi n radiani Pentru a transforma gradele n radiani se nmulesc gradele cu pi/180. Invers se vor nmuli radianii cu 180/pi. Exemplu. Dim MyAngle, MyCotangent MyAngle = 1.3 ' Definete unghiul n radiani MyCotangent = 1 / Tan(MyAngle) ' Calculeaz cotangenta -----------------I.2.6.1.11 Atn(numr) ntoarce o valoare de tip Double care reprezint arctangenta unui numr. Exemplu. pi = 4 * Atn(1) ' Calculeaz valoarea lui pi. -----------------Created by Serban Criscota Page 39 19 ianuarie 2001

I.2.6.1.12 Expresii pentru calculul funciilor 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.2.6.2 Funcii TEXT - pentru stringuri.

I.2.6.2.1 Asc(string) ntoarce o valoare de tip Integer, n intervalul 0255, care reprezint codul n ASCII(ANSI) a primului caracter din irul de caractere ce se afl n argumentul (parametrul de intrare) funciei. Exemplu. Dim MyNumber MyNumber = Asc("A") ' ntoarce 65. MyNumber = Asc("a") ' ntoarce 97. MyNumber = Asc("Apple") ' ntoarce 65. -----------------I.2.6.2.2 Chr(CodCaracter) ntoarce o valoare de tip string care reprezint caracterul asociat codului caracterului n ASCII(ANSI), introdus ca argument al funciei. Not: Numerele ntre 0-31 au ca corespondent n codul ASCII caractere netipribile, dar care pot eventual s determine anumite aciuni n timpul afirii. De exemplu Chr(10) ntoarce un linefeed character - LF, care determin trecerea la o linie nou. Intervalul normal pentru 'CodCaracter' este 0-255. Exemplu.
Created by Serban Criscota Page 40 19 ianuarie 2001

Dim MyChar MyChar = Chr(65) MyChar = Chr(97) MyChar = Chr(62) MyChar = Chr(37) ------------------

' ntoarce A. ' ntoarce a. ' ntoarce >. ' ntoarce %.

I.2.6.2.3 AscB(string); AscW(string); ChrB(CodChar); ChrW(CodChar) Funciile AscB, AscW, ChrB, ChrW in seama c n memorie caracterele sunt codificate pe 2 octei n standardul UNICODE, ele considernd irul de caractere ca pe un tablou de octei, n care fiecare caracter ocup doi octei(byte) Funcia AscB - n loc s ntoarc codul pentru primul caracter, ntoarce primul byte, din codul n UNICODE al primului caracter, . Funcia AscW - ntoarce codul caracterului n UNICODE (pe 2 octei, n intervalul 02^16) Funcia ChrB . n loc s ntoarc un caracter al crui cod(aflat n parametrul funciei) poate fi pe 1 sau 2 bytes, ea va ntoarce ntotdeauna caracterul al crui cod este pe primul byte.

Funcia ChrW - ntoarce un string care conine caracterul al crui cod este introdus n argument n standardul UNICODE. Not: Aceste funcii au efect numai pe platformele care accept codul UNICODE. Dac acesta nu este acceptat, atunci ele se comport la fel ca funciile Asc respectiv Chr. Exemplu. Public Sub TestUnicode() MsgBox Asc("A") ' ntoarce Cod Ascii = 65 MsgBox AscB("A") ' ntoarce primul byte din Codul Unicode= 65 MsgBox AscW("A") ' ntoarce Codul Unicode= 65 MsgBox Asc("") ' ntoarce Cod Ascii = 170 MsgBox AscB("") ' ntoarce primul byte din Codul Unicode= 94 MsgBox AscW("") ' ntoarce Codul Unicode= 350 '------------------------------------------------------------------------------------MsgBox Chr(65) ' ntoarce Caracterul = A MsgBox ChrB(65) ' ntoarce Caracterul = A MsgBox ChrW(65) ' ntoarce Caracterul = A MsgBox Chr(170) MsgBox ChrB(94) MsgBox ChrW(350) End Sub Caracterul Cod ANSI(1 octet) Cod UNICODE(valoare) Cod UNICODE(2 octei) ' ntoarce Caracterul = ' ntoarce Caracterul = ^ ' ntoarce Caracterul =

A 65 65 65 0 94

170 350 1

Observaia 1. Se observ c n codul UNICODE, primele 128 de coduri sunt ca n codul ASCII.
Created by Serban Criscota Page 41 19 ianuarie 2001

-----------------I.2.6.2.4 LCase(string) ntoarce un string n care literele mari au fost convertite n litere mici. Restul caracterelor rmn nemodificate Exemplu. Dim UpperCase, LowerCase UpperCase = "Hello World 1234" LowerCase = LCase(UpperCase) -----------------I.2.6.2.5 UCase(string) ntoarce un Variant (String) n care literele mici au fost convertite n litere mari. Restul caracterelor rmn nemodificate Exemplu. Dim LowerCase, UpperCase LowerCase = "Hello World 1234" UpperCase = UCase(LowerCase) -----------------' String pentru convertit. ' ntoarce "HELLO WORLD 1234". ' String pentru a fi convertit. ' ntoarce "hello world 1234".

I.2.6.2.6 LTrim(string); RTrim(string); Trim(string) ntoarce o valoare de tip Variant (String) ce cuprinde o copie a unui string specificat fr spaiile de nceput la funcia LTrim, fr spaiile de sfrit la funcia RTrim, sau fr spaiile din ambele capete la funcia Trim. Exemplu. Dim MyString, TrimString MyString = " <-Trim-> " ' Iniializeaz stringul. TrimString = LTrim(MyString) ' TrimString = "<-Trim-> ". TrimString = RTrim(MyString) ' TrimString = " <-Trim->". TrimString = LTrim(RTrim(MyString)) ' TrimString = "<-Trim->". ' Utiliznd funcia Trim se obine acelai rezultat. TrimString = Trim(MyString) ' TrimString = "<-Trim->". -----------------I.2.6.2.7 Len(string | NumeVariabila) ntoarce o valoare de tip Long cuprinznd : Dac argumentul este un string cte caractere are. Dac argumentul este o variabil, cte caractere pot s fie introduse n ea. Not: Dac argumentul este NULL , funcia va ntoarce tot NULL, ca de altfel ca i la celelalte funcii. Unul (i numai unul) din cele dou argumente posibile trebuie specificat. Not: Se poate utiliza funcia LenB, care ine cont de reprezentarea n memorie n UNICODE a stringului. n loc s ntoarc numrul de caractere dintr-un string , LenB ntoarce numrul de bytes utilizai pentru a reprezenta acel string. Exemplu.
Created by Serban Criscota Page 42 19 ianuarie 2001

Type CustomerRecord ' Definete tipul dorit dorit de utilizator. ID As Integer ' Aceast definiie trebuie s fie la nivel de modul de cod Name As String * 10 Address As String * 30 End Type Dim Customer As CustomerRecord ' Declararea variabilelor. Dim MyInt As Integer, MyCur As Currency Dim MyString, MyLen MyString = "Hello World" ' Iniializeaz variabila. MyLen = Len(MyInt) ' ntoarce 2. MyLen = Len(Customer) ' ntoarce 42. MyLen = Len(MyString) ' ntoarce 11. MyLen = Len(MyCur) ' ntoarce 8. -----------------I.2.6.2.8 Left(string, lungime) ntoarce un sub-ir de caractere din partea stng a stringului al cror numr este stabilit de lungime. Lungimea este o expresie numeric indicnd cte caractere se vor ntoarce: Dac este 0, un string de lungime 0 ("") va fi ntors - ir vid. Dac este mai mare sau egal cu numrul de caractere din string, se va ntoarce ntregul string. Pentru a determina numrul de caractere dintr-un string se va utiliza funcia, Len . Exemplu. Dim AnyString, MyStr AnyString = "Hello World" MyStr = Left(AnyString, 1) MyStr = Left(AnyString, 7) MyStr = Left(AnyString, 20) -----------------' Definete stringul. ' ntoarce "H". ' ntoarce "Hello W". ' ntoarce "Hello World".

I.2.6.2.9 Right(string, lungime) ntoarce un sub-ir de caractere din partea dreapta a stringului al cror numr este stabilit de lungime. Lungimea este o expresie numeric indicnd cte caractere se vor ntoarce: Dac este 0, un string de lungime 0 ("") va fi ntors - ir vid. Dac este mai mare sau egal cu numrul de caractere din string, se va ntoarce ntregul string. Pentru a determina numrul de caractere dintr-un string se va utiliza funcia, Len . Exemplu. Dim AnyString, MyStr AnyString = "Hello World" MyStr = Right(AnyString, 1) MyStr = Right(AnyString, 6) MyStr = Right(AnyString, 20)
Created by Serban Criscota

' Definete stringul. ' ntoarce "d". ' ntoarce " World". ' ntoarce "Hello World".
Page 43 19 ianuarie 2001

-----------------I.2.6.2.10 Mid(string, start[,lungime]) ntoarce o valoare de tip Variant (String) cuprinznd un numr specificat de caractere dintr-un string. Parametrii reprezint: string (obligatoriu). Expresie string din care sunt ntoarse caractere. Dac stringul conine NULL, atunci NULL se va ntoarce. start (obligatoriu); Este de tip Long. Reprezint poziia caracterului din string de la care ncepe partea ce va fi preluat. Dac poziia este mai mare dect numrul de caractere din string, Mid va ntoarce un string vid ("") - de lungime 0. Numerotarea caracterelor ncepe de la 1. lungime (opional); Este de tip Variant (Long). Reprezint numrul de caractere ce vor fi ntoarse. Dac lipsete sau dac este mai mare dect numrul maxim de caractere care mai sunt pn la sfritul stringului (inclusiv caracterul de nceput), vor fi ntoarse toate caracterele de la poziia de start pn la sfrit. Pentru a determina numrul de caractere dintr-un string se va utiliza funcia Len . Exemplu. Dim MyString, FirstWord, LastWord, MidWords MyString = "Mid Function Demo" ' Creaz stringul. FirstWord = Mid(MyString, 1, 3) ' ntoarce "Mid". LastWord = Mid(MyString, 14, 4) ' ntoarce "Demo". MidWords = Mid(MyString, 5) ' ntoarce "Function Demo". Not: Mid, poate fi folosit i n partea stnga a unei instruciuni de atribuire, caz n care va nlocui din string, subirul specificat, cu stringul specificat de expresia din dreapta instruciunii, dar fr a modifica lungimea irului de caractere. Aceast facilitate nu este implementat i la funciile Left sau Right Exemplu. Public Sub TestMid() Dim S As String S = "123456789" Mid(S, 4, 2) = "A" MsgBox S ' Afieaz 123A56789 Mid(S, 4, 2) = "AB" MsgBox S ' Afieaz 123AB6789 Mid(S, 4, 2) = "ABC" MsgBox S ' Afieaz 123AB6789 End Sub -----------------I.2.6.2.11 InStr([start, ]string1, string2[, compare]) ntoarce o valoare de tip Variant (Long) reprezentnd poziia primei apariii a string2 n string1. start (opional). Expresie numeric care stabilete poziia de nceput pentru fiecare cutare. Dac este omis, cutarea ncepe de la poziia primului caracter. Argumentul este obligatoriu dac se specific o comparaie. string1 (obligatoriu). irul de caractere n care se va face cutarea. string2 (obligatoriu). irul de caractere care este cutat
Created by Serban Criscota Page 44 19 ianuarie 2001

compare (opional). Prezint modalitatea n care se poate face compararea a dou stringuri. Poate fi 0,1,sau2. 0-implicit - comparare binar 1 - comparare textual, ne-senzitiv, adic fr s se in cont de caracterele mari sau mici. 2 - comparare bazat pe informaiile din baza de date. Dac parametrul compare lipsete, atunci setarea Option Compare din modulul de cod determin tipul comparaiei. Not: Dac nu se gsete irul specificat se ntoarce valoarea 0. Dac unul din iruri este NULL, atunci NULL se ntoarce. Exemplu. Dim SearchString, SearchChar, MyPos SearchString ="XXpXXpXXPXXP" ' String n care se caut. SearchChar = "P" ' Se caut "P". MyPos = Instr(4, SearchString, SearchChar, 1) ' O comparaie textual ncepe de la poziia 4. ntoarce 6. MyPos = Instr(1, SearchString, SearchChar, 0) ' O comparaie binar ncepe la poziia 1. ntoarce 9. MyPos = Instr(1, SearchString, "W") ' ntoarce 0. ' Comparaia este binar implicit (lipsete ultimul argument). MyPos = Instr(SearchString, SearchChar) ' ntoarce 9. Exemplu. Private Sub cmdInstr_Click() Debug. Print InStr("Alison Balter, "Balter) Debug. Print InStr ("Hello, "1) End Sub -----------------I.2.6.2.12 String(numr, caracter) ntoarce un ir de caractere, care conine de numr de ori caracterul specificat. Not: Dac n loc de caracter este un numr N caracterul multiplicat va fi Chr(N). Dac N>255 se va folosi Chr(N Mod 256). Not: Dac al doilea argument conine un ir de mai multe caractere se va multiplica primul. Exemplu. Dim MyString MyString = String(5, "*") MyString = String(5, 42) MyString = String(10, "ABC") -----------------' ntoarce "*****". ' ntoarce "*****". - codul Ascii al caracterului * este 42 ' ntoarce "AAAAAAAAAA". Returneaz 8 Returneaz 3

I.2.6.2.13 Space (numr) ntoarce un ir de caractere, care conine de numr de ori caracterul spaiu. Exemplu. Dim MyString MyString = Space(8)
Created by Serban Criscota

' ntoarce un string cu 8 spaii


Page 45 19 ianuarie 2001

MyString = "Hello" & Space(10) & "World" ' Insereaz 10 spaii ntre cele dou cuvinte. I.2.6.2.14

Format(expresie[, format])

Funcia Format formateaz (transform) ntr-un ir de caractere care respect un ablon(format),o expresie. Expresie - este expresia pe care dorii s o formatai. Format (opional) reprezint tipul de format, ablon pe care dorii s l aplicai El este un nume valid de format[de ex "Long Time" sau "hh:mm:ss AMPM"] sau un format creat(definit) de utilizator. Exemplu. Private Sub cmdFormat_Click() Dim MyTime, MyDate, MyStr MyTime = #5:04:23 PM# MyDate = #1/27/93# ' Se vor folosi i urmtoarele funcii care ntorc timpul i data curent a sistemului de calcul: ' NOW() =ntoarce data i timpul ' TIME() =ntoarce timpul ' DATE() =ntoarce data MyStr = Format(Time(), "Long Time") MsgBox MyStr ' Afieaz timpul curent al sistemului de calcul, n formatul definit n Windows pentru 'Long Time' MyStr = Format(Date, "Long Date") MsgBox MyStr ' Afieaz data curent a sistemului de calcul, n formatul definit n Windows pentru 'Long Date MyStr = Format(MyTime, "h:m:s") ' ntoarce "17:4:23". MsgBox MyStr MyStr = Format(MyTime, "hh:mm:ss AMPM") ' ntoarce "05:04:23 PM". MsgBox MyStr MyStr = Format(MyDate, "dddd, mmm d yyyy") ' ntoarce "Miercuri, Ian 27 1993". MsgBox MyStr ' Dac parametrul format lipsete se va ntoarce un string. MyStr = Format(23) ' ntoarce "23". MsgBox MyStr ' Formate definite de utilizator. Se folosesc n continuare urmtoarele caractere pentru format: ' # - ntoarce cifra dac exist. Dac nu exist se ntoarce 'blanc' ' 0 - ntoarce cifra dac exist. Dac nu exist se ntoarce 0 ' , - ntoarce separatorul de grupe de cifre(n sistemul romnesc <,> sau american <.>) definit n Windows(System settings) ' . - ntoarce semnul pentru punctul zecimal n sistemul definit n Windows ' % - ntoarce n procente MyStr = Format(5459.4, "##,##0.00") ' ntoarce "5,459.40". MsgBox MyStr MyStr = Format(334.9, "###0.00") ' ntoarce "334.90". MsgBox MyStr
Created by Serban Criscota Page 46 19 ianuarie 2001

MyStr = Format(5, "0.00%") ' ntoarce "500.00%". MsgBox MyStr ' Formate definite de utilizator. Se folosesc n continuare urmtoarele caractere pentru format: ' < - ntoarce stringul cu litere mici ' > - ntoarce stringul cu litere mari MyStr = Format("HELLO", "<") ' ntoarce "hello". MsgBox MyStr MyStr = Format("This is it", ">") ' ntoarce "THIS IS IT". MsgBox MyStr MsgBox Format(50, "Currency") '50.00 LEI - Afieaz n sistemul de valut definit n Windows(System settings) MsgBox Format(Now(), "Short Date") ' 8/5/95 - Afieaz n formatul definit pentru 'dat scurt' MsgBox Format(Now(), "DDDD") 'Afieaz cuvantul pentru zi MsgBox Format(Now(), "DDD") 'Afieaz ziua prescurtat(pe 2,3 caractere) MsgBox Format(Now(), "YYYY") 'Afieaz anul din patru cifre End Sub '-----------------I.2.6.3 Funcii pentru tablouri(array)

I.2.6.3.1 UBound(arrayname[, dimension]) I.2.6.3.2

LBound(arrayname[, dimension])

ntoarce o valoare de tip Long, care va conine pentru o anumit dimensiune a unui tablou: Pentru UBound : valoarea indicelui cel mai mare disponibil (marginea superioar). Pentru LBound : valoarea indicelui cel mai jos disponibil (marginea inferioar). Sintaxa funciei UBound cuprinde: arrayname(obligatoriu). Denumirea variabilei care definete tabloul. dimension(opional). Este de tip Variant (Long). Indic dimensiunea a crei margine (superioar sau inferioar) este ntoars. Se utilizeaz 1 pentru prima dimensiune, 2 pentru a doua etc. Dac lipsete , automat va fi 1. Funcia UBound se utilizeaz mpreun cu funcia LBound pentru a determina mrimea unui tablou, i anume: LBound - pentru a gsi cea mai joas valoare a dimensiunii unui tablou. UBound - pentru a gsi cea mai mare valoare a dimensiunii unui tablou.

Created by Serban Criscota

Page 47

19 ianuarie 2001

Exemplu. UBound i LBound ntoarce urmtoarele valori pentru un tablou cu dimensiunile: Dim A(1 To 100, 0 To 3, -3 To 4) Valoare Funcia Parametrii a ntoars (A,1) 100 UBound (A,2) 3 (A,3) 4 (A,1) 1 LBound (A,2) 0 (A,3) -3 -----------------Marginea cea mai de jos, implicit, pentru orice dimensiune a unui tablou creat prin declaraie(Dim, Private, Public, ReDim sau Static) , este 0 sau 1. Ea depinde de setarea declaraiei Option Base.(de obicei 0) Excepie. Baza unui tablou creat cu funcia Array este 0, ea ne fiind afectat de Option Base. Tablourile, pentru care dimensiunile sunt setate folosind To n declaraiile Dim, Private, Public, ReDim sau Static pot lua orice valoare ntreag ca fiind marginea cea mai de jos (cel mai mic indice).
I.2.6.4 Funcii pentru mesaje

I.2.6.4.1 MsgBox(prompt[, buttons] [, title] ) Afieaz un mesaj ntr-o csu de dialog, ateapt utilizatorul s apese un buton i ntoarce o valoare de tip Integer care indic ce buton a fost apsat de utilizator. Sintaxa funciei MsgBox cuprinde urmtoarele argumente: Prompt(obligatoriu). Expresie de tip string afiat ca mesaj n caseta de dialog. Lungimea sa maxim este de aproximativ 1024 caractere, depinznd de mrimea caracterelor folosite. Dac promptul este compus din mai mult de un rnd, se pot separa liniile utiliznd un caracter CR (carriage return) Chr(13), un caracter LF (line feed) Chr(10), sau o combinaie (Chr(13) & Chr(10)) dup fiecare rnd. Buttons(optional). Expresie numeric care este suma valorilor reprezentnd: Dac lipsete, valoarea implicit a acestui parametru este 0. Setrile pentru butoanele argument sunt: Constanta vbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation
Created by Serban Criscota

Valoare 0 1 2 3 4 5 16 32 48 64

Descrierea Afieaz numai butonul OK. Afieaz butoanele OK i Cancel. Afieaz butoanele Abort, Retry i Ignore. Afieaz butoanele Yes, No i Cancel. Afieaz butoanele Yes i No. Afieaz butoanele Retry i Cancel. Afieaz pictograma Critical Message . Afieaz pictograma Warning Query . Afieaz pictograma Warning Message Afieaz pictograma Information Message .
Page 48

Ce reprezint

Numrul i tipul butoanelor afiate n caseta de dialog

Felul pictogramei utilizate n partea din stnga sus

19 ianuarie 2001

VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 VbApplicationModal

0 256 512 768 0

Primul buton este implicit Al doilea buton este implicit. Al treilea buton este implicit. Al patrulea buton este implicit. Aplicaie modal-utilizatorul trebuie s rspund casetei de mesaj nainte de a continua s lucreze n aplicaia curent Sistem modal - toate aplicaiile sunt blocate pn cnd utilizatorul rspunde casetei de mesaj.

Care este butonul implicit

VbSystemModal

4096

Dac caseta de text este modal la nivelul aplicaiei curente sau a tuturor taskurilor.

Title(optional). Expresie de tip string afiat pe bara de titlu a casetei de dialog. Dac titlul lipsete, se va plasa pe bara de titlu numele aplicaiei. Valoarea ntoars de funcie este: Constanta Valoare Butonul pe care s-a apsat vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo 1 2 3 4 5 6 7 OK Cancel Abort Retry Ignore Yes No

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

Created by Serban Criscota

Page 49

19 ianuarie 2001

If Rasp = vbYes Then Nr = Abs(Nr) ElseIf Rasp = vbNo Then Nr = Abs(Nr) * -1 Else ' cazul Cancel ' Lasa numarul neschimbat End If MsgBox "Numarul 'MsgBox ca procedura End Sub ------------------

prelucrat este: " & Nr, vbInformation

I.2.6.4.2 InputBox(prompt[, title] [, default] [, xpos] [, ypos] ) Afieaz un mesaj ntr-o caset de dialog, ateapt ca utilizatorul s introduc un text sau s apese un buton i ntoarce o valoare de tip string ce conine textul introdus de utilizator ntr-un Text Box. Sintaxa funciei InputBox cuprinde urmtoarele argumente: Prompt(obligatoriu). Expresie de tip string afiat ca mesaj n caseta de dialog. Lungimea sa maxim este de aproximativ 1024 caractere, depinznd de mrimea caracterelor folosite. Dac promptul este compus din mai mult de un rnd, se pot separa liniile utiliznd un caracter CR (carriage return) Chr(13), un caracter LF (line feed) Chr(10), sau o combinaie (Chr(13) & Chr(10)) dup fiecare rnd. Title(optional). Expresie de tip string afiat pe bara de titlu a casetei de dialog. Dac titlul lipsete, se va plasa pe bara de titlu numele aplicaiei. Default(opional). Expresie de tip string afiat n caseta de text ca rspuns implicit dac utilizatorul nu introduce nimic. Dac lipsete, caseta de text va fi afiat goal. Xpos (opional). Expresie numeric care reprezint, n twips, distana pe orizontal de la marginea din stnga a casetei de dialog la marginea din stnga a ecranului. Dac lipsete, caseta de dialog este centrat orizontal. Ypos (opional). Expresie numeric care reprezint, n twips, distana pe vertical de la marginea de sus a casetei de dialog la marginea de sus a ecranului. Dac lipsete, caseta de dialog este poziionat vertical la aproximativ o treime din distana pn n subsolul ecranului. Exemplu. Urmtorul exemplu utilizeaz InputBox pentru a citi o dat introdus de utilizator i folosirea lui MsgBox i ca funcie i ca procedur (pentru afiarea unor mesaje). Se observ utilizarea semnului @ pentru a delimita diversele pri ale irului de caractere. Sub CustomMessage() Dim strMsg As String, strInput As String ' Iniializeaz stringul. strMsg = "Numr n afara intervalului. @ Ai introdus un numr care este _ & "mai mic dect 1 i mai mare ca 10. @ Apsai OK pentru a introduce_ & "numrul din nou." ' Se observ rolul lui @ de delimitator de rnduri ' Se cere utilizatorului s introduc ceva. strInput = InputBox("Introducei un numr ntre 1 i 10.")
Created by Serban Criscota Page 50 19 ianuarie 2001

' Determin dac utilizatorul introduce un ir vid <"">, adic nimic. If strInput <> "" Then ' Testeaz valoarea intodus de utilizator Do While (strInput < 0 Or strInput > 10) If MsgBox(strMsg, vbOKCancel, "Error!") = vbOK Then strInput = InputBox("Introducei un numr ntre 1i 10.") Else Exit Sub End If Loop ' Afieaz data corect introdus de utilizator. MsgBox "Ai introdus numrul & strInput & "." Else ' nu s-a introdus nimic Exit Sub End If End Sub -----------------I.2.6.5 Funcii cu tipul:

D at e / T i m e

I.2.6.5.1 DatePart(interval, date) Funcia DatePart ntoarce o partea unei date, specificat de argumentul interval Argumentul interval, de tip string, poate lua urmtoarele valori:

interval yyyy q m y d
Exemplu.

Descriere Anul Trimestrul Luna Ziua din an Ziua

interval w ww h n s

Descriere Ziua din sptmna Sptmna Ora Minute Secunde

Private Sub cmdDatePart_Click() MsgBox DatePart ("YYYY, Now) MsgBox DatePart ("M, Now) MsgBox DatePart ("Q, Now) MsgBox DatePart ("Y, Now) End Sub ------------------

Afieaz anul curent Afieaz numarul lunii curente Afieaz numarul trimestrului curent Afieaz ziua din anul curent

I.2.6.5.2 DateDiff(interval, date1, date2) Funcia DateDiff ntoarce intervalul de timp dintre dou date, deci date2-date1. Unitatea de timp este , specificat de argumentul interval Exemplu. Private SubcmdDateDiff_Click() MsgBox DateDiff ("d, Now, #12/31/02#)
Created by Serban Criscota

Numarul zilelor pana la 12/31/02


Page 51 19 ianuarie 2001

MsgBox DateDiff ("m, Now, #12/31/02#) MsgBox DateDiff ("yyyy, Now, #12/31/02#) MsgBox DateDiff ("q, Now, #12/31/02#) End Sub ------------------

Numarul lunilor pana la 12/31/02 Numarul anilor pana la 12/31/02 Numarul trimestrelor pana la 12/31/02

I . 2 . 6 . 5 . 3 D a t e A d d ( i n t e r v a l , n u m b er , d a t e ) Funcia DateAdd ntoarce rezultatul adugrii sau scderii unei perioade specifice de timp precizat prin argumentul interval - la o (dintr-o) dat stabilit. Private Sub cmdDateAdd_Click () MsgBox DateAdd (d, 3, Now) Ziua de azi plus 3 zile MsgBox DateAdd (m, 3, Now) Ziua de azi plus 3 luni MsgBox DateAdd (yyyy, 3, Now) Ziua de azi plus 3 ani MsgBox DateAdd ("q, 3, Now) Ziua de azi plus 3 trimestre End Sub -----------------I.2.6.5.4 Day(date); Month(date); Year(date) ntoarce un Variant (Integer), care va conine ziua sau luna sau anul, coninut n data din argument. -----------------I.2.6.5.5 Second(date); Minute(date); Hour(date) ntoarce un Variant (Integer), care va conine secunda sau minutul sau ora, coninut n data din argument. -----------------I.2.6.5.6 Now ntoarce un Variant (Date), care specific data i timpul curent, care este n sistemul de calcul. -----------------I.2.6.5.7 Date ntoarce un Variant (Date), care specific data curent, care este n sistemul de calcul. -----------------I.2.6.5.8 Timp ntoarce un Variant (Date), care specific timpul curent, care este n sistemul de calcul. -----------------I.2.6.5.9 DateSerial(year, month, day) ntoarce un Variant (Date) care va conine data specificat n argumentele: year, month, and day. Descrierea argumentelor: year obligatoriu; Integer. Numr ntre 100 and 9999, inclusiv, sau expresie numeric. month obligatoriu; Integer. Orice expresie numeric. day obligatoriu; Integer. Orice expresie numeric. Remarks

Created by Serban Criscota

Page 52

19 ianuarie 2001

Pentru a specifica o dat, de exemplu December 31, 1991, valoarea fiecrui parametru trebuie s fie valid, adic ziua ntre 1-31 i luna ntre 1-12. Exemplu urmtor va ntoarce o dat, exprimat relativ fa de alt dat. Se observ c operaiile se fac specific pentru zile i luni, inndu-se cont de numrul de zile i luni. Astfel ziua (1 - 1) din luna (8 2), ar trebui s fie 0/6, dar practic dac scdem o zi din 1 iunie, avem 31/Mai.Deci, DateSerial(1990 - 10, 8 - 2, 1 - 1) va fi: 31/Mai/1980. Dac argumentul pentru an este ntre 0 i 99, se vor considera anii din dou cifre setai n Windows. Pentru ceilali ani trebuiesc introduse 4 cifre. Dac un argument este dat n afara intervalului acceptat, atunci se va ntoarce o dat care este practic mrit cu numrul de zile sau luni care depesc valoarea maxim pentru argumentul respectiv. De exemplu MsgBox(DateSerial(1998, 11, 32)) va afia 2/12/1998 Exemplu. Dim MyDate MyDate = DateSerial(1969, 2, 12) -----------------' ntoarce data February 12, 1969.

I.2.6.6 Funcii: structuri de control

I.2.6.6.1 IIf(condiie, TruePart, FalsePart) Aceast funcie are o aciune asemntoare cu a instruciunii IfThenElse Funcia IIf ntoarce unul din cele dou argumente, TruePart sau FalsePart, funcie de rezultatul evalurii condiiei ce se gsete n primul argument. Astfel, dac:

condiie= true - funcia ntoarce parametrul TruePart condiie= false - funcia ntoarce parametrul FalsePart
Not: Toi cei trei parametrii ai funciei sunt obligatorii. Observaia 1. TruePart sau FalsePart, pot la rndul lor s conin o alt funcie, deci i IIF, ceea ce permite realizarea unor structuri complexe de teste. Exemplu. Function TestIF(TestMe As Integer) TestIF = IIf(TestMe > 1000, "Large", "Small") End Function Dac va fi folosit n: MsgBox TestIF(1500) ' afieaz Large MsgBox TestIF(500) ' afieaz Small -----------------I.2.6.6.2 Choose(index, caz-1[, caz-2, ... [, caz-n]]) Funcia Choose, selecioneaz i ntoarce, unul din argumentele listei, i anume caz-1 sau caz-2 sau ... caz_n, funcie de valoarea pe care o are argumentul index, i anume: Exemplu. Function GetChoice(Ind As Integer)
Created by Serban Criscota Page 53 19 ianuarie 2001

Dac index=1 atunci se ntoarce caz-1 Dac index=2 atunci se ntoarce caz-2 Dac index=n atunci se ntoarce caz-n

Not: Dac index < 1, sau index > n, atunci Choose ntoarce valoarea Null

GetChoice = Choose(Ind, "Speedy", "United", "Federal") End Function 'La apelul funciei vom avea: MsgBox GetChoice (2) ' afieaz United -----------------Dim X As Variant X = GetChoice (5) ' X se va face Null -----------------I.2.6.6.3 Switch(expr-1, value-1[, expr-2, value-2 [, expr-

n,value-n]])
Aceast funcie are o aciune asemntoare cu a instruciunii IfThenElseIfElse Funcia Switch va evalua la n ordine, condiiile, expr-1, expr-2, expr-n, pn cnd va obine o valoare true. n acest moment, cercetarea se oprete, i funcia ntoarce valoarea pereche care se gsete n argumentul value_?. Daci: Exemplu. Function MatchUp (CityName As String) Matchup = Switch(CityName = "London", "English", CityName _ = "Rome", "Italian", CityName = "Paris", "French") End Function -----------------'La apelul funciei vom avea: MsgBox MatchUp ("Paris") ' afieaz French -----------------I.2.6.7 Funcii de inspecie

Dac expr-1 = True atunci se ntoarce value-1, i gata Dac expr-1 = False atunci trece la evaluarea urmtoare Dac expr-2 = True atunci se ntoarce value-2, i gata Dac expr-2 = False atunci trece la evaluarea urmtoare Etc.

Not: Dac nici una din expresiile evaluate nu este True, atunci Switch ntoarce valoarea Null

I.2.6.7.1 VarType(NumeVariabil) ntoarce un Integer, care precizeaz ce tip de date se gsete n variabila NumeVariabil, de tip variant, care este argumentul funciei. Reamintim c variabilele de tip variant, se caracterizeaz prin faptul c n ele se pot introduce valori de diferite tipuri. Funcia VarType, tocmai acest rol are, s ne indice la un moment dat, ce tip de date se gsesc ntr-o variabil de tip variant.

Created by Serban Criscota

Page 54

19 ianuarie 2001

Rezultatul ntors de funcia VarType Constanta


vbEmpty vbNull vbInteger vbLong vbSingle vbDouble vbCurrency vbDate vbString vbObject vbError vbBoolean vbVariant vbDataObject vbDecimal vbByte vbArray

Valoare 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 17 8192

Descriere
Empty (neiniializat) Null (lipsa datelor valide) Integer Long integer Single-precision - numr n virgul mobil Double-precision - numr n virgul mobil Currency - valoare Date - valoare de tip Date/Text String Object Error Boolean - valoare Variant (folosit numai ]n tablouri de Variant) Obiect de acces la date Decimal - valoare Byte - valoare Array - Tablou

Not: Constantele fiind definite n Visual Basic for Applications, ele pot fi folosite oriunde n loc de valorile specificate. Exemplu. Dim IntVar, StrVar, DateVar, MyCheck 'Variabile declarate variant, deoarece lipsete tipul de data ' Iniializarea variabilelor. IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69# 'Aa se pot scrie mai multe instruciuni pe rnd MyCheck = VarType(IntVar) ' ntoarce 2. Se separ aa cum se vede cu dou puncte. MyCheck = VarType(DateVar) ' ntoarce 7. MyCheck = VarType(StrVar) ' ntoarce 8. -----------------I.2.6.7.2 IsNull(expresie) ntoarce o valoare de tip Boolean care indic dac expresia transmis ca parametru de intrare conine date care nu sunt valide, adic au valoarea <Null>. Parametrul este de tip variant i conine o expresie de tip numeric sau string. Funcia IsNull ntoarce: True - dac parametrul are valoarea Null False - dac parametrul nu are valoarea Null

Created by Serban Criscota

Page 55

19 ianuarie 2001

Not: Aa cum am mai artat dac un termen al expresiei este Null, atunci expresia va fi tot Null, i funcia va ntoarce evident True. Observaia 1. Valoarea Null, ndic faptul c un Variant nu conine date valide. Mai exist nc dou valori Empty i String vid(gol) care pot fi uor confundate cu Null, ceea ce constituie o eroare. Deci vom avea: NULL - variabil variant n care datele nu sunt valide. EMPTY - variabil variant care nu a fost niializat. String de lungime 0 (vid, gol) - string care nu are nimic n el, adic este "". Exemplu. Dim MyVar, MyCheck MyCheck = IsNull(MyVar) MyVar = "" MyCheck = IsNull(MyVar) MyVar = Null MyCheck = IsNull(MyVar) -----------------' variabile variant ' ntoarce False, deoarece este Empty ' ntoarce False, deoarece este string vid(de lungime 0). ' ntoarce True.

I.2.6.7.3 IsEmpty(NumeVariabila) ntoarce o valoare de tip Boolean care indic dac o variabil, transmis ca parametru de intrare este sau nu iniializat. Parametrul este de tip variant i conine o dat de tip numeric sau string. Funcia IsEmpty ntoarce: True - dac variabila NumeVariabila nu este iniializat, sau a fost introdus n ea direct Empty. False - variabila a fost iniializata(chiar cu Null sau un string vid) Exemplu. Dim MyVar, MyCheck ' variabile variant MyCheck = IsEmpty(MyVar) ' ntoarce True. MyVar = Null ' Assign Null. MyCheck = IsEmpty(MyVar) ' ntoarce False. MyVar = Empty ' Assign Empty. MyCheck = IsEmpty(MyVar) ' ntoarce True. -----------------I.2.6.7.4 IsMissing(NumeParametru)

IsMissing se folosete ntr-o rutin, pentru a testa dac un parametru opional al acesteia, a fost
sau nu introdus n lista parametrilor actuali de la apelarea acestei rutine. Parametrul funciei IsMissing, <NumeParametru> este de tip variant i este chiar parametrul optional. Funcia IsMissing ntoarce o valoare de tip Boolean, care va avea valoarea TRUE, numai dac parametrul opional testat, nu a fost introdus n lista parametrilor actuali, deci el practic lipsete Exemplu. Dim ReturnValue ' Se va apela funcia ReturnTwice definit de utilizator cu un parametru declarat opional ReturnValue = ReturnTwice() ' ntoarce Null.
Created by Serban Criscota Page 56 19 ianuarie 2001

ReturnValue = ReturnTwice(2) ' ntoarce 4. ' Declararea funciei. Function ReturnTwice(Optional A) If IsMissing(A) Then ' Funcia a fost apelat fr parametrul A ReturnTwice = Null Else ' Funcia a fost apelat cu parametrul A ReturnTwice = A * 2 End If End Function -----------------Observaia 1. Funcia IsMissing, se aplic numai dac parametrul opional este de tip variant. Dac parametrul opional nu este de tip variant ea va ntoarce ntotdeauna(fie c parametrul opional este sau nu este folosit la apelarea funciei) valoarea FALSE.
I.2.6.8 Funciile agregate SQL

O funcie agregat SQL, este specific prin faptul c datele ei de intrare sunt valorile unui cmp dintr-o tabel(cerere) - care este legat de obiectul n care se folosete, adic cerere, tabel, formular sau raport - , din toate sau o parte din nregistrri. Ele calculeaz expresii al cror domeniu de aplicabilitate este un cmp al tabelei(cererii) care se utilizeaz n obiectul unde sunt folosite. n cazul rapoartelor sau formularelor, funcii agregate SQL, se calculeaz pe tabela(cererea) legat la acesta. Funciile agregate SQL se folosesc fr argumente Funciile agregate SQL sunt: SUM - calculeaz suma valorilor pe un cmp. MAX, MIN - ntoarce valoarea maxim / minim a unui cmp. AVG - calculeaz media aritmetic a valorilor unui cmp. COUNT - numrul de nregistrri ale cmpului(diferite de NULL). Dac se dorete ca s se ia n calcul i cmpurile cu valoarea NULL, atunci se va folosi expresia COUNT(*). VAR, VARP, STDEV, STDEVP - calcule statistice(variana i deviaia standard) Not: Valoarea NULL, n funciile agregate (SQL sau de domeniu), nu se ia n considerare. n celelalte funcii sau operaii, valoarea NULL a unui termen duce, la rezultatul NULL al expresiei, indiferent de felul n care e constituit aceasta. -----------------I.2.6.9 Funciile agregate de domeniu.

Funciilor agregate de domeniu ntorc date de calcul agregate, la fel ca i funciile agregate SQL. Diferena rezult din faptul c domeniul de definiie al acestor funcii, este reprezentat de un cmp al unei tabele(cereri) - din baza de date curent - asupra cruia se aplic, eventual, un criteriu de selecie a nregistrrilor. Domeniului de definiie este stabilit de valorile ce se gsesc n parametrii(argumentele) funciei. Funciilor agregate de domeniu, (au aceiai denumire ca a funciilor agregate SQL, dar cu litera D n fa) sunt DSum - calculeaz suma valorilor pe un cmp. D Max, Dmin - ntoarce valoarea maxim / minim a unui cmp. DAvg - calculeaz media aritmetic a valorilor unui cmp.
Created by Serban Criscota Page 57 19 ianuarie 2001

DCount - numrul de nregistrri ale cmpului(diferite de NULL). DVar, DVarP, DStDev, DStDevP - calcule statistice(variana i deviaia standard) DLookUp - ntoarce prima valoare ntlnit n domeniul selecionat. (aceasta nu are echivalent n funciile agregate SQL) Argumentele folosite sunt aceleai n toate aceste funcii, i stabilesc aa cum am mai artat, care este domeniul de definiie pe care se calculeaz valoarea agregat.

Dfuncie((NumeCmp, NumeTabela[, Criteriu])


NumeCm, NumeTabela - sunt stringuri care stabilesc care este cmpul din tabela(cererea) asupra creia se fac calculele agregate. Criteriu - este un string prin care se introduce un criteriu de selecie a nregistrrilor din domeniul specificat de primii doi parametrii. Dac nu este prezent acest parametru se vor lua n calcul datele din cmpul respectiv din toate nregistrrile tabelei specificate. Not: Dac nu se selecioneaz datorit criteriului nici o nregistrare, funcia ntoarce valoarea NULL. Exemplu. Dim varX As Variant, iNr As Integer, sSir As String ' cazul 1 - selecia nregistrrilor cu CodStudent avnd valoarea <100 - ntoarce dintre acestea valoarea Nume cea mai mare n ordinea de sortare. varX = DMax("[Nume]", "Studenti", "[CodStudent]<1oo") ' CodStudent este de tip numeric ' cazul 2 - selecia nregistrrilor cu Nume avnd valoarea 'Doru' - ntoarce dintre acestea valoarea Anul cea mai mic varX = DMin("[Anul]", "Studenti", "[Nume]='Doru' ") ' Nume este de tip text ' cazul 3 - selecia nregistrrilor cu CodStudent avnd valoarea < cea din variabila numeric iNr ntoarce dintre acestea valoarea Nume cea mai mare n ordinea de sortare. iNr = 100 varX = DMax("[Nume]", "Studenti", "[CodStudent]<" & Nr) ' CodStudent este de tip numeric ' cazul 4 - selecia nregistrrilor cu Nume avnd valoarea ce se gsete n variabila string sSir ntoarce dintre acestea valoarea Anul cea mai mic sSir = "Doru" varX = DMin("[Anul]", "Studenti", "[Nume]='" & sSir & "'") ' Nume este de tip text -----------------Se observ c n formarea criteriului este foarte important dac criteriul se va aplica pe un cmp numeric sau de tip text. n cazul cnd avem de-a face cu un cmp text valoarea cu care se face compararea trebuie la rndul ei s fie string, deci ncadrat din nou ntre ghilimele (2 ghilimele ntr-un string delimitat de ghilimele sunt considerate ca un semn ghilimea) sau un apostrof. Deci "[Nume]='Doru' " este echivalent cu "[Nume]=""Doru"" " Lucrurile se complic n momentul n care criteriul pe care l introducem va compara un cmp cu o valoare ce se afl ntr-o variabil, ca n cazurile 3 i 4. Important este s tim c forma de scriere a criteriului este diferit funcie de natura cmpului folosit de criteriu, numr sau text. Not: Reamintesc c valoarea NULL, n funciile agregate (de domeniu sau SQL), nu se ia n considerare. n celelalte funcii sau operaii, valoarea NULL a unui termen duce, la rezultatul NULL al expresiei, indiferent de felul n care e constituit aceasta. -----------------I.2.6.10 Funcii de conversie

I.2.6.10.1 Str(Numr) Transform un numr ntr-un ir de caractere, care vor reprezenta numrul respectiv.
Created by Serban Criscota Page 58 19 ianuarie 2001

Numr - argumentul funciei, de tip Long, care va conine o expresie numeric ce va fi convertit ntr-un ir de caractere. Observaia 1. Dup conversie, la nceputul stringului va fi un spaiu pentru numerele pozitive / sau semnul (-) pentru numerele negative. Observaia 2. Punctul zecimal va fi reprezentat ntotdeauna de semnul punct(.), indiferent de cum este setat acesta n Windows(ca punct sau ca virgul). Not: Pentru transformrile numerelor n stringuri dar care s respecte alte reguli de prezentare, se folosete funcia Format. Exemplu. Dim MyString MyString = Str(459) ' ntoarce " 459". MyString = Str(-459.65) ' ntoarce "-459.65". MyString = Str(459.001) ' ntoarce " 459.001". -----------------I.2.6.10.2 Val(string) ntoarce numrul coninut n string, ca pe o valoare numeric de tipul cel mai apropiat reprezentrii valorii respective. Not: Funcia Val, n momentul n care ntlnete un caracter care nu poate face parte din reprezentarea unui numr, oprete inspecia n continuare, i face conversia numai pn la acest caracter. Printre caracterele care nu sunt recunoscute de funcia Val, sunt i virgula(,) sau semnul dolar($). &O i &H, sunt considerate ca rdcina pentru numere n reprezentarea octal, respectiv hexazecimal. Spaiile, tab-ul i LF, nu se iau n considerare(se sar) Punctul zecimal va fi reprezentat ntotdeauna de semnul punct. (.) Exemplu. Dim MyValue MyValue = Val("2457") ' ntoarce 2457. MyValue = Val(" 2 45 7") ' ntoarce 2457. MyValue = Val("24 and 57") ' ntoarce 24. MyValue = Val(" 1615 198th Street N.E.") ' ntoarce 1615198 ------------------

Created by Serban Criscota

Page 59

19 ianuarie 2001

I.2.7 Mediul de depanare i dezvoltare VBA. Meniul de execuie i depanare al VBA, este prezentat mai jos: Reseteaz toate variabilele globale ale aplicaiei
Afieaz fereastra Debug. n aceasta se vor regsi toate afirile fcute cu instrDebug.Print

Bara pentru Visual Basic

Stop Run

Execut instruciune cu instruciune dar cursorul galben de execuie se va opri numai pe:Toate g instr.Nu va mai intra n rutinele apelateNu se va mai i opri o n rutina n care este

Cursorul de marcare a instruciunii care se va executa

Comenzile de compilare

Punctul de ntrerupere
Va determina oprirea rulrii programului acolo unde este ntlnit . Se recunoate prin culoarea maro a instruciunii, i a unui punct n faa ei

Created by Serban Criscota

Page 60

19 ianuarie 2001