Introducere în VBA din Access

Access implementează VBA diferit de celelalte aplicații Office. Iată care sunt principalele diferențe:

  • Colecțiile din Access încep de la zero—primul element dintr-o colecție este numerotat 0 (zero) în loc de 1. De exemplu, Forms(0).Name returnează proprietatea Name a primului obiect Form din colecția Forms. E ca și cum ați vizita o țară în care primul etaj este zero în loc de unu. Deci, dacă încercați să ajungeți la etajul cinci, trebuie să faci ajustarea mentală ca în lift trebuie să apăsați pe butonul 4. Ciudat, dar trebuie să vă obișnuiți cu acest lucru. Colecțiile bazate pe zero (Zero-based) vă fac munca de programator un pic mai dificilă, mai ales atunci când se utilizează bucle.
  • Termenul macro este utilizat într-un mod special în Access, spre deosebire de modul în care este utilizat în alte aplicații Office, ca să nu mai vorbim de toate celelalte forme de calcul. O "macrocomandă" Access este o entitate istorică — care a rămas de la începutul acestui sistem de baze de date. Ea este limitată la doar un subset al comenzilor disponibile pentru programare, care nu este la fel de util, flexibil sau eficient (în cele mai multe cazuri), ca și codul VBA. Pentru a construi ceea ce Access numește o "macrocomandă", introduceți o listă de acțiuni pe care doriți să le efectuați, utilizând un utilitar special - Macro Designer (cunoscut anterior ca Macro Builder) - care este încorporat în Access. Alegeți aceste acțiuni dintr-o listă și apoi tastați argumente în celula următoare într-un tabel afișat de Macro Designer. Deci, seamănă mai mult cu completarea unui formular și nu atât de mult ca și programarea reală. Este similar cu instrumentul Quick Steps din Outlook descris în secțiunea Lucrul cu evenimente (Events) în Outlook. Dar ne putem imagina că la începuturi, cineva a presupus că oamenii care lucrează cu baze de date doar vor introducere date în tabele.
  • "Macrocomenzile" din Access sunt create făcând clic pe fila Table de pe Panglică, făcând clic pe opțiunea Macros și apoi clic pe Create Named Macro. De acum înainte, vom numi acest tip macrocomenzi "macrocomenzi în stil Access" pentru a le distinge de macrocomenzile adevărate cu care am lucrat până acum.
  • Din fericire, Access oferă, de asemenea, VBA. Când scrieți cod VBA în Access VBA Editor, o faceți ca în celelalte aplicații Office 2016, creați la propriu macrocomenzi adevărate. (Rețineți că literatura de specialitate Access nu descrie aceste macrocomenzi VBA ca fiind macrocomenzi. Trebuie doar să vă obișnuiți cu diferența de terminologie.) Ne vom concentra atenția asupra capacităților VBA din Access și mai puțin asupra moștenirii Macro Designer.
  • Pentru a face posibil ca un utilizator să execute o subrutină din Access, trebuie mai întâi să creați o funcție în stil Access care apelează subprocedura. Ca programator, puteți lucra la o macrocomandă în Editorul VBA, puteți depana și executa subprocedura utilizând comenzile obișnuite ale editorului VBA (de exemplu, apăsați F5 pentru a rula și testa subprocedura). Dar un utilizator nu va putea executa macrocomanda direct din interfața cu utilizatorul Access. În schimb, trebuie să utilizați o comandă RunCode, pentru a o vedea. Cu toate acestea, există o excepție de la această regulă. În secțiunea intitulată Comunicarea directă cu VBA, descrisă ulterior, veți învăța să modificați Panglica din Acces pentru a permite utilizatorilor să declanșeze direct codul VBA din Panglică.

