Sunteți pe pagina 1din 291

CUPRINS

VBA - Bazele programarii

Instructiunile VBA

Operatiuni de intrare-iesire

Visual Basic Editor

Modele de obiecte

Obiecte Microsoft Word Obiectul Application Propriet i (obiectul Application) DisplayScrollBars DisplayStatusBar Height Width WindowState ActiveDocument ActivePrinter ActiveWindow Documents Selection Windows Metode (obiectul Application) Quit Obiectul Document Referirea unui Document Deschiderea documentelor Crearea/salvarea documentelor Activarea unui document Tip rirea unui document Închiderea documentelor Accesarea obiectelor din Document Obiectul Range Obiect Range sau obiect Selection Referin a prin metoda Range Referin a prin proprietatea Range Modificarea unui document Lucrul cu textul din Range Redefinirea unui obiect Range Atribuirea obiectelor Range Obiectul Selection Deplasarea i extinderea selec iei Metoda GoTo Metodele GoToNext, GoToPrevious Obiecte accesibile din Selection Selection – propriet i i metode uzuale Proprietatea Text Formatarea textului selectat Returnarea obiectului Range Proprietatea Information

Determinarea tipului de selec ie Obiectele Find i Replacement Find ClearFormatting Execute Selection.Find Range.Find Replacement Obiectele Table, Column, Row i Cell Colec ia Tables Obiectul Table Colec ia Columns Obiectul Column Colec ia Rows, obiectul Row Colec ia Cells Obiectul Cell Exemple cu obiectele Table, Column, Row i Cell Utilizarea obiectului HeaderFooter Colec ia Styles Obiectul Style Colec ia CommandBars Colec ia Dialogs Câmpuri – ad ugare, editare Verificarea unui obiect Modificarea comenzilor Word Lucrul cu evenimente Evenimente pentru Document Evenimente pentru Application Evenimente pentru ActiveX Auto Macro Automatizarea aplica iilor Automatizarea Word din alt aplica ie Automatizarea altei aplica ii din Word Comunicarea cu obiectele scufundate

Controale ActiveX si Dialoguri Proiectarea casetelor de dialog utilizator Crearea unui nou dialog Scrierea procedurilor de r spuns la evenimente Controale Label TextBox ListBox ComboBox CheckBox OptionButton ToggleButton CommandButton TabStrip MultiPage Frame

1

Image Utilizarea dialogurilor utilizator Afi area unui dialog Ob inerea/editarea propriet ilor în execu ie Utilizarea controalelor în documente Word, Excel, PowerPoint Controale ActiveX în documente Word Controale ActiveX în foi de calcul Excel Controale ActiveX în diapozitive PowerPoint Controlarea programatic a controalelor din documentele aplica iilor

Obiecte Microsoft Excel Obiectul Application Obiectul Workbook Deschiderea unui Workbook Metoda GetOpenFilename Crearea/salvarea unui Workbook Metoda Add (colec ia Workbooks) Metoda SaveAs Metoda Save Metoda GetSaveAsFilename Închiderea unui Workbook Metoda Close Obiectul Range Referin e de tip A1 sau nume de domeniu Utilizarea indicilor de linii i coloane Utilizarea propriet ii Offset Utilizarea propriet ilor CurrentRegion i UsedRegion Parcurgerea unui domeniu de celule Utilizarea instruc iunii For Each…Next Utilizarea instruc iunii Do…Loop Utilizarea propriet ii Address Evenimentele din Excel 97 Permiterea i inhibarea evenimentelor Utilizarea evenimentelor Evenimentele obiectului Worksheet Exemplu Evenimentele obiectului Chart Exemplu Evenimentele obiectului Workbook Exemplu Evenimentele obiectului Application Utilizarea modulelor clas cu evenimente

Obiecte Microsoft Access Obiectele accesibile în Microsoft Access Obiectele Microsoft Access Obiectul Application Utilizarea obiectului Application în automatizare Colec ia Forms Referirea la un obiect Form Propriet ile obiectului Form Proprietatea Me (obiectul Form) Proprietatea Section (obiectul Form) Proprietatea Properties (obiectul Form) Proprietatea Module (obiectul Form) Proprietatea RecordSource (obiectul Form) Module ata ate formelor Crearea formelor în timpul execu iei Colec ia Reports Referirea obiectelor Report Module asociate rapoartelor Crearea rapoartelor în timpul execu iei Func iile CreateForm, CreateReport Func iile CreateControl, CreateReportControl Exemplu de creare a unui raport Colec ia Controls Controale Microsoft Access Controale ActiveX Referirea obiectelor Control Propriet ile obiectului Control Proprietatea Hyperlink (obiectul Control) Proprietatea ControlType (obiectul Control) Controale legate de date (Data- Bound Controls) Controale care au o colec ie Controls Colec ia Modules Referirea la obiecte Module Module standard i module clas Propriet ile obiectului Module Determinarea num rului de linii Lucrul cu procedurile Metodele obiectului Module Ad ugarea de text la un modul Evenimentele unui modul clas Colec ia References Referirea obiectelor Reference

2

Propriet ile obiectului Reference Metodele colec iei References Stabilirea unei referin e în Visual Basic Obiectul DoCmd Metoda OpenForm Metoda RunCommand Obiectul Screen Propriet ile obiectului Screen

DAO (Data Access Objects) Lucrul cu obiectele DAO Proiectarea bazelor de date în Microsoft Access Stabilire unei referin e la biblioteca de obiecte DAO Referirea obiectelor DAO în Visual Basic Ad ugarea de noi obiecte DAO la o colec ie Lucrul cu date externe Utilizare DAO cu surse de date ODBC Utilizare Dao cu Microsoft Jet Obiectul DBEngine Colec ia Workspaces Metoda CreateWorkspace Colec ia Errors Colec ia Databases Colec ia TableDefs Colec ia Fields Colec ia Indexes Colec ia QueryDefs Colec ia Parameters (obiectul QueryDef) Colec ia Relations (obiectul Database) Colec ia Recordsets Obiecte Recordset de tip tabel Obiecte Recordset de tip dynaset Obiecte Recordset de tip snapshot Obiecte Recordset de tip forward-only Metodele obiectelor Recordset Securitatea datelor Colec ia Properties Accesarea datelor ODBC Utilizarea Microsoft Jet pentru date ODBC Utilizarea ODBCDirect pentru date ODBC

Înregistrarea unei surse de date ODBC Utilizarea DAO cu ODBCDirect Obiectul DBEngine Colec ia Workspace Colec ia Connections Deschiderea conect rilor asincrone Colec ia Databases Comutarea între Connection i Database Colec ia QueryDefs Executarea interog rilor asincrone Colec ia Parameters Colec ia Recordsets Obiecte Recordset de tip dinamic Deschiderea asincron a obiectelor Recordset Colec ia Fields Utilizare ODBCDirect Utilizarea actualiz rii optimiste

în lot

Tratarea coliziunilor Utilizarea cursoarelor în spa iile ODBCDirect Caracteristicile cursoarelor Cursoare client-side sau server-side Alegerea tipului de cursor Blocarea înregistr rilor Limit ri ale cursoarelor Reg sirea mul imilor multiple de rezultate Lucrul cu proceduri memorate

Obiecte Microsoft PowerPoint Obiectul Application Returnarea unui obiect Application Controlul aspectului ferestrei aplica iei Controlarea atributelor i comport rii globale Accesarea principalelor obiecte Accesarea obiectelor partajate de Ms Office Obiectul Presentation Returnarea obiectului Presentation Deschiderea unei prezent ri Crearea unei prezent ri Importul dintr-un outline Word Activarea unei prezent ri

