CATEGORII DOCUMENTE |
Vizibilitatea unei variabile este data de portiunea de cod in care ea poate fi folosita si depinde de locul in care a fost declarata. Vizi-bilitatea unei variabile create in cadrul unei proceduri se reduce doar la acea procedura si se spune ca vizibilitatea sa este locala. O variabila poate fi declarata si in afara oricarei proceduri, in cadrul sectiunii (General) (Declarations) a unui modul. In acest caz, ea poate fi folosita de toate procedurile din modulul respectiv si din alte module si se spune ca vizibilitatea sa este publica.
Durata de viata a unei variabile e data de perioada in care ea va putea contine o valoare. Astfel, o variabila locala a unei proceduri "traieste" atata timp cat se ruleaza procedura respectiva si este recreata la urmatorul apel al procedurii.daca se doreste ca o variabila locala sa existe si dupa terminarea procedurii, se va folosi cuvantul cheie Static la declararea ei. Se poate declara si o procedura ca fiind statica, astfel incat toate variabilele sale locale sa fie statice.
Variabilele publice exista atata timp cat este deschisa baza de date.
In Access se poate stabili si vizibilitatea procedurilor, folosind cuvintele cheie Public si Private. O procedura avand specificatorul Private poate fi apelata numai din interiorul modulului in care este declarata, in timp ce o procedura cu specificatorul Public poate fi apelata din orice alt modul. Pentru a putea apela o procedura din fereastra Debug, aceasta trebuie sa fie publica.
Pentru ca o variabila declarata intr-o procedura sa-si pastreze valoarea si intre doua apeluri ale procedurii, ea trebuie sa fie declarata folosind cuvantul cheie Static, in locul lui Dim. O astfel de variabila va fi initializata o singura data: la primul apel al procedurii.
Fie exemplul:
Sub VarStatic()
Static intVar As Integer
IntVar = intVar + 1
Debug.Print intVar
End Sub
Dupa ce se ruleaza rutina de mai multe ori, rezultatele vor fi cele din figura 135:
Figura 135
Daca intVar nu ar fi fost declarata ca statica, subrutina ar fi tiparit de fiecare data aceeasi valoare: 1.
Pentru ca toate variabilele unei proceduri sa fie statice, se foloseste cuvantul cheie Static inaintea declaratiei procedurii:
Static Sub VarStatic()
Exista doua tipuri de variabile publice in Access:
variabile publice in cadrul unui modul;
variabile publice in cadrul aplicatiei.
Variabilele publice in cadrul unui modul se declara cu ajutorul instructiunii Dim la sectiunea (General) (Declarations) a modulului si pot fi folosite de catre toate procedurile modulului.
Astfel de variabile sunt folosite in urmatorul exemplu:
la sectiunea (Declarations) a unui modul se va declara variabila intVarModul astfel:
Dim intVarModul As Integer
se creeaza urmatoarele doua subrutine:
Sub Incrementare()
IntVarModul = intVarModul + 1
End Sub
si
Sub Tiparire()
Debug.Print intVarModul
End Sub
se apeleaza de mai multe ori ambele subrutine din fereastra Debug. Figura 136 prezinta rezultatele (de exemplu, dupa ce s-a apelat o data subrutina Incrementare si o data Tiparire, in fereastra Immediate s-a afisat 1):
Figura 136
se creeaza o a treia procedura, in acelasi modul:
Sub LocalVar()
Dim intVarModul As Integer
IntVarModul = 50
Debug.Print intVarModul
End Sub
dupa ce se apeleaza o data subrutina LocalVar si apoi, din nou Tiparire, in figura 137 se vor vedea rezultatele:
Figura 137
LocalVar lucreaza cu variabila intVarModul declarata in inte-riorul sau, fara a modifica sau a fi afectata de variabila publica intVarModul, chiar daca acestea au acelasi nume.
Observatie:
Pentru a evita confuziile este bine sa se aleaga pentru variabile locale nume diferite de cele ale variabilelor publice.
Variabilele publice in cadrul aplicatiei pot fi accesate din toate modulele aplicatiei, dar pot fi declarate numai in cadrul sectiunii (General) (Declarations) a unui modul standard. Aceste variabile se declara inlocuind instructiunea Dim cu instructiunea Public:
Public intVarPublic As Integer
Variabilele nu se pot declara ca publice in cadrul procedurilor.
VBA ofera posibilitatea de a testa in cadrul procedurilor anumite conditii si de a efectua operatii diferite in functie de rezultatele testelor
Instructiunea IfThen se foloseste in cazul in care se doreste executarea anumitor operatii doar daca o conditie este adevarata. Ea are doua sintaxe:
Daca instructiunea este folosita pe o singura linie de cod, sintaxa este:
If conditie Then instructiune
Altfel, daca instructiunea este compusa din mai multe linii de cod:
If conditie Then
Instructiuni
End If
A doua varianta este utila atunci cand se doreste executarea mai multor instructiuni in cazul in care conditia este adevarata. In cadrul clauzei If poate aparea orice expresie. Daca valoarea expresiei evaluate este diferita de 0, ea este considerata adevarata, altfel este considerata falsa.
Exemplu de folosire a ambelor variante ale instructiunii IfThen:
Sub TestIfThen(strDat As String, strCautat AS String)
Dim strRezultat As String
If strDat = "" Then strRezultat = "Sirul dat este vid"
If InStr(strDat, strCautat) Then
StrRezultat = strCautat
StrRezultat = strRezultat & " se afla in " & strDat
End If
Debug.Print strRezultat
End Sub
Mai intai se va apela subrutina TestIfThen cu primul parametru vid si cel deal doilea avand valoarea "test":
Call TestIfThen("", "test")
A doua oara, se va apela aceeasi subrutina cu primul parametru avand valoarea "Acesta este un test", iar cel de-al doilea raminand cu valoarea "test":
Call TestIfThen("Acesta este un test", "test")
Figura 138 prezinta rezultatele celor doua rulari, in fereastra Immediate:
Figura 138
In cadrul subrutinei TestIfThen s-a folosit o functie predefinita in Access, InStr, care verifica daca un sir de caractere (strCautat) se gaseste in alt sir (strDat) si returneaza pozitia la care apare sirul cautat in sirul sursa sau 0 daca sirul cautat nu se regaseste in sirul sursa.
Pentru a specifica ce operatii trebuie efectuate in cazul in care conditia este falsa, se foloseste instructiunea IfThenElse.
Exemplu:
If InStr(strDat, strCautat) Then
StrRezultat = strCautat & " se afla in " & strDat
Else
StrRezultat = strCautat & " nu se afla in " & strDat
End If
Aceasta instructiune poate fi privita ca un mijloc de a imbrica mai multe instructiuni IfThenElse, deci si de a verifica mai multe conditii.
Iata un exemplu:
If strDat = "" Then
StrReyultat = "Sirul dat este vid"
ElseIf InStr(strDat, strCautat) Then
StrRezultat = strCautat & " se afla in " & strDat
Else
StrRezultat = strCautat & " nu se afla in " & strDat
End If
Astfel, daca prima conditie nu e adevarata, se verifica cea de-a doua, si daca nici aceasta nu este adevarata se executa instructiunea din ca-drul clauzei Else; in acest mod se pot folosi oricate instructiuni ElseIf.
Atunci cand trebuie sa se testeze mai multe conditii si sa se efectueze pentru fiecare un anumit set de operatii, folosirea instructiunii ElseIf poate deveni greoaie. In schimb, se poate folosi o instructiune Select Case care sa faca acelasi lucru. Astfel, urmatoarele doua secvente duc la acelasi rezultat:
If intVarsta<=18 Then
ElseIf intVarsta>=19 And intVarsta<=25 Then
ElseIf intVarsta>=26 And intVarsta<=40 Then
Else
End If
si
Select Case intVarsta
Case Is <=18
Case 19 To 25
Case 26 To 40
Case Else
End Select
Expresiile clauzelor Case se testeaza in ordinea in care sunt date si in momentul in care este intalnita o expresie adevarata, se vor executa instructiunile corespunzatoare si se va iesi din instructiunea Case. Astfel, daca expresiile a doua dintre clauzele Case sunt adevarate, va fi executat numai codul corespunzator primeia dintre ele, nemaifacandu-se apoi nici o verificare.
Instructiunea Case de mai sus poate fi scrisa si astfel:
Select Case intVarsta
Case Is <=18
Case 19, 20, 21, 22, 23, 24, 25
Case 26 To 40
Case Else
End Select
Existenta clauzei Case Else in cadrul unei instructiuni Select Case nu este obligatorie, ea poate fi insa utila in cazul in care variabila testata poate avea si alta valoare decat cele cuprinse in clauzele Case.
Observatie:
Variabila testata poate contine atat valori numerice, cat si siruri de caractere sau date.
Aceasta instructiune este aproape echivalenta cu instructiunea IfThenElse.
Sintaxa instructiunii IIf este urmatoarea:
IIf(conditie, valoarea1, valoarea2),
unde:
conditie este conditia care trebuie sa fie testata;
valoarea1 este valoarea returnata in cazul in care conditia este adevarata;
valoarea2 este valoarea returnata cand conditia este falsa.
Fie urmatoarele doua functii:
Function Impartire(intImpartitor As Integer, intDeimp As Integer) As Double
If intImpartitor = 0 Then
Impartire = 0
Else
Impartire = intDeimp / IntImpartitor
End If
Debug.Print intDeimp & ':' & IntImpartitor & '=' & Impartire
End Function
si
Function Impartire(intImpartitor As Integer, intDeimp As Integer) As Double
Impartire = IIf(intImpartitor=0,0,intDeimp / intImpartitor)
End Function
Aparent, cele doua functii fac acelasi lucru. Diferenta consta in faptul ca in prima functie, daca este indeplinita conditia instructiunii If, se executa instructiunea Impartire = 0 si se iese din instructiunea IfThenElse fara alte verificari. In instructiunea IIf din cea de-a doua functie se evalueaza insa toate argumentele. Astfel, daca intImpartitor=0 , la evaluarea lui intDeimp / intImpartitor va rezulta o eroare.
Faptul ca in instructiunea IIf se evalueaza toate argumentele, nu numai ca incetineste executia procedurii, dar poate duce si la erori.
Exista situatii, foarte des intalnite in programare, cand un anumit bloc de instructiuni trebuie sa fie executat de mai multe ori. Pentru astfel de operatii, VBA pune la dispozitie instructiunile ForNext si DoLoop.
Aceasta instructiune este utila atunci cand se stie precis cate iteratii trebuie efectuate.
Sintaxa ei este:
For contor = val_init To val_final [Step pasul]
Next [contor]
unde:
contor - variabila care se incrementeaza la fiecare iteratie;
val_init - valoarea initiala a variabilei contor;
val_final - valoarea finala a variabilei contor;
pasul - valoarea cu care se incrementeaza variabila contor la fiecare iteratie.
Valoarea implicita a pasului este 1. pasul poate fi si negativ, caz in care variabila contor va descreste la fiecare iteratie cu valoarea absoluta a pasului.
Exemplu:
For intCont = 1 To intTotal Step 2
Debug.Print intCont
Next
In exemplul de mai sus, valoarea initiala a contorului intCont este 1 si la fiecare pas aceasta valoare creste cu 2 unitati, pana cand ega-leaza valoarea variabilei intTotal. De asemenea, la fiecare iteratie se va afisa valoarea lui intCont
In situatiile in care un set de instructiuni trebuie sa se execute pana cand sau atata timp cat o anumita conditie este satisfacuta, se foloseste instructiunea DoLoop, care are urmatoarele sintaxe:
Do Until conditie
Bloc de instructiuni
Loop
Sau
Do
Bloc de instructiuni
Loop Until conditie
Sau
Do While conditie
Bloc de instructiuni
Loop
Sau
Bloc de instructiuni
Loop While conditie
Primele doua variante ale instructiunii DoLoop executa blocul de instructiuni pana cand conditia va deveni adevarata. Deosebirea dintre ele este aceea ca in cea de-a doua varianta blocul de instructiuni se executa cel putin o data.
Ultimele doua variante ale instructiunii DoLoop executa blocul de instructiuni atata timp cat conditia este adevarata cu deosebirea ca, in cazul ultimei variante, blocul de instructiuni se executa cel putin o data.
Atat in cazul instructiunii ForNext, cat si in cel al instructiunii DoLoop, se stie cand anume se va opri procesul iterrativ. VBA ofera insa si posibilitatea de a intrerupe acest proces la o anumita iteratie, cu ajutorul instructiunii Exit.
De exemplu:
For intCont = 1 To intTotal
If intStop Then
Exit For
End If
Debug.Print intCont
Next
Daca intStop este diferit de zero, procesul iterativ se opreste, indiferent de valoarea lui intCont
Pentru a parasi o subrutina sau o functie, se pot folosi instructiu-nile Exit Sub sau Exit Function
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1189
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved