programarea în visual basic for application(vba)1

Upload: mari-cajvan

Post on 11-Jul-2015

469 views

Category:

Documents


1 download

TRANSCRIPT

"Limbaje de programare folosite n informatice de gestiune" P A R T E A -ICUPRINS Cap I. Programarea n Visual Basic for Application(VBA)...................................5I.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. ..........................................................................................................................8I.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........................................16I.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........................................................19I.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.) 22I.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)...........................................................................................................................23I.2.4.2.3 Structura repetitiv............................................................................................................24I.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................................................................25I.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..........................................................................................27I.2.5 Rutine - proceduri i funcii.................................................................................................27I.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. 28Created 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............................................................................28I.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. ........................................................................30I.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...........................................................................................................................31I.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...........................................................................................31I.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. ...................................................................36I.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............................................................................................................41Created 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...........................................................................................49I.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. 53I.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:.........................56I.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. ...........................................................................57I.2.6.8 Funciile agregate SQL..........................................................................................................57 I.2.6.9 Funciile agregate de domeniu.............................................................................................57 I.2.6.10 Funcii de conversie.............................................................................................................58Created 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). 59I.2.7 Mediul de depanare i dezvoltare VBA..............................................................................60I.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 codCreated 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^+/-EDomeniu 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 variabilelorForma 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 josCreated 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 DatAa 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 indiceluiI.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 DatExemplu. 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 2Created 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 490011.0001 0000.0000

A 65 650100.0001 0000.0000

170 3500101.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] = ValoareO 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 = ExpresieAciunea 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

ModRestul 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)

=5) =True

=egal (5=5) =True

ne egal (55) = False

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

Likecompar 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

NOTTrueFalseFalseTrue

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 NULLCreated 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 SelectAceast 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 5Created 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 sauCreated 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 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 eA1A2B1Parametriiformali Parametrii actualiM1M2T a d

r e s eA1A2B1Parametriiformali

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 parametruluirespectiv 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 FunctionCreated 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 ListaParametrilorActualiNot: 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 ianu