Următoarele secțiuni oferă un exemplu complet, de la început până la sfârșit, despre modul în care să lucrați cu VBA în Access. Pe scurt, creați mai întâi un modul, apoi scrieți o procedură de macrocomandă în acel modul și, în cele din urmă, utilizați Macro Designer pentru a crea o macrocomandă în stil Access al cărei unic scop este să înceapă executarea unei macrocomenzi adevărate (procedura VBA).

Înainte de a merge mai departe, să ne asigurăm că macrocomenzile sunt, de fapt, activate în Access. Urmați acești pași pentru a activa macrocomenzile Access:

1. Clic pe eticheta File de pe Ribbon.

2. Clic Options în panoul din stânga.

3. Clic Trust Center din caseta de dialog Access Options.

4. Clic pe butonul Trust Center Settings.

5. Clic Macro Settings în panoul din stânga al casetei de dialog Trust Center.

6. Clic pe butonul radio Enable All Macros.

7. Clic pe butonul OK de două ori pentru a închide casetele de dialog.

Rețineți că, făcând acești pași, ați expus computerul la posibile macrocomenzi dăunătoare care s-ar putea executa automat la deschiderea Access. Acum puteți testa și explora macrocomenzile Access descrise aici. Cu toate acestea, dacă intenționați să lucrați cu conținut Access necunoscut sau nefiabil, repetați pașii de mai sus, dar la Pasul 6, alegeți să dezactivați toate macrocomenzile.

Crearea unui modul în Editorul VBA

Pentru a crea un modul în care să puteți scrie codul macrocomenzii VBA, deschideți o bază de date Access și faceți clic pe fila Database Tools de pe panglică. Faceți clic pe butonul Visual Basic de pe Panglică (sau pur și simplu apăsați Alt+F11).

Se deschide Editorul VBA. În Editorul VBA, alegeți Insert > Module sau faceți clic dreapta pe numele proiectului (este scris îngroșat) în panoul Project Explorer și alegeți Insert > Module din meniul de comenzi rapide.

Crearea unei funcții

După crearea unui modul VBA în VBA Editor, puteți crea o funcție în cadrul acestuia, așa s-a descris mai devreme în această carte. Următorul exemplu creează o funcție denumită Standard_Setup care afișează pur și simplu o casetă de mesaj pentru a indica faptul că se execută (următoarea secțiune utilizează această macrocomandă ca exemplu):

Public Function Standard_Setup()
  'aici scrieți comenzile 
  MsgBox "Se execută macrocomanda Standard_Setup."
End Function

Puteți testa acest cod, ca de obicei, făcând clic undeva în interiorul procedurii și apoi apăsând tasta F5.

După crearea funcției, comutați înapoi la Access apăsând Alt+F11 sau făcând clic pe butonul View Microsoft Access din extrema stângă a barei de instrumente Standard din VBA Editor. Desigur, puteți utiliza, de asemenea, comenzile rapide tradiționale din Windows Alt + Tab sau tasta Windows + Tab.

Folosirea Macro Designer

Deși aici se descrie doar automatizarea Access folosind limbajul flexibil și puternic din VBA, unii cititori pot fi interesați să știe cum să lucreze cu instrumentul Macro Designer. Deci, îl vom explora pe scurt, înainte de a trece la exemplele VBA.

Crearea unei macrocomenzi în stil Acces pentru executarea unei funcții

Rețineți că un utilizator nu poate declanșa direct o procedură VBA interactivă din interfața principală a Access (deși programatorul poate apăsa tasta F5 pentru a testa procedurile din VBA Editor, așa cum am făcut în funcția din exemplul anterior).

Nu veți găsi nicio casetă de dialog Macros ca cea din Word și din alte aplicații Office 2016. Adevărat, există un buton Run Macro pe fila Database Tools de pe Panglica din Access, dar această caracteristică nu poate declanșa direct o procedură macro reală în VBA. Declanșează doar o macrocomandă în stil Access.

Pentru ca un utilizator să execute o procedură VBA, trebuie să creați o macrocomandă în stil Access care a fost construită utilizând Macro Designer din Access. Utilizați acțiunea (comanda) RunCode pentru a apela procedura VBA. Vom vedea cum se face asta:

1. Afișați fereastra Database dacă nu este deja afișată. De exemplu, faceți clic pe cuvântul View (cuvântul cu săgeata neagră mică în jos, nu pictograma) de pe fila Home de pe panglică, apoi selectați Datasheet View din opțiunile afișate.

2. Clic pe butonul Macro de pe eticheta Create de pe panglică, pentru a deschide fereastra Macro Designer. Această acțiune deschide și eticheta Design de pe Ribbon.

3. În panoul Action Catalog din dreapta, deschideți folderul Macro Commands și faceți dublu clic pe elementul RunCode. Această acțiune inserează comanda RunCode în panoul din mijloc. (Comanda de opțiune RunMacro poate executa numai macrocomenzi în stil Access. De asemenea, dacă încercați să adăugați un buton la Bara de instrumente Quick Acces de deasupra panglicii, și aceasta poate executa numai macrocomenzile în stil Access.)

4. În câmpul Function Name, tastați Standard_Setup(), numele funcției VBA de testare creată mai sus în acest capitol. Parantezele goale sunt necesare, așa că nu le omiteți.

5. Clic pe pictograma Save din bara cu instrumente Quick Access de deasupra Ribbon, sau apăsați Ctrl+S.

6. Tastați numele test în fereastra de dialog Save As, apoi clic pe butonul OK. (Sfat: Dacă modificați macrocomanda mai târziu și doriți să îi modificați numele, alegeți File > Save As > Save Object As, apoi clic pe butonul Save. Sau, faceți clic dreapta pe numele macrocomenzii în panoul din stânga al ferestrei principale Access, apoi clic pe Rename.)

7. Acum testați această macrocomandă (și, în consecință, procedura VBA pe care o declanșează) făcând clic pe pictograma Run de pe panglică. E icoana cu semnul exclamării, de culoare roșie. Această pictogramă apare numai atunci când Macro Desgner este activ în fila Design de pe Panglică. Acum vedeți caseta de mesaje care vă spune că macrocomanda se execută.

Utilizatorul poate executa macrocomenzi în stil Access atunci când Macro Designer este închis. Faceți dublu clic pe test din lista All Access Objects (panoul din partea stângă a ferestrei principale).

Sau, alternativ, utilizatorul poate face clic pe fila Database Tools de pe Panglică, apoi clic pe pictograma Run Macro din secțiunea Macro (are și un semn de exclamare roșu). Se deschide caseta de dialog Run Macro din Access. Selectați test ca nume de macrocomandă pe care doriți să îl executați, apoi faceți clic pe OK pentru a închide caseta de dialog și a executa macrocomanda.

Trei moduri de a executa o macrocomandă în stil Access

Pentru a rezuma, un utilizator poate executa o macrocomandă în stil Access doar în trei moduri:

  • Dacă alege opțiunea Run Macro din fila Database Tools de pe panglică. Aceasta deschide o mică casetă de dialog Run Macro din care are posibilitatea să aleagă o macrocomandă în stil Access și să o execute.
  • Cu dublu clic pe numele macrocomenzii în stil Access din lista All Access Objects din panoul din stânga al ferestrei principale Access.
  • Dacă este adăugat un buton pe bara de instrumente Quick Access care va executa macrocomanda în stil Access.

Adăugați un buton la bara de instrumente Quick Access urmând acești pași:

1. Clic pe butonul Customize Quick Access Toolbar (pictograma săgeată în jos din partea dreaptă a barei cu instrumente Quick Access în partea din stânga sus a ferestrei Access).

2. Clic pe opțiunea More Commands din lista verticală. Se deschide fereastra de dialog Access Options.

3. Selectați Macros din lista verticală Choose Commands From.

4. Dublu-clic pe numele macrocomenzii pentru a o muta în lista din partea dreaptă (unde sunt listate elementele afișate pe bara de instrumente).