3

Numerotarea i dimensiunile slide-urilor Stabilirea unui aspect unitar Tip rirea unei prezent ri Salvarea unei prezent ri Închiderea unei prezent ri Configurarea i executarea unei prezent ri Accesul la diapozitivele prezent rii Obiectele Slides, Slide i SlideRange Returnarea colec iei Slides Returnarea unui obiect Slide Returnarea unui obiect SlideRange Ad ugarea unei diapozitiv Stabilirea fundalului i schemei de culori Alegerea unui layout Ad ugarea de obiecte Ordinea diapozitivelor Stabilirea efectelor tranzi iei Referirea notelor Obiectul Selection Crearea unei selec ii Returnarea unei selec ii Returnarea unui obiect din selec ie Obiectele View i SlideShowView Prezent ri, ferestre, viziuni Returnarea obeictelor View i SlideShowView Navigarea printre diapozitive Alipirea la un obiect View Controlul viziunii din fereastra documentului Returnarea diapozitivului curent Controlul obiectelor în slide show Controlul anima iei R spunsul la ac iunea mouse- ului Controlul unui clip

Meniuri si bare de unelte Modificarea interfe ei cu utilizatorul Dialogul Customize Visual Basic Domeniul schimb rilor asupra interfe ei utilizator Microsoft Access Microsoft Excel

Mutarea unui element din spa iul de lucru în caiet Eliminarea unui meniu/toolbar salvat în caiet Microsoft Word Microsoft PowerPoint Componente ale interfe ei utilizator Sistemul de meniuri Adaptarea sistemului de meniuri Componente personale i componente built-in Utilizarea submeniurilro Utilizarea meniurilor contextuale Text box, List box, Combo box Modificarea în design-time Ad ugarea de bare de meniu

proprii

Ad ugarea meniurilor Ad ugarea submeniurilor Ad ugarea i gruparea comenzilor Ad ugarea i modificarea meniurilor contextuale tergerea componentelor de

meniu

Restaurarea componentelor built-in Modificarea în run-time Afi area unei bare de meniu Afi area dinamic a componentelor de meniu Permiterea i inhibarea componentelor de meniu Indicarea st rii unei intr ri de

meniu

Redenumirea unei intr ri Bare de unelte Adaptarea barelor de unelte Utilizarea meniurilor Text box, List box, Combo box Modificarea barelor de unelte în design-time Ad ugarea unei bare de

unelte

Ad ugarea i gruparea controalelor Adaugarea i ini ializarea controalelor text box, list box, combo box Eliminarea unui control Restaurarea barelor de unelte built-in Modificarea barelor de unelte în run-time

4

Afi area/ascunderea controalelor i barelor de unelte Mutarea i redimensionarea barelor de unelte Restaurarea barelor de unelte built-in Permiterea i interzicerea accesului la controale Indicarea st rii activ/inactiv a unui buton Modificarea controalelor Text box, List box i Combo box ID-uri de controale i intr ri de meniu

Forme grafice Obiectele Shape, ShapeRange i Shapes Returnarea colec iei Shapes Returnarea obiectului Shape Returnarea colec iei ShapeRange Desenarea unei forme grafice Editarea unei forme grafice Determinarea propriet ilor/metodelor adecvate Lucrul cu obiecte OLE Lucrul cu mai multe forme Construirea unui obiect ShapeRange Lucrul cu colec ia ShapeRange

Tratarea erorilor. Depanarea programelor Cum se gestioneaz erorile Proiectarea unei rutine de tratare a erorilor Stabilirea capcanei de erori Scrierea unei rutine de tratare a erorilor Ie irea din rutina de tratare a erorilor Diferen a dintre Resume i Resume Next Reluarea execu iei la o linie specificat Ierarhia de tratare a erorilor C utarea în lista de apeluri Indica ii pentru o tratare complex a erorilor Testarea trat rii erorilor prin generarea de erori Definirea codurilor proprii de eroare Tratarea inline a erorilor Returnarea numerelor de eroare

Tratarea erorilor în procedura apelant Utilizarea datelor de tip Variant Tratarea centralizat a erorilor Inhibarea trat rii erorilor Depanarea programelor care au rutine de tratare a erorilor Tratarea erorilor din obiectele referite Tratarea erorilor transmise din obiectele referite Depanarea trat rii erorilor din obiecte referite Depanarea programelor Tipuri de erori Unelte de depanare Bara de unelte Debug Evitarea "bug"-urilor Design Time, Run Time i Break Mode Utilizarea ferestrelor de depanare Utilizarea modului break Intrarea în modul break la o instruc iune cu probleme Fixarea unei erori run-time i continuare Monitorizarea datelor prin expresii de urm rire Ad ugarea, editarea sau eliminarea unei expresii urm rite Utilizarea urm ririi rapide Utilizarea unui punct de oprire Utilizarea instruc iunii Stop Executarea unor secven e de cod selectate Utilizarea comenzii Step Into Utilizarea comenzii Step Over Utilizarea comenzii Step Out Trecerea peste sec iuni de cod Stabilirea instruc iunii urm toare Indicarea instruc iunii urm toare Monitorizarea listei de apeluri (Call Stack) Testarea datelor i procedurilor cu fereastra Immediate Tip rirea informa iilor în fereastra Immediate Tip rirea din codul aplica iei Tip rirea din fereastra Immediate Atribuirea de valori Testarea procedurilor cu fereastra Immediate Verificarea numerelor de eroare

5

Trucuri utile în fereastra Immediate Considera ii speciale Oprirea execu iei în procedurile evenimentelor MouseDown sau KeyDown Oprirea execu iei în procedurile evenimentelor GotFocus sau LostFocus

Distribuirea solutiilor VBA pentru aplicatiile Microsoft Office Preg tirea solu iei pentru distribuire Alegerea modului de împachetare a solu iei Controlul înc rc rii Înc rcarea la start Înc rcarea automat în Excel Înc rcarea automat în PowerPoint Înc rcarea add-in-urilor din sesiunea precedent Înc rcarea programatic Înc rcarea ca r spuns la un eveniment Înc rcarea unui template prin linia de comand Desc rcarea programatic Înc rcarea la cerere Utilizarea referin elor explicite în Excel Înc rcare unei biblioteci în Excel Ad ugarea meniurilor Excel f r add-in Înc rcarea la cerere în PowerPoint

Înc rcarea la cerere din Word Codul executat la înc rcare/desc rcare Excel – evenimentele AddinInstall i AddinUninstall PowerPoint – procedurile Auto_Open i Auto_Close Word – procedurile AutoExec i AutoExit Verificarea final a codului Referin e la ActiveWorkbook sau ActiveDocument Apelul procedurilor din alte proiecte Evitarea referin elor nerezolvate PowerPoint – apelul unei rutine f r referin Referin e legate târziu Protejarea codului Salvarea solu iei ca un Add-in sau Global Template Crearea unui Add-in în Excel Crearea unui Add-in în PowerPoint Crearea unui template global în Word Depanarea unui Add-in sau Global Template Depanarea unui add-in în Excel Depanarea unui add-in în PowerPoint Depanarea unui template global în Word Distribuirea solu iilor prin Setup Wizard

6

1. BAZELE PROGRAM RII Visual Basic for Application (VBA)

Tipuri de date

