Limbajul VBA
Notiuni introductive
Limbajul Visual Basic for Application (VBA) este un limbaj
orientat pe obiecte si pe evenimente. Obiectele Access se
caracterizeaza prin metode si proprietati. Cu ajutorul
metodelor se actioneaza asupra starii unui obiect, iar
proprietatile indica starea acestuia.
Vom folosi, în continuare, pentru exemplificare, o baza de date pentru evidenta mijloacelor fixe. La realizarea acestui sistem informatic, s-au luat în considerare urmatoarele obiective: achizitia, reevaluarea si casarea mijloacelor fixe, precum si calc 232b18c ulul si evidenta amortizarii acestora. Dupa proiectarea bazei de date s-au obtinut tabelele si legaturile din figura 1.
Editarea modulelor VBA
Modulele din Access sunt obiecte ale bazei de date, care permit scrierea de rutine în limbajul VBA. Acestea pot fi constituite din: declaratii de variabile, tipuri de date utilizator, proceduri si/sau functii, declaratii API.
Pentru a scrie o procedura si/sau o functie VBA se alege sectiunea Modules din fereastra bazei de date. Procedurile si/sau functiile pot fi asamblate în module în functie de cerintele programatorului.
Deci, o procedura si/sau o functie odata definita poate fi repelabila din orice obiect al bazei de date (care permite acest lucru), cu exceptia cazului în care au fost declarate Private.
Pentru o actualizare si o consultare cât mai simple, se recomanda gruparea procedurilor si/sau functiilor dupa criterii functionale.
Pentru a crea un modul nou se activeaza butonul New, iar pentru modificari se selecteaza modulul dorit, dupa care se activeaza butonul Design, sau dublu-clic direct pe modulul dorit. Pentru a sterge un modul se selecteaza modulul si apoi se activeaza tasta Del sau butonul de stergere din bara de butoane.
Din punct de vedere sintactic, scrierea rutinelor VBA se poate face cu caractere minuscule sau majuscule. Atât cuvintele cheie, cât si cele utilizator sunt automat transcrise în forma în care au fost declarate, daca sunt scrise corect. Editorul are, de asemenea, facilitati de colorare a cuvintelor cheie, declaratiilor utilizator, frazelor eronate, comentariilor etc.
Exista doua tipuri de verificari sintactice care opereaza asupra unei rutine VBA:
La nivel local, asupra fiecarei instructiuni, pe masura ce acestea sunt scrise;
La nivel contextual, asupra întregii rutine:
prin compilarea explicita ceruta de programator (meniul Debug, optiunea Compile);
la momentul executiei unei rutine.
Cea mai puternica facilitate a editorului VBA este posibilitatea afisarii contextuale în momentul scrierii în VBA a elementelor care caracterizeaza un anumit context.
Astfel, programatorul nu trebuie sa retina cuvintele cheie (proprietati, metode, obiecte, tipuri de date etc.) asa cum sunt definite, unele dintre ele finnd destul de lungi, ci doar sa stie de existenta acestora. VBA afiseaza într-un anumit context numai elementele (proprietati, metode, obiecte, tipuri de date etc.) caracteristice acestuia. Utilizatorul trebuie doar sa aleaga elementul dorit, nemaifiind nevoie sa îi scrie denumirea completa de la tastatura, acest lucru permitând scrierea rapida de proceduri si functii. De asemenea, în timpul editarii rutinelor, programatorul poate apela help-ul contextual.
Instructiunile se scriu în general câte una pe un rând, fiind însa permisa scrierea mai multor instructiuni pe acelasi rând, separate prin caracterul " : ". o instructiune poate fi scrisa pe mai multe rânduri, daca la sfârsitul fiecaruia se pune caracterul " - ", cu exceptia rândului care o încheie. Comentariile se introduc în VBA precedate de caracterul " " (apostrof), care permite în acelasi timp autodocumentarea rutinelor si nu afecteaza cu nimic secventa de instructiuni unde apar, ci este numai un text explicativ.
Instructiuni pentru afisarea si introducerea datelor
Evident, formularele si rapoartele reprezinta o forma eleganta de introducere si respectiv afisare a datelor care se bazeaza în principal pe structura bazei de date. În afara de acestea, exista în VBA instructiuni pentru introducerea unor date izolate si afisarea de mesaje. Aceasta necesitate se simte mai ales în faza de test a unei proceduri sau functii sau pentru afisarea de mesaje catre utilizatorul bazei de date.
Pentru introducerea unei secvente de caractere de la tastatura se foloseste urmatoarea instructiune:
InputBox (<mesaj>, [< titlu>], [<val_implicita>], [<x>], [<y>], [<fisier_help>, <context>])
unde:
<mesaj>- este un sir de caractere afisat în fereastra InputBox; pot fi maximum 1024 de caractere; daca se doreste afisarea unui mesaj pe mai multe rânduri trebuie intercalat caracterul <ENTER>, adica CHR(13) la sfârsitul rândului.
< titlu>- este titlul ferestrei afisate (sir de caractere).
<val_implicita>- este valoarea implicita afisata de fereastra InputBox pentru introducere (sir de caractere).
<x>- pozitia ferestrei InputBox fasa de marginea de sus a ecranului (expresie numerica).
<y>-
<fisier_help>
<context>
Variabile
Caracteristici generale
Variabilele sunt nume de locatii memorie care contin valori de un anumit tip, care se modifica în timpul executiei aplicatiei. Numele variabilelor nu pot contine spatii sau alte semne de punctuatie (cu exceptia caracterului _). Variabilele se caracterizeaza prin:
Domeniu - se refera la momentul când acestea apar si când dispar din codul sursa. Variabilele apar atunci când sunt declarate prima data, dupa care apar si dispar în functie de domeniu. În momentul când acestea apar, variabilele devin vizibile, li se pot atribui valori si pot fi folosite în cadrul instructiunilor VBA. În rest, ele sunt invizibile.
Durata de viata - se refera la timpul de executie al procedurii cuprins între momentul primei aparitii a variabilei si momentul disparitiei ei.
O variabila se poate declara folosind una din structurile:
Dim <variabila> [(indici)] [As Tip_data] [,<variabila> [(indici)] [As Tip_data]]
sau
Static <variabila> [(indici)] [As Tip_data] [,<variabila> [(indici)] [As Tip_data]]
sau
Public <variabila> [(indici)] [As Tip_data] [,<variabila> [(indici)] [As Tip_data]]
unde: <variabila>: este numele pe acre îl veti folosi pentr variabila;
Tip_data: este un tip de date valabil în Access;
(indici): reprezinta limita inferioara si superioara daca variabila este o matrice.
Clasificarea variabilelor
A. În functie de gradul de vizibilitate (domeniu) variabilele pot fi:
Variabile locale: acestea sunt vizibile numai în cadrul procedurii în care a fost declarata: Dim Lnume As String.
Variabile de tip modul: acestea sunt vizibile numai în cadrul modulului în care au fost declarate; acestea sunt declarate în sectiunea Declarations cu instructiunea Dim.
Variabile publice: sunt vizibile pentru orice procedura declarata în aplicatia respectiva; acestea sunt declarate în sectiunea Declarations cu instructiunea Public.
Deci, domeniul de valabilitate al unei variabile VBA este determinat de dua elemente: locul în care declarati variabila în cadrul modulului si dacp folositi pentru declarare instructiunile Dim, Public sau Private.
Instructiunea Public este folosita pentru declararea variabilelor globale, care trebuie sa fie folosite de toate modulele din baza de date. Evitati pe cât posibil utilizarea acestor varibile, deoarece este dificil pentru un programator sa îsi aminteasca o variabila definita într-un alt modul decât cel în care lucreaza în momentul respectiv. Oricine citeste codul dintr-un modul trebuie sa stie ce reprezinta variabilele pentru a întelege ceea ce ati scris, însa este posibil sa nu fi citit înainte modulul care contine declaratiile variabilelor globale. Daca sunteti nevoit sa folositi variabilele globale, plasati-le pe toate într-un modul denumit chiar "Variabile globale" sau într-un mod asemanator, pentru a indica foarte clar unde pot fi gasite.
Transmiterea unei variabile ca argument într-o subrutina sau functie reprezinta o exceptie de la regulile de definire a domeniului de valabilitate. În general, atunci când folositi ca argument un nume de variabila, în procedura apelata este transferata adresa variabilei din memoria calculatorului. Aceasta metoda, denumita transfer prin referinta, este caracterizata prin faptul ca orice schimbare a valorii variabilei în procedura apelata modifica si valoarea din procedura apelanta, ceea ce înseamna ca variabila respectiva devine vizibila pentru procedura apelata, iar limitele domeniului de valabilitate sunt depasite (ignorate). Acest mod de comportare poate fi convenabil sau nu; pentru a obliga programul Access sa transmite procedurii apelate valoarea unei variabile, si nu adresa acesteia, folositi cuvântul cheie By Val în declaratia procedurii apelate, ca în programelul din capitolul anterior:
Function cost (ByVal id As Integer) As Currency
B. În functie de dinamismul variabilelor, acestea pot fi:
Variabile dinamice: sunt acele variabile care îsi modifica continutul de la o executie la alta a unei proceduri; acestea sunt variabilele locale;
Variabile statice: acestea pot fi declarate numai în cadrul unei proceduri cu instructiunea Static si se caracterizeaza prin faptul ca se memoreaza continutul lor de la o executie la alta a procedurii respective.
C. În functie de continut, variabilele pot fi:
Variabile standard: la care utilizatorul defineste numele si tipul variabilei; acestea se mai numesc si variabile simple; continutul unei variabile standard este o valoare (data) izolata: Dim vVar As Long;
Variabile de tip structura: Access permite utilizatorului sa-si creeze propriile tipuri de date; datele sunt grupate pentru a fi prelucrate global sau element cu element; elementele unei multimi pot fi de acelasi tip (tablouri) sau nu; acest tip de variabila permite utilizatorului sa-si defineasca multimi de elemente care nu sunt de acelasi tip; aceste multimi se declara folosind cuvintele utilizator Type . End Type; referirea la un element din cadrul structurii se realizeaza utilizându-se atât numele structurii, cât si numele elementului, separate prin punct; sintaxa este urmatoarea:
Private / Public] Type variabila
element1 [([subscripts])] As Tip
[element2 [([subscripts])] As Tip]
.
End Type
Variabila de tip structura, poate fi definita public sau privat, plasata în sectiunea de declaratii. Acestea nu pot fi definite în modulele atasate formularelor sau rapoartelor.
Exemplu: se creeaza o variabila de tip structura de date "Persoana" care contine elementele: Nume, Prenume, Adresa.
Variabile de tip tablou: tabloul este o multime ordonata de date care contine elemente de acelasi tip; o variabila tablou poate fi decrata publica, de tip modul sau locala; fiecare element al unui tablou este identificat printr-un index unic; variabilele tablou pot fi de doua tipuri:
Statice;
Dinamice.
În tablourile statice, se cunoaste numarul de elemente în momentul definirii acestuia.
Exemplu: se declara o variabila de tip tablou cu doua elemente care sa contina numele facultatilor din cadrul Universitatii "Spiru Haret":
În tablourile dinamice, nu se
cunoaste numarul de elemente, elementele lui putându-se
reinitializa cu instructiunea ReDim.
Comanda Preserve pastreaza valorile memorate în elementele
Facultate(0) si Facultate(1).
Variabile obiect: sunt variabile care fac referire la un anumit tip de obiect: o variabila obiect poate fi declarata publica, privata sau locala; spre deosebire de celelalte tipuri de variabile (variabile String sunt initializate cu "" - sirul vid, variabilele numerice sunt initializate cu 0, iar variabilele Variant sunt initializate cu Empty), variabilele de tip obiect sunt initializate cu Nothing.
Pentru a atribui un obiect unei variabile obiect, se foloseste instructiunea Set:
Set variabila = obiect de referinta
Exemplu: sa se declare o variabila care sa contina setul de înregistrari din tabela "Client":
NOTĂ: daca
în cadrul unei functii sau proceduri se folosesc mai multe variabile,
acestea vor fi declarate în mod explicit; daca, spre exemplu, am nevoie de
doua variabile de tip întreg v1 si v2 trebuie declarate astfel:
Dim v1 As Integer, v2 As Integer
si nu astfel:
Dim v1 , v2 As Integer
caz în care v1 este de tip variant si v2 este de tip întreg.
Constante
Acestea sunt nume de locatii de memorie care contin valori care nu se modifica în timpul executiei aplicatiei. Constantele sunt de trei tipuri:
Constante definite de sistem
True, False, Null - folosite în cadrul modulelor;
Yes, No, On, Off - folosite în toate obiectele bazei de date, mai putin în cadrul modulelor;
Constante interne- folosite ca argumente în cadrul unor instructiuni (acForm, acMacro);
Constante definite de utilizator- sunt declarate folosind comanda Const si pot fi definite atât în sectiunea de declaratii, cât si în cadrul procedurilor.
Ca orice variabile, constantele pot fi declarate la nivel local, la nivel de modul sau la nivel public.
Când se declara o constanta, nu este obligatoriu sa se specifice tipul de data. VBA va alege tipul de data cel mai eficient pentru acea constanta.
Exemple
constanta locala:
![]() |
constanta modul:
![]() |
![]() |
Cea mai buna metoda de a învata sa scrieti programe în VBA este exercitiul practic. De aceea vom descrie mai jos, pas cu pas, scrierea unui programel care sa afiseze pe ecran o caseta de dialog cu mesajul "Hello, World!". Pentru aceasta procedati astfel:
Deschideti un modul standard nou (executati clic pe butonul New în pagina Modules).
Plasati cursorul în sectiunea Procedures si scrieti "sub hello", dupa care apasati tasta Enter. Programul Access adauga automat o linie goala si introduce o instructiune End Sub, transforma în majuscula prima litera din cuvântul cheie Sub si adauga paranteze goale la sfârsitul liniei pentru a evidentia faptul ca nu ati definit nici un argument.
Apasati tasta Tab pentru a indenta codul dintre instructiunile Sub si End Sub. Indentarea este o metoda aplicata frecvent de programatori; folositi astfel de indentari ori de câte ori scrieti un nou bloc de cod; nu este o cerinta obligatorie, dar este recomandata pentru a îmbunatati lizibilitatea programului.
Actiunea Access care creeaza o caseta de dialog simpla se numeste MsgBox. Puteti afla acest lucru cautând subiectul "dialog" în sistemul de asistenta (Help) din Access. Scrieti msgbox pe linia curenta (indentata), adaugati un spatiu dupa cuvânt si urmariti reactia programului Access.
Când scrieti un cuvânt cheie pe care programul Access îl recunoaste, pe ecran este afisata automat o referinta a sintaxei comentii respective . aceasta facilitate se numeste Auto Quick Info (informatii automate rapide), iar daca vreti sa o dezactivati, procedati astfel: executati click pe meniul Tools, apoi pe Options, selectati eticheta Modules si deselectati caseta de validare Auto Quick Info din grupul Coding Options (optiuni de programare).
Nota: puteti obtine informatii detaliate despre orice cuvânt cheie din Access selectând cuvântul respectiv si apasând tasta F1.
Caseta Auto Quick Info listeaza argumentele optionale ale functiei între paranteze drepte; în cazul de mai sus singurul argument obligatoriu este Prompt, care va aparea în caseta de dialog creata; introduceti argumentul scriind "Hello, World!", între paranteze rotunde si ghilimele; dupa ce terminati, programul Access intervine asupra instructiunii (introducând majuscule si spatii în cuvintele cheie; în final procedura ar trebuie sa arate astfel:
![]() |
Salvati ceea ce ati lucrat, executând clic pe butonul Save de pe bara de instrumente si denumiti noul modul "Mesaj salut".
Dupa introducerea continutului modulului, ar trebui ca programul Access sa îl verifice pentru a detecta erorile. Puteti rezolva aceasta problema foarte rapid, compilând codul, prin executarea unui click pe butonul Compile Loaded Modules de pe bara cu instrumente sau prin selectarea optiunii Compile din meniul Debug. Daca Access gaseste erori în acest modul (sau în alte module încarcate, în cazul în care sunt deschise mai multe), le va semnaliza si va va sugera o solutie de rezolvare a acestora.
În final, rulati codul pentru a vedea cum functioneaza. Executati click pe butonul Go/Continue de pe bara cu instrumnete (aceste comenzi sunt valabile numai când modulul este deschis în modul Design); caseta de mesaj, ar trebui sa fie afisata pe ecran, astfel:
![]() |
|