5. Clic OK pentru a închide caseta de dialog și a pune butonul pentru macrocomandă pe bara de instrumente.

Rețineți că nu puteți declanșa o macrocomandă dintr-o comandă rapidă de la tastatură (Access nu vă permite să creați comenzi rapide particularizate de la tastatură).

Transformarea unei macrocomenzi în stil Access într-o macrocomandă VBA

Având în vedere că VBA este mult mai puternic decât macrocomenzile în stil Access, poate doriți să convertiți o macrocomandă din stil Access în VBA pentru a o îmbunătăți. Puteți transforma automat macrocomenzile din stil Access în funcții VBA. Urmați acești pași:

1. Afișați fereastra Database dacă nu este deja afișată. De exemplu, faceți clic pe cuvântul View (cuvântul word cu săgeata neagră mică în jos, nu pictograma) de pe fila Home care se află pe panglică, apoi selectați Datasheet View din opțiunile afișate.

2. Faceți clic dreapta pe macrocomanda test din panoul All Access Objects din stânga. Clic pe Design View din meniul contextual care se deschide. Doriți să vizualizați macrocomanda în stil Access pe care ați creat-o mai devreme în acest capitol (vezi Figura 28.1).

3. În partea stângă a Ribbon, clic Convert Macros To Visual Basic.

4. Apare o casetă de dialog în care puteți refuza opțional să includeți tratarea erorilor sau comentarii.

5. Clic pe butonul Convert.

6. Se deschide VBA Editor.

7. În panoul Navigation, localizați și faceți dublu clic pe modulul numit Converted Macro-test. Acum vedeți codul transformat:

'---------------------
' test
'---------------------
Function test()
On Error GoTo test_Err
  Standard_Setup

test_Exit:
  Exit Function

test_Err:
  MsgBox Error$
  Resume test_Exit
End Function

Dacă ați optat pentru a evita blocarea erorilor și a comentariilor, este mai simplu:

'---------------------
' test1
'---------------------
Function test1()
  Run_SampleProcedure
End Function

Utilizarea unei macrocomenzi AutoExec pentru a inițializa o sesiune din Access

Pentru a parametriza condițiile prealabile pentru o sesiune din Access, aveți posibilitatea să utilizați o macrocomandă AutoExec. Când Access este pornit, acesta verifică dacă există o macrocomandă numită AutoExec. Dacă da, macrocomanda respectivă este executată (declanșată) automat la deschiderea Access. Această caracteristică AutoExec este disponibilă și în alte aplicații Office, cum ar fi Word. (Apropo, cei care doresc să declanșeze un virus sau alt cod dăunător folosesc tot un AutoExec în care vor stoca codul lor.)

Dar este posibil să decideți să utilizați AutoExec pentru a executa un cod de inițializare util. De exemplu, puteți alege să maximizați fereastra Application, să deschideți un anumit element, cum ar fi un tabel, sau să afișați o anumită înregistrare. Rețineți că AutoExec trebuie să fie numele unei macrocomenzi în stil Access, nu o procedură VBA (așa cum ar fi în alte aplicații Office).

Apropo, aveți posibilitatea să împiedicați executarea unei macrocomenzi AutoExec atunci când deschideți o bază de date ținând apăsată tasta Shift în timp ce se deschide baza de date.

Pentru a crea o macrocomandă AutoExec, porniți o nouă macrocomandă în stil Access, așa cum este descris în secțiunea anterioară, adăugați la aceasta acțiunile pe care doriți să le efectueze macrocomanda și salvați-o cu numele special rezervat AutoExec. Macrocomanda se va executa la următoarea deschidere a bazei de date.

Ne vom îndrepta acum atenția către programarea VBA obișnuită, dar dacă sunteți interesat să aflați mai multe despre Macro Designer, consultați tutorialul de pe această pagină web:

https://msdn.microsoft.com/en-us/library/office/gg435977(v=office.14).aspx

Rularea unei subproceduri

Până acum, în această carte, ați creat în cea mai mare parte subrutine tradiționale atunci când scrieți sau înregistrați o macrocomandă. Iar pentru consecvență, exemplele de cod VBA Access descrise aici și în alte părți vor fi, de asemenea, subrutine.

Dar aveți grijă! Dacă doriți să permiteți utilizatorului să execute procedurile Access VBA, acestea trebuie transformate în funcții. Doar înlocuiți cuvântul Sub cu funcția în codul dumneavoastră. VBA va schimba apoi automat linia de la sfârșitul procedurii de la End Sub la End Function. Este simplu.

Deci, încă o dată doar amintiți-vă că Access diferă de alte aplicații Office în acest fel, și în multe altele. Când scrieți o macrocomandă VBA în Access, nu există niciun motiv bun pentru a crea codul VBA Access într-o subprocedură, în loc de o funcție, deoarece o subrutină nu poate fi declanșată direct în Access.

Numai funcțiile pot fi declanșate direct, ca în exemplul din secțiunea anterioară. Dacă credeți că trebuie să creați o subrutină, singura modalitate de a o executa este de a crea o funcție care, la rândul său, are lucrarea unică de executare a subprocedurii. Deci, ce rost are?

Procesul de declanșare indirectă a funcțiilor este stângace, dar poate fi făcut să funcționeze în cazul în care, pentru un motiv inimaginabil, doriți să utilizați o subprocedură. Iată un exemplu simplu:

1. În VBA Editor, creați o subprocedură care efectuează acțiunile pe care le doriți:

Sub SampleProcedure()
  MsgBox " Se execută subprocedura denumită ProceduraTest."
End Sub

2. Tot în VBA Editor, creați o funcție care rulează subprocedura:

Public Function Run_ProceduraTest()
Call ProceduraTest 
End Function

3. Apoi comutați la Access și creați o macrocomandă în stil Access care utilizează acțiunea RunCode pentru a executa funcția care execută subprocedura. (Consultați secțiunea de mai devreme din acest capitol intitulată "Crearea unei macrocomenzi în stil Access pentru executarea unei funcții".)

Înțelegerea comenzii Option Compare Database

Când lansați VBA Editor în Access (apăsând Alt +F11 sau făcând clic pe butonul Visual Basic de pe fila Database Tools de pe panglică) și apoi inserați un modul de cod, veți observa că Access introduce automat comanda Option Compare Database în zona General Declarations din partea de sus a ferestrei Code.

Rețineți că, dacă ați selectat caseta de selectare Require Variable Declaration în fila Editor a casetei de dialog Options (Tools > Options) pentru a face ca VBA Editor să declare toate variabilele în mod explicit, veți vedea o declarație Option Explicit în zona General Declarations.

Access suportă trei moduri diferite de comparare a șirurilor de text: Option Compare Database, Option Compare Binary și Option Compare Text. Iată ce înseamnă aceste opțiuni:

  • Option Compare Database este tipul de comparație implicit pentru bazele de date Access, și efectuează comparații pentru șir folosind ordinea de sortare din setările regionale folosite de Windows (de exemplu, U.S. English). Sortarea nu este sensibilă la litere mari și mici. Access inserează automat o declarație Option Compare Database în secțiunea de declarații a fiecărui modul pe care îl introduceți. Puteți șterge declarația Option Compare Database, caz în care Access va folosi Option Compare Binary.
  • Option Compare Binary efectuează sortarea sensibilă la litere mari și mici. Pentru a utiliza Option Compare Binary, fie ștergeți declarația Option Compare Database din secțiunea cu declarații, fie modificați declarația la Option Compare Binary.
  • Option Compare Text efectuează sortarea insensibilă la litere mari și mici. Pentru a utiliza Option Compare Text, schimbați una din declarațiile Option Compare Database sau Option Compare Binary la o declarație Option Compare Text.