Variabilele i constantele utilizate într-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre deosebire de alte limbaje de programare, exist un tip universal — tipul Variant —, care poate con ine aproape orice alt tip de date. Acest tip este asignat în mod implicit tuturor variabilelor nedeclarate altfel, încât declararea explicit poate fi utilizat atunci când se dore te economisirea memoriei (tipul Variant aloc mai mult memorie), vitez în execu ie sau atunci când se scriu date într-un fi ier în acces direct.

Boolean

 

Domeniu de valori: True sau False (valorile logice) Memorie: 2 bytes Declarator de tip:

Observa ii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule produc True. Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.

Byte

 

Domeniu de valori: 0–255 (numere întregi, f r semn) Memorie: 1 byte Declarator de tip:

Observa ii. Currency Domeniu de valori: -922 337 203 685 477.5808 — 922 337 203 685 477.5807

Memorie: 8 bytes Declarator de tip: @ Observa ii. Utilizate pentru calcule b ne ti (sau alte situa ii în care precizia este foarte important ). Valorile sunt memorate în format întreg, scalate prin 10 000, pentru a ob ine 15 cifre la partea întreag i

4

cifre la partea zecimal (reprezentare în virgul fix ).

Date

Domeniu de valori: 1 ianuarie 100 — 31 decembrie 9999, 0:00:00 — 23:59:59 Memorie: 8 bytes Declarator de tip:

Observa ii. Informa iile de tip dat calendaristic i/sau timp orar sunt memorate drept numere flotante, partea întreag reprezentând data calendaristic , partea frac ionar reprezentând timpul. La convertiri, miezul nop ii este 0, miezul zilei este .5, numerele negative reprezint date înainte de 30 decembrie 1899. Poate fi atribuit ca valoare de tip date orice literal care reprezint o dat calendaristic recunoscut ca atare, literalul trebuind s fie cuprins între simboluri #, de exemplu #1 Jan 99#.

Decimal

 

Domeniu de valori: (vezi observa iile) Memorie: 12 bytes Declarator de tip:

Observa ii. Valorile de tip Decimal sunt memorate ca întregi f r semn înso i i de un factor de scal , între

i 28, specificând num rul de zecimale. Pentru scala=0 (f r parte zecimal ), cea mai mare valoare posibil este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/- 7.9228162514264337593543950335 iar cea mai mic valoare nenul este +/-

0

0.0000000000000000000000000001.

Not : Deocamdat , tipul Decimal poate fi utilizat doar ca subtip în Variant, adic nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin func ia Cdec (func ia for eaz o expresie s fie de un tip specificat, din aceea i categorie de func ii fiind i CBool, CByte etc.).

Double

Domeniu de valori: numere negative de la -1.79769313486232E308 pân la -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pân la 1.79769313486232E308 (numere flotante în dubl precizie). Memorie: 8 bytes

7

Declarator de tip: # Observa ii.

Integer

 

Domeniu de valori: -32 768 — 32 767. Memorie: 2 bytes Declarator de tip: % Observa ii.

Long

 

Domeniu de valori: -2 147 483 648 — 2 147 483 647. Memorie: 4 bytes Declarator de tip: & Observa ii.

Object

 

Domeniu de valori: (vezi observa iile) Memorie: 4 bytes Declarator de tip:

Observa ii. Adrese pe 32 de bi i care se refer la obiecte. Prin instruc iunea Set se atribuie unei variabile declarate de tip Object referin a la obiectul dorit. Not . Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ata are târzie (la timpul execu iei – run-time binding). Pentru o ata are timpurie (la timpul compil rii – compile-time binding) se va utiliza o variabil declarat cu numele clasei respective.

Single

 

Domeniu de valori: numere negative de la -3.402823E38 pân la -1.401298E-45; numere pozitive de la 1.401298E-45 pân la 3.402823E38. Memorie: 4 bytes Declarator de tip: ! Observa ii.

String

Domeniu de valori: ir de lungime variabil : pân la 2^31 caractere; ir de lungime fix : pân la 2^16 caractere. Memorie: 2 bytes Declarator de tip: $ Observa ii. Un ir de lungime fix declarat Public nu poate fi utilizat într-un modul de clas . Variant (default) Domeniu de valori: acelea i cu domeniile specificate la tipurile precedente i care pot fi subtipuri ale tipului Variant, cu men iunea c toate subtipurile numerice au domeniul de la Double. Memorie: în func ie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String necesit 22 bytes plus câte un byte pentru fiecare caracter. Declarator de tip:

Observa ii. Este tipul specificat implicit (în lipsa unei declara ii explicite) pentru o constant , variabil , sau argument (caz care, de i nerecomandat, poate elimina erorile provocate de diferen ele de tip ale argumentelor la apelul procedurilor). Cu excep ia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul Variant poate con ine orice alt tip de dat . În plus poate s con in valorile speciale Empty, Error, Nothing i Null. Tipul considerat pentru o dat con inut într-un Variant poate fi determinat cu func ia VarType sau TypeName. Valorile unei variabile Variant pot s - i converteasc valorile automat. În general, datele numerice sunt memorate în tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac rezultatul unei opera ii necesit acest fapt. De exemplu o valoare declarat ini ial drept Integer i atribuit unui Variant va fi memorat ca un întreg pân când, ridicând-o de exemplu la o putere, valoarea ei excede domeniul tipului Integer. În acest caz are loc promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). Dac dep irea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare. Utilizarea tipului Variant permite o tratare mai diferen iat a irurilor de cifre: în opera ii numerice vor fi considerate numere iar în opera ii cu iruri vor fi considerate iruri. Accesul la valorile Variant este mai lent decât accesul la valorile definite prin tipuri explicite.

8

Valorile speciale au semnifica ia:

o

Empty este valoarea unui Variant care nu a fost ini ializat. În calcule numerice este considerat 0 iar în opera ii cu iruri este irul de lungime zero.

o

Null este valoarea unui Variant care, în mod programatic, nu con ine date.

o

Error este valoarea utilizat pentru a ar ta îndeplinirea unei condi ii de eroare (prin convertirea unui real cu func ia CVErr). Procesarea se va efectua de c tre utilizator, tratarea automat a erorilor nu este activat la setarea acestor valori.

o

Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv.

Tipuri definite de utilizator

Un tip de dat definit de utilizator reprezint echivalentul unei înregistr ri dintr-un fi ier (baz de date), adic o grupare de entit i de tipuri diferite. Definirea are loc la nivel de modul, prin instruc iuni Type. Pentru clauzele care apar se va vedea discu ia de la domeniul variabilelor.

[Private | Public] Type varname

elementname [([subscripts])] As type

[elementname [([subscripts])] As type]

.

.

.

End Type

unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utiliza i componente de tipuri utilizator deja definite. Componentele pot fi i tablouri, caz în care apar defini iile specifice (vezi declararea variabilelor).

Declararea constantelor, variabilelor i tablourilor

Nume

La denumirea procedurilor, constantelor, variabilelor i argumentelor într-un modul Visual Basic

se cere respectarea urm toarelor reguli:

primul caracter trebuie s fie o liter ;

nu se utilizeaz spa iu, punct (.), semnul exclam rii(!), sau caracterele @, &, $, #

lungimea denumirii nu poate dep i 255 de caractere;

la acela i nivel de existen nu pot s existe denumiri identice. Pot s existe totu i, în acela i modul, o variabil privat i o variabil la nivel de procedur care s poarte acela i nume.

