Documente Academic
Documente Profesional
Documente Cultură
Programarea in Visual Basic For Application VBA 1
Programarea in Visual Basic For Application VBA 1
Programarea in Visual Basic For Application VBA 1
I.2.2
Variabile..........................................................................
.........................................................12
I.2.3
Constante..........................................................................
........................................................19 I.2.4 Instrucţiunile
executive ale limbajului Visual
Basic........................................................19
I.2.4.1 Instrucţiunea de
atribuire..........................................................................
............................20 I.2.4.1.1 Formarea expresiilor în Visual
Basic..............................................................................
20
Observaţia 1. Aşa cum am mai arătat, dacă un termen al unei expresii este NULL,
atunci şi rezultatul expresiei este tot NULL. Spunem că NULL-ul se propagă în
expresii. Totuşi există o excepţie, şi anume la operatorul de concatenare a
şirurilor, &: Dacă un termen este NULL, iar celălalt nu este NULL, atunci
rezultatul va fi chiar termenul diferit de NULL...........................22
Observaţia 2. Valoarea EMPTY, în expresii este considerată, funcţie de tipul de
date pe care îl reprezintă, chiar valoarea cu care se iniţializează variabilele de
tipul respectiv(astfel în expresii dacă un termen numeric este EMPTY
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
secvenţială........................................................................
.................................22 I.2.4.2.2 Structura
alternativă........................................................................
..................................22
Observaţia 1. Dacă mai multe condiţii sunt adevărate, atunci se vor executa toate
grupurile corespunzătoare de instrucţiuni. Deci instrucţiunea Select Case nu se
opreşte la întâlnirea primei condiţii adevărate, ci va evalua toate
condiţiile.........................................................................
...................................................23 Observaţia 2. În ValoareX se
pot folosi reuniuni de mulţimi (operator virgula - ex: 1,2,5) intervale (operator
TO - ex: 1 To 7), sau submulţimi(operator IS ex: Is >
7).................................................................................
..........................................23
I.2.4.2.3 Structura
repetitivă.........................................................................
...................................24
I.2.4.2.3.1 Structura repetitivă cu test. Instrucţiunea
DO.................................................................................
24
Observaţia 1. Instrucţiunea Exit Do, provoacă ieşirea forţată din ciclu. De obicei
se execută funcţie de evaluarea unei condiţii într-o instrucţiune IF.......25
Observaţia 2. Condiţia este evaluată funcţie de locul unde este plasată în
instrucţiune şi
anume:.............................................................................
.......................25 Observaţia 3. Ciclul se execută minim
de................................................................25
I.2.4.2.3.2 Structura repetitivă cu contor. Instrucţiunea
FOR...NEXT.............................................................26
Observaţia 1. TruePart sau FalsePart, pot la rândul lor să conţină o altă funcţie,
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 Funcţii de
inspecţie..........................................................................
......................................54 I.2.6.7.1
VarType(NumeVariabilă).............................................................
....................................54 I.2.6.7.2
IsNull(expresie)...................................................................
..............................................55
Cap I.
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 cunoştinţe aprofundate despre sistemele de calcul. Basic a
fost implementat iniţial, în sistemele de operare, ca un interpretor, adică ca un
sistem care în momentul în care preia o instrucţiune sursă Basic, o transformă
imediat în instrucţiuni obiect(cod maşină) şi le execută. Pentru a îl face cât mai
accesibil, au existat variante de Basic care au implementat şi comenzi specifice
unui sistem de operare, ajungându-se până a se realiza calculatoare dedicate pentru
lucrul sub Basic, fără sisteme de operare. Evident, fiind conceput pe aceste
principii, aplicaţiile realizate nu erau performante, ele ne utilizând eficient
facilităţile unui sistem de calcul. Treptat, s-a trecut la realizare unor
implementări, tehnic mai performante, prin realizarea de compilatoare pentru Basic
sub diferite sisteme de operare, adică a unor module care transformă un fişier cu
instrucţiuni sursă Basic într-un fişier care conţine instrucţiuni direct
executabile, în cod obiect. Firma Microsoft, a realizat o versiune de Basic, numită
Visual Basic, care pe lângă principiile iniţiale s-a dorit a rezolva următoarea
problemă: • Un limbaj de programare universal, unic, care să poată fi folosit atât
în aplicaţiile de sistem(în locul limbajului C) cât şi în cele utilizator,
performant atât din punct de vedere a limbajului(implementând conceptele de
programare modulară, programare structurată şi programare la nivel de obiect) cât
şi din punct de vedere al utilizării tuturor facilităţilor sistemului de operare.
Astfel s-au creat, pe baza aceluiaşi nucleu de programare Basic, trei sisteme:
Microsoft Visual Basic, ca limbaj universal de programare; Visual Basic for
Application(Visual Basic pentru aplicaţii), prescurtat uzual VBA, ca un limbaj
complex pentru dezvoltarea aplicaţiilor în cadrul programelor din Microsoft Office.
Aceasta înseamnă că nucleul limbajului, componentele sale şi mediul sunt aceleaşi
în Access, Word sau Excel. VBA este aproape identic cu limbajul universal de
programare Microsoft Visual Basic; Visual Basic Script(VB Script), utilizat în
special pentru aplicaţiile Internet; I.1 Domeniul de folosire al VBA Aplicaţiile
mai simple din Access pot fi scrise fără a fi nevoie de vre-o instrucţiune,
eventual folosind comenzile macro. Deşi comenzile macro sunt foarte bune pentru
rezolvarea rapidă a unor prelucrări necesare pentru dezvoltarea majorităţii
aplicaţiilor de bază, realizarea unor aplicaţii complexe, profesioniste în Access
se face folosind limbajul VBA. Acest lucru se datorează faptului că, spre deosebire
de comenzile macro, Visual Basic for Application oferă posibilităţi de lucru
specifice limbajelor de nivel înalt de programare orientată pe obiecte. Câteva
dintre aceste posibilităţi sunt: • Tratarea erorilor prin proceduri speciale create
de proiectant. În timpul execuţiei unei aplicaţii pot interveni diverse erori(de
exemplu o împărţire la zero sau ieşirea din domeniul de definiţie al unei
variabile, etc.) pe care sistemul le tratează în general prin stoparea modulului
unde apar sau chiar a întregii aplicaţii. VBA oferă posibilitatea ca la apariţia
unei erori, controlul să fie dat unui modul de cod
Created by Serban Criscota Page 5 19 ianuarie 2001
VBA, realizat de proiectant care să rezolve în funcţie de context situaţia apărută,
fără a mai fi necesară stoparea modulului respectiv sau a aplicaţiei. • crearea
unor structuri ciclice pentru parcurgerea seturilor de înregistrări . Datele unei
tabele sau cereri de selecţie se pot manipula ca pe un fişier specific, numit set
de înregistrări. • execuţia proceselor tranzacţionale. Acestea reprezintă practic
posibilitatea de a efectua actualizările într-un set de înregistrări, global, la un
anumit moment. În cazul apariţiei unei erori se pot anula toate actualizările din
procesul respectiv, setul de înregistrări rămânând ne modificat. • apelarea
funcţiilor Windows API, prin care se pot folosi module ale sistemului de operare. •
crearea şi manipularea prin program a obiectelor necesare aplicaţiei • utilizarea
constantelor şi a variabilelor • crearea de clase de obiecte De asemenea VBA
uşurează scrierea bibliotecilor de funcţii reutilizabile, precum şi proiectarea şi
depanarea proceselor complexe de către programatori. În concluzie, deşi comenzile
macro pot da soluţii rapide problemelor simple, limitările lor determină
necesitatea folosirii limbajului VBA pentru dezvoltarea soluţiilor mai complexe.
I.1.1 Modulele de cod în Access Codul VBA este scris în unităţi numite rutine, care
pot fi subrutine(proceduri) sau funcţii. Aceste subrutine şi funcţii sunt păstrate
în obiecte numite module de cod, şi anume: Module specifice unui anumit formular
sau raport. Modulele specifice unui formular sau raport sunt în general numite
coduri din spatele formularelor (Code Behind Forms – CBF). Rutinele din acest loc
pot fi vizibile(cunoscute, apelabile) doar din modulul respectiv de cod. Codul din
spatele formularului sau raportului se poate accesa prin acţionarea pictogramei
specifice codului VBA (după selecţia obiectului respectiv) sau prin apăsarea celor
trei puncte (…) din dreptul unui eveniment al paginii respective a unui obiect
aparţinând formularului sau raportului respectiv *. Notă: * Dacă procedura
eveniment nu este creată, atunci automat un Wizard, va crea structura acesteia,
adică instrucţiunile de declarare şi sfârşit precum şi completarea listei de
parametrii dacă este cazul. Dacă procedura eveniment a fost creată anterior, atunci
se va afişa porţiunea din pagina de cod a formularului sau raportului care conţine
respectiva procedură. Modulele globale, se pot afişa prin acţionarea paginii
Module, din fereastra Database. Foarte important este faptul că rutinele scrise în
această zonă pot fi vizibile (dacă sunt declarate Public) nu numai din toate
modulele de cod ale aplicaţiei, dar chiar din obiecte ale aplicaţiei, din
formulare, rapoarte, cereri sau tabele. Exemplu. De exemplu dacă în modulul global
se găseşte o funcţie declarată public, cu numele 'Prag', aceasta va putea fi
folosită în expresii din orice: modul general sau din spatele unui formular sau
raport; controale calculate din formulare sau rapoarte; proprietăţi ale
controalelor sau ale tabelelor(de exemplu Validation Rule, Default Value);
criterii din cereri; câmpuri calculate din cereri; practic de oriunde este
acceptată o expresie. Orice modul de cod, este format din două părţi: • În prima
parte se introduc declaraţiile generale ale modulului, valabile în întreg modulul.
Acestea sunt: Opţiunile modulului. De exemplu: Option Explicit, care forţează
declararea tuturor variabilelor folosite în modul.
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 acţiune: la apariţia unui
eveniment al unui obiect al aplicaţiei ori la apelarea(lansarea) ei dintr-o altă
rutină VBA. O funcţie este un tip special de rutină, datorită faptului că poate
întoarce o valoare, chiar în numele ei. Deci codul VBA poate fi găsit în rapoarte,
formulare şi module de cod. În formulare şi rapoarte, codul VBA poate fi plasat în
funcţiile definite de utilizator, în subrutine, ca şi în procedurile eveniment, pe
când în modulele generale codul VBA este plasat numai în rutine(funcţii sau
proceduri) definite de utilizatori. De fapt, pentru a construi cu succes rutine în
cod VBA, sunt foarte importante două lucruri: • cum se stabileşte 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 sfârşit, care rezolvă paşii unui
algoritm. Codul VBA este practic format din rutine, care sunt executate numai
atunci când se produc anumite evenimente. Deci codul VBA implică realizarea unui
programări discontinue. I.2 Elementele generale ale limbajului Visual Basic
Definirea unui limbaj de programare, se face în general prin configurarea
următoarelor elemente de bază: ♦ ♦ ♦ ♦ Tipuri de date, Variabile; Constante;
Instrucţiuni Instrucţiunea de atribuire; Structuri de control; ♦
Rutine(proceduri şi funcţii) ♦ Biblioteci; Dacă limbajul de programare este
orientat la nivel de obiect, aşa 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 (instanţe ale claselor de
obiecte); ♦ Crearea şi manipularea colecţiilor de obiecte Limbajele de programare
dezvoltate mai pun la dispoziţie programatorilor: ♦ Proceduri specifice de tratare
ale erorilor; ♦ Modalităţi de verificare şi depanare a erorilor de programare; ♦
Proceduri de import/export de obiecte exterioare aplicaţiei; ♦ Interacţiunea cu
sistemul de operare. ♦ Manipularea datelor organizate în fişiere sau baze de date.
Page 7
19 ianuarie 2001
I.2.1 Tipuri de date. Prin dată se înţelege orice entitate asupra căreia poate
opera calculatorul. În cod maşină datele se reprezintă sub forma unei secvenţe de
cifre binare. În cazul limbajelor de nivel înalt se face abstracţie de detaliile de
reprezentare a datelor, dezvoltând conceptul de tip de date. În memoria
calculatorului orice dată apare ca o succesiune de biţi. Modul în care pentru o
astfel de succesiune se asociază o valoare depinde de interpretarea ce i se dă. La
nivelul limbajelor de programare o astfel de interpretare este reprezentată de
tipul datelor. Un tip de date este noţiunea folosită pentru a defini mulţimea
valorilor pe care le pot avea datele ce aparţin acestui tip, dimensiunea efectiva
pe care o ocupă în memorie datele, precum şi operaţiile ce se pot efectua asupra
acestor date. Orice limbaj de programare pune la dispoziţia programatorului câteva
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ă) ------------------
Valoarea iniţială 0 0 0 0
♦ Datele numerice reale se exprimă sub forma: Numele tipului de date Single
(precizie simplă) Double (precizie dublă) -----------------Spaţiul de memorare 4
octet 8 octeţi
+/-M * 10^+/-E
Domeniu Exponent(E) E-45…E38 E-324…E308 Valoarea iniţială 0 0 Ex. de nume variabilă
sngValue dValue
• •
Există două tipuri de date de tip String şi anume: String de lungime variabilă,
care poate conţine până la aproximativ 2 milioane caractere (2^31). String de
lungime fixă, care poate conţine până 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 (0–127) corespund literelor şi simbolurilor de pe o tastatură US, adică
codului ASCII. Dintre acestea primele 32 sunt caractere netipăribile, dar care pot
avea efect în afişarea datelor. De exemplu: caracterul cu codul 13, CR - retur de
car, care produce trecerea la început de rând caracterul cu codul 10, LF - rând
nou, care produce trecerea rândul următor caracterul cu codul 7, Bell - semnal
sonor caracterul cu codul 8, Back Space - înapoi caracterul cu codul 9, Tab -
salt la următorul 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 · -----------------Următoarele 128
caractere (128–255) corespund caracterelor speciale, diacriticelor, accente,
simboluri valutare, litere în alfabete internaţionale etc. Literalii string se
scriu între ghilimele("…."). La iniţializare variabilele de tip string, vor avea
valoarea şir vid, adică "". Operatorul pentru concatenarea datelor este & (se poate
folosi şi semnul + )La formarea numelor variabilelor de tip string, se foloseşte de
obicei prefixul s. De exemplu sNume. Notă: Deşi ne-am aştepta ca un caracter să
ocupe un octet(8 bits) de memorie(fiind 256=2^8 caractere în codul ANSI), totuşi
spaţiul ocupat de un caracter în memorie este de 2 octeţi. 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), deşi în memorie ele sunt în codul UNICODE.
------------------
Page 9
19 ianuarie 2001
I.2.1.5 Tipul de date DATE - data calendaristică şi timpul
Numele Spaţiul 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#. Afişarea datelor şi timpului se face
conform formatului specificat în Windows. Notă: Un număr poate fi convertit în tip
Date, partea din stânga punctului zecimal reprezentând data, iar cea din stânga
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 foloseşte de obicei prefixul dt. De exemplu dtStop.
-----------------Visual Basic include mecanismele necesare construirii unor tipuri
noi, prin restrângeri sau combinări ale tipurilor deja definite. Aceste mecanisme
poartă numele de constructori de tipuri şi joacă un rol esenţial în programare.
I.2.1.6 Tipul de date ARRAY - tablou
Un Tablou - Array, defineşte o mulţime de valori care sunt de acelaşi tip de dată.
Un Array, deşi reprezintă o singură variabilă poate stoca mai multe date de acelaşi
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: Numărul de dimensiuni. Numărul de
elemente(celule) al fiecărei dimensiuni. Practic numărul de ordine al
primului(implicit 0) şi al ultimului element al fiecărei 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 bineînţeles o singură variabilă de tip
Array, cu 365 elemente de tip numeric, decât 365 variabile individuale. Fiecare
element din tablou va conţine o singură valoare. Implicit un tablou se indexează de
la 0. Declararea variabilei se va face: Dim cCheltuieli(364) As Currency Pentru a
introduce în primele 100 de zile valoarea 22 vom folosi următoarea procedură: Sub
ExempluArray() Dim cCheltuieli (364) As Currency Dim intI As Integer For intI = 0
to 99 cCheltuieli (intI) = 22 Next End Sub ------------------
Page 10
19 ianuarie 2001
I.2.1.7 TYPE - Crearea tipurilor de date definite de utilizator.
[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 decât 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 Deşi uşurează munca de programare, totuşi folosirea variabilelor de tip
variant, diminuează performanţele programului, atât ca memorie ocupată cât şi ca
timp de execuţie.
Page 11
19 ianuarie 2001
Numele tipului de date Variant (numere) Variant (string) ------------------
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ă îniţializată. 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
Declararea variabilelor
Forma acestei
Anumite variabilele mai pot fi create automat de un anumit tip, folosindu-se în loc
de specificaţia As, anumite caractere speciale, denumite caractere de tip, la
sfârşitul numelui variabilei, în declaraţia Dim. Astfel: Tipul de date Caracterele
de tip Integer Long Currency Single Double String Variant
&
implicit
Acest tip de declaraţii este importat din variantele mai vechi de Basic, dar nu
este recomandabil. Exemplu. Următoarele declaraţii 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 (Opţiune de explicitare)
•
Funcţie de locul de declarare, variabilele pot fi: Locale - variabile declarate
în interiorul rutinei, vizibile(domeniul de valabilitate) numai în interiorul
acesteia.
Page 13
19 ianuarie 2001
Globale(nivel modul) - variabile declarate în secţia de declaraţii 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ă declaraţie se face într-o rutină, atunci ea va
putea fi folosită numai în aceasta. Dacă declararea ei se face în secţiunea de
declaraţii 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 secţiunea 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ă aparţinând modulului în care au fost
declarate.. Valoarea variabilei poate fi schimbată de orice subrutină sau funcţie
din modulul respective. De exemplu, următoarea subrutină schimbă valoarea
variabilei de nivel modul miCounter la 20. Reţineţi convenţia 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ă folosiţi declaraţii
de nivel modul numai pentru variabilele care trebuie să fie văzute de mai multe
rutine. Ar trebui să încercaţi să declaraţi majoritatea variabilelor dumneavoastră
de tip local. Această metodă face codul dumneavoastră mai modular şi mai uşor de
depanat. Private Sub cmdModule_Click() miCounter = 20 MsgBox miCounter End Sub
-----------------I.2.2.5 Variabile Publice şi Private.
Se poate folosi cuvântul cheie STATIC, în loc de cuvântul cheie DIM, pentru a
declara variabile statice în rutine, adică variabile care au proprietatea de aşi
reţine valoarea între două chemări ale respectivei rutine, Exemplul următor
ilustrează diferenţa dintre variabilele locale şi cele statice. Variabilele locale
sunt iniţializate la fiecare apel al codului. De fiecare dată când lansaţi în
execuţie această procedură, se va afişa numărul 1. Private Sub cmdLocal_Click ()
Dim iCounter As Integer iCounter = iCounter + 1 MsgBox iCounter End Sub De fiecare
dată când acest cod este executat, instrucţiunea declarativă Dim reiniţializează
variabila iCounter. Este puţin diferită faţă de următoarea 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ă
când acest cod este executat, variabila cu numele iCounter este incrementată şi
reţinută. -----------------I.2.2.7 Domeniul şi durata de valabilitate a
variabilelor
Page 16
19 ianuarie 2001
Notă: Cu instrucţiunea executabilă ReDim (cu o structură asemănătoare cu cea a lui
Dim), care se poate plasa oriunde în cod după declararea unui tablou dinamic, se va
redimensiona în momentul execuţiei acesteia tabloul cu noile dimensiuni, eventual
putându-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 redimensionăm. Pentru a se evita acest lucru se poate folosi
clauza Preserve. Folosirea acestei clauze nu permite modificarea numărului de
dimensiuni sau a marginii de jos ai indecşilor. Exemplu. ReDim Preserve sngArray
(UBound(sngArray) + 10) - va redimensiona tabloul, mărind cu 10 numărul lui de
elemente şi va păstra datele ce erau în tablou înainte de executarea instrucţiunii.
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. '
afişează 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 octeţi Un tablou de octeţi 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 octeţi se poate referi şi direct,
numai prin numele lui, fără indici. În felul acesta în el se poate muta direct un
string. Trebuie remarcat că în această operaţie fiecare caracter este codificat pe
2 octeţi în UNICODE, deci va ocupa 2 elemente din string. Exemplu. Pentru
înţelegerea acestei secvenţe trebuie studiat mai întâi, în capitolul despre
funcţiile text, precizările făcute pentru codul UNICODE. Public Sub TestMatOcteti()
Dim Caracter As String, Sir As String * 3 Dim X() As Byte ' Tablou de octeţi, va
avea 6 elemente deoarece pentru 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 numărul 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” – poziţia î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 afişează cu Debug.Print se poate vizualiza prin comanda View | Debug
Window MsgBox "Caracterul = " & Caracter & "; CodUnicode= " & AscW(Caracter) & _ ";
CodAnsii= " & aSc(Caracter) & "; Octetul 1= " & X(k) & "; Octetul 2= " & X(k + 1)
Next I For i = 0 To 5 Debug.Print "Octetul " & i & " = " & X(i) MsgBox "Octetul " &
i & " = " & X(i) Next i End Sub ‘-------------------După execuţie se va găsi afişat
î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 -----------------Explicaţie. În memoria internă, dacă o variabilă nestructurată
ocupă mai mulţi octeţi(de exemplu o variabilă integer ocupă 2 octeţi), atunci cel
mai semnificativ dintre aceştia se găseşte la dreapta. Deci dacă într-o variabilă
integer se găseşte valoarea:
266(zecimal)=0000.0001.0000.1010(binar)=01.0A(hexazecimal) atunci aceasta se va
găsi în memorie: (0000.1010)(0000.0001) - deci cu octetul cel mai
semnificativ(0000.0001) aşezat la dreapta. Din tabelul de mai jos, se observă cum
se găseşte în memoria internă, într-o variabilă de tip tablou de octeţi, datele
dintr-un string.
Caracterele din string Cod ANSI(1 octet/caracter) - zecimal Cod UNICODE(2
octeţi/caracter) -zecimal Memorie -Tabloul X (6 octeţi) - binar Memorie -Tabloul X
(6 octeţi) - hexa Memorie -Tabloul X (6 octeţi) - zecimal
‘1’ 49 49
0011.0001 0000.0000
‘A’ 65 65
0100.0001 0000.0000
31 49
00 0
41 65
00 0
5E 94
01 1
Page 18
19 ianuarie 2001
I.2.3 Constante Prin declararea unei constante, se poate atribui unui nume, o
valoare. Aceasta se face prin instrucţiunea declarativă Const. După declarare, o
constantă nu îşi mai poate modifica valoarea. Forma acestei instrucţiuni este:
NumeVariabilă = Expresie
Acţiunea acestei instrucţiuni constă în calcularea expresiei (din dreapta semnului
=) şi depunerea rezultatului în variabila (din dreapta semnului =). Pentru a se
executa cu succes instrucţiunea, este necesar ca rezultatul expresei să aparţină
unui tip de date compatibil cu cel al variabilei. În caz contrar se va produce o
eroare de execuţie(pe care le vom trata în alt modul). Totuşi compilatorul încearcă
trecerea peste anumite incompatibilităţi, a căror rezolvare este evidentă,
efectuând 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
execuţie.Transforma constanta numerică 291 în stringul "291" Vnr = Vstr ' nu
produce o eroare de execuţie. Transforma stringul "291" în constanta numerică 291
Vstr = Vnr + "ABC" ' va produce eroare de execuţie- TYPE MISMATCH. Nu se poate
efectua adunarea. Vstr = Vnr & "ABC" ' nu produce eroare. Vnr = "ABC" ' va produce
eroare de execuţie- TYPE MISMATCH End Sub I.2.4.1.1 Formarea expresiilor în Visual
Basic. O expresie este formată din termeni, asupra cărora se efectuează anumite
operaţii. O expresie al cărei evaluare este o valoare logică(True sau False) se mai
numeşte condiţie. Termenii pot fi : variabile, constante, literali(valori date
direct) sau funcţii(proprii sau din biblioteci) Operatorii sunt de trei tipuri
• •
Page 20
19 ianuarie 2001
♦ Operatorii aritmetici, care acţionând asupra unor termeni scalari(numere,
stringuri, date calendaristice, etc.) vor determina tot un rezultat de aceiaşi
natură(scalar).
/
Împărţire reală 5/2=2.5
\
Împărţire întreagă 10\3=3
Mod
Restul împărţirii 10 Mod 3=1
+
Adunare 5+2=7
Scăder e 5-2=3
&
Concatenare şiruri. "Ab"&2="Ab2"
<
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
apartenenţa la o mulţime (5 Is [1,2,3]) = False
Like
compară două stringuri, dar ţine cont de caracterele generice(*,?,#) din al doilea
string ("ARAD" Like "AR*") = True
Op
NOTTrueFalse
FalseTrue
Mai există două funcţii logice, mai puţin folosite, şi anume: Op 1 Op 2 XOR EQV -
utilizată pentru verificarea echivalenţei True True False logice a două expresii
IMP - utilizată pentru verificarea implicării True False True logică între două
expresii False True True -----------------Notă: Operatorii sunt aşezaţi de la
stânga la dreapta în False False False ordinea priorităţii lor în execuţie, care
este în general cea obişnuită din matematică. Parantezele rotunde sunt folosite
pentru stabilirea unei ordini explicite a priorităţii în execuţie a operaţiilor.
Created by Serban Criscota Page 21 19 ianuarie 2001
Observaţia 1. Aşa cum am mai arătat, dacă un termen al unei expresii este NULL,
atunci şi rezultatul expresiei este tot NULL. Spunem că NULL-ul se propagă în
expresii. Totuşi există o excepţie, şi anume la operatorul de concatenare a
şirurilor, &: Dacă un termen este NULL, iar celălalt nu este NULL, atunci
rezultatul va fi chiar termenul diferit de NULL. Observaţia 2. Valoarea EMPTY, în
expresii este considerată, funcţie de tipul de date pe care îl reprezintă, chiar
valoarea cu care se iniţializează variabilele de tipul respectiv(astfel în expresii
dacă un termen numeric este EMPTY atunci se va considera =0; dacă este logice
=False; dacă este string = şir vid; etc.)
I.2.4.2 Structurile de control
Aşa cum am mai arătat, structurile de control stabilesc ordinea în care se execută
instrucţiunile. Există trei structuri de control, şi anume: structura secvenţială,
structura alternativă(decizională) şi structura repetitivă(în buclă, în ciclu)
I.2.4.2.1 Structura secvenţială Reprezintă execuţia secvenţială a instrucţiunilor,
în ordinea în care au fost scrise. -----------------I.2.4.2.2 Structura alternativă
Reprezintă execuţia unui anumit grup de instrucţiuni sau a altuia, funcţie de
evaluarea unor condiţii. I.2.4.2.2.1 Structura alternativă simplă. Instrucţiunea:
Select Case NumeVariabilă Case Valoare1 Grup 1 de instrucţiuni [Case Valoare2 Grup
2 de instrucţiuni] [Case ValoareX Grup X de instrucţiuni] ……………………… [Case Else Grup
else de instrucţiuni] End Select
Această instrucţiune evaluează mai multe condiţii formate prin verificarea
egalităţii între valoarea variabilei ataşate instrucţiunii (NumeVariabilă), şi
valorile din dreptul cuvintelor cheie CASE (ValoareI). Deci: Condiţia I va fi:
NumeVariabilă= ValoareI Dacă o condiţie este advărată atunci se va executa grupul
corespunzător de instrucţiuni. Dacă toate condiţiile sunt false atunci se vor
executa - dacă există - instrucţiunile dintre Else …. End Select (Grup else de
instrucţiuni) Observaţia 1. Dacă mai multe condiţii sunt adevărate, atunci se vor
executa toate grupurile corespunzătoare de instrucţiuni. Deci instrucţiunea Select
Case nu se opreşte la întâlnirea primei condiţii adevărate, ci va evalua toate
condiţiile. Observaţia 2. În ValoareX se pot folosi reuniuni de mulţimi (operator
virgula - ex: 1,2,5) intervale (operator TO - ex: 1 To 7), sau submulţimi(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) 'Funcţia
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 instrucţiune If pentru a evalua dacă txtValue este nul. În acest caz,
procedură memorează un zero într-o variabilă numită iResponse. În caz contrar,
valoarea conţinută în txtValue este memorată în iResponse. Instrucţiunea Case
evaluează conţinutul variabilei iResponse. Dacă valoarea este 0, este afişată o
casetă de text cu mesajul „Trebuie să introduceţi un număr”. Dacă valoarea este
între 1 şi 5 inclusiv, este afişată o casetă de text conţinând mesajul „Aţi
introdus o valoare între 1 şi 5”. Dacă utilizatorul introduce 7, 11 sau 21, este
afişat un mesaj corespunzător. În celelalte cazuri, utilizatorul primeşte un mesaj
care indică introducerea unui număr incorect. Instrucţiunea If ... Then ... ElseIF
…Else
până când(Until) o condiţie devine TRUE Există două forme ale instrucţiunii Do:
------------------
Do SAU [grup instrucţiuni] [Exit Do] [grup instrucţiuni] Loop [{While | Until}
conditie]
Observaţia 1. Instrucţiunea Exit Do, provoacă ieşirea forţată din ciclu. De obicei
se execută funcţie de evaluarea unei condiţii într-o instrucţiune IF. Observaţia 2.
Condiţia este evaluată funcţie de locul unde este plasată în instrucţiune şi anume:
la prima formă a instrucţiunii(cea din stânga) - înaintea executării ciclului sau
la a doua formă a instrucţiunii(cea din dreapta) - după executarea ciclului
Observaţia 3. Ciclul se execută minim de la prima formă a instrucţiunii(cea din
stânga) - se poate ca ciclul să nu se execute de loc la a doua formă a
instrucţiunii(cea din dreapta) - ciclul se va executa minim o dată. Notă: O
condiţie cu rezultatul NULL este tratată ca şi cum ar fi FALSE Exemplu. Private Sub
cmdLoop1_Click() Dim iCounter As Integer iCounter = 1 Do While iCounter < 5 MsgBox
iCounter ICounter = iCounter + 1 Loop End Sub -----------------Procedura va afişa 4
mesaje, cu numere de la 1 la 4. Această structură nu asigură întotdeauna executarea
secvenţei de cod din interiorul buclei. Dacă iCounter este iniţializat cu o valoare
mai mare sau egală cu 5, codul din interiorul buclei nu va fi executat niciodată.
Dacă doriţi ca secvenţa de cod să fie executată necondiţionat cel puţin o dată, va
trebui să folosiţi următoarea 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 afişa 1 mesaj, cu numărul
1.
Created by Serban Criscota Page 25 19 ianuarie 2001
Acest cod va fi executat cel puţin o dată, chiar dacă iCounter are valoarea 5.
Structura Do While ... Loop face evaluarea înainte de executarea codului şi de
aceea nu asigură execuţia codului din interiorul buclei. Structura Do ... Loop
While face evaluarea la sfârşitul buclei şi de aceea execuţia codului este
asigurată. -----------------I.2.4.2.3.2 Structura repetitivă cu contor.
Instrucţiunea FOR...NEXT Repetă un ciclu de un anumit număr de ori. Notă: Mai
există o structură: FOR EACH...NEXT, care se aplică colecţiilor de obiecte sau
tablourilor. Acesta permite parcurgerea automată a tuturor elementelor unei
colecţii sau tablou. Se va prezenta ulterior în modulul referitor la programarea
orientată pe obiecte.
For contor = start To end [Step pas] [grup instrucţiuni] [Exit For] [grup
instrucţiuni] Next [contor]
-----------------• contor - Variabilă numerică folosită pentru stabilirea numărului
de execuţii ale ciclului. • start - Valoarea iniţială a contorului • end - Valoarea
finală a contorului • pas - Valoarea de incrementare a controlului după execuţia
fiecărui ciclu (implicit este 1) Explicaţie. Se începe prin executarea ciclului.
După aceasta va avea loc adunarea pasului la contor. Acum se va evalua următoarea
condiţie, funcţie de semnul(+/-) pe care îl are pasul şi anume Dacă PAS >=0,
condiţia va fi: contor <= end Dacă PAS < 0, condiţia va fi: contor >= end Dacă
condiţia este TRUE, atunci se va repeta ciclul, iar dacă condiţia este FALSE, se va
termina instrucţiunea FOR, programul continuând cu instrucţiunile de după NEXT.
Deci, practic dacă pasul, este : pozitiv, atunci contorul va parcurge la fiecare
ciclu, crescător (prin adăugarea valorii pasului), toate valorile dintre start şi
end (start < end) negativ, atunci contorul va parcurge la fiecare ciclu,
descrescător (prin scăderea valorii absolute a pasului), toate valorile dintre
start şi end (start > end) Observaţia 1. Instrucţiunea Exit For, provoacă ieşirea
forţată din ciclu şi continuarea programului cu instrucţiunile de după NEXT. De
obicei se execută funcţie de evaluarea unei condiţii întro instrucţiune IF.
Observaţia 2. Sunt admise imbricări ale structurilor For, dacă sunt folosite
variabile contor diferite ca în exemplul următor: For I = 1 To 10 For J = 1 To 10
For K = 1 To 10 ... Next K Next J Next I -----------------Created by Serban
Criscota Page 26 19 ianuarie 2001
Observaţia 3. Într-un For, trebuie evitată schimbarea valorii contorului.
Observaţia 4. Structura For ... Next este folosită atunci când sunt un număr exact
de iteraţii de executat. Exemplu. Private Sub cmdForNext_Click() Dim iCounter As
Integer For iCounter = 1 To 5 MsgBox iCounter Next iCounter End Sub
-----------------Procedura va afişa 5 mesaje, cu numere de la 1 la 5 Observaţi că
iCounter se auto-incrementează. Atât valoarea de start, cât şi cea de sfârşit 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 afişa 5 mesaje, cu numere de la 5 la 1 -----------------I.2.5 Rutine -
proceduri şi funcţii.
I.2.5.1 Ce este o rutină? Elementele care definesc o rutină.
Rutina este o structură de sine stătătoare, asemănătoare unui program, prin care se
execută o anumită acţiune. Ea este executată numai atunci când este lansată,
apelată de către un obiect al aplicaţiei. Rutina poate fi apelată de un număr
nelimitat de ori din diferite locuri(obiecte). Toate declaraţiile(variabile,
constante) făcute î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 cât rutina se află în execuţie, la terminarea rutinei, având loc
automat şi eliberarea din memorie a tuturor variabilelor şi constantelor locale ale
acesteia. Notă: În Visual Basic nu sunt permise imbricări de rutine. Deci într-o
rutină nu se poate declara o altă rutină. Diferit faţă de programe, rutina inter-
acţionează cu obiectul care a provocat lansarea(apelarea) ei, prin transferarea de
date din şi înspre acesta. Acest lucru se realizează în două moduri şi anume:
Prin lista de parametrii. Aceasta reprezintă practic nişte variabile, prin
intermediul cărora se face: ♦ în momentul apelării rutinei, un transfer de date de
la modulul care apelează - parametrii de intrare. ♦ în momentul terminării rutinei
şi preluării controlului de modulul apelant, un transfer de date de la rutină
înspre modulul apelant - parametrii de ieşire. 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.
Observaţia 1. Definirea unei rutine se face prin atribuirea unui nume(obligatoriu)
acesteia şi prin stabilirea listei de parametrii(opţional). Parametrii definiţi în
rutină se numesc parametrii formali.
Created by Serban Criscota Page 27 19 ianuarie 2001
Observaţia 2. Declararea parametrilor formali se face după regulile aplicate la
declararea variabilelor. Observaţia 3. Apelarea unei rutine se face prin numele ei.
Observaţia 4. În momentul apelării, trebuie să se realizeze o corespondenţă între
nişte date(variabile, constante, literali) ale modulului apelant cu parametrii
formali ai rutinei. Aceasta se face prin stabilirea unei liste de parametrii
actuali, declaraţi în momentul apelării. Evident parametrii actuali şi formali
trebuie să fie de acelaşi tip şi să ocupe acelaşi loc în cele două liste.
Observaţia 5. Parametrii de intrare ai rutinei pot fi în lista parametrilor
actuali: variabile, constante, literali sau expresii. Observaţia 6. Parametrii de
ieşire ai rutinei pot fi în lista parametrilor actuali numai variabile, deoarece
aceştia prin definiţie îşi pot schimba valoarea în timpul execuţiei rutinei.
I.2.5.1.1 Transmiterea datelor prin parametrii Există două modalităţi de
transmitere a datelor prin parametrii şi anume prin valoare sau prin
adresă(referinţă).
X1,X2 Y
A1,A2 B1
M1,M2 T
A1,A2 B1
Rutina Nume: Rtest Parametrii formali: Intrare: A1, A2 Ieşire: B1 Instr1 ……….. ..=
A1 + A2 ' folosirea 'parametrilor de intrare ……….. B1= …… ' folosirea 'parametrilor
de ieşire ……….. Sfârşit 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 observăm că la apelarea
rutinei se face practic pentru fiecare pereche de parametrii operaţia de transfer:
ParametruFormal=ParametruActual (de ex: A1=X1 sau A2=X2 etc.), iar la terminarea
rutinei transferul invers: ParametruActual=ParametruFormal (de ex: T=B1 sau Y=B1
etc.). Deci avem de a face cu transferarea unei valori între parametrii formali şi
cei actuali. Spunem că facem transmiterea prin valoare a parametrilor.
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 Ieşire: B1 Instr1 ……….. ..=
A1 + A2 ' folosirea 'parametrilor de intrare ……….. B1= …… ' folosirea 'parametrilor
de ieşire ……….. Sfârşit rutină
NumeProcedură ListaParametrilorActuali
Notă: Parametrii se separă prin virgulă. Observaţia 1. Diferenţa între cele două
apeluri este că la apelarea cu Call, parametrii actuali ai procedurii trebuie
scrişi între paranteze, pe când la apelarea directă prin numele procedurii, este
obligatoriu să nu se folosească paranteze. I.2.5.3.2 Apelarea unei funcţii. O
funcţie se apelează în partea dreapta a unei expresie, folosindu-se numele ei urmat
de lista parametrilor actuali incluşi între paranteze. Numele funcţiei, se va
comporta în expresie ca o variabilă, încărcată în timpul execuţiei funcţiei cu o
valoare, ca şi cum ar fi un parametru de ieşire al unei proceduri. Spunem că
funcţia întoarce(returează) o valoare după execuţia ei. Această valoare va
participa la evaluarea expresiei respective. Observaţia 1. O procedură nu poate fi
folosită în locul unei funcţii într-o expresie, deoarece nu returează valori (chiar
dacă are parametrii de ieşire) Observaţia 2. Funcţiile pot fi apelate şi ca pe o
procedură în oricare din cele două modalităţi prezentate. Exemplu. Refacem exemplul
prezentat înainte folosind o procedura TestS în locul funcţiei TestF Sub
TestS(Numar1 As Integer, Numar2 As Integer, Rezultat As Integer) If Numar1 > Numar2
then Rezultat = Numar1 - Numar2 ' valoarea calculată se introduce în parametru de
ieşire Else Rezultat = Numar1 + Numar2 ' valoarea calculată se introduce în
parametru de ieşire End If End Sub …….Se va folosi această procedură astfel…. Dim
Rez As Integer Call TestS(20, 5, Rez) ' calculează în Rez MsgBox Rez ' afişează 15
TestS 2, 5, Rez ' calculează în Rez MsgBox Rez ' afişează 7 ------------------
Page 31
19 ianuarie 2001
I.2.5.4 Domeniul de valabilitate(vizibilitatea) al rutinelor.
Procedurile evenimentelor sunt apelate automat când are loc un eveniment pentru un
obiect. De exemplu, când un utilizator execută clic pe un buton de comandă, este
executat codul evenimentului Click pentru acel buton de comandă. Procedurile
evenimentelor sunt create automat când scrieţi codul evenimentului pentru un
control. De exemplu, rutina: Private Sub cmdOkay_Click este creată atunci când
plasaţi instrucţiuni 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
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 -----------------Explicaţie. Pentru a edita codul unui
eveniment , executaţi paşii următori: Executaţi click pe control(cmdOkay) în modul
de afişare Design şi apoi pe butonul Properties din bara cu instrumente sau
executaţi click cu butonul drept al mouse-ului pe obiect şi selectaţi opţiunea
Properties din meniul contextual. Executaţi click pe marcajul de tabulare al
proprietăţilor evenimentului (Event). Selectaţi proprietatea pentru care doriţi să
scrieţi instrucţiuni de cod (de exemplu, evenimentul On Click). Selectaţi [Event
Procedure] din lista derulantă. Executaţi clic pe butonul (…). Cursorul
dumneavoastră va fi plasat în codul evenimentului pentru obiectul respectiv.
Automat sistemul va crea instrucţiunea de declarare a procedurii, eventual cu lista
de parametrii formali . daca este cazul - şi instrucţiunea de sfârşit a procedurii.
Proiectantul va introduce acum codul VBA necesar tratării evenimentului.
-----------------I.2.5.7 Utilizarea combinată a rutinelor utilizator şi a
procedurilor
I.2.6.1.1
I n t ( n u m ă r ) ; F i x ( n u m ăr )
-1
0
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(număr) Întoarce o valoare de tip Double care
reprezintă e (baza logaritmului natural) ridicat la o putere. Exemplu. Dim MyAngle,
MyHSin ' Defineşte unghiul în radiani. MyAngle = 1.3 ' Calculează sinusul
hiperbolic. MyHSin = (Exp(MyAngle) - Exp(-1 * MyAngle)) / 2
-----------------I.2.6.1.6 Log(număr) Întoarce o valoare de tip Double care
reprezintă logaritmul natural al unui număr (>0). Logaritmul natural este
logaritmul în baza e. Constanta e este aproximativ 2.718282. Exemplu. Dim MyAngle,
MyLog ' Defineşte unghiul în radiani. MyAngle = 1.3 ' Calculează inversul sinusului
hiperbolic. MyLog = Log(MyAngle + Sqr(MyAngle * MyAngle + 1))
-----------------I.2.6.1.7 Rnd[(număr)] Întoarce o valoare de tip Single(virgulă
mobilă simplă precizie) care va conţine un număr aleator. Argumentul(parametrul)
este opţional şi poate fi un Single sau o expresie numerică corectă. Valoarea
întoarsă de Rnd Dacă parametrul este Rnd generează
<0 Acelaşi număr de fiecare dată, folosind numărul ca valoare de iniţializare. >0
Următorul număr din secvenţă. =0 Cel mai recent număr generat. Fără (de obicei)
Următorul număr din secvenţă. -----------------Funcţia Rnd întoarce o valoare în
intervalul [0..1) Valoarea parametrului determină cum Rnd generează un număr
aleator. Pentru orice valoare iniţială, aceiaşi secvenţă de numere este generată
din cauza faptului că fiecare apel succesiv al funcţiei Rnd, foloseşte numărul
generat anterior ca valoare pentru calculul următorului număr din secvenţă.
Created by Serban Criscota Page 38 19 ianuarie 2001
Înainte de prima folosire a funcţiei Rnd, dacă se doreşte generarea unei secvenţe
de numere aleatoare, atunci generatorul de numere aleatoare trebuie iniţializat cu
o valoare întâmplătoare. Pentru aceasta se va folosi procedura Randomize, fără
parametrii, care va folosi pentru iniţializarea generatorului de numere aleatoare,
ceasul sistemului de calcul. Notă: Dacă se doreşte generarea unor numere întregi,
în intervalul [a.. b], se foloseşte 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(număr) Î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 înmulţesc gradele cu pi/180.
Invers se vor înmulţi radianii cu 180/pi. Exemplu. Dim MyAngle, MyCosecant MyAngle
= 1.3 ' Defineşte unghiul în radiani. MyCosecant = 1 / Sin(MyAngle) ' Calculează
cosecanta. -----------------I.2.6.1.9 Cos(număr) Întoarce o valoare de tip Double
care reprezintă cosinusul unui unghi în radiani Exemplu. Dim MyAngle, MySecant
MyAngle = 1.3 ' Defineşte unghiul în radiani. MySecant = 1 / Cos(MyAngle) '
Calculează secanta. -----------------I.2.6.1.10 Tan(număr) Întoarce o valoare de
tip Double care reprezintă tangenta unui unghi în radiani Pentru a transforma
gradele în radiani se înmulţesc gradele cu pi/180. Invers se vor înmulţi radianii
cu 180/pi. Exemplu. Dim MyAngle, MyCotangent MyAngle = 1.3 ' Defineşte unghiul în
radiani MyCotangent = 1 / Tan(MyAngle) ' Calculează cotangenta
-----------------I.2.6.1.11 Atn(număr) Întoarce o valoare de tip Double care
reprezintă arctangenta unui număr. 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 funcţiilor matematice derivate Secant Cosecant
Cotangent Inverse Sine Inverse Cosine Inverse Secant Inverse Cosecant Inverse
Cotangent Hyperbolic Sine Hyperbolic Cosine Hyperbolic Tangent Hyperbolic Secant
Hyperbolic Cosecant Hyperbolic Cotangent Inverse Hyperbolic Sine Inverse Hyperbolic
Cosine Inverse Hyperbolic Tangent Inverse Hyperbolic Secant Inverse Hyperbolic
Cosecant Inverse Hyperbolic Cotangent Logarithm to base N -----------------Sec(X) =
1 / Cos(X) Cosec(X) = 1 / Sin(X) Cotan(X) = 1 / Tan(X) Arcsin(X) = Atn(X / Sqr(-X *
X + 1)) Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) Arcsec(X) = Atn(X /
Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1)) Arccosec(X) = Atn(X / Sqr(X * X - 1))
+ (Sgn(X) – 1) * (2 * Atn(1)) Arccotan(X) = Atn(X) + 2 * Atn(1) HSin(X) = (Exp(X) –
Exp(-X)) / 2 HCos(X) = (Exp(X) + Exp(-X)) / 2 HTan(X) = (Exp(X) – Exp(-X)) /
(Exp(X) + Exp(-X)) HSec(X) = 2 / (Exp(X) + Exp(-X)) HCosec(X) = 2 / (Exp(X) – Exp(-
X)) HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) – Exp(-X)) HArcsin(X) = Log(X + Sqr(X
* X + 1)) HArccos(X) = Log(X + Sqr(X * X – 1)) HArctan(X) = Log((1 + X) / (1 –
X)) / 2 HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X) HArccosec(X) = Log((Sgn(X) *
Sqr(X * X + 1) + 1) / X) HArccotan(X) = Log((X + 1) / (X – 1)) / 2 LogN(X) = Log(X)
/ Log(N)
Funcţia ChrW - Întoarce un string care conţine caracterul al cărui cod este
introdus în argument în standardul UNICODE. Notă: Aceste funcţii au efect numai pe
platformele care acceptă codul UNICODE. Dacă acesta nu este acceptat, atunci ele se
comportă la fel ca funcţiile Asc respectiv Chr. Exemplu. Public Sub TestUnicode()
MsgBox Asc("A") ' Î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
octeţi) ' Întoarce Caracterul = Ş ' Întoarce Caracterul = ^ ' Întoarce Caracterul =
Ş
A 65 65 65 0 94
Ş 170 350 1
' Defineşte 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) cuprinzând un număr specificat de caractere dintr-un string.
Parametrii reprezintă: string (obligatoriu). Expresie string din care sunt
întoarse caractere. Dacă stringul conţine NULL, atunci NULL se va întoarce. start
(obligatoriu); Este de tip Long. Reprezintă poziţia caracterului din string de la
care începe partea ce va fi preluată. Dacă poziţia este mai mare decât numărul de
caractere din string, Mid va întoarce un string vid ("") - de lungime 0.
Numerotarea caracterelor începe de la 1. lungime (opţional); Este de tip Variant
(Long). Reprezintă numărul de caractere ce vor fi întoarse. Dacă lipseşte sau dacă
este mai mare decât numărul maxim de caractere care mai sunt până la sfârşitul
stringului (inclusiv caracterul de început), vor fi întoarse toate caracterele de
la poziţia de start până la sfârşit. Pentru a determina numărul de caractere dintr-
un string se va utiliza funcţia 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 stânga a unei instrucţiuni de atribuire, caz în care va
înlocui din string, subşirul specificat, cu stringul specificat de expresia din
dreapta instrucţiunii, dar fără a modifica lungimea şirului de caractere. Această
facilitate nu este implementată şi la funcţiile Left sau Right Exemplu. Public Sub
TestMid() Dim S As String S = "123456789" Mid(S, 4, 2) = "A" MsgBox S ' Afişează
123A56789 Mid(S, 4, 2) = "AB" MsgBox S ' Afişează 123AB6789 Mid(S, 4, 2) = "ABC"
MsgBox S ' Afişează 123AB6789 End Sub -----------------I.2.6.2.11 InStr([start, ]
string1, string2[, compare]) Întoarce o valoare de tip Variant (Long) reprezentând
poziţia primei apariţii a string2 în string1. start (opţional). Expresie numerică
care stabileşte poziţia de început pentru fiecare căutare. Dacă este omis, căutarea
începe de la poziţia primului caracter. Argumentul este obligatoriu dacă se
specifică o comparaţie. string1 (obligatoriu). Şirul de caractere în care se va
face căutarea. string2 (obligatoriu). Şirul de caractere care este căutat
Created by Serban Criscota Page 44 19 ianuarie 2001
compare (opţional). 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ă fără să se ţină cont de caracterele mari sau mici.
2 - comparare bazată pe informaţiile din baza de date. Dacă parametrul compare
lipseşte, atunci setarea Option Compare din modulul de cod determină tipul
comparaţiei. Notă: Dacă nu se găseşte ş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
comparaţie textuală începe de la poziţia 4. Întoarce 6. MyPos = Instr(1,
SearchString, SearchChar, 0) ' O comparaţie binară începe la poziţia 1. Întoarce 9.
MyPos = Instr(1, SearchString, "W") ' Întoarce 0. ' Comparaţia este binară implicit
(lipseşte 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(număr,
caracter) Întoarce un şir de caractere, care conţine de număr de ori caracterul
specificat. Notă: Dacă în loc de caracter este un număr N caracterul multiplicat va
fi Chr(N). Dacă N>255 se va folosi Chr(N Mod 256). Notă: Dacă al doilea argument
conţine 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 (număr) Întoarce un şir de caractere, care conţine de număr de ori
caracterul spaţiu. Exemplu. Dim MyString MyString = Space(8)
Created by Serban Criscota
Format(expresie[, format])
LBound(arrayname[, dimension])
Întoarce o valoare de tip Long, care va conţine 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 funcţiei UBound cuprinde: arrayname(obligatoriu). Denumirea
variabilei care defineşte tabloul. dimension(opţional). Este de tip Variant
(Long). Indică dimensiunea a cărei margine (superioară sau inferioară) este
întoarsă. Se utilizează 1 pentru prima dimensiune, 2 pentru a doua etc. Dacă
lipseşte , automat va fi 1. Funcţia UBound se utilizează împreună cu funcţia LBound
pentru a determina mărimea unui tablou, şi anume: LBound - pentru a găsi cea mai
joasă valoare a dimensiunii unui tablou. UBound - pentru a găsi cea mai mare
valoare a dimensiunii unui tablou.
Page 47
19 ianuarie 2001
Exemplu. UBound şi LBound întoarce următoarele valori pentru un tablou cu
dimensiunile: Dim A(1 To 100, 0 To 3, -3 To 4) Valoare Funcţia 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 declaraţie(Dim, Private, Public, ReDim sau Static) , este 0 sau
1. Ea depinde de setarea declaraţiei Option Base.(de obicei 0) Excepţie. Baza unui
tablou creat cu funcţia Array este 0, ea ne fiind afectată de Option Base.
Tablourile, pentru care dimensiunile sunt setate folosind To în declaraţiile Dim,
Private, Public, ReDim sau Static pot lua orice valoare întreagă ca fiind marginea
cea mai de jos (cel mai mic indice).
I.2.6.4 Funcţii pentru mesaje
Valoare 0 1 2 3 4 5 16 32 48 64
Ce reprezintă
19 ianuarie 2001
VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4
VbApplicationModal
Primul buton este implicit Al doilea buton este implicit. Al treilea buton este
implicit. Al patrulea buton este implicit. Aplicaţie modală-utilizatorul trebuie să
răspundă casetei de mesaj înainte de a continua să lucreze în aplicaţia curentă
Sistem modal - toate aplicaţiile sunt blocate până când utilizatorul răspunde
casetei de mesaj.
VbSystemModal
4096
Dacă caseta de text este modală la nivelul aplicaţiei curente sau a tuturor
taskurilor.
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 ------------------
D at e / T i m e
interval yyyy q m y d
Exemplu.
interval w ww h n s
Private Sub cmdDatePart_Click() MsgBox DatePart ("YYYY”, Now) MsgBox DatePart ("M”,
Now) MsgBox DatePart ("Q”, Now) MsgBox DatePart ("Y”, Now) End Sub
------------------
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 ) Funcţia
DateAdd întoarce rezultatul adăugării sau scăderii 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 conţine ziua sau luna sau anul, conţinut în data din
argument. -----------------I.2.6.5.5 Second(date); Minute(date); Hour(date)
Întoarce un Variant (Integer), care va conţine secunda sau minutul sau ora,
conţinut î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 conţine data specificată în argumentele: year, month, and day. Descrierea
argumentelor: • year obligatoriu; Integer. Număr între 100 and 9999, inclusiv, sau
expresie numerică. • month obligatoriu; Integer. Orice expresie numerică. • day
obligatoriu; Integer. Orice expresie numerică. Remarks
Page 52
19 ianuarie 2001
Pentru a specifica o dată, de exemplu December 31, 1991, valoarea fiecărui
parametru trebuie să fie validă, adică ziua între 1-31 şi luna între 1-12. Exemplu
următor va întoarce o dată, exprimată relativ faţă de altă dată. Se observă că
operaţiile se fac specific pentru zile şi luni, ţinându-se cont de numărul de zile
şi luni. Astfel ziua (1 - 1) din luna (8 2), ar trebui să fie 0/6, dar practic dacă
scădem o zi din 1 iunie, avem 31/Mai.Deci, DateSerial(1990 - 10, 8 - 2, 1 - 1) va
fi: 31/Mai/1980. Dacă argumentul pentru an este între 0 şi 99, se vor considera
anii din două cifre setaţi în Windows. Pentru ceilalţi ani trebuiesc introduse 4
cifre. Dacă un argument este dat în afara intervalului acceptat, atunci se va
întoarce o dată care este practic mărită cu numărul de zile sau luni care depăşesc
valoarea maximă pentru argumentul respectiv. De exemplu MsgBox(DateSerial(1998, 11,
32)) va afişa 2/12/1998 Exemplu. Dim MyDate MyDate = DateSerial(1969, 2, 12)
-----------------' Întoarce data February 12, 1969.
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
funcţiei vom avea: MsgBox GetChoice (2) ' afişează 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ă funcţie are o acţiune asemănătoare cu a instrucţiunii If…Then…ElseIf…Else
Funcţia Switch va evalua la în ordine, condiţiile, expr-1, expr-2, expr-n, pînă
când va obţine o valoare true. În acest moment, cercetarea se opreşte, şi funcţia
întoarce valoarea pereche care se găseşte î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 funcţiei vom avea: MsgBox MatchUp
("Paris") ' afişează French -----------------I.2.6.7 Funcţii de inspecţie
Dacă expr-1 = True atunci se întoarce value-1, şi gata… Dacă expr-1 = False atunci
trece la evaluarea următoare Dacă expr-2 = True atunci se întoarce value-2, şi
gata… Dacă expr-2 = False atunci trece la evaluarea următoare Etc.
Notă: Dacă nici una din expresiile evaluate nu este True, atunci Switch întoarce
valoarea Null
Page 54
19 ianuarie 2001
Rezultatul întors de funcţia 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 (neiniţializat) Null (lipsa datelor valide) Integer Long integer Single-
precision - număr în virgulă mobilă Double-precision - număr î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 lipseşte tipul de data '
Iniţializarea variabilelor. IntVar = 459: StrVar = "Hello World": DateVar =
#2/12/69# 'Aşa se pot scrie mai multe instrucţiuni pe rând MyCheck =
VarType(IntVar) ' Întoarce 2. Se separă aşa 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 conţine date care nu sunt
valide, adică au valoarea <Null>. Parametrul este de tip variant şi conţine o
expresie de tip numeric sau string. Funcţia IsNull întoarce: • • True - dacă
parametrul are valoarea Null False - dacă parametrul nu are valoarea Null
Page 55
19 ianuarie 2001
Notă: Aşa cum am mai arătat dacă un termen al expresiei este Null, atunci expresia
va fi tot Null, şi funcţia va întoarce evident True. Observaţia 1. Valoarea Null,
îndică faptul că un Variant nu conţine date valide. Mai există încă două valori
Empty şi String vid(gol) care pot fi uşor 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 îniţializată. • 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.
O funcţie agregată SQL, este specifică prin faptul că datele ei de intrare sunt
valorile unui câmp dintr-o tabelă(cerere) - care este legată de obiectul în care se
foloseşte, adică cerere, tabel, formular sau raport - , din toate sau o parte din
înregistrări. Ele calculează expresii al căror domeniu de aplicabilitate este un
câmp al tabelei(cererii) care se utilizează în obiectul unde sunt folosite. În
cazul rapoartelor sau formularelor, funcţii agregate SQL, se calculează pe
tabela(cererea) legată la acesta. Funcţiile agregate SQL se folosesc fără argumente
Funcţiile agregate SQL sunt: SUM - calculează suma valorilor pe un câmp. MAX,
MIN - întoarce valoarea maximă / minimă a unui câmp. AVG - calculează media
aritmetică a valorilor unui câmp. COUNT - numărul de înregistrări ale
câmpului(diferite de NULL). Dacă se doreşte ca să se ia în calcul şi câmpurile cu
valoarea NULL, atunci se va folosi expresia COUNT(*). VAR, VARP, STDEV, STDEVP -
calcule statistice(varianţa şi deviaţia standard) Notă: Valoarea NULL, în funcţiile
agregate (SQL sau de domeniu), nu se ia în considerare. În celelalte funcţii sau
operaţii, valoarea NULL a unui termen duce, la rezultatul NULL al expresiei,
indiferent de felul în care e constituită aceasta. -----------------I.2.6.9
Funcţiile agregate de domeniu.
Page 59
19 ianuarie 2001
I.2.7 Mediul de depanare şi dezvoltare VBA. Meniul de execuţie şi depanare al VBA,
este prezentat mai jos: Resetează toate variabilele globale ale aplicaţiei
Afişează fereastra Debug. În aceasta se vor regăsi toate afişările făcute cu
instrDebug.Print
Stop Run
Comenzile de compilare
Punctul de întrerupere
Va determina oprirea rulării programului acolo unde este întâlnit . Se recunoaşte
prin culoarea maro a instrucţiunii, şi a unui punct în faţa ei
Page 60
19 ianuarie 2001