Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Un modul este o colectie de declaratii si programe VBA (Visual Basic for Applications) care sunt memorate impreuna, formand o entitate de sine statatoare .
In VBA nu exista notiunile de program principal si de subprogram; textul sursa este organizat in unitati de program de tip procedura sau functie si este memorat in module . Un modul contine unul sau mai multe programe de tip procedura sau de tip functie si o singura sectiune de declaratii de variabile si constante, folosita de toate procedurile si functiile din modul . Un tip special de procedura este procedura-eveniment, care se executa ori de cate ori se produce evenimentul respectiv .
Exista urmatoarele tipuri de module: module tip, care pot fi asociate formularelor / rapoartelor sau pot fi independente si module globale .
Obiective:
Notiuni introductive
Crearea unui program
Introducere in VBA
&
Notiuni introductive
In VBA nu exista notiunile de program principal si de subprogram; textul sursa este organizat in unitati de program de tip procedura sau functie si este memorat in module . Un modul contine unul sau mai multe programe de tip procedura sau de tip functie si o singura sectiune de declaratii de variabile si constante, folosita de toate procedurile si functiile din modul .
Exista doua tipuri de module:
module tip (class modules);
module asociate;
module independente;
module globale (standard modules) .
Sunt modulele atasate unui formular sau unui rapoart particular sau modulele independente .
Modulele asociate contin de cele mai multe ori proceduri-eveniment, adica proceduri care se executa ca urmare a aparitiei unui anume eveniment legat de formularul sau raportul respectiv . Atunci cand MS Access constata ca s-a produs un eveniment in formular / raport, el lanseaza automat procedura-eveniment atasata obiectului si evenimentului respectiv . Aceste proceduri-eveniment permit programatorului sa controleze "comportamentul" formularului sau raportului respectiv si modul in care acesta reactioneaza la diferitele manevre efectuate de utilizator: actionari ale tastaturii, mouse-ului, butoanelor de comanda, iconilor, inchideri de ferestre-dialog, transmiterea datei curente etc . De exemplu, se poate crea o procedura-eveniment care sa selecteze caseta-text Numele Sotului/Sotiei imediat ce a fost validata caseta-optiune Casatorit dintr-un formular .
Fiecare formular si fiecare raport dintr-o BD are un modul incorporat care contine sabloane de proceduri-eveniment in care programatorul poate introduce direct codul dorit . In orice moment, modulul asociat formularului / raportului contine toate procedurile-eveniment create pentru formularul / raportul respectiv . Daca formularul / raportul este copiat sau mutat atunci modulul asociat este copiat, respectiv mutat, automat o data cu formularul / raportul .
In MS Access 95 exista un singur fel de module tip: cele asociate unui formular / raport; in MS Access 97 pot exista si module care sunt independente de setul de formulare si rapoarte al aplicatiei . Aceste module independente pot fi folosite pentru a crea un obiect-utilizator (de exemplu prin adaptarea unui obiect predefinit) .
Pentru a afisa un modul asociat unui formular / raport, trebuie actionat iconul Code de pe toolbarul ferestrei Form Design / Report Design; pentru a afisa un modul independent, trebuie activat tabul Modules al feresteri DataBase si deschis modulul respectiv cu butonul de comanda DESIGN .
Contin proceduri si functii generale care nu sunt asociate cu nici un obiect, si proceduri si functii utilizate frecvent care trebuie sa poata fi executate din orice punct al BD . Ele sunt obiecte separate in BD, iar constantele, variabilele, procedurile si functiile pe care le contin pot fi apelate din modulele asociate formularelor si rapoartelor sau din modulele independente .
Modulele globale sunt listate tot in tabul Modules al ferestrei Database; ele mai sunt listate, alaturi de modulele asociate in Object Browser (o fereastra-dialog care afiseaza informatii despre obiectele, proprietatile, metodele si constantele din aplicatia curenta si din bibliotecile-obiect referite) .
Un program este o unitate de cod VBA . El consta dintr-o serie de instructiuni si metode care executa operatii sau calculeaza valori . Programele pot accepta argumente .
Exista 2 tipuri de programe:
procedurile;
functiile .
Executa o operatie sau o serie de operatii, dar nu returneaza nici o valoare . MS Access ofera sabloane de proceduri-eveniment, dar orice programator isi poate crea propriile proceduri .
De exemplu, urmatorul program, care este o procedura-eveniment, utilizeaza metoda OpenForm pentru a deschide formularul F_Produse din BD AsistRom:
Private Sub DeschideProduse_Click()
DoCmd . OpenForm 'F_Produse'
End Sub
Returneaza o valoare (de obicei, rezultatul unui calcul) .
De exemplu, urmatoarea functie returneaza numele primei zile din luna care urmeaza datei curente; sunt folosite functiile Visual Basic predefinite DateSerial, Year, Month, Now .
Function FirstOfNextMonth()
FirstOfNextMonth = DateSerial(Year(Now), Month(Now) + 1, 1)
End Function
Ulterior, aceasta functie definita de utilizator poate fi folosita si in alte situatii, de exemplu pentru setarea valorii implicite a unui control grafic: se selecteaza controlul, se afiseaza fereastra proprietatilor sale iar in linia Default Value se tasteaza expresia:
=FirstOfNextMonth()
Pentru a utiliza o functie creata de utilizator pentru setarea unei proprietati trebuie ca acea functie sa faca parte fie din modulul asociat formularului / raportului in care are loc setarea, fie dintr-un modul global .
Majoritatea sarcinilor legate de administrarea eficienta a aplicatiei se pot realiza atat cu macrocomenzi, cat si cu module VBA . Exista situatii insa in care este recomandata utilizarea macrocomenzilor si alte situatii in care este recomandata utilizarea programarii in VBA . Ca atare, programatorul trebuie sa analizeze separat fiecare caz si sa aleaga instrumentul de lucru cel mai potrivit .
Macrocomenzile au fost prezentate in capitolul anterior, unde au fost discutate si cele 2 situatii in care ele sunt mai eficiente decat modulele VBA .
In schimb, este recomandabila utilizarea unui program VBA pentru:
automatizarea sarcinilor legate strict de un anumit formular sau raport . Folosirea unor proceduri-eveniment atasate obiectului respectiv in locul asignarii unor macrocomenzi are avantajul ca procedurile-eveniment sunt depuse in modulul asociat si devin parte integranta obiectului, fiind copiate, mutate etc . o data cu el .
marirea puterii de calcul a aplicatiei proiectate . Visual Basic are incorporate multe functii predefinite, dar orice programator isi poate crea propriile functii . Deoarece functiile intorc valori, ele pot fi usor folosite si in expresii, care apar in instructiunile sau metodele Visual Basic, in setarea proprietatilor, in definirea interogarilor sau filtrelor . Ca atare, apelarea acestor functii permite efectuarea unor calcule mai complexe decat cele care se pot face recurgand numai la expresii .
mascarea mesajelor de eroare - destul de criptice - lansate de MS Access si inlocuirea lor prin coduri VBA care, in caz de eroare, fie afiseaza mesaje mai clare, fie fac o tentativa de depanare .
crearea si manevrarea obiectelor . Desi crearea si manevrarea obiectelor (tabele, interogari etc . ) in modul Design View este foarte comoda, exista cazuri in care aceste operatii, inclusiv administrarea intregii BD, se pot efectua mai eficient prin coduri VBA .
efectuarea unor actiuni la nivelul sistemului . Prin utilizarea actiunii RunApp intr-o macrocomanda se pot lansa in executie aplicatii Windows sau MS-DOS; in schimb, prin utilizarea unui modul VBA se pot utiliza facilitatile Automatic sau DDE (Dynamic Data Exchange) de comunicare cu alte aplicatii Windows sau se pot apela functii aflate in bibliotecile DLL (Dynamic-Link Libraries) .
manevrarea inregistrarilor una cate una (macrocomenzile trateaza numai intregul set de inregistrari) .
transmiterea argumentelor catre programele VBA . Si in macrocomenzi se pot defini argumentele actiunilor (in panelul Action Arguments), dar aceste argumente sunt fixate, statice, pot fi asimilate constantelor . Intr-un program VBA, argumentele pot fi furnizate si in momentul executiei programului sau pot fi tratate ca variabile, ceea ce mareste flexibilitatea executiei .
Pentru a mari performatele unei aplicatii, programatorul poate crea diferite tipuri de programe: proceduri-eveniment (in sabloanele din modulele asociate formularelor si rapoartelor), proceduri si functii VBA (in module globale sau in module independente) .
Programele aflate in module globale sau in module asociate pot fi apelate din expresii, din proceduri si functii VBA, din proceduri-eveniment si din macrocomenzi .
O metoda rapida de creare a programelor VBA consta - atunci cand este cazul - in convertirea macrocomenzilor deja create .
MS Access poate converti automat macrocomenzile (atasate unui formular / raport sau globale) in proceduri-eveniment sau in module VBA care sa execute exact aceleasi actiuni dar folosind instructiuni ale limbajului VBA .
Se procedeaza astfel:
se afiseaza formularul / raportul in modul Design View
meniul TOOLS comanda MACRO subcomanda CONVERT FORM'S MACROS TO VISUAL BASIC / CONVERT REPORT'S MACROS TO VISUAL BASIC T
se lanseaza o procedura de asistenta care realizeaza conversia .
Se procedeaza astfel:
se afiseaza fereastra DataBase tabul Macros
se selecteaza macrocomanda de convertit
meniul FILE comanda SAVE AS / EXPORT T
se afiseaza fereastra-dialog Save As
se alege butonul de comanda SAVE AS VISUAL BASIC MODULE .
Se procedeaza astfel:
se afiseaza formularul / raportul in modul Design View
dublu-clic pe selectorul formularului / raportului sau pe selectorul unei sectiuni a acestuia sau clic pe iconul Properties de pe toolbar dupa ce a fost selectat un control T se afiseaza fereastra-dialog Properties a obiectului respectiv
clic pe butonul de comanda BUILD de pe linia proprietati-eveniment dorite (de exemplu, daca trebuie creata o procedura-eveniment care sa ruleze in momentul in care este selectat un buton de comanda, atunci se actioneaza butonul BUILD de pe linia proprietatii-eveniment OnClick a butonului de comanda respectiv) T
se afiseaza fereastra-dialog Choose Builder
se alege procedura de asistenta Code Builder T
se afiseaza fereastra-dialog Module
In continuare se poate trece la introducerea codului procedurii-eveniment .
M Daca trebuie afisate toate codurile asociate formularului / raportului, deci daca trebuie vizualizat modulul asociat acestuia se alege comanda VIEW CODE .
Caseta obiectelor Caseta procedurilor
Proceduri
Se procedeaza astfel:
se deschide un nou modul, si anume:
un modul global nou: se afiseaza tabul Modules al ferestrei DataBase NEW
un modul global deja existent: se afiseaza tabul Modules al ferestrei DataBase se selecteaza modulul global DESIGN
un modul asociat: se afiseaza formularul / raportul in modul Design View iconul Code
un modul asociat deja existent: se afiseaza tabul Modules al ferestrei DataBase se selecteaza modulul asociat DESIGN
un modul independent nou: se afiseaza fereastra DataBase meniul INSERT comanda CLASS MODULE
se declara functia prin introducerea instructiunii Function
se indica numele functiei si, daca este cazul, lista de argumente intre paranteze
se introduce codul VBA care executa operatia sau calculul necesar .
Se procedeaza astfel:
se deschide un nou modul, ca si in cazul crearii unei functii
se declara procedura prin introducerea instructiunii Sub
se indica numele procedurii si, daca este cazul, lista de argumente intre paranteze (de exemplu, Sub AfiseazaEv(NumeEv As String)
se introduce codul VBA care executa operatia necesara .
Cel mai comod declansator al executiei unei secvente de cod VBA este o actiune efectuata de utilizatorul aplicatiei . Atunci cand programatorul seteaza o proprietate-eveniment a unui formular / raport sau a unui control grafic la valoarea [Event Procedure], MS Access creeaza automat un sablon de procedura-eveniment (vezi fff) . Programatorul trebuie sa afiseze acest sablon si apoi sa introduca secventa de cod menita sa efectueze operatia sau calculul necesar .
De fapt, MS Access declara automat proceduri-eveniment pentru fiecare obiect si pentru fiecare eveniment si le depune in modulul asociat formularului / raportului . Instructiunile Sub si End Sub definesc procedura-eveniment; cuvantul rezervat Private indica faptul ca procedura respectiva nu poate fi apelata decat de proceduri sau functii memorate in modulul asociat formularului / raportului respectiv .
Se procedeaza astfel:
se deschide un formular / raport in modul Design View
se afiseaza fereastra Properties a formularului / raportului sau a unei sectiuni, respectiv a unui control grafic
se activeaza tabul Event al ferestrei
se pozitioneaza punctul de insertie pe linia proprietatii-eveniment a evenimentului care trebuie sa declanseze executarea codului
se alege butonul de comanda BUILD aflat in dreapta liniei proprietatii T
se afiseaza fereastra-dialog Choose Builder (vezi fff )
se alege procedura de asistenta Code Builder T
se afiseaza fereastra-dialog Module cu un sablon de procedura-eveniment adaptat deja in functie de proprietatea setata (vezidin fff)
se introduce codul VBA dorit .
De exemplu, pentru a obtine un semnal sonor de fiecare data cand se schimba numele clientului trebuie setata proprietatea OnChange a controlului NumeClient pe valoarea [Event Procedure] iar in procedura-eveniment atasata trebuie introdusa instructiunea Beep, adica:
Private Sub NumeClient_Change()
Beep
End Sub
Procedura-eveniment se executa (apare semnalul sonor) ori de cate ori are loc evenimentul Change pentru controlul grafic respectiv .
Se procedeaza astfel:
se afiseaza BD in fereastra DataBase (eventual cu tabul Modules activat)
meniul INSERT comanda CLASS MODULE T apare un modul independent vid
se introduc toate declaratiile si programele dorite se salveaza modulul T
modulul apare prin numele sau in tabul Modules al ferestrei DataBase; pentru a-l deschide ulterior trebuie selectat si trebuie actionat butonul de comanda DESIGN .
O caracteristica importanta a aplicatiei MS Access este aceea ca - pentru prima data - utilizatorii isi pot crea propriile obiecte de care au nevoie, folosind pentru aceasta modulele independente (ele insale nou aparute la nivelul acestei versiuni a Access) .
Crearea si salvarea unui modul independent (ca in paragraful anterior) inseamna de fapt crearea unui obiect-utilizator . Numele modulului devine numele obiectului; procedurile si functiile publice memorate in modul devin metode pentru obiect . Procedurile publice Property Let, Property Get si Property Set devin proprietati ale obiectului .
Odata definit cel putin un program in modulul independent se poate crea un nou obiect prin crearea unei noi instante a tipului (clasei) . Acest lucru se face prin declararea unei variabile de tipul definit de clasa respectiva . De exemplu, daca numele modulului independent (deci al clasei) este PrimaClasa, atunci se poate crea o noua instanta a ei astfel:
Dim pc As New PrimaClasa
Atunci cand se executa codul care contine aceasta declaratie, aplicatia Visual Basic creeaza o noua instanta; utilizatorul poate folosi metodele si proprietatile acesteia (adica programele memorate in modulul independent PrimaClasa) cu ajutorul variabilei pc . De exemplu, daca modulul contine o procedura numita Sonor, atunci utilizatorul poate aplica aceasta metoda numita Sonor astfel:
pc . Sonor
Executia codului VBA in MS Access presupune executia unei proceduri sau a unei functii . Desi acestea sunt memorate in module, nu modulele se executa, ci: procedurile si functiile sunt apelate din alte proceduri, din expresii sau din macrocomenzi . Procedurile-eveniment se declanseaza la aparitia evenimentului corespunzator .
Mai exista 2 metode specifice de lansare in executie a unui program VBA:
direct din fereastra-dialog Module:
se pozitioneaza punctul de insertie in procedura care trebuie rulata
meniul RUN comanda GO/CONTINUE sau iconul Go/Continue de pe toolbar;
cu ajutorul actiunii RunCode intr-o macrocomanda:
daca programul de rulat este de tip functie, atunci numele sau poate fi transmis ca argument al actiunii; daca el este de tip procedura sau procedura-eveniment, atunci trebuie creata in prealabil o functie in care sa fie apelata procedura, dupa care numele functiei astfel create este transmis ca argument actiunii RunCode .
Prima metoda poate fi utilizata numai in cazul procedurilor care nu au lista de argumente .
Urmatorul exemplu prezinta o procedura care apeleaza functia "Nume" cu un argument: numele complet al clientului continut in controlul "NumeClient" din formularul "F_PtMacro_Consultante"; functia foloseste apoi 2 functii VBA predefinite pentru a returna numai numele de familie al clientului .
Sub AfiseazaNumele()
Dim strNume As String
strNume = Nume ("Damian Ion") 'Apeleaza functia Nume
MsgBox strNume
End Sub
Function Nume (NumeComplet As String) As String
Dim intLg As Integer
intLg = InStr$(NumeComplet, " ")
Nume = Left$(NumeComplet, intLg-1)
End Function
Unitatea fundamentala de cod VBA este instructiunea = o unitate de cod sintactic completa care exprima o actiune, o declaratie sau o definitie .
Instructiunea poate fi scrisa oriunde pe un rand si poate continua pe mai multe randuri . Ea este formata din cuvinte cheie si cuvinte utilizator . Pentru cuvintele utilizator (identificatori) sunt valabile conventiile uzuale si este ignorata diferenta intre literele mari si mici .
Pe langa blocul executabil, singurul obligatoriu in orice program VBA, mai exista blocul de declaratii care contine:
optiuni privind modul in care VBA trebuie sa execute codul;
declararea tipurilor de date user-defined;
declararea variabilelor;
declararea constantelor .
In program se pot introduce si comentarii care trebuie precedate de ' (apostrof) .
Variabilele se caracterizeaza prin: tip (optional); nume; scop (domeniu de definitie); durata de viata a valorii .
In VBA declararea variabilelor este optionala . La declarare, toate cele 4 informatii referitoare la o variabila se dau printr-o singura instructiune . VBA administreaza majoritatea declaratiilor si tipurilor automat; pentru cresterea preciziei calculelor, accelerarea executiei codului, facilitarea citirii codului se recomanda insa declararea tipului de date atat pentru variabile, cat si pentru constante .
Atunci cand programatorul decide sa declare toate variabilele utilizate in procedurile unui modul, el trebuie sa includa in sectiunea de declaratii a acestuia declaratia:
Option Explicit .
Sintaxa declararii variabilelor este, in principiu urmatoarea:
Dim nume_variabila [As tip]
O declaratie Dim poate contine mai multe tipuri de date:
Dim I As Integer, Amt As Double, Nume As String
Dim Test, J As Integer, Suma 'Test si Suma sunt de tipul Variant
Atunci cand se declara unele (toate) variabilele care vor fi utilizate, cuvantul cheie Dim trebuie inlocuit cu cuvinte cheie adecvate, menite sa indice nu numai numele variabilei, ci si tipul sau, domeniul de actiune si durata de viata a valorii sale .
Tip de date = caracteristica a unei date care determina multimea de valori pe care le poate primi . Domeniul de definitie al unei variabile (scope) = segmentul de cod VBA in care variabila poate fi referita (utilizata); domeniul de definitie al unei variabile poate fi: procedura in care variabila a fost declarata (variabila locala); toate procedurile din modulul in care a fost definita (variabila-modul); toate modulele (variabila publica) . Durata de viata a unei variabile (lifetime) = perioada in care variabila isi pastraza valoarea (valorile) i . e . nu este reinitializata .
In functie de domeniul in care vrem ca variabila sa fie definita (accesibila, utilizabila) si in functie de durata de viata pe care vrem s-o fixam pentru valorile sale, folosim unul din urmatoarele cuvinte cheie in instructiunea de declarare a variabilei:
Domeniul de definitie |
Declararea |
Local |
Dim sau Static, in interiorul procedurii |
Modul |
Dim, Static, Private, la inceputul modulului |
Public |
Public, la inceputul modulului |
Varibilele nedeclarate explicit sunt intotdeauna de tip local si nestatic .
Tipurile de date cu care lucreaza VBA sunt: tipul de date Variant, tipurile predefinite si tipurile definite de utilizator .
Tipul VARIANT
Implicit, tipul oricarei date nedeclarate este tipul Variant . Acest tip de date poate contine orice feluri de valori: numere, siruri de caractere, date calendaristice, momente de timp, imagini etc . O data nedeclarata explicit, deci de tip Variant, poate sa contina diferite tipuri de valori (numere, siruri de caractere, date calendaristice, momente de timp etc . ) chiar pe parcursul aceleiasi executii . Variabilele Variant seamana cu celulele foii de date Excel: tipul lor de date depinde de ultima valoare pe care au primit-o .
Variabilele Variant sunt comode pentru ca permit programatorului sa se concentreze asupra algoritmului . Utilizarea lor consuma insa mult timp de lucru (verificarea permanenta a tipului) si multa memorie (o data de tip Variant ocupa 16 bytes + 1 byte pentru fiecare caracter) . In plus, combinate cu diversi operatori pot produce rezultate greu de urmarit .
Variabilele Variant pot contine adrese de obiecte (pot referi obiecte) . O variabila Variant independenta poate contine un tablou de valori . Tabloul poate contine variabile Variant sau de alt tip . Varibilele Variant nu pot contine date de tipul user-defined sau tablouri care contin date de tip user-defined .
Variabilele Variant pot lua 2 valori speciale, Empty si Null, si pot admite un subtip, tipul de date Error .
Variabilele Variant nu trebuie declarate explicit; pana in momentul in care li se atribuie o valoare ele primesc implicit valoarea Empty . Valoarea Empty difera de valoarea 0, "" (sirul vid), Null . Ea dispare imediat ce variabila Variant respectiva primeste o valoare oarecare (inclusiv valorile 0, "", Null) . Putem reseta variabila respectiva pe Empty cu o instructiune de atribuire in care in membrul drept apare o alta variabila Variant careia nu i s-a atribuit inca o valoare sau cuvantul cheie Empty . Putem verifica daca o variabila Variant contine valoarea Empty cu functia de tip logic IsEmpty:
If IsEmpty(x) Then x = 0
If IsEmpty(Cells(1, 1) . Value) Then Cells(1, 1) . Value = 0
Valoarea Null este extensiv utilizata in aplicatiile BD pentru a indica date necunoscute sau lipsa . Datorita modului in care e folosita in BD, valoarea Null are urmatoarele caracteristici:
se propaga in expresii: (expresiile care contin Null se seteaza pe Null);
daca o parte a expresiei se evalueaza la Null, atunci toata expresia se evalueaza la Null;
transmiterea valorii Null, a unei variabile Variant continand valoarea Null sau a unei expresii care se evalueaza la Null ca parametru actual pentru o functie determina setarea ei pe Null;
Null se propaga prin functiile predefinite care returneaza date de tip Variant .
Atribuirea valorii Null se face printr-o instructiune de atribuire obisnuita si cu ajutorul cuvantului cheie Null (variabilele Variant nu se seteaza implicit pe Null) . Putem verifica prezenta valorii Null cu ajutorul functiei logice IsNull:
If IsNull(x) and IsNull Then
z = Null
Else
z = 0
End If
Tipuri de date predefinite
VBA ofera urmatoarele tipuri de date predefinite:
Tipul de date |
Dimensiune |
Multimea de valori |
Boolean |
2 bytes |
True, False |
Integer |
2 bytes | |
Long (long integer) |
4 bytes | |
Single (single precision floating point) |
4 bytes |
[-3 . 402823E38; -1 . 401298E-45] [1 . 401298E-45; 3 . 402823E38] |
Double (double precision floating point) |
8 bytes |
[-1 . 79E308; -4 . 94E-324] [4 . 94E-324; 1 . 79E308] |
Currency (scaled integer) |
8 bytes | |
Date |
8 bytes | |
String |
1 byte per char . | |
Object |
4 bytes |
Orice adresa de Obiect |
Byte |
1 byte |
Tipul de date DATE
VBA administreaza datele calendaristice si momentele de timp astfel:
Literalii de tip data calendaristica trebuie inclusi intre semnele # (de exemplu, #2/25/95#, #3-6-96 13:30#)
Continutul variabilelor de tip Date este afisat in functie de formatul de data si timp adoptat de propriul sistem de calcul .
Cand datele numerice sunt convertite in date calendaristice sau momente de timp, valorile aflate la stanga punctului zecimal reprezinta date, iar cele din dreapta momente de timp . Numerele intregi negative reprezinta date calendaristice anterioare lui 31 Decembrie 1899 .
Se pot face operatii matematice cu variabile Date .
Tipul de date STRING
VBA ofera doua tipuri de stringuri: de lungime fixa si de lungime variabila .
Sintaxa: String *lungime
String
unde: lungime este o
Exemplu: Dim sir1 As String * 50
Dim sir2 As String
Urmatoarele functii sunt utile in administrarea sirurilor:
LTrim, RTrim, Trim returneaza o copie a sirului primit ca argument care nu mai contine insa spatiile aflate la stanga/ dreapta / stanga si dreapta .
Sintaxa: Ltrim(sir) Rtrim(sir) Trim(sir)
unde: sir este orice expresie de tip String valida . Daca sir nu contine date valide, atunci functia respectiva returneaza sirul vid Null .
MyString = ' <-Trim-> ' ' Initializeaza .
TrimString = LTrim(MyString) ' TrimString = '<-Trim-> ' .
TrimString = RTrim(MyString) ' TrimString = ' <-Trim->' .
TrimString = LTrim(RTrim(MyString)) ' TrimString = '<-Trim->' .
Urmatoarele 2 optiuni VBA, Option Compare Binary si Option Compare Text, determina rezultatul comparatiei litera cu litera intre 2 siruri, intre un sir si o variabila Variant, respectiv intre 2 variabile Variant care contin siruri .
Implicit, VBA lucreaza cu Option Compare Binary; in acest caz compararea caracter cu caracter se bazeaza pe ordinea indusa de reprezentarea binara interna a caracterelor . Daca specificam explicit cealalta optiune, Option Compare Text, atunci compararea caracter cu caracter se bazeaza pe ordinea (case-intensitive textual sort) proprie sistemului de calcul respectiv .
Tipul de date OBJECT; Obiecte in MS Access
Aplicatia MS Access pune la dispozitia utitlizatorilor un set de obiecte pe care acestia le pot folosi in construirea propriei aplicatii . Se poate spune ca metodele (functii si proceduri) pe care aceste obiecte le contin constituie o extindere a instructiunilor sistemului . In proceduri se pot declara variabile de tipul unora dintre aceste obiecte si se pot folosi aceste variabile pentru gestiunea obiectelor .
Exista doua tipuri de obiecte:
obiecte MsAccess Application, Control, Debug, Form, Module, Report, Screen, Section;
obiecte cu sarcini de gestiune a datelor intr-o aplicatie si care se numesc obiecte de acces la date . Cu ajutorul acestor obiecte se pot crea si manipula componente din baza de date proprie . Obiectele de acest tip sunt: Container, Database, Dbengine, Document, Field, Group, Index, Parameter, Property, RecordSet, Relation, QueryDef, TableDef, User, WorkSpace .
O multime de obiecte de acelasi tip formeaza o colectie de obiecte . Astfel, MS Access contine colectia Forms a tuturor formularelor deschise, colectia Reports a tuturor rapoartelor deschise etc . Fiecare formular sau raport contine colectia Sections a tuturor sectiunilor si colectia Controls a tuturor controalelor formularului sau raportului .
Colectia poate fi privita in doua moduri:
ca o multime de obiecte: fiecare obiect este membru al colectiei si are un nume unic (deci poate fi identificat) . Fiecare colectie are proprietatea Count - care precizeaza numarul de membri din colectie . Pe langa nume, fiecare obiect poate fi referit si prin indexul lui in cadrul colectiei (0, 1, . , Count-1)
ca un obiect al bazei de date: care are proprietati si metode proprii
In continuare vom da o scurta descriere a obiectelor amintite mai sus, precizandu-se cele care au colectii:
Application: intreaga aplicatie Access
Container: informatii despre o baza de date si fiecare obiect din ea; colectia Container
Control: un control dintr-un formular / raport
Database: o baza de carte deschisa; colectia Databases
Dbengine: controleaza obiectele de acces la date
Debug: o instanta a depanarii in VBA
Document: informatii despre o instanta a unui obiect dintr-o BD; colectia Documents
Field: o coloana intr-un tabel, interogare, recordset, index, relatie; colectia Fields
Form: un formular din BD; colectia Forms
Group: un grup de utilizatori acceptati pentru o baza de date; colectia Groups
Index: un index construit pentru un tabel; colectia Indexes
Parameter: un parametru dintr-o interogare; colectia Parameters
Property: o proprietate a unui obiect; colectia Properties
Querydef: o interogare dintr-o BD; colectia QueryDefs
RecordSet: multimea inregistrarilor dintr-un tabel sau interogare
Relation: o relatie intre campuri din tabele sau interogari; colectia Relations
Report: un raport din BD; colectia Reports
Screen: un formular, un raport sau un control
TableDef: un tabel dintr-o BD; colectia TableDefs
User: un utilizator acceptat pentru baza de date; colectia Users
Workspace: sesiunea curenta de lucru; colectia Workspaces .
Programarea in limbajul VBA se bazeaza, in principal, pe gestiunea diferitelor obiecte impreuna cu colectiile de date asociate . Unele obiecte contin alte obiecte, intre care exista o ierarhie . In partea superioara a ierarhiei de obiecte se afla un gestionar de obiecte (Jet Database Engine) .
Pentru a preciza caracteristicile unui obiect se folosesc proprietatile lui, iar pentru a descrie comportarea lui se folosesc metodele acestuia . Referirea la un obiect se face intr-unul din urmatoarele moduri:
identificator ! [nume_obiect] - numele obiectului ca membru intr-o colectie precizata de un identificator . Parantezele drepte sunt obligatorii daca numele obiectului include spatii sau semne de punctuatie;
identificator ! ("nume_obiect") - apare explicit numele obiectului ca membru al unei colectii;
identificator (index) - pozitia obiectului in colectie .
Exista variabile_obiect care au un tip_obiect de baza . Declararea lor se poate face cu instructiunile Dim, Static sau Global (nu este insa permisa declararea tablourilor de obiecte, lucru care se poate realiza in Visual Basic; de asemenea, obiectele nu se pot folosi la definirea tipurilor de date create de utilizator) . Domeniul variabilelor de tip obiect se deduce, la fel cum se deduce domeniul celorlalte variabile . Obiectele care se pot folosi pentru declararea variabilelor sunt:
obiecte Microsoft Access: Control, Form, Report;
obiecte de acces: Container, PropertyDatabase, QueryDef Document, RecordSetField, RelationGroup, TableDefIndex, UserParameter, Workspace .
O variabila poate memora valori sau poate contine adresa unui obiect (poate referi un obiect) . Se atribuie un obiect unei variabile la fel cum se atribuie o valoare unei variabile (pe parcursul executiei, un alt obiect poate fi oricand atribuit variabilei etc) si din acelasi motiv: pentru a facilita executia si intelegerea codului . Putem atribui orice obiect recunoscut de aplicatia respectiva nu numai variabilelor de tipul Object ci si celor de tipul Variant . Pentru accelerarea executiei (se efectueaza automat verificari de tip, etc) este recomandabil sa se declare tipuri de obiecte specifice mai degraba decat tipul general Object .
Sintaxa de declarare este aceeasi, variabilele de tip Object putandu-se referi:
la orice obiect VBA;
la un anume tip de obiect Access;
la orice obiect de automatizare a legarii si scufundarii obiectelor (object linking and embedding (OLE) automation object) .
Sintaxa instructiunii de atribuire prin care se asigneaza obiecte variabilelor de tip Object sau Variant este urmatoarea:
Set variabila = referire la un obiect
Dupa semnul "=" din instructiune poate aparea o alta variabila (cu acelasi tip de baza) sau un anumit obiect . Prin aceasta instructiune nu se creeaza o noua copie a obiectului precizat de referirea de dupa "=", variabila din partea stanga va face referire la acelasi obiect, deci orice modificare in obiect se va reflecta in toate variabilele ce fac referire la acel obiect . De aici se deduce ca aceasta atribuire este diferita de cea pentru variabilele obisnuite .
Dupa ce o variabila a fost declarata de un tip obiect iar prin instructiunea Set i s-a asociat un obiect existent, ea se poate folosi ca obiectul echivalent: se pot determina valorile proprietatilor sale si se pot modifica aceste proprietati, se pot executa metodele obiectului . In plus, se poate determina tipul variabilei se pot compara doua variabile .
Exemplu:
Dim a As Form, b As Form
Set a = Forms("calculator")
Set b = a
a . caption = "Calculator nou"
Dupa aceste instructiuni, b . caption va avea aceeasi valoare ca a . caption, cu toate ca modificarea proprietatii caption pentru variabila a s-a facut dupa instructiunea:
Set b = a
Tablouri dinamice
VBA permite crearea unor tablouri dinamice, atunci cand la scrierea codului dimensiunile acestora nu pot fi apreciate, astfel incat acestea trebuie sa se poata modifica pe parcursul rularii codului .
Aceste tablouri se declara cu instructiunile Dim sau Global in sectiunea de declaratii a unui modul; lista dimensiunilor tabloului trebuie sa fie vida . Sintaxa este:
Dim nume_tablou() As tip
Pentru ca un tablou astfel declarat sa poata fi utilizat el trebuie redeclarat cu dimensiuni fixe in cadrul unei proceduri din modulul respectiv . Sintaxa este:
ReDim [Preserve] nume_tablou(index) [As Type] [, nume_tablou(index) [As Type]]
unde: indexarea se face astfel:
[valinf To] valsup [, [valinf To] To valsup]
Observatii
q Pentru tablourile dinamice nu se pot folosi tipuri de date definite de utilizator .
q Tablourile dinamice pot avea maximum 8 dimensiuni .
q Redeclararea se poate face oriunde in cadrul unei proceduri, nu numai in sectiunea de declaratii .
q Evident, instructiunea ReDim poate aparea numai la nivelul unei proceduri si ea este cea care aloca si realoca memorie pentru tablou .
q O instructiune ReDim poate fi repetat utilizata pe acelasi tablou; ea ii poate schimba numai numarul de variante, nu si tipul de date pe care il contine (exceptie: initial, tabloul continea date Variant) .
q Spre deosebire de Dim si Static, instructiunea Redim este executabila (face aplicatia sa execute o actiune atunci cand ruleaza codul respectiv) .
q Fiecare instructiune ReDim poate schimba numarul de elemente, limita inferioara si limita superioara a fiecarei dimensiuni .
Accesarea unei componente dintr-un tablou dinamic se face similar cu accesarea componentelor tablourilor de dimensiune fixa .
La fiecare executie a instructiunii ReDim, toate valorile memorate in tabloul respectiv sunt distruse . VBA reseteaza tablourile dinamice de tip Variant pe Empty, pe cele numerice pe 0, pe cele de tip String pe cuvantul de lungime 0 si pe cele de tip Object pe Nothing .
Exemplu:
Dim DynamicArray()
ReDim DynamicArray(X+1)
unde X este o variabila ale carei valori sunt determinate pe parcursul rularii procedurii; rolul ei este de a modifica numarul maxim de elemente ale tabloului declarat anterior .
Daca tabloul trebuie sa fie dinamic dar pe de alta parte datele depuse in el nu trebuie distruse, VBA permite folosirea instructiunii Redim cu parametrul Preserve . De exemplu, putem mari un tablou adaugandu-i 10 elemente fara a pierde valorile existente, astfel:
ReDim Preserve Mat2(10, UBound(Mat2, 2) + 1)
Cand se foloseste Preserve se poate modifica numai limita superioara a ultimei dimensiuni a tabloului; daca incercam sa modificam limita inferioara sau o alta dimensiune apare o eroare de executie .
Dim MyArray() As Integer ' Declaram un tablou dinamic .
ReDim MyArray(5) ' Alocam 5 elemente .
For I = 1 To 5 ' cicleaza de 5 ori .
MyArray(I) = I ' Initializeaza tabloul .
Next I
' Acum redimensionam tabloul si-i resetam elementele
ReDim MyArray(10) ' Acum MyArray are 10 elemente .
For I = 1 To 10 ' Cicleaza de 10 ori .
MyArray(I) = I ' Initializeaza tabloul .
Next I
'Acum redimensionam tabloul fara a-i sterge elementele deja introduse
ReDim Preserve MyArray(15) ' Redim la 15 elemente .
Tipul de date definit de utilizator (user-defined)
Putem combina diverse tipuri de date intr-un tip nou, numit user-defined, in functie de necesitatile problemei de rezolvat . Acest tip de date VBA seamana cu tipul record din Pascal (struct din C) . Ca urmare, o singura variabila poate contine mai multe date de diferite tipuri .
Sintaxa este:
Type nume_tip
nume_camp_1 As tip_1
.
nume_camp_n As tip_n
End Type
unde: Type este instructiunea cu care se creeaza tipul user-defined;
nume_tip este numele dat de utilizator noului tip de data;
nume_camp_i este numele dat de utilizator celui de-al i-lea camp din structura iar tip_i este tipul de data pe care il va contine acest camp, si care poate fi oricare din tipurile de date Access cu exceptia tipului Object (pentru crearea de noi obiecte se utilizeaza modulele independente) .
Tipurile user-defined sunt intotdeauna publice (instructiunea Type trebuie plasata la inceputul modulului); totusi, variabilele de acest tip pot fi publice, la nivelul modulului sau locale, dupa cum sunt declarate . Dimensiunea maxima a unei inregistrari de tip user-defined nu poate depasi 65 . 535 bytes .
Declararea variabilelor de tipul user-defined, atribuirea de valori elementelor acestor tipuri si returnarea de valori prin aceste elemente, asignarea unei variabile de tipul user-defined la alta de acelasi tip user-defined se produc absolut la fel ca in cazul tipurilor predefinite . De asemenea, parametrii unei functii / proceduri pot fi de tip user-defined; intotdeauna ei sunt transmisi prin referinta, nu prin valoare, deci modificarile operate de procedura apelata sunt vizibile pentru procedura care apeleaza .
Exemplu: 'Declaratii
Type InfoSistem
CPU As Variant
Memorie As Long
CuloriVideo As Integer
Cost As Currency
DataCump As Variant
EndType
Dim Computer As InfoSistem, Calculator As InfoSistem
Computer . CPU = "486"
If Computer . DataCump > #1/1/96# Then Computer = Calculator
Sunt:
instructiunea de atribuire a unei valori, cu sintaxa: variabila = expresie
instructiunea de setare a unei proprietati, cu sintaxa obiect . proprietate = expresie
instructiunea de aplicare a unei metode asupra unui obiect . obiect . metoda lista_arg
Operatori
Exista 4 clase de operatori:
aritmetici: ^ - * / Mod + -
de concatenare: & (operatorul text)
relationali: =, <>, <, >, <=, >= Like (operator de similaritate) Is (operator de echivalenta),
logici: Not, And, Or, Xor, Eqv, Imp (echivalenta si implicatia logica)
Ordinea de prioritate a operatorilor (modificabila cu paranteze) este cea a enumerarii lor .
Operatorii Not, And, Or sunt similari functiilor predefinite Not, And, Or, dar sintaxa lor este alta: ca de la operator la functie . Operatorii Xor, Eqv, Imp sunt definiti numai in VBA si nu sunt accesibili direct in BD . Daca sunt utilizati frecvent, trebuie scrise functii-utilizator pentru implementarea lor:
Function XorFunction(arg1 As Boolean, arg2 As Boolean) As Boolean
XorFunction = arg1 Xor arg2
End Function
Operatorul de similaritate Like (pattern-matching operator) compara 2 siruri si are sintaxa:
rezultat = expr_sir Like sablon
unde: sablon este un text care poate aparea in interiorul sirului la care se evalueaza expresia de tip sir si care poate include si specificatori multipli;
rezultat contine valorile: True, daca sirul corespunde sablonului,
False, daca sirul nu corespunde sablonului,
Null, daca fie exp_sir, fie sablonul sunt Null
Ordinea utilizata pentru comparare este cea stabilita prin optiunea Compare; implicit se lucreaza cu Option Compare Binary, adica ordinea contextuala (case-sensitive) .
Operatorul Is verifica daca 2 variabile refera (indica) acelasi obiect; el nu compara obiecte sau valorile lor, ci verifica daca 2 adrese de obiecte indica acelasi obiect . Are sintaxa: rezultat = obiect1 Is obiect2
unde: rezultat poate lua valorile logice True (obiectele se zic logic echivalente) sau False . Variabilele-obiect pot fi de tip Variant sau Object (general sau un obiect anume: Control etc . ) .
Toate variabile de tip numeric se pot asigna unele altora si variabilelor de tip Variant . VBA rotunjeste nu trunchieaza valorile variabilelor reale, inainte de a le atribui unor variabile intregi .
Operatorul de concatenare cel mai sigur este & (utilizarea lui + poate conduce la adunarea valorilor variabilelor, daca cel putin una este numerica) . La scrierea lui, trebuie lasate spatii in fata si in spatele operatorului, altfel el poate fi privit ca mod de declarare a tipului Long pentru prima variabila .
Atribuirea variabilelor de tip Object
Variabilele de tip Object seamna cu variabile Pointer din Pascal: sunt de fapt adrese ce ocupa 32 bits . Ele nu contin insa doar adrese de memorie unde se afla alte variabile, ci contin si referiri la alte obiecteVBA .
Asignarea unui obiect VBA unei variabile Variant sau unei variabile Object se face nu cu semnul = ci cu cuvantul cheie Set . Instructiunea Set initializeaza acesti pointeri cu adrese de memorie ale obiectelor deja definite (actuale) ale aplicatiei .
Sintaxa este:
Set nume_variabila_Object = [expresie de tip Object VBA | Nothing}
O variabila Object poate
primi ca valoare fie valoarea rezultata din evaluarea unei expresii de tip Object, fie
Utilizatorul nu trebuie sa se preocupe in mod special de eliberarea memoriei rezervate variabilelor Object . VBA face acest lucru automat .
Structura conditionala
VBA ofera 3 tipuri de instructiuni conditionale:
If Then
IfThenElse
Select Case
Sintaxa instructiunii If Then
If Conditie Then i0
sau
If conditie Then
i1
i2
in
End If
unde: conditie este o expresie numerica sau literala care se evalueaza pe True sau False;
i0 poate fi o singura instructiune sau o secventa de instructiuni separate prin : (doua puncte) . De remarcat ca aceasta scriere este recomandata numai pentru instructiuni simple .
Exemple:
If OriceData < Now Then OriceData = Now
If OriceData < Now Then
OriceData = Now
MsgBox "azi este " & OriceData
End If
IF a > 10 THEN a = a + 1: b = b + a: c = c + b
Sintaxa instructiunii IfThenElse
If conditie Then
i1
i2
in
Else
j1
j2
jn
End If
Cu aceasta instructiune si cu ajutorul instructiunii Elseif se pot realiza teste imbricate . Sintaxa va fi atunci:
If conditie1 Then
i1
Elseif conditie2 Then
i2
Else
in
End If
unde in loc de cate o instructiune putem avea secvente de instructiuni .
Sa presupunem ca procentul de premiere a angajatilor unei firme se calculeaza diferentiat in functie de grupa de salarizare a fiecarui angajat . Atunci el poate fi calculat astfel:
Function Bonus(CatSalarizare, Salariu, Rata)
IF CatSalarizare = 1 Then
Bonus = Salariu * 0 . 1 * Rata / 10
Elseif CatSalarizare = 2 Then
Bonus = Salariu * 0 . 09 * Rata / 10
Elseif CatSalarizare = 3 Then
Bonus = Salariu * 0 . 07 * Rata / 10
Else
Bonus = 0
End If
End Function
Sintaxa instructiunii Select Case
Select Case expresie conditionala
Case lista1_valori_conditie
bloc1_instructiuni
Case lista2_valori_conditie
bloc2_instructiuni
.
Case Else
blocn_instructiuni
End Select
unde lista_valori_conditie poate avea una din formele: v0
v1, v2, v3, v4, v5
expr1 to expr2
Is operator_relational expresie
O structura Select Case lucreaza cu o singura expresie pe care o evalueaza o singura data la "inceputul" structurii; apoi compara acest rezultat al evaluarii cu fiecare lista Case de valori; daca intalneste o coincidenta, atunci executa instructiunea sau blocul de instructiuni asociat acelei liste Case; daca nu gaseste nici o coincidenta, atunci executa instructiunile din blocul Case Else . Daca exista mai multe coincidente (cu valori din mai multe liste), atunci se executa numai blocul de instructiuni asociat primului Case care corespunde .
Structura Select Case evalueaza o singura expresie o singura data la "inceputul" structurii . Dimpotriva, structura IfThenElseif poate evalua diferite expresii conditionale, cate una pentru . fiecare instructiune Elseif . Prin urmare, nu intotdeauna aceste structuri pot fi interschimbate .
VBA ofera structura Case ca o alternativa mai usor inteligibila a structurii If Elseif pentru rezolvarea cazurilor in care o aceeasi expresie trebuie comparata cu mai multe valori posibile . Astfel, pentru problema de mai sus se poate da o solutie chiar pentru mai multe categorii de salarizare:
Function Bonus(CatSalarizare, Salariu, Rata)
Select Case CatSalarizare
Case 1
Bonus = Salariu * 0 . 1 * Rata / 10
Case 2
Bonus = Salariu * 0 . 09 * Rata / 10
Case 3
Bonus = Salariu * 0 . 07 * Rata / 10
Case 4, 5 'lista poate contine mai multe valori
Bonus = Salariu * 0 . 05 * Rata / 10
Case 6 TO 8 'lista poate consta dintr-un domeniu de valori
Bonus =150
Case Is > 8 'lista poate rezulta din compararea cu alte valori
Bonus = 100
Case Else
Bonus = 0
End Select
End Function
Structura iterativa
VBA ofera 3 tipuri de instructiuni iterative:
Do
DoLoop While
Do
Until
DoLoop Until
ForNext
For EachNext
WhileWend
Sintaxa instructiunii DoLoop
Do conditie
cod VBA
[Exit Do]
cod VBA
sau
Do
cod VBA
[Exit Do]
cod VBA
Loop conditie
unde: codul VBA se executa cel mult o data, si anume atat timp cat conditia este adevarata | pana cand conditia devine adevarata;
respectiv: codul VBA se executa cel putin o data, si anume atat timp cat conditia este adevarata | pana cand conditia devine adevarata;
Intr-o bucla Do pot aparea oricate instructiuni Exit Do, oriunde; in principiu ele sunt asociate cu una din alternativele unei instructiuni si permit parasirea fortata a buclei; in acest caz controlul este transferat primei instructiuni care apare dupa instructiunea Loop, in particular buclei in care este inclusa bucla data .
Exemplu: Urmatoarea functie numara aparitiile unui sir dat in interiorul unei secvente date, cicland atat timp cat secventa apare iar suprasecventa nu s-a sfarsit .
Function Numara Sir(Secventa, Sir))
pozitie = 1
Do While InStr(pozitie, secventa, sir)
'intoarce o valoare numerica care insa, convertindu-se in True/False, poate guverna un ciclu Do
pozitie = InStr(pozitie, secventa, sir) + 1
contor = contor + 1
NumaraSir = contor
End Function
Daca sirul dat nu apare deloc in secventa, atunci functia predefinita InStr intoarce 0 si ciclul nu se executa deloc .
Functia de siruri InStr intoarce o valoare numerica reprezentand pozitia la care gaseste sirul cautat in secventa data, si are sintaxa:
SearchString ='XXpXXpXXPXXP' ' Secventa in care se cauta
SearchChar = 'P' ' Secventa cautata este "P"
O comparare TEXTUALA incepe cu pozitia 4 si intoarce 6
MyPos = InStr (4, SearchString, SearchChar, 1)
Exemplul urmator trateaza imbricarea ciclurilor: ciclul interior se executa de 10 ori, seteaza variabila-semafor pe False si iese fortat in ciclul exterior prin Exit Do
Check = True: Counter = 0 ' Initializeaza variablele .
Do ' Ciclul exterior .
Do While Counter < 20 'Ciclul interior .
Counter = Counter + 1
If Counter = 10 Then
Check = False
Exit Do 'Iesire fortata din ciclul interior
End If
Loop Until Check = False
Sintaxa instructiunii ForNext
For contor = primaval To ultimaval [Step pas]
cod VBA
[Exit For]
cod VBA
Next [contor]
unde: contor, primaval, ultimaval, si step sunt expresii numerice, nu neaparat pozitive; implicit pas=1; Exit For are o semnificatie similara cu Exit Do .
In exemplul urmator procedura executa un numar dat de beep-uri
Sub MultipluBeep()
NrBeep = Inputbox('Cate beep-uri?')
For contor = 1 To NrBeep
Beep
Next contor
End Sub
Urmatoarea procedura este mai flexibila: valin, valfin si pasul sunt date prin variabile; ea anuleaza elementele tabloului DomElib din 2 in 2:
Sub ZeroInDomeniu (Byref DomElib())
For i = LBound(DomElib) To UBound(DomElib) Step 2
DomElib(i) = 0
Next i
End Sub
Sintaxa instructiunii For Each Next
For Each element In grup
cod VBA
[Exit For]
cod VBA
Next [contor]
unde: element este o variabila folosita pentru a "parcurge" componentele unui tablou sau unei multimi; in primul caz, element poate fi o variabila numai de tipul Variant, in al doilea caz poate fi de tip Variant sau Object;
grup este numele unui tablou sau al unei colectii de obiecte (dar nu un tablou de date de tip user-defined, pentru ca o variabila Variant nu poate contine o variabila user-defined)
codul VBA este o secventa de instructiuni care se excuta pentru fiecare componenta din grup .
Aceasta instructiune permite executia repetata a unei secvente de instructiuni pentru fiecare obiect dintr-o colectie . Secventa de instructiuni se executa daca exista cel putin un element in grup . Odata inceputa bucla, ea se executa integral pentru primul element din colectie si se reia apoi pentru fiecare element ramas .
Procedura din exemplul urmator mareste cu o unitate valorile aflate in controalele din domeniul preselectat
Sub MaresteSelectiaCurenta()
Set DomDeMarit = Selection
For Each C In DomDeMarit
If Isnumeric(C . Value) Then
C . Value = C . i + 1
End If
Next C
End Sub
Sintaxa instructiunii While Wend
While conditie
cod VBA
Wend
Este structura analoga lui For EachNext pentru cazul cand numarul de pasi de ciclare (nr de obiecte din colectie) nu este dinainte cunoscut .
[Private] [Static] Function nume_functie (lista_de_argumente) [As tip]
cod VBA
End Function
[Private] [Static] Sub nume_procedura (lista_de_argumente)
cod VBA
End Sub
Specificarea tipului de date al argumentelor procedurilor si tipului functiilor
Argumentele-parametri-actuali din apelul procedurilor si functiilor utilizator se comporta ca orice variabila: implicit au tipul Variant, explicit pot capata orice tip perdefinit sau definit de utilizator (in exemplul de mai jos: variabilele s si n sunt declarate explicit) .
Pentru a face ca VBA sa lucreze mai eficient cu functiile-utilizator, este indicat sa se declare tipul de date al functiei create, adica tipul de date al variabilei care returneaza rezultatul executarii functiei (in exemplul de mai jos, tipul lui Reverse este String) .
Function Reverse(s As String, n As Integer) As String
'Afiseaza in ordine inversa primele n caractere din sirul s
Dim temp As String, i As Integer
If n > Len(s) Then n = Len(s)
For i = n To 1 Step -1
temp = temp & Mid(s, i, 1)
Next i
Reverse = temp & Right(s, Len(s) - n)
End Function
Cu apelul: Reverse("Doar un test"; 4) intr-o formula sau intr-o macrocomanda obtinem: raoD un test
q In lista de argumente a unei proceduri pot aparea si variabile de tip Object; ele se comporta exact ca variabilele Object obisnuite .
q Textul intors de o functie utilizator nu poate depasi lungimea de 255 de caractere .
Transmiterea argumentelor catre functii si proceduri
Argumentele procedurilor si functiilor pot fi transmise prin referinta sau prin valoare .
In primul caz (modul de lucru implicit al VBA) modificarile efectuate asupra valorilor argumentelor de catre proceduri sunt vizibile pentru procedura apelanta . In acest mod trebuie transmise argumentele care reprezinta date de iesire sau de intrare-iesire pentru procedura apelata . In al doilea caz, modificarile efectuate asupra valorilor variabilei sunt invizibile pentru procedura apelanta (VBA creeaza o copie a variabilei pentru ca una sa fie utilizata de procedura apelata si alta de procedura apelanta) . In acest fel trebuie transmise argumentele care reprezinta date de intrare pentru procedura apelata .
Sintaxa: transmiterea prin referinta: [ByRef] nume_var As tip
transmiterea prin valoare: ByVal nume_var As tip
In principiu, functiile VBA intorc valori in ce timp procedurile VBA executa actiuni; transmiterea unui argument prin referinta unei proceduri de tip Sub o face sa se comporte ca o functie VBA pentru ca ii permite sa intoarca o valoare in procedura apelanta .
Transmiterea valorilor prin argumente cu nume
VBA ofera posibilitatea de a folosi in majoritatea functiilor predefinite, procedurilor utilizator, instructiunilor si metodelor, argumente cu nume - care elimina necesitatea de a transmite un numar mare de argumente . Un argument cu nume este un nume de argument recunoscut de VBA (din sintaxa functiei, instructiunii, metodei etc) . Ca urmare, in loc de a transmite cate o valoare pentru fiecare argument al functiei, metodei, instructiunii etc, in ordinea stabilita de sintaxa, se transmit valori numai pentru argumentele alese (este permisa numai omiterea argumentelor optionale), indicand si numele acestor argumente si valorile care li se atribuie .
De exemplu, metoda ApplyNames are urmatoarele 7 argumente:
object . ApplyNames(names, ignoreRelativeAbsolute, useRowColumnNames, omitColumn, omitRow, order, appendLast)
Daca se aplica numele "Sales" unui set de controale din formular cu metoda ApplyNames cu argumente fara nume, se foloseste urmatoarea sintaxa:
Set NameRef = Forms!("Produse") . Controls("1:3")
NameRef . ApplyNames "Sales", , , , , , True
Daca se aplica numele "Sales" aceluiasi set de controale cu metoda ApplyNames cu argumente cu nume, se foloseste urmatoarea sintaxa:
Set NameRef = Forms!("Produse") . Controls("1:3")
NameRef . ApplyNames appendLast:=True, names:="Sales"
Prin urmare, daca se transmit valorile actuale cu nume, se pot transmite toate argumentele sau numai unele dintre ele (aici: 2 argumente); se vor indica numele argumentului si valoarea sa, separate de operatorul de atribuire := (aici appendLast si names); vor fi separate prin virgule si vor putea fi enumerate in orice ordine .
Crearea procedurilor cu parametri optionali
Se poate indica faptul ca parametrii unei proceduri sunt optionali plasand cuvantul-cheie Optional in fata argumentului . Argumentele optionale trebuie sa fie de tipul Variant .
Toate argumentele care urmeaza in lista de argumente unui argument optional trebuie declarate ca optionale .
Se poate testa un argument optional cu functia IsMissing .
Function Reverse(S As String, Optional ByVal n As Integer)
'rastoarna primele n caractere din S;
'daca n este omis, le rastoarna pe toate
Dim Temp As String, I As Integer
If IsMissing(n) Then n = Len(S)
If n > Len(S) Then n = Len(S)
For I = n To 1 Step -1
Temp = Temp & Mid(S, i, 1)
Next
Reverse = Temp & Right(S, Len(S) - n)
End Function
Crearea unei proceduri cu numar nedeterminat de argumente
Sum, Average, Median etc sunt functii predefinite care accepta orice numar de argumente . Analog, pot fi create functii-utilizator care sa accepte orice numar de argumente de tipul Variant: in fata argumentului care poate contine el insusi o lista de argumente de lungime nedefinita se pune cuvantul cheie ParamArray . Pentru a accesa o componenta a acestui argument folosim un index si instructiunea For EachNext .
Limita inferioara a unui vector ParamArray (cu baza 0 sau 1) este determinata de baza cu care lucreaza modulul VBA (vezi Option Base 1) . De exemplu:
Function MyMultinomial (ParamArray Nr())
'intoarce raportul dintre factorialul sumei si produsul factorialelor
'(n1 + n2 + )! / (n1! + n2! +)
For Each x In Nr
s = s + x
Next x
Numarator = Application . Fact(s)
Numitor = 1
For Each x In Nr
numitor = numitor * Application . Fact(x)
Next x
MyMultinomial = numarator / numitor
End Function
Crearea functiilor utilizator care se recalculeaza automat
Sintaxa este:
obiect . Volatile(volatile)
unde: obiect este argument obligatoriu si indica obiectul asupra caruia actioneaza declaratia;
volatile este optional; daca este omis sau True functia este marcata ca volatila; daca este False atunci functia este marcata ca nevolatila .
In exemplul de mai jos, functia-utilizator MyFunc este declarata volatila; ca urmare, functia va fi recalculata ori de cate ori se face un calcul intr-un control al formularului in care este folosita functia (o functie nevolatila este recalculata numai cand propriile ei date de intrare sunt modificate) .
Function My_Func()
Application . Volatile
'codul VBA al functiei
End Function
Cu urmatoarea instructiune se poate executa o actiune direct in VBA, fara a trebui sa fie inclusa intr-o macrocomanda:
DoCmd nume_actiune [lista_de_argumente]
Exceptie fac urmatoarele actiuni:
AddMenu (nu exista o instructiune echivalenta);
MsgBox (exista si o instructiune si o functie echivalenta);
RunApp (exista functia echivalenta Shell);
RunCode (se poate folosi executia unei proceduri);
SetValue (exista instructiunea echivalenta de atribuire);
StopAllMacros;
StopMacro .
Rezumat
Subiecte
Programele VBA sunt de 2 tipuri: proceduri si functii . Procedurile efectueaza actiuni sau calcule dar nu returneaza valori; functiile pot sau nu sa efectueze o actiune dar intorc intotdeauna o valoare . Atat procedurile cat si functiile pot sau nu sa aiba argumente .
Procedurile-eveniment permit programatorului sa controleze modul in care aplicatia proiectata raspunde diferitelor actiuni ale utilizatorului .
Procedurile, functiile si procedurile-eveniment sunt memorate in unitati de sine statatoare, numite module . Rolul acestora este de a organiza logic codul VBA atasat aplicatiei si de a restrange accesul la diferitele unitati de program .
Predicate
Modulele asociate sunt coduri scrise de programator direct in sabloanele create automat de MS Access pentru fiecare obiect si pentru fiecare eveniment din formularul / raportul respectiv .
Modulele independente permit programatorului sa-si creeze singur obiectele suplimentare (inclusiv metodele si proprietatile) de care are nevoie pentru proiectarea si administrarea aplicatiei sale .
Modulele globale sunt create tot in fereastra Module si contin coduri care pot fi executate din orice punct al aplicatiei .
Codurile VBA sunt, in multe cazuri, mai performante decat macrocomenzile . Ele pot fi apelate din interiorul unei macrocomenzi, pot fi apelate din alte unitati de program sau din expresii si pot fi lansate in executie cu comanda RUN GO/CONTINUE daca nu au argumente .
Copyright © 2024 - Toate drepturile rezervate