În general, nu se recomand definirea unor denumiri identice cu nume de func ii, instruc iuni sau metode existente în Visual Basic. Dac s-a ajuns totu i la aceast situa ie, atunci utilizarea func iei intrinseci limbajului, a instruc iunii sau metodei care intr în conflict cu un nume asignat necesit calificarea ei în raport de biblioteca asociat . De exemplu, VBA.Left este apelul la func ia Left atunci când este definit de utilizator i o variabil Left. Not . Visual Basic nu este case-sensitive, deci denumirea unei entit i nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA p streaz capitalizarea din instruc iunea unde este definit un nume.

Declararea constantelor

9

Definirea unei constante se realizeaz prin instruc iunea Const, în care se poate specifica tipul, domeniul i valoarea constantei. Valoarea unei constante nu se poate schimba programatic.

[Public | Private] Const constname [As type] = expression

Public — cuvânt cheie, op ional, utilizat la nivel de modul pentru a declara constante recunoscute în toate procedurile din toate modulele. Nu este permis în proceduri.

Private — cuvânt cheie, op ional, utilizat la nivel de modul pentru a declara constante recunoscute în toate procedurile din modulul în care apare declara ia. Nu este permis în proceduri.

constname — numele constantei (obligatoriu).

type — tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (înc nu este suportat), Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; în lipsa clauzei se va ata a automat tipul cel mai apropiat expresiei.

expression — combina ie de identificatori, constante, operatori (cu excep ia Is) care produce un sir, num r sau obiect. Nu se pot utiliza variabile, func ii utilizator sau func ii VBA predefinite.

În mod implicit, constantele sunt private. La nivel de procedur , sau de modul clas , domeniul lor nu poate fi modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public.

Constantele declarate în proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate în afara unei proceduri este definit în modulul respectiv.

Mai multe declara ii de constante pot fi scrise pe o aceea i linie, separate prin virgule la nivel de atribuiri de expresii. În acest caz, cuvintele Public sau Private care apar se aplic întregii linii.

Exemple

Const NrLinii = 15

Public Const MesajInitial = "Tastati numarul de linii"

Private Const NrLinii as Integer = 15

Public Const NrLinii = 15, Pondere as Single = 1.21

Este de remarcat c , în ultima linie, doar Pondere este de tip Single, în timp ce NrLinii este de tip Integer (în lipsa clauzei As type se atribuie tipul expresiei).

Declararea variabilelor

Variabilele, simple sau tablou, se definesc prin instruc iunile Dim, Private, Public, ReDim sau Static. Numele unei variabile trebuie s respecte regulile generale de formare a identificatorilor, tipul variabilei poate fi definit explicit (prin clauza As type) sau implicit (ca Variant).

În cazul în care modulul con ine instruc iunea Option Explicit cu sintaxa

Option Explicit

10

i care trebuie s apar înaintea oric rei proceduri din modul, toate variabilele trebuie s fie declarate prin instruc iunile men ionate. Lipsa instruc iunii Option Explicit permite ca variabilele s fie definite acolo unde este nevoie de ele prin simpla men ionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim posibilitate poate produce erori greu detectabile.

Sintaxa instruc iunilor de declarare a variabilelor este urm toarea i se observ asem narea clauzelor.

Dim [WithEvents] varname[([subscripts])] [As [New] type]

Private [WithEvents] varname[([subscripts])] [As [New] type]

Public [WithEvents] varname[([subscripts])] [As [New] type]

Static varname[([subscripts])] [As [New] type]

ReDim [Preserve] varname(subscripts) [As type]

varname — numele variabilei (obligatoriu).

subscripts — dimensiunile tabloului de date (dac se declar o variabil tablou). Pot exista pân la 60 de indici, separa i prin virgule, declararea dimensiunilor pentru un indice fiind de forma

[lower To] upper

Limita inferioar este, implicit, 0, dar poate fi controlat prin instruc iunea Option Base.

Dac nu se indic limitele indicilor (dar parantezele sunt prezente), se define te o variabil tablou dinamic (nu i prin Static) ale c rei dimensiuni pot fi precizate/redefinite prin instruc iunea ReDim.

New — permite crearea implicit a unui obiect (atunci când se declar o variabil de tip obiect). O nou instan a obiectului este creat la prima referin a variabilei definite. Clauza nu poate s apar la declararea variabilelor de tipuri intrinseci i nici la declararea instan elor obiectelor dependente.

type — tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat înc ), Date, String (pentru iruri cu lungime variabil ), String * length (pentru iruri cu lungime fix ), Object, Variant, tip utilizator sau tip de obiect.

Dac se definesc mai multe variabile într-o instruc iune, defini iile se separ prin virgul iar clauza de tip nu este extins i la variabilele definite ulterior.

De i toate instruc iunile permit declararea unor variabile (simple sau tablou), fiecare instruc iune are un efect distinct în ceea ce prive te vizibilitatea variabilelor i persisten a valorilor.

Dim define te variabile atât la nivel de modul cât i la nivel de procedur . Variabilele definite la nivel de modul sunt accesibile în procedurile acelui modul, iar variabilele de la nivel de procedur sunt vizibile doar în procedura respectiv .

Private este utilizat la nivel de modul pentru a declara variabile accesibile doar în procedurile acelui modul.

Public este utilizat pentru a declara variabile accesibile în toate procedurile din toate modulele i din toate aplica iile. Prin includerea instruc iunii Option Private Module este posibil ca variabilele publice s fie vizibile doar în proiectul în care sunt definite.

Static este utilizat la nivel de procedur nestatic pentru a declara variabile care î i p streaz valoarea de la o execu ie a procedurii la alta, atât timp cât modulul în care apare procedura nu este resetat sau repornit.

11

Variabilele definite prin Static sunt vizibile doar în procedura respectiv . Este de remarcat c se poate defini o întreag procedur utilizând clauza Static (vezi definirea procedurilor), caz în care toate variabilele sunt statice.

ReDim este utilizat la nivel de procedur pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni i p streaz valorile deja existente. (Pentru detalii vezi i VBA Help).

Exemple

Dim x As Double, ColtStanga As Integer

Private I, J As Long

Static Venit As Currency, NumPren As String

Dim Retineri(5) As Currency

Public indicatori(10) As Byte

Dim matrice(1 To 3, 100 To 200) As String

Public fntScris As Font

Dim appWD As Word.Application

Proceduri

Printr-o procedur se în elege, similar altor limbaje de programare, o mul ime de instruc iuni care este identificat printr- un nume i care se execut unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o procedur s efectueze o prelucrare unitar identificabil în logica programului.

Exist trei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unui obiect i va fi prezentat ulterior. O procedur de tip Sub poate primi i transmite informa ii prin intermediul unor variabile publice sau/ i a unor parametri. Numele procedurii nu are ata at nici o valoare. O procedur de tip Function se deosebe te prin aceea c numele procedurii are ata at o valoare (valoarea func iei) i poate fi utilizat ca orice alt variabil din proiect.

Observa ie. Orice instruc iune executabil trebuie s apar in unei proceduri. Declara iile pot s apar i în afara procedurilor, la nivel de modul.

Proceduri Sub

Organizarea general a unei proceduri de tip Sub este

[Private | Public] [Static] Sub name ([arglist])

[instruc iuni]

[Exit Sub]

[instruc iuni]

End Sub

12

Public, Private, Static — determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate modulele (în func ie de Option Private se define te vizibilitatea pentru alte proiecte). Private = vizibil doar pentru procedurile din modulul unde procedura este declarat . Static = arat c toate variabilele locale î i p streaz valorile între apeluri.

name — numele procedurii.

arglist — lista de argumente, separate prin virgule.

Prin instruc iunea Exit Sub se poate ie i din procedur i altminteri decât prin linia final .

Argumentele se definesc dup sintaxa:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

Optional — arat c parametrul nu este obligatoriu. Parametrii op ionali trebuie s fie grupa i la sfâr itul listei (apari ia clauzei Optional cere ca to i parametrii care urmeaz s aib aceea i clauz ).

ByVal — arat c apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este reg sit dup p r sirea procedurii, calculele efectuându-se pe o copie a parametrului).

ByRef — arat c apelul paramatrului se face prin referin (orice modificare a valorii transmise este reg sit dup p r sirea procedurii). Acesta este modul implicit de transmitere a parametrilor.

ParamArray — folosit doar ca ultim argument în list , denot un tablou Optional de elemente de tip Variant. Clauza ParamArray permite definirea unui num r arbitrar de parametri. ParamArray nu poate fi utilizat împreun cu ByVal, ByRef, sau Optional.

varname — numele argumentului. Dac este tablou se vor indica parantezele.

type — tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String (doar lungime variabil ), Object, Variant. Pentru parametrii obligatorii (f r Optional) poate fi i un tip definit sau de obiect.

defaultvalue — define te valoarea implicit pentru argumentele op ionale. Poate fi orice expresie, dar pentru tipul Object se admite doar Nothing.

Apelul unei proceduri Sub

Pentru a executa o procedur de tip Sub din alt procedur (vezi i discu ia privind vizibilitatea) se men ioneaz , pe o linie separat , numele procedurii urmat sau nu de parametri. Dac este necesar, datorit apel rii unui alt proiect sau modul, atunci apelul este dup modelul:

Nume_proiect.Nume_modul.Nume_procedur list de argumente

unde lista de argumente poate sau nu s fie inclus între paranteze. Argumentele efective sunt separate în list prin virgule i trebuie s respecte ordinea ( i tipul) argumentelor din defini ia procedurii. În cazul procedurilor cu multe argumente, dintre care multe op ionale, transferul poate provoca erori de scriere a codului (un argument op ional necesit totu i virgula sa, de unde o num rare atent a virgulelor etc.). Pentru asemenea situa ii (în special) se permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alc tuind lista de argumente, la apelul procedurii, din intr ri de forma

nume_argument:=valoare_argument

13

separate prin virgule i la care nu mai conteaz ordinea ini ial a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adic valorile op ionale dorite i toate valorile neop ionale).

Pentru apelul unei proceduri se va studia i instruc iunea Call.

Proceduri Function

O procedur de tip Function este similar , ca defini ie, unei proceduri Sub, dar are particularitatea c returneaz o valoare prin numele s u (care se comport deci ca o variabil ).

[Public | Private] [Static] Function name [(arglist)] [As type]

[statements]

[name = expression]

[Exit Function]

[statements]

[name = expression]

End Function

Este de remarcat c se poate ata a un tip numelui func iei (adic valorii func iei) i se va remarca existen a instruc iunilor prin care se atribuie func iei valorile calculate.

Valoarea returnat de o func ie poate fi utilizat într-o alt expresie prin includerea numelui func iei urmat, între paranteze, de valorile efective ale parametrilor.

Dac apelul se face prin intermediul instruc iunii Call, valoarea func iei nu poate fi utilizat . În asemenea situa ii se activeaz de fapt doar prelucr rile colaterale (care, pentru claritatea codului, nici nu sunt recomandate).

Exemple de proceduri

Public Function AriaCilindru (raza, inaltime) As Double

Const Pi = 3.14159

cilBaza = Pi*raza^2

cilLaterala = 2*Pi*raza*inaltime

AriaCilindru = 2*cilBaza + cilLaterala

End Function

Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, ByRef cilAria As Double)

Const Pi As Single = 3.14159

14

Dim cilBaza As Single, cilLaterala As Single

cilBaza = Pi*raza^2

cilLaterala = 2*Pi*raza*inaltime

cilAria = 2*cilBaza + cilLaterala

End

Apelul func iei poate fi într-o instruc iune de genul

CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

în timp ce apelul subrutinei poate fi

AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa

Organizarea general a unui proiect VBA

Obiectele i prelucr rile necesare realiz rii unei aplica ii VBA (presupunând c se dore te atingerea unui ansamblu coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un anumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor.

Deoarece prelucr rile proiectate în VBA sunt ata ate documentelor (ac iunilor) unor aplica ii particulare (Word, Excel etc.), proiectele sunt salvate o dat cu documentele pe care le înso esc. Acest fapt nu reduce aria de probleme abordabile întrucât prelucr rile propriu-zise nu sunt limitate la documentul înso it (se poate deschide astfel un document Word alb i s se efectueze orice prelucrare dorit , f r a avea obliga ia de a scrie ceva în documentul deschis).

Într-un proiect VBA sunt identificabile urm toarele componente:

Module standard (denumite ini ial module de cod). Con in declara ii i proceduri generale. Exist de asemenea i module care con in tratarea evenimentelor specifice documentului de care este ata at proiectul.

Module de clas . Con in definirea obiectelor create de utilizator.

Forme. Con in defini iile dialogurilor din interfa a proiectat de utilizator ca i codul program necesar control rii dialogurilor.

Referin e. Într-un proiect este men inut lista altor proiecte, care sunt referite în proiectul curent.

Un modul de cod poate începe cu o sec iune de declara ii. Prin declara ii în elegem instruc iuni neexecutabile prin care se definesc constante, variabile i proceduri externe. Utilizând Public, Static, Private se precizeaz i domeniul de vizibilitate a entit ilor definite.

Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat într-o sec iune separat .

Domeniul unei variabile, constante sau proceduri

Domeniul unei entit i reprezint mul imea instruc iunilor unde poate fi referit acea entitate. Se poate vorbi astfel de vizibilitatea unei entit i. Domeniul este dependent de locul definirii entit ii, de clauzele care apar la definire i de parametrii globali ai proiectului.

15

Not . Este de remarcat c utilizarea unei denumiri în afara domeniului ini ial prefigurat produce, în lipsa instruc iunii Option Explicit, crearea unei noi entit i, f r nici o leg tur cu cea precedent , surs de erori greu detectabile. Acesta este motivul pentru care se recomand declararea explicit a tuturor variabilelor.

Exist trei tipuri de domenii:

o

la nivel de procedur ;

o

la nivel de modul, privat;

o

la nivel de modul, public.

Nivelul procedur

O variabil sau constant definit într-o procedur este vizibil doar în procedur respectiv . Dac o asemenea entitate trebuie referit i în alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmite procedurii prin intermediul argumentelor.

Nivel de modul, privat

Variabilele i constantele definite la nivel de modul (în sec iunea Declarations) sunt Private în mod implicit, adic sunt vizibile doar în modulul respectiv. Utilizarea clauzei Private nu este deci necesar , dar este recomandat .

Not . Dac se utilizeaz instruc iunea Option Private Module (în sec iunea Declarations a modulului) atunci variabilele i procedurile publice vor fi vizibile doar în proiectul curent. În lipsa acestei declara ii, procedurile publice (din toate modulele standard sau clas ) sunt vizibile în toate proiectele care se refer la proiectul curent. Procedurile, variabilele i constantele publice din alte module (cum ar fi modulele ata ate formelor) sunt Private pentru proiectul de defini ie, deci ele nu sunt accesibile proiectelor care se refer la proiectul unde sunt declarate.

Nivel de modul, public

Variabilele declarate la nivel de modul drept Public sunt vizibile în toate procedurile din proiect. Procedurile sunt publice în mod implicit, cu excep ie procedurilor de tratare a evenimentelor, care sunt Private în mod implicit. A se vedea i nota anterioar .

Viata unei variabile

Prin via a unei variabile se în elege timpul cât variabila are o valoare. Este evident c valoarea unei variabile se poate modifica pe durata vie ii sale, dar definitoriu este faptul c variabila are o anumit valoare pe întreaga durat a vie ii sale. La p r sirea domeniului, variabila "moare" i nu mai are ata at o valoare.

La începutul execu iei unei proceduri, toate variabilele sunt ini ializate:

Variabil numeric

0 (zero)

ir de lungime variabil

"" ( ir de lungime zero)

ir de lungime fix

Completat cu caracterul Chr(0) (având codul ASCII 0)

Variabil Variant

Empty

Variabile de tip utilizator

fiecare element este ini ializat separat, potrivit tipului primar

Variabil Object

Nothing (pân la asignarea unei referin e prin Set)

16

Variabilele care nu sunt modificate î i p streaz valoarea ini ial .

Variabilele declarate prin Dim la nivel de procedur au valoare pân la terminarea execu iei procedurii (chiar dac se trece prin apel în alte proceduri).

Variabilele declarate prin Static, la nivel de procedur , au aceea i via ca i variabilele declarate la nivel de modul i î i p streaz valoarea pân la terminarea execu iei codului (inclusiv de la un apel la altul). Includerea clauzei Static în instruc iunea Sub sau Function are ca efect declararea tuturor variabilelor definite în procedura respectiv drept variabile statice (deci care î i p streaz valorile între apeluri).

Variabilele declarate la nivel de modul standard î i p streaz valoarea pe tot timpul execu iei. Variabilele declarate la nivel de modul clas î i p streaz valoarea atât timp cât exist o instan a clasei. Diferen a fa de variabilele Static este aceea c memoria este utilizat permanent (nu se elibereaz la p r sirea domeniului).

Variabile Object

Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object

Dim myDoc As Object

sau specificând exact numele de clas dintr-o bibliotec de obiecte referit

Dim myDoc As Word.Document

În primul mod de definire (ca Object) nu se poate efectua la momentul compil rii existen a obiectului, nu se poate verifica utilizarea corect a propriet tilor i metodelor obiectului i nu se poate lega aceast informa ie de variabila obiect definit . Ata area unui obiect este, în acest caz, o legare târzie (late binding) la momentul execu iei i se efectueaz prin instruc iunea Set.

Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapid , se face la momentul compil rii i poate înl tura mai rapid erori posibile în utilizarea metodelor i propriet ilor obiectului.

Instruc iunea Set are sintaxa:

Set objectvar = {[New] objectexpression | Nothing}

unde

o

objectvar este numele variabilei (sau propriet ii)

o

New permite crearea unei noi instan e a clasei

o

Objectexpression este o expresie constând în numele unui obiect, alt variabil declarat de acela i tip obiect, sau func ie ori metod care returneaz un obiect de acela i tip obiect

o

Nothing permite deconectarea asocierii cu un obiect specific, eliberând resursele sistem i de memorie utilizate.

În general, atunci când se utilizeaz Set pentru a asigna o referin de obiect la o variabil , nu se creeaz o copie a obiectului pentru acea variabil . Este creat doar o referin la obiect. Astfel, mai multe variabile de tip obiect pot s se refere la acela i obiect: orice schimbare a obiectului se va reflecta în toate variabilele care refer obiectul. Utilizând clauza New se va crea efectiv o copie (instan ) a obiectului.

Exemple

Prin urm toarele dou instruc iuni se define te variabila objWord care este legat târziu de o aplica ie Word:

17

Dim objWord As Object

Set obhWord = CreateObject("Word.Application")

Legarea timpurie se poate efectua prin

Dim objWord As Word.Application

Este de remarcat c instruc iunea Set apeleaz o func ie care creeaz i returneaz o referin la un obiect ActiveX.

Constante predefinite (built–in)

Bibliotecile de obiecte din fiecare aplica ie Office furnizeaz o mul ime de constante predefinite, care pot fi utilizate pentru a stabili propriet ti sau pentru a transmite argumente c tre propriet i sau metode. Constantele sunt, de regul , grupate

în tipuri enumerate care reprezint valorile posibile pentru o proprietate specific . De i este posibil s se utilizeze

valoarea numeric a constantei este recomandat s se utilizeze constanta numit întrucât dezvolt ri ulterioare ale mediului Microsoft Office (ca i ale aplica iilor din Visual Studio) tind s p streze compatibilitatea între denumirile constantelor i nu între valorile efective.

De exemplu se prefer

Application.DisplayAlerts = wdAlertAll

în loc de

Application.DisplayAlerts = -1

pentru a fixa ca Word s afi eze toate mesajele de alert la execu ia unei proceduri. Codul scris astfel este i mai explicit.

INSTRUC IUNILE VBA

Generalit i

Exist trei categorii de instruc iuni Visual Basic:

instruc iuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru variabile, constante i proceduri;

instruc iuni de atribuire (prezentate în continuare) prin care se atribuie valori variabilelor sau constantelor;

instruc iuni executabile (prezentate în continuare) care ini iaz ac iuni: execut metode sau proceduri, controleaz fluxul execu iei codului.

În mediul de dezvoltare VBA, sintaxa instruc iunilor este verificat automat dup ce se trece la instruc iunea urm toare

(prin Enter).

Continuarea instruc iunilor

O instruc iune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de un

spa iu. De exemplu, crearea prin program a unui tabel într-un document Word:

ActiveDocument.Tables.Add Range:=Selection.Range, _

NumRows:=3, _

18

NumColumns:= 3

unde, pe lâng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de ad ugare a unui nou tabel la colec ia de tabele a documentului.

Dou instruc iuni pot fi scrise pe o aceea i linie dac sunt separate cu caracterul ":".

Etichetarea liniilor

O linie poate fi identificat :

printr-o etichet : orice nume, care respect regulile generale, care începe în prima coloan a liniei i se termin cu caracterul ":"

printr-un num r: orice combina ie de cifre, care începe în prima coloan a liniei i este unic în modulul respectiv.

Identificatorii de linii pot fi utiliza i în instruc iuni de control, desi codul astfel construit nu respect regulile program rii structurate

Comentarii

Textele explicative (necesare document rii codului) pot fi introduse pe linii separate sau în continuarea liniei de cod.

O linie de comentariu începe cu un apostrof (') sau cu cuvântul Rem urmat de un spa iu.

Comentariul de pe aceea i linie cu o instruc iune se introduce printr-un apostrof urmat de comentariu.

Operatori

În formarea expresiilor de diverse tipuri, operatorii sunt cei utiliza i aproape general în limbajele de programare de nivel

înalt. Pentru fixarea termenilor i nota iilor sunt totu i prezenta i, pe categorii, înso i i, acolo unde este cazul de scurte

explica ii.

Operatori aritmetici

Operator

Semnifica ie

Observa ii

^

Ridicarea la putere

rezultatul este Double sau Variant(Double) cu excep ia: dac un operand este Null, rezultatul este tot Null

*

Înmul irea

rezultatul este dat de cel "mai precis" factor, ordinea cresc toare a "preciziei" fiind, pentru înmul ire, Byte, Integer, Long, Single, Currency, Double i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help – *(operator).

/

Împ r irea

rezultatul este, în general, Double sau Variant(Double). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help – /(operator).

\

Împ r irea întreag

înainte de împ r ire, operanzii sunt rotunji i la Byte, Integer sau Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0.

Mod

Restul împ r irii

operanzii sunt rotunji i la întregi i se ob ine restul împ r irii. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este

19

   

Null, rezultatul este Null. O expresie Empty este considerat ca 0.

+

Adunarea numeric sau concatenarea irurilor

în general, operanzi numerici produc adunarea, iar operanzi iruri produc concatenarea. În cazul numeric, rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i sc dere: Byte, Integer, Long, Single, Double, Currency i Decimal. Deoarece operanzii pot fi orice expresie, pentru o informare complet (de exemplu operanzi Variant) se va studia Help – +(operator).

-

Sc derea sau inversarea semnului

operanzii pot fi doar numerici. Rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i sc dere: Byte, Integer, Long, Single, Double, Currency i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help – -(operator).

Operatori de comparare

Rela iile care exist între diferite tipuri de entit i se pot eviden ia prin compara ii având una dintre formele urm toare:

result = expression1 comparisonoperator expression2

result = object1 Is object2

result = string Like pattern

unde

result este o variabil numeric

expression este o expresie oarecare

comparisonoperator este un operator rela ional

object este un nume de obiect

string este o expresie ir oarecare

pattern este o expresie String sau un domeniu de caractere.

Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau egal), > (mai mare), >= (mai mare sau egal), = (egal), <> (diferit, neegal).

Rezultatul este True (dac este adev rat rela ia), False (dac rela ia este neadev rat ), Null (dac cel pu in un operand este Null).

Operatorul Is produce True dac variabilele se refer la acela i obiect i False în caz contrar.

Operatorul Like compar dou iruri cu observa ia c al doilea tremen este un ablon. Prin urmare rezultatul este True dac primul ir operand este format dup ablon, False în caz contrar. Atunci când un operand este Null, rezultatul este tot Null.

Comportarea operatorului Like depinde de instruc iunea Option Compare, care poate fi:

20

Option Compare Binary, ordinea este cea a reprezent rii interne binare, determinat în Windows de codul de pagin .

Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de set rile locale ale sistemului.

Construc ia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere:

? un caracter oarecare

* oricâte caractere (chiar nici unul)

# o cifr oarecare (0–9).

[charlist] oricare dintre caracterele enumerate în list , un domeniu de litere poate fi dat prin utilizarea cratimei.

[!charlist] orice caracter care nu este în list

Observa ie. Pentru a utiliza în ablon caracterele speciale cu valoare de wildcard se vor utiliza construc ii de tip list : [[], [?] etc. Paranteza dreapta va fi indicat singur : ].

Pentru alte observa ii utile se va studia Help – Like operator.

Operatori de concatenare

Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +.

În sintaxa

expression1 & expression2

unde operanzii sunt expresii oarecare, rezultatul este

de tip String, dac ambii operanzi sunt String

de tip Variant(String) în celelalte cazuri

Null, dac ambii operanzi sunt Null.

Înainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Empty sunt tratate ca iruri de lungime zero ("").

Operatori logici

Pentru opera iile logice sunt utiliza i urm torii operatori, uzuali în programare.

Operator

Semnifica ie

Observa ii

And

conjunc ia logic

Null cu False d False, Null cu True sau cu Null d Null. Operatorul And realizeaz i opera ia de conjunc ie bit cu bit pentru expresii numerice.

21

Eqv

echivalen a logic

Dac o expresie este Null, rezultatul este Null. Eqv realizeaz i compararea bit cu bit a dou expresii numerice, pozi ionând cifrele binare ale rezultatului dup regulile de calcul ale echivalen ei logice: 0 Eqv 0 este 1 etc.

Imp

implica ia logic

True Imp Null este Null, False Imp * este True, Null Imp True este True, Null Imp False (sau Null) este Null. Operatorul Imp realizeaz i compararea bit cu bit a dou expresii numerice, pozi ionând cifrele binare ale rezultatului dup regulile de calcul ale implica iei logice: 1 Imp 0 este 0, în rest rezultatul este 1.

Not

nega ia logic

Not Null este Null. Prin operatorul Not se poate inversa bit cu bit valorile unei variabile, pozi ionându-se corespunz tor un rezultat numeric.

Or

disjunc ia logic

Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaz i o compara ie bit cu bit a dou expresii numerice pozi ionând bi ii corespunz tori ai rezultatului dup regulile lui Or logic.

Xor

disjunc ia exclusiv

Dac un operand este Null, atunci rezultatul este Null. Se poate efectua opera ia de sau exclusiv i bit cu bit pentru dou expresii numerice [b1+b2(mod 2)].

Instruc iuni de atribuire

Atribuirea se poate efectua prin instruc iunea Let (pentru valori atribuite variabilelor i propriet ilor), Set (pentru atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite de utilizator).

Instruc iunea Let

Atribuie valoarea unei expresii la o variabil sau proprietate.

[Let] varname = expression

unde varname este nume de variabil sau de proprietate.

Este de remarcat forma posibil ( i de fapt general utilizat ) f r cuvântul Let.

Observa ii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu pot fi atribuite variabilelor de tip String i nici reciproc.

Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil decât dac valoarea expresiei Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip String (cu excep ia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric.

La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei.

Atribuirea valorilor de tip utilizator poate fi efectuat doar dac ambii termeni au acela i tip definit. Pentru alte situa ii se va utiliza instruc iunea Lset.

Nu se poate utiliza Let (cu sau f r cuvântul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza în aceast situa ie instruc iunea Set.

22

Instruc iunea LSet

Copie, cu aliniere la stânga, un ir de caractere (valoarea expresiei din dreapta) într-o variabila de tip String. Deoarece copierea este binar , poate fi utilizat pentru atribuiri între tipuri utilizator diferite (rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este

LSet stringvar = string

LSet varname1 = varname2

unde

stringvar, string reprezint variabila de tip String i expresia de acela i tip implicate într-o atribuire de iruri.

varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruc iunea Type) diferite. Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stânga) în zona de memorie a primei variabile.

Caracterele care r mân neocupate se completeaz cu spa ii, iar dac zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate).

Instruc iunea LSet

Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) într-o variabila de tip String. Sintaxa este

RSet stringvar = string

Caracterele r mase neocupate în variabil sunt completate ccu spa ii. Instruc iunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator.

Instruc iuni executabile

Execu ia unui program are loc, în lipsa oric rui control, instruc iune cu instruc iune, de la stânga la dreapta i de sus în jos. Acest sens poate fi modificat, într-o oarecare m sur , prin ordinea de preceden a opera iilor în evaluarea expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele program rii i din acest motiv necesitatea structurilor de control a fluxului execu iei. Unele instruc iuni au fost p strate doar din motive de compatibilitate cu versiunile ini iale ale limbajului, în locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare.

Instruc iuni de transfer (GoSub…Return, GoTo, OnError, On…GoSub, On…GoTo)

Aceast categorie cuprinde instruc iunile prin care controlul execu iei este transferat la o alt instruc iune din procedur . În general, utilizarea acestor comenzi nu produce programe foarte structurate (în sensul program rii structurate) i prin urmare, pentru o mai mare claritate a codului, pot fi înlocuite cu alte structuri de programare.

GoSub…Return

În cadrul unei proceduri un grup de instruc iuni poate fi organizat ca o subrutin (similar unei proceduri on-line, nenumite) identificat prin linia de început. Transferul controlului la acest grup de instruc iuni i revenirea la locul apelului se poate efectua prin GoSub…Return cu sintaxa

GoSub line

23

line

Return

unde line este o etichet de linie sau un num r de linie din aceea i procedur .

Pot exista mai multe instruc iuni Return, prima executat produce saltul la instruc iunea care urmeaz celei mai recente instruc iuni GoSub executate.

GoTo

Realizeaz tranferul controlului execu iei la o linie din aceea i procedur .

GoTo line

unde line este o etichet de linie sau un num r de linie din aceea i procedur .

On Error

Permite controlul erorilor prin transferul controlului la rutine de tratare.

Observa ie. Este prezentat în sec iunea dedicat controlului erorilor.

On…GoSub, On…GoTo

Permit o ramificare multipl , dup valoarea unei expresii. Se recomand , pentru claritatea codului, utilizarea structurii Select Case în locul acestor structuri.

On expression GoSub destinationlist

On expression GoTo destinationlist

unde

expression este o expresie numeric având valoare întreag (dup o eventual rotunjire) între 0 i 255 inclusiv.

destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele categorii), din aceea i procedur cu instruc iunea.

Dac valoarea expresiei este negativ sau mai mare decât 255 se produce o eroare.

Dac valoarea expresiei, fie ea k, este în domeniul rangurilor listei, atunci se transfer controlul la linia identificat de al k- lea element al listei.

Dac valoarea expresiei este 0 sau mai mare decât num rul de elemente din list , transferul se efectueaz la linia care

urmeaz instruc iunea On

GoSub

sau On

GoTo.

24

Instruc iuni de terminare sau oprire a programului (DoEvents, End, Exit, Stop)

Terminarea execu iei programului sau oprirea temporar (pauza) se pot realiza prin instruc iunile enumerate aici.

DoEvents

De i nu este o instruc iune VBA ci este o func ie, includerea ei este natural prin aceea c permite cedarea controlului c tre sistemul de operare, care poate astfel s func ioneze în regim de multitasking. Ac iunea poate fi realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este

DoEvents( )

Func ia returneaz , în general, valoarea 0.

Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de evenimente, ca i procesarea tuturor caracterelor din coada SendKeys.

Observa ie. Pentru alte observa ii se va studia documenta ia comenzii DoEvents.

End

Termin execu ia unei proceduri (sub forma prezentat aici) sau indic sfâr itul codului unei structuri de tip bloc (cum ar fi End Function, End If etc., prezentate la structurile respective).

Sintaxa, în ipostaza opririi execu iei, este:

End

Prin aceast instruc iune, care poate fi plasat oriunde în program, execu ia este terminat imediat, f r a se mai executa eventualele instruc iuni scrise pentru tratarea unor evenimente specifice sfâr itului de program (Unload, Terminate etc.).

Fi ierele deschise prin Open sunt închise i toate variabilele sunt eliberate. Obiectele create din modulele clas sunt distruse, iar referin ele din alte aplica ii la asemenea obiecte sunt invalidate. Memoria este eliberat .

Exit

Prin instruc iunea Exit, sub una din multiplele ei forme, se întrerupe o ramur de execu ie (cum ar fi o procedur , o structur iterativ etc.) pentru a se continua nivelul apelant. Sintaxa este

Exit Do

Exit For

Exit Function

Exit Property

Exit Sub

i efectele sunt prezentate la structurile respective. Nu trebuie confundat cu instruc iunea End.

25

Stop

Efectul instruc iunii este dependent de modul de execu iei a programului. Dac se execut varianta compilat a programului (fi ierul .exe) atunci instruc iunea este similar instruc iunii End (suspend execu ia i închide fi ierele deschise). Dac execu ia este din mediul VBA, atunci se suspend execu ia programului, dar nu se închid fi ierele deschise i nu se terge valoarea variabilelor. Execu ia poate fi reluat din punctul de suspendare.

Stop

Instruc iunea este similar introducerii unui punct de oprire (Breakpoint) în codul surs .

Structuri iterative (Do

While

Wend,

With)

Loop,

For

Next,

For Each

Next,

Prin intermediul construc iilor de tip bloc prezentate în aceast sec iune se poate repeta, în mod controlat, un grup de instruc iuni. În cazul unui num r nedefinit de repeti ii, condi ia de oprire poate fi testat la începutul sau la sfâr itul unui ciclu, prin alegerea structurii adecvate.

Do…Loop

Se vor utiliza structuri Do…Loop pentru a executa un grup de instruc iuni de un num r de ori nedefinit aprioric. Dac se cunoa te num rul de cicluri, se va utiliza structura For…Next.

Înainte de continuare se va testa o condi ie (despre care se presupune c poate fi modificat în instruc iunile executate). Diferitele variante posibile pentru Do…Loop difer dup momentul evalu rii condi iei i decizia luat .

Do [{While | Until} condition]

 

[statements]

[Exit Do]

[statements]

Loop

sau

Do

 

[statements]

[Exit Do]

[statements]

Loop [{While | Until} condition]

unde

condition este o expresie care valoare de adev r True sau False. O condi ie care este Null se consider False.

26

statements sunt instruc iounile care se repet atâta timp (while) sau pân când (until) condi ia devine True.

Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruc iune care urmeaz întregii structuri (deci de dup linia care începe cu Loop).

Se poate abandona ciclarea oriunde în corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax ). Dac apare o comand Exit Do se poate omite chiar i condi ia din enun întrucât execu ia se va termina prin aceast decizie.

Structurile Do pot fi inserate (dar complet) unele în altele. O terminare (prin orice metod ) a unei bucle transfer controlul la nivelul Do imediat superior.

Execu ia structurilor este explicat în tabelul urm tor

Do While…Loop

Testeaz condi ia la începutul buclei, execut bucla numai dac rezultatul este True i continu astfel pân când o nou evaluare produce False.

Do Until…Loop

Testeaz condi ia la începutul buclei, execut bucla numai dac rezultatul este False i continu astfel pân când o nou evaluare produce True.

Do…Loop While

Se execut întotdeauna bucla o dat , se testeaz condi ia la sfâr itul buclei i se repet bucla atât timp cât condi ia este True. Oprirea este pe condi ie fals .

Do…Loop Until

Se execut întotdeauna bucla o dat , se testeaz condi ia la sfâr itul buclei i se repet bucla atât timp cât condi ia este False. Oprirea este pe condi ie adev rat .

For…Next

Atunci când se cunoa te num rul de repet ri ale unui bloc de instruc iuni, se va folosi structura For…Next. Structura utilizeaz o variabil contor, a c rei valoare se modific la fiecare ciclu, oprirea fiind atunci când se atinge o valoare specificat . Sintaxa este:

For counter = start To end [Step step]

Next [counter]

unde

[statements]

[Exit For]

[statements]

counter este variabila contor (num r repet rile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou.

start este valoarea ini ial a contorului.

end este valoarea final a contorului.

step este cantitatea care se adun la contor la fiecare pas. În cazul în care nu se specific este implicit 1. Poate fi i negativ .

27

statements sunt instruc iunile care se repet . Dac nu se specific