Sunteți pe pagina 1din 291

CUPRINS

• VBA - Bazele programarii Determinarea tipului de selec ie


Obiectele Find i Replacement
• Instructiunile VBA Find
ClearFormatting
• Operatiuni de intrare-iesire Execute
Selection.Find
• Visual Basic Editor Range.Find
Replacement
• Modele de obiecte Obiectele Table, Column, Row i Cell
Colec ia Tables
• Obiecte Microsoft Word Obiectul Table
Obiectul Application Colec ia Columns
Propriet i (obiectul Application) Obiectul Column
DisplayScrollBars Colec ia Rows, obiectul Row
DisplayStatusBar Colec ia Cells
Height Obiectul Cell
Width Exemple cu obiectele Table,
WindowState Column, Row i Cell
ActiveDocument Utilizarea obiectului HeaderFooter
ActivePrinter Colec ia Styles
ActiveWindow Obiectul Style
Documents Colec ia CommandBars
Selection Colec ia Dialogs
Windows Câmpuri – ad ugare, editare
Metode (obiectul Application) Verificarea unui obiect
Quit Modificarea comenzilor Word
Obiectul Document Lucrul cu evenimente
Referirea unui Document Evenimente pentru Document
Deschiderea documentelor Evenimente pentru Application
Crearea/salvarea documentelor Evenimente pentru ActiveX
Activarea unui document Auto Macro
Tip rirea unui document Automatizarea aplica iilor
Închiderea documentelor Automatizarea Word din alt aplica ie
Accesarea obiectelor din Document Automatizarea altei aplica ii din Word
Obiectul Range Comunicarea cu obiectele scufundate
Obiect Range sau obiect Selection
Referin a prin metoda Range • Controale ActiveX si Dialoguri
Referin a prin proprietatea Range Proiectarea casetelor de dialog
Modificarea unui document utilizator
Lucrul cu textul din Range Crearea unui nou dialog
Redefinirea unui obiect Range Scrierea procedurilor de r spuns la
Atribuirea obiectelor Range evenimente
Obiectul Selection Controale
Deplasarea i extinderea selec iei Label
Metoda GoTo TextBox
Metodele GoToNext, GoToPrevious ListBox
Obiecte accesibile din Selection ComboBox
Selection – propriet i i metode CheckBox
uzuale OptionButton
Proprietatea Text ToggleButton
Formatarea textului selectat CommandButton
Returnarea obiectului Range TabStrip
Proprietatea Information MultiPage
Frame
1
Image • Obiecte Microsoft Access
Utilizarea dialogurilor utilizator Obiectele accesibile în Microsoft
Afi area unui dialog Access
Ob inerea/editarea propriet ilor în Obiectele Microsoft Access
execu ie Obiectul Application
Utilizarea controalelor în documente Utilizarea obiectului Application în
Word, Excel, PowerPoint automatizare
Controale ActiveX în documente Colec ia Forms
Word Referirea la un obiect Form
Controale ActiveX în foi de calcul Propriet ile obiectului Form
Excel Proprietatea Me (obiectul Form)
Controale ActiveX în diapozitive Proprietatea Section (obiectul
PowerPoint Form)
Controlarea programatic a Proprietatea Properties (obiectul
controalelor din documentele aplica iilor Form)
Proprietatea Module (obiectul
• Obiecte Microsoft Excel Form)
Obiectul Application Proprietatea RecordSource
Obiectul Workbook (obiectul Form)
Deschiderea unui Workbook Module ata ate formelor
Metoda GetOpenFilename Crearea formelor în timpul execu iei
Crearea/salvarea unui Workbook Colec ia Reports
Metoda Add (colec ia Workbooks) Referirea obiectelor Report
Metoda SaveAs Module asociate rapoartelor
Metoda Save Crearea rapoartelor în timpul
Metoda GetSaveAsFilename execu iei
Închiderea unui Workbook Func iile CreateForm,
Metoda Close CreateReport
Obiectul Range Func iile CreateControl,
Referin e de tip A1 sau nume de CreateReportControl
domeniu Exemplu de creare a unui raport
Utilizarea indicilor de linii i coloane Colec ia Controls
Utilizarea propriet ii Offset Controale Microsoft Access
Utilizarea propriet ilor CurrentRegion Controale ActiveX
i UsedRegion Referirea obiectelor Control
Parcurgerea unui domeniu de celule Propriet ile obiectului Control
Utilizarea instruc iunii For Proprietatea Hyperlink (obiectul
Each…Next Control)
Utilizarea instruc iunii Do…Loop Proprietatea ControlType (obiectul
Utilizarea propriet ii Address Control)
Evenimentele din Excel 97 Controale legate de date (Data-
Permiterea i inhibarea Bound Controls)
evenimentelor Controale care au o colec ie
Utilizarea evenimentelor Controls
Evenimentele obiectului Worksheet Colec ia Modules
Exemplu Referirea la obiecte Module
Evenimentele obiectului Chart Module standard i module clas
Exemplu Propriet ile obiectului Module
Evenimentele obiectului Workbook Determinarea num rului de linii
Exemplu Lucrul cu procedurile
Evenimentele obiectului Application Metodele obiectului Module
Utilizarea modulelor clas cu Ad ugarea de text la un modul
evenimente Evenimentele unui modul clas
Colec ia References
Referirea obiectelor Reference
2
Propriet ile obiectului Reference Înregistrarea unei surse de date
Metodele colec iei References ODBC
Stabilirea unei referin e în Visual Utilizarea DAO cu ODBCDirect
Basic Obiectul DBEngine
Obiectul DoCmd Colec ia Workspace
Metoda OpenForm Colec ia Connections
Metoda RunCommand Deschiderea conect rilor
Obiectul Screen asincrone
Propriet ile obiectului Screen Colec ia Databases
Comutarea între Connection i
• DAO (Data Access Objects) Database
Lucrul cu obiectele DAO Colec ia QueryDefs
Proiectarea bazelor de date în Executarea interog rilor
Microsoft Access asincrone
Stabilire unei referin e la biblioteca de Colec ia Parameters
obiecte DAO Colec ia Recordsets
Referirea obiectelor DAO în Visual Obiecte Recordset de tip
Basic dinamic
Ad ugarea de noi obiecte DAO la o Deschiderea asincron a
colec ie obiectelor Recordset
Lucrul cu date externe Colec ia Fields
Utilizare DAO cu surse de date Utilizare ODBCDirect
ODBC Utilizarea actualiz rii optimiste
Utilizare Dao cu Microsoft Jet în lot
Obiectul DBEngine Tratarea coliziunilor
Colec ia Workspaces Utilizarea cursoarelor în spa iile
Metoda CreateWorkspace ODBCDirect
Colec ia Errors Caracteristicile cursoarelor
Colec ia Databases Cursoare client-side sau
Colec ia TableDefs server-side
Colec ia Fields Alegerea tipului de cursor
Colec ia Indexes Blocarea înregistr rilor
Colec ia QueryDefs Limit ri ale cursoarelor
Colec ia Parameters (obiectul Reg sirea mul imilor multiple
QueryDef) de rezultate
Colec ia Relations (obiectul Lucrul cu proceduri memorate
Database)
Colec ia Recordsets • Obiecte Microsoft PowerPoint
Obiecte Recordset de tip Obiectul Application
tabel Returnarea unui obiect
Obiecte Recordset de tip Application
dynaset Controlul aspectului ferestrei
Obiecte Recordset de tip aplica iei
snapshot Controlarea atributelor i
Obiecte Recordset de tip comport rii globale
forward-only Accesarea principalelor obiecte
Metodele obiectelor Recordset Accesarea obiectelor partajate
Securitatea datelor de Ms Office
Colec ia Properties Obiectul Presentation
Accesarea datelor ODBC Returnarea obiectului
Utilizarea Microsoft Jet pentru Presentation
date ODBC Deschiderea unei prezent ri
Utilizarea ODBCDirect pentru Crearea unei prezent ri
date ODBC Importul dintr-un outline Word
Activarea unei prezent ri
3
Numerotarea i dimensiunile Mutarea unui element din
slide-urilor spa iul de lucru în caiet
Stabilirea unui aspect unitar Eliminarea unui
Tip rirea unei prezent ri meniu/toolbar salvat în caiet
Salvarea unei prezent ri Microsoft Word
Închiderea unei prezent ri Microsoft PowerPoint
Configurarea i executarea unei Componente ale interfe ei
prezent ri utilizator
Accesul la diapozitivele Sistemul de meniuri
prezent rii Adaptarea sistemului de meniuri
Obiectele Slides, Slide i Componente personale i
SlideRange componente built-in
Returnarea colec iei Slides Utilizarea submeniurilro
Returnarea unui obiect Slide Utilizarea meniurilor contextuale
Returnarea unui obiect Text box, List box, Combo box
SlideRange Modificarea în design-time
Ad ugarea unei diapozitiv Ad ugarea de bare de meniu
Stabilirea fundalului i schemei proprii
de culori Ad ugarea meniurilor
Alegerea unui layout Ad ugarea submeniurilor
Ad ugarea de obiecte Ad ugarea i gruparea
Ordinea diapozitivelor comenzilor
Stabilirea efectelor tranzi iei Ad ugarea i modificarea
Referirea notelor meniurilor contextuale
Obiectul Selection tergerea componentelor de
Crearea unei selec ii meniu
Returnarea unei selec ii Restaurarea componentelor
Returnarea unui obiect din built-in
selec ie Modificarea în run-time
Obiectele View i SlideShowView Afi area unei bare de meniu
Prezent ri, ferestre, viziuni Afi area dinamic a
Returnarea obeictelor View i componentelor de meniu
SlideShowView Permiterea i inhibarea
Navigarea printre diapozitive componentelor de meniu
Alipirea la un obiect View Indicarea st rii unei intr ri de
Controlul viziunii din fereastra meniu
documentului Redenumirea unei intr ri
Returnarea diapozitivului curent Bare de unelte
Controlul obiectelor în slide Adaptarea barelor de unelte
show Utilizarea meniurilor
Controlul anima iei Text box, List box, Combo box
R spunsul la ac iunea mouse- Modificarea barelor de unelte în
ului design-time
Controlul unui clip Ad ugarea unei bare de
unelte
• Meniuri si bare de unelte Ad ugarea i gruparea
Modificarea interfe ei cu controalelor
utilizatorul Adaugarea i ini ializarea
Dialogul Customize controalelor text box, list box,
Visual Basic combo box
Domeniul schimb rilor asupra Eliminarea unui control
interfe ei utilizator Restaurarea barelor de
Microsoft Access unelte built-in
Microsoft Excel Modificarea barelor de unelte în
run-time

4
Afi area/ascunderea Tratarea erorilor în procedura
controalelor i barelor de unelte apelant
Mutarea i redimensionarea Utilizarea datelor de tip Variant
barelor de unelte Tratarea centralizat a erorilor
Restaurarea barelor de Inhibarea trat rii erorilor
unelte built-in Depanarea programelor care au
Permiterea i interzicerea rutine de tratare a erorilor
accesului la controale Tratarea erorilor din obiectele
Indicarea st rii activ/inactiv a referite
unui buton Tratarea erorilor transmise din
Modificarea controalelor Text obiectele referite
box, List box i Combo box Depanarea trat rii erorilor din
ID-uri de controale i intr ri de obiecte referite
meniu Depanarea programelor
Tipuri de erori
• Forme grafice Unelte de depanare
Obiectele Shape, ShapeRange i Bara de unelte Debug
Shapes Evitarea "bug"-urilor
Returnarea colec iei Shapes Design Time, Run Time i Break
Returnarea obiectului Shape Mode
Returnarea colec iei Utilizarea ferestrelor de depanare
ShapeRange Utilizarea modului break
Desenarea unei forme grafice Intrarea în modul break la o
Editarea unei forme grafice instruc iune cu probleme
Determinarea Fixarea unei erori run-time i
propriet ilor/metodelor adecvate continuare
Lucrul cu obiecte OLE Monitorizarea datelor prin
Lucrul cu mai multe forme expresii de urm rire
Construirea unui obiect Ad ugarea, editarea sau
ShapeRange eliminarea unei expresii urm rite
Lucrul cu colec ia ShapeRange Utilizarea urm ririi rapide
Utilizarea unui punct de oprire
• Tratarea erorilor. Depanarea programelor Utilizarea instruc iunii Stop
Cum se gestioneaz erorile Executarea unor secven e de cod
Proiectarea unei rutine de tratare selectate
a erorilor Utilizarea comenzii Step Into
Stabilirea capcanei de erori Utilizarea comenzii Step Over
Scrierea unei rutine de tratare a Utilizarea comenzii Step Out
erorilor Trecerea peste sec iuni de cod
Ie irea din rutina de tratare a Stabilirea instruc iunii urm toare
erorilor Indicarea instruc iunii urm toare
Diferen a dintre Resume i Monitorizarea listei de apeluri
Resume Next (Call Stack)
Reluarea execu iei la o linie Testarea datelor i procedurilor
specificat cu fereastra Immediate
Ierarhia de tratare a erorilor Tip rirea informa iilor în fereastra
C utarea în lista de apeluri Immediate
Indica ii pentru o tratare Tip rirea din codul aplica iei
complex a erorilor Tip rirea din fereastra
Testarea trat rii erorilor prin Immediate
generarea de erori Atribuirea de valori
Definirea codurilor proprii de Testarea procedurilor cu
eroare fereastra Immediate
Tratarea inline a erorilor Verificarea numerelor de eroare
Returnarea numerelor de eroare
5
Trucuri utile în fereastra Înc rcarea la cerere din Word
Immediate Codul executat la
Considera ii speciale înc rcare/desc rcare
Oprirea execu iei în procedurile Excel – evenimentele
evenimentelor MouseDown sau AddinInstall i AddinUninstall
KeyDown PowerPoint – procedurile
Oprirea execu iei în procedurile Auto_Open i Auto_Close
evenimentelor GotFocus sau Word – procedurile AutoExec
LostFocus i AutoExit
Verificarea final a codului
• Distribuirea solutiilor VBA pentru aplicatiile Referin e la ActiveWorkbook
Microsoft Office sau ActiveDocument
Preg tirea solu iei pentru Apelul procedurilor din alte
distribuire proiecte
Alegerea modului de Evitarea referin elor
împachetare a solu iei nerezolvate
Controlul înc rc rii PowerPoint – apelul unei
Înc rcarea la start rutine f r referin
Înc rcarea automat în Excel Referin e legate târziu
Înc rcarea automat în Protejarea codului
PowerPoint Salvarea solu iei ca un Add-in
Înc rcarea add-in-urilor din sau Global Template
sesiunea precedent Crearea unui Add-in în Excel
Înc rcarea programatic Crearea unui Add-in în
Înc rcarea ca r spuns la un PowerPoint
eveniment Crearea unui template global
Înc rcarea unui template prin în Word
linia de comand Depanarea unui Add-in sau
Desc rcarea programatic Global Template
Înc rcarea la cerere Depanarea unui add-in în
Utilizarea referin elor explicite Excel
în Excel Depanarea unui add-in în
Înc rcare unei biblioteci în PowerPoint
Excel Depanarea unui template
Ad ugarea meniurilor Excel global în Word
f r add-in Distribuirea solu iilor prin Setup
Înc rcarea la cerere în Wizard
PowerPoint

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
0 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.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 în general, operanzi numerici produc adunarea, iar operanzi iruri produc
sau concatenarea concatenarea. În cazul numeric, rezultatul este de tipul cel "mai precis" al operanzilor,
irurilor 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 operanzii pot fi doar numerici. Rezultatul este de tipul cel "mai precis" al operanzilor,
inversarea semnului 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...Loop, For...Next, For Each...Next,


While...Wend, With)

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]

[statements]

[Exit For]

[statements]

Next [counter]

unde

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 , atunci singura ac iune este cea de modificare a
contorului de un num r specificat de ori.

Ac iunea este dictat de pasul de incrementare i rela ia dintre valoarea ini ial i cea final .

Instruc iunile din corpul structurii se execut dac

o counter <= end pentru step >= 0 sau


o counter >= end pentru step < 0.

Dup ce toate instruc iunile s-au executat, valoarea step este ad ugat la valoarea contorului i instruc iunile se execut
din nou dup acela i test ca i prima dat , sau bucla For…Next este terminat i se execut prima instruc iune de dup
linia Next.

Specificarea numelui contorului în linia Next poate clarifica textul surs , mai ales în cazul când exist structuri For…Next
îmbricate.

Corpul unei bucle For…Next poate include (complet) o alt structur For…Next. În asemenea situa ii, structurile îmbricate
trebuie s aib variabile contor diferite.

Instruc iunile Exit For pot fi plasate oriunde în corpul unei bucle i provoac abandonarea cicl rii. Controlul execu iei se
transfer la prima instruc iune de dup linia Next.

For Each…Next

Similar structurii For…Next, structura For Each…Next repet un grup de instruc iuni pentru fiecare element dintr-o
colec ie de obiecte sau dintr-un tablou (cu excep ia celor de un tip utilizator). Este util atunci când nu se cunoa te
num rul de elemente sau dac se modific , în timpul execu iei, con inutul colec iei.

Sintaxa este:

For Each element In group

[statements]

[Exit For]

[statements]

Next [element]

unde

element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colec ie de obiecte,
atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect specific pentru
biblioteca de obiecte referit . Pentru parcurgerea unui tablou, element poate fi doar o variabil de tip
Variant.

group este numele colec iei de obiecte sau al tabloului.

statements este grupul de istruc iuni executate pentru fiecare element.

28
Execu ia unei structuri For Each…Next este

1. Se define te element ca numind primul element din grup (dac nu exist nici un element, se transfer controlul la
prima instruc iune de dup Next – se p r se te bucla f r executarea instruc iunilor).
2. Se execut instruc iunile din corpul buclei For.
3. Se testeaz dac element este ultimul element din grup. Dac r spunsul este afirmatif, se p r se te bucla.
4. Se define te element ca numind urm torul element din grup.
5. Se repet pa ii 2 pân la 4.

Instruc iunile Exit For sunt explicate la For…Next.

Buclele ForEach...Next pot fi îmbricate cu condi ia ca elementele utilizate la iterare s fie diferite.

Observa ie. Pentru tergerea tuturor obiectelor dintr-o colec ie se va utiliza For…Next i nu For Each…Next. Se va utiliza
ca num r de obiecte colec ie.Count.

While…Wend

Execut un grup de instruc iuni atât timp cât este adev rat o condi ie. Sintaxa

While condition

[statements]

Wend

Este recomandat s se utilizeze o structur Do…Loop în locul acestei structuri.

With

Programarea orientat pe obiecte produce, datorit calific rilor succesive, construc ii foarte complexe atunci când se
numesc propriet ile unui obiect. În cazul modific rilor succesive ale mai multor propriet i ale aceluia i obiect, repetarea
zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificat prin utilizarea
structurii With…End With. O asemenea structur execut o serie de instruc iuni pentru un obiect sau pentru o variabil de
tip utilizator. Sintaxa este:

With object

[statements]

End With

unde

object este numele unui obiect sau a unui tip definit de utilizator

statements sunt instruc iunile care se execut pentru entitatea precizat .

Permi ând omiterea recalific rilor din referin ele la obiectul precizat, orice construc ie de tipul

".nume" este interpretat în instruc iunile structurii drept "object.nume".

29
Într-un bloc With nu se poate schimba obiectul procesat.

La plasarea unui bloc With în interiorul altui bloc With, obiectul extern este mascat complet, deci calific rile eventuale la
acest obiect vor fi efectuate.

Nu se recomand saltul în i dintr-un bloc With.

Structuri de decizie (If…Then…Else, Select Case)

Ramificarea firului execu iei dup rezultatul verific rii unei condi ii este o necesitate frecvent în orice implementare.

Pe lâng structurile prezentate, se pot utiliza trei func ii care realizeaz alegeri în mod liniarizat (pe o linie de cod):
Choose(), Iif(), Switch().

If…Then…Else

O asemenea structur , întâlnit de altfel în toate limbajele de programare, execut un grup de instruc iuni ca r spuns la
îndeplinirea unei condi ii (compus sau nu din mai multe condi ii testate secven ial). Sintaxa permite o mare varietate de
forme:

If condition Then [statements] [Else elsestatements]

sau

If condition Then

[statements]

[ElseIf condition-n Then

[elseifstatements] ...

[Else

[elsestatements]]

End If

unde

condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat
False);
expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat în
objecttype.

statements, elsestatements, elseifstatements sunt blocurile de instruc iuni executate atunci când condi iile
corespunz toare sunt True.

La utilizarea primei forme, f r clauza Else, este posibil s se scrie mai multe instruc iuni, separate de ":", pe aceea i
linie.

30
Verificarea condi iilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor rezultatul
poate fi precizat mai înainte (de exemplu OR cu primul operand True).

Select Case

Instruc iunea Select Case se poate utiliza în locul unor instruc iuni ElseIf multiple (dintr-o structur If…Then…ElseIf)
atunci când se compar aceea i expresie cu mai multe valori, diferite între ele. Instruc iunea Select Case furnizeaz , prin
urmare, un sistem de luare a deciziilor similar instruc iunii If…Then…ElseIf. Totu i, Select Case produce un un cod mai
eficient i mai inteligibil. Sintaxa este:

Select Case testexpression

[Case expressionlist-n

[statements-n]] ...

[Case Else

[elsestatements]]

End Select

unde

testexpression este o expresie numeric sau ir.

expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma:

• expression.
• expression To expression. Cuvântul To introduce un interval de valori, valoarea minim fiind prima specificat .
• Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptând Is i Like) pentru a
specifica un domeniu de valori.

statements-n reprezint una sau mai multe instruc iuni care se vor executa dac testexpression este egal cu un element
din expressionlist-n.

elsestatements reprezint una sau mai multe instruc iuni care se vor executa dac testexpression nu este egal cu nici
un element din listele liniilor Case.

Dac testexpression se potrive te cu un element dintr-o list Case, se vor executa instruc iunile care urmeaz aceast
clauz Case pân la urm toarea clauz Case, sau pân la End Select. Control execu iei trece apoi la instruc iunea care
urmeaz liniei finale End Select. Rezult c dac testexpression se reg se te în mai multe liste, doar prima potrivire este
considerat .

Clauza Case Else are semnifica ia uzual "altfel, în rest, în caz contrar etc.", adic introduce instruc iunile care se
execut atunci când expresia de test nu se potrive te nici unui element din listele clauzelor Else. Dac aceasta este
situa ia i nu este specificat o clauz Case Else, atunci execu ia urmeaz cu prima instruc iune de dup End Select.

Instruc iunile Select Case pot fi scufundate unele în altele, structurile interioare fiind complete (fiecare structur are End
Select propriu, includerea este complet ).

Apeluri de proceduri i programe


31
În aceast sec iune se prezint doar func ia Shell(), deoarece despre proceduri i apelul lor s-a discutat în capitolul 1.

Func ia Shell()

Execut un program executabil i returneaz un Variant(Double) reprezentând ID-ul de task al programului în caz de
succes; în caz contrar returneaz zero. Sintaxa este

Shell(pathname[,windowstyle])

unde

pathname este Variant (String). Con ine numele programului care se execut , argumentele necesare i
poate da calea complet (dac este nevoie).

windowstyle este Variant (Integer) i precizeaz stilul ferestrei în care se va executa programul (implicit
este minimizat, cu focus).

Valorile posibile pentru argumentul windowstyle sunt

Constanta numit Valoarea Semnifica ia

VbHide 0 Fereastra este ascuns iar focus-ul este pe fereastra ascuns .

VbNormalFocus 1 Fereastra are focus-ul i este dimensionat i pozi ionat normal.

VbMinimizedFocus 2 Fereastra este afi at ca o icoan (minimizat ) dar are focus-ul.

VbMaximizedFocus 3 Fereastr maximizat , cu focus.

VbNormalNoFocus 4 Fereastra este normal (restaurat la m rimea i pozi ia cea mai recent ) dar nu
are focus-ul. Fereastra activ curent î i p streaz focus-ul.

VbMinimizedNoFocus 6 Fereastr minimizat , f r focus. Fereastra activ curent î i p streaz focus-ul.

Dac func ia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut
asincron, deci nu exist certitudinea c acest program se termin înainte de execu ia instruc iunilor care urmeaz liniei
Shell.

Opera iuni de intrare-ie ire

În categoria opera iunilor de I/O se pot deosebi

• schimbul de informa ii cu utilizatorul: acesta se poate desf ura prin intermediul unor formulare (forms)
predefinite (InputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului VBA.
• schimbul de informa ii cu fi iere i/sau baze de date: acesta se realizeaz prin intermediul unor instruc iuni
dedicate acestor opera ii.

32
Dialogul standard cu utilizatorul

În general, utilizatorul r spunde la apari ia unei boxe de dialog prin ac ionarea butonului adecvat r spunsului s u i/sau
prin înscrierea unei informa ii într-o zon dedicat acestui scop. Informa ia înscris este transferat programului ca
valoare a func iei care ini iaz dialogul grafic.

Func ia InputBox

Apelul func iei InputBox afi eaz o box de dialog care con ine un mesaj, dou butoane (OK i Cancel) i o zon text în
care se poate tasta un r spuns (de tip String, chiar dac se transmite o valoare numeric ). Se a teapt ca utilizatorul s
introduc un text în zona rezervat sau s ac ioneze un buton. Textul introdus este transmis ca valoare a func iei la
ac ionarea butonului OK (sau Enter), iar ac ionarea butonului Cancel (ca i închiderea dialogului ca fereastr ) transmite
un ir de lungime zero (indiferent de valoarea zonei text. Sintaxa este

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

unde

prompt este expresia String cu mesajul afi at în dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai multe linii
prin combina ii de caractere Chr(13) – carriage return, Chr(10) – linefeed, Chr(13)&Chr(10) – CR+LF.

title este expresia de tip String cu titlul ferestrei dialogului. Dac este omis se va folosi titlul aplica iei.

default este expresia de tip String, op ional , con inând textul afi at ini ial în zona text rezervat utilizatorului. Textul este,
în lipsa modific rii lui, retransmis ca r spuns (ac ionând butonul OK).

xpos este expresia numeric specificând pozi ia orizontal a dialogului (în twips, de la latura stânga a ecranului). În lipsa
argumentului, boxa de dialog este centrat orizontal.

ypos este expresia numeric specificând pozi ia vertical a dialogului (în twips, de la latura de sus a ecranului). În lipsa
argumentului, boxa de dialog este pozi ionat la aproximativ o treime de ecran.

helpfile este expresia de tip String care identific fi ierul Help utilizat.Dac este indicat helpfile, trebuie s fie precizat i
context. Textul de ajutor poate fi v zut prin tasta F1, anumite aplica ii afi eaz i un buton Help.

context Expresie numeric cu num rul de context Help al intr rii corespunz toare dialogului afi at. Apare obligatoriu
împreun cu helpfile.

Dac valoarea func iei nu este atribuit (sau utilizat într-o alt expresie), este evident c se pierde, f r semnalarea
vreunei erori.

Func ia MsgBox

Un dialog mai simplu decât InputBox este realizat prin forma predefinit afi at de func ia MsgBox. Se afi eaz un mesaj
într-o box de dialog i se a teapt ca utilizatorul s ac ioneze unul dintre butoanele existente (num rul i tipul lor lor este
fixat la proiectarea aplica iei). Func ia returneaz un întreg indicând care buton a fost ac ionat. Sintaxa este

[intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context])

unde

prompt este textul mesajului (Vezi InputBox)


33
buttons este o expresie numeric egal cu suma valorilor care specific num rul, tipul i atributele butoanelor. Aici se
fixeaz i modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz ). Valoarea implicit este 0.

title,helpfile, context identice cu argumentele similare descrise la InputBox.

Constantele recomandate pentru formarea argumentului buttons sunt

Constanta Valoare Descriere

VbOKOnly 0 Numai butonul OK

VbOKCancel 1 OK i Cancel

VbAbortRetryIgnore 2 Abort, Retry i Ignore

VbYesNoCancel 3 Yes, No i Cancel

VbYesNo 4 Yes i No

VbRetryCancel 5 Retry i Cancel

VbCritical 16 Icoana de Critical Message

VbQuestion 32 Icoana de Warning Query

VbExclamation 48 Icoana Warning Message

VbInformation 64 Icoana de Information Message

VbDefaultButton1 0 Primul buton este cel implicit (echivalent cu Enter)

VbDefaultButton2 256 Al doilea buton este cel implicit

VbDefaultButton3 512 Al treilea buton este cel implicit

VbDefaultButton4 768 Al patrulea buton este cel implicit

VbApplicationModal 0 Application modal: aplicatia curent este oprit pân când r spunde utilizatorul

VbSystemModal 4096 System modal: toate aplica iile sunt oprite pân când utilizatorul r spunde la dialog

Valorile 0-5 descriu butoanele, 16,32,48 i 64 descriu stilul icoanei afi ate, 0, 256 i 512 determin butonul implicit, iar
ultimul grup (0 i 4096) determin modalitatea boxei de dialog. La formarea argumentului Buttons se va adun doar câte
un num r din fiecare grup.

Pentru a utiliza valoarea returnat de func ie, aceasta trebuie inclus într-o expresie (eventual atribuit unei variabile
întregi).

Valorile returnate de func ie i care pot fi testate, în expresii logice, pentru a alege ramura de prelucrare dorit de
utilizator sunt

34
Constanta Valoare Descriere

VbOK 1 OK

VbCancel 2 Cancel

VbAbort 3 Abort

VbRetry 4 Retry

VbIgnore 5 Ignore

VbYes 6 Yes

VbNo 7 No

Ac ionarea tastei Esc este echivalent cu ac ionarea butonului Cancel (dac acesta este prezent). Dac în dialog este
prezent butonul Help, ac ionarea lui nu termin dialogul.

Utilizarea fi ierelor

Proces rile tipice programate în VBA prelucreaz informa ii din dou mari categorii de fi iere:

• fi iere ale aplica iilor server (.doc în Word, .xls în Excel etc.)
• fi iere utilizator (create i/sau gestionate de proiect pentru date de intrare, temporare sau de ie ire).

Accesarea direct a fi ierelor din prima categorie (f r apelul aplica iei server specifice) poate produce coruperea
fi ierului, astfel încât nu mai este recunoscut de aplica ia mam . Prelucrarea acestor fi iere trebuie s fie
executat în aplica iile care le-au creat.

Pentru lucrul cu un fi ier utilizator (în continuare prin fi ier se va în elege, f r alte preciz ri, un fi ier utilizator) acesta
trebuie mai întâi deschis (instruc iunea Open), opera iunea producând i crearea fi ierului în cazul unui fi ier inexistent
(nou). Dup utilizare fi ierul trebuie s fie închis (opera iune efectuat , la terminarea normal a programului, în mod
automat).

Un fi ier are ata at un num r de identificare, unic pentru un proces. Identificare fi ierului se poate efectua, în program,
prin numele s u sau prin num rul ata at. Num rul poate fi în domeniul 1–255 pentru fi ierele proprii aplica iei i în
domeniul 256–511 pentru fi iere accesibile din alte aplica ii. Un num r neutilizat (liber) poate fi furnizat de apelul la func ia
FreeFile().

Exist trei moduri de acces la înregistr rile unui fi ier, acces definit la deschiderea acestuia.

• acces secven ial (modurile Input, Output i Append), utilizat de regul pentru scrierea fi ierelor text (rapoarte,
jurnale etc.);
• acces raandom (aleator) (modul Random), în cazul când este necesar s se scrie i s se citeasc înregistr rile
într-o ordine nedefinit , opera iunile de intrare/ie ire fiind amalgamate între ele;
• acces binar (modul Binary), utilizat la citirea/scrierea fi ierelor byte cu byte (de exemplu fi iere bitmap).

Un fi ier deschis cu un mod de acces trebuie exploatat în acest mod pân când este închis i deschis în alt mod (dac
structura lui permite a a ceva).

Instruc iunile tipice pentru accesul la informa iile dintr-un fi ier sunt

35
Modul de acces Scriere Citire

Secven ial Print #, Write # Input #

Random Put Get

Binar Put Get

Deoarece gestionarea fi ierelor nu se rezum doar la scriere/citire, în tabelul urm tor este un rezumat al principalelor
opera iuni pe care le suport fi ierele, cu instruc iunile care faciliteaz respectiva ac iune.

Ac iune Instruc iuni

Citire Get, Input, Input #, Line Input #

Controlul ie irilor Format, Print, Print #, Spc, Tab, Width #

Copierea unui fi ier FileCopy

Creare, acces Open

Fixarea atributelor FileAttr, GetAttr, SetAttr

Fixarea pozi iei active de citire/scriere Seek

Inchidere Close, Reset

Informa ii despre un fi ier EOF, FileAttr, FileDateTime, FileLen, FreeFile,


GetAttr, Loc, LOF, Seek

Lungimea unui fi ier FileLen

Opera ii asupra fi ierelor Dir, Kill, Lock, Unlock, Name

Scriere Print #, Put, Write #

Doar instruc iunile i func iile des utilizate sunt prezentate în continuare, pentru celelalte se va studia intrarea
corespunz toare din Help (în mediul VBA).

Open

Deschide un fi ier în sensul c rezerv o zon tampon (buffer) pentru fi ier i determin modul de acces utilizat. Nu se
pot efectua instruc iuni de I/O pe un fi ier dac acesta nu este deschis în prealabil. Sintaxa:

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

unde

pathname expresie String care specific numele fi ierului (poate include întreaga cale unitate, directoare etc., dup
regulile uzuale);

36
mode cuvânt cheie care specific modul de acces la fi ier: Append, Binary, Input, Output sau Random; dac nu se
specific nimic se va considera acces Random;

access clauz op ional specificând opera iunile I/O permise pentru fi ier: Read, Write sau Read Write;

lock clauz op ional specificând opera iile asupra fi ierului permise altor procese care se execut (când fi ierul este
deschis): Shared, Lock Read, Lock Write i Lock Read Write.

filenumber num rul de fi ier pentru fi ierul deschis (între 1 i 511, vezi observa ia din partea introductiv ); func ia FreeFile
furnizeaz urm torul num r disponibil;

reclength num r (<=32,767) exprimând, în octe i, lungimea înregistr rii (la aceesul Random) sau lungimea bufferului (la
accesul secven ial); la accesul Binary, clauza este ignorat .

Dac fi ierul indicat nu exist , atunci este creat un fi ier cu acest nume în cazurile care presupun o ie ire în fi ier:
modurile Append, Binary, Output sau Random.

Un fi ier poate fi deschis în mai multe moduri simultan (prin instruc iuni Open distincte pentru fiecare mod, cu numere
diferite) dac exist compatibilitate între moduri: Binary, Input i Random permit acest lucru, Append, Output nu permit
(fi ierul trebuie mai întâi închis i abia apoi deschis într-un asemenea mod).

FreeFile

Func ia returneaz un întreg reprezentând urm torul num r de fi ier disponibil.

FreeFile[(rangenumber)]

rangenumber este un Variant care specific domeniul din care se solicit un num r liber de fi ier: 0 (valoarea implicit )
returneaz un num r în 1–255 (pentru fi iere proprii, 1 returneaz un num r în 256–511 (pentru fi iere accesate din alte
aplica ii).

Get

Cite te date dintr-un fi ier deschis i le transfer într-o variabil . Datele citite cu Get sunt, în general, scrise în fi ier cu
comanda Put.

Get [#]filenumber, [recnumber], varname

unde

filenumber este num rul fi ierului de unde se citesc date (fi ierul trebuie s fie deschis)

recnumber num r op ional în format Variant (Long), reprezint num rul înregistr rii (modul Random) sau num rul
octetului (modul Binary) de unde începe citirea. Prima pozi ie este 1.

varname numele variabilei unde se transfer informa ia.

Dac nu se specific num rul înregistr rii se va citi din pozi ia activ de dup ultima instruc iune Get, Put sau Seek.
Argumentul lips este indicat prin virgule: Get #4,,FileBuffer.

37
Pentru observa iile privind ac iunea instruc iunii Get, separat pentru modul Random i Binary, se va studia Help - Get.
Observa iile sunt utile atunci când se opereaz , în special, cu tipurile Variant i cu tablouri.

Put

Scrie valoarea unei variabile date într-un fi ier deschis în prealabil. Datele scrise cu Put sunt, în general, citite din fi ier cu
Get.

Put [#]filenumber, [recnumber], varname

unde

filenumber este num rul fi ierului unde se scriu datele (fi ierul trebuie s fie deschis);

recnumber num r op ional în format Variant (Long), reprezint num rul înregistr rii (modul Random) sau num rul
octetului (modul Binary) unde începe scrierea. Prima pozi ie este 1.

varname numele variabilei a c rei valoare se scrie în fi ier.

Dac nu se specific num rul înregistr rii se va scrie în pozi ia activ de dup ultima instruc iune Get, Put sau Seek.
Argumentul lips este indicat prin virgule: Put #4,,FileBuffer.

Pentru observa iile privind ac iunea instruc iunii Put, separat pentru modul Random i Binary, se va studia Help - Put.
Observa iile sunt utile atunci când se opereaz , în special, cu tipurile Variant i cu tablouri.

Input #

Cite te date dintr-un fi ier secven ial i le transfer în variabilele specificate.

Instruc iunea se va utiliza doar cu fi ierele deschise în modul Input sau Binary, datele citite cu Input # sunt scrise, de
regul , cu Write #.

Input #filenumber, varlist

unde

filenumber num rul fi ierului (deschis în prealabil);

varlist list de variabile, delimitate de virgule, pentru care se citesc valorile din fi ier. Nu se pot include nume de tablouri
sau variabile Object, dar se accept elemente de tablou i variabiel de tipuri utilizator.

Pentru situa iile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz f r modific ri. Pentru
alte situa ii:

Informa ia citit Valoarea asignat

Virgul sau linie goal Empty

#NULL# Null

#TRUE# sau #FALSE# True sau False

38
#yyyy-mm-dd hh:mm:ss# Data i/sau timpul reprezentat de expresie

#ERROR errornumber# errornumber (variabila este un Variant considerat drept eroare)

Ghilimelele duble (" ") sunt ignorate în irul de intrare.

Pentru o citire corect , datele din fi ier trebuie s apar în aceea i ordine i de acela i tip cu variabilele din list . O
variabil numeric prime te valoarea 0 dac intrarea corespunz toare nu este numeric . Atingerea sfâr itului de fi ier
când opera iunea de citire nu este încheiat , provoac eroare.

Întrucât utilizarea fi ierelor este, în mod uzual, aceea de memorare controlat a unor informa ii ( i nu aceea de a descifra
informa ii scrise într-o structur necunoscut ), se recomand scrierea cu Write # în cazul utiliz rii ulterioare a comenzii
Input #.

Func ia Input()

Cite te i returneaz un ir de caractere citite dintr-un fi ier deschis în mod Input sau Binary. Datele citite prin aceast
func ie sunt scrise, de regul , prin Print # sau Put.

Input(number, [#]filenumber)

unde

number orice expresie numeric specificând num rul de caractere care se citesc.

filenumber num r de fi ier (deschis).

Spre deosebire de instruc iunea Input #, func ia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF,
ghilimele i spa ii de început).

Pentru fi ierele deschise pentru acces Binary, încercarea de a citi prin func ia Input pân când EOF returneaz True
genereaz eroare (procedeul este valid pentru citirea din fi iere binare cu Get). Se vor utiliza func iile LOF and Loc pentru
detectarea sfâr itului de fi ier.

Observa ie. Pentru date pe octe i din fi iere text se va utiliza func ia InputB, cu o sintax similar , unde number specific
num rul de octe i de returnat (în loc de num rul de caractere). A se vedea i Help – Returning Strings from Functions.

Line Input #

Cite te o singur linie dintr-un fi ier secven ial (deschis) i asigneaz irul ob inut unei variabile de tip String. O linie este
considerat terminat la întâlnirea caracterului CR (Chr(13)) sau a combina iei CR+LF (Chr(13)&Chr(10)). Caracterele
CR i/sau LF nu sunt ad ugate irului asignat (se poate considera c secven a lor a fost s rit ).

Line Input #filenumber, varname

unde

filenumber num rul ata at fi ierului (deschis),

varname nume de variabil String sau Variant.

39
Datele citite cu Line Input # sunt, de regul , scrise cu Print #.

Write #

Scrie o înregistrare într-un fi ier secven ial. Datele scrise prin Write # sunt citite, de regul , cu Input #. Utilizarea scrierii cu
Write # asigur o delimitare corect a fiec rui câmp scris, ceea ce permite reg sirea corect (f r alte artificii) a
informa iilor la citirea cu Input #. În acela i timp, informa iile sunt reg site corect indiferent de configur rile locale.

Sintaxa este

Write #filenumber, [outputlist]

unde

filenumber num rul ata at fi ierului (deschis în prealabil),

outputlist o list de expresii numerice sau ir, separate prin virgule, spa ii sau punct-virgul , ale c ror
valori se scriu în fi ier.

Specificarea unei virgule dup filenumber f r outputlist produce o linie goala în fi ier.

Sunt respectate urtm toarele reguli de scriere:

• datele numerice sunt scrise cu punct ca separator zecimal (indiferent de set rile locale);
• datele Boolean sunt scrise ca #TRUE# sau #FALSE#, nefiind traduse dup set rile locale;
• datele calendaristice i timpul sunt scrise potrivit formatului de dat universal ; dac o component este omis
(sau este zero), se scrie doar partea indicat ;
• Null se scrie drept #NULL#, iar Empty nu produce nimic în ie ire;
• Date de tip Error apare #ERROR errorcode#.

Instruc iunea Write # insereaz între virgule între elementele scrise în fi ier, ca i ghilimele în jurul irurilor de caractere
(nu este prin urmare nevoie ca utilizatorul s introduc separatori pentru claritate). Dup ce toate valorile au fost scrise,
se insereaz automat o combina ie CR+LF, astfel încât urm toarea scriere va fi pe un rând nou.

Print #

Scrie într-un fi ier secven ial date formatate ca pe ecran (display-formatted). Prin urmare, cu excep iile specificate în
continuare, set rile locale sunt respectate. Datele scrise cu Print # sunt, de regul , citite cu Line Input # sau cu Input.

Sintaxa este

Print #filenumber, [outputlist]

unde

filenumber num rul ata at fi ierului (deschis în prealabil),

outputlist list de expresii formatate ale c ror valori sunt tip rite. Elementele se separ prin virgule, spa ii sau punct i
virgul .

Un element al listei de ie ire este de forma

40
[{Spc(n) | Tab[(n)]}] [expression] [charpos]

unde

Spc(n) insereaz n spa ii în ie ire

Tab(n) pozi ioneaz punctul de inser ie (începutul zonei de scriere) la o coloan indicat absolut de n. Utilizând doar Tab
se trece la urm toarea zon de ie ire.

expression expresia a c rei valoare se tip re te (numeric sau String).

charpos Specific pozi ia punctului de inser ie pentru urm torul caracter care va fi tip rit, potrivit tabelului care urmeaz .
Dac nu se specific , urm toarea tip rire va fi pe rândul urm tor.

charpos Locul punctului de inser ie

; Imediat dup ultimul caracter tip rit

Tab(n) Coloana cu num rul n

Tab Începutul urm toarei zone de tip rire

Dac se omite outputlist dar se include un separator dup filenumber, se va insera o linie goal în fi ier.

Datele logice sunt scrise drept True, False (f r traduceri locale).

Datele calendaristice sunt scrise potrivit set rii locale pentru format scurt.

Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (f r traduceri locale).

Informa iile numerice scrise sunt dup configur rile locale (separator zecimal).

Pentru o interpretare corect , utilizatorul trebuie s separe valorile afi ate prin format ri adecvate.

Pentru afi ari în fereastra Immediate a mediului VBA, se va vedea i metoda Print (vezi Help – Print Method).

Close

Închide unul sau mai multe fisiere deschise prin Open pentru instruc iuni de I/O. Prin acest opera iune se rupe leg tura
între fi iere i numerele ata ate i se elibereaz zonele tampon rezervate. Pentru un fi ier închis nu se mai pot executa
opera iuni I/O (pân la o nou deschidere).

Sintaxa este

Close [filenumberlist]

unde

filenumberlist este lista de numere ata ate fi ierelor care se închid, de forma
[[#]filenumber] [, [#]filenumber] …; dac lista nu este prezent , atunci se vor închide toate fi ierele care sunt deschise.

41
Înainte de închidere, în fi ierele deschise pentru Output sau Append se scriu zonele buffer nescrise înc .

Reset

Închide toate fi ierele deschise prin instruc iuni Open. Sintaxa este

Reset

Înaine de închidere se scriu în fi iere toate bufferele nescrise înc .

Seek

Stabile te pozi ia (înregistr rii sau octetului) într-un fi ier unde se va efectua urm toarea opera iune de intrare/ie ire,
fi ierul fiind deschis prin Open (vezi i func ia Seek). Sintaxa

Seek [#]filenumber, position

unde

filenumber num rul ata at fi ierului.

position num r între 1 i 2,147,483,647, inclusiv, care indic locul urm toarei
opera ii I/O.

Numerele înregistr rilor specificate în instruc iunile Get i Put au priorirtate în raport cu pozi ia fixat prin Seek (are loc o
repozi ionare).

Dac opera iunea Seek indic o pozi ie dup sfâr itul fi ierului, urm toarea opera iune de scriere (f r repozi ionare)
extinde fi ierul.

Pozi ia indicat nu poate fi zero sau negativ .

Func ia Seek

Returneaz , ca un întreg Long, pozi ia curent I/O dintr-un fi ier specificat. Fi ierul trebuie s fie în prealabil deschis.

Seek(filenumber)

filenumber este un num r de fi ier.

Valoarea returnat este între 1 i 2,147,483,647 (echivalent cu 2^31 – 1), inclusiv (vezi i setarea pozi iei prin
instruc iunea Seek) i are semnifica ia din urm torul tabel.

Modul de acces Valoarea returnat

Random Num rul urm toarei înregistr ri (care va fi citit sau scris )

Binary, Output, Pozi ia octetului (numerotat de la 1) la care va avea loc urm toarea opera iune I/O
Append, Input

42
EOF

Returneaz un întreg cu valoarea logic True (-1) atunci când se atinge sfâr itul unui fi ier deschis pentru citire (Random,
Binary sau Input). Pentru fi ierele dschise în ie ire func ia genereaz mereu True.

EOF(filenumber)

filenumber este un întreg con inând num rul fi ierului testat.

Utilizarea uzual este

Do While Not EOF(filenum)

… (instruc iuni, inclusiv citire din fi ierul filenum)

Loop

Pentru acces secven ial (Input) se întoarce False pân când se atinge sfâr itul de fi ier, pentru fi ierele Random sau
Binary se returneaz False pân când ultima instruc iune Get executat nu a putut citi o înregistrare întreag .

Citirea cu Input dintr-un fi ier deschis Binary produce eroare la utilizarea mecanismului general (pân când EOF () este
true): se va utiliza citirea cu Get sau citirea cu Input împreun cu func iile LOF sau Loc.

Loc

Returneaz , ca Long, pozi ia curent de citire/scriere într-un fi ier deschis.

Loc(filenumber)

filenumber este num rul ata at fi ierului.

Valoarea func iei depinde de modul de acces

Mod Valoarea returnat

Random Num rul ultimei înregistr ri scrise sau citite

Sequential Pozi ia curent împ r it la 128. (Se spune c aceast informa ie nu este niciodat util sau utilizat )

Binary Pozi ia ultimului octet citit sau scris.

Func ia Loc este utilizat , împreun cu func ia LOF, la testarea sfâr itului de fi ier la citiri Binary (schema general este
dat la LOF).

LOF

Returneaz un Long care reprezint , în octe i, m rimea unui fi ier deschis prin Open. Pentru fi ierele nedeschise se
poate utiliza, în acela i scop, func ia FileLen().

LOF(filenumber)

43
filenumber este num rul ata at fi ierului.

Utilizarea acestei func ii, împreun cu func ia Loc, pentru determinarea sfâr itului de fi ier (similar cu EOF) accesat
Binary este dup schema general :

Open filename For Binary As filenum

Do While CurrentLocation < LOF(filenumber)

… (citire din fi ierul filenum )

CurrentLocation = Loc(filenumber)

Loop

Visual Basic Editor

În aceast sec iune se prezint mediul de dezvoltare Visual Basic for Applications integrat în Microsoft Office 97.
Informa iile sunt, în general, valabile pentru Microsoft Excel 97, Word 97 i PowerPoint 97 care sunt prev zute cu un
mediu complet de dezvoltare VBA, numit Visual Basic Editor. Atunci când vor fi necesare, se vor da explica ii
suplimentare pentru Access 97.

Utilizând Visual Basic Editor, numit în continuare VBE, se poate crea, edita, depana i executa cod program asociat cu
documente Microsoft Office.

Proiectele dezvoltate în VBE, de i sunt asociate aplica iilor din Office, nu pot fi reduse, ca problematic , la procesarea de
texte (Word), calcul tabelar (Excel), prezent ri electronice (PowerPoint) sau baze de date (Access). Este corect s se
considere aceste proiecte drept aplica ii similare celor dezvoltate în alte medii de programare, având îns la dispozi ie
componentele aplica iilor din Office. Cu alte cuvinte, nu este vorba de o limitare a posibilit ilor de prelucrare, ci o
poten are a acestora prin apelul posibil la obiectele din Office.

O obiec ie la utilizarea VBA este aceea c proiectul se poate executa doar dintr-o aplica ie Office (deci deschizând, chiar
formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente disponibile în dezvoltarea proiectului
compenseaz acest neajuns. În plus nu trebuie uitat c orice aplica ie necesit o interfa utilizator (puternic în Microsoft
Office) i c aplica iile de baz sunt între inute i completate de Microsoft, astfel încât proiectele noastre se vor actualiza
i ele o dat cu componentele Office.

Un ultim argument este acela c mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio (Visual
Basic, C++ etc.) astfel c practica în VBA poate fi considerat introductiv c tre alte aplica ii RAD.

Interfa a grafic VBE

Pentru a deschide editorul VB, mai întâi se va porni o aplica ie din Microsoft Office, apoi se poate ac iona

• combina ia Alt+F11 (dac nu a fost atribuit altei opera iuni), sau


• butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizat într-o
aplica ie Office, sau
• Meniul Tools, Macro, Visual Basic Editor.

În Access se va activa fi a Modules a proiectului.


44
Interfa a grafic VBE este suficient de complex , asem n toare mediilor de programare din Visual Studio. Pe lâng
obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite
categorii de obiecte:

• Properties Window pentru vizualizarea i fixarea propriet ilor în momentul proiect rii (design-time);
• Project Explorer care permite navigarea, vizualizarea i modificarea proiectelor deschise la un moment dat;
• Code Window unde este se scrie i este vizibil codul surs al proiectului activ;
• Locals Window care permite vizualizarea variabilelor locale cu valorile lor;
• Immediate Window care permite executarea imediat a unei linii de cod;
• Watch Window unde se afi eaz valorile unor expresii specificate (utile în depanarea programelor).

Properties Window

Prin proprietate a unui obiect se în elege o caracteristic a respectivului obiect (cum ar


fi culoarea sau vizibilitatea etc.). Fixarea valorii propriet ii se reflect în aparen a
obiectului sau în comportamentul lui (de exemplu, fixarea propriet ii
ShowSpellingErrors la valoarea True arat în document erorile de scriere).

Fereastra Properties poate fi utilizat , în momentul proiect rii, pentru a vizualiza toate
propriet ile obiectului activ i a modifica valorile dorite.

În partea superioar este cutia de obiecte în care se poate selecta un obiect (sau mai
multe) dintre cele vizibile.

În fi a Alphabetic se listeaz propriet ile modificabile ale obiectului selectat, în ordine


alfabetic . Se poate modifica valoarea unui atribut prin selectarea numelui propriet ii i
tastarea sau selectarea noii valori.

În fi a Categorized sunt listate propriet ile dup categorii, într-un control de tip Explorer, in care ramurile pot fi expandate
sau.

Fereastra Properties poate fi ar tat (când nu este vizibil ), prin comanda Properties Window din meniul View.

Project Explorer

Codul surs asociat cu un workbook, document, template sau prezentare este asociat
într-un proiect, care este memorat i salvat în mod automat o dat cu caietul Excel,
documentul Word, ablonul sau prezentarea respectiv . În fereastra Project Explorer se
pot vedea, modifica i naviga printre toate proiectele asociate oric rui document, caiet,
ablon sau prezentare deschise.

Pentru un proiect se listeaz , într-un control de tip Explorer, obiectele care recunosc
evenimente, formele, modulele, referin ele. Pentru a vedea codul dintr-un modul sau
codul asociat unui obiect, se selecteaz respectivul modul sau obiect i se apas
butonul View Code (primul din stânga). Pentru a vedea interfa a utilizator pentru un
obiect sau form se selecteaz i se apas butonul View Object (cel din mijloc). Pentru a
vedea organizarea în foldere a elementelor listate în Project Explorer se va ap sa butonul Toggle Folders.

Fiecare element este înso it, în arborele de structur , de icoana specific elementului: proiect, folder, referin , obiect etc.

45
Code Window

Fereastra principal a Editorului Visual Basic este cea în care se poate scrie
codul surs . Deoarece procedurile sunt asociate unor obiecte de interfa , sau
apar in unui modul, mai întâi se va selecta, din Project Explorer, modulul sau
forma vizat i apoi se va ap sa butonul View Code.

Pentru a vedea mai mult de o procedur în fereastra de cod, se va selecta


boxa de control Default to Full Module View în fi a Editor din Options
(meniul Tools) (în caz contrar se va vedea doar câte o procedur ).

În partea de sus a ferestrei se g sesc dou boxe:

• Object Box unde se poate selecta obiectul pentru care se afi eaz procedurile asociate;
• Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaz /editeaz codul. Procedurile
pot fi de tip eveniment, dac obiectul selectat este o form utilizator. Selectarea unei proceduri produce o defilare
a textului astfel încât pointerul s fie la prima linie a procedurii.

Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat între ferestre, ferestrele se pot diviza utilizând
bara de divizare etc.

Ac ionarea butonului Procedure View Icon (primul din stânga, pe bara de jos a ferestrei) sau a butonului Full Module View
Icon produce alegerea între vizualizarea unei singure proceduri sau a tuturor procedurilor din modul.

Locals Window

Util în procesul de punere la punct a programului, fereastra Locals serve te la afi area automat a tuturor variabilelor
declarate în procedura curent . Con inutul ferestrei este actualizat de fiecare dat când se trece din modul Run în modul
Break sau atunci când se navigheaz în stiva de apeluri.

Pentru o descriere a ferestrei se va vedea sec iunea dedicat depan rii programelor.

Immediate Window

Permite scrierea i execu ia imediat a unei linii de cod. Linia poate fi copiat în i dintr-o fereastr de cod.

În modul de execu ie Break, instruc iunea din fereastra Immediate este executat în contextul procedurii afi ate în
Procedure Box.

Pentru ac iunile posibile în fereastra Immediate, se va studia Help – Immediate Window Keyboard Shortcuts.

Watch Window

Este fereastra unse sunt afi ate automat valorile expresiilor urm rite în etapa de depanare a proiectului.

Pentru o descriere a ferestrei Watch se va vedea sec iunea dedicat depan rii programelor.

Scrierea procedurilor

Instruc iunile unui proiect se pot înscrie, dup modul lor de creare, în dou mari categorii:

46
• scrise de aplica ia de baz (Word, Excel etc.) prin traducerea ac iunilor interfe ei utilizator (meniuri, comenzi etc.)
în cod VBA. Aceast opera iune este cea de înregistrare a unui macro.
• scrise într-o fereastr de cod de c tre utilizator (proiectant), cu asisten a mediului VBE.

Înregistrarea unui macro

Ac iunea este util atât prin aceea c opera iuni simple pot fi traduse u or în instruc iuni VBA, procedurile pot fi editate din
VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de c utare/înlocuire sau format ri de obiecte grafice) codul
generat automat ofer un bun model de utilizare a obiectelor, propriet ilor i metodelor aplica iei.

Pentru a înregistra un macro:

• Se afi eaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite).
• Pe bara Visual Basic se ac ioneaz butonul Record Macro.
• În dialogul Record Macro se înlocuie te numele dat implicit în boxa Macro Name i apoi OK.

Se poate utiliza boxa Store macro pentru a alege locul de memorare a codului.

• Se execut ac iunile menite s fie înregistrate/traduse în VB, în succesiunea dorit .


• Pe bara Stop Recording (ap rut la ini ierea procesului de înregistrare) se apas butonul Stop Recording.

Pentru a vedea liniile de cod generate, se deschide în aplica ia de baz meniul Tools, comanda Macro, apoi Macros, se
selecteaz dup denumire i se apas butonul Edit.

Codul surs poate fi v zut i prin navigarea în VBE prin Project Explorer, ferestre de cod etc.

Din punctul de vedere al program rii se poate spune c un macro este o procedur public f r argumente, deci poate fi
scris i direct în fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care pot fi executate
din dialogul Macros (Tools - Macro - Macros) sunt macro-uri.

Scrierea unei proceduri

Dac se dore te scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific, se ca crea o
procedur într-un modul standard.

Pentru a crea un modul standard nou (gol), se merge în Project Explorer în proiectul unde se adaug modulul nou creat
i se d comanda Module din meniul Insert.

Pentru a deschide un modul standard existent, se va selecta modulul din Project Explorer i se apas butonul View
Code (sau dublu click).

Pentru a ad uga o procedur la un modul, se selecteaz modulul în Project Explorer, se deschide meniul Insert i se d
comanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta op iunile definitorii (subrutin sau func ie,
public sau nu etc.) i se d OK. Dup aceasta se pot ad uga liniile de cod ale procedurii.

Scrierea unei proceduri de eveniment (event procedure)

Dac se dore te scrierea de cod surs care s se execute automat atunci când are loc un anumit eveniment (cum ar fi
deschiderea unui document, ac ionarea unui buton etc.), trebuie s se scrie o procedur asociat evenimentului
respectiv. O asemenea procedur se va numi procedura evenimentului.

47
Anumite obiecte din aplica iile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declan ate de c tre
sistem sau de c tre utilizator. Evenimentele specifice fiec rui obiect trebuie s fie studiate separat (se va studia sec iunea
din Help pentru fiecare aplica ie), doa principalele obiecte, cu propriet ile, metodele si evenimentele lor, sunt prezentate
i în acest curs, în capitole separate.

Modul cum aplica ia r spunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de eveniment. O
asemenea procedur se va scrie în fereastra Code asociat obiectului. De fiecare dat când apare evenimentul se
execut procedura evenimentului respectiv. De exemplu, dac se scrie o procedur asociat cu evenimentul Open al
unui document Word, procedura se va executa automat la fiecare deschidere a acelui documentului.

O procedur de eveniment este memorat în documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc. unde
poate fi declan at evenimentul. Pentru a vedea codul surs al procedurii, se va selecta obiectul în Project Explorer i click
pe butonul View Code pentru a deschide fereastra de cod asociat . Dintr-o fereastr de cod deschis , asociat , se va
selecta obiectul vizat, din boxa de obiecte, i în boxa de proceduri vor fi listate atunci toate procedurile evenimentelor,
chiar dac ele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (dac nu exist ) liniile obligatorii ale procedurii i
va fixa cursorul de editare în procedura respectiv .

Numele unei proceduri de eveniment este format din numele obiectului, care recunoa te evenimentul, urmat de caracterul
"_" i de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care se execut la
deschiderea unui document.

Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dup ce s-au
scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte (Document,
Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite.

Observa ie. Dac se dore te ca o procedur s fie asociat cu un document specific, dar nu cu un eveniment specific,
atunci procedura se va scrie în sec iunea (General) a documentului respectiv (de exemplu o rutin care s poat fi
apelat din mai multe proceduri de eveniment).

Unelte VBE pentru scrierea instruc iunilor

Deoarece multe dintre denumirile obiectelor, propriet ilor sau metodelor care apar în codul VBA sunt complexe, mediul
de dezvoltare ofer o serie de unelte pentru completarea automat a cuvintelor cheie, pentru oferirea de ajutor în
reamintirea denumirilor etc.

Dac s-au tastat suficient de multe caractere încât VB poate recunoa te un cuvânt, atunci prin CTRL+SPACE, sau click
pe butonul Complete Word de pe bara de unelte Edit, completeaz cuvântul.

În dialogul Options (meniul Tools) se pot activa urm toarele ac iuni, executate automat la completarea unei linii de cod:

• verificarea automat a sintaxei — Auto Syntax Check;


• obligativitatea declar rii tuturor variabilelor, ad ugarea automat a instruc iunii Option Explicit la orice nou modul
— Require Variable Declaration;
• afi area unei liste cu informa ii utile (logice la pozi ia curent a cursorului) la completarea instruc iunii — Auto List
Member;
• afi area informa iei despre proceduri i parametrii lor — Auto Quick Info;
• afi eaz , doar în modul Break, valoarea unei variabile peste care este plasat cursorul — Auto Data Tips;
• alinierea automat a liniilor noi la începutul liniei precedente — Auto Indent;
• fixarea l imii între pozi iile tabulatorului, 1 la 32 de spa ii (implicit fiind 4) —Tab Width.

Pe bara de unelte Edit exist câteva butoane, care ajut la completarea cuvintelor i expresiilor în timpul scrierii
instruc iunilor:

48
• List Properties/Methods — deschide o cutie în fereastra Code cu propriet ile i metodele permise pentru obiectul
care precede caracterul punct ("."), util atunci când se opereaz cu obiecte.
• List Constants — deschide în fereastra de cod, la punctul de inser ie, o cutie cu constantele permise pentru
proprietatea care precede semnul egal ("=") în instruc iunea curent .
• Quick Info — ofer , ca ajutor, sintaxa pentru o variabil , func ie etc. prin analiza locului punctului de inser ie pe
linia curent .
• Parameter Info — arat o cutie, la punctul de inser ie, cu informa ia despre parametrii func iei în care este
pointerul.
• Complete Word — accept caracterele pa care le propune VBE drept completare la cuvântul tastat.
• Comment Block — care transform în comentarii liniile selectate.
• Uncomment Block — înl tur semnul de comentarii la liniile selectate.

Executarea unei proceduri Sub

O procedur poate s se execute:

• automat, ca r spuns la declan area unui eveniment (procedura evenimentului);


• din VBE, dac punctul de inser ie este în procedur i se ac ioneaz butonul Run Sub/UserForm de pe bara de
unelte Standard sau Debug;
• ca un macro, Run din dialogul Macros (Tools - Macro) al aplica iei de baz ;
• apelat din alt procedur .

La apelul unei proceduri din alt procedur se va ine seama de interac iunea declara iilor Public, Private, ca i de
referin ele la alte proiecte (meniul Tools - References).

Modele de obiecte

Aproape toate ac iunile programate în VB implic manevrarea programatic a unor obiecte. Toate aplica iile din Microsoft
Office sunt alc tuite din componente formate din obiecte sau care gestioneaz obiecte.

În aceast sec iune se prezint principalele concepte din programarea orientat pe obiecte, ca i uneltele i tehnicile
disponibile pentru a explora i utiliza obiectele specifice din Office 97.

Deoarece fiecare aplica ie din Office are un model propriu de obiecte, va fi dedicat câte un capitol pentru Word, Excel
etc., în care se vor prezenta particularit ile de operare i obiectele specifice aplica iei.

Privire general

Orice aplica ie poate fi gândit ca ansamblul a dou lucruri: con inut i func ionalitate. Con inutul se refer la documentele
pe care le con ine aplica ia, la elementele care compun documentele, la informa iile privind atributele elementelor.
Func ionalitatea se refer la modurile, c ile în care se poate lucra cu con inutul aplica iei, de exemplu: deschiderea,
închiderea documentelor, ad ugarea, copierea, formatarea elementelor etc.

Con inutul i func ionalitatea unei aplica ii sunt divizate în unit i discrete de con inut i func ionalitate specific , numite
obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, sec iuni ale unui document
Word etc., fiecare având evident un con inut i o func ionalitate specific , cele dou componente fiind unitar legate între
ele. Obiectele unei aplica ii sunt ierarhizate în structuri, modelul de obiecte al aplica iei..

Obiectul de nivel maxim al unei aplica ii este, uzual, obiectul Application, care este aplica ia îns i. Obiectul Application
con ine alte obiecte care pot fi accesate numai când obiectul Application exist (deci când aplica ia se execut ). De
exemplu, obiectul Application Excel con ine obiecte Workbook, dup cum obiectul Application Word con ine obiecte

49
Document. Deoarece obiectul Document depinde de existen a obiectului Application Word, se spune c obiectul
Document este copilul obiectului Application; invers, obiectul Application se zice p rintele obiectului Document.

Este uzual ca un obiect, care este copil al altui obiect, s aib , la rândul s u, alte obiecte copii. De asemenea, este
posibil ca un copil s aib mai mul i p rin i.

Modul în care obiectele, care alc tuiesc o aplica ie, sunt aranjate relativ unele fa de altele, împreun cu modul în care
con inutul i func ionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte. Fiecare
aplica ie are un model de obiecte propriu, reprezentarea grafic a ierarhiei de obiecte pentru aplica ie poate fi v zut în
Visual Basic Help din aplica ie.

Fiecare obiect din ierarhie are un con inut i o func ionalitate care se aplic , ambele, atât obiectului însu i, cât i tuturor
obiectelor descendente din ierarhie. Cu cât obiectul este situat mai sus în ierarhie, cu atât este mai vast domeniul
con inutului i func ionalit ii sale. Locul unui obiect în model este gândit astfel încât con inutul i func ionalitatea lui sunt
adecvate domeniului s u. Se poate gândi i faptul c , dac aplica ia este divizat în obiecte, fiecare obiect ofer acces la
arii specifice de con inut i func ionalitate.

Afirma iile care implic obiecte utilizeaz i termenii de "con inut în" pentru copil i "con ine" pentru p rinte. Astfel,
obiectul Application Word con ine obiecte Document, dar obiectul Selection este con inut în obiectul Windows etc.

Propriet i i metode

Pentru a avea acces la con inutul i func ionalitatea unui obiect, pentru început trebuie s se identifice obiectul (subiect
discutat în continuare). Dup identificare, obiectul este accesibil prin intermediul propriet ilor i metodelor sale.

În general, prin proprietate se în elege un atribut numit al obiectului. Valoarea atributului (propriet ii) poate fi modificat
(de cele mai multe ori) sau poate fi ob inut ( tiut ) programatic.

Prin metod se în elege o procedur care ac ioneaz asupra unui obiect. Pentru a distinge o metod de o procedur
obi nuit (care poate de asemenea s ac ioneze asupra unui obiect, în general vorbind), trebuie precizat c metodele
implementeaz func ionalitatea obiectului, sunt specifice obiectului c ruia i se aplic i sunt definite o dat cu obiectul
(deci la proiectarea aplica iei de baz , în cazul obiectelor Office). Orice procedur utilizator ac ioneaz asupra obiectului
prin intermediul metodelor specifice (aplicabile) acelui obiect.

În general, se utilizeaz propriet ile pentru a accesa con inutul i se apeleaz metodele pentru a realiza func ionalitatea
obiectului. Totu i, aceast distinc ie este relativ : exist propriet i care se apropie de metode i metode care seam n a
fi propriet i. Atunci când vom discuta despre obiecte definite de utilizator se va vedea c este u or s se treac grani a
dintre metode si propriet i în proiectarea obiectelor.

Leg tura dintre modelul obiectelor i interfa a utilizator

Exist dou c i prin care utilizatorul poate interac iona cu obiectele aplica iei:

o manual (utilizând interfa a utilizator a aplica iei);


o programatic (utilizând un limbaj de programare).

În accesul manual se utilizeaz tastatura, mouse-ul sau cheile directe pentru a naviga c tre acea parte i func ie a
aplica iei care execut ceea ce se dore te (formatarea unui paragraf, tergerea unor formule dintr-o celul , modificarea
unui slide etc.).

În accesul programatic, de exemplu în instruc iuni Visual Basic, se navigheaz în ierarhia de obiecte pentru a identifica
obiectul vizat i apoi se utilizeaz proprietatea sau metoda care produce efectul urm rit. De exemplu, prin linia urm toare,
scris într-o procedur ,
50
Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100

se navigheaz în caietul Activitate la foaia Vanzari i se înscrie valoarea 100 în celula A5. Este evident c înscrierea are
loc efectiv doar în momentul execu iei procedurii.

Deoarece ambele moduri de acces, interfa a utilizator a aplica iei de baz i Visual Basic, ajung la acela i con inut i
func ionalitate, multe dintre obiectele, propriet ile i metodele existente în modelele de obiecte Office au acelea i
denumiri cu elementele din interfa a utilizator (denumiri de meniuri, comenzi, ac iuni etc.). Se poate observa, explicabil din
punctul de vedere al evolu iei c tre modelele obiectuale, o asem nare global a modelului de obiecte cu interfa a
utilizator. Aceast asem nare este înt rit i de faptul c pentru orice ac iune posibil prin interfa a utilizator exist
posibilitatea de a scrie cod Visual Basic echivalent (vezi i discu ia cu înregistrarea macro-urilor).

Din exemplul prezentat la accesul din VB, este de re inut importan a cunoa terii locului ocupat de obiectul procesat în
ierarhia de obiecte: pentru a utiliza propriet ile sau metodele lui trebuie identificat corect prin navigarea (calificarea) de la
nivelul cel mai de sus pân la el. Întregul traseu (cu excep ia nivelului Application, care este uneori subîn eles) trebuie
specificat ca în exemplul ar tat.

Colec ii de obiecte

O colec ie este un obiect care include obiecte similare (dar nu neap rat), astfel încât se poate opera cu ansamblul lor.
Acest lucru nu înseamn c metodele sau propriet ile obiectelor (dac sunt toate de acela i tip) se aplic tuturor
elementelor colec iei. Ca obiect separat, o colec ie are propriet i i metode specifice (num rul de elemente, ad ugarea
unui nou element etc.).

De regul , colec iile definite în Office (exist posibilitatea de a defini noi colec ii) se remarc prin aceea c au forma de
plural a denumirii elementelor lor: Workbooks este colec ia de obiecte Workbook, Documents este colec ia de obiecte
Document etc.

Elementele (membrii) colec iei se pot identifica prin num rul de ordine (începând cu 1) sau prin nume (rezult c
ansamblul elementelor este ordonat). Astfel instruc iunea

Presentations.Item("Perspective").Close

utilizat în PowerPoint produce activarea prezent rii cu numele Perspective i apoi o închide. Exemplul utilizeaz metoda
Item pentru a returna elementul colec iei de prezent ri cu numele specificat. De regul , aceast metod este implicit ,
deci

Presentations("Perspective").Close

este o form echivalent .

Num rul de elemente ale colec iei se pot afla prin proprietatea Count, se pot ad uga noi elemente prin metoda Add etc.

O utilizare frecvent a colec iilor este parcurgerea tuturor elementelor într-o structur For Each…Next sau For…Next:

Public Sub DocScris()

For Each doc In Documents

If doc.Words.Count > 1 Then

MsgBox doc.Name + Str(doc.Words.Count)


51
End If

Next

End Sub

care, într-o aplica ie Word, afi eaz numele tuturor documentelor deschise cu mai mult de un cuvânt scris.

Automatizarea ac iunilor prin folosirea obiectelor

Prin automatizarea unei ac iuni se în elege scrierea unei proceduri care s produc , la executarea ei, ac iunea dorit .
Execu ia poate fi comandat direct sau ca r spuns la decla area unui eveniment.

Pentru a automatiza o ac iune în Microsoft Office, se va ob ine o referin la obiectul care dispune de con inutul i
func ionalitatea pe care le urm rim i se vor aplica propriet ile i metodele adecvate. Procesul poate necesita o
succesiune de asemenea opera ii.

Ob inerea unei referin e la un obiect

Pentru a ob ine o referin la un obiect trebuie s se construiasc o expresie care ajunge s acceseze un obiect din
modelul de obiecte i apoi, utilizând propriet i i/sau metode, s se navigheze în sus sau în jos prin ierarhia de obiecte
pân când ajungem la obiectul dorit.

Propriet ile i metodele utilizate pentru a returna punctul de start i pentru a parcurge ierarhia de obiecte se numesc
accesori de obiecte (object accessors) sau accesori.

Câteva idei utile pentru construirea expresiei care returneaz referin a la un obiect sunt urm toarele:

- un loc obi nuit pentru a accesa modelul de obiecte este obiectul cu nivelul cel mai înalt, uzual obiectul Application. Se
va utiliza proprietatea Application pentru a returna o referin la obiectul Application. Urm toarea expresie returneaz o
referin la obiectul Application (pentru orice bibliotec de obiecte care con ine un obiect Application).

Application

- pentru a ajunge din vârful ierarhiei pân la un obiect, se vor parcurge obiectele de pe toate nivelele, utilizând accesori
care returneaz un obiect din altul. De exemplu, proprietatea Documents a obiectului Word Application returneaz
obiectul colec ie Documents, care reprezint toate documentele deschise. Prin urmare urm toarea expresie întoarce o
referin la obiectul colec ie Documents:

Application.Documents

- Exist accesori direc i (shortcut accessors) care dau acces direct la obiecte din model f r s fie necesar un acces prin
vârful ierarhiei. Asemenea accesori sunt Documents, Workbooks, Presentations care dau acces imediat la colec ia de
documente din Word, Excel i PowerPoint. Exist i alte propriet i cu rol de accesori direc i: ActiveWindow,
ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urm toarea instruc iune închide documentul Word activ:

ActiveDocument.Close

Observa ie. Se poate utiliza drept shortcut orice accesor care apare în zona Members of din Object Browser atunci când
este selectat <globals> în zona Classes; adic nu trebuie s se returneze obiectul c ruia i se aplic proprietatea sau
metoda înaintea utiliz rii propriet ii sau metodei, întrucât Visual Basic poate s determine din contextul în care se
execut codul c rui obiect i se aplic proprietatea sau metoda respectiv .
52
- Pentru a returna un singur element al unei colec ii se va utiliza proprietatea sau metoda Item cu numele sau num rul de
ordine al elementului. Pentru cele mai multe colec ii, Item este implicit, deci poate lipsi

Workbooks.Item("Vanzari")

Workbooks("Vanzari")

- Pentru a "urca" în ierarhia de obiecte, se utilizeaz , de obicei, proprietatea Parent a obiectului curent. De notat c
proprietatea Parent poate returna uneori, în special dac obiectul este membru al unei colec ii, "bunicul" obiectului în
locul p rintelui (adic p rintele colec iei în locul colec iei). De exemplu

Document.Parent

- returneaz obiectul Application i nu Documents.

- Prin func ia TypeName (executat eventual în Immediate Window) se poate g si ce tip de obiect întoarce proprietatea
Parent (func ia nu este limitat la aceast proprietate, vezi VB Help).

Aplicarea propriet ilor i metodelor

Dup ob inerea unei referin e la obiectul urm rit, acestuia i se pot aplica propriet i i metode pentru a modifica valoarea
unui atribut sau pentru a-l procesa. Se utilizeaz operatorul punct (".") pentru a separa expresia care returneaz o
referin la obiect de proprietatea sau metoda care se aplic obiectului. De exemplu

ActiveWindow.Left = 200

fixeaz pozi ia din stânga a ferestrei active utilizând proprietatea Left a obiectului Window, referin a la acest obiect fiind
returnat de accesorul direct ActiveWindow.

ActiveDocument.Close

închide documentul activ (în Word) utilizând metoda Close a obiectului Document la care returneaz o referin
accesorul ActiveDocument.

Propriet ile i metodele pot avea argumente care s precizeze valorile sau ac iunile. Urm torul exemplu Word utilizeaz
metoda PrintOut cu specificarea paginilor care se tip resc:

ActiveDocument.PrintOut From:=" 3", To:=" 7"

Este uneori necesar s se navigheze prin mai multe nivele în modelul de obiecte pentru a ajunge la ceea ce se consider
date reale în aplica ie, cum ar fi valorile din celulele foii de calcul sau textul dintr-un document Word. Urm toarele
exemple Word arat cum se poate ajunge la text din vârful ierarhiei de obiecte:

o Proprietatea Application returneaz o referin la obiectul Application.


o Proprietatea Documents a obiectului Application returneaz o referin la colec ia Documents.
o Metoda Item a colec iei Documents returneaz o referin la un songur obiect Document.
o Proprietatea Words a obiectului Document returneaz o referin la colec ia Words.
o Metoda Item a colec iei Words returneaz o referin la un singur obiect Range.
o Proprietatea Text a obiectului Range stabile te textul itemului referit.

Astfel, urm torul exemplu completeaz primul cuvânt din document

53
Application.Documents.Item(1).Words.Item(1).Text = "Primul "

Deoarece proprietatea Documents este o proprietate global , poate fi utilizat f r calificativul Application; deoarece
Item este proprietate sau metod implicit pentru colec ia de obiecte, nu trebuie enun at explicit. Din aceste
considerente, exemplul urm tor realizeaz exact aceea i ac iune ca i exemplul precedent:

Documents(1).Words(1).Text = :Primul "

Pentru alte exemple de referin e i de utilizare a metodelor i propriet ilor se vor urm ri exemplific rile de la capitolele
urm toare.

Ajutor în scrierea programelor

Pentru o imagine complet a uneltelor i mecanismelor prin care mediul de programare VB sus ine activitatea de scriere
a instruc iunilor surs se va citi i capitolul dedicat mediului VBE.

Utilizarea Macro Recorder

Înregistrarea unui macro ofer un ajutor important atunci când se cunoa te realizarea unei ac iuni în interfa a utilizator a
aplica iei de baz i se dore te cunoa terea obiectelor, propriet ilor i metodelor care pot s realizeze acea ac iune (sau
ceva asem n tor).

În general, codul generat de înregistrarea macro nu este foarte eficient i robust, deoarece înregistrarea pleac de la
obiectul selectat în momentul startului i realizeaz doar navigarea în restul modelului de obiecte. Orice utilizare
ulterioar va necesita o selectare sau activare similar pentru a îndeplini ac iunea a teptat . Trebuie s se considere
codul înregistrat doar o prim schi a procedurii, modific ri ulterioare trebuind s produc o variant mai clar i mai
robust .

Codul generat este mai robust i mai flexibil dac va con ine expresii care navigheaz prin ierarhia de obiecte f r s
înceap cu un obiect selectat sau activat. Idei în acest sens pot fi ob inute din studierea exemplelor date în Visual Basic
Help: pozi ionarea punctului de inser ie pe o denumire de proprietate sau metod i ac ionarea tastei F1 afi eaz
subiectul respectiv din Help.

O cale direct de accesare a fi ierului de ajutor pentru un obiect este pozi ionarea în graficul care prezint ierarhia de
obiecte (specific fiec rei aplica ii) i dublu click pe un obiect afi eaz subiectul dedicat obiectului în VB Help.

Exemplele prezentate în Help pot fi copiate, în mod uzual, utilizând Clipboard, în fereastra de cod.

Object Browser

Fiecare aplica ie din Microsoft Office are o bibliotec de obiecte (object library sau
type library), care con ine informa ii despre obiectele, propriet ile, metodele,
evenimentele i constantele predefinite ale aplica iei. Pentru accesul la informa ia
respectiv se poate utiliza Object Browser, unealt din VBE.

Pentru a deschide Object Browser din VBE (în Excel, Word sau PowerPoint) sau
dintr-un modul (Access), se alege Object Browser din meniul View.

În boxa Project/Library se alege numele bibliotecii care se consult , sau <All


libraries> pentru a vedea o list complet . Dac biblioteca dorit nu este în lista celor
disponibile, se va crea o referin la aceast bibliotec prin alegerile corespunz toare în dialogul References (meniul
Tools) al proiectului curent.

54
În boxa Classes se afi eaz numele tuturor obiectelor i tipurilor enumerate (constantele predefinite) în bibliotecile
referite.

Not . O clas este un tip, o descriere a unui obiect. Un obiect este o instan efectiv a unei clase. Deseori ace ti
termeni sunt utiliza i unul în locul celuilalt, dac nu se produc confuzii (uneori chiar i atunci).

În boxa Members of se afi eaz toate propriet ile, metodele i evenimentele proprii (asociate) clasei selectate în boxa
Classes.

Selectarea unei intr ri în list poate fi completat cu F1 pentru a vedea textul ajut tor, iar în zona inferioar (Detail pane)
se afi eaz infroma ii privind sintaxa, starea read-only sau read-write, biblioteca unde apar ine, tipul rezultatului returnat
(dat sau obiect). Dac o informa ie este de tip leg tur , activarea acesteia produce informa ii suplimentare, lucru util
pentru a deduce modul de navigare c tre obiect. În figura prezentat se vede proprietatea Count a clasei AddIns,
proprietatea returnând o valoare de tip Long. Textul din zona Detail poate fi copiat (prin Clipboard) sau dus prin drag-
and-drop într-o fereastr cod.

Legarea timpurie i uneltele de construire a instruc iunilor

Atunci când se creeaz într-o aplica ie o variabil obiect care se refer la un obiect furnizat de alt aplica ie, Visual Basic
trebuie s verifice c obiectul exist i c propriet ile i metodele utilizate pentru obiect sunt specificate corect. Acest
proces de verificare se nume te legare (binding). Legarea poate s apar în timpul execu iei proiectului (legare târzie)
sau în timpul compil rii (legare timpurie). Codul legat târziu este mai încet decât codul legat timpuriu. În plus, uneltele de
ajutor în scrierea codului pot s lucreze corect doar în cazul leg rii timpurii.

Pentru a lega timpuriu codul se vor parcurge etapele:

• Se stabile te o referin la biblioteca de tipuri care con ine obiectele referite (Tools - References).
• Se declar variabila obiect de un tip specific (de exemplu As Document i nu As Object).
• Dac se scrie cod care utilizeaz obiecte din mai multe biblioteci, se va specifica numele aplica iei unde sunt
declarate obiectele, mai ales dac obiecte cu acela i nume exist în mai multe biblioteci. (de exemplu As
Excel.Window).

Dac o proprietate sau o metod utilizat returneaz un tip generic Object i nu un tip specific, atunci pentru legarea
timpurie se va declara mai întâi o variabil de tipul specific i apoi se va atribui rezultatul generic returnat acestei
variabile, dup modelul

Dim testWs As Worksheet

Set testWs = Workbooks(1).Worksheets(1)

necesar deoarece metoda Item a obiectului Worksheets returneaz un tip Object i nu Worksheet (chiar dac se refer
la o foaie de calcul).

Programarea obiectelor altei aplica ii

Se poate executa, într-o aplica ie din Office, cod care s lucreze cu obiecte din alt aplica ie. Pentru a realiza acest lucru,
se va urm ri schema urm toare:

1. Se stabile te o referin la biblioteca de tipuri a celeilate aplica ii (meniul Tools - References).


2. Se declar variabile obiect care vor referi obiecte din alt aplica ie cu tipuri specifice. Se va urm ri calificarea
fiec rui tip cu numele aplica iei care expune obiectul. Exemplul urm tor declar o variabil care se refer la un
document Word i o variabil care se refer la un caiet Exce:

55
Dim appWD As Word.Application, wbXL As Excel.Workbook

3. Se utilizeaz func ia CreateObject cu identificatorul programatic OLE al obiectului cu care se dore te s se


lucreze în cealalt aplica ie, dup modelul

Dim appWD As Word.Application

Set appWD = CreateObject("Word.Application.8")

appWD.Visible = True

4. Pentru informa ii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic Identifiers".
5. Se aplic obiectului, con inut în variabil , propriet ile i metodele dup modelul urm tor, care creeaz un nou
document Word:

Dim appWD As Word.Application

Set appWD = CreateObject("Word.Application.8")

appWD.Documents.Add

6. La sfâr itul lucrului cu cealalt aplica ie, se va utiliza metoda Quit pentru a o închide, dup modelul

appWD.Quit

Obiecte Microsoft Word

Visual Basic suport un set de obiecte care corespund direct elementelor din Microsoft Word 97, cele mai multe familiare
celor care cunosc interfa a utilizator din Word: obiectul Document reprezint un document deschis, obiectul Bookmark
reprezint un bookmark (semn de carte, punct de referin ) într-un document etc. Orice element din Word — documente,
tabele, paragrafe, câmpuri etc. — poate fi reprezentat printr-un obiect din Visual Basic. Pentru automatizarea lucrului în
Word se utilizeaz metodele i propriet ile acestor obiecte.

Modelul de obiecte din Word 97 cuprinde aproximativ 180 de obiecte. O reprezentare grafic a structurii ierarhice se
poate vedea în Help – "Microsoft Word Objects". O descriere detaliat a unui obiect se ob ine prin dublu click pe numele
obiectului (în diagram ) sau, uzual, prin indexul din Help. La instalarea aplica iei trebuie s se mearg pe Custom i s
se selecteze Online Help for Visual Basic.

Dintr-un document Word, pentru a ajunge la modelul de obiecte se deschide dialogul Help i se merge pe succesiunea
Contents and Index – Microsoft Word Visual Basic Reference – Visual Basic Reference – Getting Started with
Visual Basic – Microsoft Word Objects.

Din editorul VB se ajunge la con inutul i indexul VB Help for Word prin succesiunea Help – Contents and Index –
Microsoft Word Visual Basic Reference (din fi a Contents) – Shortcut to Microsoft Word Visual Basic Reference.

În cele ce urmeaz se vor prezenta doar principalele obiecte (mai sus în ierarhie, cele mai des utilizate, pentru
opera iunile curente etc.) cu principalele metode i propriet i i pentru scopurile uzuale.

Obiectul Application

La pornirea unei sesiuni Word se creeaz automat un obiect Application. Se utilizeaz propriet ile i metodele
obiectului Application pentru a controla sau returna (afla) atributele întregii aplica ii, a controla aspectul ferestrei Word i
56
pentru a accesa restul modelului de obiecte. Se utilizeaz proprietatea Application pentru a returna obiectul Application
Word.

Propriet i (Application)

Dintre propriet ile care controleaz aspectul vizibil al aplica iei men ion m câteva în continuare.

DisplayScrolllBars

Exprim faptul dac sunt sau nu afi ate barele de defilare. Read/write.

La citire, returneaz o valoare Boolean:

• True, dac un document, cel pu in, are o bar de defilare


• False, dac în nici o fereastr de document nu exist bare de defilare.

Valoarea propriet ii se poate modifica:

• Atribuirea valorii True afi eaz barele de defilare în toate ferestrele


• Atribuirea valorii False elimin barele de defilare din toate ferestrele.

Application.DisplayScrollBars = True
Application.DisplayScrollBars = False

Pentru barele orizontale sau verticale, individual, se utilizeaz propriet ile DisplayHorizontalScrollBar i
DisplayVerticalScrollBar pentru o fereastr sppecificat .

DisplayStatusBar

Exprim faptul dac este afi at bara de stare a aplica iei. Read/write. Boolean.

La citire, returneaz o valoare Boolean: True dac bara este afi at , False în caz contrar.

La scriere atribuirea unei valori logice produce efectul evident.

Height

Read/write. Long.

În l imea ferestrei aplica iei Word. Pentru a vedea dimensiunea maxim admis se va utiliza proprietatea UsableHeight.

Width

Read/write. Long.

Returneaz sau fixeaz l imea obiectului, în puncte.

With Application
.Height = 450
57
.Width = 600
End With

WindowState

Read/write. Long.

Returneaz sau stabile te starea ferestrei aplica iei. Poate fi una dintre valorile wdWindowStateMaximize,
wdWindowStateMinimize sau wdWindowStateNormal, cu interpret ri evidente. Valoarea wdWindowStateNormal arat o
fereastr care nu este minimizat sau maximizat .

Pentru a putea seta starea ferestrei, aceasta trebuie s fie activ (se va utiliza metoda Activate în acest scop).
Urm toarea instruc iune maximizeaz fereastra aplica iei Word

Application.WindowState = wdWindowStateMaximize

Alte propriet i care controleaz comportarea global a aplica iei Word, cum ar fi cele care corespund atributelor accesate
prin comanda Options din meniul Tools, se g sesc la obiectul Options.

Utilizând proprietatea Options a obiectului Applications, se returneaz un obiect Options care poate fi apoi configurat,
dup exemplul

With Application.Options
.AllowDragAndDrop = True
.ConfirmConversions = False
.MeasurementUnit = wdPoints
End With

Pentru informa ii complete se va studia obiectul Options.

Dintre propriet ile obiectului Application care ofer acces la obiecte situate mai jos în ierarhie (accesori) sunt
enumerate cele mai des utilizate.

ActiveDocument

Read-only.

Returneaz un obiect Document care reprezint documentul activ (cel care are focusul). Dac nu exist nici un
document deschis, atunci apare o eroare.

ActivePrinter

Read/write. String.

Returneaz sau stabile te numele imprimantei active. Exemplul urm tor alege imprimanta activ :

ActivePrinter = "HP LaserJet 4 local on LPT1:"

Se observ utilizarea denumirii din mediul Windows.

ActiveWindow

58
Read-only.

Returneaz un obiect Window care reprezint fereastra activ . Dac nu exist nici o fereastr deschis , apare o eroare.

MsgBox Application.ActiveWindow
ActiveWindow = "Fereastra activa"

Primul exemplu afi eaz numele ferestrei active, al doilea atribuie un nou nume ferestrei active. Este de remarcat c
numele ferestrei nu este obligatoriu identic cu numele documentului i c exemplele func ioneaz corect pentru c
proprietatea implicit a obiectului returnat este numele (Name).

Documents

Read-only.

Întoarce colec ia Documents a tuturor documentelor deschise.

Selection

Read-only.

Întoarce obiectul Selection, care reprezint un domeniu selectat (redus eventual la punctul de inser ie). Este de remarcat
c exist o singur selec ie pe fereastr (sau ochi de fereastr ) i doar una este activ – cea returnat .

Pentru exemple se va vedea prezentarea obiectului Selection.

Windows

Read-only.

Returneaz colec ia Windows a tuturor ferestrelor document. Colec ia corespunde ferestrelor cu denumirile ( i numerele
de ordine) listate la meniul Window din Word.

MsgBox Windows.Count

afi eaz num rul ferestrelor deschise în Word (ata ate unor documente).

Metode (Application)

Dintre metodele obiectului Application enumer m doar Quit, celelalte sunt sau mai rar utilizate, sau se mai aplic i altor
obiecte i vor fi prezentate ulterior.

Quit

Apelul procedurii duce la închiderea aplica iei Word i, op ional, salveaz sau ruteaz documentele deschise. Sintaxa:

expression.Quit(SaveChanges, Format, RouteDocument)

unde

expression este o expresie care returneaz un obiect Application.


59
SaveChanges este de tip Variant, op ional, i specific dac Word salveaz documentele înaintea închiderii. Poate fi o
constant (de tipul enumerat WdSaveOptions) wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges,
interpret rile fiind evidente.

OriginalFormat este de tip Variant, op ional, i specific modul în care Word salveaz documentele al c ror format
original nu a fost acela de document Word. Poate fi o constant (de tipul enumerat WdOriginalFormat) dintre
wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.

RouteDocument este de tip Variant, op ional. Este True dac se dore te directarea documentului c tre urm torul
recipient. Dac documentul nu are ata at o fi de rutare (routing slip), argumentul este ignorat (vezi obiectul
RoutingSlip).

În exemplul urm tor

Application.Quit SaveChanges:=wdPromptToSaveChanges, OriginalFormat:=wdWordDocument

se p r se te Word, se întreab utilizatorul dac se salveaz documentele care au fost modificate de la ultima salvare i
toate documentele se salveaz în format Word (indiferent de formatul ini ial).

Obiectul Document

Deschiderea sau crearea unui fi ier în Word produce crearea unui obiect Document. Se utilizeaz propriet ile i
metodele obiectului Document sau ale colec iei Documents pentru a deschide, crea, salva, activa i închide fi iere.

În prezentarea obiectului Document alegem calea ac iunilor uzuale asupra unui document i nu listarea propriet ilor i
metodelor (decât acolo unde este absolut necesar).

Returnarea unui obiect Document

Se poate ob ine orice document deschis ca un obiect Document prin

Documents(index)

unde index este numele documentului (ca ir) sau num rul de ordine al documentului în colec ie. Deoarece num rul de
ordine se poate schimba, prin modificarea colec iei, se recomand utilizarea numelor documentelor. În exemplul

Set wdRaport = Documents("Raport.doc")

variabila wdRaport, definit de tip obiect, con ine un obiect Document care se refer la documentul deschis "Raport.doc".
Orice transformare a variabilei se va reflecta în documentul Raport.doc.

Se poate utiliza i proprietatea ActiveDocument (vezi Application) pentru a returna obiectul Document care se refer la
documentul activ:

If Documents.Count >= 1 Then


MsgBox ActiveDocument.Name
Else
MsgBox "Nici un document nu este deschis"
End If

60
Deschiderea documentelor

Pentru a deschide un document existent, se va utiliza metoda Open a colec iei Documents, metod care deschide
documentul specificat i îl adaug la colec ia Documents. Returneaz un obiect Document. Sintaxa, în versiunea
aplicabil aici, este

expression.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,


PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format)

unde

expression este o expresie care returneaz un obiect Documents.

FileName este de tip Variant i con ine numele documentului (inclusiv calea, dac este necesar). În Windows se pot
specifica mai multe fi iere separate prin spa ii. Este semnalat eroare dac fi ierul specificat nu exist .

ConfirmConversions este de tip Variant, op ional. Are valoarea True pentru a afi a dialogul Convert File dac fi ierul nu
este în format Word.

ReadOnly este de tip Variant, op ional. Are valoarea True dac documentul se deschide ca read-only.

AddToRecentFiles este de tip Variant, op ional. Are valoarea True dac numele fi ierului se adaug listei fi ierelor recent
utilizate (de la baza meniului File).

PasswordDocument este de tip Variant, op ional i reprezint parola necesar la deschiderea documentului.

PasswordTemplate este de tip Variant, op ional i reprezint parola necesar la deschiderea ablonului (template).

Revert este de tip Variant, op ional. Controleaz ce se întâmpl dac FileName este numele unui fi ier deja deschis: True
pentru a neglija orice schimb ri nesalvate i redeschiderea documentului; False pentru a activa documentul deschis.

WritePasswordDocument este de tip Variant, op ional. Este parola necesar pentru salvarea schimb rilor aduse
documentului.

WritePasswordTemplate este de tip Variant, op ional. Este parola necesar pentru salvarea modific rilor aduse ablonilui.

Format este de tip Variant, op ional. Indic tipul de conversie utilizat la deschiderea documentului. Poate fi o constant
(din tipul enumerat wdOpenFormat) dintre:

wdOpenFormatAuto, wdOpenFormatDocument, WdOpenFormatRTF,

wdOpenFormatTemplate, wdOpenFormatText, WdOpenFormatUnicodeText.

Valoarea implicit este wdOpenFormatAuto.

Pentru o mai bun informare asupra ultimului argument, se va studia obiectul FileConverter.

În exemplul urm tor se deschide fi ierul Test.doc din folderul curent:

Set wdTestDoc = Documents.Open(FileName:="test.doc")

61
Este de remarcat, în exemplu, c fi ierul este în directorul curent, ceea ce poate produce erori la executarea codului: este
suficent ca utilizatorul s schimbe folderul pentru ca documentul test.doc s nu mai fie g sit. Din acest motiv este de
preferat ca numele s con de remarcat, în exemplu, c fi ierul este în directorul curent, ceea ce poate produce erori la
executarea codului: este suficent ca utilizatorul s schimbe folderul pentru ca documentul test.doc s nu mai fie g sit. Din
acest motiv este de preferat ca numele s con in calea complet , ceea ce contribuie la robuste ea codului. În acela i
scop se vor utiliza propriet ile PathSeparator (a obiectului Application), care returneaz caracterul separator utilizat de
sistemul de fi iere, diferit în DOS/Windows i Macintosh i DefaultFilePath (a obiectului Options), care
returneaz /seteaz c i ale folderelor specificate.

În exemplul urm tor se utilizeaz obiectul FileSearch pentru a determina dac exist fi ierul care trebuie deschis:

defaultDir = Options.DefaultFilePath(wdDocumentsPath)
With Application.FileSearch
.FileName = "test.doc"
.LookIn = defaultDir
.Execute
If .FoundFiles.Count = 1 Then
Documents.Open FileName:=defaultDir & _
Application.PathSeparator & "test.doc"
Else
MsgBox "Fisierul test.doc nu este gasit"
End If
End With

Se va observa utilizarea structurii With…End With i a modului cum se formeaz argumentul FileName din cale i
denumire.

O alt modalitate de deschidere a unui document este prin afi area dialogului Open uzual în Office (ca i în alte aplica ii
Windows). Acest mod se realizeaz prin

Dialogs(wdDialogFileOpen).Show

care returneaz un obiect Dialog ce se refer la dialogul Open (din meniul File) iar metoda Show afi eaz i execut
ac iunile executate în boxa de dialog Open.

Utilizarea metodei Display (în locul metodei Show) produce doar afi area dialogului f r nici o alt ac iune. Dac
utilizatorul apas butonul OK al boxei, atunci este returnat valoarea -1 i se poate ti numele fi ierului selectat în box
dup modelul urm tor:

Set dlg = Dialogs(wdDialogFileOpen)


aButton = dlg.Display
fSelected = dlg.Name
If aButton = -1 Then
Documents.Open FileName:=fSelected
End If

Observa ie. Pentru o discu ie mai ampl asupra utiliz rii cutiilor de dialog definite în Word se va vedea Word VB Help –
"Displaying built-in Word dialog boxes".

Pentru a determina dac un anumit document este deschis se poate enumera colec ia Documents i testa numele
documentelor deschise. În urm torul exemplu se activeaz documentul "cautat.doc" dac este deschis i se deschide
dac nu este deja deschis.

62
docFound = True
For Each aDoc In Documents
If InStr(1,aDoc.Name,"cautat.doc",1) Then
aDoc.Activate
Exit For
Else
docFound = False
End If
Next aDoc
If docFound = False Then Documents.Open FileName:="cautat.doc"

Pentru a determina câte documente sunt deschise se utilizeaz proprietatea Count a colec iei Documents:

If Documents.Count = 0 Then MsgBox "Nu este deschis nici un document"

Crearea i salvarea documentelor

Pentru a crea un nou document se utilizeaz metoda Add aplicat colec iei Documents. Metoda returneaz documentul
creat ca un obiect Document, astfel încât valoarea returnat poate fi atribuit unei variabile de tip obiect pentru a putea
referi direct noul document în program:

Dim myDoc As Document


Set myDoc = Documents.Add
myDoc.PageSetup.TopMargin = InchesToPoints(1.25)

ultima instruc iune fixeaz marginea de sus la 1.25".

Documentul nou devine documentul activ.

Pentru a salva un document nou pentru prima dat , se utilizeaz metoda SaveAs a obiectului Document. Exemplul
urm tor este de acest fel:

ActiveDocument.SaveAs FileName:="salvat.doc"

Documentul activ este salvat cu numele "salvat.doc" i poate fi identificat cu acest nume în colec ia Documents.

Exemplul urm tor construie te o expresie mai complicat , exploatând cele spuse mai sus: se creeaz un nou document
care este salvat imediat cu un nume i apoi se insereaz în document un tabel cu dou linii i trei coloane.

Documents.Add.SaveAs FileName:="vanzari.doc"
Documents("vanzari.doc").Tables.Add _
Range:=Selection.Range, NumRows:=2, NumColumns:=3

Pentru salvarea modific rilor efectuate într-un document, se utilizeaz metoda Save a colec iei Documents:

Documents("vanzari.doc").Save

Utilizarea metodei Save cu un document nou deschide dialogul Save As pentru a întreba utilizatorul despre numele dat
fi ierului.

Pentru salvarea tuturor fi ierelor deschise se va utiliza metoda Save aplicat colec iei Documents.

63
Metoda Save are sintaxa dependent de obiectul c ruia i se aplic :

expression.Save

unde expression este orice expresie care returneaz un obiect Document sau Template, este aplicabil unui document
sau template.

expression.Save(NoPrompt, OriginalFormat)

este aplicabil colec iei Documents. Argumentele sunt

expression este orice expresie care returneaz un obiect Documents.

NoPrompt este de tip Variant, op ional. Are valoarea True pentru ca Word s salveze automat toate documentele, False
pentru ca Word s întrebe utilizatorul înaintea de salvarea fiec rui document care a fost modificat.

OriginalFormat este de tip Variant, op ional. Specific modul în care sunt salvate documentele.

Poate fi o constant (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser sau
wdWordDocument.

Activarea unui document

Pentru activarea unui alt document se aplic metoda Activate obiectului Document respectiv. Reamintim c la crearea
unui nou document, acesta r mâne activ. Documentul activat trebuie s fie deschis (inclus în colec ia Documents):

Documents("raport.doc").Activate
Doc1.Activate

dac variabila Doc1 a primit ca valoare un document deschis.

Metoda Activate, aplicabil mai multor obiecte (vezi Word VB Help – Activate Method), are sintaxa

expression.Activate

unde expression este orice expresie care returneaz un obiect c ruia i se poate aplica metoda.

Tip rirea unui document

Întrucât tip rirea unui document este gestionat de mai multe comenzi i parametri, din dialoguri diferite în mediul Word,
controlul tip ririi din Visual Basic necesit eventuale interven ii asupra obiectului Options (pentru a fixa parametrii
accesa i uzual prin Tools – Options – fi a Print) i utilizarea metodei PrintOut, aplicabil obiectului Document.

Propriet ile obiectului Options, care privesc tip rirea, sunt identificate u or prin aceea c numele lor începe cu Print:
PrintComments, PrintHiddenText, PrintDrawingObjects, PrintFieldCodes etc., atribuirea valorii True fiind echivalent
cu marcarea boxei de control din dialogul Word corespunz tor.

Metoda PrintOut este aplicabil obiectelor Application, Document sau Window i are parametri corespunz tori
op iunilor din dialogul Print (meniul File din mediul Word). Sintaxa, cu specificarea i explicarea principalelor argumente,
este

64
expression.PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType,
PrintToFile, Collate, FileName)

unde

expression este orice expresie care returneaz un obiect Application, Document sau Window. Background este de tip
Variant, op ional. Are valoarea True dac tip rirea are loc în fundal (macro-ul continu în timpul tip ririi documentului).

Append este de tip Variant, op ional. Are valoarea True atunci când, la tip rirea în fi ier, documentul este ad ugat
fi ierului specificat în argumentul OutputFileName; are valoarea False pentru rescrierea fi ierului OutputFileName.

Range este de tip Variant, op ional i specific tipul de domeniu tip rit. Poate fi una din constantele (de tip
WdPrintOutRange): wdPrintAllDocument, wdPrintCurrentPage, wdPrintFromTo, wdPrintRangeOfPages sau
wdPrintSelection.

OutputFileName este de tip Variant, op ional. Dac PrintToFile este True, atunci argumentul d numele (eventual cu cale)
pentru fi ierul unde are loc tip rirea.

From este de tip Variant, op ional. Specific num rul paginii de unde începe tip rirea, dac Range este wdPrintFromTo.

To este de tip Variant, op ional. Specific num rul paginii pân unde se tip re te, dac Range este wdPrintFromTo.

Item este de tip Variant, op ional. Specific elementul care se tip re te. Poate fi o constant (de tipul enumerat
WdPrintOutItem): wdPrintAutoTextEntries, wdPrintComments, wdPrintDocumentContent, wdPrintKeyAssignments,
wdPrintProperties sau wdPrintStyles.

Copies este de tip Variant, op ional. Specific num rul de copii tip rite.

Pages este de tip Variant, op ional. Specific numerele paginilor i secven ele de pagini care se tip resc, separate prin
virgule, dac Range este wdPrintRangeOfPages. De exemplu, "2, 6-10" înseamn pagina 2 i paginile de la 6 la 10.

PageType este de tip Variant, op ional. Specific tipul de pagini tip rite. Poate fi o constant (de tipul WdPrintOutPages):
wdPrintAllPages, wdPrintEvenPagesOnly sau wdPrintOddPagesOnly.

PrintToFile este de tip Variant, op ional. Are valoarea True pentru a trimite comenzile de tip rire c tre un fi ier. Numele
fi ierului este dat în argumentul OutputFileName.

Collate este de tip Variant, op ional. Are valoarea True pentru a tip ri toate paginile documentului înaintea tip ririi
urm toarei copii (argument valabil în cazul tip ririi mai multor copii ale documentului – argumentul Copies).

FileName este de tip Variant, op ional. Numele fi ierului (inclusiv calea, dac este în alt folder decât cel curent) care
con ine documentul care se tip re te. Dac argumentul este omis, atunci se tip re te documentul activ. Argumentul este
admis doar pentru obiectul Application.

Exemplul urm tor fixeaz pentru documentul activ tip rirea textului ascuns i tip re te primele trei pagini:

Options.PrintHiddenText = True
ActiveDocument.PrintOut Range:=wdPrintFromTo, From:=" 1", To:=" 3"

Dac tip rirea se efectueaz cu valorile curente (implicite) ale parametrilor, atunci este suficient comanda:

ActiveDocument.PrintOut
65
Se observ c opera iunea de tip rire necesit , pentru o procesare mai fin , specificarea documentului, specificarea
paginilor, a tipului de tip rire (toate, pagini pare sau impare), specificarea destina iei (imprimant sau fi ier).

Se va vedea i proprietatea PageSetup care controleaz atributele paginii pentru document, sec iune etc.

Închiderea documentelor

Pentru închidere se aplic metoda Close obiectului Document sau colec iei Documents.

Documents("raport.doc").Close

Dac s-au efectuat modific ri în document, de la ultima salvare, se afi eaz dialogul de salvare. Închiderea tuturor
documentelor deschise se efectueaz aplicând metoda Close pentru întreaga colec ie:

Documents.Close

Metoda Close este aplicabil mai multor obiecte. Sintaxa pentru Documents sau Document este

expression.Close(SaveChanges, OriginalFormat, RouteDocument)

unde

expression este o expresie care returneaz un obiect Document sau Documents.

SaveChanges este de tip Variant, op ional. Specific tipul de ac iune privind salvarea documentului înainte de închidere.
Poate fi o constant (de tip WdSaveOptions): wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges,
cu interpret ri evidente.

OriginalFormat este de tip Variant, op ional. Specific formatul documentului la salvare (poate fi o constant (de tip
WdOriginalFormat): wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.

RouteDocument este de tip Variant, op ional. Are valoarea True dac documentul este rutat c tre urm torul recipient.
Dac documentul nu are ata at o fi de rutare (routing slip), argumentul este ignorat (vezi obiectul RoutingSlip).

Urm torul exemplu închide, f r salvare, toate documentele:

Documents.Close SaveChanges:=wdDoNotSaveChanges

Accesarea obiectelor dintr-un document

Din obiectul Document se pot accesa, prin propriet i sau metode, obiecte care corespund entit ilor care formeaz
documentul scris în Word. Dintre obiectele accesibile men ion m (nu toate): Bookmarks, Characters, CommandBars,
Comments, DocumentProperties, Endnotes, Fields, Footnotes, FormFields, Frames, HyperLinks, Indexes, Lists,
ListTemplates, PageSetup, Paragraphs, Range, Revisions, Sections, Sentences, Shapes, StoryRanges, Styles,
Subdocuments, Tables, TablesOfContents, TablesOfFigures, Template, Variables, Windows, Words.

De exemplu, prin

MsgBox "Sunt " & ActiveDocuments.Tables.Count & " tabele în document"

afi eaz un mesaj cu num rul tabelelor existente în documentul activ.

66
Este evident c utilizând propriet ile i metodele obiectelor astfel returnate se pot modifica programatic obiectele referite:
se pot ad uga i formata tabele, câmpuri, paragrafe, cuvinte etc.

ActiveDocument.Footnotes.Add Range:=myRange, Text:="Textul notei de subsol adaugate"

adaug o not de subsol la locul din document specificat de variabila myRange.

Obiectul Range

Un obiect Range reprezint o zon continua dintr-un document. Fiecare obiect Range este definit de o pozi ie (de
caracter) de început i de o pozi ie (de caracter) de sfâr it. Utilizat pentru identificarea unor por iuni din document,
obiectul Range este similar obiectului Bookmark, diferen a fiind totu i important : un obiect Range exist doar atât timp
cât se execut procedura care l-a definit.

Atunci când pozi ia de început este identic cu pozi ia de sfâr it, obiectul Range identific punctul de inser ie. Nu exist
limit ri asupra întinderii unui obiect Range.

Obiectele Range sunt independente de selec ia din document: se poate defini i modifica un domeniu f r s se schimbe
selec ia. Se pot defini, de asemenea, domenii multiple într-un document, în timp ce selec ia este unic într-un ochi de
fereastr ..

Pentru a în elege toate propriet ile obiectului Range ( i ale altor obiecte, de altfel), trebuie tiut c zonele unui document
se presupun structurate în episoade (stories). Un episod (story) este o zon de text diferit de celelalte zone din acel
document. Astfel, dac un document con ine text principal (body text), note de subsol i anteturi, atunci documentul
con ine un episod cu textul principal, un episod cu note de subsol i un episod cu anteturi. Exist 11 tipuri diferite de
episoade posibile într-un document, corespunzând urm toarelor constante (din WdStoryType):

WdEndnotesStory wdEvenPagesFooterStory wdEvenPagesHeaderStory

WdFirstPageFooterStory wdFirstPageHeaderStory wdFootnotesStory

WdMainTextStory wdPrimaryFooterStory wdPrimaryHeaderStory

WdTextFrameStory

Tipul episodului pentru un obiect de gen domeniu (Range), selec ie (Selection) sau semn de carte (Bookmark) este
returnat de proprietatea StoryType. Cunoa terea acestei propriet i este important prin aceea c mediul Word deschide
ferestre sau ochiuri diferite dup episodul în care este punctul de inser ie (selec ia), Pentru navigarea programatic între
aceste ochiuri trebuie s se cunoasc valoarea propriet ii StoryType.

Propriet ile Start, End i StoryType identific un obiect Range în mod unic. Start i End specific sau returneaz
pozi iile de început i, respectiv, de sfâr it ale obiectului Range. Pozi ia de caracter de la începutul fiec rui episod este 0,
pozi ia de dup primul caracter este 1 .a.m.d.

Propriet ile Start i End sunt de tip Long, read/write. Pozi iile returnate sunt relative la începutul episodului. Dac fixarea
unei propriet i stric ordinea natural dintre start i end, atunci cealalt valoare este fixat automat la valoarea atribuit .

Prin atribuirea de valori propriet ilor Start i End se poate modifica dimensiunea domeniului referit.

Obiect Range vs. obiect Selection

În general, este de preferat s se opereze cu obiecte Range în loc de obiecte Selection, deoarece:
67
• se pot defini i utiliza mai multe obiecte Range (doar un obiect Selection pe fereastr );
• procesarea obiectelor Range nu modific textul selectat;
• procesarea obiectelor Range este mai rapid decât a selec iei.

La înregistrarea unui macro creeaz , de obicei, referin e la obiectul Selection. Utilizarea obiectului Range poate
simplifica totu i codul creat. Urm torul exemplu aplic stilul bold primelor dou cuvinte din document i insereaz un
paragraf dup cele dou cuvinte:

Set myRange = ActiveDocument.Range(Start:=0, End:=ActiveDocument.Words(2).End)


myRange.Bold = True
myRange.InsertParagraphAfter

Este interesant de comparat acest cod cu secven a ob inut la înregistrarea unui macro care efectueaz aceea i sarcin .

Returnarea unui obiect Range prin metoda Range

Aplicat unui obiect Document, metoda Range returmeaz un obiect Range situat în episodul principal. Sintaxa este

expression.Range(Start, End)

unde

expression este orice expresie care returneaz un obiect Document.

Start este de tip Long, op ional. Specific punctul de început (în pozi ii de caracter).

End este de tip Long, op ional. Specific punctul de sfâr it (în pozi ii de caracter).

Pozi iile de caracter încep cu 0 la începutul documentului. Sunt num rate toate caracterele, inclusiv caracterele
netip ribile. Caracterele ascunse se num r chiar dac nu sunt afi ate. Dac nu se specific pozi iile de început i/sau
sfâr it, se consider , implicit, începutul i sfâr itul documentului.

Exemplul urm tor scrie în bold primele 10 caractere ale documentului:

ActiveDocument.Range(Start:=0, End:=10).Bold = True

Dac este necesar ca obiectul Range returnat s fie referit de mai multe ori, se va utiliza instruc iunea Set prin care se
atribuie obiectul returnat unei variabile obiect:

Dim myRange As Range


Set myRange = ActiveDocument.Range
myRange.InsertAfter Text:="Final"

Se observ definirea unei variabile obiect de tip specificat Range, ob inerea unui obiect Range egal cu tot documnetul
(prin nespecificarea valorilor de start i end), atribuirea acestui obiect variabilei definite i utilizarea variabilei pentru a
referi obiectul. Efectul este inserarea cuvântului "Final" dup ultimul caracter din document.

În exemplul urm tor se observ utilizarea unui obiect Range doar ca punct de referin în document (asemenea unui
Bookmark):

Set inceputDoc = ActiveDocument.Range(Start:=0, End:=0)

68
Pozi iile de start i end pot fi specificate direct sau prin intermediul propriet ilor Start i End ale altor obiecte cum ar fi
Selection, Bookmark sau Range, ca în exemplul urm tor în care se define te un domeniu care se refer la a dou i a
treia propozi ie din document:

Set myRange=ActiveDocument.Range( _
Start:=ActiveDocument.Sentences(2).Start, _
End:=ActiveDocument.Sentences(3).End)

Deoarece obiectul Range nu are un corespondent visual în document, se poate utiliza metoda Select a obiectului pentru
a produce selectarea textului din domeniu i a verifica, astfel, definirea corect a obiectului Range:

myRange.Select

selecteaz por iunea de text con inut în variabila myRange, c reia în prealabil i s-a atribuit un Range.

Returnarea unui obiect Range prin proprietatea Range

Proprietatea Range este disponibil pentru multiple obiecte — de exemplu Paragraph, Bookmark, Endnote, Cell — i
este utilizat pentru întoarcerea unui obiect Range.

Exemplele urm toare sunt u or interpretabile. Pentru explica ii complete se vor studia obiectele respective.

Active.Document.Paragraphs(1).Range
ActiveDocument.Tables(1).Rows(1).Range
ActiveDocument.Bookmarks(1).Range

Nu trebuie uitat structura With…End With pentru proces ri multiple ale aceluia i obiect Range.

Modificarea unei por iuni a unui document

Visual Basic include obiecte care pot fi utilizate pentru a modifica urm toarele tipuri de elemente ale documnetului:
caractere, cuvinte, propozi ii, paragrafe i sec iuni. Tabelul urm tor arat propriet ile (aplicabile unor diverse obiecte)
care corespund acestor elemente i obiectele returnate:

expresia obiect returnat

Words(index) Range

Characters(index) Range

Sentences(index) Range

Paragraphs(index) Paragraph

Sections(index) Section

Pentru ultimele dou colec ii din tabel este de notat c pentru a junge la obiectul Range corespunz tor se va apela la
proprietatea Range. Prin urmare

Paragraphs(index).Range
Sections(index).Range
69
dau acces la obiectele Range respective.

Pentru modificarea unui domeniu de text din document, se poate crea un obiect Range cu acele elemente (caractere,
propozi ii, paragrafe etc.). Aplicarea propriet ilor i metodelor obiectului Range astfel creat va produce modificarea
textului referit de obiect:

ActiveDocument.Words(1).Case = wdUpperCase

trece primul cuvânt din document în majuscule. De remarcat c proprietatea Case este aplicat obiectului Range returnat
de ActiveDocument.Words(1).

În formarea obiectelor Range sunt importante propriet ile Start i End care dau începutul i sfâr itul.

Propriet ile elementelor documentului, specificate în tabelul anterior în prima coloan , sunt admise pentru obiectele
Document, Selection i Range.

Lucrul cu textul dintr-un obiect Range

Accesul la con inutul unui obiect Range este realizat prin proprietatea Text. Proprietatea Text returneaz textul
neformatat (plain text) al domeniului referit. Atunci când se seteaz aceast proprietate, textul domeniului referit este
înlocuit de valoarea atribuit propriet ii.

primCuvant = ActiveDocument.Words(1).Text
ActiveDocument.Words(1).Text = "Capitol"

returneaz sau modific primul cuvânt din documentul activ.

Pentru inserarea unui text înaintea sau dup un obiect Range se utilizeaz , respectiv, metodele InsertBefore sau
InsertAfter. Dup inserarea unui text, domeniul este extins automat pentru a include i textul inserat (înainte sau dup ).

Sintaxa metodelor este

expression.InsertBefore(Text)

expression.InsertAfter(Text)

unde

expression este o expresie care returneaz un obiect Selection sau Range.

Text este de tip String i reprezint textul care se insereaz .

Pentru inserarea caracterelor speciale se va utiliza func ia Chr, sau constantele Visual Basic cum ar fi vbCr, vbLf, vbCrLf
sau vbTab.

Inserarea unui text dup un domeniu care se refer la un întreg paragraf are loc dup marca de paragraf. Drept urmare
textul este inserat la începutul paragrafului urm tor. Pentru a anula acest lucru se va identifica sfâr itul de domeniu
(Range sau Selection) i se va sc dea cu 1 pozi ia final (deci se va trece în fa a caracterului marc de paragraf).
Exemplul urm tor arat mecanismul utilizat:

Set Doc = ActiveDocument

70
Set myRange = Doc.Range( _
Start:=Doc.Paragraphs(1).Range.End - 1, _
End:=Doc.Paragraphs(1).Range.End - 1)
myRange.InsertAfter " sf r it de paragraf."

Un domeniu poate fi redus la punctul de început sau de sfâr it (propriet ile Start i End devin egale cu pozi ia de
caracter respectiv ) prin metoda Collapse. Sintaxa este

expression.Collapse(Direction)

unde

expression este o expresie care returneaz un obiect Range sau Selection.

Direction este de tip Variant, op ional i indic direc ia în care are loc implozia domeniului. Poate fi o constant (de tip
WdCollapseDirection) dintre: wdCollapseEnd sau wdCollapseStart. Valoarea implicit este wdCollapseStart.

Utilizarea metodei cu wdCollapseEnd, atunci când domeniul se refer la un întreg paragraf, produce un domeniu situat
dup marca de paragraf.

Pentru formatarea textului dintr-un obiect Range, se utilizeaz

• proprietatea Font pentru formatarea caracterelor


• proprietatea ParagraphFormat pentru formatarea paragrafelor.

Proprietatea Font returneaz un obiect Font care dispune de toate metodele i propriet ile necesare pentru aplicarea
format rilor admise pentru caractere în Word.

Proprietatea ParagraphFormat returneaz un obiect ParagraphFormat care permite efectuarea tuturor format rilor
admise pentru un paragraf în Word.

Deoarece ambele obiecte, Font i ParagraphFormat sunt foarte complexe dar reprezint ac iuni de rutin pentru un
utilizator Word nu vor fi prezentate aici. Exemplul urm tor constituie un model suficient pentru orice alt ac iune care
implic aceste obiecte:

With ActiveDocument.Paragraphs(1).Range.Font
.Name = "Times New Roman"
.Size = 14
.AllCaps = True
End With
With ActiveDocument.Paragraphs(1).Range.ParagraphFormat
.LeftIndent = InchesToPoints(0.5)
.Space1
End With

Textul surs precedent realizeaz pentru primul paragraf din documentul activ setarea fontului ca "Times New Roman",
de m rime 14 i scris cu majuscule. În formatarea paragrafului se realizeaz indentarea din stânga cu 1.5" i spa ierea la
un rând.

Redefinirea unui obiect Range

Pentru modificarea limitelor unui obiect Range se pot utiliza, în mod uzual, propriet ile Start i End:

71
myRange.End = myRange.End + 10

Metodele MoveStart i MoveEnd produc o ac iune similar , dar se pot utiliza unit i diverse, predefinite, pentru
extinderea domeniului. Ambele metode returneaz un in reg care arat num rul de unit i cu care s-a modificat Start sau
End, sau 0 dac opera iunea nu s-a putut realiza. Sintaxa este

expression.MoveStart(Unit, Count)

expression.MoveEnd(Unit, Count)

unde

expression este o expresie care returneaz un obiect Range sau Selection.

Unit este de tip Variant, op ional. Reprezint unitatea cu care se deplaseaz punctul de start/end al obiectului. Poate fi
una dintre constantele (de tip WdUnits): wdCharacter, wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell,
wdColumn, wdRow sau wdTable. Pentru obiectul Selection poate fi i wdLine. Valoarea implicit este wdCharacter.

Count este de tip Variant, op ional. Num rul maxim de unit i cu care se mut punctul de start/end. Poate fi negativ sau
pozitiv, cu interpret rile curente. În cazul când opera iunea produce inversarea fizic a pozi iilor de Start i End, cele dou
pozi ii devin egale (Range sufer un colaps). Valoarea implicit este 1.

În exemplul urm tor

myRange.MoveEnd Unit:=wdParagraph, Count:=1

se extinde domeniul încât s cuprind i urm torul paragraf.

Observa ie. Exist i metode mai fine cum ar fi MoveUntil, MoveWhile, MoveStartUntil, MoveEndWhile etc. Se va
vedea intrarea respectiv din Word VB - Help.

Metoda SetRange poate fi utilizat pentru modificarea simultan a limitelor unui obiect Range existent. Nu trebuie s se
confunde cu metoda Range, care define te obiectul.

expression.SetRange(Start, End)

unde

expression este o expresie care returneaz un obiect Range sau Selection.

Start este de tip Long, pozi ia nou de start.

End este de tip Long, pozi ia nou de sfâr it (end).

De exemplu:

myRange.SetRange Start:=myRange.Start, End:=myRange.End+10

care extinde domeniul cu 10 caractere.

72
Pentru deplasarea obiectului Range cu un num r de unit i se va studia metoda Next. Acest procedeu se poate folosi la
parcurgerea seceven ial a unei secven e de cuvinte, paragrafe. Este de reamintit c o asemenea parcurgere poate fi
efectuat i prin structura For Each…Next.

Atribuirea obiectelor Range

O prim procedur este cea, exemplificat mai sus, în care se utilizeaz instruc iunea Set pentru atribuirea unui Range la
o variabil obiect, instruc iune care poate opera i în ipostaza

Set Range2 = Range1

La modificarea unui obiect, schimbarea se va reflecta automat i în cel lalt obiect.

Este de observat c printr-o instruc iune de atribuire direct

Range2 = Range1

se atribuie proprietatea implicit a obiectului Range1 (adic proprietatea Text) propriet ii implicite a obiectului Range2.
Prin urmare codul este echivalent cu

Range2.Text = Range1.Text

care nu modific obiectele Range respective (doar con inutul lui Range2). Cele dou obiecte pot fi la loca ii diferite, doar
con inutul este acela i i leg tura dintre ele nu se stabile te permanent.

Prin proprietatea Duplicate se creeaz un nou obiect Range, duplicat, cu acelea i limite i text:

Set Range2 = Range1.Duplicate

Modificarea limitelor unui obiect nu influen eaz limitele celuilalt, dar modificarea textului poate produce modificarea
celuilalt în cazul suprapunerii domeniilor.

Obiectul Selection

Atunci când se proceseaz un document în Microsoft Word, este uzual s se selecteze o por iune de text i s se
formateze/modifice/etc. por iunea selectat . În Visual Basic, opera iunea de selectare prealabil nu este necesar ,
obiectul Range permite toate ac iunile pentru domenii determinate ale documentului. Totu i, atunci când se dore te ca,
programatic, s se r spund unei selec ii efectuate de utilizator, sau s se modifice selec ia etc., se poate opera cu
obiectul Selection.

Exist un singur obiect Selection pe ochi de fereastr i doar un obiect este activ la un moment dat (corespunzând
locului unde este puctul de inser ie, cu toat zona selectat adiacent ). Este evident, din lucrul în Word, c o selec ie
poate s se refere la un întreg domeniu sau poate fi redus la punctul de inser ie.

Obiectul Selection este returnat de proprietatea Selection a obiectelor Application, Window sau Pane. Utilizat cu
Application, proprietatea returneaz obiectul Selection care se refer la selec ia activ . Prin urmare

Selection.InsertAfter Text:=" Text ad ugat dup selec ie"

utilizeaz proprietatea Selection a obiectului Application (fiind global nu trebuie specificat obiectul), este returnat
selec ia activ i se insereaz un text, similar metodei InsertAfter de la Range.

73
Dac se lucreaz cu selec ia dintr-o fereastr particular , obiectul respectiv se specific :

Windows("Document2").Selection.Paragraphs(1).SpaceBefore = InchesToPoints(0.15)

m re te la 0.15" spa iul dinaintea primului paragraf din selec ie (dac selec ia este punctul de inser ie, se modific
paragraful curent).

Urm torul exemplu insereaz text în antetul primei pagini

With ActiveWindow
.View.Type = wdPageView
.View.SeekVCiew = wdSeekPrimaryHeader
.ActivePane.Selection.InsertAfter Text:="Capitolul I"
End With

În general, metodele i propriet ile uzuale ale obiectului Selection sunt similare celor de la obiectul Range. Este totu i
de amintit c obiectul Selection are corespondent grafic în document: zona selectat . Orice extindere sau implozie se
vede imediat.

Deplasarea i extinderea selec iei

Deoarece nu exist decât o selec ie pe ochi de fereastr , selectarea unei noi zone mut implicit i obiectul Selection.
Aceast selectare se efectueaz aplicând metoda Select unui element din document:

ActiveDocument.Words(1).Select

permite mutarea selec iei la primul cuvânt, astfel încât se poate utiliza dup aceea metoda Selection:

Selection.Text = "Primul"

pentru modificarea textului selectat.

Exist un num r de metode care deplaseaz selec ia în document (prin modificarea corespunz toare a obiectului
Selection).

Move(Unit, Count) – reduce selec ia la punctul de sfâr it (Count > 0) sau de început (Count < 0) i deplaseaz apoi
punctul de inser ie astfel ob inut Count unit i (in sensul pozitiv sau negativ).

MoveEnd, MoveStart – similare descrierilor de la obiectul Range

MoveLeft(Unit,Count,Extend) – unde Unit poate fi wdCell, wdCharacter, wdWord sau wdSentence, Count este num rul
de unit i, Extend arat tipul ac iunii: wdMove pentru colaps la stânga i mutarea selec iei, wdExtend pentru extensie spre
stânga.

MoveRight(Unit,Count,Extend) – este similar metodei MoveLeft, dar ac iunea este spre dreapta.

MoveDown(Unit,Count,Extend), MoveUp(Unit,Count,Extend) – cu ac iune similar metodelor precedente, dar direc ia de


ac iune este sus-jos. Unit poate fi wdLine, wdParagraph, wdWindow sau wdScreen. Extend poate fi wdMove sau
wdExtend, cu sensul explicat anterior.

Exemple:

74
Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove

mut punctul de inser ie la începutul paragrafului urm tor.

Selection.MoveEnd Unit:=wdParagraph, Count:=1

extinde selec ia prin mutarea pozi iei finale la sfâr itul paragrafului.

Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend

extinde selec ia activ cu un cuvânt spre dreapta.

Utilizarea metodelor GoToNext, GoToPrevious sau GoTo permite mutarea selec iei prin alegerea tipului de element
int din document, a direc iei etc.

Metoda GoTo

Aplicat obiectului Selection, mut punctul de inser ie în pozi ia de caracter imediat precedent elementului specificat i
returneaz un obiect Range (cu excep ia specific rii elementelor wdGoToGrammaticalError, wdGoToProofreadingError
sau wdGoToSpellingError, caz în care Obiectul Range include i textul eronat). Sintaxa este

expression.GoTo(What, Which, Count, Name)

unde

expression este o expresie care returneaz un obiect Document, Range sau Selection.

What este de tip Variant, op ional i precizeaz tipul elementului unde se mut punctul de inser ie (selec ia). Poate fi una
dintre constantele (de tipul enumerat WdGoToItem):

wdGoToBookmark wdGoToComment wdGoToEndnote

wdGoToEquation wdGoToField wdGoToFootnote

wdGoToGrammaticalError wdGoToGraphic wdGoToHeading

wdGoToLine wdGoToObject wdGoToPage

wdGoToPercent wdGoToProofreadingError wdGoToSection

wdGoToSpellingError wdGoToTable

Which este de tip Variant, op iomal i specific modul de mutare a selec iei. Poate fi una dintre constantele (de tip
WdGoToDirection): wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious sau wdGoToRelative.

Count este de tip Variant, op ional i indic num rul utilizat la determinarea elementului (în func ie de tipul de ac iune dat
de Which). Este doar pozitiv i pentru g sirea unui element anterior se va utiliza wdGoToPrevious cu un Count > 0.

Name este Variant, op ional i d numele elementului int , dac What este wdGoToBookmark, wdGoToComment,
wdGoToField sau wdGoToObject.

75
Exemple:

Selection.GoTo What:=wdGoToHeading, Which:=wdGoToFirst


Selection.GoTo What:=wdGoToHeading, Which:=wdGoToAbsolute, Count:=1
Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=4
Selection.GoTo What:=wdGoToLine, Which:=wdGoToPrevious, Count:=2
Selection.GoTo What:=wdGoToField, Name:="Date"

Metodele GoToNext, GoToPrevious

Pentru ac iuni limitate doar la deplasarea cu un singur element, metodele cu sintaxa (pentru obiectele Range sau
Selection):

GoToNext(What)

GoToPrevious(What)

unde

What este una dintre constantele de tip WdGoToItem (vezi metoda GoTo).

Metodele returneaz un obiect Range (vezi discu ia de la GoTo).

Obiecte accesibile din Selection

Cele mai multe obiecte accesibile din obiectele Range i Document sunt disponibile i din obiectul Selection. Se pot astfel
procesa obiectele din interiorul selec iei. Lista obiectelor care sunt referite din Selection este

Bookmarks, Borders, Cells, Characters, Columns, Comments, Document, Endnotes, Fields, Find, Font, Footnotes,
FormFields, Frames, HeaderFooter, Hyperlinks, InlineShapes, PageSetup, ParagraphFormat, Paragraphs, Revision,
Range, Rows, Sections, Sentences, Shading, ShapeRange, Tables, Words.

Aceste obiecte (colec ii de obiecte) sunt returnate prin propriet ile cu acelea i denumiri ale obiectului Selection. De
exemplu

Selection.Paragraphs.LeftIndent = InchesToPoints(0.5)
Selection.Words(1).Italic = True
MsgBox Selection.Footnotes(1).Range.Text

Pentru parcurgerea tuturor obiectelor dintr-o colec ie returnat se va folosi structuraFor Each…Next:

For Each aBook In Selection.Bookmarks


MsgBox aBook.Name
Next aBook

Propriet i i metode uzuale ale obiectului Selection

Proprietatea Text

Se va utiliza proprietatea Text pentru a returna sau stabili con inutul obiectului Selection:

76
strText = Selection.Text
Selection.Text = "Hello World"

Se va utiliza metoda InsertBefore sau InsertAfter pentru inserarea unui text înainte sau dup selec ie (cu extinderea
corespunz toare a selec iei).

Formatarea textului selectat

Se vor utiliza propriet ile Font i ParagraphFormat pentru accesul la propriet ile i metodele proprii caracterelor i,
respectiv, paragrafelor:

With Selection.Font
.Name = "Times New Roman"
.Size = 14
End With
Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5)

Returnarea obiectului Range

O importan deosebit o are proprietatea Range, care returneaz un obiect Range ce se refer la selec ia curent . În
acest mod se poate exploata faptul c pot exista mai multe obiecte Range i memora selec ii succesive:

Set myRange = Selection.Range

O alt utilizare este aceea când anumite metode sau propriet i se pot aplica doar unui obiect Range:

Selection.Range.CheckSpelling

Proprietatea Information

Returnarea informa iilor despre selec ie, cum ar fi num rul paginii curente, num rul total de pagini, faptul c selec ia este
în antet sau picior de pagin etc. Sintaxa este

expression.Information(Type)

unde

expression este o expresie care returneaz un obiect Range sau Selection.

Type este de tip Long i precizeaz tipul informa iei care se returneaz . Poate fi una dintre cele 35 de
constante de tip WdInformation, dintre care men ion m (doar pentru a exemplifica tipuri de informa ii
ob inute):

o wdActiveEndAdjustedPageNumber – num rul paginii care con ine sfâr itul activ al selec iei sau
domeniului. Num rul este ajustat pentru a considera personaliz rile efectuate de utilizator (num r de
început etc.).
o wdActiveEndPageNumber – num rul paginii care con ine sfâr itul activ al selec iei sau domeniului.
Num rul este dat relativ la începutul documnetului, i nu este modificat de personaliz rile efectuate de
utilizator (num r de început etc.).
o wdHorizontalPositionRelativeToPage – pozi ia orizontal a selec iei sau domeniului; distan a de la
marginea stâng a selec iei la latura stâng a paginii. Distan a este dat în twips (20 twips = 1 point, 72
points = 1 inch). Dac selec ia sau domeniul nu este în zona ecran, atunci se întoarce – 1.

77
o wdInHeaderFooter – întoarce True dac selec ia/domeniul este în ochiul de fereastr antet sau footer,
sau în header sau footer (în page layout view).
o wdWithInTable – întoarce True dac selec ia este într-un tabel.
o wdZoomPercentage – întoarce procentajul curent de m rire a documentului, dup cum este fixat de
proprietatea Percentage.

Exemplul urm tor afi eaz , dac selec ia este într-un tabel, num rul de coloane i de linii ale tabelului:

If Selection.Information(wdWithInTable) = True Then


MsgBox "Coloane = " & Selection.Information(wdMaximumNumberOfColumns) _
& vbCR & "Linii = " & Selection.Information(wdMaximumNumberOfRows)
End If

Determinarea tipului de selec ie (text sau punct de inser ie)

Prin proprietatea Type se poate ob ine informa ia privind tipul selec iei. Valoarea returnat , Long, este una dintre
constantele tipului enumerat WdSelectionType:

wdNoSelection, wdSelectionBlock, wdSelectionColumn,

wdSelectionFrame, wdSelectionInlineShape, wdSelectionIP,

wdSelectionNormal, wdSelectionRow, wdSelectionShape

Dintre aceste constante, wdSelectionNormal reprezint selec ia uzual a unei por iuni de text, wdSelectionBlock
reprezint selec ia sub form de bloc dreptunghiular, wdSelectionIP este selec ia redus la punctul de inser ie.

Exemplul urm tor selecteaz paragraful care con ine punctul de inser ie, dac selec ia este redus la punctul de inser ie:

If Selection.Type = wdSelectionIP Then


Selection.Paragraphs(1).Range.Select
End If

Obiectele Find i Replacement

G sirea i înlocuirea unor domenii specificate de text dintr-un document este o opera iune frecvent în procesarea
textelor. Pentru realizarea programatic , în Visual Basic, dispunem de obiectele Find (pentru g sirea textului specificat) i
Replacement (pentru înlocuire).

Obiectul Find este permis fie din Selection, fie din Range. Exist mici deosebiri între cele dou moduri de acces, legate
îndeosebi de transformarea obiectelor dac procesul de c utare se termin cu succes.

Obiectul Replacement este accesibil din obiectul Find i permite toate ac iunile disponibile în boxa de dialog Find and
Replace (meniul Edit din Word).

Schema general pentru realizarea unei c ut ri urmat , sau nu, de o înlocuire este

o stabilirea parametrilor c ut rii/înlocuirii, prin propriet ile obiectului Find/ Replacement. In proprietatea
Text se precizeaz textul c utat sau înlocuitor.
o executarea c ut rii/înlocuirii prin aplicarea metodei Execute.

78
Find

Dintre propriet ile obiectului Find men ion m

• Font, returneaz un obiect Font pentru care se pot stabili atributele c utate.
• Format, este setat pe True dac în c utare se consider formatul textului. Read-write, Boolean.
• Forward, direc ia c ut rii: True pentru înainte, False pentru înapoi. Read/wtite, Boolean.
• Found este True dac s-a g sit o potrivire. Read, Boolean.
• MatchCase este True pentru o c utare care diferen iaz majusculele de minuscule. Read-write, Boolean.
• MatchWildcards este True dac textul c utat con ine caractere ablon de c utare. Read/write, Boolean.
• ParagraphFormat, returneaz un obiect ParagraphFormat prin care se pot stabili atribute de paragraf c utate.
• Style permite stabilirea stilului c utat (predefinit sau utilizator). Pentru lista constantelor ce denumesc stilurile
predefinite se va vedea Word VB Help – Style Property.
• Text, con ine textul c utat. Read-write, String.
• Wrap precizeaz modul de continuare în cazul atingerii sfâr itului (sau începutului) fi ierului sau neg sirii textului
în domeniul c utat. Poate fi o constant (de tip WdFindWrap): wdFindAsk – consultarea utilizatorului,
wdFindContinue – continuarea în restul documentului, wdFindStop – oprirea la epuizarea domeniului de c utare.
Read/write, Long.

Obiectul Find are dou metode:

o ClearFormatting pentru înl turarea oric rei format ri a textului c utat, necesar pentru a ini ia o nou
c utare de formate;
o Execute pentru a efectua c utarea pe baza atributelor fixate.

ClearFormatting

Anuleaz orice formatare specificat pentru o opera iune de c utare sau înlocuire. Corespunde butonului No Formatting
din dialogul Find and Replace (meniul Edit).

expression.ClearFormatting

unde

expression este o expresie care returneaz un obiect Find sau Replacement.

Execute

Execut opera iunea Find specificat . Returneaz True dac opera iunea de c utare se termin cu succes (este g sit o
potrivire cu textul c utat). Unele dintre argumentele metodei acoper valori ale propriet ilor obiectului Find.

expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms,


Forward, Wrap, Format, ReplaceWith, Replace)

unde

expression este o expresie care returneaz un obiect Find.

FindText este de tip Variant, op ional. Reprezint textul c utat. Pentru c utarea unui format anume se va specifica un ir
vid (""). Se pot utiliza caracterele speciale, similar celor disponibile în c ut rile Word uzuale.

MatchCase este de tip Variant, op ional. True sau False dup cum în c utare are importan capitalizarea caracterelor.
79
MatchWholeWord este de tip Variant, op ional. Este True dac în c utare se vor potrivi doar cuvinte întregi.

MatchWildcards este de tip Variant, op ional. True dac textul c utat utilizeaz abloane de c utare (wildcards).

MatchSoundsLike este de tip Variant, op ional. True dac opera iunea de c utare accept i cuvinte care "sun " la fel cu
textul c utat.

MatchAllWordForms este de tip Variant, op ional. True dac opera iunea de c utare accept ca succes toate formele
textului c utat.

Forward este de tip Variant, op ional. True pentru o c utare înainte (spre sfâr itul documentului).

Wrap este de tip Variant, op ional. Controleaz continuarea opera iunii la epuizarea domeniului cercetat. Valorile posibile
sunt date la proprietatea Wrap: wdFindContinue, wdFindStop sau wdFindAsk.

Format este de tip Variant, op ional. True dac în c utare este specificat o formatare (de caracter sau paragraf).

ReplaceWith este de tip Variant, op ional. Textul înlocuitor. Pentru a specifica un obiect grafic sau nontext, elementul se
trece în Clipboard i se specific "^c" în ReplaceWith.

Replace este de tip Variant, op ional. Specific num rul de înlocuiri. Poate fi o constant (de tip WdReplace):
wdReplaceAll, wdReplaceNone sau wdReplaceOne.

Selection.Find

Returnarea unui obiect Find din obiectul Selection produce schimbarea selec iei la îndeplinirea criteriilor de c utare.
Textul care corespunde propriet ilor c ut rii devine noua selec ie. Urm torul exemplu selecteaz urm toarea apari ie a
cuvântului "Hello", c utarea oprindu-se la atingerea sfâr itului documentului:

With Selection.Find
.Forward = True
.Wrap = wdFindStop
.Text = "Hello"
.Execute
End With

Acela i efect se putea ob ine folosind argumentele metodei Execute:

Selection.Find.Execute FindText:="Hello", Forward:=True, Wrap:=wdFindStop

Range.Find

Utilizarea propriet ii Find a obiectului Range nu produce modificarea selec iei curente, dar obiectul Range respectiv
este redefinit la g sirea textului care îndepline te condi iile:

With ActiveDocument.Content.Find
.Text = "blue"
.Forward = True
.Execute
If .Found = True Then .Parent.Bold = True
End With

80
De remarcat c proprietatea Content returneaz obiectul Range care con ine episodul principal al documentului (textul
principal). Codul din exemplu execut o c utare a primei apari ii a cuvântului "blue" în documentul activ. Dac
opera iunea se termin cu succes, atunci obiectul Range este redefinit la cuvântul g sit, astfel încât prin .Parent se face
referin la obiectul Range redefinit i cuvântul "blue" este trecut în stilul bold. Acela i efect se ob inea prin

Set myRange = ActiveDocument.Content


myRange.Find.Execute FindText:="blue", Forward:=True
If myRamge.Find.Found = True Then myRange.Bold = True

atributele c ut rii fiind definite prin argumentele metodei Execute.

Obiectul Replacement

Referin a la obiectul Replacement se ob ine prin proprietatea Replacement a obiectului Find:

expression.Find.Replacement

Obiectul Replacement reprezint atributele textului nou (înlocuitor) într-o opera iune de c utare cu înlocuire.

Dintre propriet ile obiectului Replacement amintim:

• Font, returneaz un obiect Font prin care se pot stabili atributele caracterelor noului text.
• ParagraphFormat, returneaz un obiect ParagraphFormat prin care se pot stabili atribute de paragraf pentru
noul text.
• Style permite stabilirea stilului pentru textul nou (predefinit sau utilizator). Pentru lista constantelor ce denumesc
stilurile predefinite se va vedea Word VB Help – Style Property.
• Text, con ine textul înlocuitor (nou). Read-write, String.

Obiectul Replacement are doar metoda ClearFormatting, prin care se anuleaz toate atributele de format asociate
noului text. Este util s se aplice metoda înaintea definirii unei noi format ri pentru textul înlocuitor. Sintaxa este similar
metodei de la obiectul Find.

Executarea unei opera iuni de înlocuire necesit , de obicei, precizarea argumentului Replace al metodei Execute (pentru
Find):

With Selection.Find
.ClearFormatting
.Text = "hi"
.Replacement.ClearFormatting
.Replacement.Text = "hello"
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue
End With

execut o c utare a cuvântului "hi", neformatat, i înlocuirea tuturor apari iilor cu cuvântul "hello", de asemenea
neformatat. C utarea i înlocuirea are loc în tot documentul, indiferent de unde se începe. Selec ia se modific la fiecare
întâlnire a cuvântului "hi", deoarece se pleac din obiectul Selection.

With ActiveDocument.Content.Find
.ClearFormatting
.Font.Bold = True
With .Replacement
.ClearFormatting
.Font.Bold = False
81
End With
.Execute FindText:="", ReplaceWith:="", Format:=True, Replace:=wdReplaceAll
End With

În acest exemplu se utilizeaz atât pentru c utare, cât i pentru înlocuire textul vid, ceea ce produce doar o înlocuire a
formatului bold cu formatul normal. Este de remarcat, pentru înlocuirea formatelor, combina ia de valori ale argumentelor
FindText, ReplaceWith, Format. Selec ia nu se modific , deoarece s-a plecat din obiectul Range (returnat de
proprietatea Content).

Obiectele Table, Column, Row i Cell

Prelucrarea tabelelor, un subiect foarte important în procesarea textelor, este posibil programatic prin utilizarea
obiectelor

• Table, care refer un tabel din document,


• Column, care refer o coloan dintr-un tabel,
• Row, care refer o linie dintr-un tabel i
• Cell, care refer o celul dintr-un tabel.

Datorit complexit ii lucrului cu tabele (trasare liber , uniri de celule, diviz ri de celule etc.), metodele i propriet ile
obiectelor amintite pot uneori s se produc rezultate nea teptate (ca i în procesarea uzual din Word) dac nu sunt
în elese exact.

În general obiectele sunt accesate ca elemente din colec iile respective, dar exist i posibilitatea acces rii individuale.

Colec ia Tables

Reprezint mul imea tuturor tabelelor dintr-o selec ie, domeniu sau document. Serve te pentru returnarea unui tabel:

expression.Tables(index)

sau pentru ad ugarea, programatic , a unui nou tabel la colec ie utilizând metoda Add:

expression.Add(Range, NumRows, NumColumns)

unde

expression este o expresie care returneaz un obiect Tables.

Range este obiectul Range care refer domeniul unde se insereaz tabelul în document. Dac domeniul nu este redus la
punctul de inser ie, atunci tabelul ad ugat înlocuie te tot domeniul con inut.

NumRows, de tip Long, este num rul ini ial de linii ale tabelului.

NumColumns, de tip Long, este num rul ini ial de coloane ale tabelului.

Obiectul Table

Este returnat prin num rul de ordine dintr-o colec ie Tables.

82
Propriet ile obiectului se refer la formatarea global a tabelului sau la obiectele componente ale unui tabel. Din prima
categorie fac parte:

o AutoFormatType, de tip Long, read only, este o constant de tip WdTableFormat (vezi intrarea din Help
corespunz toare) care arat dac tabelul este formatat prin AutoFormat. De exemplu,
wdTableFormatNone reprezint un tabel neformatat, pe când wdTableFormatProfessional arat
selectarea formatului automat Professional. Vezi i metoda AutoFormat.
o Shading returneaz un obiect Shading prin care se stabilesc atributele de umbrire.
o Uniform, de tip Boolean, read only, are valoarea True dac toate liniile au acela i num r de coloane.

Accesul la obiectele componente se realizeaz prin propriet ile

o Borders, colec ia de chenare a tabelului,


o Columns, colec ia de coloane,
o Rows, colec ia de linii.

Metodele obiectului Table permit atât opera iuni asupra întregului tabel (autoformat, tergere, selectare, sortare, divizare
etc.), cât i accesul la celulele tabelului. Men ion m:

o Cell(Row,Column) returneaz un obiect Cell care refer celula de pe linia Row i coloana Column din
tabel. Row i Column sunt de tip Long i au valori de la 1 la num rul maxim de linii, respectiv coloane.
o Delete produce eliminarea obiectului, deci tergerea din document a tabelului.
o Select realizeaz selectarea tabelului, astfel încât se poate opera apoi cu proprietatea Selection.
o Sort(ExcludeHeader, FieldNumber, SortFieldType, SortOrder, FieldNumber2, SortFieldType2,
SortOrder2, FieldNumber3, SortFieldType3, SortOrder3, CaseSensitive, LanguageID) produce sortarea
tabelului. Datorit sintaxei complexe, argumentele vor fi studiate în Word VB Help.
o Split(BeforeRow) duce la divizarea tabelului înainte de linia indicat în BeforeRow (de tip Variant, poate
fi un num r de linie sau un obiect Row).

Colec ia Columns

Reprezint colec ia coloanelor unui tabel i este returnat prin proprietatea Columns a unui obiect Table.

Dintre propriet i enumer m

o Borders, returneaz colec ia de chenare,


o Shading, returneaz un obiect Shading prin care se stabilesc atributele de umbrire,
o Width returneaz sau stabile te l imea coloanelor, în puncte. Read/write, de tip Long.
o First returneaz prima coloan din colec ie. Read only.
o Last returneaz ultima coloan din colec ie. Read only.

Metodele permit opera iuni specifice tuturor colec iilor (Count, Add) sau specifice obiectului coloane de tabel:

o Add(BeforeColumn) prin care se adaug o nou coloan în fa a coloanei referite de BeforeColumn (care
este de tip Variant, op ional, returneaz un obiect Column).
o AutoFit care ajusteaz l imea coloanei, dac este posibil, pentru a cuprinde textul interior.
o DistributeWidth care produce o redistribuire a l imilor încât toate coloanele s fie egale.
o SetWidth(ColumnWidth, RulerStyle) care stabile te l imea coloanelor: ColumnWidth, de tip Single, este
l imea în puncte; RulerStyle, de tip Long, controleaz modul în care este ajustata l imea. RulerStyle
poate fi una dintre constantele WdRulerStyle: wdAdjustFirstColumn – modific doar prima coloan ,
wdAdjustNone – nu modific celelalte coloane, wdAdjustProportional – ajusteaz toate coloanele din
dreapta, wdAdjustSameWidth – aceea i l ime tuturor coloanelor specificate. Ultimul argument este mai

83
important pentru stabilirea l imii unor celule sau unei singure coloane (aplicând metoda obiectelor
respective i nu colec iei).

Obiectul Column

Reprezint o singur coloan dintr-un tabel. Este referit ca element al colec iei Columns:

expression.Tables(index tabel).Columns(index)

Dintre propriet ile obiectului men ion m:

o Borders, Shading, Width sunt similare celor enumerate la colec ia Columns.


o Cells returneaz colec ia de celule din coloana referit .
o Index, read only, Long, returneaz num rul de ordine al coloanei în colec ia Columns.
o IsFirst, IsLast sunt True dac este referit prima, respectiv ultima coloan din colec ie.
o Next, Previous returneaz urm torul element, respectiv precedentul element din colec ia Columns.

Metodele obiectului Column sunt

o AutoFit, Delete, Select, SetWidth cu explica ii evidente sau similare metodelor sinonime prezentate
anterior.
o Sort(ExcludeHeader, SortFieldType, SortOrder, CaseSensitive, LanguageID) care ordoneaz celulele
coloanei. Argumentele sunt
o ExcludeHeader, op ional , este True dac se omite din ordonare prima linie.
o SortFieldType, op ional, Variant, arat tipul de sortare – poate fi una dintre constantele WdSortFieldType:
wdSortFieldAlphanumeric (valoarea implicit ), wdSortFieldDate sau wdSortFieldNumeric.
o SortOrder, op ional, Variant, specific ordinea. Poate fi o constant de tip WdSortOrder:
wdSortOrderAscending (implicit ) sau wdSortOrderDescending.
o CaseSensitive, op ional, Variant, este True dac se ia în considerare capitalizarea literelor. Implicit este
False.
o LanguageID, op ional, Variant, specific limbajul de sortare. Poate fi una dintre constantele
WdLanguageID (vezi WdLanguageID Property în Word VB Help).

Colec ia Rows, Obiectul Row

Reprezint colec ia liniilor dintr-un tabel i, respectiv, o linie a tabelului. Utilizarea acestor obiecte este similar oper rii cu
obiectele Columns i Column. Exist o serie de propriet i specifice, linie antet, împ r irea între pagini etc, dar
corespund direct atributelor din Word i au semnifica ii evidente.

Colec ia Cells

Reprezint celulele dintr-o coloan , linie, selec ie sau domeniu.

Pe lâng propriet ile similare celor prezentate la coloane (Borders, Shading, Width, Height etc.) este util proprietatea

o VerticalAlignment care returneaz sau stabile te alinierea vertical a textului în celule. Poate fi o
constant de tip WdVerticalAlignment: wdAlignVerticalBottom, wdAlignVerticalCenter,
wdAlignVerticalJustify sau wdAlignVerticalTop. Read/write Long.

Metodele mai des întrebuin ate sunt

84
o Add(BeforeCell) care adaug o nou celul înaintea celulei referite de BeforeCell (de tip Variant,
op ional , returneaz un obiect Cell).
o Merge care produce fuzionarea tuturor celulelor din colec ie. Rezultatul este o singur celul în tabel.
o Split(NumRows, NumColumns, MergeBeforeSplit) care produce divizarea celuleor din colec ie potrivit
valorilor argumentelor:
o NumRows, NumColumns reprezint num rul liniilor, coloanelor dup divizare. Op ionale, de tip Variant.
o MergeBeforeSplit este de tip Variant, op ional i are valoarea True dac se dore te fuzionarea celulelor
înainte de divizare.
o SetHeight(RowHeight, HeightRule) stabile te în l imea pentru toat linia unei celule implicate.
o RowHeight este Single i d în l imea în puncte.
o HeightRule este Variant, op ional i d regula de ajustare a celorlalte linii; poate fi una dintre constantele
de tip WdRowHeightRule wdRowHeightAtLeast (valoarea implicit ), wdRowHeightAuto sau
wdRowHeightExactly.
o SetWidth(ColumnWidth, RulerStyle), cu explica ia de la Columns.
o DistributeHeight, DistributeWidth care distribuie în l imea, respectiv l imea, în mod egal.

Obiectul Cell

Reprezint o celul dintr-un tabel. Poate fi returnat prin metoda Cell dintr-un obiect Table sau ca element al colec iei
Cells.

Propriet i de identificare sunt cele care returneaz , ca obiecte sau ca index, coloana i linia celulei:

o Column, ColumnIndex returneaz ca obiect sau ca index coloana celulei.


o Row, RowIndex returneaz ca obiect sau ca index linia celulei.

Propriet i navigare în colec ia Cells sunt

o Next, Previous cu semnificatia imediat .

Propriet ile de aspect i dimensiuni sunt cele prezentate la Columns/Column.

Proprietatea care d acces la con inutul celulei i permite deci ad ugarea de text etc. este:

o Range care returneaz un obiect Range.

Metodele aplicabile unui obiect Cell sunt

o AutoSum insereaz un câmp formul care calculeaz suma valorilor din tabel situate deasupra sau la
stânga celulei.
o Delete(ShiftCells) elimin celula referit , ShiftCells arat cum are loc ac iunea. ShiftCells este Variant,
op ional i poate avea o valoare dintre constantele de tip WdDeleteCells: wdDeleteCellsEntireColumn,
wdDeleteCellsEntireRow, wdDeleteCellsShiftLeft sau wdDeleteCellsShiftUp (potrivit op iunilor uzuale de
la operarea în Word).
o Formula(Formula, NumFormat) insereaz în celul o formul specificat i formateaz rezultatul.
Argumentele
o Formula este irul care con ine o formul admis în Word De exemplu "=SUM(ABOVE)". Dac mai sus
sau la stânga celulei sunt valori numerice, formula este op ional i se completeaz potrivit alegerilor
implicite Word.
o NumFormat este de tip Variant, op ional i specific formatul pentru rezultat într-o form admis (vezi
Word VB Help –Numeric Picture (\#) field switch).
o Merge(MergeTo) produce unirea celulei curente cu celula referit , ca obiect, de MergeTo.
o Select produce selectarea celulei, deci se poate apela apoi proprietatea global Selection.

85
o SetHeight, SetWidth stabilesc în l imea i l imea celulei potrivit descrierii de la Cells.
o Split(NumRows, NumColumns) divizeaz celula în num rul indicat de linii i coloane. Valorile
neprecizate sunt considerate 1.

Exemple cu obiecte Table, Column, Row, Cell

Subiectul este foarte amplu i pentru mai multe exemple se vor studia subiectele corespunz toare din Word Visual Basic
Help.

If Selection.Tables.Count >=1 Then


Selection.Tables(1).ConvertToText Separator:=wdSeparateByTabs
End If

converte te în text primul tabel din selec ie, dac selec ia con ine tabele, separând con inutul celulelor de pe o linie prin
caractere tab.

Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=1)


Set myCell = ActiveDocument.Tables(1).Columns(1).Cells(1)

stabilesc referin e la celula din prima linie i prima coloan a primului tabel din documentul activ. Ambele linii se refer la
aceea i celul .

i=1
For Each celula In ActiveDocument.Tables(1).Range.Cells
celula.Range.InsertBefore Text:="Celula " & i
i = i+1
Next celula

produce numerotarea celulelor din primul tabel al documentului. Este de remarcat utilizarea propriet tii Range a obiectului
Table (pentru a returna un obiect Range pentru care se returneaz colec ia Cells), ca i utilizarea propriet ii Range a
obiectului Cell pentru inserarea de text.

ActiveDocument.Tables(1).Columns(1).Select

selecteaz prima coloan a primului tabel.

ActiveDocument.Tables(1).Rows(1).Shading.Texture = wdTexture10Percent

aplic o umbrire de 10% primei linii din tabel.

În continuare sunt prezentate doar unele aspecte, considerate mai des utilizate, ale oper rii cu alte obiecte (decât cele
prezentate în precedentele dou fi iere) din modelul de obiecte al aplica iei Microsoft Word. Pentru informa ii mai ample
se va studia Word VB Help sau alte materiale bibliografice.

Utilizarea Obiectului HeaderFooter

Obiectul HeaderFooter poate s reprezinte fie un antet, fie un picior de pagin . Obiectul HeaderFooter este un membru
al colec iei HeaderFooters, care este accesibil din obiectul Section. Este important de tiut c nu se pot ad uga
elemente la colec ia HeadersFooters. Un document Word poate s aib anteturi/picioare de pagin pentru prima pagin ,
pentru pagini pare i pentru pagini impare i toate acestea sunt reprezentate.

86
Se utilizeaz propriet ile Headers(index) sau Footers(index), ale obiectului Section, pentru a returna un obiect
individual HeaderFooter, unde index este o constant din tipul enumerat WdHeaderFooterIndex:
wdHeaderFooterEvenPages, wdHeaderFooterFirstPage sau wdHeaderFooterPrimary. Este îns evident, dup denumiri,
c Headers se refer la anteturi iar Footers la picioare de pagin .

Urm torul exemplu arat cum se poate modifica prin program un picior de pagin (de pe pagina impar ):

Set oRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range


With oRange
.Delete
.Fields.Add Range:=oRange, Type:=wdFieldFileName, Text:="\p"
.InsertAfter Text:=vbTab
.InsertAfter Text:=vbTab
.Collapse Direction:=wdCollapseStart
.Fields.Add Range:=oRange, Type:=wdFieldAuthor
End With

Se observ definirea unui Range pentru a referi con inutul piciorului de pagin , tergerea vechiului con inut, ad ugarea
unui câmp cu numele fi ierului (în Text se d switch-ul \p de inserare a c ii fisierului), inserarea a dou caractere TAB
(pentru pozi ionarea în dreapta a denumirii fi ierului), comprimarea domeniului la punctul de start i inserarea unui câmp
cu numele autorului (din informa ia adiacent documentului).

Un obiect HeaderFooter poate fi returnat i prin proprietatea HeaderFooter a obiectului Selection, cu men iunea c
selec ia trebuie s fie într-un antet sau picior de pagin . Aceast condi ie se realizeaz , de exemplu, prin utilizarea
propriet ii View, aplicat ferestrei active, care returneaz un obiect View.

Proprietatea Type a obiectului View permite returnarea/stabilirea tipului de viziune (constante WdViewType, read/write,
Long): wdMasterView, wdNormalView, wdOnlineView, wdOutlineView, wdPageView sau wdPrintPreview. În modul page
layout (wdPageView), proprietatea SeekView returneaz sau stabile te care element din document este afi at (constante
WdSeekView, Read/write, Long): wdSeekCurrentPageFooter, wdSeekCurrentPageHeader, wdSeekEndnotes,
wdSeekEvenPagesFooter, wdSeekEvenPagesHeader, wdSeekFirstPageFooter, wdSeekFirstPageHeader,
wdSeekFootnotes, wdSeekMainDocument, wdSeekPrimaryFooter sau wdSeekPrimaryHeader.

Urm torul exemplu insereaz un num r de pagin centrat, în piciorul de pagin al paginii curente:

With ActiveWindow.View
.Type = wdPageView
.SeekView = wdSeekCurrentPageFooter
End With
Selection.HeaderFooter.PageNumbers.Add _
PageNumberAlignment:=wdAlignPageNumberCenter

Exemplul mai arat i modul de inserare a numerelor de pagin : prin proprietatea PageNumbers se returneaz colec ia
câmpurilor cu numerele de pagin incluse în respectivul antet sau picior de pagin . Proprietatea Add a colec iei adaug
un nou câmp num r de pagin (în mod uzual singurul element al colec iei), referit printr-un obiect PageNumber pentru
care se pot stabili o serie de atribute, dup cum altele (reînceperea numerot rii, tipul de numerotare) se stabilesc la nivel
de colec ie.

În sfâr it, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi i picioare de pagin existente,
se stabilesc din propriet ile obiectului PageSetup, care reprezint comanda uzual Page Setup (Word – meniul File).

Se utilizeaz proprietatea DifferentFirstPageHeaderFooter a obiectului PageSetup pentru a specifica o prim pagin


diferit , proprietatea OddAndEvenPagesHeaderFooter pentru anteturi/picioare de pagin diferite pentru pagini

87
pare/impare. Dac proprietatea OddAndEvenPagesHeaderFooter este True, atunci se returneaz antetul/piciorul
paginii impare prin wdHeaderFooterPrimary i antetul/piciorul paginii pare prin wdHeaderFooterEvenPages.

Colec ia Styles

Accesibil din obiectul Document, prin proprietatea Styles, colec ia Styles reprezint toate stilurile din documentul
respectiv. Identificarea unui stil particular se efectueaz uzual prin

expression.Styles(index)

unde

expression returneaz un obiect Document

index este nume de stil (definit de utilizator), constant WdBuiltinStyle (nume de stil predefinit, cum ar fi
wdStyleHeading1) sau num r (indicele în colec ie). Numele trebuie dat exact, cu spa ieri dac a a a fost definit, cu
excep ia capitaliz rii.

Ad ugarea unui nou stil definit de utilizator se realizeaz prin metoda Add, având sintaxa

expression.Add(Name, Type)

unde

expression este o expresie care returneaz un obiect Styles.

Name este String i reprezint numele noului stil.

Type este Variant, op ional i stabile te tipul stilului. Poate fi una dintre constantele WdStyleType:
wdStyleTypeParagraph sau wdStyleTypeCharacter.

Obiectul Style

Reprezint un singur stil predefinit sau definit de utilizator. Obiectul Style include atributele stilului ca propriet i, dintre
care enumer m:

o Font d acces la obiectul Font care permite formatarea caracterelor


o ParagraphFormat d acces c tre formatarea paragrafului
o NextParagraphStyle stabile te stilul pentru urm torul paragraf
o BuiltIn care este True dac stilul este un stil predefinit (built-in).

De exemplu, prin

Set aDoc = ActiveDocument.AttachedTemplate.OpenAsDocument


With aDoc
.Styles(wdStyleHeading1).Font.Name = "Arial"
.Close SaveChanges:=wdSaveChanges
End With

se deschide ablonul ata at documentului activ ca un document Word (singurul mod în care se pot schimba stiluri într-un
template) i se modific proprietatea Font a stilului "Heading 1", dup care se închide template-ul.

88
Colec ia CommandBars

Ansamblul meniurilor i barelor de unelte sunt reprezentate de colec ia CommandBars. Dup cum se tie din operarea
Word, la personalizarea mediului trebuie s se precizeze domeniul de valabilitate al personaliz rilor: ablon, document
etc. În mod analog, înainte de a modifica programatic mediul de utilizare se va apela proprietatea global
CustomizationContext pentru a preciza locul de memorare al modific rilor mediului.

Pentru salvarea modific rilor de comenzi în ablonul Normal se va utiliza

CustomizationContext = NormalTemplate

iar pentru salvarea în ablonul ata at documentului

CustomizationContext = ActiveDocument.AtttachedTemplate

Exemplul urm tor adaug comanda Double Underline la bara de unelte Formatting:

CustomizationContext = NormalTemplate
CommandBars ("Formatting").Controls.Add Type:=msoControlButton, ID:=60, Before:=7

Pentru o discu ie mai ampl se va citi capitolul dedicat meniurilor i barelor de unelte.

Colec ia Dialogs

Dialogurile mediului Word (cum ar fi Open, Save As etc.) sunt activate în Visual Basic prin apelul colec iei Dialogs. La
aceast colec ie nu se pot ad uga alte elemente. Exist totu i posibilitatea, discutat într-un capitol separat, de a proiecta
dialoguri utilizator.

Pentru accesarea unui dialog, se utilizeaz Dialogs(index), unde index este o constant de tip WdWordDialog, care
identific boxa de dialog necesar . Se returneaz astfel un obiect Dialog care poate fi exploatat prin propriet ile i
metodele sale. Exemplul urm tor afi eaz dialogul Open:

dlgAnswer = Dialogs(wdDialogFileOpen).Show

Denumirile sunt construite, în general, prin "wdDialog" & "nume meniu" & "nume comand ", de exemplu wdDialog & File
& PageSetup => wdDialogFilePageSetup. O parcurgere a elementelor tipului enumerat WdWordDialog, prin intermediul
Object Browser-ului, este edificatoare.

Pentru informa ii mai ample se vor studia articolele din Word Visual Basic Help – "Displaying built-in Word dialog boxes",
"Built-in dialog box argument lists".

Dintre propriet ile i metodele unui obiect Dialog men ion m:

o Type, proprietatea care returneaz tipul boxei built-in. Poate fi una dintre constantele WdWordDialog.
Read-only, Long.
o DefaultTab, proprietatea care returneaz sau stabile te fi a activ la afi area dialogului. Poate fi o
constant de tip WdWordDialogTab. Read/write, Long.
o Display, metoda care afi eaz dialogul, f r a transmite ac iunile efectuate de utilizator asupra
dialogului.
o Show, metoda care afi eaz dialogul, ac iunile utilizator fiind transmise sau executate.
o Execute, metoda care aplic configurarea curent a op iunilor dintr-un dialog.

89
Ad ugarea i editarea câmpurilor dintr-un document

Se pot ad uga câmpuri la un document prin aplicarea metodei Add colec iei Fields.

expression.Add(Range, Type, Text, PreserveFormatting)

unde

expression este o expresie care returneaz un obiect Fields.

Range este o expresie care returneaz un Range. Este domeniul unde se adaug câmpul. Dac
domeniul nu este redus la punctul de inser ie, câmpul înlocuie te domeniul.

Type este de tip Variant, op ional. Stabile te câmpul care se insereaz . Poate fi o constant de tip
WdFieldType (vezi Help).

Text este de tip Variant, op ional. Text adi ional necesar specific rii câmpului (de exemplu informa ii de
gen switch).

PreserveFormatting este de tip Variant, op ional. Are valoarea True pentru a p stra formatarea câmpului
i la actualiz ri.

Dintre propriet ile obiectului Field, membru al colec iei Fields, men ion m

o Result, care returneaz un obiect Range reprezentând rezultatul câmpului.


o Code, care returneaz un obiect Range reprezentând codul câmpului.
o Next, care returneaz urm torul câmp în colec ie.
o Previous, care returneaz câmpul precedent din colec ie.

Dintre metode amintim

o DoClick, echivalent cu ac ionarea câmpului de c tre mouse.


o Update, care produce actualizarea rezultatului (recalcularea).

Exemplul urm tor schimb codul primului câmp din selec ie, actualizeaz câmpul i afi eaz rezultatul:

If Selection.Fields.Count >=1 Then


With Selection.Fields(1)
.Code.Text = "CREATEDATE \*MERGEFORMAT"
.Update
MsgBox .Result.Text
End With
End If

Observa ie. Pentru alte obiecte, cum ar fi Shapes, care reprezint obiectele dintr-un strat de desen
(drawing layer), se vor vedea capitolele dedicate obiectelor comune tuturor aplica iilor Office.

Verificarea dac un obiect este valid

În aceast sec iune se discut câteva tehnici pentru verificarea validit ii unei valori returnate de o expresie sau care este
memorat într-o variabil . Aceste verific ri pot elimina erori în execu ia codului proiectat.

90
Se poate utiliza func ia TypeName pentru a determina un tip de obiect. Sintaxa este

TypeName(varname)

unde varname este un Variant care con ine orice variabil cu excep ia variabilelor de un tip definit de utilizator.

În exemplul urm tor se afi eaz un mesaj în bara de stare a aplica iei în cazul c nd Selection.NextField returneaz un
obiect Field (informa ie util în prelucrarea formularelor):

If TypeName(Selection.NextField) = "Field" Then StatusBar = "Mai exist un câmp"

O form echivalent este

Set myField = Selection.NextField


If TypeName(myField) = "Field" Then StatusBar = "Mai exist un câmp"

În cazul când nu s-ar fi returnat un obiect, valoarea func iei era Nothing:

If Not (myField Is Nothing) Then myField.Update

Este disponibil proprietatea global IsObjectValid prin care se determin dac obiectul referit de o variabil este un
obiect valid. Aceast proprietate returneaz False dac obiectul referit a fost ters (nu exist ). Utilizarea este

expression.IsObjectValid(Object)

unde

expression este o expresie care returneaz un obiect Application, op ional .

Object este de tip Object, o variabil care se refer la un obiect.

Exemplul urm tor efectueaz o trecere prin toate paragrafele, le num r i compar cu proprietatea Count (o verificare
de dragul exemplific rii):

Dim i As Integer
i=1
Do While IsObjectValid(ActiveDocument.Paragraphs(i).Next)
i=i+1
Loop
MsgBox Str(i) & " paragrafe = (?) " & Str(ActiveDocument.Paragraphs.Count)

Modificarea comenzilor Word

Majoritatea comenzilor Word pot fi modificate prin transformarea lor în macro-uri.

Pentru afi area listei cu toate comenzile Word disponibile, se urmeaz secven a de comenzi, ini iat din Word:

o Tools
o Macro
o selecteaza Word commands în lista Macro in

91
o în boxa Macro name se afi eaz toate comenzile, denumirile având ca prim aprte numele meniului
utilizat implicit pentru comand (de genul FileOpen).

Se poate înlocui o comand Word printr-un macro, dac se scrie o procedur macro (reamintim c o procedur f r
argumente este recunoscut ca un macro) cu acela i nume ca i comanda. Dac se creeaz o procedur cu numele
FileSave, aceasta este executat de c tre Word atunci când se d comanda Save (meniul File), sau se click-eaz
butonul Save (de pe bara Standard) sau se tasteaz combina ia direct asociat cu FileSave.

Pentru scrierea unei proceduri de acest gen se poate urma

o Tools => Macro => Macros => Word commands în Macro in


o selectarea comenzii care se înlocuie te
o selectarea locului de memorare în boxa Macro in. De exemplu Normal.dot pentru valabilitate general
(ob inerea unui macro global).
o Create

Editorul Visual Basic deschide un modul care con ine un ablon al noii proceduri, cum ar fi

Sub FileSaveHtml()
'
' FileSaveHtml Macro
' Save file as HTML document
'
WordBasic.FileSaveHtml

End Sub

în care se pot completa/ terge orice instruc iuni.

Pentru a reveni la comanda Word ini ial este suficient s se elimine sau s se redenumeasc procedura cu numele
comenzii.

Se poate înlocui, de asemenea, o comand Word dac se creeaz un modul de cod având acela i nume cu comanda
(de exemplu FileSave) i care con ine o procedur denumit "Main".

Lucrul cu evenimente

Un eveniment este o ac iune recunoscut de un obiect i pentru care se poate scrie cod care s se execute, ca r spuns
la producerea evenimentului. Evenimentele pot s se produc atât ca rezultat al ac iunii utilizatorului sau prin program,
cât i prin declan area de c tre sistem.

În Microsoft Word sunt recunoscute mai multe categorii de evenimente: asociate unui document, asociate aplica iei i
asociate controalelor ActiveX.

Evenimente ale obiectului Document

Trei evenimente sunt recunoscute de obiectul Document: Close, New i Open.

o Close se produce atunci când se închide documentul. Dac procedura de r spuns este memorat într-un
template, se execut atât la închiderea oric rui document bazat pe ablon, cât i la închiderea ablonului
dac este deschis pentru editare.

92
o New se produce la crearea unui nou document bazat pe ablon (codul de r spuns este memorat în
ablon, nu în document). O procedur de r spuns la New, memorat în document, nu se va executa
niciodat .
o Open se produce la deschiderea documentului. Vezi i observa ia legat de ablon de la Close.

Procedurile de r spuns la aceste evenimente se scriu în modulul clas intitulat "ThisDocument". Pentru a crea o
procedur se urmeaz etapele:

1. În Project Explorer, sub proiectul Normal sau document, se dublu clickeaz ThisDocument. (În viziunea Folder,
ThisDocument este localizat în folderul Microsoft Word Objects.)
2. În lista Object se selecteaz Document.
3. În lista Procedure se selecteaz evenimentul dorit (Close, New sau Open). Ca rezultat se adaug în modul o
procedur vid , denumit standard.
4. Se completeaz procedura cu instruc iunile necesare scopului urm rit.

Urm torul exemplu maximizeaz fereastra aplica iei Word atunci când documentul este deschis:

Private Sub Document_Open()


Application.WindowState = wdWindowStateMaximize
End Sub

Domeniul de valabilitate (vizibilitate) a unei proceduri eveniment depinde de locul memor rii (de rev zut complet rile date
la enumerarea evenimentelor).

Procedurile eveniment din template-ul Normal nu au un domeniu global. Ele se vor executa doar dac ablonul Normal
este i ablonul ata at documnetului.

Procedurile care exist i în document i în template-ul ata at se vor executa amândou .

Evenimente ale obiectului Application

Evenimentele aplica iei apar atunci când utilizatorul p r se te aplica ia sau atunci când focalizarea este mutat pe alt
document. Totu i, diferit fa de obiectul Document sau de controalele ActiveX, obiectul Application nu recunoa te
evenimentele în mod implicit (nu r spunde în mod standard la producerea lor). Din acest motiv, înainte de a utiliza
evenimentele obiectului Application, se va crea un modul clas nou i se declar un obiect de tip Application cu
evenimente. Se utilizeaz , în acest scop, comanda Class Module din meniul Insert al mediului VBE.

Observa ie. Denumirile utilizate în continuarea acestei sec iuni nu sunt standard, cu excep iile evidente.

Pentru a permite evenimentele obiectului Application, se va ad uga modulului clas definit o declara ie de tipul

Public WithEvents App As Application

Dup ce noul obiect a fost declarat cu evenimente, el apare în lista Object a modulului clas i se pot scrie procedurile
eveniment pentru noul obiect (selectabile din lista Procedure).

Înainte ca procedurile s se execute, trebuie s se conecteze obiectul declarat în modulul clas cu obiectul Application.
Acest lucru se poate efectua din orice modul utilizând, de exemplu, declara ia

Public apl As New EventClass

93
unde EventClass este numele modulului clas creat.

Dup crearea variabilei obiect apl (o instan a clasei EventClass), se poate stabili egalitatea între obiectul App al clasei
EventClass i obiectul Application Word prin

Sub InitializeApp()
Set apl.App = Application
End Sub

Dup executarea procedurii InitializeApp, obiectul App din clasa EventClass puncteaz c tre obiectul Application Word
i procedurile evenimentelor din clas se vor executa la apari ia evenimentelor corespunz toare.

Exist dou evenimente recunoscute de obiectul Application (dup permiterea lor, ca mai sus):

o DocumentChange, care se produce la crearea unui nou document, la deschiderea unui document, sau
la activarea unui alt document (mutarea focaliz rii).
o Quit, care are loc la p r sirea aplica iei Word de c tre utilizator.

Urm torul exemplu asigur c barele de unelte Standard i Formatting sunt vizibile înainte de p r sirea aplica iei (încât
urm toarea activare a aplica iei le afi eaz ):

Private Sub App_Quit ()


CommandBars("Standard").Visible = True
CommandBars("Formatting").Visible = True
End Sub

Evenimentele controalelor ActiveX

Un document Word poate s includ controale ActiveX cum ar fi boxe de control, liste ascunse, butoane de comand .
Pentru a scufunda un asemenea obiect într-un document, cel mai simplu este s se vizualizeze cutia de unelte pentru
controale prin

o ac ionare buton dreapta mouse pe o bar de unelte


o selectare Control Toolbox

sau

o meniul View => Toolbars => selectare Control Toolbox.

Din cutia de controale se apas categoria de controale dorit i la punctul de inser ie se insereaz o instan a obiectului.
Dublu click pe obiectul inserat d acces la rutinele de procesare a evenimentelor asociate controlului. Pentru a vedea
execu ia procedurilor se va ac iona unealta Exit Design Mode din Control Toolbox.

Word implementeaz , pentru controalele ActiveX dintr-un document, evenimentele

o LostFocus, care apare atunci când focalizarea este mutat de la control la alt obiect,
o GotFocus, care apare atunci când focalizarea este mutat pe controlul ActiveX scufundat.

Fiecare control ActiveX recunoa te, totu i, evenimente adi ionale, explicate la obiectele respective. În acest curs mai
multe explica ii i exemple sunt date în capitolul "Controale ActiveX i dialoguri".

Utilizarea macro-urilor automate (Auto Macro)


94
Anumite proceduri macro, identificate prin denumirile speciale recunoscute ca atare de aplica ie, sunt executate în mod
automat la efectuarea unei opera ii specifice. Word recunoa te urm toarele denumiri drept macro-uri automate:

AutoExec care se execut la pornirea aplica iei Word sau se încarc un template global.

AutoNew care se execut la fiecare creare a unui document nou.

AutoOpen care se execut la deschiderea unui document existent.

AutoClose care se execut la închiderea unui document.

AutoExit care se execut la închiderea aplica iei Word sau la desc rcarea unui ablon global.

Macrourile automate sunt recunoscute dac

o Modulul este bnumit cu numele macro-ului i con ine o procedur denumit "Main."
o O procedur , în orice modul, are o denumire rezervat .

Macrourile automate pot fi memorate oriunde, template-ul Normal, alt ablon sau în document, cu excep ia procedurii
AutoExec care nu se execut dac nu este memorat în Normal template sau un template global memorat în folderul
Startup.

În cazuri de conflict de denumiri, se execut macro-ul automat memorat în contextul cel mai apropiat, adic în ordinea:
document…attached template…Normal template.

Observa ie. Ap sarea tastei Shift simultan cu comanda previne executarea unui macro automat. De exemplu, la crearea
unui nou document pe baza unui template care are o procedur AutoNew, ap sarea tastei Shift în momentul ac ion rii
butonului OK din dialogul New, previne executarea macr-ului (tasta trebuie p strat ap sat pân când se afi eaz noul
document).

Într-o procedur care poate declan a un macro automat, prevenirea execu iei se ia prin instruc iunea

WordBasic.DisableAutoMacros

Automatizarea aplica iilor

Pentru a putea schimba date cu alte aplica ii, cum ar fi Excel, Access etc., se utilizeaz tehnica de automatizare a
aplica iilor (cunoscut anterior drept OLE Automation). Automatizarea permite returnarea, editarea i exportul datelor
prin referirea obiectelor, propriet ilor, metodelor altor aplica ii. Obiectele aplica ii referite în alt aplica ie sunt denumite
obiecte de automatizare.

Automatizarea aplica iei Word din alt aplica ie

A. Primul pas pentru a face aplica ia Word disponibil în alt aplica ie, pentru automatizare (deci pentru manevrarea
programatic sau nu a obiectelor Word), este crearea unei referin e la biblioteca de tipuri Word (Word type library):

o Tools (din Visual Basic Editor)


o References
o selectarea boxei de control Microsoft Word 8.0 Object Library.

B. Se declar o variabil obiect care va referi un obiect Application Word, dup exemplul

95
Dim appWD As Word.Application.8

C. Se apeleaz func ia CreateObject (pentru crearea unui obiect de automatizare) sau GetObject (pentru reg sirea unui
obiect de automatizare existent) cu Word OLE Programmatic Identifier (Word.Application.8 sau Word.Document.8), ca în
exemplul urm tor. Pentru a vedea sesiunea Word se utilizeaz proprietatea Visible:

Dim appWD As Word.Application.8


Set appWD = CreateObject("Word.Application.8")
appWD.Visible = True

Func ia CreateObject returneaz un obiect Application Word i-l asigneaz variabilei appWD. Utilizând obiectele,
propriet ile i metodele obiectului Application Word se poate controla aplica ia Word prin intermediul variabilei appWD.
De exemplu, crearea unui nou document

appWD.Documents.Add

D. Func ia CreateObject porne te o sesiune Word pe care automatizarea nu o închide atunci când expir variabila obiect
care se refer la obiectul Application Word. Nici stabilirea referin ei obiectului la Nothing nu produce închiderea
aplica iei Word. Pentru aceasta se va utiliza metoda Quit a aplica iei Word.

Urm torul exemplu, din Microsoft Excel, insereaz datele din celulele A1:B10 din Sheet1 într-un document Word nou i,
în acest document, le aranjeaz într-un tabel. Comentariile incluse explic etapele prelucr rii.

'
'declararea variabilei obiect appWD
'
Dim appWD As Word.Application
Err.Number = 0
On Error GoTo notloaded
'
'ob inerea unui obiect Word Application, dac este pornit o sesiune Word
'
Set appWd = GetObject(, "Word.Application.8")
notloaded:
If Err.Number = 429 Then
'
' se ini iaz o sesiune Word (nu este alt sesiune deschis )
'
Set appWD = CreateObject("Word.Application.8")
theError = Err.Number
End If
'se vizualizeaz sesiunea Word
appWD.Visible = True
With appWD
'crearea unui nou document
Set myDoc = .Documents.Add
With .Selection
'
' transferul datelor din foaia Excel în documentul Word,
' pe dou coloane separate prin TAB
'
For Each c In Worksheets ("Sheet1").Range("A1:B10")
.InsertAfter Text:=c.Value
Count = Count +1

96
If Count Mod 2 = 0 Then
.InsertAfter Text:=vbCr
Else
.InsertAfter Text:=vbTab
End If
Next c
'
' convertirea textului în tabel i autoformatarea tabelului
'
.Range.ConvertToTable Separator:=wdSeparateByTabs
.Tables(1).AutoFormat Format:=wdTableFormatClassic1
End With
'
' salvarea documentului Word
'
myDoc.SaveAs FileName:="C:\Temp.doc"
End With
'
' închiderea sesiunii Word, dac sesiunea este deschis de acest cod
'
If theError = 429 Then appWD.Quit
'
' eliberarea variabilei appWD
'
Set appWD = Nothing

Automatizarea altei aplica ii din Word

Pentru a controla alte aplica ii dintr-un document Word, se va proceda în mod analog automatiz rii aplica iei Word din alte
aplica ii (vezi sec iunea precedent ).

Cele dou exemple, unul referitor la Excel, cel lalt la PowerPoint, devin mai explicite dup revederea exemplului anterior.

Textul selectat în documentul Word activ este trimis c tre o foaie de calcul Excel, în celula A1:

Dim xlObj As Excel.Application.8


If Tasks.Exists("Microsoft Excel") = True Then
Set xlObj = GetObject(, "Excel.Application.8")
Else
Set xlObj = CreateObject(, "Excel.Application.8")
End If
xl.Obj.Visible = True
If xlObj.Workbooks.Count = 0 Then xlObj.Workbooks.Add
xlObj.Worksheets("Sheet1").Range("A1").Value = Selection.Text
Set xlObj = Nothing

Exemplul urm tor creeaz o nuo prezentare PowerPoint, completeaz prima box text cu numele documentului Word
activ i a doua box text cu primul paragraf al documentului. La terminare se elibereaz variabila obiect aplica ie.

Dim pptObj As PowerPoint.Application.8


If Tasks.Exists("Microsoft PowerPoint") = True Then
Set pptObj = GetObject(, "PowerPoint.Application.8")
Else
Set pptObj = CreateObject(, "PowerPoint.Application.8")
97
End If
ppt.Obj.Visible = True
Set pptPres = pptObj.Presentations.Add
Set aSlide =pptPres.Slides.Add(ndex:=1, Layout:=ppLayoutText)
aSlide.Shapes(1).TextFrame.TextRange.Text = ActiveDocument.Name
aSlide.Shapes(2). TextFrame.TextRange.Text = _
ActiveDocument.Paragraphs(1).Range.Text
Set pptObj = Nothing

Comunicarea cu obiectele Word scufundate

Se poate utiliza proprietatea Application a oric rui obiect Word pentru a returna obiectul Word Application. Acest lucru
este util pentru returnarea obiectului Word Application dintr-un document Word scufundat în alt aplica ie.

Urm torul exemplu, executat din Excel, necesit ca Shapes(1) din foaia activ s fie un document Word scufundat
(ob inut prin Insert…Object…). Prin exemplu se modific documentul Word.

Dim appWD As Word.Application


Set embeddedDoc = ActiveSheet.Shapes(1)
Set appWd = embeddedDoc.OLEFormat.Object.Object.Application
appWD.ActiveDocument.Range(Start:=0, End:=0).InsertBefore Text:="Textul nou"

În mod similar, exemplul urm tor, executat din PowerPoint, necesit ca Shapes(1) din primul slide s fie un document
Word embedded:

Dim appWD As Word.Application


Set embeddedDoc = Presentations(1).Slides(1).Shapes(1)
embeddedDoc.OLEFormat.Activate
Set appWD = embeddedDoc.OLEFormat.Object.Application
MsgBox appWd.ActiveDocument.Content.Text

Controale ActiveX i Dialoguri

Proiectele create în Visual Basic for Applications pot fi completate cu o interfa utilizator evoluat , sub forma unor cutii
de dialog la nivelul celor existente deja în Microsoft Office. Performan ele i aspectul dialogurilor utilizator sunt
îmbun t ite prin posibilitatea de plasare a unor controale ActiveX (numite anterior controale OLE).

Un control ActiveX trebuie gândit ca un obiect c ruia i se pot stabili atribute (prin propriet i) i care recunoa te
evenimente (este "viu").

Aceste controale, cu propriet i ajustabile, recunosc multiple evenimente. Astfel, prin scrierea procedurilor eveniment,
interfa a cu utilizatorul proiectului poate fi personalizat i diferen iat corespunz tor.

Controalele ActiveX pot fi plasate i direct în documentele aplica iilor: documente Word, foi de calcul Excel, diapozitive
PowerPoint. Inserarea acestora este facilitat de cutia de unelte Control Toolbox, care poate fi afi at la fel cu orice alt
bar de unelte.

Aplica iile din Office 97 utilizeaz acelea i unelte pentru proiectarea dialogurilor, astfel încât prezentarea care urmeaz
este valabil pentru toate proiectele VBA (din Word, Excel, PowerPoint i, cu unele excep ii, pentru Access).

98
Proiectarea boxelor de dialog utilizator

Crearea unui dialog utilizator (termenul utilizator este ad ugat pentru diferen ierea de dialogurile built-in, încorporate
mediului i se refer la cel care scrie codul i nu la cel care îl va utiliza, confuzia nefiind atât de mare încât s trebuiasc
o denumire special ) necesit parcurgerea mai multor etape:

o crearea unei forme (form sau UserForm), care constituie suportul pe care sunt ad ugate controalele;
o plasarea controalelor pe form ;
o stabilirea propriet ilor pentru controale;
o scrierea procedurilor de r spuns la evenimentele formei i controalelor plasate pe ea.

Atunci când se proiecteaz un dialog, în Visual Basic Editor, suntem în modul de proiectare (design mode). În acest
mod se pot edita controalele i controalele nu reac ioneaz la evenimente. La execu ia boxei de dialog, deci la afi area
dialogului exact cum va fi v zut de un utilizator, suntem în modul de execu ie (run mode). Controalele r spund
evenimentelor în modul execu ie.

Crearea unui nou dialog

Orice box de dialog utilizator din proiect este o form (sau UserForm). O UserForm nou con ine o bar de titlu i o zon
goal în care se pot plasa controale.

o Din meniul Insert, în Visual Basic Editor, se alege UserForm.

Este afi at o form nou ale c rei propriet i se stabilesc în fereastra Properties (vezi figurile ata ate, în figura cu forma
sunt plasate i dou controale).

Propriet ile formei sunt clasificate în categoriile:

o aparen (Appearence);
o comportare (Behaviour);
o font (Font);
o Diverse (Misc);
o imagine (Picture);
o pozi ie (Position);
o defilare (Scrolling).

dup cum se vizualizeaz alegând fi a Categorized din fereastra Properties.

Propriet ile de aparen se refer la culorile utilizate, la efectele vizuale de umplere etc.

Propriet ile de comportare descriu modul de continuare a ac iunilor la p r sirea ultimului control
de pe form (Cycle) sau accesul utilizatorului la obiect (Enabled).

Prin Font se specific fontul utilizat implicit pe form (poate fi modificat pentru fiecare control în parte).

În Misc se g sesc propriet ile care stabilesc numele formei, memoria utilizat la afi are, imaginea mouse-ului etc.

În Picture se dau specifica iile imaginii utilizate pentru pavarea formei.

În Position sunt specifica iile de pozi ie i dimensiuni.

În Scrolling se fixeaz vizibilitatea i pozi ia barelor de defilare.


99
Concomitent cu afi area formei, în Design Mode, devine vizibil i cutia cu controale, Toolbox, (vezi figura).

Pentru a ad uga un control pe form , se trage controlul dorit pe form i se ajusteaz dimensiunile
în mod uzual, sau se click-eaz controlul dorit, cursorul devine cursor cruce i se întinde pe form
cu dimensiunile dorite.

Opera iunea de dragare din cutie pe form poate fi efectuat i în sens invers: tragerea unui
control, sau a unui grup de controale, de pe form în cutie de unelte creeaz un template care
poate fi reutilizat.

Dup ad ugarea controalelor pe form , se utilizeaz comenzile din meniul Format sau butoanele
de pe bara de unelte UserForm din VBE pentru a ajusta alinierea i spa ierea controalelor. Se utilizeaz dialogul Tab
Order (din meniul View) pentru a modifica ordinea de parcurgere a controalelor la tast ri succesive de Tab (în execu ie –
run time).

VBE stabile te proprietatea TabIndex a controloalelor pentru a determina ordinea la Tab-uri.. Dac se dore te ca
utilizatorul s nu aib acces prin Tab la un control, se va stabili proprietatea TabStop la False. Pentru aceasta, se
ac ioneaz butonul drept al mouse-ului pe control i selectarea comenzii Properties din meniul contextual.

Scrierea procedurilor de r spuns la evenimente

Fiecare form sau control recunoa te un set predefinit de controale, care pot fi declan ate fie de utilizator, fie de sistem.
De exemplu, un buton de comand recunoa te evenimentul Click declan at de ac ionarea cu mouse-ul, iar forma
recunoa te evenimentul Initialize care apare atunci când este ini ializat .

Pentru a scrie o procedur eveniment, se deschide fereastra Code prin dublu click pe UserForm sau pe controlul
respectiv, selectarea numelui evenimentului în boxa Procedure a ferestrei Code. Procedurile eveniment au denumiri
create într-un mod standard: numele formei sau controlului, liniu a de subliniere i numele evenimentului, de exemplu
Command1_Click, UserForm_Deactivate etc.

Evenimentele recunoscute de un obiect sunt listate în boxa Procedure a ferestrei Code asociate, cele care au deja
ata ate proceduri fiind scrise în bold.

La scrierea codului de r spuns la evenimente, controalele sunt numite cu denumirile existente la acel moment. Cum
aceste denumiri pot fi modificate oricând în dezvoltarea proiectului, procedurile eveniment ata ate nu se redenumesc în
mod automat. Se recomand astfel ca denumirile s fie acordate înainte de scrierea procedurilor respective, în caz
contrar orice modificare a numelor trebuie s fie înso it de modific rile denumirilor procedurilor.

Controale

În aceast sec iune se explic , pe scurt, principalele controale disponibile în proiectarea dialogurilor.

Label Control

Un control Label este utilizat pentru afi area unui text, descriptiv, cum ar fi titluri, capt ri, instruc iuni de ajutor. Textul
afi at nu este i nu poate fi legat de surse de date.

Proprietatea implicit este Caption, reprezentând textul afi at.

Evenimentul implicit este Click, declan at la ac ionarea butonului stâng mouse pe control.

100
TextBox Control

Afi eaz informa ie scris de utilizator sau primit dintr-o mul ime organizat de date.

Dac TextBox este legat de o surs de date, atunci modificarea informa iei afi ate produce i modificarea informa iei din
sursa de date (de exemplu un câmp dintr-o tabel). Informa ia afi at poate fi formatat doar unitar (acela i font, acela i
stil).

Proprietatea implicit este Value, reprezentând con inutul boxei.

Evenimentul implicit este Change, declan at la modificarea propriet ii Value.

ListBox Control

Afi eaz o list de valori i permite selectarea unei sau mai multor intr ri din list .

Într-o ListBox cu o singur coloan se poate ad uga o intrare prin metoda AddItem.

Dac ListBox este legat de o surs de date, atunci este memorat valoarea selectat în surs .

Controlul ListBox poate s apar ca o list ori ca un grup de controale OptionButton sau CheckBox. Pentru aceast
din ultim op iune se va stabili proprietatea ListStyle la Option; proprietatea MultiSelect va determina atunci intr rile:
Single – butoane radio, Multi sau Extended – boxe de control.

Proprietatea implicit este Value, reprezentând valoarea selectat curent (din coloana dat de proprietatea
BoundColumn).

Evenimentul implicit este Click.

ComboBox Control

Combin posibilit ile de la ListBox i TextBox: utilizatorul poate introduce o valoare nou (ca la TextBox), sau poate
selecta o valoare dintr-o list (ca la ListBox). Grafic, un control ComboBox arat ca o list ascuns (doar o linie este
afi at ).

Dac se leag controlul la o surs de date (celule dintr-o foaie de calcul) va fi afi at valoarea selectat în surs . Pentru
un control cu mai multe coloane, proprietatea BoundColumn determin unde se afi eaz sursa de date.

Proprietatea implicit este Value, reprezentând valoarea selectat .

Evenimentul implicit este Change.

CheckBox Control

Afi eaz starea selectat / neselectat a unui element. Este utilizat pentru alegeri între dou alternative (Yes/No, True/False
sau On/Off.).

Selectarea este afi at prin prezen a unui X în caseta corespunz toare i starea curent este Da, Adev rat, Prezent etc.
Neselectarea este ar tat printr-o caset vid i indic starea Nu, Fals, Absent etc. În func ie de valoarea propriet ii
TripleState, controlul poate s aib i valoarea Null.

101
La legarea de o surs de date, schimbarea st rii se reflect în modificarea valorii sursei. Un CheckBox suspendat
(disabled) afi eaz starea dar nu poate fi modificat.

Proprietatea implicit este Value, , adic Null – starea null (nici selectat nici deselectat), (–1) – True (selectat), 0 – False
(deselectat).

Evenimentul implicit este Click.

OptionButton Control

Permite afi area elementului selectat dintr-un grup de op iuni. Controlul este cunoscut i ca
buton radio (ap sarea unui buton de selectare a unei game de lungimi de und le
deselecteaz pe celelalte). Este de observat c butoanele de op iune dintr-un frame sunt
mutual exclusive. Figura este capturat din modul Design.

Dac un OptionButton este legat la o surs de date, controlul poate s arate valori Yes/No,
True/False sau On/Off, coresponden ele între valori i starea controlului fiind evidente. Schimbarea st rii butonului
modific i sursa.

Un control inhibat este desenat ters i nu arat nici o valoare. În func ie de proprietatea TripleState, controlul poate
avea i valoarea Null.

ToggleButton Control

Arat starea de selectare a unui element (similar unui checkbox) prin imaginea grafic a unui buton
ap sat sau nu.

Dac un control ToggleButton este legat de o surs de date, controlul arat valoarea curent a sursei ca Yers/No,
True/False, On/Off sau ceva similar. Butonul ap sat reprezint Yes, True sau On. Dac ToggleButton este legat de o
surs de date, schombarea st rii controlului se reflect i în valoarea sursei.

Un control ToggleButton inhibat (disabled) este desenat neclar, arat totu i valoarea dar nu poate fi modificat.

Proprietatea implicit este Value, adic Null – starea null (nici selectat nici deselectat), (–1) – True (selectat), 0 – False
(deselectat).

Evenimentul implicit este Click.

CommandButton Control

Este utilizat pentru indicarea începerii, termin rii sau întreruperii unei ac iuni. Este reprezentat grafic precum butoanele
uzuale OK, Cancel etc. din dialogurile aplica iilor din Office ( i nu numai).

În general, pentru realizarea scopului este utilizat procedura (sau macro) asociat evenimentului Click. Pe un
CommandButton se poate afi a text (proprietatea Caption), imagine (proprietatea Picture) sau ambele.

Proprietatea implicit este Value, întotdeauna False. Stabilind proprietatea Value drept True (într-o procedur ), ini iaz
evenimentul Click al butonului de comand .

Evenimentul implicit este Click.

102
TabStrip Control

Este utilizat, de obicei, pentru prezentarea unor seturi de informa ii (ca valori ale unor controale
grafice), fiecare grup de informa ii apar inând altei entit i. Prin urmare structura informa iei
afi ate este întotdeauna aceea i, dar se refer la entit i diferite (persoane, fapte etc.).

Din punct de vedere grafic, se poate confunda acest control cu MultiPage, diferen a fiind
aceea c la TabStrip zona de afi are (client region) este comun tuturor fi elor (doar informa ia se modific ), pe când la
MultiPage fiecare fi (pagin ) are o zon proprie, cu controale proprii.

Se poate spune c dac se p streaz structura informa iei, atunci se va utiliza un control TabStrip, un tab definind
purt torul informa iilor. Dac informa ia este structurat în categorii, atunci se poate utiliza controlul MultiPage, fiecare
categorie având propria zon client.

Observa ie. TabStrip este implementat ca un container a unei colec ii Tabs de obiecte Tab.

Proprietatea implicit pentru TabStrip este SelectedItem, care returneaz obiectul Tab selectat i este folosit la
controlarea programatic a obiectului.

Evenimentul implicit este Change, declan at la selectarea altui Tab.

MultiPage Control

Prezint mai multe pagini de informa ii distincte. Spre deosebire de controlul TabStrip, selectarea
altei pagini poate prezenta o alt structur de informa ii.

În acest mod se pot afi a seturi consistente (categorii) de informa ii, p strând în acela i timp
unitatea întregii înregistr rii.

Observa ie. MultiPage este implementat ca un container a unei colec ii Pages de obiecte Page.

Proprietatea implicit este Value, care returneaz indexul paginii avtive curente (în colec ia Pages).

Evenimentul implicit este Change, declan at la schimbarea paginii.

Frame Control

Reprezentat grafic ca un chenar cu o denumire, controlul serve te la gruparea unor controale. Grupul poate fi unit doar
prin categoria de informa ii, permi ând utilizatorului o identificare rapid a controalelor, dar, pentru anumite controale cum
ar fi OptionButton, gruparea are efect i în comportarea controalelor din grup. Exemplul de la OptionButton arat un
Frame care include butoane radio: acestea sunt mutual exclusive. Exemplul de la ToggleButton arat un Frame similar,
dar butoanele pot fi ac ionate în orice configura ie.

Evenimentul implicit este Click.

Image Control

Permite afi area unui imagini (poze) pe o form , ca element al datelor reprezentate pe form i nu ca un simplu element
decorativ. De exemplu fotografia unui angajat în forma cu informa iile personale ale angajatului. Cu alte cuvinte, nu se
controleaz aspectul grafic al imaginii, ci modul cum ea apare în control (de unde, cât de mare etc.).

103
Controlul permite t ierea (retezarea) imaginii, dimensionare, m riri, dar nu permite editarea propriu-zis (care va fi
efectuat printr-un program de grafic ).

Dac se d controlului o dimensiune egal cu cea a formei, atunci Image poate furniza un fundal pe care se pot pozi iona
alte controale.

Sunt suportate formatele .bmp, .cur, .gif, .ico, .jpg, .wmf de fi iere grafice.

Evenimentul implicit este Click.

Utilizarea dialogurilor utilizator

Pentru a schimba informa ii cu utilizatorul proiectului printr-o cutie de dialog utilizator, trebuie ca

o dialogul s fie afi at,


o s se accepte ac iunile utilizatorului asupra controalelor din dialog i, la închiderea dialogului,
o s se dispun de informa ia introdus de utilizator (pentru a fi procesat , pentru a controla ac iunile
ulterioare etc.).

Afi area unui dialog

Afi area unui dialog pentru testare, deci în Design Mode, se realizeaz prin comanda Run Sub/UserForm (meniul Run
din VBE). Afi area dialogului în mod programatic se realizeaz utilizând metoda Show dup modelul

[object.]Show

dac object nu este specificat, atunci se va considera implicit dialogul asociat modulului activ UserForm.

Dac obiectul specificat nu este înc rcat la apelarea metodei, atunci VB îl încarc automat. O cutie de dialog utilizator
este întotdeauna modal , deci utilizatorul trebuie s r spund (chiar dac prin închidere) înainte de a utiliza altceva din
aplica ie. Nu se execut alte instruc iuni pân când dialogul nu este ascuns sau închis (desc rcat – unloaded). Este
posibil totu i s se lucreze în alte aplica ii.

Ob inerea i stabilirea propriet ilor în execu ie

Pentru modific ri ale propriet ilor unui control este necesar ca valorile acestora s fie citite i redefinite în timpul
execu iei (Run time sau Run Mode).

Asemenea ac iuni sunt, de exemplu, utile atunci când pentru un control se dau valori implicite (default), deci valori cu care
dialogul s se afi eze indiferent de ac iunile de la alte afi ri anterioare. În acest caz, se va ad uga codul corespunz tor
în procedura de eveniment Initialize a dialogului. Afi area formei declan eaz evenimentul Initialize i astfel au loc i
atribuirile de valori specificate.

Exemplul urm tor presupune existen a unei forme UserForm, denumit frmPhoneOrders, care are

o un control TextBox, denumit txtCustomerName,


o un control ListBox, denumit lstRegions,
o un control CheckBox, denumit chkSendExpress.

Codul urm tor realizeaz ini ializarea valorilor de pe form , încât orice ar tare a formei se realizeaz în aceea i
configura ie:

104
Private Sub UserForm_Initialize()
With frmPhoneOrders
.txtCustomerName.Text = "Mamma S.R.L." 'se ini ializeaz TextBox
.chkSendExpress.Value = True 'se ini ializeaz CheckBox
With .lstRegions
.AddItem "Iasi" 'se ini ializeaz ListBox
.AddItem "Suceava"
.AddItem "Botosani"
.ListIndex = 2 'se selecteaz ultima intrare
End With
End With
End Sub

Este de remarcat c de i în modelele de obiecte Word, Excel i PowerPoint colec iile sunt indexate de la 1, în tablourile i
colec iile asociate formelor se folose te indexarea de la 0. De aici selectarea ultimei intr ri (cu num rul de ordine 3) din
list prin instruc iunea ListIndex = 2.

Dac se dore te stabilirea valorilor ini iale pentru un control, dar apelurile ulterioare s re in modific rile efectuate, se vor
da aceste valori înainte afi rii dialogului. Urm torul exemplu arat o procedur care afi eaz forma dup atribuirea
valorilor implicite.

Private Sub GetUserName( )


With UserForm1
.lstRegions.AddItem "North"
.lstRegions.AddItem "South"
.lstRegions.AddItem "East"
.lstRegions.AddItem "West"
.txtSalesPersonID.Text = "0000"
.Show
End With
End Sub

Prin setarea propriet ilor unui control i aplicarea metodelor în timpul execu iei, se pot efectua modific ri într-un dialog
utilizator care se execut , modific ri ap rute ca r spuns la ac iunile i alegerile utilizatorului. De exemplu, accesibilitatea
unor controale poate fi controlat prin modificarea propriet ii Enabled. Dac proprietatea este setat pe False, atunci
utilizatorul nu poate accesa controlul: cum ar fi interzicerea accesului la butonul OK pân când o anumit informa ie nu
este completat în dialog.

Exemplul urm tor arat cum accesul la un grup de butoane radio nu este permis decât dac o CheckBox este marcat :

Private Sub CheckBox1_Change()


With Me ' Me se refer la forma curent
If .CheckBox1.Value = True Then
.OptionButton1.Enabled = False
.OptionButton2.Enabled = False
.OptionButton3.Enabled = False
Else
.OptionButton1.Enabled = True
.OptionButton2.Enabled = True
.OptionButton3.Enabled = True
End If
End With
End Sub

105
Prin intermediul metodei SetFocus se controleaz focalizarea. Un control care are focusul este cel care r spunde la
intr rile din tastatur . De exemplu

Private Sub Image1_Click ()


Me.CheckBox1.SetFocus
End Sub

realizeaz trecerea focusului la CheckBox1 atunci când imaginea din controlul Image1 (unde este scris procedura
eveniment) este click-at .

În timpul execu iei se pot manevra i propriet ile/metodele formei. În acest mod se modific dinamic aspectul formei.

Astfel, o utilizare frecvent este aceea când se modific por iunea afi at a formei, vizualizând (deci dând acces)
controale suplimentare, sau ascunzându-le (nu mai pot fi accesate, de i nu sunt inhibate). În acest scop se opereaz cu
proprietatea Height.

Presupunem c o form , cu un buton radio, este dimensionat în proiectare cu Height = 120 i se adaug un control, de
exemplu un CheckBox, la baza formei, controlul fiind pozi ionat prin proprietatea Top setat la mai mult de 120 (deci în
afara zonei afi ate din form ). Se adaug urm toarele proceduri eveniment:

Private Sub UserForm_Initialize ()


Me.Height = 120 'Orice afi are a formei readuce în l imea la 120
End Sub

Private Sub OptionButton1_Click ()

With Me
.Height = 300 – .Height
'Modificarea butonului radio basculeaz între cele dou dimensiuni ale formei
End With
End Sub

Pentru ca exemplul s func ioneze corect se presupune c forma extins la 180 afi eaz i boxa de control.

În exemplul urm tor se arat cum putem parcurge informa ii printr-un obiect TabStrip. Valoarea afi at într-o box text
este modificat dup indexul tab-ului selectat:

Private Sub TabStrip1_Click (ByVal Index As Long)


If Index = 0 Then
Me.TextBox1.Text = "7710 Park Lane"
ElseIf Index = 1 Then
Me.TextBox1.Text = "5520 5th Avenue"
End If
End Sub

De amintit c numerotarea începe de la 0 într-o colec ie de pe o form .

Validarea informa iilor introduse de un utilizator este un alt subiect important în procesarea unui dialog. Pentru efectuarea
verific rilor c utilizatorul a introdus tipul corect de informa ii printr-un control, se va testa valoarea atunci când controlul
pierde focusul sau când întregul dialog este închis. Evenimentele Enter i Exit pot fi utilizate în acest scop.

106
Enter apare imediat înainte ca un control s primeasc efectiv focusul de la alt control de pe aceea i form . Exit apare
imediat înainte ca un control s piard focusul în favoarea altui control de pe aceea i form . Sintaxa procedurilor
eveniment respective este

Private Sub object_Enter( )

Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean)

unde

object este un nume valid de control care recunoa te evenimentul

Cancel este starea evenimentului: False arat procesarea evenimentului de c tre control (op iunea implicit ); True arat
c evenimentul este tratat de aplica ie i focusul r mâne pe controlul curent.

Deoarece evenimentul Enter se declan eaz înainte ca focusul s fie dat unui control, poate fi utilizat pentru afi area
unui text explicativ, de procesare a respectivului obiect.

În scrierea procedurii pentru Exit nu trebuie uitat atribuirea valorii True argumentului pentru ca focusul s r mân pe
controlul curent.

De studiat i metoda SetFocus prin care un anumit control de pe form prime te focusul.

Urm torul exemplu previne utilizatorul s p r seasc o zon text în care trebuie s introduc neap rat o valoare
numeric :

Private Sub txtCustAge_Exit (ByVal Cancel As MsForms.ReturnBoolean)


If Not IsNumeric(txtCustAge.Text) Then
MsgBox "Vârsta trebuie s fie numeric "
Cancel = True
End If
End Sub

Pentru verificarea datelor înainte de închiderea dialogului, se include codul corespunz tor (prin care se pot verifica
valorile mai multor controale de pe form ) în aceea i procedur care descarc (închide) dialogul. Dac exist erori de
completare se va p r si procedura, prin Exit Sub, înainte de executarea instruc iunii Unload i se va da focusul primului
control eronat.

Exemplul urm tor se execut la ac ionarea butonului de comand , denumit cmdOK, i previne p r sirea dialogului prin
ac ionarea acestui buton dac boxa text txtCustAge nu este numeric :

Private Sub cmdOK_Click ()


If Not IsNumeric (txtCustAge.Text) Then
MsgBox "Vârsta trebuie s fie numeric "
txtCustAge.SetFocus 'Controlul reprime te focusul
Exit Sub 'Se p r se te procedura
End If
custAge = txtCustAge.Text 'Se salveaz valoarea controlului
Unload Me 'Se descarc forma
End Sub

Este de men ionat c pentru trecerea valorii în alt modul de cod, variabila custAge trebuie calificat , de exemplu
ThisDocument.custAge.
107
La închiderea unui dialog, toate datele introduse de utilizator se pierd. Returnarea valorilor controalelor dintr-o form
dup ce forma a fost desc rcat conduce la valorile implicite în locul celor introduse/selectate de utilizator. Din acest
motiv, informa ia necesar trebuie s fie salvat în variabile de la nivelul modul, înaintea desc rc rii formei. Exemplul
precedent utilizeaz în acest scop variabila custAge, care trebuie s fie declarat la nivel de modul prin

Public custAge As Integer

de exemplu.

Cutiile de dialog utilizator sunt afi ate întotdeauna drept modale. Prin urmare utilizatorul trebuie s închid dialogul
înainte de a se întoarce în aplica ia principal .

Închiderea (desc rcarea) formei se realizeaz prin instruc iunea Unload. În mod uzual se va include în form cel pu in un
buton de comand prin ac ionarea c ruia se închide forma.

Exemplul urm tor insereaz în documentul Word textul introdus de utilizator în boxa txtUserName i închide forma, la
ac ionarea butonului de comand denumit cmdOK:

Private Sub cmdOK_Click ()


ActiveDocument.Content.InsertAfter txtUserName.Text
Unload UserForm1
End Sub

Pentru a utiliza aceea i box de dialog în mai multe aplica ii (Word, Excel, PowerPoint accept acelea i dialoguri). Dac
dialogul con ine totu i referiri la obiecte specifice unei aplica ii, atunci utilizarea în alt aplica ie nu este lipsit de erori.

Pentru reutilizarea dialogurilor proiectate se export ca un fi ier .frm care poate fi importat în alte aplica ii:

• În VBE unde s-a proiectat forma, right-click pe UserForm din Project Explorer, click Export File.
• Se alege un nume i Save. Se ob ine un fi ier nume.frm.
• În VBE unde se dore te reutilizarea formei, right-click pe proiectul respectiv din Project Explorer, click pe Import
File.
• Selectarea numelui formei i Open.

Utilizarea controalelor în documente Word, foi de calcul Excel sau diapozitive PowerPoint

În acela i mod în care controalele se adaug unei forme, acestea pot fi ad ugate unui document, foi de calcul sau slide
pentru a le transforma în obiecte interactive. De exemplu, se pot ad uga boxe text, list , butoane radio etc. unui
document, pentru a-l transforma într-un formular online. Se pot ad uga butoane de comand pe o foaie de calcul pentru
a executa proceduri macro uzuale etc.

De i modul de operare este foarte asem n tor, exist deosebiri precum

o ad ugarea controalelor se realizeaz cu ajutorul cutiei de unelte Control Toolbox ( i nu Toolbox ca în


VBE). Afi area acestei cutii se realizeaz din View - Toolbars - Control Toolbox.
o bascularea între Design mode i Run mode se efectueaz în Word sau Excel prin ac ionarea
butoanelor Exit Design Mode i Design Mode de pe bara Visual Basic. În PowerPoint se trece în Slide
Show pentru a fi în Run Mode i se revine într-o viziune de editare pentru Design Mode.
o un control poate avea mul imi diferite de evenimente într-un document, foaie sau slide în raport cu
acela i control de pe o form . De exemplu, un buton de comand dintr-o form are evenimentul Exit, în
timp ce un buton de comand dintr-un document nu recunoa te acest eveniment.

108
Controale ActiveX în documente Word

La ad ugarea i operarea cu controale într-un document Word sunt importante urm toarele idei:

• Controalele ActiveX se pot ad uga fie stratului (layer-ului) de text fie stratului de desen. Pentru plasarea
controlului în text, se va ac iona simultan tasta SHIFT i click-ul pe controlul din Control Toolbox. În acest caz,
controlul se va insera ca un caracter, pentru un aspect bun trebuie s se lucreze la atributele liniei i paragrafului.
Pentru plasarea unui control în layer-ul de desen se ac ioneaz unealta din Control Toolbox f r a ac iona i
tasta SHIFT. În acest caz, controlul este similar unui obiect Picture din documentul Word.
• Un control ad ugat pe stratul text este un obiect InlineShapes la care se ob ine acces programatic prin colec ia
InlineShapes. Un control ad ugat pe stratul de desen este un obiect Shape la care se ajunge programatic prin
colec ia Shapes.
• Controalele din stratul text sunt tratate precum caracterele i sunt pozi ionate în linia de text, se mut o dat cu
textul sau cu inserarea de caractere etc.
• Controalele din Control Toolbox nu pot fi aduse prin dragare în document. La click pe un control, acesta este
inserat la punctul de inser ie (pe stratul text) sau într-o pozi ie bazat pe aceasta (pe startul de desen). Inserarea
consecutiv a mai multor obiecte în aceea i pozi ie pe stratul de desen poate s produc o stiv din care vedem
doar ultimul control plasat, de aici controalele trebuiesc duse în locuri distincte din document.
• În Design Mode, controalele ActiveX sunt vizibile doar în viziunile Page Layout sau Online Layout.
• Controalele ActiveX din stratul de desen sunt întotdeauna în Run Mode în viziunile Page Layout sau Online
Layout.
• Dac se inten ioneaz ca utilizatorul s fie capabil s se mute între controalele unui formular online prin
ac ionarea tastei TAB, controalele se vor plasa pe stratul text i se va proteja forma prin click pe butonul Protect
Form de pe bara de unelte Forms.
• Dac , la crearea unui formular online, se dore te ad ugarea de câmpuri de formular în locul controalelor ActiveX,
se va utiliza bara de unelte Forms.

Controale ActiveX în foi de calcul Excel

Se pot ad uga controale, la caiete sau foi de calcul, lâng datele pe care le controleaz , astfel încât operarea în foaia de
calcul s se efectueze cât mai cursiv i mai pe în eles.

Urm toarele afirma ii puncteaz principalele aspecte ale plas rii controalelor ActiveX pe o foaie de calcul Excel.

• În plus fa de propriet ile standard ale controalelor, se pot utiliza pentru controalele dintr-o foaie Excel
propriet ile: BottomRightCell, LinkedCell, ListFillRange, Placement, PrintObject, TopLeftCell i ZOrder. La
aceste propriet i se ajunge în mod uzual. Urm torul exemplu arat cum se poate realiza, prin program, o defilare
a ferestrei active pân când controlul CommandButton1 ajunge în col ul din stânga sus:

Set t = Sheet1.CommandButton1.TopLeftCell
With ActiveWindow
.ScrollRow = t.Row
.ScrollColumn = t.Column
End With

• Anumite metode i propriet i din Microsoft Excel Visual Basic sunt inhibate atunci când un control ActiveX este
activat. De exemplu, metoda Sort nu poate fi utilizat când un control este activ. În acest caz se va activa în
prealabil un alt element de pe foaie, dup modelul:

Private Sub CommandButton1_Click


Range("a1").Activate
Range("a1:a10").Sort Key1:=Range("a1")
CommandButton1.Activate
109
End Sub

Se observ revenirea la activarea butonului de comand dup ce s-a efectuat sortarea.

• Controalele dintr-un workbook Excel scufundat într-un document al altei aplica ii nu vor func iona dac utilizatorul
va utiliza dublu click pentru editarea caietului. Controalele vor func iona dac utilizatorul va deschide caietul prin
right-click i Open din meniul direct.
• La salvarea unui workbook Excel 97 în format Microsoft Excel 5.0/95, toat informa ia asociat cu controalele
ActiveX se pierde.
• Cuvântul cheie Me dintr-o procedur eveniment a unui control ActiveX de pe o foaie de calcul se refer la foaia
de calcul i nu la control.

Controale ActiveX în diapozitive PowerPoint

Ad ugarea controalelor ActiveX la diapozitive PowerPoint pot produce un schimb de informa ii cu utilizatorul, de exemplu
personaliz ri ale prezent rii dup op iunile privitorului.

Principalele aspecte care trebuie urm rite sunt:

• Un control de pe un slide este întotdeauna în Design Mode, cu excep ia viziunii Slide Show.
• Pentru ca un control particular s apar pe toate diapozitivele, se va plasa pe Slide Master.
• Cuvântul cheie Me dintr-o procedur eveniment a unui control dintr-un slide, se refer la slide. Dac evenimentul
este a unui control de pe master, atunci Me se refer la master i nu la slide-ul afi at în momentul când s-a
declan at evenimentul.
• Scrierea codului eveniment pentru slide-uri este similar scrierii de cod pentru controalele de pe o form .
Exemplul urm tor stabile te culoarea de fundal a diapozitivului pe care se g se te butonul de comand :

Private Sub cmdChangeColor_Click()


With Me
.FollowMasterBackground = Not .FollowMasterBackground
.Background.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass
End With
End Sub

• Se pot dota diapozitivele cu unelte de naviga ie. Dac acestea sunt pozi ionate din Master, vor fi disponibile pe
toate diapozitivele. De exemplu, ad ugând la Slide Master dou butoane denumite, respectiv, cmdBack i
cmdForward, i scriind procedurile de eveniment urm toare, demonstra ia poate fi condus ac ionând
respectivele butoane.

Private Sub cmdBack_Click ()


Me.Parent.SlideShowWindow.View.Previous
End Sub
Sub cmdForward_Click ()
Me.Parent.SlideShowWindow.View.Next
End Sub

• Pentru a lucra cu toate controalele ActiveX de pe un slide anume f r a afecta celelalte forme desenate (Shapes)
de pe slide, se poate construi o colec ie ShapeRange care con ine doar controalele. Se pot aplica apoi metode i
propriet i întregii colec ii sau parcurge, în mod uzual, colec ia pentru a procesa fiecare control în parte. Exemplul
urm tor aliniaz controalele de pe primul diapozitiv din prezentarea activ i le aranjeaz vertical.

With ActivePresentation.Slides(1).Shapes
numShapes = Count
110
If numShapes > 1 Then
numControls = 0
ReDim ctrlArray(1 To numShapes)
For i = 1 To numShapes
If .Item(i).Type = msoOLEControlObject Then
numControls = numControls + 1
ctrlArray(numControls) = .Item(i).Name
End If
Next
If numControls > 1 Then
ReDim Preserve ctrlArray(1 To numControls)
Set ctrlRange = .Range(ctrlArray)
ctrlRange.Distribute msoDistributeVertically, True
ctrlRange.Align msoAlignLefts, True
End If
End If
End With

Lucrul, prin program, cu controale din documentele aplica iilor

Accesul programatic la un control se poate ob ine prin numele controlului sau prin intermediul colec iei c reia îi apar ine.
Denumirea unui obiect este cea specificat drept valoare a propriet ii (Name) în fereastra Properties a controlului.

Urm toarele exemple prezint principalele ac iuni care implic controale i documente.

Stabilirea titlului (caption) unui control:

CommandButton1.Caption = "Run"

Dac numele controlului se utilizeaz în afara modulului clas asociat documentului, foii de calcul sau diapozitivului care
con ine controlul, atunci numele controlului trebuie calificat cu numele documentului respectiv:

Sheet1.CommandButton1.Caption = "Run"

Se poate accesa un control ActiveX i prin colec ia Shapes, OLEObjects sau InlineShapes, dup caz.

o Controalele ad ugate la stratul de desen al unui document, foaie sau slide sunt con inute în obiectele
Shape i pot fi gestionate programatic prin intermediul colec iei Shapes.
o În Excel, controalele ActiveX sunt con inute de asemenea în obiectele OLEObject i pot fi programate
prin colec ia OLEObjects.
o În Word, controalele ActiveX ad ugate în stratul text sunt con inute în obiectele InlineShape i pot fi
controlate prin colec ia InlineShapes.

Pentru accesul prin intermediul colec iilor, se utilizeaz numele obiectului Shape care con ine un control particular i nu
numele din cod al controlului. În Excel i PowerPoint, numele obiectului care con ine un control este numele de cod
implicit al controlului (cum ar fi CommandButton1). În Word, numele obiectului (de forma implicit Control 1) care con ine
un control nu este legat de numele de cod al controlului. Pentru a schimba numele de cod al unui control se selecteaz
controlul i se schimb valoarea propriet ii (Name). Pentru a schimba numele unui obiect Shape, OLEObject sau altui
obiect care con ine un control se va schimba valoarea propriet ii Name.

o Ad ugarea unui buton de comand la prima foaie de calcul:

Worksheets(1).OLEObjects.Add "Forms.CommandButton.1" _
111
Left:=10, Top:=10, Height:=20, Width:=100

o Instruc iunea urm toare stabile te proprietatea Left a controlului:

Worksheets(1).OLEObjects("CommandButton1").Left = 10

o Urm torul exemplu stabile te titlul obiectului:

Worksheets(1).OLEObjects("CommandButton1").Object.Caption = "Run"

o Ad ugarea unei boxe de control la documentul activ, pe stratul text:

ActiveDocument.InlineShapes.AddOLEControl ClassType:="Forms.CheckBox.1"

o Stabilirea unor atribute ale controalelor dintr-un document Word:

ActiveDocument.InlineShapes(1).Width = 200
ActiveDocument.InlineShapes(1).OLEFormat.Object.Value = True

o Ad ugarea unui control ComboBox la stratul de desen:

ActiveDocument.Shapes.AddOLEControl ClassType:="Forms.ComboBox.1"

o Fixarea unor propriet i ale unui ComboBox de pe stratul de desen

ActiveDocument.Shapes("Control 1").Left = 100


ActiveDocument.Shapes("Control 1").OLEFormat.Object.Text = "Reed"

o Ad ugarea i modificarea unui buton de comand la un diapozitiv:

ActivePresentation.Slides(1).Shapes.AddOLEObject Left:=100, Top:=100, _


Width:=150, Height:=50, ClassName:="Forms.CommandButton.1"
ActivePresentation.Slides(1).Shapes("CommandButton1").Left = 100
ActivePresentation.Slides(1).Shapes("CommandButton1") _
.OLEFormat.Object.Caption = "Run"

Obiectele Microsoft Excel

Visual Basic suport un set de obiecte care corespund direct elementelor din Microsoft Excel, cele mai multe identificabile
dup denumirea uzual din mediul Excel. Astfel, obiectul Workbook reprezint un caiet, obiectul Worksheet reprezint o
foaie de calcul iar obiectul Range reprezint un domeniu de celule dintr-o foaie de calcul. Fiecare element din Microsoft
Excel – caiet, foaie, diagram , celul etc. – poate fi reprezentat printr-un obiect în Visual Basic. Prin scrierea unor
proceduri, care controleaz aceste obiecte, se pot automatiza opera iile efectuate în Excel.

Pentru a vedea modelul de obiecte pentru Microsoft Excel, se va c uta "Microsoft Excel Objects" în Help. Pentru a vedea
fi ierele de Help necesare se va urma calea: Visual Basic Editor — Help — Contents and Index — (Contents tab) —
Microsoft Excel Visual Basic Reference — Shortcut to Microsoft Excel Visual Basic Reference. Fi ierele sunt
disponibile dac la instalarea aplica iei s-a marcat boxa Online Help for Visual Basic.

Dintre cele peste 100 de obiecte care alc tuiesc ierarhia de obiecte Excel, vom prezenta în acest capitol doar pe cele mai
importante. Prezentarea este simplificat i din cauz c prezentarea obiectelor Word a conturat problematica modelelor
de obiecte Office i a fixat anumite reguli de operare cu aceste obiecte.
112
Obiectul Application

Cele mai multe propriet i ale obiectului Application Excel controleaz atributele de vizualizare ale ferestrei aplica iei sau
comporatrea global a aplica iei. De exemplu, valoarea propriet ii DisplayFormulaBar este True dac bara de formule
este vizibil , iar valoarea propriet ii ScreenUpdating este False dac actualizarea ecranului este inhibat .

În plus, propriet ile obiectului Application ofer acces la obiectele situate mai jos în ierarhie de obiecte (constituie ceea
ce s-a numit accesori). Astfel, proprietatea Windows d acces la colec ia Windows (reprezentând toate ferestrele
deschise în aplica ie), proprietatea Workbooks d colec ia Workbooks a tutror caietelor deschise etc. Din aceast
categorie enumer m:

o Charts, colec ia tuturor foilor de tip chart,


o Dialogs, colec ia tuturor dialogurilor predefinite în mediul Excel,
o Names, colec ia tutror numelor create în caietul activ,
o RecentFiles, colec ia fi ierelor utilizate recent (dup lista din meniul File),
o Sheets, colec ia tutror foilor deschise în caietul activ,
o Windows,
o Workbooks,
o Worksheets, colec ia tuturor foilor de calcul din caietul activ.

Returnarea unui obiect particular din colec ie se efectueaz dup procedurile generale, explicate în capitolele
introductive.

În categoria accesorilor mai pot fi încadrate propriet ile care returneaz un obiect Range: ActiveCell, Cells, Rows,
Columns, Selection (dac este selectat un domeniu de celule).

Propriet ile ActiveWorkbook, ActiveSheet, ActiveChart i ActiveWindow returneaz obiectele care reprezint
elementele active corespunz toare din Excel.

Anumite metode i propriet i care se aplic obiectului Application se aplic i unor obiecte situate mai jos în ierarhie.
Utilizarea acestor propriet i i metode la nivelul Application vor modifica toate caietele, foile deschise. De exemplu,
metoda Calculate aplicat la nivelul Application produce recalcularea tuturor foilor, din toate caietele, pe când utilizat la
nivel de Workbook sau de Worksheet produce recalcularea doar a foilor locale.

Obiectul Workbook

Dup cum se tie, similarul unui document din Word este în Excel caietul (workbook). Deschiderea sau închiderea unui
fi ier în Excel implic deci deschiderea sau închiderea unui caiet. In Visual Basic, metodele utilizate la lucrul cu fi iere
sunt metode ale obiectului Workbook sau ale colec iei Workbooks.

Deschiderea unui Workbook

Pentru a deschide un caiet se utilizeaz metoda Open. Metoda este aplicat întotdeauna colec iei Workbooks, returnat
prin proprietatea global cu aceea i denumire. Exemplul urm tor deschide caietul "Book1.xls" din folderul curent i
afi eaz apoi valoarea din prima celul a primei foi:

Sub OpenBook1()
Set myBook = Workbooks.Open(Filename:="Book1.xls")
MsgBox myBook.Worksheets(1).Range("A1").Value
End Sub

Este de remarcat c obiectul Workbook returnat de metod se refer la caietul deschis, care r mâne activ.

113
Asupra utiliz rii utiliz rii sau nu a c ii pe care se g se te fi ierul se vor reciti cele spuse la deschiderea documentelor
Word.

Exist dou foldere remarcabile pentru care se poate ob ine în mod automat calea: folderul cu fi ierele Excel executabile
i folderul Library (creat automat la instalarea aplica iei). Ob inerea acestor c i se realizeaz prin propriet ile Path i
LibraryPath ale obiectului Application). Astfel

EXEPath = Application.Path & Application.PathSeparator


LibPath = Application.LibraryPath & Application.PathSeparator

returneaz , respectiv, calea c tre fi ierele executabile Excel i calea c tre fi ierele de bibliotec . O cale returnat se
termin cu separatorul adecvat sistemului pe care se execut aplica ia, astfel încât codul este independent de platform
Windows sau Macintosh). Instruc iunile

fName = LibPath & "Book1.xls"


Set myBook = Workbooks.Open(Filename:=fName)

considerate împreun cu atribuirea variabilei LibPath de mai sus, realizeaz deschiderea fi ierului Book1.xls din folderul
Library.

Se poate l sa utilizatorului op iunea de a decide aupra numelui fi ierului care se deschide. Acest lucru se poate realiza
prin metoda GetOpenFilename a obiectului Application. Metoda afi eaz cutia de dialog standard Open, dar, în loc s
deschid fi ierul selectat, returneaz un ir cu numele complet calificat al fi ierului. Urm torul exemplu demonstreaz
metoda:

Sub DemoGEtOpenFilename()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
MsgBox "Opening " & fName
Set myBook = Workbook.Open (Filename:=fName)
End Sub

Metoda GetOpenFilename

Afi eaz dialogul Open i returneaz numele de fi ier selectat f r a deschide efectiv fi ierul.

expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

unde

expression este o expresie care returneaz un obiect Application.

FileFilter este de tip Variant, op ional. Este un ir specificând criteriile de filtrare a fi ierelor listate în dialog. irul const în
perechi formate din irul de filtrare i din specificarea filtrului în format MS-DOS, toate elementele fiind separate prin
virgule. În partea rezervat , dou filtre MS-DOS sunt separate prin ";". Exemple: "Text Files (*.txt),*.txt,Add-In Files
(*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se consider "All Files (*.*),*.*".

FilterIndex este de tip Variant, op ional. Specific indexul criteriului de filtrare implicit. de la 1 la num rul de filtre specificat
în FileFilter. Implicit se consider 1.

Title este de tip Variant, op ional. Specific titlul boxei de dialog. Implicit este "Open".

114
ButtonText este specific pentru Macintosh.

MultiSelect este de tip Variant, op ional. Este True atunci când se pot selecta mai multe nume de fi iere, False dac este
permis selectarea unui singur fi ier. Implicit este False. În cazul selec iei multiple se va returna un tablou de denumiri
(chiar dac este selectat un singur fi ier).

Metoda returneaz numele fi ierului selectat sau numele introdus de utilizator. În cazul când utilizatorul anuleaz boxa
(prin Cancel), se returneaz False. Metoda poate schimba atât folderul curent cât i unitatea.

Crearea i salvarea unui Workbook

Se creeaz un nou caiet prin aplicarea metodei Add la colec ia Workbooks. Valoarea returnat se va atribui (prin Set)
unei variabile obiect pentru a putea referi noul caiet în program. Noul workbook devine activ.

Metoda Add (colec ia Workbooks)

Returneaz un obiect Workbook. Sintaxa

expression.Add(Template)

unde

expression este o expresie care returneaz un obiect Workbooks. (Metoda se poate aplica, cu parametri specifici, tuturor
colec iilor.)

Template este de tip Variant, op ional. Determin modul de creare a noului caiet. Dac argumentul este un ir cu numele
(posibil cu cale) unui fi ier Excel, noul caiet este deschis dup modelul fi ierului specificat. Argumentul poate fi o
constant (de tipul enumerat XlWBATemplate), caz în care se va crea un caiet cu o singur foaie de tipul determinat de
constant . Valorile posibile sunt: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet sau
xlWBATWorksheet. Dac argumentul este omis, atunci se creeaz un caiet cu un num r de foi egal cu proprietatea
SheetsInNewWorkbook a obiectului Application).

Salvarea unui caiet se efectueaz prin metoda SaveAs (la prima salvare) sau prin metoda Save. Exist , similar metodei
GetOpenFilename, metoda GetSaveAsFilename (pentru Application).

Metoda SaveAs

are sintaxa

expression.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup,


AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout)

unde

expression returneaz un obiect Workbook.

Filename, op ional, Variant. Con ine numele noului fi ier, poate include o cale.

FileFormat, op ional, Variant. Specific formatul de fi ier utilizat la salvare. Lista formatelor admise (cele care se pot
selecta i la salvarea din Excel) se g se te în Help la proprietatea FileFormat.

115
Password, op ional, Variant. Un ir unde capitalizarea este considerat (cel mult 15 caractere) care con ine parola de
protejare a fis ierului.

WriteResPassword, op ional, Variant. Un ir care con ine parola necesar pentru scrierea fi ierului. Dac la deschidere
nu se d parola exact , fi ierul este deschis doar în citire.

ReadOnlyRecommended, op ional, Variant. Este True pentru a afi a, la deschidere, un mesaj cu recomandarea de a
deschide fi ierul doar în citire.

CreateBackup, op ional, Variant. Este True dac se creeaz o copie backup.

AccessMode, op ional, Variant. Con ine modul de acces la workbook. Poate fi una dintre constantele (din tipul
XlSaveAsAccessMode): xlShared (shared list), xlExclusive (exclusive mode) sau xlNoChange (nu se modific modul de
acces). Ultima valoare este cea implicit . Argumentul este ignorat dac se salveaz xlShared f r a schimba numele
fi ierului. Pentru schimbarea modului de acces se utilizeaz metoda ExclusiveAccess.

ConflictResolution, op ional, Variant. Specific modul de rezolvare a conflictelor de schimbare în cazul când fi ierul este
shared. Poate fi una dintre constantele (de tip XlSaveConflictResolution): xlUserResolution (afi eaz un dialog privind
conflictul i rezolvarea)), xlLocalSessionChanges (accept automat modific rile locale) sau xlOtherSessionChanges
(accept celelalte schimb ri în locul modific rilor locale). Prima constant este valoarea implicit .

AddToMru, op ional, Variant. Este True dac se adaug numele fi ierului la lista fi ierelor utilizate recent. Implicit este
False.

TextCodePage, TextVisualLayout, op ionale, Variant. Neutilizate în versiunea U.S. English.

Metoda Save

Salveaz modific rile caietului specificat.

expression.Save

unde

expression returneaz un obiect Workbook.

Pentru marcarea unui fi ier drept salvat f r a-l scrie efectiv pe disc, se va atribui valoarea True propriet ii Saved.

Metoda GetSaveAsFilename

Similar metodei GetOpenFilename, aceast metod afi eaz dialogul standard Save As, returneaz un nume de fi ier,
dar nu salveaz nici un fi ier.

expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

unde

expression este o expresie care returneaz un obiect Application.

InitialFilename, op ional, Variant. Specific numele de fi ier propus. Dac acest nume este omis, atunci se va utiliza
numele caietului activ.

116
FileFilter, op ional, Variant. irul care specific criteriul de filtrare. Pentru structura irului se va revedea metoda
GetOpenFilename de la deschiderea documentelor.

FilterIndex, op ional, Variant. Este indicele criteriului de filtrare, de la 1 la num rul de filtre dat la FileFilter. Implicit este 1.

Title, op ional, Variant. Titlul boxei de dialog.

ButtonText este specific Macintosh.

Metoda returneaz numele de fi ier selectat sau cel introdus de utilizator. Numele returnat poate include i calea. Metoda
returneaz False dac dialogul este închis de utilizator prin Cancel. Metoda poate schimba folderul sau unitatea curent .

Urm torul exemplu creaz un nou caiet i-l salveaz prin metoda GetSaveAsFilename:

Sub CreateAndSave()
Set newBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
newBook.SaveAs Filename:=fName
End Sub

Închiderea unui Workbook

Pentru a închide un workbook, se va aplica metoda Close a obiectului Workbook. Închiderea poate avea loc cu sau f r
salvarea modific rilor.

Metoda Close

Produce închiderea obiectului. Aplicat colec iei Workbooks are sintaxa

expression.Close

unde

expression returneaz un obiect Workbooks. Dac exist modific ri ale caietelor, se va afi a dialogul de interogare
asupra eventualei salv ri.

Aplicat obiectelor Window i Workbook metoda are sintaxa

expression.Close(SaveChanges, FileName, RouteWorkbook)

unde

expression este o expresie care returneaz un obiect Workbook sau Window.

SaveChanges este op ional, Variant. Dac nu exist modific ri, argumentul este ignorat. Dac exist modific ri în caiet
dar caietul mai apare i în alt fereastr deschis , atunci argumentul este de asemenea ignorat. Dac exist modific ri i
caietul nu mai apare în alt fereastr , atunci salvarea se efectueaz dup valorile: True – salvarea modific rilor sub
numele dat la FileName sau dialog Save As; False – nu se salveaz modific rile; argument omis – interogare utilizator.

117
FileName este op ional, Variant. Salveaz modific rile sub acest nume.

RouteWorkbook este op ional, Variant. Dac nu este indicat nici o rutare (nu exist nici un RoutingSlip ata at),
argumentul este ignorat. Altfel, Excel efectueaz rutarea documentului dup valorile acestui argument: True – trimite
caietul la urm torul recipient; False – caietul nu este transmis mai departe; omis – interogarea utilizatorului asupra
trimiterii.

Închiderea unui workbook din Visual Basic nu execut macrourile Auto_Close din workbook. Se va utiliza metoda
RunAutoMacros pentru executarea macrourilor automate de închidere. Aceste macrouri sunt men inute în Excel din
motive de compatibilitate, deci se refer la foi automatizate în versiuni Excel mai vechi.

Exemplul urm tor arat deschiderea unui caiet, modific ri temporare ale caietului i închiderea f r salvarea modific rilor:

Sub OpenChangeClose()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
Set myBook = Workbooks.Open (Filename:=fName)
' Aici se modific foile de calcul
myBook.Close SaveChanges:=False
End Sub

Obiectul Range

Prin intermediul unui obiect Range se poate referi o singur celul , un domeniu de celule, o întreag linie sau coloan , o
selec ie cu arii multiple sau un domeniu 3-D. Din acest motiv obiectul Range este oarecum neuzual prin aceea c poate
reprezenta atât o singur celul cât i o mul ime de celule. Nu exist un obiect colec ie pentru Range, as c un obiect
Range poate fi gândit fie ca un obiect, fie ca o colec ie, dup situa ie.

Exist foarte multe propriet i i metode care returneaz un obiect Range:

ActiveCell DirectDependents RowFields

BottomRightCell DirectPrecedents RowRange

Cells EntireColumn Rows

ChangingCells EntireRow Selection

CircularReference Next TableRange1

Columns Offset TableRange2

CurrentArray PageRange TopLeftCell

CurrentRegion Precedents UsedRange

Dependents Range VisibleRange

Pentru specificarea exact a acestor propriet i i metode se vor c uta subiectele respective în Help.

În continuare sunt men ionate, mai mult prin exemple, moduri de lucru cu obiecte Range.

118
Referin e de tip A1 sau nume de domeniu

Unul dintre modurile uzuale de returnare a unui obiect Range este acela al utiliz rii unei referin e de tip A1 sau al unui
nume definit.

• inserarea unei valori într-o celul :

Worksheets("Sheet1").Range("A1").Value = 3

• inserarea unei formule într-o celul :

Range("B1").Formula = "=5–10*RAND()"

• inserarea aceleea i valori într-un întreg domeniu de celule:

Range("C1:E3").Value = 6

• tergerea con inutului unor celule:

Range("A1","E3").ClearContents

• Stabilirea stilului bold pentru un domeniu numit (la nivel de workbook):

Range("myRange").Font.Bold = True

• Atribuirea aceleea i valori fiec rei celule dintr-un domeniu numit (la nivel de foaie):

Range("Sheet1!yourRange").Value = 3

• Setarea unei variabile obiect la un domeniu:

Set objRange = Range("myRange")

Este de men ionat c expresiile care nu sunt calificate se refer la foaia curent , deci multe din exemplele de mai sus nu
ar opera dac foaia curent este o foaie de tip chart.

O cauz frecvent de erori este utilizarea propriet ii Range ca argument al altei metode f r calificarea complet a
obiectului Worksheet c ruia i se aplic Range. Exemplul urm tor

Sub SortRange()
Worksheets("Sheet1").Range("A1:B10").Sort _
Key1:=Range("A1"), Order1:=xlDescending
End Sub

nu va func iona corect decât dac Sheet1 este foaia activ , altminteri calificarea argumentului Key1 nu este complet .
Pentru o execu ie independent de context ar trebui folosit

Key1:=Worksheets("Sheet1").Range("A1")

Utilizarea indicilor de linii i coloane

119
O celul specific poate fi returnat utilizând indicii numerici de linie i coloan pentru celula referit .

• Pentru a da o valoare celulei A1 se poate utiliza:

Worksheets("Sheet1").Cells(1,1).Value = 3

• Pentru a insera o formul în celula B1 din foaia activ :

Cells(1,2).Formula = "=5–10*RAND()"

• Pentru a fixa o variabil obiect la domeniul format din celula A1

Set objRange = Worksheets("Sheet1").Cells(1,1)

Referin ele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instruc iuni de ciclare. Exemplul urm tor
anuleaz toate celulele din domeniul A1:D10, cu o valoare mai mic decât 0.01:

Sub RoundToZero()
For rwIndex = 1 to 10
For colIndex = 1 to 4
If Worksheets("Sheet1").Cells(rwIndex,colIndex) < 0.01 Then
Worksheets("Sheet1").Cells(rwIndex,colIndex).Value = 0
End If
Next colIndez
Next rwIndex
End Sub

În exemplul urm tor se arat o solu ie la listarea, într-o foaie separat , a tuturor denumirilor create în caietul activ i a
domeniilor referite de acestea.

Sub ListNames()
Set newSheet = Worksheets.Add
I=1
For Each nm in ActiveWorkbook.Names
NewSheet.Cells(i,1).Value = nm.Name
NewSheet.Cells(i,2).Value = "' " & nm.RefersTo
Next nm
NewSheet.Columns("A:B").AutoFit
End Sub

Utilizarea propriet ii Offset

Atunci când este necesar referirea la un domeniu prin deplas ri relative la alt domeniu de celule, se poate utiliza
proprietatea Offset, a obiectului Range, care în argumentele RowOffset i ColumnOffset arat deplasarea fa de
obiectul Range curent. Este returnat un nou obiect Range.

Exemplul urm tor determin câteva tipuri de date din celulele domeniului A1:A10, tipurile determinate fiind înscrise, ca
text, în celula corespunz toare din dreapta, B1:B10.

Sub ScanColumn ()
For Each c In Worksheets("Sheet1").Range("A1:A10").Cells
If Application.IsText(c.Value) Then

120
c.Offset(0,1).Value = "Text"
ElseIf Application.IsNumber (c.Value) Then
c.Offset(0,1).Value = "Number"
ElseIf Application.IsLogical (c.Value) Then
c.Offset(0,1).Value = "Boolean"
ElseIf Application.IsError (c.Value) Then
c.Offset(0,1).Value = "Error"
ElseIf c.Value = "" Then
c.Offset(0,1).Value = "(blank cell)"
End If
Next c
End Sub

Utilizarea propriet ilor CurrentRegion i UsedRange

Aceste dou propriet i, explicate în continuare, sunt utile atunci când nu se tie de la început cât de mare este domeniul
pe care se opereaz .

Prin regiunea curent se în elege un domeniu dreptunghiular de celule, limitat de linii i coloane goale, eventual de
marginile foii de calcul i de linii i coloane goale. Proprietatea CurrentRegion se aplic unui obiect Range i pot fi mai
multe regiuni curente pe o foaie de calcul, dup obiectul Range c ruia i se aplic proprietatea. Proprietatea returneaz
un obiect Range, reflectând extensia, în sensul prezentat mai sus, al obiectului Range c ruia i se aplic proprietatea.

Domeniul utilizat este determinat de celule nevide situate cel mai la stânga sus i cel mai la dreapta jos într-o foaie de
calcul. Un asemenea domeniu con ine toate celule nevide din foaie, ca i celule vide interpuse pân la completarea unui
domeniu dreptunghiular i este unic pe o foaie de calcul. Este natural ca proprietatea UsedRange s se aplice obiectului
Worksheet i nu unui obiect Range. Proprietatea returneaz un obiect Range.

Urm torul exemplu aplic celulelor cu valori numerice dintr-o list , care începe în celula A1, formatul numeric 0.0:

Sub FormatRange ()
Set myRange = Worksheets("Sheet1").Range("A1").CurrentRegion
MyRange.NumberFormat = "0.0"
End Sub

Exemplul care urmeaz presupune c foaia activ con ine date dintr-un experiment desf urat în timp: prima coloan
con ine datele calendaristice, a doua coloan con ine ora înregistr rii valorilor, coloanele a treia i a patra con in
m sur torile experimentului. Procedura prezentat combin primele dou coloane într-o singur valoare de tip Date,
converte te valoarea ob inut din GMT (Greenwich Mean Time) în PST (Pacific Standard Time) i le formateaz .
Deoarece nu se tie dac exist i coloane goale între cele patru coloane cu date, se utilizeaz UsedRange.

Sub ConvertDates ()
Set myRange = ActiveSheet.UsedRange
myRange.Columns("C").Insert
Set dateCol = myRange.Columns("C")
For Each c In dateCol.Cells
If c.Offset(0,-1).Value <>"" Then
c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)"
End If
Next c
dateCol.NumberFormat = "mmm-dd-yyyy hh:mm"
dateCol.Copy
dateCol.PasteSpecial Paste:=xlValues
myRange.Columns("A:B").Delete
121
dateCol.AutoFit
End Sub

Exist i alte propriet i i metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range. Printre
acestea enumer m: Areas, Cells, Columns, EntireColumn, EntireRow, Range i Rows.

Parcurgerea unui domeniu de celule

Dintre multiplele moduri de parcurgere a celulelor dintr-un domeniu, se prezint parcurgerile prin instruc iunile For Each
… Next i Do … Loop, unele fiind deja utilizate în exemplele anterioare.

Utilizarea instruc iunii For Each … Next

Acesta este modul recomandat de parcurgere a elementelor unei colec ii.

Un exemplu anterior devine

Sub RoundToZero ()
For Each r In Worksheets(Sheets1").Range("A1:D10").Cells
If Abs(r.Value) < 0.01 Then
r.Value = 0
End If
Next r
End Sub

Pentru ca opera iunea anterioar s aib loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox,
specificându-i utilizatorului s selecteze un domeniu de celule. Metoda returneaz un obiect Range care reprezint
selec ia. Codul este completat cu instruc iuni de tratare a erorilor uzuale.

Sub RoundToZero ()
Worksheets("Sheet1").Activate
On Error GoTo PressedCancel
Set r = Application.InputBox( _
Prompt:="Select a range of cells", _
Type:=8)
On Error GoTo 0
For Each c In r.Cells
If Abs(c.Value) < 0.01 Then
c.Value = 0
End If
Next c
Exit Sub

PressedCancel:
Resume
End Sub

Dac nu se dore te selectarea de c tre utilizator a domeniului procesat, se poate utiliza proprietatea CurrentRegion sau
proprietatea UsedRegion pentru a returna obiectul Range prelucrat. De exemplu, dac se tie c domeniul începe cu
celula A1 i nu include linii sau coloane vide, atunci se poate utiliza

Set r = Worksheets("Sheet1").Range("A1").CurrentRegion

122
pentru a returna întregul domeniu (compact) de celule care se prelucreaz .

Urm toarele dou exemple arat cum se poate ascunde fiecare a doua coloan din domeniul utilizat în Sheet1. Primul
exemplu, utilizând For Each…Next

Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For Each col In r.Columns
If col.Column Mod 2 = 0 Then
col.Hidden = True
End If
Next col
End Sub

Al doilea exemplu, utilizând For…Next:

Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For i = 1 To r.Columns.Count
If i Mod 2 = 0 Then
r.Columns(i).Hidden = True
End If
Next i
End Sub

Utilizarea instruc iunii Do…Loop

Atunci când procesarea unui domeniu modific domeniul (de exemplu prin tergerea unor linii/coloane), utilizarea
instruc iunii For Each…Next nu produce cele mai bune rezultate. Solu ia este atunci utilizarea instruc iunii Do…Loop.
Exemplul urm tor sorteaz o list i elimin liniile elementelor duplicate:

Sub RemoveDuplicates ()
Worksheets("Sheet1").Range("A1").Sort _
Key1:=Worksheets("Sheet1").Range("A1")
Set currentCell = Worksheets("Sheet1").Range("A1")
Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1,0)
If nextCell.Value = currentCell.Value Then
currentCell.EntireRow.Delete
End If
Set currentCell = nextCell
Loop
End Sub

Este de notat c structura repetitiv poate fi înlocuit prin

Do While currentCell.Value <> ""


' instruc iunile de eliminare a liniilor cheilor duplicate
Loop

Utilizarea propriet ii Address

123
Aplicarea propriet ii Address returneaz adresa de celule a domeniului, adresa fiind sub forma de ir de caractere.
Aceast utilizare este util , în general, pentru verificare i depanarea codului. Exemplul urm tor arat o form de
completare a unei proceduri anterioare cu instruc iuni de control a mersului programului

Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
MsgBox r.Address ' doar pentru depanare
For i = 1 To r.Columns.Count
If i Mod 2 = 0 Then
r.Columns(i).Hidden = True
MsgBox r.Columns(i).Address ' doar pentru depanare
End If
Next i
End Sub

Acela i efect se poate ob ine prin stabilirea unor expresii de urm rire (watch expressions) de forma r.Address i
r.Columns(i).Address, valorile respective pot fi examinate în fereastra Immediate. Pentru o discu ie mai pe larg se va
studia capitolul dedicat depan rii i manevr rii erorilor.

Evenimentele din Excel 97

O bun parte din codul scris într-o aplica ie este con inut în proceduri de r spuns la evenimente. Cunoa terea
evenimentelor i alegerea unor r spunsuri adecvate produc o aplica ie senzitiv , vie, care interac ioneaz bine cu
utilizatorul.

În Microsoft Excel 97 se pot scrie proceduri eveniment la nivelurile: worksheet, chart, workbook i application. În plus fa
de versiuni anterioare, sunt posibile i proceduri eveniment cu argumente.

Procedurile de r spuns la evenimente la nivelurile Worksheet i Workbook sunt create în mod implicit pentru orice foaie
de calcul, foaie de diagram sau caiet. Pentru a scrie proceduri de r spuns la evenimentele de la nivelul Chart sau pentru
Application, trebuie s se creeze un nou obiect utilizând cuvântul cheie WithEvents într-un modul clas . (vezi discu ia din
sec iunea dedicat subiectului în acest capitol).

Permiterea i inhibarea evenimentelor

În mod uzual, toate evenimentele sunt permise. Cu alte cuvinte evenimentele au loc, sunt recunoscute ca atare i se
execut procedurile corespunz toare fiec rui eveniment.

În cazul când nu se dore te executarea procedurii de r spuns, acest lucru este controlat prin inhibarea evenimentului, cu
efectul nerecunoa terii evenimentului de c tre sistem i, drept urmare, neexecutarea procedurii asociate.

Proprietatea EnableEvents, a obiectului Application, poate primi valoarea True sau False dup cum evenimentele sunt
permise sau inhibate.

Urm torul exemplu execut salvarea caietului f r producerea evenimentului BeforeSave:

Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

124
Utilizarea evenimentelor

Completarea procedurilor implicite de r spuns la evenimente se efectueaz prin accesul la codul procedurilor i scrierea
de cod în mod uzual.

Pentru a vedea procedurile de eveniment ale unei foi (de calcul sau diagram ):

o click dreapta pe cotorul foii (pe bara de jos, unde se v d cotoarele tuturor foilor din caietul activ),
comanda View Code din meniul contextual, alegerea numelui evenimentului în lista derulant
Procedure, sau
o meniul Tools, comanda Macro i selectarea op iunii Visual Basic Editor. Se selecteaz foaia dorit în
Project Explorer, butonul View Code i se alege numele evenimentului din lista Procedure.

Evenimentele obiectului Worksheet

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaz foaia. Acest eveniment se va utiliza în locul
propriet ii OnSheetActivate

BeforeDoubleClick Apare atunci când utilizatorul execut un dublu click într-o celul a foii. Se va utiliza în
locul propriet ii OnDoubleClick.

BeforeRightClick Apare atunci când utilizatorul execut un click dreapta într-o celul a foii.

Calculate Apare când utilizatorul recalculeaz foaia. Acest eveniment se va utiliza în locul
propriet ii OnCalculate.

Change Apare atunci când utilizatorul schimb o formul dintr-o celul . Se va utiliza în locul
propriet ii OnEntry.

Deactivate Apare atunci când foaia este activ i utilizatorul activeaz o alt foaie. Nu apare atunci
când utilizatorul mut focusul de la o fereastr la alt fereastr a aceleea i foi. Acest
eveniment se va utiliza în locul propriet ii OnSheetDeactivate.

SelectionChange Apare atunci când utilizatorul selecteaz o celul din foaie.

O prezentare complet i exemple se g sesc în intr rile respective din Help.

Exemplu

În codul care urmeaz , se reajusteaz dimensiunea coloanelor la fiecare recalculare:

Private Sub Worksheet_Calculate ()


Columns("A:F").AutoFit
End Sub

Este de remarcat c modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea evenimentelor".

125
Evenimentele obiectului Chart

Declan ate atunci când utilizatorul activeaz sau modific o diagram , evenimentele recunoscute de obiectul Chart sunt
prezentate în tabelul urm tor.

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaz foaia diagram (nu apare la diagramele scufundate).
Acest eveniment se va utiliza în locul propriet ii OnSheetActivate

BeforeDoubleClick Apare atunci când utilizatorul execut un dublu click pe diagram . Se va utiliza în locul
propriet ii OnDoubleClick.

BeforeRightClick Apare atunci când utilizatorul execut un click dreapta pe diagram .

Calculate Apare când utilizatorul reprezint în diagram date noi sau modificate.

Deactivate Apare atunci când foaia este activ i utilizatorul activeaz o alt foaie. Nu apare atunci când
utilizatorul mut focusul de la o fereastr la alt fereastr a aceleea i foi. Acest eveniment se
va utiliza în locul propriet ii OnSheetDeactivate.

DragOver Apare atunci când utilizatorul dragheaz date peste diagram .

DragPlot Apare atunci când utilizatorul dragheaz un domeniu de celule peste diagram .

MouseDown Apare atunci când utilizatorul execut un click cu un buton al mouse-ului în timp ce pointerul
acestuia este pozi ionat pe diagram .

MouseMove Apare la mi carea pointerului mouse-ului peste diagram .

MouseUp Apare atunci când utilizatorul elibereaz un buton al mouse-ului în timp ce pointerul acestuia
este pozi ionat pe diagram .

Resize Apare la redimensionarea diagramei.

Select Apare la selectarea unui element al diagramei.

SeriesChanges Apare atunci când utilizatorul modific valoarea unei punct de pe diagram .

Evenimentele foilor de diagrame sunt permise în mod implicit. Pentru a scrie proceduri de eveniment pentru diagramele
scufundate, trebuie s se creeze un nou obiect utilizând WithEvents într-un modul de clas .

Exemplu

Se schimb culoarea chenarului unui punct atunci când utilizatorul schimb valoarea punctului:

Private Sub Chart_SeriesChange (ByVal SeriesIndex As Long, _


ByVal PointIndex As Long)
Set p = ActiveChart.SeriesCollection(SeriesIndex).Points(PointIndex)
p.Border.ColorIndex = 3
End Sub

126
Evenimentele obiectului Workbook

Aceste evenimente se declan eaz atunci când utilizatorul schimb un caiet sau orice foaie din caietul respectiv.

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaz caietul.

AddInInstall Apare atunci când utilizatorul instaleaz caietul ca un add-in. Se va utiliza în locul macro-
ului Auto_Add.

AddInUninstall Apare atunci când utilizatorul dezinstaleaz caietul ca un add-in. Se va utiliza în locul
macro-ului Auto_Remove.

BeforeClose Apare înaintea închiderii caietului. Se va utiliza în locul macro-ului Auto_Close.

BeforePrint Apare înaintea tip ririi caietului.

BeforeSave Apare înainte ca utilizatorul s salveze foaia. Acest eveniment se va utiliza în locul
propriet ii OnSave.

Deactivate Apare atunci când caietul este activ i utilizatorul activeaz un alt caiet.

NewSheet Apare dup ce utilizatorul creeaz o nou foaie.

Open Apare la deschiderea caietului. Evenimentul se va utiliza în locul macroului Auto_Open.

SheetActivate Apare la activarea unei foi din caiet. Se va utiliza în locul propriet ii OnSheetActivate.

SheetBeforeDoubleClick Apare la dublu click pe o celul (nu este utilizat cu foile diagram ). Se va utiliza în locul
propriet ii OnDoubleClick.

SheetBeforeRightClick Apare la click dreapta pe o celul a unei foi din caiet (nu este utilizat cu foile diagram ).

SheetCalculate Apare la recalcularea unei foi (nu este utilizat cu foile diagram ). Se utilizeaz în locul
propriet ii OnCalculate.

SheetChange Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram ). Se
utilizeaz în locul propriet ii OnEntry.

SheetDeactivate Apare la activarea altei foi din caiet. Se utilizeaz în locul propriet ii OnSheetDeactivate.

SheetSelectionChange Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram ).

WindowActivate Apare atunci când utilizatorul mut focusul pe orice fereastr a caietului. Se utilizeaz în
locul propriet ii OnWindow.

WindowDeactivate Apare atunci când utilizatorul mut focusul în afara oric rei fereastre a caietului. Se
utilizeaz în locul propriet ii OnWindow.

WindowResize Apare atunci când utilizatorul deschide, redimensioneaz , maximizeaz sau minimizeaz
orice fereastr a caietului.

Pentru explica ii se vor studia intr rile corespunz toare din Help.

127
Exemplu

Deschiderea caietului maximizeaz fereastra aplica iei Excel:

Sub Workbook_Open ()
Application.WindowState = xlMaximized
End Sub

Evenimentele obiectului Application

Aceste evenimente se declan eaz la crearea/deschiderea unui caiet sau atunci când este modificat orice foaie din
orice caiet deschis.

Eveniment Descriere
(pentru Application)

NewWorkbook Apare la crearea unui nou caiet.

SheetActivate Apare atunci când utilizatorul activeaz o foaie dintr-un caiet deschis. Se va utiliza în locul
propriet ii OnSheetActivate.

SheetBeforeDoubleClick Apare la dublu click pe o celul dintr-un caiet deschis (nu este utilizat cu foile diagram ). Se
va utiliza în locul propriet ii OnDoubleClick.

SheetBeforeRightClick Apare la click dreapta pe o celul a unei foi dintr-un caiet deschis (nu este utilizat cu foile
diagram ).

SheetCalculate Apare la recalcularea unei foi (nu este utilizat cu foile diagram ). Se utilizeaz în locul
propriet ii OnCalculate.

SheetChange Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram ). Se utilizeaz
în locul propriet ii OnEntry.

SheetDeactivate Apare la activarea altei foi dintr-un caiet. Se utilizeaz în locul propriet ii
OnSheetDeactivate.

SheetSelectionChange Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram ).

WindowActivate Apare atunci când utilizatorul mut focusul pe orice fereastr deschis în aplica ie. Se
utilizeaz în locul propriet ii OnWindow.

WindowDeactivate Apare atunci când utilizatorul mut focusul în afara oric rei fereastre a aplica iei. Se
utilizeaz în locul propriet ii OnWindow.

WindowResize Apare atunci când utilizatorul redimensioneaz , maximizeaz sau minimizeaz orice
fereastr deschis în aplica ie.

WorkbookActivate Apare atunci când se mut focusul pe un caiet deschis

WorkbookAddInInstall Apare la instalarea unui workbook ca un add-in.

WorkbookAddInUninstall Apare la dezinstalarea unui workbook ca un add-in.

WorkbookBeforeClose Apare înainte ca un caiet deschis s fie închis.

128
WorkbookBeforePrint Apare înainte ca un caiet deschis s fie tip rit.

WorkbookBeforeSave Apare înainte ca un caiet deschis s fie salvat.

WorkbookDeactivate Apare atunci când utilizatorul mut focusul în afara unui caiet deschis.

WorkbookNewSheet Apare la ad ugarea unei noi foi la un caiet deschis.

WorkbookOpen Apare atunci când utilizatorul deschide un caiet.

Utilizarea modulelor clas cu evenimente

Deoarece diagramele scufundate într-o foaie de calcul i obiectul Application nu au evenimente permise în mod implicit,
trebuie s se urmeze urm toarele etape pentru a utiliza evenimentele recunoscute de aceste obiecte.

• Se creeaz un modul de tip clas i se declar un obiect de tip Chart sau Application cu evenimente. Pentru
crearea modulului clas se d comanda Class Module din meniul Insert.
• Pentru permiterea evenimentelor obiectului Application se adaug declara ia

Public WithEvents App As Application

• Obiectul nou creat apare în boxa Object din modulul clas i se pot scrie procedurile evenimentelor pentru noul
obiect.

• Se conecteaz obiectul declarat în modul la obiectul Application. Pentru aceast opera iune, în orice modul se
d instruc iunea

Public X As New EventClass

unde EventClass este numele dat, de exemplu, modulului clas creat, similar pentru X.

• dup crearea instan ei X a obiectului EventClass se poate stabili obiectul App al clasei EventClass egal cu
obiectul Application Microsoft Excel.

Sub InitializeApp ()
Set X.App = Application
End Sub

• Dup executarea procedurii de ini ializare, obiectul App din modulul EventClass puncteaz c tre obiectul
Application Microsoft Excel i procedurile eveniment din modulul clas vor fi executate la declan area
evenimentelor.

De i procedura poate p rea laborioas , ideea poate fi utilizat pentru ca acelea i proceduri eveniment s fie asociate mai
multor obiecte.

S presupunem c am efectuat etapele precedente pentru un obiect diagram . S-a utilizat astfel declara ia

Public WithEvents cht As Chart

în etapa 2 i codul urm tor

129
Dim C1 As New EventClass
Dim C2 As New EventClass
Sub InitializeCharts ()
Set C1.cht = Worksheets (1).ChartObjects(1).Chart
Set C2.cht = Worksheets (1).ChartObjects(2).Chart
End Sub

pentru ini ializare.

Aceea i tehnic se poate utiliza i pentru obiectele Worksheet i Workbook pentru a utiliza evenimentele noii clase cu
mai multe foi de calcul, în plus fa de evenimentele implicite.

Obiectele Microsoft Access

O baz de date Microsoft Access este alc tuit din diferite tipuri de obiecte. Unel sunt utilizate pentru a afi a date din
baz , altele pentru memorarea i gestionarea datelor iar altele ca ajutor în programare.

Unele obiecte sunt furnizate de Access, altele sunt oferite de diferite componente. În continuare se discut doar obiectele
din Access: forme, rapoarte, controale i module.

Obiectele accesibile în Microsoft Access

Deoarece Microsoft Access include mai multe componente, fiecare cu mul imea proprie de obiecte, anumite seturi de
obiecte sunt accesibile doar dac se specific o referin la biblioteca respectiv , referin a efectuându-se în mod uzual
prin marcarea bibliotecii în lista afi at la comanda References din meniul Tools.

Access face referin , în mod automat, la bibliotecile de obiecte:

o Microsoft Access 8.0. Aici sunt obiectele prezentate în acest capitol (Form, Module, Application etc.).
o Microsoft DAO 3.5. Aici sunt con inute obiectele de acces la date (Data Access Objects – DAO) cum ar fi
TableDef, QueryDef prin care se determin structura de date i se pot accesa datele prin cod VB. Aceste
obiecte sunt discutate într-un capitol separat.
o Visual Basic for Applications. Aici sunt con inute trei obiecte care ajut la programare: Debug, Err i
Collection.

Microsoft Access include, de asemenea, biblioteca Microsoft Office 8.0, dar aceasta trebuie s fie referit pentru a avea
acces la obiecte cum ar fi CommandBar, FileSearch sau Assistant.

Alte biblioteci trebuie s fie referite dac obiectele lor sunt necesare în cadrul procesului de automatizare: de exemplu
Microsoft Excel.

Pentru a lucra cu obiectele Microsoft Access din alte aplica ii care suport automatizarea, în aplica iile respective se va
face referire la biblioteca de obiecte Microsoft Access 8.0.

Obiectele Microsoft Access

Biblioteca de obiecte Microsoft Access 8.0 con ine obiectele i colec iile enumerate în tabelul urm tor. Obiectele i
utilizarea lor sunt descrise în continuarea capitolului.

Obiectul sau colec ia Descriere

130
Application Reprezint aplica ia Microsoft Access (obiect)

Form Reprezint o form deschis (obiect)

Forms Con ine toate formele deschise. (colec ie)

Report Reprezint un raport deschis (obiect)

Reports Con ine toate rapoartele curente deschise (colec ie)

Control Reprezint un control pe o form , raport sau sec iune sau din alt control (obiect)

Controls Con ine toate controalele de pe o form sau raport (colec ie)

Module Reprezint un modul standard sau un modul clas (obiect)

Modules Con ine toate modulele deschise curent (colec ie)

Reference Reprezint o referin la o bibliotec de obiecte (obiect)

References Reprezint toate referin ele stabilite în mod curent (colec ie)

DoCmd Reprezint o ac iune macro din Visual Basic (obiect)

Screen Reprezint aranjarea curent a obiectelor pe ecran.

Obiectele Access sunt organizate în mod ierarhic, arborele de structur fiind urm torul

Propriet ile, metodele i evenimentele asociate sunt vizibile, în mod similar tutror obiectelor accesate în VBA, prin Object
Browser. Pentru a deschide acest instrument, se deschide un modul i apoi se d comanda Object Browser din meniul
View (sau F2).

Obiectul Application

Obiectul Application reprezint aplica ia Microsoft Access i este obiectul de nivel cel mai înalt din ierarhia de obiecte
Access, con inând toate celelalte obiecte i colec ii.

Obiectul Application este obiectul implicit din ierarhia de obiecte. Drept urmare, atunci când se lucreaz din interiorul
aplica iei Access, nu este necesar referirea lui explicit când se utilizeaz una dintre propriet ile sau metodele sale, sau
când se scrie o referin la un obiect sau o colec ie inclus . Referirea explicit nu produce, totu i, erori.

Specificare obiectului Application este necesar doar atunci când, prin procedeul de automatizare, se lucreaz cu obiecte
din ierarhia Access în interiorul altei aplica ii.

Utilizarea obiectului Application în automatizare

Atunci când se lucreaz cu obiectele Access din alte aplica ii, cum ar fi Excel sau Visual Basic, trebuie s se introduc o
referin la biblioteca de obiecte i orice referire la un obiect Access trebuie s înceap cu Application, care permite
intrarea în ierarhie.

Automatizarea trebuie s înceap cu etapele:

o stabilirea, aplica ia gazd , a unei referin e la biblioteca de obiecte Microsoft Access


131
o declararea unei variabile obiect care s reprezinte obiectul Application Microsoft Access
o returnarea unei referin e la obiectul Application u asignarea acestei referin e la variabila obiect.

În Visual Basic Editor, aceste etape se realizeaz prin:

o deschiderea unui modul, comanda References din Tools, selectarea Microsoft Access 8.0 Object
Library în lista Available References. Este evident c se presupune instalarea prealabil a produsului
Microsoft Access 97, în caz contrar referin a nu este disponibil .
o Pentru declararea variabilei obiect este recomandat formularea

Dim appAccess As Access.Application

o Dup declararea variabilei, returnarea unei referin e la obiectul Application se poate ob ine prin func ia
CreateObject (dac Microsoft Access nu este lansat) sau GetObject (dac Microsoft Access este deja
lansat). Asignarea referin ei la variabila obiect definit este de exemplu:

Set appAccess = CreateObject("Access.Application.8")

o unde num rul versiunii poate lipsi dac exist o singur versiune instalat de Access.
o Dac aplica ia gazd suport New se poate utiliza o singur instruc iune pentru declararea variabilei i
asignarea referin ei:

Dim appAccess As New Access.Application

o diferen a fiind c în aceast variant nu este deschis efectiv Microsoft Access pân când nu se lucreaz
programatic cu variabila obiect, de exemplu

appAccess.NewCurrentDatabase "NewDb.mdb"

Dup parcurgerea etapelor descrise, se poate utiliza variabila obiect creat pentru accesul la ierarhia de obiecte Access.
Urm torul exemplu, care lucreaz din Excel pe baza de date standard (furnizat de Microsoft Office i utilizat frecvent
pentru exemplific ri) Northwind, deschide o form i lucreaz cu ea. Pentru a vedea func ionarea exemplului se va
deschide Excel, se va trece codul într-un modul i apoi se va executa.

Sub OpenNorthwindEmployees ()

Dim appAccess As New Access.Application


Const conPath As String = "C:\Program Files\Microsoft Office\Office" _
& "\Samples\Northwind.mdb"
With appAccess
' Deschide baza de date
.OpenCurrentDatabase conPath
' Deschide forma Employees
.DoCmd.OpenForm "Employees"
' Stabileste captarea formei
.Forms!Employees.Caption = "Northwind Employees"
End With
End Sub

Prin automatizare se poate lucra cu DAO prin stabilirea prealabil a unei referin e la biblioteca de obiecte Microsoft DAO
3.5 i utilizarea apoi a propriet ii DBEngine a obiectului Application Microsoft Access pentru returnarea unei referin e la
obiectul DBEngine DAO. Prin acest din urm obiect se ob ine acces la toat ierahia de obiect DAO.

132
Colec ia Forms

Obiectul Form reprezint o form Access deschis într-unul din modurile de vizualizare Design, Form sau Datasheet.
Obiectele Form sunt grupate în colec ia Forms, care con ine doar formele deschise curent în baza de date.

În tabelul urm tor sunt rezumate rela iile obiectelor Form i ale colec iei Forms:

Obiectul sau colec ia Este con inut( ) în Con ine

Form (obiect) Forms Colec ia Controls


Colec ia Properties
Obiectul Module

Forms (colec ie) Application Obiecte Form

Referirea la un obiect Form

Pentru a lucra cu o form în Visual Basic, trebuie s se returneze o referin la obiectul Form corespunz tor, referin a
ob inându-se prin intermediul colec iei Forms. O form poate fi referit doar dac este deschis iar deschiderea unei
forme se realizeaz prin metoda OpenForm a obiectului DoCmd.

Ca orice element dintr-o colec ie, o form poate fi referit prin nume sau prin indexul din cadrul colec iei.

Referin a prin nume se poate face în mod explicit, dac se cunoa te numele formei în momentul proiect rii aplica iei:

Dim frm As Form


Set frm = Forms!Employees

sau prin nota ia cu paranteze, în cazul în care numele este cunoscut doar la momentul execu iei, ca în exemplul urm tor:

Function SetFormCaption (strFormName As String)


Dim frm As Form
' Se deschide forma
DoCmd.OpenForm strFormName
' Se returneaz o referin la obiectul Form
Set frm = Forms(strFormName)
' Se schimb captarea formei
frm.Caption = Date
End Function

Referin a prin indice este de genul Forms(1), indexarea colec iei Forms începând cu 0 (zero). În acest mod de referire
trebuie s se lucreze cu grij deoarece numerotarea se reface la orice închidere a unei forme, prin urmare o form
anumit poate avea indici diferi i în momente diferite de execu ie.

Cum colec ia Forms cuprinde formele deschise la momentul respectiv, nu se poate ad uga i nici nu se poate elimina un
membru al colec iei (opera iuni posibile pentru alte colec ii din VBA). Deschiderea i închiderea unei forme produce
opera iunile de ad ugare/eliminare a elementelor din colec ie.

Pentru cazuri singulare (cum ar fi un obiect care nu se utilizeaz în mod repetat), referin a la o form se poate efectua i
direct, prin invocarea modulului clas al formei:

Form_Employees.Visible = True
133
Propriet ile obiectului Form

Dintre propriet ile obiectului Form sunt prezentate doar câteva, considerate mai importante. Pentru celelalte se va studia
intrarea corespunz toare din Help (Form Object).

Proprietatea Me (Form Object)

Returneaz o referin la forma în care se execut codul curent. Proprietatea poate fi utilizat în procedurile din modulul
formei, poate fi utilizat pentru trecerea ca argument a obiectului Form f r a ti numele formei. Utilizarea propriet ii
produce un cod independent de numele formei.

Urm torul exemplu arat cum, la fiecare înc rcare (deschidere) a formei, se poate modifica culoarea de fundal a sec iunii
detaliu din form . În acest scop se scrie cod în procedura eveniment respectiv :

' Procedura se adaug la modulul formei


Private Sub Form_Load ()
' Ini ializarea generatorului de numere aleatoare
Randomize
' Stabilirea culorii de fundal
Me.Section(acDetail).BackColor = RGB(Rnd*256, Rnd*256, Rnd*256)
End Sub

Este de notat c atunci când se lucreaz cu o form Access din alt aplica ie, prin automatizare, nu se poate utiliza Me
pentru a referi forma din aplica ia gazd .

Proprietatea Section (Form Object)

O form este divizat în Access în cinci sec iuni: detaliu (detail), antet (header), subsol (footer), antet de pagin (page
header) i subsol de pagin (page footer). Proprietatea returneaz o referin la o sec iune particular , utilizarea acesteia
permite stabilirea propriet ilor sec iunii. Pentru obiectul Form, sec iunile sunt identificate prin

Index Nume Semnifica ie

0 acDetail Form detail

1 acHeader Form header

2 acFooter Form footer

3 acPageHeader Form page header

4 acPageFooter Form page footer

Un num r de propriet i se aplic mai degrab unei sec iuni dintr-o form decât obiectului Form. De exemplu,
proprietatea BackColor se aplic unei sec iuni i nu unei forme (a se vedea exemplul precedent). O sec iune are de
asemenea o proprietatea Controls, care returneaz o referin la colec ia Controls pentru acea sec iune.

Urm torul exemplu tip re te, în fereastra Debug, numele tuturor controalelor din sec iunea de detalii:

Sub ControlsBySection (frm As Form)


Dim ctl As Control
' Enumerarea controalelor din sec iunea de detalii

134
For Each ctl In frm.Section(acDetail).Controls
Debug.Print ctl.Name
Next ctl
End Sub

Proprietatea Properties (Form Object)

Returneaz o referin la colec ia Properties a obiectului Form. Colec ia Properties con ine toate propriet ile formei i
pot fi enumerate prin instruc iunea For Each…Next.

La colec ia Properties nu se poate ad uga programatic o nou proprietate.

Urm torul exemplu tip re te toate propriet ile unui obiect Form

Sub EnumerateFormProperties(frm As Form)


Dim prp As Property
' enumerarea propriet ile unei forme
For Each prp In frm.Properties
Debug.Print prp.Name, prp.Value
Next prp
End Sub

Proprietatea Module (Form Object)

Aplicat unui obiect Form, proprietatea Module returneaz o referin la obiectul Module asociat formei. Referin a poate
fi asignat unei variabile de tip Module.

Modulul asociat cu o form nu exist în mod automat din momentul creerii formei. Proprietatea HasModule determin
dac o form are un modul asociat. Dac proprietatea Module este referit în modul proiectare, Access creeaz modulul
asociat i stabile te valoarea True pentru HasModule. Referirea la proprietatea Module a unei forme în execu ie (run-
time) pentru care HasModule este False produce eroare.

Proprietatea RecordSource (Form Object)

Prin proprietatea aceasta se leag o tabel sau o interogare (query) la form . Dup ce propriet ii RecordSource i-a fost
atribuit numele unei tabele sau interog ri sau o instruc iune SQL se pot afi a date din tabel , interogare sau SQL pe
form . Un exemplu este

Forms!frmCustomers.RecordSource = "Customers"

prin care se leag forma de o tabel .

Module ata ate formelor

Un obiect Form poate avea un modul asociat, care este reprezentat printr-un obiect Module. Cum acest modul nu este
creat în mod automat la crearea formei, exist trei c i de creare a modulului asociat:

o click Code de pe meniul View când forma este în modul de vizualizare Design. Modulul este creat i
salvat împreun cu forma chiar dac nu con ine code.
o Stabilirea propriet ii HasModule la True. Aceasta se poate efectua din foaia de propriet i din Access
sau din Visual Basic. Stabilirea propriet ii la False elimin modulul i codul con inut.

135
o Referirea la proprietatea Module a formei din Visual Basic. Proprietatea returneaz o referin la obiectul
Module asociat formei, creând mai întâi modulul dac el nu exist .

În lucrul cu module asociate, trebuie re inut c o form f r modul asociat se deschide mai repede. Prin urmare nu se vor
crea module dac nu exist necesitatea scrierii de cod pentru form . Eliminarea modulelor inutile reduce i dimensiunea
bazelor de date.

Un modul de form con ine toate procedurile eveniment definite pentru form , ca i alte proceduri specifice formei. De
notat c o procedur care se acceseaz din multiple locuri ale bazei de date trebuie plasat într-un modul standard.

Crearea formelor în timpul execu iei

Pentru generarea unei forme în timpul execu iei (run-time) se poate utiliza func ia CreateForm. Func iile asociate sunt
CreateControl i DeleteControl care adaug sau elimin controale de pe o form .

Se poate, de asemenea, s se adauge programatic, în timpul execu iei, cod în modulul asociat formei prin metodele i
propriet ile obiectului Module. De exemplu, metoda CreateEventProc creeaz o procedur eveniment pentru obiectul
specificat (aici form , dar poate fi i raport, control etc.). Metoda InsertLines permite inserarea unor linii de cod, ca i
InsertText, AddFromFile, AddFromString etc.

Urm torul exemplu creeaz o form i adaug o procedur eveniment modulului asociat formei.

Function CreateFormWithCode () As Boolean


Dim frm As Form, mdl As Module
Dim lngLine As Long, strLine As String

' Permite tratarea erorilor


On Error GoTo Error_CreateFormWithCode
' creeaz noua form i returneaz o referin la ea
Set frm = CreateForm
' returneaz o referin la modul
Set mdl = frm.Module
' creeaz procedura evenimentului Load
lngLine = mdl.CreateEventProc("Load", "Form")
strLine = vbTab & "Me.Caption = " & Date
' stabile te captarea formei în evenimentul Load
mdl.InsertLines lingLine + 1, strLine
' returneaz True dac func ia se termin cu succes
CreateFormWithCode = True

Exit_CreateFormWitwCode:
Exit Function

Error_CreateFormWithCode:
MsgBox Err & ": " & Err.Description
CreateFormWithCode = False
Resume Exit_CreateFormWithCode
End Function

O discu ie ceva mai ampl se g se te la sec iunea dedicat colec iei Modules.

Colec ia Reports

136
Un obiect Report reprezint un raport microsoft Access care este deschis în Design view, Print Preview sau Layout
Preview. Toate obiectele Report sunt membri ai colec iei Reports. De accentuat c doar rapoartele deschise sunt
reprezentate în colec ie.

Rela iile în sus i în jos ale colec iei Reports în ierarhia de obiecte sunt date în tabelul urm tor:

Obiectul sau colec ia Este con inut( ) în Con ine

Report (obiect) Reports Colec ia Controls


Colec ia Properties
Obiectul Module

Reports (colec ie) Application Obiecte Report

Obiectele Report au caracteristici similare cu obiectele Form.

Referirea obiectelor Report

Pentru a referi un raport trebuie ca acesta s fie deschis, opera iune realizat prin metoda OpenReport a obiectului
DoCmd.

Referin ele se returneaz în mod uzual, dup unul dintre modelele:

Dim rpt As Report ' define te variabila obiect rpt de tip Report
Set rpt = Reports!Invoice ' referin prin nume cunoscut
Set rpt = Reports("Invoice") ' referin prin irul care con ine numele
Set rpt = Reports(0) ' referin prin indicele din colec ie (bazat pe zero)

Module asociate rapoartelor

Ca i un obiect Form, obiectul Report poate avea asociat un modul care este un modul clas . Modulul de cod asociat nu
exist pân când nu este referit:

o click Code de pe meniul View când raportul este în modul de vizualizare Design. Modulul este creat i
salvat cu raportul chiar dac nu con ine code.
o Stabilirea pentru obiectul Report a propriet ii HasModule la True. Aceasta se poate efectua din foaia de
propriet i din Access sau din Visual Basic. Stabilirea propriet ii la False elimin modulul i codul
con inut.
o Referirea, din Visual Basic, la proprietatea Module a raportului. Proprietatea returneaz o referin la
obiectul Module asociat raportului, creând mai întâi modulul dac el nu exist .

Crearea rapoartelor în timpul execu iei (run time)

Pentru crearea programatic a rapoartelor se utilizeaz func ie CreateReport. Controalele se pot ad uga sau elimina, în
run time, prin func iile CreateReportControl sau DeleteReportControl.

Func iile CreateForm, CreateReport

Sintaxa apelurilor este

CreateForm([database[, formtemplate]])

137
CreateReport([database[, reporttemplate]])

unde

database este un ir, identific baza de date care con ine raportul sau forma creat . Dac este omis, se va utiliza baza
curent (conform returului func iei CurrentDb). Baza de date specificat , dac este diferit de baza curent , trebuie
deschis ca o baz de date bibliotec (vezi intr rile din Help pentru "library databases").

formtemplate, reporttemplate sunt, respectiv, iruri cu numele abloanelor utilizate la crearea noului obiect. Dac este
omis, se va alege în mod implicit ablonul specificat de fi a Forms/Reports din dialogul Options deschis de comanda
Options din meniul Tools.

Func iile deschid un obiect nou, minimizat, în modul de vizualizare Design.

abloanele specificate pot fi create anterior ca abloane sau pot fi orice form , respectiv raport, din baza de date
specificat în argumentul database.

Func iile CreateControl, CreateReportControl

Ambele func ii creeaz un control cu atributele specificate pe o forma, respectiv pe un raport. Atât forma cât i raportul
trebuie s fie deschise. Sintaxa este

CreateControl(formname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])

CreateReportControl(reportname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])

unde

formname, reportname reprezint numele formei sau raportului unde se creeaz controlul.

controltype este o constant predefinit care reprezint tipul controlului. Se pot vedea prin Object Browser cu alegerile
Access în Project/Library i Constants în Classes i copia în cod. F r explica ii (denumirile sunt suficient de sugestive):
acLabel, acRectangle, acLine, acImage, acCommandButton, acOptionButton, acCheckBox, acOptionGroup,
acBoundObjectFrame, acTextBox, acListBox, acComboBox, acSubform, acObjectFrame, acPage, acPageBreak,
acCustomControl, acToggleButton, acTabCtl.

section este o constant identificând sec iunea. Poate fi o constant dintre

Constanta Semnifica ia

acDetail (Default) Detail section

acHeader Form or report header

acFooter Form or report footer

acPageHeader Page header

acPageFooter Page footer

acGroupLevel1Header Group-level 1 header (reports only)

138
acGroupLevel1Footer Group-level 1 footer (reports only)

acGroupLevel2Header Group-level 2 header (reports only)

acGroupLevel2Footer Group-level 2 footer (reports only)

Pentru grupuri suplimentare într-un raport, perechile header/footer sunt numerotate consecutiv începând cu 9

parent este un ir care identific controlul p rinte. Pentru controalele care nu sunt copii se utilizeaz irul vid sau se omite
argumentul.

columnname numele câmpului unde este legat controlul, dac este un control legat de date. Dac nu este cazul, se
utilizeaz irul vid.

left, top sunt expresii numerice ale coordonatelor relative la col ul din stânga sus, în twips.

width, height sunt expresii numerice indicând l imea i în l imea controlului, în twips.

Func iile CreateControl i CreateReportControl pot fi utilizate doar în modul de vizualizare Design (vezi i efectul
func iilor CreateForm, CreateReport). În stabilirea rela iilor p rinte-copil se va avea în vedere rela ia de pe form /raport.
De exemplu, caset text (control tat ) i eticheta asociat (control copil, subordonat). Sau, un grup de op iuni este p rinte
pentru boxele de control con inute etc. Doar controalele label, check box, option button sau toggle button pot avea
controale p rinte, de i pot fi create i independent.

Controalele care pot fi legate de un câmp de date sunt text box, list box, combo box, option group i bound object frame.
În plus, controalele toggle button, option button i check box pot fi legate de un câmp dac nu sunt con inute într-un grup
de op iuni (option group).

La legarea unui câmp, propriet ile controlului sunt modificate automat pentru a se conforma propriet ilor
corespunz toare ale câmpului.

Pentru a înl tura un control se vor utiliza instruc iunile DeleteControl i DeleteReportControl cu sintaxa

DeleteControl formname, controlname

DeleteReportControl reportname, controlname

Semnifica ia argumentelor este evident .

Exemplu de creare a unui raport

Folosind automatizarea din Excel, exemplul creeaz o tabela legat într-o baz de date Access i realizeaz un raport pe
baza datelor din tabele legat .

Pentru utilizarea exemplului trebuie sa se creeze un caiet Excel cu numele Revenue.xls, s se completeze datele într-o
foaie a caietului i s se denumeasc un domeniu DataRange care include datele. Dup aceea, se va trece codul
urm tor într-un modul din caiet. În proiectul Excel se vor stabili referin e la bibliotecile de obiecte Microsoft Access 8.0 i
DAO 3.5.

139
Este esen ial ca, înaintea execu iei codului, s fie instalat în sistem driver-ul Microsoft Excel ISAM (Msexcl35.dll). Dac
nu este instalat, se va executa Setup pentru a-l instala. Driver-ul Microsoft Excel ISAM permite fi ierelor Excel 97 s
lucreze cu motorul de baze de date Microsoft Jet.

' se introduce în sec iunea Declarations a modulului


Dim appAccess As New Access.Application

Sub PrintReport ()
Dim rpt As Access.Report, ctl As Access.TextBox
Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field
Dim strDB As String, intLeft As Integer

' se declar calea c tre baza de date Northwind (din Office)


Const conPath As String = "C:\Program Files …"

' Se deschide baza de date


appAccess.OpenCurrentDatabase conPath & "Northwind.mdb"
' se returneaz referin a la baz
Set dbs = appAccess.CurrentDb
' se creeaz un obiect tabel nou
Set tdf = dbs.CreateTableDef("XLData")
' se specific irul de conectare la driver-ul Excel ISAM
tdf.Connect = "EXCEL 8.0; Database=C:\My Documents\Revenue.xls"
' se specific tabela surs ca un domeniu numit în foaie
tdf.SourceTableName = "DataRange"
' se adaug noua tabel legat la baz
dbs.TableDefs.Append tdf
' se creeaz noul raport
Set rpt = appAccess.CreateReport
' se specific tabela legat drept sursa de date a raportului
rpt.RecordSource = tdf.Name
' se creeaz un control pe raport pentru fiecare câmp din tabel
For Each fld In tdf.Fields
Set ctl = appAccess.CreateReportControl (rpt.Name, acTextBox, , , _
fld.Name, intLeft)
intLeft = intLeft + ctl.Width
Next fld

' deschiderea raportului în Print Preview


appAccess.DoCmd.OpenReport rpt.Name, acViewPreview
' restaurarea raportului
app.Access.DoCmd.Restore
' afisarea Access-ului ca aplica ia activ
AppActivate "Microsoft Access"
End Sub

Colec ia Controls

Un obiect Control reprezint un control de pe o form sau dintr-un raport Access. Obiectele Control sunt grupate în
colec ia Controls. Leg turile în ierarhia de obiecte Access sunt date în tabelul urm tor.

Obiectul sau Este con inut( ) în Con ine


colec ia

140
Control (obiect) Controls Colec ia Controls când controlul
este un grup de op iuni (option
group) sau un control tab.
Colec ia Properties
Obiect Hyperlink
Obiecte Control

Controls (colec ie) Obiecte Form Obiecte Control


Obiecte Reports
Obiecte Control, doar pentru obiectele: option
group, tab control, text box, option button, toggle
button, check box, combo box, list box, command
button, bound object frame, unbound object frame.

Exist dou tipuri de controale:

o preconstruite, în biblioteca de obiecte Microsoft Access 8.0, accesibile printr-o cutie de unelte,
o controale ActiveX (denumite i controale OLE sau custom controls).

Controale Microsoft Access

Urm torul tabel con ine lista controalelor predefinite. Controalele sunt cu denumirile de clas , dup cum apar în Object
Browser. Fiecare control este un obiect cu propriet ile, metodele i evenimentele lui. Pentru detalii se vor studia intr rile
sinonime din Help.

Controlul Descriere

BoundObjectFrame Afi eaz o imagine, diagram sau obiect OLE memorat într-o tabel Access.

CheckBox Indic selectarea unei op iuni

ComboBox Combin list ascuns i o caset text.

CommandButton Un buton cu rol de pornire a unei opera iuni atunci când se efectueaz click pe el.

Image Afi eaz o imagine.

Label Afi eaz un text explicativ.

Line Afi eaz o linie orizontal , vertical sau diagonal

ListBox Afi eaz o list de valori.

ObjectFrame Afi eaz o imagine, diagram sau obiect OLE care nu este memorat într-o tabel .

OptionButton Indic dac o op iune este selectat (buton radio).

OptionGroup Afi eaz un set de op iuni.

Page Afiseaz controale pe o pagin a unui control tab.

PageBreak Marcheaz începutul unui nou ecran sau a unei pagini tip rite.

141
Rectangle Afi eaz un dreptunghi.

SubForm/SubReport Afi eaz o form în interiorul altei forme sau un raport în interiorul altui raport.

TabControl Afi eaz pagini multiple, fiecare con inând o mul ime de controale.

TextBox Afi eaz date de tip text.

ToggleButton Indic dac o op iune este selectat sau nu (on/off) prin imaginea unui buton ap sat sau nu.

Controale ActiveX

Un control ActiveX este un obiect care poate fi plasat pe o form pentru a afisa date sau efectua ac iuni. Spre deosebire
de controalele preconstruite, codul asociat este memorat în fi iere separate, care trebuiesc instalate pentru a putea utiliza
controlul ActiveX.

În Microsoft Access sunt disponibile controalele

o Calendar, care permite afi area i actualizarea unui calendar pe o form . Instalarea controlului se cere la
instalarea Microsoft Access.
o WebBrowser, care permite afisarea paginilor Web i alte documente într-o form Access. Acest control
este instalat separat (din folderul ValuPack al CD-ului Office sau direct prin instalarea browserului
Microsoft Internet Explorer).

Referirea obiectelor Control

Un control poate fi referit repetat prin declararea unei variabile care s -l reprezinte. Declararea poate fi f cut explicit,
dac se cunoa te tipul obiectului:

Dim txt As TextBox

sau, dac nu se tie tipul controlului sau dac variabila con ine o referin la un control ActiveX, ea este declarat de tip
generic Control i poate primi referin e la orice tip de control (alternativ util pentru trecerea unor argumente de tipuri
diferite de controale unei proceduri) .

Pentru referin a unui obiect Control individual se pot utiliza mecanismele uzuale pentru colec ii:

Set txt = Forms!Employees!LastName ' care se refer la controlul TextBox


' cu numele LastName de pe forma Employees
Set txt = Me!LastName ' similar exemplului precedent, dar referin a este
' în forma care se execut curent
Set txt = Me![Last Name] 'dac numele con ine spa ii
Set ctl = Me.Controls(0) ' prin indice, bazat pe zero
Set ctl = Me.Controls("LastName")

Propriet ile obiectului Control

Datorit marii variet i de controale, propriet ile sunt foarte numeroase (de exemplu Text Box Control are peste 50 de
propriet i) încât aici se discut doar dou care merit o aten ie special .

142
Proprietatea Hyperlink (Control Object)

Prin aplicarea propriet ii este returnat o referin la un obiect Hyperlink, care reprezint un text sau grafic definind un
salt la un fi ier, bookmark într-un fi ier, pagin HTML pe WWW sau pe intranet.

Controalele care suport proprietatea Hyperlink sunt combo box, command button, image, label i text box. Fiecare
poate afi a o hiperleg tur pe care utilizatorul o poate clicka pentru navigare. Atunci când se dispune de o referin la un
obiect Hyperlink dintr-un control, utilizarea metodei Follow (a obiectului Hyperlink) produce saltul la loca ia indicat .

Exemplul urm tor con ine o func ie care returneaz True în cazul în care controlul trecut drept argument con ine o
hiperleg tur valid .

Function FollowControlHyperlink (ctl As Control) As Boolean


Const conNoHyperlink As Integer = 7976

' permiterea controlului erorilor


On Error GoTo Error_FollowControlHyperlink
' urm rirea adresei indicate
ctl.Hyperlink.Follow
' returneaz True dac saltul este corect
FollowControlHyperlink = True

Exit_ FollowControlHyperlink:
Exit Function

Error_ FollowControlHyperlink:
If Err = conNoHyperlink Then
FollowControlHyperlink = False
End If
Resume Exit_ FollowControlHyperlink
End Function

Proprietatea ControlType (Control Object)

Aplicat unui obiect Control, proprietatea indic tipul particular de control al obiectului. Utilizarea propriet ii poate duce i
la schimbarea tipului de control (de exemplu Text Box în Combo Box) nu numai la aflarea tipului. Valorile propriet ii sunt

acLabel acRectangle AcLine acImage

acCommandButton acOptionButton AcCheckBox acOptionGroup

acBoundObjectFrame acTextBox AcListBox acComboBox

acSubform acObjectFrame AcPage acPageBreak

acCustomControl acToggleButton AcTabCtl

cu interpret ri imediate.

Urm torul exemplu verific proprietatea ControlType pentru fiecare control de pe o form i stabile te proprietatea
Locked la valoarea True pentru casetele de text i boxele combo.

Function LockTextControls (frm As Form) As Boolean


143
Dim ctl As Control

' tratarea erorilor


On Error GoTo Error_LockTextControls

' parcurgerea controalelor


For Each ctl In frm.Controls
' se prelucreaz doar controalele Text Box i Combo Box
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
ctl.Locked = True
End If
Next ctl
' returneaz True pentru succes
LockTextControls = True

Exit_LockTextControls:
Exit Function

Error_LockTextControls:
MsgBox Err & ": " & Err.Description
LockTextControls = False
Resume Exit_ LockTextControls
End Function

Controale legate de date (Data-Bound Controls)

Anumite controale din Microsoft Access pot fi legate de date, ceea ce înseamn c ele afi eaz date memorate într-o
tabel , interogare sau instruc iune SQL. Aceast categorie de controale include: bound object frame, check box, combo
box, list box, option button, option group, text box, subform i subreport.

i unele controale ActiveX (de exemplu Calendar control) pot fi, de asemenea, legate de date.

Controalele legate de date au o proprietate ControlSource prin care se fixeaz numele câmpului tabelei, interog rii sau
instruc iunii SQL din care se iau datele afi ate de control. Este de notat c mai înainte de stabilirea acestei propriet i
trebuie s se fixeze proprietatea RecordSource a formei/raportului pentru a specifica tabela, interogarea sau
instruc iunea SQL care furnizeaz date formei/raportului.

Exemplul urm tor stabile te proprietatea RecordSource a unei forme i proprietatea ControlSource a unui control text
box, numit Text0, în procedura de tratare a evenimentului de înc rcare a formei.

Private Sub Form_Load ()


' sursa de înregistr ri a formei
Me.RecordSource = "Employees"
' sursa de date a controlului
Me!Text0.ControlSource = "LastName"
End Sub

Controale care au o colec ie Controls

Tab control i Option group control au, la rândul lor, o colec ie Controls care poate con ine mai multe controale.

Colec ie Controls apar inând unui grup de op iuni con ine controale de tip options button, check box, toggle button sau
label.

144
Controlul Tab con ine o colec ie Pages reprezentând paginile controlului (vezi figura urm toare). Colec ia Pages con ine
obiecte Page care sunt controale (au ControlType = acPage).

Fiecare obiect Page are colec ia Controls a tuturor controalelor din pagina respectiv .

Celelalte controale (text box, option group, option button, toggle button, check box, combo box, list box, command button,
bound object frame i unbound object frame) au o colec ie Controls cu cel mult un element: label reprezentând eticheta
ata at controlului.

Colec ia Modules

Un obiect Module reprezint un modul din Microsoft Access. Toate obiectele Module sunt incluse în colec ia Modules,
membru al obiectului Application. S-a v zut c un obiect Form sau Report poate s con in de asemenea un singur
obiect Module.

Mul imea tuturor modulelor dintr-o baz de date Microsoft Access constituie proiectul Visual Basic al bazei de date.
Colec ia Modules con ine doar modulele deschise curent în proiect. Modulele care nu sunt deschise pentru editare nu
sunt incluse în colec ia Modules.

Pentru a deschide un modul în Visual Basic se utilizeaz metoda OpenModule a obiectului DoCmd.

Rela iile stabilite de ierarhia de obbiecte sunt

Obiectul sau colec ia Este con inut( ) în Con ine

Module (obiect) Colec ia Modules (Nimic)


Obiecte Form
Obiecte Report

Modules (colec ie) Obiectul Application Obiecte Module

Referirea la obiecte Module

Accesul la un modul se ob ine prin intermediul colec iei, în mod uzual. Astfel

Dim mdl As Module


Set mdl = Modules![ Utility Functions] ' returneaz o referin
'la modulul cu numele dat

Set mdl = Modules(" Utility Functions") ' - idem-


Set mdl = Modules(0) ' returneaz o referin
' la primul modul al colec iei

Modulele clas asociate formelor sau rapoartelor care sunt deschise se reg sesc în colec ia Modules.

Pentru modulele asociate formelor/rapoartelor care nu sunt deschise vezi discu ia de la prezentarea obiectelor forme i
rapoarte.

Module standard i module clas

Reamintim câteva no iuni prezentate în capitolele introductive.

145
Microsoft Access con ine dou tipuri de module: module standard (standard modules) i module de clas (class
modules). Ambele tipuri sunt disponibile în tab-ul Modules din fereastra Database a mediului Access. O form sau un
raport pot avea de asemenea un modul de clas asociat.

Codul care trebuie s fie accesibil din orice procedur se va scrie într-un modul standard. Acestea sunt publice în mod
implicit, deci procedurile i variabilele de nivel modul sunt vizibile în mod uzual în tot proiectul. De asemenea, dac
proiectul este referit de alt proiect Access, codul dintr-un modul standard poate fi utilizat în proiectul care efectueaz
referin a.

Modulele de clas sunt întotdeauna private. Se pot utiliza modulele clas pentru a crea obiecte utilizate în proiectul
curent, dar ele nu se pot partaja cu alte proiecte. Procedurile Sub i Function definite într-un modul de clas devin
metode ale obiectului definit iar price procedur de tip Property Let, Property Get i Property Set devin propriet ile
obiectului.

Se pot utiliza modulele clas asociate cu o form sau raport pentru a defini procedurile declan ate de evenimente i se
pot ad uga oricâte proceduri utilizate doar în modulul clas respectiv.

Propriet ile obiectului Module

O descriere sumar a propriet ilor este con inut în tabelul urm tor. Explica ii detaliate se ob in din Help.

Proprietatea Descriere Observa ii

Application Returneaz o referin la obiectul Application. Permite ob inerea accesului la


ierarhia de obiecte Access.

CountOfDeclarationLines Returneaz num rul de linii de cod din sec iunea Long, num r toarea începe cu 1
Declarations a modulului.

CountOfLines Returneaz num rul de linii de cod din modul Long, num r toarea începe cu 1

Lines Returneaz textul con inut în liniile de cod object.Lines(line, numlines)


specificate

Name D numele modulului

Parent Returneaz o referin la obiectul sau colec ia


care con ine modulul

ProcBodyLine Returneaz num rul liniei la care începe object.ProcBodyLine( _ procname,


definirea procedurii prockind)

ProcCountLines Returneaz num rul de linii dintr-o procedur object.ProcCountLines( _ procname,


prockind)

ProcOfLine Returneaz numele procedurii care con ine o object.ProcOfLine( _


linie specificat
line, pprockind)

ProcStartLine Returneaz num rul liniei la care începe o object.ProcStartLine( _


procedur
procname, prockind)

146
Type Indic tipul modulului AcStandardModule sau

0, acClassModule sau 1.

Determinarea num rului de linii dintr-un modul

Liniile unui modul sunt num rate începând cu 1. Num rul ultimei linii dintr-un modul este egal cu valoarea propriet ii
CountOfLines. Num rul ultimei linii din sec iunea Declarations a unui modul este egal cu valoarea propriet ii
CountOfDeclarationLines.

Numerele de linii nu apar efectiv în modul, ele sunt utilizate doar pentru referin e.

Lucrul cu procedurile

Propriet ile Lines, ProcBodyLine, ProcCountLines, ProcOfLine i ProcStartLine sunt utilizate pentru a ob ine
informa ii despre procedurile unui modul. Procedurile pot fi de tip Sub, Function, Property Get, Property Let sau
Property Set. Primele dou tipuri sunt considerate de acela i tip, ultimele trei privesc crearea de propriet i într-un modul
clas .

Proprietatea ProcBodyLine returneaz num rul liniei la care începe definirea procedurii, adic linia care include o
instruc iune Sub, Function sau Property Get/Let/Set.

Proprietatea ProcLineStart returneaz num rul liniei care urmeaz dup separatorul de proceduri, dac sunt selectate
op iunile Full Module View i Procedure Separator în fi a Module din dialogul Option (meniul Tools). Acest num r
poate fi diferit de cel returnat de ProcBodyLine, deoarece sunt considerate i liniile comentariu, vide etc din fa a liniei de
definire. ProcStartLine returneaz num rul primei linii a întregii procedurii.

Exemplul urm tor utilizeaz propriet ile enumerate pentru a tip ri o procedur în fereastra Debug (exemplul modific
u or exemplul din Help).

Function ProcLineInfo(strModuleName As String, _


strProcName As String) As Boolean
Dim mdl As Module
Dim lngStartLine As Long, lngBodyLine As Long
Dim lngCount As Long, lngEndProc As Long

On Error GoTo Error_ProcLineInfo


' Se deschide modulul specificat
DoCmd.OpenModule strModuleName
' Returneaz o referin la obiectul Module
Set mdl = Modules(strModuleName)

' se num r liniile din procedur


lngCount = mdl.ProcCountLines(strProcName, vbext_pk_Proc)
' Determin linia de start
lngStartLine = mdl.ProcStartLine(strProcName, vbext_pk_Proc)

' se determin linia de definire


lngBodyLine = mdl.ProcBodyLine(strProcName, vbext_pk_Proc)
Debug.Print

' se tip resc liniile de început

147
Debug.Print "Lines preceding procedure " & strProcName & ": "
Debug.Print mdl.Lines(lngStartLine, lngBodyLine - lngStartLine)

' determinarea num rului ultimei linii


lngEndProc = (lngBodyLine + lngCount - 1) - Abs(lngBodyLine - lngStartLine)

' tip rirea liniilor din corpul procedurii

Debug.Print "Body lines: "


Debug.Print mdl.Lines(lngBodyLine, (lngEndProc - lngBodyLine) + 1)

Exit_ProcLineInfo:
Exit Function

Error_ProcLineInfo:
MsgBox Err & " :" & Err.Description
ProcLineInfo = False
Resume Exit_ProcLineInfo
End Function

Procedura poate fi apelat , de exemplu, din baza de date exemplificatoare Northwind prin

Sub GetProcInfo()
ProcLineInfo "Utility Functions", "IsLoaded"
End Sub

Metodele obiectului Module

Tabelul urm tor con ine o sintez a metodelor obiectului Module.

Metoda Descriere

AddFromFile Adaug la modul con inutul unui fi ier text.

AddFromString Adaug modulului con inutul unui ir de caractere.

CreateEventProc Creeaz o procedur eveniment într-un modul clas .

DeleteLines Elimin din modul liniile specificate.

Find G se te, într-un modul, textul specificat.

InsertLines Insereaz o linie sau un grup de linii de cod la o pozi ie specificat din modul.

ReplaceLines Inlocuie te o linie dintr-un modul cu textul specificat.

Ad ugare de text la un modul

Pentru a insera text într-un modul, este recomandat metoda InsertLines prin care se poate specifica linia unde are loc
inserarea.

Exemplul din Help (intrarea InsertLines Method) creeaz o form nou , adaug un buton de comand , creeaz
procedura evenimentului Click i insereaz o linie de cod cu metoda InsertLines.

148
Dac textul care se dore te ad ugat trebuie s fie într-un modul nou, acesta se poate crea prin metoda RunCommand a
obiectului Application (comanda Module din meniul Insert trebuie s fie permis ):

RunCommand acCmdNewObjectModule

Pentru lista integral a constantelor permise la aplicarea metodei se va vedea intrarea "RunCommand Method
Constants" în Help.

Exemplul urm tor utilizeaz metoda AddFromFile pentru a ad uga con inutul unui fi ier text la un modul nou. Modulul
creat este salvat cu acela i nume ca i fi ierul text.

Function AddFromTextFile(strFileName) As Boolean


Dim strModuleName As String, intPosition As Integer
Dim intLength As Integer
Dim mdl As Module

' memorarea numelui de fi ier într-o variabil


strModuleName = strFileName

' eliminarea c ii din numele fi ierului


Do
' g sirea caracterului \
intPosition = InStr(strModuleName, "\")
If intPosition = 0 Then
Exit Do
Else
intLength = Len(strModuleName)
' eliminare cale din ir
strModuleName = Right (strModuleName, Abs(intLength – intPosition))
End If
Loop

' eliminarea extensiei


intPosition = InStr(strModuleName, ".")
If intPosition > 0 Then
intLength = Len(strModuleName)
strModuleName = Left(strModuleName, intPosition –1)
End If

' Crearea modulului nou


RunCommand acCmdNewObjectModule
' salvarea modulului
DoCmd.Save , strModuleName
' returnarea referin ei la obiectul Module
Set mdl = Modules(strModuleName)
' ad ugarea fi ierului text
mdl.AddFromFile strFileName
' salvarea modulului modificat
DoCmd.Save
End Function

Observa ie. Dac execu ia procedurii în linia care execut prima salvare a modulului are loc în modul pas cu pas, atunci
focusul este în modulul de unde se execut codul i nu în modulul nou creat. În acest fel, Visual Basic va încerca, mai
degrab , salvarea modulului cu focusul i nu a modulului nou creat.

149
Evenimentele unui modul clas

Modulele de clas , care nu sunt asociate cu o form sau un raport, au dou evenimente: Initialize i Terminate.

Evenimentul Initialize se declan eaz la crearea unei noi instan e a obiectului.

Terminate apare atunci când se elimin un obiect utilizator din memorie.

Pentru a crea procedurile de r spuns la evenimente, se deschide modulul clas , se selecteaz Class în boxa Object i
se alege Initialize sau Terminate în lista Procedure.

Evenimentele pot fi utilizate, de exemplu, pentru a ini ializa o variabil la nivel de modul o dat cu crearea obiectului.

Colec ia References

Un obiect Reference reprezint o referin din Microsoft Access la alt proiect sau la o bibliotec de obiecte. Obiectele
Reference sunt con inute în colec ia References, fiecare element din colec ie corespunzând unei referin e selectate în
dialogul References (meniul Tools).

Colec ia References i obiectele Reference pot fi utilizate din Visual Basic pentru a ad uga referin e, pentru a verifica
referin ele existente sau pentru a anula referin ele care nu mai sunt necesare.

Obiectul sau colec ia Este con inut( ) în Con ine

Reference (obiect) References (nimic)

References (colec ie) Application Obiecte Reference

Referirea obiectelor Reference

Un obiect Reference este accesat prin intermediul colec iei References. Un obiect referit poate fi atribuit unei variabile
obiect în mod uzual:

Dim ref As Reference


Set ref = References!VBA
Set ref = References("VBA")
Set ref = References(1) ' de remarcat c numerotarea
' colec iei References începe cu 1

Propriet ile obiectului Reference

Tabelul urm tor prezint pe scurt propriet ile obiectului Reference.

Proprietatea Descriere

BuiltIn Indic dac referin a este implicit , necesar bunei func ion ri a aplica iei Microsoft Access.

Collection Returneaz o referin la colec ia References.

FullPath Returneaz calea i numele de fi ier al proiectului referit sau al bibliotecii de obiecte.

150
GUID Returneaz identificatorul global unic (GUID – Globally Unique Identifier) al proiectului referit sau
al bibliotecii de obiecte. Un GUID este memorat în registry-ul Windows.

IsBroken Indic dac referin a puncteaz c tre o referin valid .

Kind Indic dac obiectul Reference puncteaz la un proiect Visual Basic (valoarea Project sau 1) sau
la o bibliotec (TypeLib sau 0).

Major Returneaz valoarea din stânga punctului zecimal din num rul de versiune al fi ierului referit.

Minor Returneaz valoarea din dreapta punctului zecimal din num rul de versiune al fi ierului referit.

Name Returneaz numele proiectului sau al bibliotecii de obiecte c tre care duce referin a.

Metodele colec iei References

Obiectul Reference nu are asociate metode. Metodele colec iei References sunt

Metoda Descriere

AddFromFile Creeaz o referin la un fi ier care con ine un proiect sau o bibliotec de obiecte.
References.AddFromFile(filename)

AddFromGUID Creeaz o referin la un proiect sau bibliotec de obiecte pornind de GUID-ul fi ierului,
memorat în registry.
Object.AddFromGUID(guid)

Item Returneaz un element particular al colec iei References.

Remove Elimin un obiecte Reference din colec ia References.

Stabilirea unei referin e în Visual Basic

Primele dou metode enumerate în tabelul precedent, AddFromFile i AddFromGUID, permit stabilirea unei referin e în
mod programatic. Urm torul exemplu creeaz o referin în timpul execu iei.

Function AddReference (strFilePath As String) As Boolean


Dim ref As Reference

Const conReferenceExists As Long = 32813


On Error GoTo Error_AddReference
' Adaug o referin la un proiect sau bibliotec de obiecte
Set ref = References.AddFromFile(strFilePath)
AddReference = True

Exit_AddReference:
Exit Function

Error_AddReference:
If Err <> conReferenceExists Then
MsgBox Err & ": " & Err.Description
End If
AddReference = False
151
Resume Exit_AddReference
End Function
Apelul acestei func ii poate fi efectuat dup modelul

Sub SetSolutionsReferences ()
Const strRefPath As String = "C:\Program Files\Microsoft Office" _
& "\Office\Samples\Solutions.mdb"
If AddReference (strRefPath) = True Then
MsgBox "Reference set successfully."
Else
MsgBox "Reference not set successfully."
End If
End Sub

Obiectul DoCmd

Metodele obiectului DoCmd sunt utilizate pentru a executa ac iuni (macro-uri) Microsoft Access din Visual Basic. De altfel,
aceasta este singura utilitate a obiectului DoCmd, acesta neavând propriet i i evenimente.

Sintaxa este

[application.]DoCmd.method [arg1, arg2, ...]

unde

application este obiectul Application, op ional

method este una dintre metodele suportate de obiect

arg1, arg2, ... sunt argumentele metodei selectate.

Omiterea argumentelor care sunt op ionale este echivalent cu acceptarea valorilor implicite ale acestora.

Obiectul DoCmd nu suport metode care corespund cu ac iunile

• AddMenu.
• MsgBox. Se utilizeaz func ia MsgBox.
• RunApp. Se utilizeaz func ia Shell pentru a executa alt aplica ie.
• RunCode. Se execut func ia direct în Visual Basic (instruc iunea Call).
• SendKeys. Se utilizeaz instruc iunea SendKeys.
• SetValue. Se stabile te valoarea direct în Visual Basic (instruc iunea Let).
• StopAllMacros. Se utilizeaz instruc iunile Stop sau End.
• StopMacro. Se utilizeaz instruc iunile Exit Sub sau Exit Function.

Important! Pentru o list complet a ac iunilor, care coincide, excepând cele enumerate, cu lista metodelor obiectului, se
va urma: Help – DoCmd Object – Action Constants (lista alfabetic a ac iunilor) sau actions, reference topics (ac iuni
grupate pe categorii). Pentru explica ii complementare se va urm ri atât subiectul privind metoda cât i subiectul privind
ac iunea sinonim .

Pentru exemplificare prezent m dou metode ale obiectului DoCmd.

152
Metoda OpenForm

Se execut din Visual Basic ac iunea OpenForm. Sintaxa este

DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode]


[, windowmode][, openargs]

unde

formname este un ir cu numele valid al unei forme din baza de date curent . Dac se execut codul înre-o bibliotec ,
forma se va c uta mai întâi în baza de date bibliotec i apoi în baza curent .

view este modul de vizualizare Access i poate avea una din valorile: acDesign, acFormDS, acNormal (default),
acPreview. Valoarea implicit deschide forma în Form view.

filtername este un ir care con ine numele valid al unei interog ri din baza de date curent . wherecondition este un ir
care con ine o clauz valid WHERE SQL, f r cuvântul WHERE.

datamode este una dintre constantele: acFormAdd, acFormEdit, acFormPropertySettings (default), acFormReadOnly.
Argumentul fixeaz modul de acces la date (ad ugare, editare etc.). Argumentele acoper propriet ile AllowEdits,
AllowDeletions, AllowAdditions i DataEntry ale formei, propriet ile sunt considerate în modul implicit
(acFormPropertySettings).

windowmode stabile te modul de afi are a ferestrei formei. Poate fi o constant : acDialog (propriet ile Modal i PopUp
ale formei sunt Yes), acHidden (forma este ascuns ), acIcon (forma este minimizat ), acWindowNormal (valoarea
implicit , forma este afi at potrivit propriet ilor sale).

openargs este un ir utilizat pentru stabilirea propriet ii OpenArgs a formei. Aceast valoare poate fi utilizat ulterior de
cod (de exemplu într-o procedur eveniment). Argumentul este valabil doar în Visual Basic (nu exist pentru ac iunea
sinonim Access).

Metoda RunCommand

Prin aceast metod , aplicabil obiectului Application sau DoCmd, se execut o comand dintr-un meniu predefinit sau
dintr-o bar de unelte. Sintaxa este

[object.]RunCommand command

unde

object este Application sau DoCmd, op ional.

command este o constant intrinsec specificând comanda care se execut .

Lista tuturor constantelor admise ca argument de comand se poate vedea în Help (intrarea RunCommand Method
Constants) sau în Object Browser (Access în lista Project/Library, AcCommand în lista Classes).

Meniurile i barele de unelte construite de utilizator nu pot fi accesate prin metoda RunCommand.

153
Obiectul Screen

Obiectul Screen se refer la forma, raportul, foaia de date (datasheet) sau controlul care are focusul. Acest obiect se
poate utiliza pentru a lucra cu un obiect particular de pe ecran. De exemplu, se poate utiliza proprietatea ActiveForm
pentru a returna o referin la forma din fereastra activ , f r a ti numele formei.

Obiectul Screen nu poate fi utilizat pentru activarea formei, raportului sau controlului. Acest efect se ob ine prin metoda
SelectObject a obiectului DoCmd.

Referirea la Screen atunci când nu exist nici o form activ , raport sau control, produce o eroare de execu ie.

Propriet ile obiectului Screen

Tabelul urm tor con ine propriet ile obiectului Screen.

Proprietatea Descriere

ActiveControl Returneaz o referin la controlul care are focusul.

ActiveDatasheet Returneaz o referin la foaia de date care are focusul.

ActiveForm Returneaz o referin la forma care are focusul.

ActiveReport Returneaz o referin la raportul care are focusul

Application Returneaz o referin la obiectul Application.

MousePointer Stabile te sau întoarce valoarea tipului de pointer al mouse-ului.

Parent Returneaz o referin la obiectul care con ine obiectul Screen.

PreviousControl Returneaz o referin la controlul care a avut anterior focusul.

Tipul de pointer poate fi:

Valoare Explica ie

0 (Default) Forma pointerului este determinat de Microsoft Access

1 Normal Select (Arrow)

3 Text Select (I-Beam)

7 Vertical Resize (Size N, S)

9 Horizontal Resize (Size E, W)

11 Busy (Hourglass)

Potrivit celor spuse anterior, utilizarea obiectului Screen trebuie s implementeze i tratarea erorilor deoarece dac
obiectul a teptat nu are focusul, atunci se produce o eroare. Este de preferat s se utilizeze mai întâi metoda SetFocus
pentru a focaliza obiectul dorit i apoi s se utilizeze Screen. Metoda SetFocus este cea asociat formei, raportului,

154
controlului int . Este interzis utilizarea obiectului Screen cu metoda OutputTo (care produce ie irea unor date pe o
form , raport etc.) a obiectului DoCmd.

Este de notat c proprietatea ActiveForm i proprietatea Me nu produc în mod necesar aceea i referin . Me reprezint
forma în care se execut curent codul, pe când ActiveForm returneaz forma activ pe ecran i care poate fi diferit de
cea în care se execut în acel moment cod Visual Basic. De exemplu, un eveniment Timer poate s apar pe o form
care nu este activ . În acest caz Me este utilizat pentru a referi forma pe care se produce evenimentul Timer iar
ActiveForm se refer la forma activ pe ecran când se produce evenimentul Timer.

Urm torul exemplu utilizeaz evenimentul Timer pentru a interoga forma activ la intervale regulate de timp. Forma în
care se declan eaz evenimentul poate fi sau nu forma activ .

Private Sub Form_Load ()


Me.TimerInterval = 30000
End Sub

Private Sub Form_Timer ()


Const conFormNotActive As Integer = 2475
Const conFormInDesignView As Integer = 2478

On Error GoTo Error_Timer


' reconsult sursa de date pentru forma activ
Screen.ActiveForm.Requery

Exit_Timer:
Exit Sub

Error_Timer:
If Err = conFormNotActive Or Err = conFormInDesignView Then
Resume Exit_Timer
Else
MsgBox Err & ": " & Err.Description
End If
End Sub

Observa ie. Intervalul de timp, din proprietatea TimerInterval este în milisecunde, instruc iunea
Me.TimerInterval = 30000 stabile te prin urmare declan area evenimentului la fiecare 30 de secunde. Stabilirea
intervalului se efectueaz în procedura evenimentului Load.

DAO (Data Access Objects)

Biblioteca de tipuri Microsoft DAO ofer o cale de control a unei baze de date din orice aplica ie care suport Visual Basic
for Applications. Anumite obiecte DAO reprezint structura bazei de date iar altele reprezint datele îns i. Prin
intermediul obiectelor DAO se pot crea i gestiona baze de date locale sau la distan într-o multitudine de formate, se
poate lucra cu datele lor.

În acest capitol se explic cum se pot programa obiectele DAO din aplica iile Microsoft Office.

Lucrul cu obiectele DAO

Obiectele DAO se utilizeaz pentru a lucra în mod programatic cu o baz de date. Principalele ac iuni privesc:

• crearea unei baze de date, modificarea structurii tabelelor, interog rilor, index rilor i rela iilor,

155
• reg sirea, ad ugarea, tergerea sau modificarea datelor din baz ,
• implementarea securit ii datelor,
• lucrul cu date în diferite formate de fi iere i legarea tabelelor din alte baze de date la baza curent ,
• conectarea la baze de date pe servere la distan i construirea de aplica ii client/server.

Observa ie. Pentru a utiliza obiectele DAO, trebuie ca la instalarea pachetului Microsoft Office s se selecteze i boxa de
control Data Access.

Obiectele DAO sunt organizate într-o structur ierarhic . Obiectul DBEngine este de nivelul cel mai înalt i con ine toate
celelalte obiecte i colec ii ale ierarhiei DAO. Urm torul tabel con ine o descriere sumar a obiectelor.

Obiect Descriere

Connection Conectarea prin re ea la o baz de date Open Database Connectivity (ODBC).

Container Informa ii de securitate pentru diferite tipuri de obiecte ale bazei de date.

Database Baza de date deschis .

DBEngine Obiectul cel mai de sus al ierarhiei.

Document Informa ia de securitate pentru obiecte individuale din baza de date.

Error Informa ii de eroare privind accesul la date.

Field Câmp în obiecte TableDef, QueryDef, Recordset, Index, Relation.

Group Contul grupului în baza curent .

Index Indexul tabelei.

Parameter Parametru de interogare.

Property Proprietate a unui obiect.

QueryDef Defini ia unei interog ri salvate în baza de date.

Recordset Mul ime de înregistr ri definite de o tabel sau de o interogare.

Relation Leg tura (rela ia) dintre dou câmpuri de tabel sau interog ri.

TableDef Defini ia unei tabele salvate în baza de date

User Contul utilizatorului în grupul de lucru curent.

Workspace Sesiunea DAO activ .

Proiectarea bazelor de date în Microsoft Access

De i se pot crea baze de date prin VB cu DAO, uneori, pentru baze de date cu oarecare grad de permanen , se poate
alege varianta de

• a proiecta baza de date în mediul Access destinat pentru asemenea opera iuni i

156
• deschiderea bazei cu DAO din alt aplica ie care suport Visual Basic.

La crearea unei baze de date în Access, urm toarele lucruri sunt de re inut.

o Când se deschide un fi ier .mdb creat în Access din alt aplica ie, nu se poate lucra cu forme, rapoarte,
macro-uri sau module Access. Formele i rapoartele trebuiesc proiectate, deasemenea i codul VB, în
aplica ia unde se lucreaz .
o Dac se scrie cod pentru procesarea unei baze de date în Access, codul respectiv nu se va executa în
mod necesar i la copierea în modulele altei aplica ii. Pentru execu ie trebuie, în acest caz, s se
elimine/înlocuiasc toate entit ile specifice Access-ului (obiecte, metode, propriet i sau func ii).
o În Access se utilizeaz func ia CurrentDb pentru a returna o referin la baza de date curent deschis în
fereastra Access. Se poate utiliza DAO pentru a lucra cu aceast baz . Dac se copie acest cod în alt
aplica ie care are Visual Basic, se va modifica textul surs încât s se utilizeze metoda OpenDatabase a
obiectului Workspace.
o Microsoft Access creeaz propriet i suplimentare ale obiectelor DAO. Atunci când se formeaz o baz
cu DAO în Visual Basic i aceast baz este deschis ulterior în microsoft Access, se pot observa i alte
propriet i ad ugate obiectelor. Aceste propriet i sunt i ele enumerate în colec ia Properties a
obiectului DAO.

Stabilirea unei referin e la biblioteca de obiecte DAO

Referin a se poate realiza în mod automat, de exemplu de c tre Microsoft Access, sau manual prin succesiunea uzual :
Visual Basic Editor – meniul Tools – References – selectare Microsoft DAO 3.5 Object Library. Dup stabilirea
referin ei se pot vedea obiectele DAO în Object Browser selectând DAO în lista Project/Library.

Pentru anumite probleme de compatibilitate, pentru proiectele mai vechi, se poate referi Microsoft DAO 2.5/3.5
compatibility library. Proba complet pentru a vedea dac este nevoie de referirea bilbiotecii de compatibilitate este
compilarea codului sub DAO 3.5. Dac nu exist erori rezult c nu este necesar biblioteca de compatibilitate.

Referirea obiectelor DAO în Visual Basic

Obiectele DAO pot fi referite în cod în acela i mod ca orice alt obiect. Deoarece obiectul DBEngine nu are o colec ie,
poate fi referit direct. Celelalte obiecte se vor referi în cadrul colec iilor unde apar in i potrivit locului din ierarhia
deobiecte.

Fiecare obiect poate fi referit într-o colec ie

• prin valoarea propriet ii Name a obiectului respectiv sau


• prin num rul de ordine din colec ie. Obiectele DAO sunt indexate plecând cu 0.

Exemple:

Databases("Salariati")
Databases(0)

Referirea unui obiect Database în cod se realizeaz i prin pozi ionarea în ierarhie:

Dim dbs As Database


Set dbs = DBEngine.Workspaces(0).Databases(0)

157
prin care se ob ine o referin la prima baz de date (indicele 0 din colec ia Databases) din prima zona de lucru (indicele
0 din colec ia Workspaces), zona implicit . De notat c dac se lucreaz într-o aplica ie diferit de Access, atunci trebuie
s se deschid o baz de date cu metoda OpenDatabase mai înainte de a rula codul precedent.

Pentru aplica iile diferite de Access, calificarea obiectelor poate produce mai mult claritate, plus certitudinea referii
corecte:

Dim dbs As DAO.Database

Ad ugarea de noi obiecte DAO la o colec ie

Dup cum s-a precizat deja, anumite obiecte DAO reprezint structura bazei de date, celelalte oferind mijloace de lucru
cu datele din baz . Obiectele care reprezint structura bazei sunt salvate o dat cu baza. În general, obiectele utilizate în
lucrul cu datele din baz nu sunt salvate ci sunt create de fiecare dat când este nevoie de ele.

Crearea unui nou obiect DAO care trebuie salvat cu baza de date se va completa cu utilizarea metodei Append a
colec iei asociate de obiecte salvate.

Exemplul urm tor d o imagine despre acest proces. Exmplul creeaz un nou obiect TableDef (care reprezint o nou
tabel ) cu un nou obiect Field (care reprezint un câmp din noua tabel ). Obiectul Field creat se adaug la colec ia
Fields a noii tabele iar noul obiect TableDef este ad ugat la colec ia TableDefs a obiectului Database care reprezint
baza de date deschis .

Function AddTable () As Boolean


' declara ii
Dim dbs As Database, tdf As TableDef, fld As Field
Const conPath As String = "C:\ …\Northwind.mdb"

On Error GoTo Err_AddTable


' asignarea bazei curente la variabila database
Set dbs = DAO.DBEngine.Workspaces(0).OpenDatabase(conPath)
' crearea noii tabele
Set tdf = dbs.CreateTableDef("ArchivedInvoices")
Set fld = tdf.CreateField("OrderId", dbLong)

' ad ugarea la colec iile adecvate, care se salveaz


tdf.Fields.Append fld
dbs.TableDefs.Append tdf
dbs.Close
AddTable = True

Exit_AddTable:
Exit Function

Err_AddTable:
MsgBox "Error " & Err & ": " & Err.Description
AddTable = False
Resume Exit_AddTable
End Function

Observa ie. În Access se va utiliza CurrentDb pentru a returna o referin la baza de date curent deschis .

158
Lucrul cu date externe

Se poate utiliza DAO pentru lucrul cu diferite formate de baze de date. Exist trei mari categorii de formate de baze de
date accesibile prin DAO.

Prima categorie este caracterizat de formatul Microsoft Jet. Se poate utiliza DAO cu toate bazele de date create cu
Microsoft Jet, incluzând cele create în Microsoft Access, Microsoft Visual Basic, Microsoft Visual C++ i Microsoft Excel.

A doua categorie este caracterizat de formatul ISAM instalabil. Un driver ISAM care se poate instala este un driver care
ofer acces la formate de baze de date externe prin DAO i Microsoft Jet. La instalarea aplica iei se poate cere instalarea
oric rui driver pentru formatele:

• Microsoft FoxPro
• dBase
• Paradox
• Microsoft Excel
• Microsoft Exchange/Outlook
• Lotus 1-2-3
• Date tabelare în fi iere HTML
• etc.

A treia categorie de formate de baze de date accesibile prin DAO este sursa de date Open Database Connectivity
(ODBC). Sursele de date ODBC, cum ar fi Microsoft SQL Server 4.2 i mai mari, necesit un driver ODBC. Adesea o
surs de baze ODBC este pe un server de re ea, adic ODBC este util pentru dezvoltarea aplica iilor client/server.
Urm toarea sec iune trateaz subiectul mai pe larg.

Utilizare DAO cu surse de date ODBC

Exist dou moduri diferite de utilizare DAO cu ODBC: – prin Microsoft Jet, sau – prin noua tehnologie numit
ODBCDirect.

Dac se lucreaz cu o baza de date creat cu Microsoft Jet database engine sau într-un format extern suportat de un
driver instalabil ISAM, toate opera iunile DAO sunt procesate prin Microsoft Jet.

Dac se lucreaz cu o surs de date ODBC, opera iunile DAO se pot procesa fie prin Microsoft Jet, fie prin ODBCDirect
care ocole te motorul Microsoft Jet i lucreaz direct cu datele în sursa ODBC. Alegerea este în func ie de tipul de
opera iuni efectuate.

Se poate utiliza DAO cu Microsoft Jet, pentru surse ODC, atunci când sunt necesare avantajele Jet: abilitatea de a crea
sau modifica obiecte, unirea datelor din mai multe formate de baze de date.

Se poate utiliza ODBCDirect atunci când se execut interog ri sau proceduri memorate pe un server back_end cum ar fi
Microsoft SQL Server, sau când aplica ia client unde se lucreaz necesit capacit ile specifice ODBC cum ar fi
actualiz ri în loturi sau interog ri asincrone. ODBC poate efectua anumite opera iuni client/server mult mai repede.

Deoarece nu toate posibilit ile DAO sunt accesibile cu ODBCDirect, Microsoft DAO mai suport înc ODBC prin
Microsoft Jet. Se poate astfel utiliza ODBC prin Microsoft Jet, prin ODBCDirect, sau prin ambele cu o singur surs de
date ODBC.

Metoda care este utilizat în accesarea unei surse ODBC este determinat de tipul spa iului de lucru în care se lucreaz .
Un spa iu de lucru, reprezentat printr-un obiect Workspace, este o sesiune deschis pentru un cont utilizator particular. O
sesiune marcheaz o succesiune de opera ii efectuate de motorul de baze de date, începe cu intrarea (log on)

159
utilizatorului i se termin la ie irea utilizatorului (log off). Opera iunile pe care un utilizator le poate executa în timpul unei
sesiuni sunt determinate de drepturile conferite acelui utilizator. Dac nu se specific tipul spa iului de lucru, DAO
creeaz un spa iu în mod implicit.

Cu DAO 3.5 se poate crea oricare dintre cele dou spa ii de lucru pentru opera ii ODBC. În spa iul Microsoft Jet se
utilizeaz accesul prin Jet, în spa iul ODBCDirect se va utiliza cealalt posibilitate. Fiecare spa iu de lucru are propriul
model de obiecte i vor fi prezentate în continuarea capitolului.

Utilizare DAO cu Microsoft Jet

Spa iile de lucru Microsoft Jet includ obiecte pentru definirea structurii bazei de date, cum ar fi TableDef, QueryDef,
Field, Index, Parameter i Relation. Alte obiecte, cum ar fi Recordset, sunt utile pentru procesarea datelor din baz . O
a treia categorie de obiecte, cum ar fi User, Group, Container i Document, servesc pentru asigurarea securit ii
datelor.

Pentru a vedea întreaga ierarhie de obiecte pentru spa iul de lucru Microsoft Jet se va selecta Help (Microsoft Access
Programming and Language References) – Microsoft Data Access Objects (DAO) – "Data Access Object Model for
Microsoft Jet Workspaces".

In schema urm toare este prezentat doar partea superioar a ierarhiei. La prezentarea fiec rui obiect se vor aduce
unele explica ii suplimentare.

Se observ c obiectul de nivel cel mai înalt, DBEngine, nu apar ine unei colec ii, deci poate fi referit direct. Toate
celelalte obiecte sunt referite prin colec ia la care apar in. S ge ile f r obiect terminal puncteaz c tre structuri
nereprezentate în figur .

Obiectul DBEngine

Obiectul DBEngine, de nivel maxim în ierarhia de obiecte DAO, este obiectul implicit al modelului, astfel încât
men ionarea lui explicit poate fi omis în multe situa ii.

Pe nivelul imediat inferior al ierarhiei se g sesc dou colec ii: Workspaces – spa iile de lucru, Errors – erorile ap rute în
timpul unei opera iuni DAO. Colec ia Workspaces este implicit i referin a la ea poate fi omis .

O referin la primul obiect Workspace din colec ia Workspaces poate fi ob inut prin una din instruc iunile

Set wrk = DBEngine.Workspaces (0)


Set wrk = DBEngine (0)
Set wrk = Workspaces (0)

în care se observ prezen a op ional a obiectelor implicite.

Propriet ile obiectului DBEngine sunt prezentate în tabelul urm tor.

Proprietatea Descriere

DefaultType Long, determin tipul spa iului de lucru:


dbUseJet –Microsoft Jet database engine
dbUseODBC – ODBC data source

DefaultUser, iruri, numele utilizatorului i parola


DefaultPassword

160
IniPath ir, informa ia despre cheia din Windows Registry care con ine valorile pentru Microsoft Jet
database engine (numai spa iile de lucru Microsoft Jet).

LoginTimeout Întreg, timpul cât se a teapt intrarea unu utilizator.

SystemDB ir, calea pentru localizarea curent a fi ierului cu informa ia despre grupurile de lucru,
workgroup (doar spa ii Microsoft Jet).

Version ir, informa ii despre versiunea DAO.

Dac nu se creeaz un obiect Workspace specific, un asemenea obiect este creat în mod automat de DAO atunci când
este necesar. Atributele implicite ale acestui spa iul sunt DefaultUser egal cu Admin iar DefaultPassword egal cu irul
vid "".

În mod implicit, proprietatea DefaultType are valoarea dbUseJet i spa iul de lucru este Microsoft Jet. Proprietatea poate
fi acoperit pentru un spa iu particular prin tipul precizat la crearea acestuia.

Metodele obiectului DBEngine sunt

Metoda Descriere

BeginTrans, Metodele care controleaz efectuarea tranzac iilor.


CommitTrans,
Rollback

CompactDatabase, Compactarea bazei de date, refacerea unei baze deteriorate.


RepairDatabase

CreateDatabase, Crearea unei baze de date sau a unui spa iu de lucru.


CreateWorkspace

Idle Suspend procesarea datelor din baz

OpenConnection, Deschide i returneaz o referin la un obiect Connection, respectiv Database.


OpenDatabase

RegisterDatabase Completeaz în Windows Registry informa ia ODBC.

SetOption Înlocuie te temporar valorile din Windows Registry pentru spa iile Microsoft Jet

Unele metode sunt prezentate în continuare. Pentru mai multe informa ii despre func iuni i parametri se vor vedea
intr rile respective din DAO Help.

Colec ia Workspaces

Obiectul DAO Workspace define te o sesiune pentru un utilizator, bazat pe permisiunile (drepturile) utilizatorului. Se
utilizeaz obiectul Workspace pentru a gestiona sesiunea curent . Workspace con ine bazele de date deschise i ofer
mecanismul necesar tranzac iilor i securit ii aplica iei. Colec ia Workspaces con ine toate obiectele active Workspace
din DBEngine, care au fost ad ugate colec iei.

La începutul lucrului cu obiecte DAO din Visual Basic, DAO creeaz în mod automat un spa iu implicit. Referirea la
acesta se realizeaz prin

161
Dim wrk As Workspace
Set wrk = Workspaces (0)

adic se refer primul obiect din colec ie.

Spa iile de lucru DAO pot fi partajate sau ascunse. Un spa iu este ascuns pân când utilizatorul îl marcheaz drept
partajat prin ad ugarea obiectului Workspace la colec ia Workspaces. Dup ad ugare, spa iul este accesat prin
intermediul colec iei. Un obiect Workspace necesar doar pentru o procedur particular se poate crea dar f r
ad ugarea la colec ia Workspaces.

Dup cum s-a mai spus, exist dou tipuri de obiecte Workspace: Microsoft Jet i ODBCDirect. În Microsoft Jet se poate
utiliza DAO cu motorul de baze de date Microsoft Jet pentru a accesa date din baze de date Microsoft Jet, surse de date
ISAM instalabile i surse de date ODBC. Într-un spa iu ODBCDirect, se poate utiliza DAO pentru a accesa date din surse
ODBC f r a trece prin motorul Jet. Într-o aceea i aplica ie se poate lucra cu ambele tipuri de spa ii de lucru.

Crearea unui spa iu Microsoft Jet

Se utilizeaz metoda CreateWorkspace a obiectului DBEngine. Exemplul urm tor utilizeaz constanta de tip dbUseJet.
Dac proprietatea DefaultType este fixat pe dbUseJet, atunci argumentul de tip nu este necesar i se creeaz în mod
automat un spa iu Microsoft Jet.

Dim wrk As Workspace


Set wrk = CreateWorkspace("JetWorkSpace", "Admin", "", dbUseJet)

noul spa iu fiind pentru utilizatorul Admin i f r parol .

Noul spa iu de lucru nu este ad ugat în mod automat la colec ia Workspaces, pentru aceasta se va utiliza metoda
Append a colec iei. Acest lucru este necesar atunci când spa iul nou definit este utilizat i în afara procedurii unde a fost
creat.

Metoda CreateWorkspace (obiectul DBEngine)

Sintaxa

Set workspace = CreateWorkspace(name, user, password, type)

unde

workspace este o variabil obiect care reprezint obiectul Workspace care se creeaz .

name este irul care con ine numele unic al obiectului. Începe cu o liter , are lungimea maxim 20.

user identific proprietarul noului obiect Workspace.

password con ine parola pentru noul obiect Workspace, un ir pân la 14 caractere cu excep ia lui null.

type este op ional i stabile te tipul spa iului (dbUseJet, dbUseODBC)

Dup utilizarea metodei este creat obiectul Workspace, începe o nou sesiune i obiectul poate fi referit în cod.
Obiectele Workspace nu sunt permanente, nu se pot salva iar proprietatea Name nu mai poate fi modificat dup
trecerea obiectului în colec ia Workspaces.

162
Dac tipul este stabilit la dbUseODBC i nu exist deja create spa ii Jet, atunci motorul Jet nu este înc rcat în memorie
i toat activitatea se efectueaz cu sursa de date ODBC identificat în obiectul Connection.

Pentru a elimina un obiect Workspace din colec ia Workspaces, se închid toate bazele de date i conexiunile i apoi se
utilizeaz metoda Close a obiectului Workspace.

Colec ia Errors (obiectul DBEngine)

Un obiect Error con ine informa ia despre o eroare ap rut în timpul unei opera iuni DAO. Apari ia mai multor erori în
aceea i opera iune se reflect în obiecte Error distincte, mul imea acestora formând colec ie Errors. Atunci când o nou
opera iune genereaz o eroare, colec ie Errors este golit i completat cu noile erori. Opera iunile DAO care nu
genereaz erori nu au efect asupra colec iei Errors.

Erorile sunt indexate în colec ie în ordinea cresc toare a nivelelor de eroare. Nivelul cel mai înalt (deci ultimul obiect din
colec ie) este eroare raportat de VBA, identic cu eroarea raportat de obiectul VBA Err.

Colec ia Errors are:

• proprietatea Count, care d num rul elementelor din colec ie


• metoda Refresh, care actualizeaz colec ia potrivit situa iei curente.

Obiectul Error nu are decât propriet ile (nu con ine metode sau colec ii)

• Description, irul care con ine descrierea erorii


• HelpContext, este un Long cu identificatorul de context din fi ierul Help asociat
• HelpFile, con ine calea complet c tre fi ierul Help
• Number, num rul (Long) al erorii. Pentru o list complet se va vedea intrarea Trappable Microsoft Jet and DAO
Errors din Help.
• Source, un ir con inând numele obiectului sau aplica iei care a generat eroarea.

Colec ia Databases

Obiectul Database reprezint o baz de date deschis . Aceast poate fi o baz Jet sau o surs extern de date. Colec ia
Databases con ine toate bazele de date deschise curent.

Situarea în ierarhie este

Obiectul sau colec ia Este con inut în Con ine

Database (obiect) Colec ia Databases Colec ia Containers Colec ia QueryDefs


Colec ia Properties Colec ia Recordsets
Colec ia Relations Colec ia TableDefs

Databases (colec ie) Obiectul Workspace Obiecte Database

Deschiderea unei baze de date

Metoda OpenDatabase, a obiectului DBEngine sau a obiectului Workspace, deschide o baz de date i returneaz o
referin la obiectul care o reprezint . Utilizarea metodei cu obiectul DBEngine deschide baza de date în spa iul de lucru
implicit, ca în exemplul urm tor

163
Function RetrieveRecordset (strDbName As String, strSource As String ) As Boolean
Dim dbs As Database
Dim rst As Recordset

On Error GoTo Err_RetrieveRecordset


Set dbs = OpenDatabase (strDbName)
Set rst = dbs.OpenRecordset(strSource, dbOpenDynaset)
' se prelucreaz înregistr rile din recordset

RetrieveRecordset = True

Exit_RetrieveRecordset:
rst.Close
dbs.Close
Exit Function

Err_RetriveRecordset:
MsgBox "Eroare " & Err & ": " & Err.Description
RetrieveRecordset = False
Resume Exit_RetriveRecordset
End Function

În Microsoft Access, se utilizeaz func ia CurrentDb pentru a returna o referin la baza de date curent . Metoda
OpenDatabase se utilizeaz pentru deschiderea altei baze de date decât cea curent deschis sau pentru a deschide
baze în spa iul de lucru ODBCDirect.

Dim dbs As Database


Set dbs = CurrentDb
Debug.Print dbs.Name

Crearea cu DAO a duplicatelor unei baze de date (database replicas)

Diferite necesit i de arhivare sau de lucru în re ea impun crearea i gestionarea unor copii ale unei baze de date. Una
dintre copii este desemnat drept Design Master, celelalte copii find denumite duplicate sau replici. Replicile pot fi
men inute pe aceea i ma in sau pe ma ini diferite.

Ad ugarea, modificarea sau tergerea obiectelor se poate efectua doar în Design Master. Datele pot fi modificate în
Design Master i în orice replic a bazei de date. Atunci când un utilizator modific date dintr-o baz duplicat , utilizatorii
celorlalte replici pot s - i sincronizeze replicile, astfel încât acelea i date s fie în toate copiile.

Se poate utiliza DAO pentru a face o baz replicabil , pentru a crea replici, le sincroniza i gestiona mul imea replicilor.
Se pot crea, de asemenea, replici par iale care con in doar o submul ime de înregistr ri dintr-o replic total . Utilizarea
replicilor par iale permite sincronizarea unei replici doar cu datele necesare i nu cu întreaga baz de date.

Pentru ca o baz de date s admit replici trebuie s se fixeze proprietatea Replicable sau proprietatea ReplicableBool
a obiectului Database corespunz tor. Aceste propriet i nu exist pentru obiectul Database pân când nu sunt create
prin metoda CreateProperty i ad ugate la colec ia Properties. Dup permiterea replic rilor, crearea unei baze duplicat
se realizeaz prin metoda MakeReplica.

Diferen a dintre propriet ile Replicable i ReplicableBool este de valori: prima are o valoare ir, a doua o valoare
logic .

Urm torul exemplu creeaz manual o copie a bazei de date, o face replicabil i creeaz o replic a bazei.

164
Function ReplicateDatabase (strDBName As String) As Boolean
Dim dbs As Database, prp As Property
Dim strBackup As String, strReplica As String
Const conPropNotFound As Integer = 3270
On Error GoTo Err_ReplicateDatabase
If InStr(strDBName, ".mdb") > 0 Then
strBackup = Left(strDBName, Len(strDBName) - 4)
Else
strBackup = strDBName
End If

strReplica =strBackup & "Replica" & ".mdb"


If MsgBox("Make backup copy of file?", vbOKCancel) = vbOK Then
strBackup = strBackup & ".bak"
FileCopy strDBName, strBackup
MsgBox "Copied file to " & "strBackup"
End If

Set dbs = OpenDatabase (strDBName, True)


dbs.Properties("ReplicaBool") = True
dbs.MakeReplica strReplica, "Replica of " & strDBName
MsgBox "Created replica '" & strReplica & "'."
dbs.Close
ReplicateDatabase = True

Exit_ReplicateDatabase:
Exit Function

Err_ ReplicateDatabase:
If Err = conPropNotFound Then
Set prp = dbs.CreateProperty("ReplicableBool", dbBoolean, True)
dbs.Properties.Append prp
Resume Next
Else
MsgBox "Error " & ": " & Err.Description
End If
ReplicateDatabase = False
Resume Exit_ReplicateDatabase
End Function

Colec ia TableDefs

Un obiect TableDef reprezint defini ia memorat a unei tabele din baz sau a unei tabele legate din spa iul de lucru
Microsoft Jet. Toate obiectele TableDef memorate într-o baz de date formeaz colec ia TableDefs. Rela iile din ierarhie
sunt

Obiectul sau Este con inut în Con ine


colec ia

TableDef (obiect) Colec ia TableDefs Colec ia Fields


Colec ia Indexes
Colec ia Properties

TableDefs (colec ie) Obiectul Database Obiecte TableDef

165
Crearea prin cod a unei tabele

Metoda de creare este CreateTableDef a obiectului Database. Dup crearea unui nou obiect TableDef, dar înainte de
ad ugarea la baz , trebuie s se defineasc unul sau mai multe câmpuri pentru tabela definit . Sintaxa metodei
CreateTableDef este

Set tabledef = database.CreateTableDef (name, attributes, source, connect)

unde

tabledef este o variabil obiect reprezentând obiectul TableDef care se creeaz .

database este o variabil obiect reprezentând obiectul Database unde se dore te crearea noului obiect.

name este un ir op ional, care con ine denumirea tabelei.

attributes este o constant sau o combina ie de constante indicând caracteristici ale tabelei. Lista este în Help - TableDef
object - Attributes Property.

source este un Variant (subtip String), op ional. Con ine numele tabelei în baza de date extern care este sursa datelor.
irul devine proprietatea SourceTableName a noului obiect.

connect, un Variant (subtip String), op ional. Con ine informa ia despre sursa unei baze deschise, o baz de date utilizat
într-o interogare pass-through, sau o tabel legat . La proprietatea Connect se pot g si mai multe informa ii.

Argumentele care se omit la crearea tabelei se vor asigna prin propriet i înainte de ad ugarea obiectului la colec ie.
Dup aceea nu mai sunt disponibile toate propriet ile.

Pentru eliminarea unui obiect TableDef se utilizeaz metoda Delete a colec iei TableDefs.

Urm torul exemplu realizeaz crearea unei tabele pentru baza de test Northwind.

Function CreateErrorsTable () As Boolean


Dim dbs As Database, tdf As TableDef, fld As Field, idx As Index
Dim rst As Recordset, intCode As Integer, strErr As String
Const conAppObjErr = "Application-defined or object-defined error"

' creeaz tabela Errors cu câmpurile ErrorCode i ErrorString


Set dbs = CurrentDb

On Error Resume Next


' tergerea unei tabele Errors existente
dbs.TableDefs.Delete "Errors"

On Error GoTo Error_CreateErrorsTable


' crearea tabelei
Set tdf = dbs.CreateTableDef("Errors")
' creare câmpuri
Set fld = tdf.CreateField("ErrorCode", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("ErrorString", dbMemo)
tdf.Fields.Append fld

166
' creare index
Set idx = tdf.CreateIndex("ErrorCodeIndex")
Set fld = idx.CreateField("ErrorCode")
With idx
.Primary = True
.Unique = True
.Required = True
End With
idx.Fields.Append fld
tdf.Indexes.Append idx

' deschidere recordset în tabela Errors


Set rst = dbs.OpenRecordset("Errors")
' stabilirea indexului pentru recordset
rst.Index = "ErrorCodeIndex")

' ar tarea pointerului clepsidr


DoCmd.Hourglass True

' ciclarea în codurile de eroare


For intCode = 1 To 32767
On Error Resume Next
strErr = ""
' tentativa de apari ie a une erori
Err.Raise intCode
' verificarea dac eroarea este VBA, DAO sau Access
' dac eroarea nu este VBA, atunci proprietatea Description a obiectului
'Err con ine textul "Application-defined or object-defined error"
If Err.Description <> conAppObjErr Then
strErr = Err.Description
' se utilizeaz metoda AccessError pentru returnarea irului descriptiv
' pentru erorile DAO i Access.
ElseIf AccessError(intCode)<>conAppObjErr Then
strErr = AccessError(intCode)
End If

' dac num rul de eroare are un ir descriptiv, se adaug la tabela definit
If Len(strErr) > 0 Then
'Ad ugarea noii înregistr ri la recordset
rst.AddNew
' ad ugarea num rului erorii la tabel
rst!ErrorCode = intCode
' ad ugarea irului descriptiv
rst!ErrorString.AppendChunk strErr
' actualizare înregistrare
rst.Update
End If
Next intCode

DoCmd.Hourglass False
' închidere recordset
rst.Close
MsgBox "Errors table created"
' ar tarea noii tabele în fereastra Database (din Access)
RefreshDatabaseWindow

167
CreateErrorsTable = True

Exit_CreateErrorsTable:
Exit Function

Error_CreateErrorsTable:
MsgBox Err & ": " & Err.Description
CreateErrorsTable = False
Resume Exit_CreateErrorsTable
End Function

Legarea unei tabele la o baz de date

Pentru a utiliza într-o baz de date tabele dintr-o surs de date extern , aceasta trebuie legat la baza de date. Se pot
lega tabele care sunt în alt baz de date Microsoft Jet, sau tabele din alte programe i formate de fi iere, cum ar fi
Microsoft Excel, dBase, Microsoft FoxPro etc. Acest mod este mai eficient decât s se deschid baza de date extern
direct, mai ales dac tabela vine dintr-o surs de date ODBC.

Pentru a lega o tabel la o baz de date, se utilizeaz metoda CreateTableDef pentru a crea o nou tabel . Dup aceea
se specific valorile pentru propriet ile Connect i SourceTableName ale noului obiect creat. Se poate stabili de
asemenea proprietatea Attributes. În final se adaug tabela la colec ia TableDefs.

Urm torul exemplu leag o foaie de calcul Excel 8.0 ca o tabel la o baz de date. Înainte de executarea unui astfel de
exemplu trebuie s ne convingem c pe sistem este instalat driverul Microsoft Excel ISAM (Msexcl35.dll). Acest driver
permite fi ierelor Excel 97 s lucreze cu Microsoft Jet database engine.

Function LinkExcelTable() As Boolean


Dim dbs As DAO.Database, tdf As DAO.TableDef

Const errNoISAM As Integer = 3170


Const conPath As String = _
"C:\Program Files … \Northwind.mdb"

On Error GoTo Err_LinkExcelTable


' returneaz o referin la baza de date Northwind
Set dbs = OpenDatabase(conPath)
' creeaz un nou obiect TableDef
Set tdf = dbs.CreateTableDef("LinkedTable")
' specific domeniul care este tabela surs
tdf.SourceTableName = "DataRange"
' specific irul de conectare
tdf.Connect = "EXCEL 8.0; DATABASE=C:\My Documents\XLTable.xls"
' ad ugarea noului obiect la colec ie
dbs.TableDefs.Append tdf
LinkExcelTable = True

Exit_LinkExcelTable:
Exit Function

Err_LinkExcelTable:
If Err = errNoISAM Then
Dim strErr As String
strErr = Err & ": " & Err.Description
strErr = strErr _
& " You may not have the ISAM driver installed properly …"
168
MsgBox strErr, vbOKOnly, "Error!"
Else
MsgBox "Error " & Err & ": " & Err.Description
End If
End Function

Colec ia Fields

În spa iul de lucru Microsoft Jet, obiectul Field reprezint un câmp dintr-o tabel , interogare, index, rela ie sau recordset.
Colec ie Fields con ine toate obiectele Field asociate, respectiv, obiectele TableDef, QueryDef, Index, Relation sau
Recordset.

Localizarea în ierarhia de obiecte este

Obiectul sau Este con inut în Con ine


colec ia

Field (obiect) Colec ia Fields Colec ia Properties

Fields (colec ie) Obiectul TableDef Obiecte Field


Obiectul Index
Obiectul QueryDef
Obiectul Recordset
Obiectul Relation

Colec ia Fields este colec ia implicit a unui obiect TableDef, QueryDef, Index, Relation sau Recordset, ceea ce
înseamn c nu trebuie f cut o referin la colec ie în mod explicit. De exemplu, urm toarele instruc iuni returneaz o
referin la câmpul LastName din tabela Employees din baza de date de test Northwind.

Dim dbs As Database, tdf As TableDef, fld As Field


Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"
Set dbs = OpenDatabase(conPath)
Set tdf = dbs.TableDefs("Employees")
Set fld = tdf!LastName

În colec ia Fields a unui obiect TableDef, QueryDef, Index sau Relation, obiectul Field este o unitate structural . El
reprezint o coloan dintr-o tabel , având un tip particular de date. Dac se creeaz o baz de date în Microsoft Access,
se pot crea câmpuri pentru toate aceste obiecte i s se fixeze propriet ile lor în mediul Access i nu este necesar
utilizarea program rii în acest scop.

Într-un obiect Recordset, un obiect Field con ine date i poate fi utilizat pentru a citi date dintr-o înregistrare sau scrie
date într-o înregistrare. În interfa a utilizator Access nu se poate lucra, totu i, cu câmpurile obiectului Recordset; trebuie
s se fac apel la DAO.

Colec ia Fields a obiectului TableDef con ine toate câmpurile definite. Pentru un obiect QueryDef, colec ia con ine toate
câmpurile incluse în interogare din una sau mai multe tabele. Colec ia Fields a obiectului Index include câmpurile pentru
care este definit indexul.

Pentru un obiect Relation, colec ia con ine câmpurile implicate în rela ie. Tipic, exist dou câmpuri în colec ia Fields:
unul care este cheia primar , specificat de proprietatea Table a obiectului Relation; al doilea este câmpul extern
corespunz tor, din tabela specificat de proprietatea ForeignTable a obiectului Relation.

169
Colec ia Fields a obiectului Recordset con ine câmpurile specificate în argumentul source a metodei OpenRecordset.
Argumentul source specific sursa înregistr rilor pentru noul obiect Recordset i poate fi un nume de tabel , nume de
interogare sau o instruc iune SQL care returneaz înregistr ri.

Proprietatea Value a obiectului Field se aplic doar unui obiect din colec ia Fields a unui obiect Recordset. Proprietatea
returneaz valoare datei memorate în acel câmp în înregistrarea curent . Deoarece Value este proprietatea implicit a
obiectului Field iar Fields este colec ia implicit a obiectului Recordset, se poate returna valoarea unui câmp f r a
specifica explicit fie Fields, fie Value. Exemplul urm tor este sugestiv în acest sens:

Dim dbs As Database, rst As Recordset


Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"
Set dbs = OpenDatabase(conPath)
Set rst = dbs.OpenRecordset("Employees")
' referin a explicit la colec ie i valoare
Debug.Print rst.Fields("LastName").Value
' referin explicit la valoare
Debug.Print rst!FirstName.Value
' referin e implicite
Debug.Print rst!Title

Colec ia Indexes

Un obiect Index reprezint un index dintr-o tabel a bazei de date, în spa iul de lucru Microsoft Jet. Colec ia Indexes
con ine toate obiectele Index definite pentru o tabel particular .

Pozi ia în ierarhia de obiecte este urm toarea:

Obiectul sau colec ia Este con inut în Con ine

Index (obiect) Colec ia Indexes Colec ia Fields


Colec ia Properties

Indexes (colec ie) Obiectul TableDef Obiecte Index

Un index m re te viteza de c utare i sortare a tabelei. Se poate îmbun t i performan a interog rii bazei de date prin
indexarea câmpurilor pe ambele p r i ale jonc iunilor, câmpuri care sunt sortate, sau câmpuri care sunt utilizate drept
criterii de interogare. Totu i, indexurile pot s m reasc dimensiunea bazei i s încetineasc performan a când se
actualizeaz câmpuri indexate, când se adaug sau se elimin date. Performan a poate fi redus i în cazul aplica iilor
multiuser. Din aceste motive utilizarea indexurilor va fi f cut cu aten ie.

Un index specific ordinea în care înregistr rile sunt accesate din tabelele bazei de date într-un obiect Recordset de tip
tabel .

Pentru a crea un index cu DAO, opera iune posibil pentru unul sau mai multe câmpuri, trebuie

o metoda CreateIndex pentru obiectul TableDef.


o metoda CreateField pentru obiectul Index cu scopul creerii unui obiect Field pentru fiecare câmp
(coloan ) care se include în obiectul Index.
o Stabilirea propriet ilor obiectului Index.
o Metoda Append pentru fiecare obiect Field care se adaug la colec ia Fields.
o Metoda Append pentru ad ugarea noului obiect Index la colec ia Indexes.

170
Urm torul exemplu este ilustrativ.

Sub SeekRecord ()
Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"
Dim dbs As Database, tdf As TableDef, idx As Index
Dim fld As Field, fldLast As Field, fldFirst As Field
Dim rst As Recordset

' returnarea unei referin e la baza de date Northwind


Set dbs = DBEngine().OpenDatabase(conPath)
' returnarea unei referin e la tabela Employees
Set tdf = dbs.TableDefs("Employees")
' crearea unui index nou pe câmpurile LastName i FirstName
Set idx = tdf.CreateIndex("FirstLastName")
' crearea câmpurilor din index
Set fldLast = idx.CreateField("LastName", dbText)
Set fldFirst = idx.CreateField("FirstName", dbText)
' ad ugarea obiectelor Field
idx.Fields.Append fldLast
idx.Fields.Append fldFirst
' fixarea propriet ii Required
idx.Required = True
' ad ugarea noului obiect index
tdf.Indexes.Append idx
' deschiderea recordset-ului de tip tabel
Set rst = dbs.OpenRecordset("Employees")
' fixarea propriet ii Index a obiectului Recordset
rst.Index = idx.Name
' efectuarea opera iunii de c utare
rst.Seek "=", "King", "Robert"
' tip rirea valorilor tuturor câmpurilor cu excep ia câmpului Photo
For Each fld In rst.Fields
If fld.Type <> dbLongBinary Then
Debug.Print fld
End If
Next fld
End Sub

Observa ie. În mediul Microsoft Access se poate lucra cu mul imea indexurilor în meniul View, comanda Indexes.

Colec ia QueryDefs

Printr-o interogare în elegem o opera iune, formalizat , prin care este returnat o mul ime de înregistr ri care satisfac
cerin e impuse sau se execut o ac iune specific asupra unei mul imi de înregistr ri selectate dup cerin ele din
interogare.

Un obiect QueryDef reprezint o interogare în DAO. Obiectele QueryDef pot fi salvate cu baza de date în Microsoft Jet
sau pot fi temporare în ODBCDirect i Jet.

Rela iile în ierarhia de obiecte DAO sunt

Obiectul sau colec ia Este con inut în Con ine

171
QueryDef (obiect) Colec ia QueryDefs Colec ia Fields
Colec ia Parameters
Colec ia Properties

QueryDefs (colec ie) Obiectul Database Obiecte QueryDef

Obiectele QueryDef ofer :

• folosirea propriet ii SQL pentru a fixa sau returna defini ia interog rii;
• folosirea colec iei Parameters pentru a fixa sau returna parametrii interog rii;
• utilizarea propriet ii Type pentru a determina dac interogarea selecteaz înregistr rile dintr-o tabel existent ,
creeaz o nou tabel etc.;
• utilizarea propriet ii MaxRecords pentru a limita num rul de înregistr ri returnate de o înregistrare;
• folosirea propriet ii ODBCTimeout pentru a indica timpul de a teptare a rezultatului unei interog ri.

În spa iul de lucru Microsoft Jet mai sunt posibile:

• utilizarea propriet ii ReturnRecords pentru a indica, la interog ri prin SQL, returnarea de înregistr ri;
• utilizarea propriet ii Connect pentru a realiza o interogare a unei baze ODBC prin SQL.

În spa iul ODBCDirect sunt specifice

• utilizarea propriet ii Prepare pentru a determina dac se invoc ODBC SQLPrepare API la executarea
interog rii;
• utilizarea propriet ii CacheSize pentru depozitarea (cache) înregistr rilor returnate de interogare.

Obiectele QueryDef temporare nu sunt salvate pe disc i nu sunt ad ugate la colec ia QueryDefs. În general, interog rile
temporare sunt utile atunci când frazele SQL sunt create, repetat, în timpul execu iei.

Un obiect QueryDef permanent din spa iul Jet poate fi gândit ca o instruc iune SQL compilat . Astfel, interogarea este
mai rapid decât o instruc iune SQL executat prin metoda OpenRecordset.

Pentru a crea un obiect QueryDef se utilizeaz metoda CreateQueryDef.

În spa iul Jet, dac se precizeaz numele noului obiect se creeaz un obiect QueryDef permanent i care este ad ugat
automat la colec ia QueryDefs i salvat în disc. Dac se d implicit sau explicit un nume vid, "", atunci rezultatul este un
obiect QueryDef temporar.

În spa iul ODBCDirect o interogare este întotdeauna temporar .

Colec ia QueryDef con ine toate obiectele QueryDef deschise. Când o interogare este închis , ea este înl turat
automat din colec ia QueryDef.

Referin a la un obiect permanent QueryDef este uzual , prin intermediul colec iei:

QueryDefs(0)
QueryDefs("name")
QueryDefs![name]

Referin a la obiectele temporare QueryDef se poate ob ine doar prin variabilele obiect la care s-au asignat interog rile.

172
Crearea interog rilor permanente

Interog rile permanente, salvate împreun cu baza de date, pot fi create în Visual Basic cu DAO sau în interfa a utilizator
din Microsoft Access.

Exemplul urm tor constituie un model pentru crearea unei interog ri.

Const conPath As String = _


"C:\Program Files\ … \Northwind.mdb"
Dim dbs As Database, qdf As QueryDef, rst As Recordset
Dim strSQL As String

strSQL = "SELECT FirstName, LastName, LastName, HireDate FROM Employees " _


& "WHERE Title = 'Sales Representative' ORDER BY HireDate;"
Set dbs = OpenDatabase(conPath)
Set qdf = dbs.CreateQueryDef("Sales Representatives", strSQL)
Set rst = qdf.OpenRecordset

Obiectul QueryDef nou creat nu trebuie ad ugat la colec ia QueryDefs, deoarece prin specificarea unei valori nenule a
argumentului name se creeaz o interogare permanent i aceasta este ad ugat automat la colec ie. Un nume nul ar
duce la crearea unei interog ri temporare (în spa iul ODBCDirect toate obiectele QueryDef sunt întotdeauna temporare).

Colec ia Parameters (QueryDef Object)

Un obiect Parameter reprezint o valoare transmis unei interog ri. Colec ia Parameters con ine toate obiectele
Parameter definite de un obiect QueryDef. Localizarea în ierarhia de obiecte DAO este precizat în tabelul al turat.

Obiectul sau colec ia Este con inut în Con ine

Parameter (obiect) Colec ia Parameters Colec ia Properties

Parameters (colec ie) Obiectul QueryDef Obiecte Parameter

Dac se dore te ca utilizatorul sau aplica ia s ofere o valoare în timpul execu iei, prin care s se limiteze mul imea
înregistr rilor returnate de o interogare, aceasta se realizeaz prin definirea parametrilor interog rii.

Pentru a crea un parametru se utilizeaz declara ia SQL PARAMETERS. Sintaxa declara iei este:

PARAMETERS name datatype [, name datatype [, …]]

Declara ia PARAMETERS precede restul instruc iunii SQL i este separat prin caracterul ";", dup exemplul urm toarei
instruc iuni SQL:

PARAMETERS [ Beginning OrderDate] DATETIME,[ Ending OrderDate] DATETIME;

SELECT * FROM Orders

WHERE (OrderDate Between [ Beginning OrderDate] And [ Ending OrderDate] );

173
Fiecare parametru definit în instruc iunea SQL este reprezentat de un obiect Parameter în colec ia Parameters a
obiectului QueryDef bazat pe instruc iunea SQL. Valoarea unui parametru se poate specifica prin fixarea propriet ii
Value a obiectului Parameter. Exemplul urm tor realizeaz o asemenea opera iune.

Function NewParameterQuery (dteStart As Date, dteEnd As Date) As Boolean


Dim dbs As Database, qdf As QueryDef, rst As Recordset
Dim strSQL As String

On Error Resume Next


' returnarea referin ei la baza curent
Set dbs = CurrentDb
' construc ia irului SQL
strSQL = "PARAMETERS [Beginning OrderDate] DATETIME, " _
& "[Ending OrderDate] DATETIME; SELECT * FROM Orders " & _
"WHERE (OrderDate Between [Beginning OrderDate] " _
& "AND [ Ending OrderDate] )';"
' eliminarea interog rii dac ea exist
dbs.QueryDefs.Delete "ParameterQuery"

On Error GoTo Err_NewParameterQuery


' crearea unui nou obiect QueryDef
Set qdf = dbs.CreateQueryDef("ParameterQuery", strSQL)

' fixarea valorilor parametrilor


If dteStart > dteEnd Then
MsgBox "Start date is later than end date."
Exit Function
End If
qdf.Parameters("Beginning OrderDate") = dteStart
qdf.Parameters("Ending OrderDate") = dteEnd

' deschiderea recordset-ului din interogare


Set rst = qdf.OpenRecordset
rst.MoveLast
MsgBox "Query returned " & rst.RecordCount & " records."
NewParameterQuery = True

Exit_NewParameterQuery:
rst.Close
Set dbs = Nothing
Exit Function

Err_NewParameterQuery:
MsgBox "Error " & Err & ": " & Err.Description
NewParameterQuery = False
Resume Exit_NewparameterQuery
End Function

Func ia poate fi apelat din fereastra Debug prin

? NewParameterQuery(#6-30-95#, #6-30-96#)

Observa ie. În Microsoft Access se pot defini parametrii unei interog ri în Query Design View.

Colec ia Relations (obiectul Database)


174
Un obiect Relation reprezint o rela ie între câmpuri din tabele sau înterog ri. Colec ia Relations con ine toate obiectele
Relation ale unei baze de date. Localizarea în ierarhia de obiecte DAO a spa iului de lucru Microsoft Jet este

Obiectul sau colec ia Este con inut în Con ine

Relation (obiect) Colec ia Relations Colec ia Fields


Colec ia Properties

Relations (colec ie) Obiectul Database Obiecte Relation

Rela ii între tabele

Separarea informa iilor între mai multe tabele ale unei baze de date, dup criterii care in de subiect, categorie,
administrare etc., ridic problema reunirii informa iilor pentru necesit i de raportare a lor. Pentru rezolvarea acestei
probleme o prim opera iune este aceea de a stabili rela ii între tabele.

Prin rela ie se în elege, în problematica bazelor de date, o asociere stabilit între dou câmpuri (denumite câmpuri cheie,
de regul cu acela i nume) din dou tabele. În acest mod înregistr rile celor dou tabele pot fi coordonate încât
înregistr rile curente s con in informa ii corelate dup câmpurile asociate.

Rela ia lucreaz prin potrivirea valorilor câmpurilor cheie. În cele mai multe cazuri, câmpurile cheie sunt cheia primar
dintr-o tabel (s-o numim tabela A), care constituie un identificator unic pentru fiecare înregistrare, i o cheie extern din
alt tabel (s-o numim tabela B).

Exist trei tipuri de rela ii: one-to-one, one-to-many, many-to-many dup num rul înregistr rilor din cele dou tabele, care
îndeplinesc condi ia de matching.

O rela ie one-to-many, cea mai frecvent , o înregistrare din tabela A poate s se potriveasc cu mai multe înregistr ri din
tabela B; invers, o înregistrare din tabela B are doar o înregistrare din A cu care se potrive te.

Într-o rela ie many-to-many, o înregistrare din tabela A poate s se potriveasc cu mai multe înregistr ri din tabela B, iar o
înregistrare din tabela B poate s se corespund cu mai multe înregistr ri din tabela A. Acest tip de rela ie este posibil
prin definirea unei a treia tabele (tabela de jonc iune – junction table) ale c rei câmpuri chei primare sunt în rela ie cu
cheile externe din tabelele A i B. Astfel, o rela ie many-to-many este format din dou rela ii one-to-many care implic o
a treia tabel .

Rela ia one-to-one presupune c înregistr rile din tabelele A i B sunt în coresponden una la una, fiecare înregistrare
din A se poate potrivi doar cu o înregistrare din B i reciproc. De i nu este o situa ie uzual , prin aceea c leg tura foarte
puternic ar presupune c informa ia trebuia grupat într-o singur tabel , rela ia one-to-one poate fi utilizat pentru
divizarea unei tabele cu prea multe câmpuri sau izolarea unei p r i a tabelei.

Modul de rela ie creat de Microsoft Access depinde de definirea câmpurilor care sunt puse în rela ie (chei primare,
indexuri unice etc.).

Obiectul Relation

Obiectul Relation poate fi utilizat pentru a crea noi rela ii sau pentru a examina rela iile existente în baza curent .
Propriet ile obiectului servesc la specificarea tipului de rela ie, a tabelelor care particip în rela ie, când s se for eze
integritatea referen ial (integritatea referen ial – Referential integrity – este un sistem de reguli utilizate în Access pentru
a asigura c rela iile dintre înregistr rile tabelelor legate sunt valide i c nu se terg sau modific date legate; integritatea
referen ial interzice ad ugarea de înregistr ri la o tabel legat pentru care nu exist cheie primar , modificarea valorilor
în tabela primar care conduce la înregistr ri orfane în tabela legat etc.) i când s se execute actualiz rile i tergerile
175
în cascad (actualiz ri în cascad – cascading update – pentru rela iile care impun integritatea referen ial , o op iune
care, în cazul modific rii unei chei primare din înregistr rile tabelei primare, conduce la actualizarea automat a cheilor
externe în toate înregistr rile legate din tabelele externe; tergeri în cascad – cascading delete – similar, dar pentru
tergeri de înregistr ri: tergerea unei inregistr ri din tabela primar produce tergerea înregistr rilor legate din tabelele
externe). Toate aceste no iuni sunt prezentate, pe scurt, în continuare.

Ad ugarea unui obiect Relation la colec ia Relations, se va crea obiectul prin metoda CreateRelation i se adaug la
colec ie prin metoda Append. Astfel, obiectul Relation este salvat o dat cu obiectul Database. Eliminarea unui obiect
Relation se realizeaz metoda Delete.

Referirea la un obiect Relation se realizeaz în mod uzual:

Relations(0)
Relations("name")
Relations![name]

Ac iunile principale realizate prin utilizarea obiectului Relation sunt enumerate în continuare.

• Stabilirea unei rela ii impuse între câmpuri din tabele de baz (o tabel de baz este o tabel a unei baze de date
Microsoft Jet) dar nu rela ii care implic tabele i interog ri legate (o tabel legat este o baz extern , legat de
o baz de date Jet).
• Stabilirea unei rela ii neimpuse între orice tip de tabel sau interogare – nativ sau legat .
• Utilizarea propriet ii Name pentru a referi rela ia dintre câmpurile din tabela primar (prin tabela primar se
în elege partea "one" dintr-o rela ie one-to-many) referit i tabela extern (tabela de pe partea "many" a rela iei
one-to-many) care face referirea.
• Utilizarea propriet ii Attributes pentru a determina dac rela ia dintre câmpuri este one-to-one i cum s se
impun integritatea referen ial . De asemenea, tot prin Attributes, se poate determina dac motorul Microsoft
Jet poate efectua actualizarea în cascad i tergerea în cascad în tabelele legate prin rela ii.
• Utilizarea propriet ii Attributes pentru a determina dac rela ia este asociere stânga (left join, include toate
înregistr rile din prima tabel – din stânga – chiar dac nu exist nici o potrivire cu înregistr ri din a doua tabel –
din dreapta) sau asociere dreapta (right join, include toate înregistr rile din a doua tabel – din dreapta– chiar
dac nu exist potriviri cu înregistr ri din prima tabel – din stânga rela iei).
• Utilizarea propriet ii Name a obiectelor Field din colec ia Fields a obiectului Relation pentru a stabili sau
returna numele câmpurilor din cheia primar a tabelei referite, sau set rile propriet ii ForeignName a obiectelor
Field pentru a stabili sau returna denumirile câmpurilor din cheia extern a tabelei care face referin a.

Un obiect Relation are o colec ie Fields care con ine dou câmpuri, câte unul în fiecare tabel a rela iei.Câmpurile
rela iei trebuie s aib acela i tip de dat i trebuie s aib valori comune. Se vor utiliza propriet ile Table i
ForeignTable ale obiectului Relation pentru a specifica tabele care iau parte la rela ie i cum sunt legate. La crearea
unei rela ii one-to-many, tabela de pe partea "one" a rela iei este tabela în care câmpul din leg tur este cheia primar .
Prin urmare proprietatea Table trebuie s fie numele acestei tabele. Tabela de pe partea "side" a rela iei este tabela în
care câmpul legat este cheie extern iar numele tabelei se va da propriet ii ForeignTable.

Urm torul exemplu creeaz o rela ie între tabelele Employees i Orders din baza de date de test Northwind. Cele dou
tabele sunt unite prin câmpul EmployeeID care este cheie primar în baza Employees – toate valorile acestui câmp sunt
unice – i cheie extern pentru Orders – aceea i valoare poate s apar în mai multe înregistr ri.

Function NewRelation() As Boolean


Dim dbs As Database
Dim fld As Field, rel As Relation
' calea c tre baza de date Northwind
Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"
On Error GoTo Err_NewRelation
176
' returneaz o referin la baza curent
Set dbs = OpenDatabase(conPath)
' g sirea unei rela ii EmployeesOrders deja existente
For Each rel In dbs.Relations
If rel.Table = "Employees" And rel.ForeignTable = "Orders" Then
' mesaj de tergere a rela iei existente
If MsgBox(rel.Name & " already exists. " & vbCrLf _
& "This relation will be deleted and re-created.", vbOK) = vbOK Then
dbs.Relations.Delete rel.Name
Else
' dac utilizatorul r spunde cu Cancel
Exit Function
End If
End If
Next rel

' crearea noii rela ii i stabilirea propriet ilor ei


Set rel = dbs.CreateRelation("EmployeesOrders", "Employees", "Orders")
' stabilirea propriet ilor pentru for area integrit ii referen iale
rel.Attrbutes = dbRelationDeleteCascade + dbRelationUpdateCascade
' creare câmp în colec ia Fields a obiectului Relation, la creare se fixeaz Name
Set fld = rel.CreateField("EmployeeID")
' numele pentru câmpul extern
fld.ForeignName = "EmployeeID"

' ad ugarea obiectelor create


rel.Fields.Append fld
dbs.Relations.Append rel
MsgBox "Relation '" &rel.Name & " ' created."
Set dbs = Nothing
NewRelation = True

Exit_NewRelation:
Exit Function

Err_NewRelation
MsgBox "Error " & Err & ": " & Err.Description
NewRelation = False
Resume Exit_NewRelation
End Function

Observa ie. În Microsoft Access se lucreaz cu rela iile prin meniul Tools – Relationships.

Colec ia Recordsets

Obiectul Recordset reprezint o mul ime de înregistrt ri din baza de date. Colec ia Recordsets con ine toate obiectele
Recordset deschise. Situarea în ierarhia de obiecte este

Obiectul sau colec ia Este con inut în Con ine

Recordset (obiect) Colec ia Recordsets Colec ia Fields


Colec ia Properties

Recordsets (colec ie) Obiectul Database Obiecte Recordset

177
Obiectele Recordset sunt utilizate pentru modificarea datelor memorate într-o tabel a unei baze de date (structura
tabelei poate fi modificat prin comenzi DAO sau SQL).

Crearea unui obiect Recordset se ob ine din metoda OpenRecordset cu sintaxa:

Set recordset = object.OpenRecordset (source, type, options, lockedits)

Descrierea parametrilor se va vedea în Help – OpenRecordset method.

DAO ofer cinci tipuri de obiecte Recordset:

• table (doar în spa ii de lucru Jet),


• dynaset,
• snapshot,
• forward-only,
• dynamic (doar în spa ii ODBCDirect).

Observa ie. Un obiect Recordset trebuie întotdeauna închis dup terminarea lucrului cu el i înainte de a închide
obiectul Database în care a fost creat. Pentru aceasta se utilizeaz metoda Close a obiectului Recordset.

Obiecte Recordset de tip tabel

Un obiect Recordset de tip tabel reprezint o tabel de baz (base table) din baza de date. Toate câmpurile i
înregistr rile din tabel sunt incluse într-un obiect Recordset de tip tabel . Acesta poate fi utilizat într-un spa iu de lucru
Microsoft Jet pentru a ad uga, terge sau modifica înregistr ri din tabel .

Un obiect Recordset poate fi deschis pe tabelele de baz ale unei baze de date Jet, dar nu pe tabelele din surse ODBC
sau tabele legate. Se mai poate utiliza Recordset cu bazele de date instalabile ISAM (FoxPro, dBase sau Paradox)
pentru a deschide aceste tabele în mod direct mai degrab decât s se lege acestea la baza de date curent .

Informa ii complete despre un obiect table-type Recordset se ob in din DAO Help – "Table-Type Recordset Object
Summary", de unde sunt leg turi c tre toate propriet ile i metodele obiectului. Intrarea poate fi atins eventual prin
Database Object –> Summary –> Database Object, Databases Collection Summary, de unde este o leg tur c tre
Recordsets.

Proprietatea RecordCount a unui obiect Recordset de tip tabel returneaz num rul de înregistr ri din tabel .

Obiectul Recordset de tip tabel poate utiliza indexurile definite pentru tabela de baz . La crearea obiectului se poate
preciza în proprietatea Index numele unui index definit pentru tabel . Metoda Seek va c uta în ordinea dat de index.

Pentru a crea un obiect Recordset de tip tabel se va specifica valoarea dbOpenTable pentru argumentul type a
metodei OpenRecordset a obiectului Database.

Observa ie. Pentru o tabel legat dintr-o surs de date extern se va utiliza mai întâi metoda OpenDatabase pentru
deschiderea bazei i apoi se deschide un obiect Recordset de tip tabel .

Exemplul urm tor creeaz un obiect Recordset de tip tabel , folose te metoda Seek pentru localizarea unei înregistr ri
i fixeaz înregistrarea g sit drept înregistrare curent .

Function ReturnEmployeesRecord(strKey As String) As Boolean


Dim dbs As Database, rst As Recordset
Const conPath As String = _
178
"C:\Program Files\ … \Northwind.mdb"
On Error GoTo Err_ReturnEmployeesRecord
' returnarea referin ei la baza de date
Set dbs = OpenDatabase(conPath)
' deschidere recordset pentru tabela Employees
Set rst = dbs.OpenRecordset("Employees", dbOpenTable)
' fixarea indexului
rst.Index = "LastName"
' opera iunea de c utare
rst.Seek "=", strKey ' valoarea c utat este argument al func iei
' verificarea g sirii
If rst.NoMatch = False Then
' tip rirea unor câmpuri din înregistrarea g sit
Debug.Print rst!EmployeeID, rst!FirstName & " " & rst!LastName, rst!Title
ReturnEmployeesRecord = True
Else
ReturnEmployeesRecord = False
End If

Exit_ReturnEmployeesRecord:
' închidere recordset i baz
rst.Close
dbs.Close
Exit Function

Err_ReturnEmployeesRecord:
MsgBox "Error " & Err & ": " & Err.Description
ReturnEmployeesRecord = False
Resume Exit_ReturnEmployeesRecord
End Function

Obiecte Recordset de tip dynaset

Un obiect Recordset de tip dynaset reprezint rezultatul unei c ut ri în una sau mai multe tabele. Obiectul este o
mul ime dinamic de inregistr ri care se poate utiliza pentru ad ugarea, modificarea sau tergerea înregistr rilor în una
sau mai multe tabele ale bazei. Cu un obiect Recordset de tip dynaset se pot extrage i actualiza date într-o uniune
multipl de tabele, incluzând tabele legate din mai multe baze de date. Obiecte Recordset de tip dynaset se pot crea atât
în spa ii de lucru Microsoft Jet, cât i în spa ii de lucru ODBCDirect. Dac obiectul implic o surs de date la distan , el
const într-o serie de bookmark-uri, fiecare identificând unic o înregistrare din recordset. Date efective nu sunt returnate
decât la referirea lor explicit .

Pentru a determina num rul de înregistr ri din recordset se aplic mai întâi metoda MoveLast astfel reg sindu-se toate
înregistr rile din mul ime.

Obiectul Recordset de tip dynaset poate fi actualizat, dar nu toate câmpurile suport opera ia. Proprietatea
DataUpdatable a obiectului Field respectiv arat dac se poate modifica valoarea câmpului. Obiectul nu se poate
actualiza dac

• pagina de date necesar este blocat de alt utilizator


• înregistrarea a fost deja modificat de la ultima citire
• utilizatorul nu are drepturile necesare
• cel pu in o tabel sau un câmp este read-only
• obiectul Recordset a fost creat din mai multe tabele f r instruc iunea JOIN

179
• obiectul include câmpuri dintr-o surs de date ODBC, sau tabele Paradox, i nu exist un index unic pe acele
tabele.

Crearea unui obiect dynaset-type Recordset se indic utilizând constanta dbOpenDynaset pentru argumentul type al
metodei OpenRecordset, dup modelul

Sub PrintHireDates ()
Dim dbs As Database, rst As Recordset
Dim strSQL As String
Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"

' deschiderea bazei de date, referirea ei


Set dbs = DBEngine.Workspaces(0).OpenDatabase(conPath)
' ini ializarea irului SQL
strSQL = "SELECT FirstName, LastName, HireDate FROM Employees " & _
"WHERE HireDate <= #1-1-93# ORDER BY HireDate;"
' deschiderea recordsetului de tip dynaset
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
' tip rirea înregistr rilor din recordset
Do Until rst.EOF
Debug.Print rst!FirstName, rst!LastName, rst!HireDate
Rst.MoveNext
Loop
' închiderea recordsetului i a bazei
rst.Close
dbs.Close
End Sub

Obiecte Recordset de tip snapshot

Un obiect Recordset de tip snapshot este o mul ime static de înregistr ri care reprezint rezultatul unei interog ri. Un
snapshot include toate valorile pentru toate câmpurile cerute în interogare, fie c exist în cod referin e la ele sau nu.
Obiectul Recordset de tip snapshot necesit mai pu ine resurse decât cel de tip dynaset, dar datele nu pot fi actualizate
în obiectul Recorset de tip snapshot.

Ini ial, la parcurgerea înregistr rilor din obiect, toate datele sunt copiate în memorie i apoi, dac mul imea este prea
vast , într-o baz de date Jet temporar de pe ma ina utilizatorului. Printre înregistr rile unui obiect snapshot se poate
naviga în ambele sensuri.

Pentru a crea un obiect snapshot-type Recordset se specific valoarea dbOpenSnapshot pentru argumentul type al
metodei OpenRecordset.

Obiecte Recordset de tip forward-only

Un obiect Recordset de tip forward-only este identic cu unul de tip snapshot cu excep ia faptului c înregistr rile pot fi
defilate doar înainte (nu se poate efectua decât o singur trecere prin înregistr ri).

Într-un obiect recordset de acest tip exist doar o singur înregistrare la un moment dat. Rezult c nu se pot utiliza
metode cum ar fi MoveLast, MoveFirst, MovePrevious.

Obiectele de acest tip, utile atunci când înregistr rile sunt parcurse doar o dat , ofer cea mai mare vitez de acces.

180
Crearea unui obiect forward-only-type Recordset este produs de constanta dbOpenForwardOnly atribuit
argumentului type al metodei OpenRecordset.

Metodele obiectelor Recordset

În tabelul urm tor este o prezentare a metodelor permise pentru diferite tipuri de obiecte Recordset. Este inclus i tipul
dinamic, disponibil doar în spa ii ODBCDirect.

Jet = opera iune permis în spa iul Microsoft Jet

ODBC = opera iune permis în spa iul de lucru ODBCDirect

Method Table Dynaset Snapshot Forward- Dynamic


Only

AddNew Jet Jet/ODBC ODBC * ODBC ODBC

Cancel ODBC ODBC ODBC ODBC

CancelUpdate Jet Jet/ODBC ODBC * ODBC ODBC

Clone Jet Jet Jet

Close Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC

CopyQueryDef Jet Jet Jet

Delete Jet Jet/ODBC ODBC * ODBC ODBC

Edit Jet Jet/ODBC ODBC * ODBC ODBC

FillCache Jet

FindFirst Jet Jet

FindLast Jet Jet

FindNext Jet Jet

FindPrevious Jet Jet

GetRows Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC

Move Jet Jet/ODBC Jet/ODBC Doar înainte, ODBC


f r offset

MoveFirst Jet Jet/ODBC Jet/ODBC ODBC

MoveLast Jet Jet/ODBC Jet/ODBC ODBC

MoveNext Jet Jet/ODBC Jet/ODBC ODBC

MovePrevious Jet Jet/ODBC Jet/ODBC ODBC

181
NextRecordset ODBC ODBC ODBC ODBC

OpenRecordset Jet Jet Jet

Requery Jet/ODBC Jet/ODBC Jet/ODBC ODBC

Seek Jet

Update Jet Jet/ODBC ODBC * ODBC ODBC

* În spa iul ODBCDirect anumite opera iuni depind de driver (dac acesta suport sau nu opera iunea respectiv )

Pentru propriet ile diferitelor tipuri de obiecte Recordset se vor studia intr rile respective din Help.

Securitatea datelor

Microsoft Access dispune de dou metode de asigurare a securit ii informa iilor:

• stabilirea de parole pentru deschiderea bazelor de date i


• securitate la nivel de utilizator, prin fixarea drepturilor de acces la diferite obiecte ale bazei de date.

Securitatea la nivel de utilizator/grup se realizeaz cu ajutorul obiectelor Group, împreun cu obiectele User, Container,
Document i Workspace.

Obiectul Group reprezint un grup de conturi iar obiectul User reprezint un cont individual. Utilizatorii pot fi membri ai
grupurilor. Atunci când se stabile te securitatea bazei, aceasta se efectueaz pentru un obiect particular sau mul ime de
obiecte specificând tipul de drepturi pe care utilizatorul sau grupul îl are asupra obiectelor respective. Dac un grup are o
anumit permisiune pentru un obiect, to i utilizatorii grupului au aceea i permisiune. Invers, dac un utilizator are drepturi
asupra unui obiect, grupul la care apar ine utilizatorul are acelea i drepturi. Grupurile pot fi create prin metoda
CreateGroup a obiectului Workspace sau User.

Obiectul Container reprezint un set particular de obiecte dintr-o baz de date pentru care se pot atribui drepturi într-un
grup securizat. DAO ofer trei tipuri de obiecte Container; fiecare baz de date con ine cel pu in aceste obiecte având
denumirile: Databases – bazele de date salvate –, Tables – tabelele i interog rile salvate –, Relationships – rela iile
salvate. O aplica ie poate s defineasc i obiecte Container proprii; Microsoft Access define te obiectele Container cu
denumirile Forms – formele salvate –, Modules – modulele salvate–, Reports – rapoartele salvate –, Scripts – macrourile
salvate. Pentru stabilirea drepturilor se stabile te proprietatea UserName a containerului respectiv i apoi proprietatea
Permissions adecvat .

Fiecare obiect Container con ine o colec ie Documents, fiecare element Document reprezentând un document din
baz . Atât DAO cât i aplica ia ofer diferite tipuri de obiecte Document, de exemplu Database (DAO), Form (Access)
etc. Pentru stabilirea drepturilor se stabile te proprietatea UserName a documentului respectiv i apoi proprietatea
Permissions.

Pentru informa ii detaliate se vor studia intr rile din Help pentru obiectele men ionate i leg turile propuse.

Colec ia Properties

Cele mai multe obiecte DAO con in o colec ie Properties. Fiecare obiect Property din colec ie corespunde unei
propriet i a obiectului. Colec ia propriet ilor poate fi utilizat fie pentru a determina ce propriet i se aplic unui obiect
particular, fie pentru a returna valorile existente ale propriet ilor. Exemplul urm tor afi eaz în fereastra Debug toate
propriet ile obiectului reprezentând baza de date curent .
182
Sub DisplayProperties()
Dim dbs As Database, prp As Property

Const conPath As String = _


"C:\Program Files\ … \Northwind.mdb"

' deschide baza


Set dbs = OpenDatabase(conPath)
Debug.Print "Current Database Properties"
' enumerarea colec iei
For Each prp In dbs.Properties
Debug.Print prp.Name
Next prp
dbs.Close
End Sub

Anumite propriet i ale obiectelor DAO nu exist în mod automat în colec ia Properties a obiectului respectiv. Înainte de
utilizarea unei asemenea propriet i, trebuie s se creeze un obiect Property care s reprezinte proprietatea i s se
adauge obiectul la colec ia Properties. Din acest moment proprietatea poate fi utilizat la fel cu toate celelalte existente
în colec ie.

Urm toarea func ie este o procedur generic utilizabil în cazul proces rii unei propriet i care nu exist în mod implicit.
Func ia implementeaz tratarea erorilor. Prima dat când se cheam procedura apare o eroare deoarece nu exist
proprietatea cerut . În handler-ul erorii se creeaz noul obiect Property i se adaug la colec ia lui. Orice apel ulterior nu
mai produce erori i proprietatea este stabilit pe valoarea specificat .

Function SetProperty(obj As Object, strName As String, _


intType As Integer, varSetting As Variant) As Boolean
Dim prp As Property

Const conPropNotFound As Integer = 3270

On Error GoTo Error_SetProperty


' referirea explicit la colec ia Properties
obj.Properties(strName) = varSetting
SetProperty = True

Exit_SetProperty:
Exit Function

Error_SetProperty:
If Err = conPropNotFound Then
' creare proprietate, tip, valoare ini ial
Set prp obj.CreateProperty(strName, intType, varSetting)
' ad ugarea la colec ia Properties
obj.Properties.Append prp
obj.Properties.Refresh
SetProperty = True
Resume Exit_SetProperty
Else
MsgBox Err & ": " & vbCrLf & Err.Description
SetProeprty = False
Resume Exit_SetProperty
End If
End Function
183
De exemplu, pentru a fixa proprietatea ReplicableBool a obiectului Database, se poate utiliza func ia precedent prin

Sub ReplicateDatabase()
Dim dbs As Database
Const conPath As String = _
"C:\Program Files\ … \Northwind.mdb"

Set dbs = OpenDatabase(conPath, True)


If SetProperty(dbs, "ReplicableBool", dbBoolean, True) Then
Debug.Print "Database replicated successfully."
Else
Debug.Print "Database not replicated."
End If
End Sub

De fiecare dat când se fixeaz sau se cite te o proprietate care nu exist în mod automat în colec ia Properties a unui
obiect, referin a la colec ia Properties trebuie s fie explicit . De exemplu,

Debug.Print dbs.Properties("ReplicableBool")

Func ia ar tat în exemplul anterior poate fi utilizat pentru definirea unor propriet i proprii (introduse de utilizator) pentru
obiectele DAO. De exemplu, se poate defini o proprietate care s memoreze numele utilizatorului care a modificat ultima
dat o tabel . i referin ele la propriet ile definite de utilizator se vor efectua în mod explicit.

Anumite aplica ii, cum ar fi Access, definesc propriet i proprii pentru obiectele DAO. De exemplu Microsoft Access
define te propriet i pentru obiectele TableDef, QueryDef, Field i Document.

Accesarea datelor ODBC

Atunci când este nevoie s se lucreza cu surse de date ODBC, trebuie s se decid dac se va utiliza DAO cu Microsoft
Jet, ODBCDirect sau ambele. În continuare se discut pentru început avantajele fiec rui tip de acces i alte probleme
conexe domeniului. Alegerea modului de lucru este func ie de posibilit ile de lucru oferite în cele dou spa ii.

Utilizarea Microsoft Jet pentru date ODBC

Alegerea modului de acces Jet poate fi influen at de urm toarele argumente. Posibilit ile enumerate sunt proprii
spa iilor de lucru Microsoft Jet i nu sunt suportate de spa iile ODBCDirect.

o Leg turi actualizabile – se pot actualiza date din obiecte Recordset bazate pe leg turi multiple de
tabele
o Suport pentru tabele legate – se pot memora leg turi permanenete la date de pe server într-o baz
local Microsoft Jet. La legarea unei tabele, se poate memora (cache) informa ia despre structura tabelei,
incluzând informa ii despre câmpuri i indexuri, în baza local . Acest fapt m re te viteza de conectare la
acces rile ulterioare ale sursei de date.
o Suport pentru metode Find – se pot utiliza metodele FindFirst, FindNext, FindPrevious i FindLast
cu obiectele Recordset.
o E ecuri (failures) par iale ale actualiz rii interog rilor – dac e ueaz o interogare de mari
dimensiuni, interogarea se opre te, d controlul utilizatorului pentru a decide sau nu dac se p streaz
modific rile efectuate pân în momentul e ecului.
o Propriet i definite de utilizator – se pot personaliza obiectele DAO prin ad ugarea unor propriet i
persistente. De exemplu o proprietate Description care s memoreze un text descriptiv al obiectului.
o Interog ri încruci ate – se poate utilzia propozi ia SQL TRANSFORM pentru a crea rezumate
încruci ate (crosstab) ale datelor interogate.

184
o Acces la date eterogene – se poate lucra cu date de pe server, baze de date Microsoft Jet native
(fi iere .mdb) i date ISAM instalabile (FoxPro, Paradox, dBASE). Se pot efectua uniri de tabele din surse
diferite.
o Utilizare programatic pentru Data Definition Language (DDL) – se poate folosi DAO pentru
opera iuni care modific structura bazei de date (ad ugare de tabel, modificare etc.).
o Ata are de forme i controale – în spa iul Jet se pot ata a forme i controale datelor din surse ODBC.
Spa iul ODBCDirect nu suport tabele legate deci nici forme sau controale.

Utilizare ODBCDirect pentru date ODBC

Cu ODBCDirect se pot accesa date de pe server utilizând modelul de obiecte DAO existent direct în topul interfe ei de
programare ODBC. ODBCDirect implementeaz un strat de cod peste ODBC API, care stabile te conexiunile, creeaz
cursoare i execut proceduri utilizând resurse minime de pe sta ia de lucru, f r a trece prin Microsoft Jet. Avantajele
utiliz rii spa iului de lucru ODBCDirect sunt enumerate în continuare.

o Acces direct – aplica ia acceseaz sursa de date ODBC în mod direct. Se pot astfel îmbun t i
performan ele, reduce traficul de re ea i beneficia de capacit ile de procesare ale serverului (mai mari
decât ale sta iei de lucru).
o Reducerea necesarului de resurse – netrecând prin Microsoft Jet, aplica ia cere mai pu ine resurse
locale. Dac se utilizeaz ODBCDirect din Access se va ine seama c Microsoft Access încarc
întotdeauna Microsoft Jet (chiar dac opera iunile ODBCDirect nu trec pe acolo).
o Imbun t irea accesului la func ionalitatea specific serverului – se pot utiliza avantajele func iunilor
specifice serverului ODBC i care nu sunt permise prin Microsoft Jet. De exemplu, în spa iul ODBCDirect
se poate specifica locul de memorare a cursorului: la client sau la server, pentru serverele care suport
diferite tipuri de cursoare.
o Interog ri asincrone – se pot executa o interogare a bazei de date i apoi alte opera iuni f r a a tepta
terminarea interog rii. Se pot testa propriet ile pentru a vedea stadiul execu iei interog rii. Astfel se
poate simula concuren a i optimiza performan a aplica iei.
o Actualizare optimist în loturi – modific rile locale se pot stoca în Recordset i trimite apoi serverului
într-un singur lot.
o Executarea procedurilor memorate – se pot manevra intr rile i ie irile procedurilor memorate pe
server; se pot specifica valori de intrare i verifica valorile returnate, opera iuni imposibile în spa iul de
lucru Jet.

Înregistrarea unei surse de date ODBC

Pentru a putea fi utilizat , atât în spa iul de lucru Microsoft Jet, cât i în spa iul ODBCDirect, o surs de date ODBC
trebuie s fie înregistrat . Acest proces memoreaz informa ia despre sursa de date în Windows Registry i ofer
aceast informa ie aplica iilor. Înregistrarea se poate efectua atât din managerul de ODBC (disponibil în mediul
Windows), cât i din Visual Basic.

Pa ii necesari înregistr rii difer dup sursa de date ODBC, driverele respective necesitând informa ii specifice. În
continuare se d , ca exemplu, înregistrarea sursei de date SQL Server utilizând managerul de ODBC:

1. Windows Control Panel => dublu click pe 32bit ODBC


2. Click Add i apoi dublu click pe SQL Server.
3. În caseta Data Souce Name se tasteaz un nume (DSN). Acesta poate fi orice ir i nu trebuie s corespund cu
numele bazei de date sau tabelei accesate.
4. În Description se tasteaz o desciere a bazei de date, orice text de altfel.

185
5. În caseta Server se introduce numele serverului de re ea unde se afl sursa datelor. Nu se include un dublu
backslash (\\) înaintea numelui.
6. Click Options i se introduce numele bazei de date accesate în caseta Database Name.

Exemplul urm tor con ine codul necesar înregistr rii programatice a unei surse de date. Pentru aceasta se utilizeaz
metoda RegisterDatabase a obiectului DBEngine.

Function RegisterDB() As Boolean


Dim str As String

On Error GoTo Err_RegisterDB


' construirea irului de cuvinte cheie
str = " Description=SQL Server on Server Publishers" & _
vbCR & "OemToAnsi=No" & _
vbCR & "Network=(Default)" & _
vbCR & "Address=(Default)" & _
vbCR & Server=Publishers" & _
vbCR & "Database=Pubs"
' înregistrarea bazei de date
DBEngine.RegisterDatabase "Pubs", "SQL Server", True, str
RegisterDB = True

Exit_RegisterDB:
Exit Function

Err_RegisterDB:
MsgBox "Error " & Err &": " & Err.Description
RegisterDB = False
Resume Exit_RegisterDB
End Function

Metoda RegisterDatabase completeaz informa ia de conectare necesar la deschiderea sursei de date ODBC. Sintaxa
metodei este

DBEngine.RegisterDatabase dbname, driver, silent, attributes

unde

dbname este numele bazei de date,

driver este numele driverului ODBC,

silent este True dac se nu dore te afi area dialogului driverului pentru fixarea atributelor,

attributes con ine irul atributelor care se trec în Windows Registry.

186
Utilizarea DAO cu ODBCDirect

Modelul de obiecte pentru spa iul ODBCDirect include un subset de obiecte din spa iul Microsoft Jet la care se adaug un
obiect nou, Connection i clasa corespunz toare. Diagrama urm toare arat ierarhia de obiecte a spa iului de lucru
ODBCDirect.

Obiectul DBEngine

DBEngine con ine atât spa iile de lucru Jet, cât i spa iile de lucru ODBCDirect. Proprietatea DefaultType a obiectului
determin tipul spa iului creat în mod implicit la utilizarea metodei CreateWorkspace. Dup cum s-a mai precizat, la
spa iile Microsoft Jet, valoarea dbUseODBC caracterizeaz spa iile ODBCDirect. Argumentul implicit poate fi acoperit
prin specificarea explicit a argumentului type la aplicarea metodei CreateWorkspace.

Observa ie. Dac programarea este efectuat in Microsoft Access, atunci nu se va specifica Proprietatea DefaultType la
valoarea dbUseODBC deoarece poate produce rezultate nea teptate (Access utilizeaz DAO i Jet pentru multiple
opera iuni).

Instruc iunile urm toare creeaz un spa iu ODBCDirect:

Dim wrkODBC As Workspace


Set wrkODBC = DBEngine.CreateWorkspace _
("NewODBCwrk", "Admin", "", dbUseODBC)

Tipul spa iului de lucru poate fi identificat prin proprietatea Type a obiectului Workspace. Este returnat una dintre
valorile dbUseJet sau dbUseODBC, proprietatea fiind read-only, adic nu se poate modifica tipul spa iului de lucru odat
creat.

Colec ia Workspaces

În acest model, f r a specifica de fiecare dat , un obiect Workspace reprezint un spa iu de lucru ODBCDirect, iar
colec ia Workspaces con ine mul imea tuturor spa iilor ODBC active. Situarea în ierarhie este dat în tabelul urm tor.

Obiectul sau colec ia Con inut în Con ine

Workspace (obiect) Colec ia Workspaces Colec ia Connections


Colec ia Databases / Colec ia Properties

Workspaces (colec ie) Obiectul DBEngine Obiecte Workspace

187
Un spa iu de lucru ODBCDirect ruteaz , în cazul utiliz rii ODBC, apelurile direct la ODBC API spre deosebire de spa iul
Microsoft Jet, care ruteaz mai întâi apelurile la motorul de baze de date Jet i pe urm la ODBC API.

Referirea la un spa iu de lucru se efectueaz în mod uzual, prin intermediul colec iei:

DBEngine.Workspaces(index)

DBEngine.Workspaces("name")

DBEngine.Workspaces![name]

Principalele propriet i i metode utilizabile sunt

• Name, UserName i Type (propriet i) pentru stabilirea/aflarea propriet ilor unei sesiuni.
• Metoda Close pentru terminarea sesiunii.
• Metoda OpenDatabase pentru a deschide o baz de date.
• Metodele BeginTrans, CommitTrans i Rollback pentru conducerea tranzac iilor.

Alte propriet i sunt prezentate în continuare.

Colec ia Connections

Dup crearea unui spa iu ODBCDirect, trebuie s se conecteze la o surs de date ODBC. Conectarea se poate efectua
prin deschiderea unei baze de date (metoda OpenDatabase, prezentat ulterior) sau prin deschiderea unui nou obiect
Connection.

Un obiect Connection reprezint o conectare la o baz de date ODBC din spa iul ODBCDirect. Colec ia Connections
con ine toate obiectele Connection deschise curent. La deschiderea unui nou obiect Connection, acesta este ad ugat
în mod automat la colec ie. Analog, închiderea unui obiect prin metoda Close elimin din colec ie obiectul Connection
închis.

Avantajele utiliz rii obiectului Connection sunt

o Conectare asincron . Opera iunea de conectare se desf oar în paralel cu alte opera iuni i poate fi
verificat dac s-a efectuat.
o Interogare asincron . Similar celor anterior spuse, dar pentru interog ri.
o Obiecte QueryDef. Se pot defini obiecte QueryDef care reprezint interog rile din sursa de date ODBC.

Pentru a crea un obiect Connection se utilizeaz metoda OpenConnection, cu sintaxa

Set connection = workspace.OpenConnection (name, options, readonly, connect)

unde

connection este numele noului obiect,

workspace este numele unui obiect Workspace de tip ODBCDirect din care se efectueaz conectarea,

name este numele unei surse de date înregistrate. Obiectul Connection creat poate fi referit prin numele sursei
(DSN) sau prin indexul din colec ie,

188
options determin dac i când s fie întrebat utilizatorul la stabilirea conexiunii i dac aceasta este asincron ;
valorile se vor studia din Help - OpenConnection method,

readonly permite controlul actualiz rii datelor: True pentru a interzice modificarea datelor.

connect este un ir de conectare valid care con ine parametrii necesari driverului ODBC. Argumentul poate
con ine numele utilizatorului, parola etc.

irul de conectare trebuie s înceap cu "ODBC;" i s con in o serie de valori necesare driverului pentru a accesa
datele sursei. Componentele irului difer dup sursa de date. În mod uzual cerin ele minime sunt ID-ul utilizatorului,
parola i DSN, dup modelul:

ODBC;UID=JamesK;PWD=OpenSesame;DSN=MasterData

Dac irul de conectare nu con ine toate elementele necesare, driverul ODBC afi eaz un dialog pentru ob inerea
informa iilor lips . Dialogul nu este afi at dac irul de conectare este completat cu informa iile necesare.

Observa ie. La conectarea la o baz de date Microsoft SQL Server care utilizeaz securitatea integrat se vor omite
parametrii UID i PWD deoarece se utilizeaz numele utilizator i parola din Windows NT. De exemplu, irul de conectare
poate fi

ODBC;UID=;PWD=;DATABASE=Pubs;DSN=Pubs

Exemplul urm tor ilustreaz utilizarea metodei OpenConection pentru a deschide un nou obiect Connection.

Function OpenPubsConnection() As Boolean


Dim wrk As Workspace, cnn As Connection, rst As Recordset, fld As Field
Dim strConnect As String, strSQL As String

On Error GoTo Err_OpenPubsConnection


' Crearea irului de conectare
strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
' Crearea irului SQL
strSQL = SELECT * FROM Authors WHERE State = 'MD';"
' Crearea spa iului de lucru ODBC
Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)
' Deschiderea conexiunii
Set cnn = wrk.OpenConnection("Pubs", dbDriverNoPrompt, False, strConnect)
' Deschiderea recordsetului din conexiune
Set rst = cnn.OpenRecordset(strSQL,dbOpenDynaset)
' Tip rirea valorilor din recordset
Do Until rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Name, fld.Value
Next fld
Debug.Print
rst.MoveNext
Loop
OpenPubsConnection = True

Exit_OpenPubsConnection:
rst.Close
cnn.Close
Exit Function
189
Err_ OpenPubsConnection:
MsgBox "Error " & Err & ": " & Err.Description
OpenPubsConnection = False
Resume Err_ OpenPubsConnection
End Function

Dup crearea obiectului Connection, se pot deschide obiecte Recordset i executa interog ri pe obiectul Connection.

La deschiderea unui obiect Connection, este creat un obiect Database corespunz tor i ad ugat colec iei Databases
din spa iul de lucru. Reciproc, la deschiderea unei baze de date în spa iul ODBCDirect este creat un obiect Connection
i ad ugat colec iei Connections. Închiderea oric rui obiect din perechea Connection, Database produce i închiderea
celuilalt obiect.

Observa ie. Ca i la Database, se vor închide mai întâi toate obiectele Recordset deschise.

Deschiderea conect rilor asincrone

Acest tip de conectare, necesar mai ales când conectarea dureaz mai mult, timp în care se pot efectua alte opera iuni,
este specificat prin constanta dbRunAsync dat argumentului options al metodei OpenConnection.

Dim wrk As Workspace, cnn As Connection, strConnect As String


Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)
strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
Set cnn = wrk.OpenConnection("",dbDriverNoPrompt + dbRunAsync, False, strConnect)

Proprietatea StillExecuting a obiectului Connection poate fi testat pentru a determina stabilirea conexiunii. Pentru a
anula o conectare care ia prea mult timp se utilizeaz metoda Cancel a obiectului.

Colec ia Databases

Se poate utiliza metoda OpenDatabase a obiectului Workspace pentru a deschide o baz de date i conectarea astfel la
o surs de date ODBC. Totu i, obiectul Database nu suport în spa iul de lucru ODBCDirect toate func iunile pe care le
ofer obiectul Connection. În special, nu se poate efectua conectarea asincron , executa interog ri asincrone sau defini
obiecte QueryDef reprezentând interog ri ale sursei de date.

Pentru conectarea la o surs ODBC prin OpenDatabase dintr-un spa iu de lucru ODBCDirect se va specifica un ir de
conectare valid în argumentul connect al metodei, dup exemplul urm tor.

Dim wrk As Workspace, dbs As Database


Dim strConnect As String

strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)
Set dbs = wrk.OpenDatabase("Pubs", dbDriverNoPrompt, False, strConnect)

Pentru argumentele metodei se va studia Help - OpenDatabase method (DAO).

Dintre metodele i propriet ile obiectului Database, men ion m doar câteva.

• metoda Execute pentru a efectua o interogare de tip ac iune (action query – o interogare care copie sau schimb
date; sunt incluse ad ugare, tergere, actualizare, în opozi ie cu o interogare de tip selectare care returneaz o
mul ime de înregistr ri).
190
• Proprietatea Connect stabile te o conectare la o surs de date ODBC.
• Proprietatea QueryTimeout pentru limitarea duratei de timp în care se execut o interogare.
• Proprietatea RecordsAffected pentru a determina num rul înregistr rilor modificate într-o interogare ac iune.
• Metoda OpenRecordset pentru executarea unei interog ri de tip selectare i crearea unui obiect Recordset.
• Proprietatea Version permite determinarea versiunii motorului de baze de date care a creat baza.

Comutarea între obiectele Connection i Database

Pentru a utiliza avantajele fiec rui tip de conectare la o surs ODBC, se poate trece de la un obiect la altul prin
proprietatea Connection a obiectului Database sau prin proprietatea Database a obiectului Connection. Aceste
propriet i pot fi folosite pentru a crea obiecte Connection din obiecte Database i, reciproc, obiecte Database din
obiecte Connection. Se pot astfel ad uga capacit i ODBCDirect la aplica ii care utilizeaz doar obiecte Database.

De exemplu, se poate utiliza un obiect Database pentru opera iunile uzuale, dar dac este nevoie de o interogare
asincron , atunci se poate crea un obiect Connection din obiectul Database i executa apoi interogarea din
Connection. Exemplul urm tor ilustreaz aceast metod .

Sub DeleteRecords()
Dim dbs As Database, strConnect As String
Dim cnn As Connection

' Deschiderea bazei de date în spa iul de lucru implicit


strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
Set dbs = OpenDatabase("", False, False, strConnect)

' crearea unui obiect Connection din Database.


' Dac spa iul de lucru este ODBCDirect, atunci interogarea se execut asincron
' Dac spa iul de lucru este Microsoft Jet, apare o eroare i
' interogarea se execut sincron.

Err = 0
On Error Resume Next
Set cnn = dbs.Connection
If Err = 0 Then
cnn.Execute "DELETE FROM Authors", dbRunAsync
Else
dbs.Execute "DELETE FROM Authors"
End If
End Sub

Colec ia QueryDefs

Un obiect QueryDef reprezint o defini ie temporar a unei interog ri din spa iul ODBCDirect. Colec ia QueryDefs
con ine toate interog rile existente curent în spa iul de lucru. Situarea în ierarhia de obiecte este dat în tabelul urm tor.

Obiectul sau colec ia Con inut în Con ine

QueryDef (obiect) Colec ia QueryDefs Colec ia Parameters


Colec ia Properties

QueryDefs (colec ie) Obiectul Connection Obiecte QueryDef

191
Obiectele QueryDef create în spa iile de lucru ODBCDirect sunt întotdeauna temporare. Ele nu pot fi salvate în sursa de
date chiar dac li se atribuie un nume.

Executarea interog rilor asincrone

Crearea i executarea interog rilor în spa iile ODBCDirect sunt similare cu crearea i executarea din spa iile de lucru
Microsoft Jet. Interogarea se creeaz prin metoda CreateQueryDef a obiectului Connection i utilizarea metodelor
Execute sau OpenRecordset pentru interogarea rezultat .

Se pot utiliza interog ri asincrone încât utilizatorii s continue aplica ia în timp ce se execut interogarea i se poate da
utilizatorilor posibilitatea de a anula o interogare asincron în cazul în care dureaz prea mult.

Exemplul urm tor poate constitui un model.

Function DeleteLargeSales () As Boolean


Dim wrk As Workspace, rst As Recordset
Dim cnn As Connection, qdf As QueryDef
Dim strConnect As String, strSQL As String
Dim errObj As Error

On Error GoTo Err_DeleteLargeSales


' crearea spa iului de lucru
Set wrk = DBEngine.CreateWorkspace("ODBC","sa", "", dbUseODBC)
' crearea irului de conectare
strConnect = ""ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs"
' deschiderea conexiunii
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' tergerea unei interog ri anterioare
For Each qdf In cnn.QueryDefs
If qdf.Name = "DeleteLargeSales" Then
cnn.QueryDefs.Delete "DeleteLargeSales"
End If
Next qdf

' creare QueryDef


Set qdf = cnn.CreateQueryDef("DeleteLargeSales")
strSQL = "DELETE FROM sales WHERE qty = 100"
qdf.SQL = strSQL

' executarea asincron a interog rii


qdf.Execute dbRunAsync

While qdf.StillExecuting
' cod care se va executa pân când se termin interogarea
' Se verific proprietatea StillExecuting pentru a detecta terminarea
Wend

DeleteLargeSales = True

Exit_DeleteLargeSales:
cnn.Close
wrk.Close
Exit Function

Err_DeleteLargeSales:
192
For Each errObj In Errors
Debug.Print errObj.Number, errObj.Description
Next errObj
DeleteLargeSales = False
Resume Exit_DeleteLargeSales
End Function

Exemplul urm tor utilizeaz metoda Execute direct pe obiectul Connection ( i nu obiectul QueryDef ca în exemplul
anterior).

Dim cnn As Connection, strConnect As String

strConnect = "ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs"
Set cnn = OpenConnection("", dbDriveNotPrompt, False, strConnect)
cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync
cnn.Close

La executarea unei interog ri asincrone aceasta se poate anula prin testarea metodei StillExecuting. Exemplul urm tor
con ine o asemenea tehnic .

Function CancelAsyncQuery() As Boolean


Dim wrk As Workspace, cnn As Connection, strConnect As String
Dim errObj As Error

On Error GoTo Err_CancelAsyncQuery


Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' Pornirea unei tranzac ii pentru a putea reface dac este necesar
wrk.BeginTrans
cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync
' Executarea altor opera iuni

' dac interogarea nu s-a terminat, anuleaz i reface


If cnn.StillExecuting Then
cnn.Cancel
wrk.Rollback
' dac interogarea s-a terminat, încheierea tranzac iei
Else
wrk.CommitTrans
End If
CancelAsyncQuery = True

Exit_CancelAsyncQuery:
cnn.Close
wrk.Close
Exit Function

Err_CancelAsyncQuery:
For Each errObj In Errors
Debug.Print errObj.Number, errObj.Description
Next errObj
CancelAsyncQuery = False
Resume Exit_CancelAsyncQuery
End Function
193
Proprietatea StillExecuting i metoda Cancel pot fi utilizate împreun cu obiectele QueryDef, Connection i
Recordset.

Un obiect Connection suport o singur opera iune asincron la un moment dat. În timpul execut rii unei interog ri
asincrone pe o conexiune nu se mai pot executa i alte opera iuni DAO, cum ar fi procesarea unui recordset. Pentru a
executa interog ri asincrone multiple în acela i timp se vor crea obiecte Connection separate i se va executa fiecare
interogare asincron pe un obiect Connection diferit.

Dac se folose te tehnica tranzac iilor simultan cu interog rile asincrone, aplicarea metodei CommitTrans poate opri
execu ia pân când se termin interogarea. Din acest motiv se va verifica StillExecuting periodic i se va termina
tranzac ia doar dup ce inteorgarea s-a încheiat (StillExecuting returneaz False) sau a fost anulat .

Dac o interogare de tip ac iune este anulat în afara unei tranzac ii, atunci actualizarea înregistr rilor s-a efectuat doar
pân în momentul activ rii metodei Cancel i opera iunea nu poate fi ref cut prin Rollback. Pentru a nu permite
opera iuni par iale de acest tip, metoda Cancel se va utiliza doar în interiorul unei tranzac ii. În plus, dac interogarea
asincron este ini iat într-o procedur i procedura este p r sit înainte de terminarea interog rii, aceasta va continua
s se execute.

Pentru a îmbun t i performan a la reg sirea datelor dintr-o surs ODBC se poate utiliza stocarea local a înregistr rilor.
Valoarea dat în proprietatea CacheSize a obiectului QueryDef specific num rul de înregistr ri stocate. În mod implicit
se stocheaz 100 de înregistr ri.

Sub SetCacheSize()
Dim wrk As Workspace, qdf As QueryDef, rst As Recordset
Dim cnn As Connection, strConnect As String
Set wrk = CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"
Set qdf = cnn.CreateQueryDef("temporary")
qdf.SQL = "SELECT * FROM roysched"
qdf.CacheSize = 200
Set rst = qdf.OpenRecordset()
' executarea opera iunilor necesare pe recordset

rst.Close
cnn.Close
End Sub

Colec ia Parameters

Printr-un obiect Parameter se reprezint un parametru transmis unei interog ri (dac este cazul) sau unei proceduri
memorate pe server. Utilizarea parametrilor permite o mai mare flexibilitate a interog rilor, care nu mai trebuiesc
recompilate la fiecare modificare a parametrilor c ut rii. Un obiect Parameter din spa iul ODBCDirect este similar, cu mici
diferen e, unui obiect Parameter din spa iul Microsoft Jet. În ODBCDirect se poate schimba valoarea propriet ii Type
(read-only în spa iul Jet). De asemenea se poate utiliza proprietatea Direction pentru a indica dac un parametru este de
intrare, de ie ire, ambele sau valoarea returnat de o procedur (a se vedea în Help - Direction Property).

Colec ia Recordsets

Un obiect Recordset reprezint înregistr rile care rezult din executarea unei interog ri pe un obiect Connection sau un
obiect Database, într-un spa iu de lucru ODBCDirect. Colec ia Recordsets con ine toate obiectele Recordset deschise
curent. Situarea în ierarhia de obiecte este prezentat în tabelul urm tor

194
Obiectul sau colec ia Con inut în Con ine

Recordset (obiect) Colec ia Recordsets Colec ia Fields


Colec ia Properties

Recordsets (colec ie) Obiectul Connection Obiecte Recordset


Obiect Database

Obiectele Recordset suportate în spa iul de lucru ODBCDirect sunt de tipurile: dynaset, snapshot, forward-only i
dinamic. Cu excep ia ultimului tip, toate celelalte tipuri de obiecte Recordset au fost prezentate la spa iul de lucru
Microsoft Jet.

Obiecte Recordset de tip dinamic

Un obiect Recordset de tip dinamic este similar unui obiect de tip dynaset, dar este actualizat în mod dinamic, pe m sur
ce al i utilizatori execut modific ri în tabela de baz .

Pentru a crea un obiect Recordset de tip dinamic se va specifica valoarea dbOpenDynamic pentru argumentul type al
metodei OpenRecordset.

Recordseturile de tip dinamic sunt disponibile doar pentru acele drivere ODBC care ofer propriile cursoare. Înainte de
deschiderea unui Recordset dinamic trebuie s se asigure c driverul ODBC suport acest lucru. Pentru driverele care
nu ofer cursoare proprii, deci nu suport recordseturi dinamice, se vor deschide obiecte Recordset de tip snapshot sau
forward-only.

Avantajul utiliz rii obiectelor Recordset de tip dinamic este reflectarea imediat a tuturor schimb rilor din date, inclusiv
înregistr rile ad ugate sau terse. Pentru a realiza acest lucru este îns necesar ca DAO s interogheze mereu tabelele
de baz , ceea ce se traduce prin performan redus ca vitez . Acest tip se recomand , prin urmare, doar pentru situa ii
unde este esen ial s se dispun de cele mai recente actualiz ri ale datelor.

Deschiderea asincron a obiectelor Recordset

Pentru a deschide un Recordset în mod asincron, similar interog rilor din spa iile ODBCDirect, se utilizeaz constanta
dbRunAsync ca valoare a argumentului options pentru metoda OpenRecordset. Se pot astfel utiliza metoda Cancel i
proprietatea StillExecuting direct pe obiectul Recordset. De exemplu, la deschiderea unui Recordset care dureaz
foarte mult deoarece returneaz un mare num r de înregistr ri, utilizatorul poate fi l sat s anuleze opera iunea pentru a
specifica criterii mai restrictive de formare a obiectului.

La anularea (prin Cancel) a unei metode OpenRecordset, obiectul Recordset devine nevalabil i trebuie redeschis
pentru a reg si un obiect Recordset corect.

Pentru cazul obiectelor Recordset cu multe înregistr ri este util aplicarea metodei MoveLast în mod asincron. Acest
fapt se realizeaz utilizând argumentul dbRunAsync cu metoda, sub forma

recordset.MoveLast dbRunAsync

în continuare se poate testa proprietatea StillExecuting (a obiectului Recordset) i aplica metoda Cancel.

Colec ia Fields

În spa iul de lucru ODBCDirect, un obiect Field reprezint un câmp dintr-un obiect QueryDef sau obiect Recordset.
Anumite proces ri sunt enumerate în continuare.
195
• Proprietatea OrdinalPosition este utilizat pentru determinarea ordinii obiectului Field în colec ia Fields.
• Proprietatea Value fixeaz sau returneaz data memorat în câmp.
• Metodele AppendChunk, GetChunk i proprietatea FieldSize returneaz sau fixeaz o valoare dintr-un obiect
OLE sau câmp memo a unui obiect Recordset.
• Propriet ile Type, Size i Attributes determin tipul datelorcare pot fi memorate într-un câmp.
• Propriet ile SourceField i SourceTable determin sursa original a datelor.
• Propriet ile Value, VisibleValue i OriginalValue sunt utilizate pentru verificarea complet rii cu succes a unei
actualiz ri în loturi (problema este discutat i în continuare).

Utilizarea ODBCDirect

În aceast sec iune sunt prezentate câteva opera iuni uzuale într-un spa iul de lucru ODBCDirect: actualizarea optimist
în loturi, lucrul cu cursoare, lucrul cu proceduri memorate.

Utilizarea actualiz rii optimiste în loturi

În multe aplica ii client-server, actualiz rile optimiste apar pe principiul "înregistrare cu înregistrare". Aceasta se întâmpl
în mod uzual în modul

o Un utilizator editeaz o înregistrare.


o Utilizatorul vrea s salveze înregistrarea.
o Serverul încearc s blocheze aceast înregistrare; dac reu e te, înregistrarea este actualizat , în caz
contrar o violare a bloc rii este tratat de c tre aplica ie.
o Utilizatorul se mut la alt înregistrare i procesul se reia.

De i acest mod de operare func ioneaz bine în multe cazuri, este uneori mai eficient ca utilizatorul s editeze mai multe
înregistr ri care sunt stocate local i abia apoi s le trimit serverului într-un singur lot pentru actualizare. Metoda se
nume te actualizare optimist în loturi (batch optimistic updating) i presupune etapele:

o Crearea unui spa iu ODBCDirect


o Stabilirea propriet ii DefaultCursorDriver, a spa iului de lucru, la valoare dbUseClientBatchCursor.
o Deschiderea unui obiect Connection sau Database din spa iul ODBCDirect.
o Utilizarea metodei OpenRecordset pentru obiectul deschis în pasul precedent cu scopul de a deschide
un Recordset i specificarea constantei dbOptimisticBatch ca valoarea a argumentului lockedits.
o Efectuarea edit rilor necesare în obiectul Recordset. Toate edit rile sunt memorate local.
o La terminare, actualizarea sursei de date se efectueaz prin metoda Update a obiectului Recordset, cu
specificarea valorii dbUpdateBatch pentru argumentul type.

Observa ie. Dac se lanseaz (programatic) o actualizare în lot în timp ce o înregistrare din obiectul Recordset este
editat de utilizator, înregistrarea care se editeaz va fi actualizat în mod automat înainte de începerea actualiz rii în lot.

Exemplul urm tor ilustreaz modul de utilizare a actualiz rii în lot.

Function RunInBatch()
Dim wrk As Workspace, cnn As Connection, rst As Recordset
Dim strConnect As String

' crearea spa iului de lucru


Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
' stabilirea driverului de cursor implicit
wrk.DefaultCursorDriver = dbUseClientBatchCursor
' crearea irului de conectare
strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UID=sa;PWD=;"
196
' deschiderea conexiunii
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' deschiderea recordsetului din conexiune
Set rst = cnn.OpenRecordset( _
"SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch)

' schimbarea înregistr rilor în recordsetul local


While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
Wend

' actualizarea înregistr rilor în sursa de date


rst.Update dbUpdateBatch
End Function

Dac mai multe înregistr ri au fost editate local i se dore te ca înregistrarea curent s fie actualizat înaintea
actualiz rii în lot, se poate apela metoda Update i specifica dbUpdateCurrentRecord pentru argumentul type. În acest
mod se scrie înregistrarea curent în sursa de date f r a se efectua alt actualizare, exemplul urm tor ilustraz metoda.

' Editarea i actualizarea primei înregistr ri


' Doar prima înregistrare este scris în sursa de date
rst.MoveFirst
rst.Edit
rst!qty = rst!qty + 2
rst.Update dbUpdateCurrentRecord

' actualizarea restului de înregistr ri


rst.Update dbUpdateBatch

Tratarea coliziunilor

La încercarea de actualizare a unui grup de înregistr ri într-un singur lot, este posibil ca al i utilizatori s editeze în acela i
timp una sau mai multe înregistr ri din lot, producând astfel o coliziune.

Pentru tratarea coliziunilor se va examina proprietatea BatchCollisions a obiectului Recordset. Proprietatea


BatchCollisions returneaz un tablou care memoreaz bookmark-uri punctând c tre înregistr rile din obiectul
Recordset pentru care au ap rut coliziuni. De fiecare dat când apare o coliziune în timpul actualiz rii în lot, este
ad ugat la tablou un pointer c tre îregistrarea pentru care apare coliziunea. Se poate parcurge fiecare asemenea
bookmark i examina urm toarele propriet ii ale obiectului Field al înregistr rii curente.

Proprietatea Descriere

Value Valoarea curent a câmpului din Recordset. Aceasta corespunde valorii câmpului dup apelul
metodei Update.

OriginalValue Valoarea câmpului din obiectul Recordset înainte de apelul metodei Update.

VisibleValue Valoarea câmpului dup cum este memorat în baza de date.

Dup examinarea propriet ilor se poate alege o op iune dintre:

197
o Se poate for a scrierea în baza de date a valorii curente din obiectul Recordset, suprascriind valoarea
original a câmpului. Pentru aceasta se apeleaz metoda Update i specifica True pentru argumentul
force.
o Se poate schimba valoarea curent din obiectul propriu Recordset la valoarea original i for a
schimbarea în baza de date.

Observa ie. Apelul metodei Update cu dbUpdateBatch ca argument type i True ca argument force produce trecerea în
baz a tuturor modific rilor proprii i suprascrierea modific rilor efectuate de al i utilizatori. Din acest motiv este mai sigur
apelul metodei Update f r for are i rezolvarea ulterioar a coliziunilor prin folosirea tabloului returnat de proprietatea
BatchCollisions împreun cu Value, OriginalValue i VisibleValue.

Urm torul exemplu arat utilizarea tabloului returnat de proprietatea BatchCollision în for area în baza de date a
modific rilor din obiectul Recordset local.

Function BatchForceChanges()
Dim rst As Recordset, cnn As Connection, varCollision As Variant
' deschiderea recordsetului pentru actualizarea optimist în lot
Set rst = cnn.OpenRecordset("SELECT * FROM sales", _
dbOpenDynaset, 0, dbOptimisticBatch)
' modificarea înregistr rilor din recordsetul local
While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
Wend
rst.Update dbUpdateBatch

' verificarea coliziunilor i for area modific rilor


For j = 0 to rst.BatchCollisionCount - 1
varCollision = rst.BatchCollision(j)
rst.BookMark = varCollision
rst.Update dbUpdateCurrentRecord, True
Next j
End Function

Exemplul urm tor poate fi modificat astfel încât actualizarea înregistr rilor cu coliziuni s nu se desf oare una câte una,
de i metoda de for are global nu este tocmai indicat .

' deschidere recordset


Set rst = _
cnn.OpenRecordset(("SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch)
' modificare înregistr rilor
While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
Wend
rst.Update dbUpdateBatch, True

198
Utilizarea cursoarelor în spa iile ODBCDirect

Un cursor indic pozi ia înregistr rii curente dintr-o mul ime rezultat. Majoritatea tipurilor de cursoare con in o
reprezentare a datelor din sursa de date i nu sunt actualizabile. Numim keyset un cursor care con ine date efective i
care sunt actualizabile.

Cu un cursor se lucreaz prin intermediul unui obiect DAO Recordset. La deschiderea unui obiect Recordset prin DAO,
ODBCDirect creeaz cursorul corespunz tor. Fiecare tip de obiect Recordset, cu excep ia celui de tip tabel ,
corespunde unui tip diferit de cursor.

Caracteristicile cursoarelor

Se pot utiliza cursoare pentru a lucra cu mul imi de date dintr-o surs ODBC. Cursoarele pot:

o S reprezinte anumite înregistr ri sau toate înregistr rile unei tabele


o S reprezinte anumite înregistr ri sau toate înregistr rile unei uniuni de tabele
o S nu reprezinte nici o înregistrare
o S fie read-only sau actualizabile fie la cursor sau la nivel de câmp
o S fie complet navigabile sau doar înainte
o S existe fie la client, fie pe server.

Cursoare pe partea client sau pe partea server

Un cursor necesit resurse temporare pentru a- i p stra datele. Aceste resurse pot fi în forma RAM, un fi ier paginabil
cum ar fi memoria virtual din Windows, sau fi iere/baze de date temporare. Dac resursele sunt memorate pe ma ina
clientului, cursorul este numit cursor client-side. Cu acest tip de cursor, serverul trimite datele reprezentând cursorul prin
re ea c tre client, ca i datele cerute de cursor. Clientul gestioneaz resursele temporare necesare.

Anumite motoare de baze de date, cum ar fi Microsoft SQL Server 6.0, suport i cursoare de tip server-side. Cu acest tip
de cursor, serverul gestioneaz mul imea de înregistr ri rezultate cu resurse de pe server. Serverul returneaz prin re ea
doar datele cerute de client. Utilizarea acestui tip de cursor poate cre te performan a aplica iei, mai ales atunci traficul de
re ea este mare, dar apare condi ia ca serverul s poat oferi resursele necesare tuturor cursoarelor cerute de clien i.

Alegerea tipului de cursor

La deschiderea unui obiect Recordset pe o surs de date care nu este ODBC, constanta utilizat pentru argumentul type
al metodei OpenRecordset determin tipul de recordset deschis. La deschiderea unui Recordset pe o surs ODBC,
acela i argument, type, specific tipul de cursor pe care îl reprezint obiectul Recordset. Fiecare tip de cursor
corespunde unui tip de recordset. Urm torul tabel arat efectul valorilor argumentului type atât pentru surse de date
ODBC, cât i pentru surse non-ODBC.

Constanta Recordset type Cursor type


(argumentul type) (surse non-ODBC) (surse de date ODBC)

dbOpenDinamic Dynamic type Dynamic

dbOpenDynaset Dynaset type Keyset

dbOpenSnapshot Snapshot type Static

dbOpenForwardOnly Forward-only type Forward-only scrolling (valoarea implicit )

199
Observa ie. Cum obiecte Recordset de tip tabel nu exist în spa iile de lucru ODBCDirect, nu exist cursor
corespunz tor acestui tip de recordset.

Proprietatea DefaultCursorDriver a obiectului Workspace specific unde este creat cursorul – la client sau pe server.
Valorile posibile pentru proprietate sunt date în tabelul al turat.

Constanta Descriere
(proprietatea
DefaultCursorDriver)

dbUseODBCCursor Utilizare cursoare la client. Rezultate bune pentru mul imi mici de înregistr ri rezultate.

dbUserServerCursor Utilizare cursoare pe server. Performan mai bun pentru multe înregistr ri dar poate
duce la m rirea traficului de re ea, nu toate sursele ODBC suport aceast valoare.

dbUseDefaultCursor Utilizare cursoare pe server, dac este posibil; cursoare client în caz contrar.

dbUseClientBatchCursor Utilizarea cursoarelor lor la client. Cerut la actualiz rile în loturi.

dbUseNoCursor Deschidere obiect Recordset ca forward-only, read-only, cu rowset = 1.

Blocarea înregistr rilor (Record Locking)

La deschiderea unui obiect Recordset se poate specifica i tipul de blocaj al înregistr rilor inten ionat în cazul
actualiz rilor. Pentru aceasta se utilizeaz argumentul lockedits al metodei OpenRecordset. Urm torul tabel con ine
explica ii pentru tipurile posibile de blocaj i valorile corespunz toare ale argumentului lockedits.

Constanta Descrierea
(argumentul lockedits) tipului de blocaj al cursorului ODBC

dbOptimistic Pagina con inând înregistrarea este blocat doar atât timp cât înregistrarea este
actualizat prin metoda Update.

dbPessimistic Pagina cu înregistrarea este blocat cât mai devreme, de la utilizarea metodei Edit.

dbOptimisticValue Utilizarea concuren ei optimiste bazat pe valorile înregistr rilor.

dbOptimisticBatch Utilizarea actualiz rii optimiste în lot.

dbReadOnly Implicit pentru spa iile ODBCDirect, interzice modific ri în datele obiectului Recordset.

Anumite combina ii de tipuri de cursoare i de blocaj nu func ioneaz împreun . De exemplu, cu cursoarele Microsoft
SQL Server 6.0, specificarea dbOpenSnapshot pentru argumentul type cere specificarea dbReadOnly pentru lockedits.
Combina iile care merg se vor vedea în documenta ia driverului cursorului. Utilizarea unei combina ii nesuportate este
raportat de DAO în colec ia Errors, de unde poate fi analizat i tratat prin alegerea urm toarei combina ii plauzibile.

Limit ri ale cursoarelor

Datorit valorilor implicite prezentate în tabelele anterioare, obiectul Recordset implicit este read-only, forward-only i nu
poate fi actualizat. Editarea înregistr rilor necesit specificarea explicit a unui tip de blocaj diferit de dbReadOnly la
aplicarea metodei OpenRecordset.

200
Deoarece nu se pot deschide recordseturi de tip tabel în spa iul ODBCDirect, nu se pot utiliza proprietatea Index i
metoda Seek de reg sire a datelor. De asemenea nu se pot utiliza metodele Find: FindFirst, FindNext, FindPrevious
sau FindLast. În mediul client/server este mai eficient s se selecteze doar datele necesare i nu mul imi mai vaste din
care s se g seasc ulterior înregistr rile necesare. Aceast înseamn c interog rile trebuie efectuate mai atent (mai
restrictive).

Reg sirea unor mul imi multiple de rezultate

Orice propozi ie SQL poate include mai multe propozi ii SELECT sau proceduri memorate care invoc una sau mai multe
propozi ii SELECT. Fiecare instruc iune SELECT genereaz o mul ime de rezultate care trebuie s fie procesat de cod
sau ignorat mai înainte ca resursele s fie eliberate i urm toarea mul ime de rezultate s fie disponibil pentru
procesare. Deoarece nu se tie a priori câte mul imi de rezultate sunt generate de o procedur memorat , codul trebuie
s fie preg tit s prelucreze un num r necunoscut de mul imi. De notat c în cazul return rii de c tre o procedur
memorat a mai multor mul imi de rezultate, nici una dintre acestea nu poate fi actualizat .

Se pot utiliza fie cursoare client-side, fie cele server-side pentru reg sirea unor multiple mul imi de rezultate. Dac se
utilizeaz cursoare client-side, mul imile de rezultate sunt returnate de toate obiectele Recordset. Cursoarele server-side
returneaz multiple mul imi de rezultate doar la deschiderea unui Recordset de tip forward-only.

Pentru ob inerea mai multor mul imi de rezultate

1. Stabilirea propriet ii DefaultCursorDriver la valoarea dbUseServerCursor pentru specificarea cursoarelor


server-side
2. Crearea unui obiect QueryDef i stabilirea propriet ii SQL la un ir valid SQL care returneaz multiple obiecte
Recordset.
3. Stabilirea propriet ii CacheSize a obiectului QueryDef la 1 pentru a cere serverului trimiterea unei singure
înregistr ri o dat . La reg sirea înregistr rilor în acest mod nu se utilizeaz efectiv cursorul.
4. Deschiderea obiectului Recordset pe obiectul QueryDef creat. Se d valoarea dbOpenForwardOnly pentru
argumentul type al metodei OpenRecordset.
5. Utilizarea metodei NextRecordset pentru a accesa urm torul obiect Recordset din grupul de obiecte Recordset
returnat de server. Aceasta ignoreaz obiectul Recordset curent i îl înlocuie te cu urm torul obiect. Dac nu
mai exist obiecte Recordset atunci metoda NextRecordset returneaz valoarea False iar obiectul curent
Recordset va fi gol (empty).

Exemplul urm tor tip re te valorile pentru fiecare câmp din fiecare înregistrare a fiec rei mul imi de rezultate.

Function GetMultipleResults()
Dim wrk As Workspace, rst As Recordset, cnn As Connection, qdf As QueryDef
Dim fld As Field, strSQL As String, strConnect As String, fDone As Boolean

' creare spa iu ODBCDirect


Set wrk = DBEngine.CreateWorkspace(""ODBCDirect", "Admin", "", dbUseODBC)
' creare ir de conectare
strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UID=sa;PWD=;"
' deschidere conexiune
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' Creare instruc iuni SQL
strSQL = "SELECT au_lname, au_fname FROM Authors; SELECT title FROM Titles;"
' stabilirea cursorului implicit
wrk.DefaultCursorDriver = dbUseServerCursor
' Deschidere recordset
Set qdf = cnn.CreateQueryDef("", strSQL)
qdf.CacheSize = 1
' Deschiderea recordset pentru interogare

201
Ser rst = qdf.OpenRecordset(dbOpenForwardOnly)

Do Until fDone = True


' tip rirea valorilor câmpurilor
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value
Next fld
rst.MoveNext
Wend
FDone = Not rst.NextRecordset()
Loop
rst.Close
cnn.Close
wrk.Close
End Function

Lucrul cu proceduri memorate

Se pot utiliza obiecte ODBCDirect QueryDef pentru a executa proceduri memorate, inclusiv proceduri memorate care
necesit parametri de intrare i returneaz valori. Urm torul exemplu creeaz procedura numit GetEmps, memorat pe
server.

strSQL = "CREATE PROCEDURE GetEmps AS"


strSQL = strSQL & "SELECT * FROM EMPLOYEE;"
cnn.Execute strSQL

Dac exist de i o procedur cu acest nume, se poate utiliza instruc iunea DROP pentru a terge mai înainte versiunea
veche:

strSQL = "DROP PROCEDURE GetEmps;"


cnn.Execute strSQL

Se poate executa procedura memorat utilizând metoda Execute a obiectului Connection. Pentru a reg si valoarea
returnat se creeaz un obiect QueryDef i deschidem un recordset pe el.

Set qdf = cnn.CreateQueryDef("qry", "{ call GetEmps() }")


Set rst = qdf.OpenRecordset

Se utilizeaz obiectul Parameter pentru a lucra cu parametrii. Proprietatea Direction a obiectului Parameter comunic
DAO cum func ioneaz parametrul. Driverul ODBC încearc s determine direc ia parametrului (intrare sau ie ire) dar
proprietatea Direction este read/write a a c direc ia poate fi schimbat . Urm torul exemplu creeaz o procedur
memorat cu un parametru de intrare i o valoare returnat . Procedura este executat i se reg se te valoarea returnat .

' crearea procedurii memorate pe server


strSQL = "CREATE PROCEDURE UpdateEmps (@invar int) AS RETURN @invar;"
cnn.Execute strSQL

' crearea QueryDef pentru a executa procedura memorat


Set qdf = cnn.CreateQueryDef("qry", "{ ? = call UpdateEmps(?) }")

' tratarea parametrilor


qdf.Parameters(0).Direction = dbParamReturnValue
qdf.Parameters(1) = 10
202
qdf.Execute

' ob inerea valorii returnate


var = qdf.Parameters(0).Value

Modelul de obiecte PowerPoint

În acest capitol se prezint principalele obiecte din modelul de obiecte Microsoft PowerPoint 97. Pentru a vedea o
imagine a întregului model de obiecte PowerPoint ca i enumer rile complete ale propriet ilor i metodelor se vor
consulta, totu i, intr rile respective din Help.

Afi area sistemului de help Microsoft PowerPoint Visual Basic este posibil dac la instalarea aplica iei PowerPoint s-a
selectat instalarea componentei Online Help for Visual Basic. Pentru a vedea con inutul i indexul acestui sistem de
fi iere Help, click pe Contents and Index în meniul Help din Visual Basic Editor (VBE), iar în fi a Contents din dialogul
Help Topics dublu click pe "Microsoft PowerPoint Visual Basic Reference".

Obiectul Application

La pornirea unei sesiuni PowerPoint, se creeaz un obiect Application. Propriet ile i metodele acestui obiect sunt
utilizate pentru controlarea atributelor i comport rii întregii aplica ii i ob inerea accesului la restul modelului de obiecte
PowerPoint.

Urm toarele propriet i pot fi utilizate f r calificatorul Application, constituind accesori la modelul de obiecte:
ActivePresentation, ActiveWindow, AddIns, Assistant, CommandBars, Presentations, SlideShowWindows i
Windows. Pentru alte propriet i i metode este necesar calificarea. De exemplu:

Application.Quit

Cele mai utilizate propriet i i metode sunt prezentate, dup func ionalitate, în continuare.

Returnarea unui obiect Application

Din cod executate în PowerPoint, obiectul Application este referit prin cuvântul cheie Application, ca în exemplul
anterior.

Dac se atribuie unei variabile obiectul Application, variabila se va declara de tip PowerPoint.Application, dup modelul

Dim appPPT As PowerPoint.Application


Set appPPT = Application

Se poate utiliza de asemenea proprietatea Application a oric rui obiect PowerPoint pentru a returna obiectul
Application PowerPoint. Aceast metod este util atunci când este necesar s se ob in referin a la obiectul
Application dintr-o prezentare PowerPoint scufundat în documentul altei aplica ii. Urm torul exemplu, executat din
Excel, stabile te o variabil la obiectul aplica ie PowerPoint utilizând primul shape (care trebuie s fie o prezentare
PowerPoint) din foaia de calcul.

Dim appPPT As PowerPoint.Application


Set embeddedPres = Worksheets(1).Shapes(1)
embeddedPres.OLEFormat.Activate
Set appPPT = embeddedPres.OleFormat.Object. Application

203
Urm torul exemplu creeaz un obiect Application PowerPoint din alt aplica ie, porne te PowerPoint i deschide o
prezentare existent :

Set ppt = CreateObject("Powerpoint.Application.8")


ppt.Visible = True
ppt.Presentations.Open "…numele prezent rii, eventual cu cale"

Controlul aspectului ferestrei aplica iei

Un rezumat al propriet ilor i metodelor care controleaz aspectul ferestrei în care se execut PowerPoint este prezentat
în tabelul urm tor.

Ac iunea Proprietatea sau metoda util

Activarea ferestrei aplica iei PowerPoint Metoda Activate

Verificarea faptului c fereastra aplica iei PowerPoint este activ Proprietatea Active

Stabilirea sau returnarea textului care apare în bara de titlu a aplica iei Proprietatea Caption
PowerPoint

Stabilirea sau returnarea m rimii i pozi iei ferestrei PowerPoint pe ecran Propriet ile Height, Left, Top i Width

Stabilirea sau returnarea vizibilit ii ferestrei aplica iei. Trebuie dat valoarea Proprietatea Visible
True la crearea obiectului Application PowerPoint în alt aplica ie pentru a
vedea PowerPoint pe ecran.

Stabilirea sau returnarea st rii ferestrei aplica iei: maximizat , minimizat Proprietatea WindowsState
sau flotant .

Multe dintre aceste propriet i i metode se aplic , de asemenea, obiectului DocumentWindow pentru controlarea
aspectului ferestrei documentului.

Controlarea atributelor i comport rii globale a aplica iei

Atributele sau ac iunile caracteristice pentru întreaga aplica ie PowerPoint sunt controlate prin propriet ile i metodele
prezentate în tabelul urm tor.

Ac iunea Proprietatea sau metoda util

Numele imprimantei active Proprietatea ActivePrinter

Returnarea num rului de construc ie PowerPoint Proprietatea Build

Afi area unui subiect de Help Metoda Help

Returnarea numelui sistemului de operare Proprietatea OperatingSystem

Returnarea c ii c tre aplica ia PowerPoint Proprietatea Path

P r sirea (închiderea) aplica iei PowerPoint Metoda Quit

204
Executarea unei proceduri Visual Basic Metoda Run

Returnarea num rului de versiune Proprietatea Version

Accesarea principalelor obiecte ale aplica iei

Propriet ile enumerate în tabelul urm tor dau acces la principalele obiecte con inute în obiectul Application: prezent ri,
ferestre ale documentului, ferestre de vizualizare a diapozitivelor. Toate propriet ile sunt ale obiectului Application.

Obiectul returnat Proprietatea utilizat

Presentations (colec ie) Proprietatea Presentations

Prezentarea activ Proprietatea ActivePresentation

DocumentWindows (colec ie) Proprietatea Windows

Fereastra documentului activ Proprietatea ActiveWindow

AddIns (colec ie) Proprietatea AddIns

SlideShowWindows (colec ie) Proprietatea SlideShowWindows

Accesarea obiectelor partajate de Microsoft Office

Ob inerea referin elor de obiecte comune tuturor aplica iilor Microsoft Office, cum ar fi barele de meniuri i de unelte,
FileSearch etc., este rezumat în tabelul urm tor.

Referin la Proprietatea utilizat

Office Assistant Proprietatea Assistant

Meniuri i bare de unelte PowerPoint Proprietatea CommandBars

C utarea fi ierelor Proprietatea FileSearch

Editorul Visual Basic Proprietatea VBE

Obiectul Presentation

Se creeaz un obiect Presentation de fiecare dat când se deschide sau se creeaz un fi ier (o prezentare) în
PowerPoint. Se va observa c multe dintre propriet ile i metodele obiectului Presentation corespund intr rilor din
meniul File. Propriet ile i metodele obiectului Presentation, sau ale colec iei respective, sunt utilizate pentru a
deschide, crea, salva sau închide fi iere. Prin intermediul lor se vor controla atributele i comportarea global i, de
asemenea, se va ob ine acces la obiectele con inute: slide-uri i mastere.

Returnarea obiectului Presentation

Se va utiliza proprietatea ActivePresentation a obiectului Application pentru a returna prezentarea care este afi at în
fereastra activ . Urm torul exemplu salveaz prezentarea activ :

205
ActivePresentation.Save

Se poate returna oricare dintre prezent rile deschise curent prin colec ia Presentations, în modul uzual de referire a unui
element dintr-o colec ie:

Presentations("Sample Presentation").Slides.Add 1, 1

adaug un nou slide la prezentarea "Sample Presentation".

Prin proprietatea Presentation a obiectelor DocumentWindow i SlideShowWindow se poate returna o referin la


prezentarea care a creat respectivele ferestre (de remarcat c proprietatea Parent returneaz un obiect diferit dac
obiectul apar ine unei prezent ri scufundate). Urm torul exemplu afi eaz numele prezent rii care se execut în prima
fereastr slide show:

MsgBox SlideShowWindow(1).Presentation.Name

Pentru a returna un obiect Presentation reprezentând o prezentare scufundat , se utilizeaz proprietatea Object a
obiectului OLEFormat pentru forma (shape) care con ine prezentarea scufundat , dup modelul

Dim embeddedPres As Presentation


Set embeddedPres = ActivePresentation.Slides(1).Shapes(3).OLEFormat.Object

prin care se atribuie variabilei embeddedPres prezentarea scufundat în al treilea shape de pe diapozitivul cu num rul 1.

Deschiderea unei prezent ri existente

Metoda Open a colec iei Presentations (returnat de proprietatea sinonim a obiectului Application) realizeaz
deschiderea unei prezent ri, dup modelul

Dim myPres As Presentation


Set myPres = Presentations.Open _
(FileName:= " … nume fi ier + cale (dac este necesar )…")
myPres.Window(1).ViewType = ppViewSlideSorter

unde prezentarea deschis este vizualizat în modul Slide Sorter.

Crearea unei prezent ri noi

În acest scop se utilizeaz metoda Add a colec iei Presentations. Este uzual ca obiectul Presentation ob inut s fie
atribuit unei variabile pentru procesare programatic ulterioar . În exemplul urm tor se creeaz o prezentare nou i se
adaug un slide.

Dim myPres As Presentation


Set myPres = Presentations.Add
myPres.Slides.Add 1, ppLayoutTitle

Atribuirea unui nume semnificativ are de asemenea rolul de a permite o referire u oar la o prezentare. În exemplul
urm tor se creeaz o nou prezentare care este salvat imediat cu un nume prin aplicarea metodei SaveAs. Este de
remarcat c proprietatea Name a obiectului Presentation este read-only i prin urmare nu poate fi modificat ; astfel o
prezentare este identificat în mod unic prin numele s u într-un proiect. Numele poate fi utilizat în mod uzual pentru a
ob ine o referin prin intermediul colec iei Presentations:

206
Presentations.Add.SaveAs "Sales Report"
Presentations("Sales Report").Slides.Add 1, ppLayoutTitle

Importul unei prezent ri dintr-o schi (outline) Word

Crearea unei prezent ri dintr-un outline scris în Word se realizeaz din Microsoft Word prin metoda PresentIt a obiectului
Document reprezentând outline-ul. Exemplul urm tor este ilustrativ:

Documents.Open("C:\Presentation Outline.doc").PresentIt

Activarea unei prezent ri

Nu exist o metod Activate pentru obiectul Presentation. Activarea prezent rii are loc o dat cu activarea uneia dintre
ferestrele de document ale prezent rii:

Presentations("Sales Report").Windows(1).Activate

Controlul numerot rii i dimensiunii diapozitivelor

Proprietatea PageSetup a obiectului Presentation returneaz un obiect PageSetup. Acest obiect con ine valorile pentru
orientarea pagini de note i a diapozitivelor, dimensiuni i numerotare. Propriet ile obiectului PageSetup sunt similare
dialogului PageSetup din meniul File, astfel încât anumite atribuiri produc în mod automat efecte asupra altor parametri
(de exemplu o l ime mai mare decât în l imea produce o orientare landscape). Propriet ile sunt:

FirstSlideNumber - returneaz sau stabile te numerotarea primului diapozitiv.

NotesOrientation, SlideOrientation - returneaz sau stabilesc orientarea pe ecran i imprimant a notelor i


diapozitivelor. Pot fi una dintre valorile (MsoOrientation): msoOrientationHorizontal, msoOrientationMixed sau
msoOrientationVertical.

SlideHeight, SlideWidth - returneaz sau stabilesc dimensiunile unui diapozitiv, în puncte.

SlideSize - tipul de dimensiune a unui diapozitiv. Poate fi una dintre constantele predefinite (PpSlideSizeType):
ppSlideSize35MM, ppSlideSizeA4Paper, ppSlideSizeCustom, ppSlideSizeLetterPaper, ppSlideSizeOnScreen sau
ppSlideSizeOverhead.

Exemplul urm tor stabile te pentru toate diapozitivele dimensiunea 11" x 8.5" i numerotarea diapozitivelor de la 17.

With ActivePresentation.PageSetup
.SlideWidth = 11 * 72
.SlideHeight = 8.5 * 72
.FirstSlideNumber = 17
End With

Ar fi de remarcat c stabilirea explicit a dimensiunilor produce trecerea propriet ii SlideSize la valoarea


ppSlideSizeCustom i a propriet ii SlideOrientation la msoOrientationHorizontal.

Stabilirea unui aspect unitar al prezent rii

Se poate lucra programatic cu abloane i cu elementele master ale unei prezent ri.

Aplicarea unui ablon se efectueaz prin metoda ApplyTemplate a obiectului Presentation, dup modelul
207
ActivePresentation.ApplyTemplate " … template-ul, eventual cu cale …"

Propriet ile HandoutMaster, NotesMaster, SlideMaster sau TitleMaster ale obiectului Presentation returneaz un
obiect Master care reprezint masterul entit ii respective.

Utilizarea propriet ilor obiectului Master permite stabilirea fundalului, modificarea schemei de culori, ad ugarea de
controale ActiveX, lucrul cu stilurile de text. Orice modificare efectuat pentru Master se reflect în categoria respectiv
de elemente ale prezent rii.

Dintre propriet ile obiectului Master prezent m câteva în continuare, fiecare necesitând îns o c utare în Help deoarece
returneaz colec ii de obiecte complexe.

Background - returneaz un obiect ShapeRange reprezentând background-ul diapozitivului.

ColorScheme - returneaz sau stabile te obiectul ColorScheme reprezentând schema de culori a masterului.

HeadersFooters - returneaz colec ia HeadersFooters care reprezint antetul, subsolul, data i num rul de pagin al
diapozitivului.

Height, Width - returneaz dimensiunile, în puncte. Sunt read-only pentru un master.

Shapes - returneaz colec ia Shapes reprezentând toate elementele care au foest plasate sau inserate în master.
Colec ia poate con ine desene, forme (shapes), obiecte OLE, imagini etc.

TextStyles - returneaz colec ia TextStyles reprezentând trei stiluri de text: title text (stilul titlului), body text (textul din
interiorul diapozitivului) i default text (textul din forme grafice – shapes).

Urm torul exemplu stabile te umplerea fundalului diapozitivului master:

ActivePresentation.SlideMaster.Background.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientBrass

Dac se dore te ca o form specific , cum ar fi o imagine sau un control ActiveX, s apar pe toate slide-urile unei
prezent ri, aceasta se va ad uga la master. Un control ActiveX de pe master va r spunde la evenimente din prezentarea
diapozitivelor la fiecare click pe control, pe orice slide s-ar afla.

Modific rile uniforme ale textului se realizeaz prin intermediul stilurilor. Fiecare obiect TextStyle (din colec ia returnat
de proprietatea TextStyles) con ine un obiect TextFrame care descrie cum este plasat textul în boxa de text i un obiect
Ruler care con ine tab stopurile i informa ia de indentare. Proprietatea Levels a obiectului TextStyle returneaz colec ia
TextStyleLevels care con ine informa ia de formatare pentru 5 nivele de list ierarhizat (pentru titlu i corp se va utiliza
întotdeauna nivelul întâi). Exemplul urm tor utilizeaz aceste propriet i pentru o formatare:

With ActivePresentation.SlideMaster.TextStyles(ppBodyStyle).Levels(1)
With .Font
.Name = "Arial"
.Size = 36
End With
With .ParagraphFormat
LineRuleAfter = False
.SpaceAfter = 6
End With
End With

208
Observa ie. Stilurile pentru titlu i textul interior se poate stabili în mod diferit pentru fiecare master. Stilul textului din
formele gafice nu se aplic pentru fiecare master, ci este global, pentru întreaga prezentare.

Tip rirea unei prezent ri

Metoda PrintOut a obiectului Presentation tip re te prezentarea:

ActivePresentation.PrintOut

Op iunile de tip rire sunt fixate anterior tip ririi prin propriet ile i metodele obiectului PrintOptions (returnat de
proprietatea sinonim a obiectului Presentation).

Dintre propriet ile obiectului PrintOptions enumer m:

OutputType care returneaz sau stabile te care elemente ale present rii se tip resc. Poate fi o constant de tip
PpPrintOutputType:

ppPrintOutputBuildSlides ppPrintOutputNotesPages

ppPrintOutputOutline ppPrintOutputSixSlideHandouts

ppPrintOutputSlides (implicit ) ppPrintOutputThreeSlideHandouts

ppPrintOutputTwoSlideHandouts

NumberOfCopies care returneaz sau stabile te num rul de copii tip rite.

FitToPage care este True dac la tip rire se va scala diapozitivul încât s se potriveasc foii de hârtie.

Ranges care returneaz obiectul PrintRanges reprezentând domeniile de dipozitive care se tip resc.

Collate care este True ( i implicit) dac o copie a prezent rii este tip rit complet înaintea copiei urm toare.

Exemplul urm tor utilizeaz câteva asemenea propriet i:

With ActivePresentation.PrintOptions
.NumberOfCopies = 3
.Collate = True
.Parent.PrintOut
End With

unde se remarc faptul c proprietatea Parent returneaz obiectul Presentation c ruia i se poate folosi proprietatea
PrintOut.

Salvarea unei prezent ri

Prima salvare a prezent rii, în care i se d un nume, se efectueaz prin metoda SaveAs:

With Presentations.Add
.Slides.Add 1, ppLayoutTitle
.SaveAs "Sample"
209
End With

Urm toarele salv ri se ob in prin metoda Save:

ActivePresentation.Save

Închiderea unei prezent ri

Pentru a închide o prezentare se aplic obiectului Presentation metoda Close:

Presentations("Sample").Close

Dac prezentarea a fost modificat de la ultima salvare, este afi at, în mod automat, un mesaj de interogare asupra
salv rii. Pentru a închide prezentarea f r salvare i f r afi area mesajului se stabile te mai întâi proprietatea Saved la
True:

With Application.Presentations("Sample")
.Saved = True
.Close
End With

Configurarea i executarea unei prezent ri

Se va utiliza proprietatea SlideShowSettings a obiectului Presentation pentru a returna obiectul sinonim


SlideShowSettings care reprezint execu ia unei prezent ri de diapozitive.

Obiectul SlideShowSettings are o singur metod , Run, care execut prezentarea potrivit parametrilor stabili i de
propriet ile obiectului SlideShowSettings.

Dintre propriet i enumer m câteva în continuare.

AdvanceMode returneaz sau stabile te valoarea care controleaz modul de trecere la urm torul diapozitiv. Poate fi o
constant de tip PpSlideShowAdvanceMode: ppSlideShowManualAdvance, ppSlideShowRehearseNewTimings sau
ppSlideShowUseSlideTimings.

StartingSlide, EndingSlide stabilesc sau returneaz diapozitivul cu care se începe execu ia prezent rii i cel unde se
termin vizionarea.

LoopUntilStopped care este True dac prezentarea se execut ciclic pân la ap sarea tastei ESC.

RangeType returneaz sau fixeaz tipul de prezentare executat . Poate fi una dintre constantele de tip
PpSlideShowRangeType: ppShowAll, ppShowNamedSlideShow sau ppShowSlideRange.

Urm torul exemplu ilustreaz câteva propriet i:

With ActivePresentation.SlideShowSettings
.StartingSlide = 2
.EndingSlide = 4
.RangeType = ppShowSlideRange
.AdvanceMode = ppSlideShowUseSlideTimings
.LoopUntilStopped = True
.Run
210
End With

unde se remarc faptul c ultima instruc iune apeleaz metoda Run, dup ce s-au fixat atributele execu iei.

Accesul la diapozitivele prezent rii

Prin metoda Slides a obiectului Presentation se ob ine accesul la diapozitivele prezent rii i, de aici, la textul i grafica
unui diapozitiv. Obiectul Slide este prezentat în sec iunea urm toare.

Obiectele Slides, Slide i SlideRange

Exist trei obiecte diferite în modelul de obiecte PowerPoint care reprezint diapozitive: colec ia Slides a tuturor
diapozitivelor dintr-o prezentare, colec ia SlideRange a diapozitivelor dintr-o submul ime de diapozitive i obiectul Slide
care reprezint un diapozitiv individual. În general, se va utiliza colec ia Slides pentru ad ugarea unui diapozitiv i când
se parcurg toate diapozitivele prezent rii; se va utiliza obiectul Slide dac se lucreaz cu un anumit diapozitiv; se va
utiliza colec ia SlideRange pentru a formata sau lucra cu mai multe diapozitive.

Returnarea colec iei Slides

Întreaga mul ime de diapozitive a unei prezent ri este referit prin proprietatea Slides a obiectului Presentation.
Urm torul exemplu insereaz slide-urile din Clipboard la sfâr itul prezent rii (pentru c nu s-a specificat locul lipirii prin
.Paste(index)):

Activepresentation.Slides.Paste

Returnarea obiectului Slide

O referin la un slide anumit se ob ine prin intermediul colec iei Slides în mod uzual prin metoda Item. Metoda fiind
implicit , men ioanrea ei este facultativ .

ActivePresentation.Slides(3).Copy

copie al treilea slide în Clipboard.

Fiecare diapozitiv al unei prezent ri are ata at un num r de identificare unic, definit automat la crearea diapozitivului.
Atunci când în proiectarea unei prezent ri se insereaz noi diapozitive, se terg diapozitive, se sorteaz etc., referirea
prin indice nu returneaz întotdeauna acela i diapozitiv. Referirea prin num rul de identificare conduce mereu la acela i
diapozitiv. Proprietatea SlideID a unui slide returneaz num rul de identificare, proprietatea fiind read-only. Proprietatea
FindBySlideID permite specificarea unui slide prin ID-ul s u. Exemplul urm tor utilizeaz aceste propriet i:

Dim newSlideID As Long


newSlideID = ActivePresentation.Slides.Add(1,ppLayoutTitleOnly).SlideID
ActivePresentation.Slides.FindBySlideID(newSlideID).Copy

Pentru a ob ine o referin la diapozitivul afi at curent într-o fereastr document sau de slide show, se utilizeaz
proprietatea Slide a obiectului View al ferestrei, dup modelul

Windows(2).View.Slide.Copy

Pentru a returna un slide dintr-o selec ie, se folose te Selection.SlideRange(index), unde index este numele sau
num rul de ordine din colec ie:

211
ActiveWindow.Selection.SlideRange(1).Layout = ppLayoutTitle

Returnarea unui obiect SlideRange

Prin Slides.Range(index), unde index este numele, indexul sau un tablou de asemenea elemente (nume sau indici), se
returneaz un obiect SlideRange din colec ia Slides. Pentru diapozitivele selectate astfel se poate realiza o formatare
unitar etc.

With Activepresentation.Slides.Range(Array(1, 3))


.FollowMasterBackground = False
.Background.Fill.PresetGradient (msoGradientHorizontal, 1, msoGradientLateSunset)
End With

Ad ugarea unui diapozitiv

La colec ia Slides se aplic metoda Add. Se creeaz un nou diapozitiv, se adaug la colec ia tuturor diapozitivelor.
Metoda accept dou argumente prin care se specific locul noului slide i layout-ul diapozitivului. Ca rezultat al aplic rii
metodei se returneaz un obiect Slide. Sintaxa:

expression.Add(Index, Layout)

unde

expression returneaz o colec ie Slides.

Index specific rangul noului slide în colec ia Slides (locul efectiv ocupat). Nu poate dep i Slides.Count + 1.

Layout specific formatul noului diapozitiv. Poate fi una dintre constantele PpSlideLayout:

ppLayoutBlank ppLayoutChart ppLayoutChartAndText

ppLayoutClipartAndText ppLayoutClipArtAndVerticalText ppLayoutFourObject

sppLayoutLargeObject ppLayoutMediaClipAndText ppLayoutObject

ppLayoutObjectAndText ppLayoutObjectOverText ppLayoutOrgchart

ppLayoutTable ppLayoutText ppLayoutTextAndChart

ppLayoutTextAndClipart ppLayoutTextAndMediaClip ppLayoutTextAndObject

ppLayoutTextAndTwoObjects ppLayoutTextOverObject ppLayoutTitle

ppLayoutTitleOnly ppLayoutTwoColumnText ppLayoutTwoObjectsAndText

ppLayoutTwoObjectsOverText ppLayoutVerticalText ppLayoutVerticalTitleAndText

ppLayoutVerticalTitleAndTextOverChart

Exemplul urm tor adaug un slide titlu la începutul prezent rii active.

ActivePresentation.Slides.Add 1, ppLayoutTitleOnly

212
Inserarea de diapozitive bazate pe un outline Word se realizeaz prin metoda InsertFromFile, dup modelul

ActivePresentation.Slides.InsertFromFile _
FileName:=" … numele fi ierului Word …", Index:=3

Metoda are un domeniu mai larg de aplicabilitate, sintaxa este

expression.InsertFromFile(FileName, Index, SlideStart, SlideEnd)

unde

expression returneaz o colec ie Slides.

FileName este numele fi ierului, eventual cu cale.

Index rangul diapozitivului din colec ia Slides specificat dup care se insereaz noile diapozitive.

SlideStart, SlideEnd specific prin indicii de inceput i de sfâr it domeniul diapozitivelor din fi ier care se insereaz în
colec ia Slides. Indicele omis este luat implicit drept indicele minim, respectiv maxim.

Stabilirea fundalului i a schemei de culori

Pentru o formatare global se vor utiliza elementele master. Dac se dore te ca un diapozitiv sau un grup de diapozitive
s aib o formatare distinct , se va utiliza proprietatea Background sau ColorScheme a obiectului Slide sau
SlideRange.

Proprietatea Background returneaz un obiect ShapeRange, se aplic proprietatea Fill pentru returnarea obiectului
FillFormat i acest obiect reprezint umplerea fundalului. Propriet ile i metodele acestui obiect modific aspectul
background-ului dorit. Este de men ionat c pentru a p stra modific rile valabile doar pentru diapozitivul (diapozitivele)
procesat, proprietatea FollowMasterBackground trebuie fixat pe False.

Datorit complexit ii obiectului, FillFormat se va studia din Help, pentru a vedea multiplele propriet i i metode
suportate.

Exemplul urm tor d o imagine redus a posibilit ilor de prelucrare grafic :

With ActivePresentation.Slides(1)
.FollowMasterBackground = False
.Background.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientDaybreak
End With

metoda PresetGradient aplic un efect vizual caracterizat de trei parametri, Style, Variant i PresetGradientType,
corespunzând dialogului Fill Effects din PowerPoint ( i nu numai).

Modificarea culorilor se poate realiza prin schimbarea schemei de culori sau prin editarea unei culori particulare dintr-o
schem . Proprietatea ColorScheme a unui obiect Slide sau SlideRange returneaz obiectul ColorScheme care
reprezint schema de culori. Se poate schimba apoi schema sau se poate utiliza metoda Colors pentru a edita culori.
Numerotarea schemelor de culori este cea din dialogul Color Scheme din PowerPoint. Exemplele urm toare ilustreaz
mecanismul modific rilor.

213
With ActivePresentation
.Slides(1).ColorScheme = .ColorScheme(3)
End With

sau

ActivePresentation.Slides(1).ColorScheme.Colors(ppTitle).RGB = RGB(0,255,0)

care coloreaz titlul în verde. Culorile schemei de culori pot fi referite printr-o constant de tip PpColorSchemeIndex:
ppAccent1, ppAccent2, ppAccent3, ppBackground, ppFill, ppForeground, ppNotSchemeColor, ppShadow sau ppTitle, cu
interpret rile imediate din PowerPoint.

Schema de culori este pierdut la aplicarea unui template, moment în care se schimb i schemele de culori disponibile.

Alegerea unui layout

La ad ugarea unui diapozitiv s-a v zut c se stabile te i layout-ul acestuia prin argumentul Layout. Returnarea sau
modificarea layout-ului se realizeaz prin proprietatea Layout:

ActivePresentation.Slides(1).Layout = ppLayoutTextAndChart

La modificarea layout-ului sunt totu i p strate i rezerv rile care con in text sau obiecte.

Ad ugarea de obiecte la un diapozitiv

Se pot ad uga obiecte (cum ar fi AutoShapes, obiecte OLE, imagini) la un diapozitiv utilizând una dintre metodele
colec iei Shapes. O referin la aceast colec ie se ob ine prin proprietatea Shapes a obiectului Slide, colec ia
reprezentând întregul layer de desen de pe un diapozitiv. Operarea cu aceste obiecte este descris într-un capitol
separat, dedicat obiectelor desenate.

Schimbarea ordinii diapozitivelor

Pentru a schimba locul unui diapozitiv într-o prezentare se utilizeaz metodele Cut i Paste prin care se ia un diapozitiv
din locul vechi i se insereaz în noua pozi ie:

With ActivePresentation.Slides
.Item(4).Cut
.Paste 6
End With

care mut diapozitivul diapozitivul 4 pe locul 6 din prezentare.

Stabilirea efectelor tranzi iei diapozitivelor

Atributele tranzi iei unui diapozitiv sunt p strate în propriet ile obiectului SlideShowTransition, returnat de proprietatea
sinonim SlideShowTransition a obiectului Slide sau SlideRange. Propriet ile privind tranzi ia corespund op iunilor
disponibile prin dialogul specializat din PowerPoint: AdvanceOnClick, AdvanceOnTime, AdvanceTime, EntryEffect,
SoundEffect, Speed.

Primele dou propriet i, AvanceOnClick i AvanceOnTime, sunt True dac trecerea la urm torul slide are loc la click
sau dup un timp fixat de AdvanceTime. Pot fi stabilite ambele tipuri de avans la True.

214
EntryEffect stabile te modul de apari ie a noului diapozitiv. Poate avea una dintre valorile tipului enumerat
PpEntryEffect, de forma ppEffectAppear, ppEffectBlindsHorizontal, ppEffectBlindsVertical, ppEffectBoxIn i înc alte
vreo 60 de constante, descriind efectele selectabile prin dialogurile PowerPoint.

SoundEffect returneaz obiectul sinonim care controleaz ce se va cânta când are loc tarnzi ia. Metoda util (nu sunt
multe altele) este ImportFromFile prin care se specific un fi ier de tip sound.

Speed precizeaz ritmul efectu rii tranzi iei. Returneaz sau stabile te acest ritm ca o constant de tip
PpTransitionSpeed: ppTransitionSpeedFast, ppTransitionSpeedMedium, ppTransitionSpeedMixed sau
ppTransitionSpeedSlow.

Exemplul urm tor ilustreaz câteva dintre aceste propriet i.

With ActivePresentation.Slides(1).SlideShowTransition
.Speed = ppTransitionSpeedFast
.EntryEffect = ppEffectStripsDownLeft
.SoundEffect.ImportFromFile "c:\…\bass.wav"
.AdvanceOnTime = True
.AdvanceTime = 5
End With
ActivePresentation.SlideShowSettings.AdvanceMode = _
ppSlideShowUseSlideTimings

În exemplu se remarc faptul c proprietatea AdvanceMode ia valoarea ppSlideShowUseSlideTimings, pentru


considerarea timpului fixat la tranzi ia diapozitivului.

Referirea noti elor vorbitorului (Speaker's notes)

Proprietatea NotesPages returneaz un obiect SlideRange care reprezint paginile de note pentru un diapozitiv sau un
domeniu de diapozitive. Obiectul returnat are anumite restric ii în privin a utiliz rii unor propriet i i metode în raport cu
obiectul SlideRange care reprezint un domeniu de slide-uri.

Pentru a modifica toate diapozitivele simultan se va utiliza proprietatea NotesMaster a obiectului Presentation,
proprietatea care returneaz un obiect Slide reprezentând masterul noti elor.

ActivePresentation.Slides(1).NotesPage.Shapes.Placeholders(2) _
.TextFrame.TextRange.InsertAfter " …textul care se adaug … "

Obiectul Selection

În PowerPoint, obiectul Selection reprezint selec ia efectuat într-o fereastr de document. Se pot utiliza metodele
obiectului Selection pentru a t ia, copia, terge sau deselecta por iunea selectat . Proprietatea Type a obiectului
Selection identific tipul selec iei (diapozitive, shape, text sau nimic). Pentru returnarea unui anumit tip de selec ie se vor
utiliza propriet ile ShapeRange, SlideRange i TextRange.

Observa ie. Codul bazat pe o selec ie este în general ineficient i presupunerea select rii prealabile a unei entit i nu
este de obicei necesar ; de exemplu, se poate schimba fontul unui text i f r a-l selecta în prealabil. Dac proiectul VBA
porne te de la cod ob inut prin Macro Recorder, se va modifica pentru a-l face, pe cât posibil, independent de selec ie.

Crearea unei selec ii

Se poate ob ine o selec ie fie în mod manual, fie aplicând metoda Select unuia dintre obiectele Shape, ShapeRange,
Slide, SlideRange sau TextRange. Exemplul urm tor selecteaz formele 1 i 3 de pe slide-ul 1 din prezentarea activ :
215
ActivePresentation.Slides(1).Shapes.Range(Array(1,3)).Select

Este de re inut c se poate efectua o selec ie programatic doar dac s-ar putea efectua aceea i selec ie în mod manual:
obiectul trebuie s fie accesibil, viziunea trebuie s permit selec ii de acel tip etc.

Returnarea unei selec ii

Se va utiliza proprietatea Selection a obiectului DocumentWindow pentru a returna selec ia din fereastra respectiv :

ActiveWindow.Selection.Cut

Returnarea unui obiect din selec ie

Prin proprietatea ShapesRange a obiectului Selection se returneaz colec ia ShapeRange care include toate formele
desenate din selec ie. Se utilizeaz metoda Item pentru accesul la un obiect din colec ie. Exemplul urm tor taie a treia
form desenat din selec ia existent în fereastra activ :

ActiveWindow.Selection.ShapeRange(3).Cut

Prin intermediul propriet ii TextRange se poate accesa textul dintr-o selec ie sau textul dintr-o form desenat . În
continuare se prezint principalele opera iuni realizate prin intermediul obiectului TextRange.

Returnarea domeniului de text dintr-o selec ie.

ActiveWindow.Selection.TextRange.Copy

Prin intermediul metodelor Characters, Lines, Paragraphs, Runs, Sentences sau Words se poate ob ine o por iune
anumit de text din textul con inut în TextRange.

Returnarea domeniului de text dintr-o form desenat (shape) se realizeaz prin proprietatea TaxtRange a obiectului
TextFrame.

ActiveWindow.Selection.ShapeRange(3).TextFrame.TextRange _
.Characters(1,3).Font.Bold = True

Se utilizeaz proprietatea HasTextFrame pentru a vedea dac o form are ata at un cadru cu text i se utilizeaz
proprietatea HasText pentru a determina dac exist text în cadrul de text.

Inserarea de text, dat i timp sau num r de slide se realizeaz prin intermediul metodelor InsertAfter, InsertBefore,
InsertDateTime, InsertSlideNumber sau InsertSymbol.

Prin proprietatea SlideRange a obiectului Selection se returneaz colec ia SlideRange care include toate diapozitivele
selectate. Exemplul urm tor taie diapozitivele selectate în fereastra activ .

ActiveWindow.Selection.SlideRange.Cut

Obiectele View i SlideShowView

La deschiderea unui fi ier în PowerPoint, se creeaz simultan un obiect Presentation, care reprezint con inutul
fi ierului, un obiect DocumentWindow, care reprezint interfa a dintre utilizator i fi ier în modul design, un obiect View,
care reprezint un container pentru con inutul fi ierului în modul design.

216
La pornirea unui slide show, se creeaz un obiect SlideShowWindow, care reprezint interfa a între utilizator i fi ier în
modul run, i un obiect SlideShowView, care reprezint un container pentru con inutul fi ierului în modul run (de
execu ie).

În elegerea prezent rilor, ferestrelor i a viziunilor

Modific rile entit ilor care se v d pe ecranul aplica iei se realizeaz prin modificarea unuia dintre obiectele
Presentation, DocumentWindow sau View. Care anume dintre obiecte se modific este prezentat în continuare.

Schimb rile efectuate asupra con inutului efectiv al diapozitivelor — cum ar fi ad ugarea, tergerea sau formatarea
obiectelor — sunt modific ri ale prezent rii i sunt controlate de propriet ile i metodele obiectului Presentation ca i de
obiectele inferioare în ierarhia de obiecte PowerPoint.

Schimb rile efectuate asupra interfe ei care afi eaz con inutul – cum ar fi modificarea dimensiunii ferestrei sau
comutarea afi arii în alb-negru – sunt modific ri ale ferestrei documentului sau ferestrei de demonstrare a diapozitivelor i
sunt controlate de propriet ile/metodele obiectelor DocumentWindow sau SlideShowWindow. Aceste modific ri nu
afecteaz con inutul fi ierului. Modiifc rile ferestrei documentului se p streaz la comutarea viziunilor.

Schimb rile efectuate asupra modului în care informa ia este afi at – cum ar fi dac se vede text i grafic sau numai
grafic , cât de mari apar pe ecran elementele – sunt modific ri ale viziunii i sunt controlate de propriet ile i metodei
obiectelor View i SlideShowView. Aceste modific ri nu afecteaz con inutul fi ierului i nu sunt re inute la comutarea
viziunilor.

Returnarea obiectelor View i SlideShowView

Obiectul View reprezint modul în care informa ia este afi at în fereastra documentului. Se utilizeaz proprietatea View
a obiectului DocumentWindow pentru a returna un obiect View. Urm torul exemplu fixeaz fereastra documentului s
se ajusteze automat la dimensiunile ferestrei aplica iei.

Windows(1).View.ZoomToFit = True

Obiectul SlideShowView reprezint modul în care informa ia este afi at în fereastra de slide show. Se utilizeaz
proprietatea View a obiectului SlideShowWindow pentru a returna obiectul SlideShowView. Urm torul exemplu
execut un slide show a prezent rii active cu inhibarea shortcut-urilor (metoda Run a obiectului SlideShowSettings
returneaz un obiect SlideShowWindow)

ActivePresentation.SlideShowSettings.Run.View _
.AcceleratorsEnabled = False

Urm torul exemplu fixeaz culoarea pointerului i forma pointerului pentru al doilea slide show care se execut curent
(exist doar o fereastr pe aplica ie în care se execut un slide show, dar pot exista mai multe aplica ii care execut slide
show-uri în acela i timp).

With SlideShowWindow(2).View
.PointerColor.RGB = RGB(255,0,0)
.PointerType = ppSlideShowPointerPen
End With

Navigarea printre diapozitive

Prin metoda GoToSlide a obiectului View sau SlideShowView se activeaz slide-ul specificat. Este de men ionat c
termenul "diapozitiv activ" depinde de viziunea curent : în slide view sau în note view, slide-ul curent este cel afi at; în
outline view sau slide sorter view, slide-ul activ este cel selectat.
217
SlideShowWindows(1).View.GoToSlide 3

Se poate trece la primul diapozitiv prin metoda First, la ultimul diapozitiv prin Last, sau se poate trece la un slide show
denumit prin metoda GoToNamedShow. Prin ultima metod se trece la alt prezentare de diapozitive în timpul unei alte
prezent ri. Când prezentarea avanseaz , urm torul diapozitiv ar tat este urm torul din prezentarea unde s-a f cut
transferul i nu urm torul din prezentarea curent . Sintaxa este

expression.GotoNamedShow(SlideShowName)

unde

expression este obligatorie, returneaz un obiect SlideShowView.

SlideShowName este obligatoriu, numele slide show-ului unde se trece controlul.

SlideShowWindows(1).View.GotoNamedShow "…slide show-ul unde se trece …"

Alipirea con inutului Clipboard-ului la un obiect View

Prin metoda Paste a obiectului View se alipe te con inutul din Clipboard la viziunea din fereastra de document activ .
Urm torul exemplu copie selec ia din prima fereastr în Clipboard i o alipe te apoi la viziunea din fereastra a doua. Dac
opera iunea nu poate avea loc (vezi tabelul urm tor) se produce o eroare.

Windows(1).Selection.Copy
Windows(2).View.Paste

Opera iunea de alipire depinde de viziunea ferestrei. Situa iile posibile de copiere a con inutului din Clipboard sunt
prezentate în tabelul urm tor.

Viziunea Se poate alipi

Slide view sau Shapes, text sau diapozitive întregi.


notes page view Formele alipite sunt ad ugate în top-ul ordinei pe z i nu înlocuiesc formele selectate.
Dac este selectat o form , textul alipit va fi ad ugat la textul formei; dac este selectat text,
textul alipit înlocuie te selec ia; dac nu este selectat nimic, textul alipit este plasat într-un text
frame propriu.
Dac se alipe te un întreg slide, o imagine a slide-ului este inserat pe diapozitiv, master sau
pagina de note ca un obiect scufundat.

Outline view Text sau diapozitive întregi.


Un slide alipit este inserat înaintea slide-ului care con ine punctul de inser ie.
Nu se pot alipi forme desenate în outline view.

Slide sorter view Diapozitive întregi.


Un slide alipit este inserat la punctul de inser ie sau dup ultimul slide din selec ie.
Nu se pot alipi forme sau text în slide sorter view.

Din tabel rezult importan a alegerii unei viziuni corecte pentru prezentare înainte de a efectua o opera iune de
t iere+alipire.

Stabilirea sau verificarea tipului de viziune din fereastra documentului

218
Prin proprietatea Type a obiectului View se ob ine ce fel de viziune are documentul activ iar proprietatea ViewType a
obiectului DocumentWindow se utilizeaz pentru a stabili viziunea din fereastra documentului. Urm torul exemplu
realizeaz o copiere cu fixarea tipului de viziune adecvat opera iunii de alipire.

Windows(1).Selection.Copy
With Windows(2)
.ViewType = ppViewSlide
.View.Paste
End With

Alte constante pentru viziuni sunt grupate în PpViewType:

ppViewHandout, ppViewHandoutMaster, ppViewNotesMaster,

ppViewNotesPage, ppViewOutline, ppViewSlide,

ppViewSlideMaster, ppViewSlideShow, ppViewSlideSorter

ppViewTitleMaster

Interpret rile sunt imediate.

Returnarea diapozitivului curent

Proprietatea Slide returneaz obiectul Slide care reprezint diapozitivul afi at în acel moment într-o fereastr de slide
show sau într-o fereastr document.

SlideShowWindows(1).View.Slide.Copy

Dac slide-ul afi at curent este dintr-o prezentare scufundat , se poate utiliza proprietatea Parent a obiectului Slide
returnat de proprietatea sinonim pentru a returna prezentarea scufundat (proprietatea Presentation a obiectului
SlideShowWindow sau DocumentWindow returneaz prezentarea în care fereastra a fost creat i nu prezentarea
scufundat ).

Controlarea comport rii obiectelor în timpul unui slide show

Întregul strat de desen de pe un diapozitiv este reprezentat de colec ia Shapes i fiecare obiect de pe un diapozitiv – fie
c este o rezervare de loc (placeholder), o form AutoShape sau un obiect OLE – este reprezentat de un obiect Shape.
Utilizând propriet ile i metodele colec iei Shapes se pot ad uga obiecte la diapozitive i se ob ine acces la obiectele
individuale de pe un diapozitiv. Prin propriet ile i metodele unui obiect Shape se poate controla aspectul formei, textul
sau obiectul OLE care este con inut i modul în care se comport forma respectiv în timpul unui slide show.

În continuare se discut doar despre comportarea formei desenate în slide show, aspectele celelalte fiind discutate în
capitolul dedicat desenelor din Microsoft Office.

Controlul anima iei

Obiectul AnimationSettings con ine propriet ile i metodele care controleaz cum i când apare un shape pe un anumit
slide în timpul prezent rii. Urm torul exemplu fixeaz forma a doua de pe primul slide s devin animat în mod automat
dup cinci secunde.

With ActivePresentation.Slides(1).Shapes(2).AnimationSettings
219
.AdvanceMode = ppAdvanceOnTime
.AdvanceTime = 5
.TextLevelEffect = ppAnimateByAllLevels
.Animate = True
End With

La lucrul cu propriet ile obiectului AnimationSettings este important s se în eleag interac iunea dintre propriet ile
obiectului între ele i cu proprietatea AdvanceMode a obiectului SlideShowSettings.

Efectele valorilor stabilite pentru propriet ile obiectului AnimationSettings nu devin vizibile decât dac forma respectiv
este animat , adic proprietatea Animate este fixat pe True.

În animarea textului proprietatea TextUnitEffect stabile te unitatea de anima ie (cuvânt, paragraf etc) prin
ppAnimateByCharacter, ppAnimateByParagraph, ppAnimateByWord sau ppAnimateUnitMixed. Proprietatea
TextLevelEffect (care interac ioneaz cu precedenta la anumite valori) stabile te nivelul ierarhic al textului animat:

ppAnimateByAllLevels ppAnimateByFifthLevel PpAnimateByFirstLevel

ppAnimateByFourthLevel ppAnimateBySecondLevel PpAnimateByThirdLevel

ppAnimateLevelMixed ppAnimateLevelNone.

Pentru introducerea temporiz rii în anima ie, se va stabili proprietatea AdvanceMode la ppAdvanceOnTime i se va
indica un num r de secunde în AdvanceTime. Totodat , proprietatea AdvanceMode a obiectului SlideShowSettings
trebuie s fie ppSlideShowUseSlideTimings.

Proprietatea AfterEffect controleaz ce se întâmpl dup ce forma a devenit animat . Dac forma a fost animat i alt
form nu este animat dup ea, atunci efectele ulterioare nu sunt vizibile. În plus, efectul propriet ii DimColor nu este
vizibil decât dac AfterEffect este stabilit la ppAfterEffectDim.

Ordinea de animare a formelor de pe un slide este stabilit prin proprietatea AnimationOrder, proprietatea EntryEffect
stabile te modul de apari ie a formei iar ChartUnitEffect controleaz modul de animare al elementelor unei diagrame.

Controlul r spunsului la ac iunea mouse-ului

Efectul ac iunilor mouse-ului (click sau trecere peste form ) este controlat de colec ia ActionSettings. Colec ia con ine
dou obiecte identificate prin indexul ppMouseClick sau ppMouseOver reprezentând, respectiv, ac iunile la click sau
trecerea mouse-ului pe deasupra formei sau textului în timpul unui slide show.

With ActivePresentation.Slides(1).Shapes(3).TextFrame. _
TextRange.ActionSettings(ppMouseClick)
.Action = ppActionHyperLink
.HyperLink.Address = "http://www.microsoft.com"
End With

Unde se remarc utilizarea indexului de identificare a ac iunii la click pe form i definirea unei ac iuni prin proprietatea
Action.

Valorile posibile pentru Action sunt constantele PpActionType:

ppActionEndShow ppActionFirstSlide ppActionHyperlink

220
ppActionLastSlide ppActionLastSlideViewed ppActionMixed

ppActionNamedSlideShow ppActionNextSlide ppActionNone

ppActionOLEVerb ppActionPreviousSlide ppActionRunMacro

ppActionRunProgram.

Este de notat c anumite ac iuni sunt proprii doar unor tipuri de forme i se vor alege acele ac iuni care sunt disponibile în
interfa a utilizator din PowerPoint pentru forma procesat .

În urm torul exemplu se stabile te c , în slide show, atunci când a treia form de pe al doilea diapozitiv este click-at ,
culoarea formei este momentan inversat , se aude fi ierul sound "applause" i prezentarea revine la primul slide.

With ActivePresentation.Slides(2).Shapes(3) _
.ActionSettings(ppMouseClick)
.Action = ppActionFirstSlide
.SoundEffect.Name = "applause"
.AnimateAction = True
End With

Dac se stabile te o proprietate a obiectului ActionSettings dar f r efectul scontat, se va verifica valoarea atribuit
propriet ii Action. Tabelul care urmeaz ofer câteva preciz ri.

Dac se Pentru a efectua Valoarea necesar pentru


utilizeaz proprietatea Action
proprietatea

Hyperlink Stabilirea propriet ilor pentru hiperleg tura care este ppActionHyperlink
urm rit ca r spuns la ac iunea mouse-ului.

Run Returnarea/stabilirea numelui programului executat ca ppActionRunProgram


r spuns la ac iunile mouse-ului.

Run Returnarea/stabilirea numelui procedurii macro executate ca ppActionRunMacro


r spuns la ac iunea mouse-ului.

ActionVerb Stabilirea verbului OLE care va fi invocat ca r spuns la ppActionOLEVerb


ac iunea mouse-ului.

SlideShowName Stabilirea numelui slide show-ului propriu care se va ppActionNamedSlideShow


executa ca r spuns la o ac iune a mouse-ului.

Urm torul exemplu utilizeaz proprietatea Hyperlink:

With ActivePresentation.Slides(1).Shapes(1).ActionSettings(ppMouseClick)
.Action = ppActionHyperlink
.Hyperlink.Address = "http://www.infoiasi.ro"
End With

Controlul unui clip

221
Obiectul PlaySettings, returnat prin proprietatea PlaySettings a obiectului AnimationSettings, con ine propriet i i
metode care controleaz cum i când se deruleaz un clip media. Urm torul exemplu insereaz un movie numit
"Clock.avi" în primul slide din prezentarea activ , fixeaz execu ia automat dup anima ia sau tranzi ia precedent ,
specific continuarea show-ului în timp ce se execut filmul i specific faptul c obiectul movie este ascuns în timpul
slide show-ului cu excep ia timpului când se execut .

Set clockMovie = ActivePresentation.Slides(1).Shapes.AddMediaObject _


(FileName:="c:\…\clock.avi", Left:=20, Top:=20)
With clockMovie.AnimationSettings.PlaySettings
.PlayOnEntry = True
.PauseAnimation = False
.HideWhileNotPlaying = True
End With

În func ie de modul cum se insereaz clipul ca un obiect OLE (utilizând comanda Object din meniul Insert sau utilizând
metoda AddMediaObject) sau ca un obiect media nativ (utilizând meniul Movies and Sounds sau metoda
AddMediaObject), se pot aplica diferite propriet i obiectului PlaySettings. Se reg sesc astfel op iunile disponibile în
fi a Play Settings din dialogul Custom Animation (deschis din meniul SlideShow).

Modul preferat de inserare a clipurilor este ca obiecte native media, deoarece acestea nu necesit Windows Media Player
i reac ioneaz astfel mai rapid. Multe dintre propriet ile obiectului PlaySettings se aplic numai clipurilor media native.
Proprietatea ActionVerb, care corespunde op iunilor listate în boxa Object din fi a PlaySettings a dialogului Custom
Animation, este singura care nu se aplic clipurilor media native.

Utilizând proprietatea Type a obiectului Shape se poate determina dac un clip este nativ (valoarea returnat msoMedia)
sau nu. Proprietatea MediaType a obiectului Shape determin dac este sound sau movie (ppMediaTypeMixed,
ppMediaTypeMovie, ppMediaTypeOther sau ppMediaTypeSound). Urm torul exemplu fixeaz toate obiectele native
sound din primul slide s se execute mereu pân sunt oprite manual.

Dim so As Shape
For Each so In ActivePresentation.Slides(1).Shapes
If so.Type = msoMedia Then
If so.MediaType = ppMediaTypeSound Then
so.AnimationSettings.PlaySettings.LoopUntilStopped = True
End If
End If
Next

Meniuri i bare de unelte

Interfa a cu utilizatorul este o parte foarte important a oric rei aplica ii. Acest fapt are o pondere mult mai mare în
proiectele dezvoltate în VBA deoarece aplica iile gazd (Microsoft Office, Visio, Autocad etc.) dispun de interfe e utilizator
sofisticate de care trebuie s se apropie orice nou component .

Problematica poate fi desp r it în:

o Personalizarea/modificarea interfe ei aplica iei de baz


o Dialogurile create de utilizator.

În acest capitol se discut prima categorie de ac iuni: tehnicile prin care se poate adapta, completa sau modifica interfa a
cu utilizatorul propus în mod standard în aplica iile Microsoft Office 97. Se prezint atât ac iunile permise de mediu (prin
dialogul Customize – comun aplica iilor Word, Excel, PowerPoint, Access) asupra meniurilor i barelor de unelte afi ate,
cât i ac iunile programatice, din Visual Basic, asupra obiectelor respective.

222
Modificarea interfe ei cu utilizatorul

Interfa a cu utilizatorul prezent în programele din Microsoft Office este format din bare de meniu i bare de unelte. Ca
r spuns la activarea unei comenzi din meniu sau a unei unelte se va realiza o ac iune a aplica iei gazd sau se va
deschide un dialog pentru fixarea unor atribute ale ac iunii dorite.

Exist dou posibilit i de adaptare a barelor de unelte i a meniurilor: dialogul Customize i Visual Basic. De i dialogul
difer u or de la o aplica ie la alta, obiectele programabile sunt acelea i în toate aplica iile Microsoft Office (cu excep ia
Outlook).

Dialogul Customize

Prin intermediul casetei de dialog Customize se pot efectua modific ri ale interfe ei utilizator în timpul proiect rii aplica iei
Visual Basic (pentru simplitatea exprim rii utiliz m formularea design-time). Cu alte cuvinte, modific ri efectuate înainte
ca aplica ia s se execute. Modific rile includ: ad ugarea, tergerea, mutarea, restaurarea componentelor meniurilor i
barelor de unelte. De asemenea stabilirea propriet ilor acestor componente, care nu se vor modifica în timpul execu iei
(cu formularea mai concis run-time). Aceste modific ri pot fi efectuate i în Visual Basic, dar dac exist ambele
posibilit i de modificare, cele din design-time, direct în mediul aplica iei gazd , se realizeaz mai u or.

Pentru afi area dialogului Customize se urmeaz succesiunea: meniul View — Toolbars — Customize. Acela i efect
se ob ine prin punctarea unei bare de unelte i click dreapta. Din meniul contextual se alege apoi Customize. Dialogul
afi at este, cu mici diferen e specifice, acela î în toate aplica iile Office 97.
Forma afi at de Microsoft Word este dat în figura al turat .

Se observ cele trei fi e i grupul de butoane din dreapta.

Particularit ile importante ale dialogului sunt:

o în Access, fi a Toolbars con ine un buton Properties care


afi eaz dialogul Toolbar Properties prin care se fixeaz
propriet ile barelor de meniu sau de unelte,
o în Excel, fi a Toolbars con ine un buton Attach care afi eaz dialogul Attach Toolbars prin care se pot
copia (ata a) la caietul activ bare de unelte/meniu din spa iul de lucru al aplica iei,
o în Word, fi a Commands con ine o list derulant Save in în care se alege contextul modific rilor din
design-time (template, document etc.) i un buton Keyboard care ini iaz un dialog de stabilire a cheilor
directe. Dialogul NewToolbar, care apare la click pe New (fi a Toolbars), con ine de asemenea
op iunea Make toolbar available to pentru fixarea domeniului de vizibilitate.

Dup deschiderea dialogului Customize se urmeaz aceea i procedur pentru modificarea oric rui meniu sau toolbar,
indiferent dac este predefinit sau construit de utilizator. Pa ii uzuali sunt

o în lista Toolbars din fi a Toolbars se selecteaz boxele de control al turate denumirilor acelor bare care
se afi eaz ; orice bar nou creat este afi at în mod automat;
o click pe orice intrare de meniu (inclusiv capt rile de meniu/submeniu) sau control de pe o bar de unelte
pentru a o selecta; în timpul afi rii dialogului Customiza meniurile i uneltele nu sunt active/executabile,
pot fi doar selectate;
o click dreapta pe obiectul selectat i utilizarea comenzilor din meniul contextual pentru transform rile
dorite.
o În timpul afi rii dialogului Customize se pot rearanja prin drag-and-drop toate intr rile din
meniuri/unelte. Tragerea în caseta dialogului elimin o intrare din meniu/bar de unelte, iar opera iunea
invers adaug noi intr ri.

Visual Basic

223
Personalizarea meniurilor i barelor de unelte se poate efectua programatic utilizând por iunea reprezentând barele de
comand din modelul de obiecte, comun tuturor aplica iilor din Microsoft Office. Nivelul cel mai înalt este colec ia
CommandBars, returnat de proprietatea CommandBars în toate aplica iile din Office. Fiecare bar de meniu, meniu
contextual sau bar de unelte este reprezentat printr-un obiect CommandBar în aceast colec ie. Un obiect
CommandBar con ine o colec ie CommandBarControls reprezentând
elementele de control ale barei respective.

Ierarhia acestor obiecte, pentru cazul Microsoft Word (similar în toate


celelalte aplica ii din Office), este prezentat în figura al turat .

Utilizarea acestor obiecte este explicat , pentru principalele ac iuni, în


continuarea acestui capitol.

Se poate scrie cod care, executat o singur dat , produce crearea sau modificarea elementelor de control din interfa a
utilizator. Codul simuleaz modific rile din design-time prin caseta Customize. Sunt i situa ii în care este nevoie de o
combina ie programare + personalizare pentru a realiza configurarea dorit a mediului aplica iei:

o Dac nu se poate utiliza dialogul Customize pentru crearea unei bare noi de meniu, aceasta se va crea
prin program i dup aceea se poate configura prin dialogul Customize.
o Dac aplica ia gazd nu ofer posibilitatea de afi are simultan a dialogului Customize i a meniurilor
contextuale predefinite sau utilizator, modificarea acestora trebuie realizat în Visual Basic.
o Dac aplica ia gazd nu ofer o interfa pentru ad ugarea sau modificarea boxelor text, listelor
derulante drop-down sau combo box, trebuie utilizat codul Visual Basic pentru ad ugarea i proiectarea
acestor controale.

Se poate scrie cod i pentru modificarea meniului sistem în timp ce aplica ia se execut (de exemplu inhibarea unor
comenzi sau ad ugarea unui meniu etc.). Aceste modific ri sunt cunoscute drept modific ri în run-time.

Domeniul schimb rilor asupra interfe ei utilizator

Fiecare aplica ie Microsoft Office utilizeaz reguli u or diferite privind unde i cum se salveaz modific rile aduse
interfe ei utilizator. Pentru un control corect al interfe ei proiectate în aplica ia Visual Basic este important în elegerea
domeniului de valabilitate al schimb rilor.

Microsoft Access

Se pot utiliza bare de meniu proprii sau meniuri contextuale proprii în trei moduri

o Ata ate de o form sau de un raport. Microsoft Access afi eaz meniurile proprii la deschiderea formei
sau la afi area raportului în print preview. Pentru informa ii suplimentare se va studia subiectul "MenuBar
Property" în Help.
o Drept un meniu contextual ata at unei forme, unui raport sau unui control dintr-o form . Microsoft Access
afi eaz un asemenea meniu la click dreapta pe form , raport sau control. Pentru informa ii suplimentare
se va studia subiectul "ShortCutMenuBar Property" în Help.
o Ca o bar meniu global , a aplica iei. Microsoft Access afi eaz aceast bar proprie în toate ferestrele,
cu excep ia formelor sau rapoartelor care au propria bar definit . Se poate specifica bara de meniu
utilizat în aplica ie prin dialogul Startup.

Se pot utiliza una sau mai multe bare de unelte proprii într-o aplica ie. Se creeaz barele de unelte necesare i se alege
pentru afi are una dintre metodele urm toare:

o Dac aplica ia are doar o bar de unelte utilizator, se va utiliza commanda Toolbars (din meniul View)
pentru a o afi a; bara respectiv va apare de fiecare dat când se porne te aplica ia.
224
o Dac aplica ia are bare diferite pentru forme sau rapoarte, se va specifica bara necesar în proprietatea
Toolbar a formei sau raportului. Bara indicat se va afi a i ascunde împreun cu forma.
o Dac sunt necesare mai multe bare de unelte proprii pentru o form sau raport, sau dac se dore te
ascunderea/afi area barelor predefinite, se va utiliza proprietatea Visible a obiectului CommandBar în
Visual Basic sau ac iunea ShowToolbar în macro-uri.
o Dac se dore te ca aplica ia s afi eze doar barele proprii, se pot ascunde barele de unelte built-in prin
comanda Startup (meniul Tools) i se deselecteaz boxa de control Allow Built-in Toolbars.

Microsoft Excel

Barele de meniu sau/ i barele de unelte proprii pot fi salvate cu spa iul de lucru sau cu caietul. La p r sirea aplica iei
Excel, barele de unelte din spa iul de lucru sunt salvate automat în fi ierul Username8.xlb (unde Username este numele
utilizatorului curent utilizat la intrarea în Windows 95). Dac utilizatorul nu este logged on, fi ierul este Excel8.xlb. Barele
de unelte salvate în caiet sunt memorate în fi ierul caietului respectiv.

Meniurile i barele de unelte de la nivelul workbook permit proiectarea unei interfe e pe m sura oric rei aplica ii (de
exemplu un add-in) i distribuirea barelor i procedurilor ata ate. Pentru distribuire, obiectele proiectate se vor ata a
caietului, care con ine aplica ia, încât barele de unelte s fie memorate în acela i fi ier cu aplica ia.

Mutarea unui meniu sau bar de unelte din spa iul de lucru în caiet

• Dac dialogul Customize nu este deschis, se va afi a prin View - Toolbars - Customize.
• În fi a Toolbars a dialogului, click pe Attach. Ca urmare a ac iunii se afi eaz dialogul Attach Toolbars.
• În caseta din stânga Custom toolbars se selecteaz numele meniului sau barei de unelte care se copie în
caietul activ.
• Click Copy. Numele obiectului copiat apare în lista din dreapta Toolbars in workbook.

Obiectul original, de la nivelul spa iu de lucru, poate fi eliminat în mod uzual ac ionând butonul Delete din dialogul
Customize, fi a Toolbars.

Dac versiunea de la nivelul sap iului de lucru (workspace) nu este eliminat , aceasta poate fi modificat f r afectarea
versiunii de la nivelul caietului. În aceast situa ie, obiectul este modificat la nivelul spa iului de lucru, aducerea versiunii
din caiet la aceea i configurare se realizeaz doar prin repetarea procedurii descrise, adic prin copierea versiunii din
spa iu peste versiunea din caiet.

Dup copierea unui obiect (meniu sau bar de unelte) în caiet, obiectul devine disponibil numai dup ce utilizatorul în
deschide. O versiune salvat în caiet re ine nu numai numele i con inutul, ci i asign rile de cod, locul, dimensiunea,
forma, pozi ia în ecran i atributul de vizibilitate (ascuns sau vizibil).

Eliminarea unui meniu/bar de unelte salvat în caiet

Versiunea salvat în caiet poate fi eliminat prin:

• Dac dialogul Customize nu este deschis, se va deschide dup procedura uzual .


• În fi a Toolbars click pe Attach. Se afi eaz dialogul Attach Toolbars.
• În zona Toolbars in workbook click pe numele obiectului care se elimin .
• Click Delete.

Observa ie. Nu se poate utiliza Visual Basic pentru a ata a sau elimina obiecte bare de meniu sau de unelte la un caiet.

La deschiderea unui caiet care con ine obiecte de interfa pe m sur , Microsoft Excel determin mai întâi dac exist
deja un obiect cu aceea i denumire în spa iul de lucru. Dac nu, este creat un nou meniu sau bar de unelte în spa iul

225
de lucru i se copie în acest nou obiect bara de meniu sau de unelte din caiet. În acest mod se dispune de un obiect care
poate fi modificat, ascuns etc., obiect care î i salveaz modific rile în spa iul de lucru la p r sirea aplica iei Excel.

Nu exist nici un mijloc prin care s se redenumeasc un meniu sau toolbar, încât la redeschiderea caietului spa iul de
lucru con ine deja obiectul cu numele respectiv i Microsoft Excel utilizeaz copia creat anterior în locul obiectului din
caiet. Procedurile ata ate r mân totu i cele din caiet, adic aplica ia distribuit tr ie te în continuare prin intr rile de
meniuri sau unelte p strate în spa iul de lucru. Acest mod de operare are accentul pus pe ac iunile utilizatorului, care are
dreptul s - i organizeze spa iul de lucru dup voie.

Pentru a restaura versiunea original distribuit , utilizatorul trebuie s elimine copia din spa iul de lucru prin procedura
explicat anterior.

Microsoft Word

Word memoreaz meniurile i barele de unelte în abloane, similar macrourilor. La modificarea unui meniu sau toolbar,
modific rile sunt memorate implicit în template-ul Normal i modific rile sunt accesibile în mod global, adic un
asemenea obiect poate fi afi at chiar dac documentul este bazat pe un alt ablon.

Un toolbar memorat într-un alt template este disponibil doar dac ablonul respectiv este ata at documentului activ sau
dac ablonul este înc rcat ca un template global (a se vedea meniul Tools, comanda Templates and Add-ins).

Dac se memoreaz o bar de unelte în document, afi area ei este posibil doar dac documentul respectiv este activ.

La distribuirea unei aplica ii Visual Basic cu meniuri i bare de unelte personale, aceste trebuie memorate într-un ablon
propriu sau într-un document. Deoarece fiecare utilizator are propriul template Normal, aplica iile Visual Basic nu trebuie
s modifice ablonul Normal. Este recomandat de asemenea s se elimine obiectele personale din interfa la p r sirea
aplica iei.

Dac dou obiecte toolbar cu acela i nume sunt disponibile simultan (unul într-un ablon, altul în document), ambele sunt
listate în dialogul Customize i pot fi afi ate separat sau împreun în acela i timp.

În Visual Basic se poate ad uga, modifica sau elimina bare meniu sau de unelte în orice document sau template. Totu i,
deoarece proprietatea CommandBars se aplic doar obiectului Application, contextul trebuie fixat înainte de efectuarea
modific rilor. Similar utiliz rii zonei Store in din fi a Commands, dialogul Customize, în Visual Basic se va stabili
valoarea propriet ii CustomizationContext pentru a specifica un obiect Document sau Template, reprezentând locul
unde se execut modific ri. Proprietatea CustomizationContext se fixeaz înaintea utiliz rii propriet ii CommandBars
ceea ce asigur returnarea unei referin e la colec ia corect (din document sau din template).

Microsoft PowerPoint

Obiectele personale sunt memorate întotdeauna în spa iul de lucru. La p r sirea aplica iei PowerPoint, barele de unelte
din spa iul de lucru sunt salvate în fi ierul Username.pcb (unde Username este numele logon al utilizatorului). Dac
utilizatorul nu este logged on, fi ierul este Powerpnt.pcb.

Deoarece obiectele din interfa nu sunt vizibile în timpul prezent rii, customizarea este limitat la schimbarea meniurilor
i uneltelor accesibile în design mode. Se poate utiliza fie dialogul Customize, fie Visual Basic. Dac aplica ia Visual
Basic ofer o interfa modificat pentru proiectarea prezent rilor, se va utiliza Visual Basic pentru modificarea interfe ei
i este o bun idee aceea ca la p r sirea aplica iei s se elimine modific rile efectuate.

Componente ale interfe ei utilizator

Meniurile sunt liste cu comenzi din care utilizatorul poate s aleag . Meniurile ofer un mod convenabil i consistent de a
grupa comenzi asociate dup func iuni i un mod simplu de acces al utilizatorului. Anumite comenzi pot s determine
226
afi area unor submeniuri, pe diferite nivele de organizare. Exist de asemenea meniuri contextuale (shortcut menus) care
ofer o modalitate de grupare a comenzilor uzuale aplicabile în contextul limitat al unei ac iuni specifice.

Se pot asigna chei de acces pentru a permite afi area imediat a unui meniu, ca i asignarea unor taste directe la
comenzi. În plus, meniurile ocup mai pu in loc decât barele de unelte (nu toate comenzile sunt afi ate permanent).

Barele de unelte con in controale care permit executarea comenzilor des utilizate. Barele de unelte sunt adecvate pentru
prezentarea atributelor individuale (cum ar fi bold, italic etc.), pentru comenzile care se pot reprezenta vizual (cum ar
chenare, dimensiunile liniilor etc.) i pentru comenzile pentru care se dore te accesul printr-un simplu click. Barele de
unelte r mân mereu vizibile i acest fapt conduce la o parcurgere mai u oar pentru determinarea comenzii dorite.
Dezavantajele includ necesitatea mouse-ului (controalele nu pot fi accesate din tastatur ) i ocuparea spa iului de lucru în
detrimentul documentului principal.

Pentru prezentarea unui set complex de op iuni se va utiliza o caset de dialog. Dac se dore te plasarea unei unelte
mai aproape de datele asociate, cea mai bun solu ie poate fi plasarea unui control direct în document.

Mai multe informa ii pot fi g site în capitolul Controale ActiveX i dialoguri.

Sistemul de meniuri

În fiecare aplica ie Microsoft Office, sistemul de meniuri este compus dintr-o mul ime de meniuri i câte o mul ime de
intr ri în fiecare meniu. Fiecare menu este fie un meniu, un submeniu sau un meniu contextual. În continuare termenul de
component se refer în mod generic la un meniu sau o intrare într-un meniu.

O bar de meniu este o bar a ezat în partea superioar a ferestrei active i care afi eaz numele tuturor meniurilor
care sunt permise în aplica ie la un moment dat. O aplica ie din Microsoft Office poate s modifice bara de meniu afi at
ca urmare a modific rii ferestrei active (de exemplu editarea unui obiect chart) sau ca r spuns la instruc iuni Visual Basic.

Un meniu este o list de intr ri care apare (se deruleaz ) la click pe numele meniului din bara de meniu.

Un submeniu (child menu) este un meniu ata at de o latur a altui meniu (parent menu), adiacent unei capt ri particulare
a submeniului, localizat în meniul p rinte. Fiecare captare de submeniu este marcat cu o s geat punctând spre
dreapta. Submeniurile se pot ad uga i la meniurile contextuale. Un submeniu este afi at atunci când se puncteaz
captarea corespunz toare din meniul p rinte.

Un meniu contextual este un meniu flotant în document i care con ine un grup de comenzi adecvate pentru o anume
ac iune (de exemplu procesarea unui paragraf). Meniul contextual este afi at atunci când utilizatorul execut un click
dreapta pe un obiect care are ata at un asemenea meniu.

Ac iuni de adaptare a sistemului de meniuri

Sistemul de meniuri se poate modifica într-o aplica ie Microsoft Office în diferite moduri:

o crearea de noi bare de meniu


o ad ugarea de noi meniuri la barele preconstruite sau personale
227
o ad ugarea de noi intr ri (comenzi sau capt ri de submeniuri) la meniuri i submeniuri existente (built-in
sau custom)
o ad ugarea i modificarea meniurilor contextuale
o atribuirea de macrouri la intr ri din meniuri.

În plus, în orice moment se poate restaura meniul sistem predefinit la starea implicit (cea afi at la instalarea aplica iei).

Ad ugarea de componente personale sau


modificarea componentelor built-in

Fiecare aplica ie din Office are un meniu sistem propriu. Componentele acestuia pot fi modificate sau se pot crea i
modifica componente personale.

Se alege modificarea unui meniu predefinit atunci când interven ia este minim (de exemplu includerea unui meniu care
este legat de o macro).

Dac este necesar o interven ie masiv , atunci se prefer crearea unei noi bare de meniu i ad ugarea componentelor
proprii pe aceast bar .

Utilizarea submeniurilor

Dac un meniu devine prea populat, atunci se impune împ r irea comenzilor pe submeniuri. În acest mod se ofer
utilizatorului mai pu in informa ie la un moment dat i aplica ia cre te în claritate.

Organizarea submeniurilor se poate baza pe entit ile procesate (comenzi, clien i etc.) sau pe ac iunile suportate de
entit i (ad ugare, editare etc.).

Utilizarea meniurilor contextuale

Dac se dore te ca utilizatorul s aib acces la comenzile (m car cele mai uzuale) aplicabile în contextul unui obiect
selectat, comenzi care, în mod uzual, sunt dispersate în mai multe meniuri, solu ia este oferit de meniurile contextuale.
Comenzile dorite se vor ad uga meniurilor contextuale built-in. În Microsoft Access se pot crea i meniuri contextuale
proprii asociate unor obiecte din aplica ie.

Utilizarea controalelor Text Box, List Box i Combo Box

De i este posibil s se adauge, prin cod Visual Basic, controale predefinite, sau proprii, de tip textbox, listbox sau combo,
la meniuri de orice fel, asemenea controale sunt mai adecvate pentru plasarea în bare de unelte.Casetele text din meniuri
pot fi utile în anumite situa ii pentru afi area sau returnarea unei propriet i. Aceea i utilitate o poate avea un control de
tip list sau combo. Neajunsul principal este acela c selectarea unei intr ri dintr-o list închide meniul (utilizatorul trebuie
s redeschid meniul pentru a revedea alegerea etc.).

Dac se dore te ad ugarea controalelor de tipurile enumerate (built-in sau proprii) se vor utiliza tehnici descrise în
sec iuni ale acestui capitol.

Modific rile sistemului de meniuri în timpul proiect rii (design-time)

Modific rile descrise aici sunt cele efectuate înainte ca aplica ia s se execute. Sunt incluse ad ugarea, tergerea,
mutarea, restaurarea componentelor din meniuri, ca i fixarea propriet ilor acestora.

228
Ad ugarea unei bare de meniu proprii

În Microsoft Access exist posibilitatea ad ug rii unei bare proprii de meniu atât în Visual Basic, cât i prin dialogul
Customize. În Microsoft Excel, Word i PowerPoint ad ugarea se poate efectua doar prin Visual Basic.

Dialogul Customize (doar Microsoft Access)

• Deschiderea dialogului Customize,


• Fi a Toolbars, click New
• În boxa Toolbar name se tasteaz numele noii bare i click OK.
• Click Properties pentru afi area dialogului Toolbar Properties.
• În zona Type se alege Menu Bar.

Noua bar de meniu este ad ugat listei din caseta Toolbars a fi ei Toolbars (caseta Customize).

Visual Basic

Prin metoda Add a colec iei CommandBars se creeaz o nou bar de meniu; argumentul MenuBar al metodei Add
determin când obiectul CommandBar creat poate fi afi at ca o bar de meniu. Exemplul urm tor realizeaz aceast
opera iune:

Set cstm = CommandBars.Add(Name:="Custom Menu Bar", Position:=msoBarTop, _


MenuBar:=True, Temporary:=False)

Ad ugarea meniurilor

Se poate ad uga un meniu la orice bar de meniu built-in sau proprie. Deoarece o aplica ie Office poate afi a diferite
bare de meniu built-in în contexte diferite, este necesar uneori ca ad ugarea s aib loc la mai multe bare de meniu,
pentru ca utilizatorul s aib acces la meniul ad ugat indiferent de contextul curent al aplica iei.

La ad ugarea unui meniu se poate specifica o cheie de acces, litera care apare subliniat la afi area meniului.

Observa ie.De i o aplica ie Microsoft Office poate s listeze barele de unelte cu meniurile contextuale din fi a Toolbars
a dialogului Customize, utilizatorul nu poate nici ad uga meniuri contextuale, nici s tearg meniuri contextuale. Se pot
doar ad uga noi intr ri, modifica intr rile existente sau elimina unele intr ri din meniurile contextuale. Anumite opera iuni
suplimentare sunt posibile totu i în Access i Excel, ac iuni descrise ulterior.

Dialogul Customize

• Afi area dialogului Customize.


• Vizualizarea barei de meniu dorite prin selectarea în lista Toolbars.
• În fi a Commands click New Menu în lista Categories.
• Se trage itemul New Menu din cutia Commands la pozi ia dorit de pe bara de meniu.
• Click dreapta pe noul menu i completarea numelui în zona Name. Un ampersand (&) situat înaintea unui
caracter din nume îl transform în cheie de acces la meniu.

Ad ugarea comenzilor este descris ulterior în acest capitol.

Dialogul Customize ofer i posibilitatea de ad ugare a unui meniu built-in la o bar de meniu proprie sau built-in.
Comenzile ad ugate pot fi personalizate f r ca originalul s fie afectat.

229
• Afi area dialogului Customize.
• Vizualizarea barei de meniu dorite prin selectarea în lista Toolbars.
• În fi a Commands click Built-in Menus în boxa Categories.
• Se trage un meniu built-in din boxa Commands în pozi ia dorit .

Visual Basic

Pentru ad ugarea unui meniu se utilizeaz metoda Add a colec iei CommandBarControls. Prin aceasta se adaug un
meniu la bara reprezentat de obiectul CommandBar implicat. Argumentul Type al metodei Add trebuie dat drept
msoControlPopup pentru a indica afi area unui meniu activarea controlului ad ugat. Controalele care afi eaz meniuri
sunt cunoscute drept controale pop-up. Argumentul Before indic pozi ia noului meniu între cele deja
existente.Proprietatea Caption a obiectului CommandBarPopup returnat de metoda Add este utilizat pentru stabilirea
numelui i cheii de acces la noul meniu. Exemplul urm tor adaug un nou meniu la bara meniu a unui caiet Excel:

Set cstmAccounting = CommandBars ("Worksheet Menu Bar").Controls _


.Add(Type:=msoControlPopup, Before:=9)
cstmAccounting.Caption = "&Accounting")

Dup specificarea tastei de acces (prin &), numele poate fi specificat pentru referin fie cu sau f r caracterul
ampersand.

Ad ugarea submeniurilor

Un meniu (child menu) este un meniu ata at de o latur a altui meniu (parent menu), adiacent unei intr ri din meniul
p rinte (titlul submeniului – submenu caption), afi at la selectarea titlului. Se pot ad uga submeniuri la meniuri, alte
submeniuri sau la meniurile contextuale. Similar cu definirea unui meniu, mai întâi se define te un submeniu vid la care
se adaug apoi intr rile dorite.

Dialogul Customize

• Se afi eaz dialogul Customize


• Dac bara de meniu care con ine meniul la care se face ata area nu este vizibil se activeaz prin Toolbars.
• În fi a Commands click New Menu în boxa Categories.
• Se trage New Menu din boxa Commands în pozi ia de pe meniu unde se ata eaz . Dac ata area este pe un
nivel inferior, se trage mai întâi pe meniu i pe urm din titlu în titlu pân se deschide nivelul unde are loc
ata area.
• Click dreapta pe noul submeniu pentru a-i fixa numele în zona Name. Se va utiliza caracterul & pentru stabilirea
cheii de acces.

Ad ugarea intr rilor se discut în continuarea capitolului.

Visual Basic

Ad ugarea programatic este similar ad ug rii unui meniu la o bar de meniu, difer doar nivelul din ierarhia de
obiecte:

Set cstmAcctProduct = CommandBars("Worksheet Menu Bar").Controls("Accounting") _


.Controls.Add(Type:=msoControlPopup)
cstmAcctProduct.Caption = "&Product"

ad ugarea are loc la meniul Accounting creat în exemplul de la meniuri. Cheia direct este litera "P". Se observ c
valoarea argumentului Type este tot msoControlPopup, argumentul Before, neutilizat în exemplu, permite fixarea pozi iei

230
noului submeniu între intr rile meniului p rinte. Este de remarcat c titlul submeniului se insereaz o dat cu submeniul i
nu exist anterior.

Dup definirea titlului submeniului acesta poate fi utilizat la ob inerea unei referin e atât cu ampersand. cât i f r .

Ad ugarea i gruparea comenzilor

Se poat ad uga comenzi la orice meniu propriu sau built-in, modifica aspectul lor i separa vizual în grupuri logice.

De i se pot ad uga boxe text, boxe liste sau boxe combo la meniuri/submeniuri, ele nu sunt recomandate. Locul lor este
de regul pe barele de unelte. Dac totu i se dore te o asemenea ad ugare se va utiliza re eta dat la discutarea barelor
de unelte.

Dialogul Customize

Pentru ad ugarea unei comenzi built-in:

• Se afi eaz dialogul Customize.


• Dac bara de meniu care con ine meniul la care se face ata area nu este vizibil se activeaz prin Toolbars.
• În fi a Commands se selecteaz o categorie de comenzi din boxa Categories. Comenzile din categoria
selectat sunt listate în boxa Commands.
• Se trage comanda dorit din boxa Commands în pozi ia adecvat din meniu. Navigarea în cazul unei ierarhii de
meniuri se realizeaz prin dragare pe meniu, apoi pe titlul submeniului etc.

Se poate realiza copierea unei comenzi built-in prin afi area meniului care o con ine i tragerea comenzii simultan cu
ap sarea tastei CTRL.

Dialogul Customize ofer i posibilitatea de ad ugare a unei comenzi proprii la o bar de meniu proprie sau biult-in. Cum
fiecare aplica ie din Microsoft Office prezint tehnici diferite pentru realizarea acestei opera iuni, în continuare se discut
separat fiecare aplica ie.

Microsoft Access

Ad ugarea la un meniu a unei intr ri care execut un macro se realizeaz dup aceea i procedur ca la ad ugarea unei
comenzi built-in la un meniu. În boxa Categories click All Macros. Se trage macro-ul dorit în pozi ia sa din meniu.

Pentru ad ugarea unei intr ri care execut o procedur func ie se urmeaz de asemenea aceea i pa i ca la ad ugarea
unei comenzi built-in: în Categories se alege orice categorie i se trage o comand oarecare pe meniul dorit. Dup
aceea, prin click dreapta i selectare Control Properties se deschide dialogul sinonim. În zona Caption se trece noul
nume al comenzii iar în On Action se tasteaz o expresie care execut procedura Visual Basic de forma:
=functionname().

Microsoft Excel

Se urmeaz aceea i pa i ca în procedura pentru ad ugarea unei comenzi built-in la un meniu:; în caseta Categories
click Macros i se trage Custom Menu Item din caseta Commands la pozi ia dorit pe meniu. Click dreapta pe noua
intrare i apoi click pe Assign Macro. În Macro Name din dialogul Assign Macro se precizeaz numele macroului ata at
intr rii.

Microsoft Word

231
Se urmeaz aceea i pa i ca în procedura pentru ad ugarea unei comenzi built-in la un meniu:; în caseta Categories
click Macros, în caseta Commands apare lista procedurilor ata ate i se trage macroul dorit în pozi ia adecvat din
meniu.

Observa ie. Dac în Word se scrie o procedur al c rui nume coincide cu numele unei comenzi built-in (sau dac o
procedur cu numele "MAIN" exist într-un modul cu nume identic comenzii), procedura va înlocui func ionalitatea
predefinit a comenzii built-in de fiecare dat când modulul de cod este disponibil. Orice copie a intr rii de meniu (care
activa comanda built-in), de pe orice meniu, va executa procedura înlocuitoare.

Microsoft PowerPoint

Se procedeaz la fel ca în Microsoft Word.

Modificarea aspectului unei comenzi

Pentru orice comand de pe un meniu se poate afi a o imagine al turat numelui comenzii. Controlul aspectului este
ob inut prin meniul contextual afi at în timp ce dialogul Customize este activ. Stilul intr rii de meniu poate fi doar text sau
text i imagine. Ac iunile uzuale sunt

o Utilizarea unui buton predefinit: click dreapta pe comand , Change Button Image i selectarea imaginii
dorite din caseta afi at .
o Copierea imaginii unui alt buton: click dreapta pe butonul a c rui imagine se copie, Copy Button Image,
click dreapta pe butonul unde se copie imaginea i Paste Button Image.
o Copierea unei imagini dintr-un program de grafic : în programul de grafic se deschide imaginea dorit ,
selectarea i copierea imaginii (preferabil de m rime 16×16 pixeli), comutarea la aplica ia Office, click
dreapta pe comand i click Paste Button Image.
o Editarea imaginii curente a unui buton: click dreapta pe comand , Edit Button Image, se editeaz
imaginea în dialogul afi at i OK.
o Restabilirea imaginii originale (sau nimic dac nu exist imagine implicit ): click dreapta i ResetButton
Image.

Gruparea comenzilor

Comenzile asociate dup func ionalitate se pot grupa prin separarea între linii. Liniile îns i nu sunt intr ri separate de
meniu, apari ia lor fiind un atribut al comenzii care începe un nou grup. Pentru a începe un grup (prima intrare cu o linie
deasupra):

o Se afi eaz dialogul Customize.


o Se afi eaz bara de meniu pe care se afl meniul dorit.
o Click dreapta pe intrarea de meniu care începe grupul i click pe Begin Group. La deschiderea ulterioar
a meniului contextual comanda Begin Group apare cu marcajul de selectare i un nou click anuleaz
linia de început de grup.

Visual Basic

Se utilizeaz metoda Add a colec iei CommandBarControls pentru ad ugarea unei noi intr ri la obiectul CommandBar
care reprezint un meniu sau un submeniu particular. Pentru ad ugarea unei comenzi built-in se va specifica num rul ID
al comenzii în argumentul Id al metodei Add.

Urm torul exemplu ad ug comanda Spelling la meniul numit "Quick Tools" de pe bara de meniu "Custom Menu Bar".

Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _


.Controls.Add(Id:=2)
232
Informa ii suplimentare se g sesc în sec iunea "Identificarea intr rilor i controalelor din meniuri i bare de unelte".

Pentru ad ugarea unei comenzi proprii, se adaug o intrare nou în meniu i se fixeaz proprietatea OnAction la
procedura ini iat de respectiva intrare. Argumentul Type al metodei Add va avea valoarea msoControlButton indicând
o comand .

Exemplul urm tor, pentru Microsoft Excel, adaug un meniu Open Database la meniul File. Comanda ad ugat execut
procedura OpenDatabaseProc.

Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _


.Controls.Add(Type:=msoControlButton, Before:=3)
With databaseItem
.Caption = "Open Database"
.OnAction = "OpenDatabaseProc"
End With

Exist multe propriet i ale obiectelor reprezentând comenzile din meniuri, propriet i care pot fi fixate în Visual Basic.
Pentru mai multe informa ii se va studia obiectul CommandBarButton din Help.

Textul descriptiv afi at la punctarea controlului poate fi dat în proprietatea TooltipText. În DescriptionText se poate da
un text afi at în bara de stare a aplica iei etc.

Proprietatea Style stabile te tipul butonului, cu imagine ata at sau nu, constantele predefinite sunt (MsoButtonStyle):
msoButtonAutomatic, msoButtonIcon, msoButtonCaption sau msoButtonIconandCaption.

Pentru a începe un grup se va fixa proprietatea BeginGroup a unui obiect CommandBarButton, CommandBarPopup,
sau CommandBarComboBox la True. Atribuirea valorii False va elimina linia desp r itoare de grupul precedent. Astfel

databaseItem.BeginGroup = True

adaug o linie înaintea intr rii definite în exemplul precedent.

Se utilizeaz Control(index), unde index este titlul sau indexul unei intr ri, pentru a returna obiectul care reprezint
intrarea.

Dintre metode men ion m doar metoda SetFocus prin care se stabile te focalizarea pe respectiva comand (ac ionarea
tastaturii are efect direct asupra controlului) i metoda Execute prin care se execut procedura ata at controlului.

Ad ugarea i modificarea meniurilor contextuale

Meniuri contextuale definite de utilizator pot fi create doar în Microsoft Access sau Excel. Aplica iile Word i PowerPoint
nu dispun de aceast posibilitate.

Crearea meniurilor contextuale se poate efectua prin dialogul Customize (în Access) sau prin Visual Basic (în Access i
Excel). În Access, meniurile contextuale pot fi asociate rapoartelor, formelor i controalelor dintr-o form , un meniu
contextual fiind afi at la click dreapta pe obiectul ata at. În Excel exist evenimentul BeforeRightClick la care se poate
r spunde prin modificarea unui meniu contextual existent sau prin afi area unui meniu contextual propriu.

Modificarea meniurilor contextuale predefinite de aplica ii se poate efectua în mod uzual în toate aplica iile din Microsoft
Office.

Dialogul Customize

233
Pentru Microsoft Access se poate utiliza dialogul Customize pentru ad ugarea unui meniu contextual:

o Se afi eaz dialogul Customize.


o În fi a Toolbars click New.
o În boxa Toolbar name se introduce numele noului menu contextual i OK. Este afi at un meniu flotant,
vid, cu numele dat.
o Click Properties pentru afi area dialogului Toolbar Properties.
o În Type se selecteaz Shortcut Menu.

Pentru afi area noului menu contextual din dialogul Customize se va selecta checkboxul de la Shortcut Menus din fi a
Toolbars. Meniul creat este listat ultimul în bara afi at .

Visual Basic

Prin metoda Add a colec iei CommandBars se creeaz un nou meniu contextual dac se fixeaz valoarea
msoBarPopup pentru argumentul Position al metodei, dup modelul

Set cstm = CommandBars.Add(Name:="Shortcuts1", Position:=msoBarPopup, _


MenuBar:=False, Temporary:=False

Completarea cu comenzi, modificarea unui meniu contextual se efectueaz prin procedeele descrise la editarea
meniurilor/submeniurilor. Prin CommandBars(name), unde name este numele meniului contextual, se returneaz
obiectul CommandBar reprezentând meniul contextual. Operând cu elementele colec iei Controls disponibil din
obiectul CommandBar se poate personaliza meniul contextual.

tergerea componentelor meniu

Se poate elimina, cu excep ia meniurilor contextuale i a barelor de meniu built-in, orice component de meniu: intr ri
proprii sau built-in, meniuri proprii sau built-in, bare de meniu proprii.

Prin eliminarea componentelor built-in se poate adapta aplica ia proiectat în Visual Basic la necesit ile utilizatorului atât
prin simplificarea interfe ei (mai ales pentru utilizatori lipsi i de experien ) cât i prin introducerea accesului direct la
fuc ionalitatea proiectului.

Este de notat c se pot restaura componentele built-in eliminate, dar nu i componentele proprii. Acestea trebuiesc create
din nou.

Dialogul Customize

Cu dialogul Customize deschis se poate elimina orice component de meniu prin

o Se deschide dialogul Customize


o Se afi eaz bara de meniu unde se afl componenta dorit .
o Click dreapta pe componenta respectiv i click pe Delete în meniul contextual afi at.

Pentru tergerea unei întregi bare de meniu proprie, se deschide dialogul Customize, fi a Toolbars, click pe numele
barei i click pe butonul Delete. În acest mod nu se poate elimina o bar de meniu predefinit .

Visual Basic

Se utilizeaz metoda Delete pentru a terge o bar de meniu proprie, un meniu/submeniu drop-down propriu sau nu, sau
o intrare proprie sau built-in. Nu se poate elimina o bar de meniu built-in sau un meniu contextual.

234
Urm torul exemplu Excel elimin meniul Edit din bara de meniu pentru diagrame.

CommandBars("Chart Menu Bar").Controls("Edit").Delete

Urm torul exemplu terge o bar de meniu proprie

CommandBars("Custom Menu Bar").Delete

Restaurarea componentelor de meniu built-in

Dialogul Customize

Utilizarea acestui dialog pentru restaurarea componentelor meniu/submeniu la configura ia original se face prin:

o Afi area dialogului Customize.


o Vizualizarea barei de meniu necesare.
o Click dreapta pe meniul/submeniul care se restaureaz i click pe Restore în meniul contextual.

Pentru a restaura în totalitate o bar de meniu built-in, se deschide dialogul Customize, click pe numele barei de meniu
în lista Toolbars din fi a sinonim i click pe butonul Restore. Prin restaurarea barei de meniu, toate meniurile i
submeniurile con inute sunt de asemenea restaurate.

Visual Basic

Metoda Reset aplicat obiectului reprezentând o component buit-in produce restaurarea componentei, dup modelul

CommandBars("Chart Menu Bar").Controls("Edit").Reset

aplicabil în Excel sau

CommandBars("Menu Bar").Reset

care restaureaz , în Word, bara de meniuri sistem.

Modific rile sistemului de meniuri în execu ie (run-time)

Sistemul de meniuri create în timpul proiect rii poate fi programat astfel încât s r spund dinamic la modificarea
condi iilor din timpul execu iei. Se poate înlocui bara de meniu implicit cu o bar proprie. Dac o anumit intrare nu este
adecvat într-un context dat, atunci ea poate fi inhibat sau eliminat . O intrare care reprezint o op iune cu dou st ri,
se poate reprezenta imaginea ei ca un buton ap sat sau nu. Se poate, de asemenea, redenumi o comand dup
ac iunea posibil asupra unei entit i (de genul Hide — Show).

Este de în eles c toate aceste modific ri pot fi efectuate în timpul execu iei prin cod Visual Basic.

Afi area unei bare de meniu

Pentru afi area unei bare proprii de meniu în locul bare de meniu active, se fixeaz proprietatea Visible a obiectului
CommandBar corespunz tor la valoarea True. Noua bar de meniu vizualizat înlocuie te în mod automat bara activ .
Prin fixarea propriet ii Visible la False, se reface bara de meniu implicit , opera iune recomandat înaintea p r sirii
proiectului Visual Basic.

235
La pornirea aplica iei Microsoft Office este afi at bara de meniu implicit . În Word se poate totu i înlocui bara implicit a
aplica iei la pornire deoarece ultima bar de meniu afi at la oprirea aplica iei Word poate fi salvat în template-ul Normal
i restaurat în mod automat. În celelalte aplica ii, ca i în Word, se utilizeaz evenimentul Open pentru fixarea pe True a
propriet ii Visible pentru bara de meniu proprie, sau se utilizeaz un macro activat de utilizator sau prin program.

Afi area dinamic a componentelor de meniu

Dac o component de meniu se aplic doar unui document particular, este recomandabil ca aceast component s
apar doar atunci când documentul este activ; acest mod de operare reduce aglomerarea inutil a interfe ei. Se poate
limita via a unei componente de meniu doar la perioada în care este deschis sau activ documentul c ruia i se aplic .

O alternativ este ca asocierea document – component de meniu s se gestioneze prin stabilirea propriet ii Visible la
True sau False dup cum este necesar , sau nu, componenta respectiv . Procedeul poate fi utilizat inclusiv pentru o bar
de meniu i este, uneori, de preferat procedeului prin care se adaug / terge o component .

Pentru a afi a în mod dinamic componentele de menu, se scriu procedurile de r spuns la evenimente prin care se
afi eaz sau se ascund, se creeaz sau se terg componentele respective. Dac , îns , aplica ia gazd nu suport
evenimente, atunci nu se pot personaliza componentele în mod dinamic. O alternativ este, pentru aceste aplica ii,
asignarea procedurilor la proprietatea OnAction a altor elemente de meniu. Dac aplica ia permite controale ActiveX,
atunci se poate modifica interfa a aplica iei container ca r spuns la un eveniment suportat de un control ActiveX.

Observa ie. Deoarece Word memoreaz personaliz rile în documente sau abloane, componentele proprii sunt vizibile
atunci când documentul sau ablonul este disponibil în contextul curent i ascunse atunci când documentul sau template-
ul nu este disponibil. Prin contrast, deoarece Microsoft Excel memoreaz personaliz rile la nivel de spa iu de lucru,
modificarea dinamic a interfe ei se realizeaz prin schimbarea propriet ii Visible în proceduri eveniment.

Permiterea i inhibarea componentelor de meniu

Dac se dore te oprirea utilizatorului de la selectarea unei intr ri de meniu, comanda respectiv poate fi inhibat . O
comand inhibat apare pe meniu într-o culoare tears i nu poate fi activat . Acest atribut este stabilit de proprietatea
Enabled care la True permite accesul la comand iar la False interzice accesul. Proprietatea nu se poate fixa pentru
intr ri built-in de meniu i nici pentru un submeniu ca obiect (pot fi inhibate îns toate intr rile submeniului).

Urm torul exemplu Excel adaug comanda Open Database la meniul File a barei de meniu pentru foaia de calcul i apoi
inhib comanda ad ugat :

CommandBars("Worksheet Menu Bar").Controls("File") _


.Controls.Add("Open Database").Enabled = False

Dac proprietatea este stabilit la nibvelul unui meniu, ca în exemplul urm tor, toate comenzile meniului sunt interzise:

CommandBars("Worksheet Menu Bar").Controls("File").Enabled = False

Indicarea st rii unei intr ri de meniu

Dac o intrare a unui meniu reprezint o op iune cu dou st ri, este posibil s se modifice aspectul imaginii comenzii
încât s arate ca un buton ap sat sau ridicat, potrivit st rii op iunii. Aceasta se realizeaz prin stabilirea propriet ii State
a intr rii. Proprietatea poate avea una dintre valorile (constantele MsoButtonState): msoButtonUp, msoButtonDown sau
msoButtonMixed.

Exemplul urm tor (în Excel) comut între cele dou st ri ale unei comenzi proprii inserate în meniul View:

236
Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.State = msoButtonDown
' comutare la viziunea database
Else
.State = msoButtonUp
' comutare la viziunea worksheet
End If
End With
End Sub

În timpul execu iei se poate schimba imaginea butonului prin lucrul cu proprietatea FaceId pentru a schimba imaginea în
momentul schimb rii st rii comenzii. Pentru a specifica imaginea de buton care s fie afi at al turi de comand , trebuie
s se g seasc comanda built-in cu imaginea dorit , s se determine ID s u i s se atribuie aceast valoare propriet ii
FaceId (schimbarea propriet ii FaceId nu modific func ionalitatea comenzii). Urm torul exemplu Excel amplific
exemplul precedent prin schimbarea imaginii în func ie de stare.

Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.FaceId = 987
.State = msoButtonDown
' comutare la viziunea database
Else
.FaceId = 1
.State = msoButtonUp
' comutare la viziunea worksheet
End If
End With
End Sub

Redenumirea unei intr ri de meniu

Proprietatea Caption con ine denumirea intr rii. Modificând valoarea propriet ii se poate prezenta utilizatorului o
comand adecvat contextului curent. Exemplul urm tor arat cum se poate utiliza acest fapt. Se începe prin inserarea
unei comenzi Open Database, moment în care comanda se înlocuie te cu comanda Close Database, adecvat
contextului:

CommandBars("MyMenuBar").Controls("File").Controls("Open Database") _
.Caption = "Close &Database"

La redenumirea intr rii trebuie avut grij ca alte proceduri care se refer la comand s utilizeze în referin e noul nume.

Se poate utiliza, evident, o variabil care se refer la intrarea de meniu, ceea ce înl tur problemele suplimentare care
apar la redenumire:

Set openDatabase = CommandBars(("MyMenuBar"). _


Controls("File").Controls("Open Database")

Schimbarea titlului se efectueaz prin

openDatabase.Caption = "Close &Database"

237
Bare de unelte

Fiecare aplica ie Microsoft Office ofer un sistem de bare de unelte (toolbar) con inând controale pe care utilizatorul le
ac ioneaz pentru a avea acces la comenzile frecvente. Fiecare toolbar poate s apar depozitat (docked) la una dintre
laturile ferestrei aplica iei sau ca o fereastr flotant pozi ionat oriunde în spa iul de lucru. Fiecare control de pu un
toolbar este control grafic prin care utilizatorul poate schimba informa ii cu aplica ia Visual Basic.

Afi area unei bare de unelte într-o aplica ie Office se realizeaz prin meniul View, comanda Toolbars i click pe numele
barei dorite. Imaginea ata at barei respective devine selectat . Un nou click ascunde bara de unelte. Bare de unelte
adi ionale pot fi v zute în dialogul Customize, în lista din Categories.

Exist mai multe tipuri de controale care apar pe o bar de unelte, discutate în continuare.

Cel mai comun tip de unealt este un buton de control simplu, cu o imagine. Grafica, denumit imaginea butonului, este
o reprezentare vizual a comenzii sau op iunii activate de respectivul control. Utilizatorul poate s ac ioneze un buton
pentru a executa o ac iune (de exemplu butonul New creeaz un nou document) sau s comute între dou st ri posibile
(cum ar fi butonul Bold).

Alt tip de control este un buton de control care con ine o imagine i o palet derulabil ata at . Utilizatorul
ac ioneaz s geata în jos a controlului penbtru a afi a paleta de unde selecteaz op iunea dorit . Ac ionarea butonului
(nu a s ge ii) aplic op iunea selectat (indicat prin grafic ). Un exemplu de acest gen este controlul Font Color.

Un control poate fi de tip text box, list box sau combo box. Utilizatorul poate fie tasta text în zona de text, fie ac iona
s geata în jos i selecta un element al listei. De exemplu, controlul Font Size de pe bara de unelte Word Formatting
permite înscrierea direct a m rimii fontului sau selectarea dintr-o list disponibil de m rimi.

Ultimul tip de unealt este controlul pop-up, care afi eaz un meniu cu alte controale. În esen un asemenea control
este similar cu un meniu, exemplul fiind butonul Draw care produce la activare afi area barei de unelte Drawing.

Observa ie. De i sunt identice ca aparen i comportare, controalele de pe barele de unelte nu sunt acelea i cu
controalele ActiveX. Nu se pot ad uga controale ActiveX la bare de unelte i nu se pot ad uga controale de toolbar la
documente sau forme.

Principii de adaptare a barelor de unelte

Aplica iile Microsoft Office ofer o mare varietate de modalit i pentru modificarea barelor de unelte: se pot crea noi bare
de unelte, se pot ad uga noi butoane la barele existente, se poate modifica imaginea de pe un buton, se pot asigna
macro-uri, texte ToolTip de ajutor, text asociat afi at în bara de stare a aplica iei.

Dac se modific o bar built-in sau se creeaz o bar de unelte proprie depinde de num rul de modific ri inten ionate
sau de dorin a proiectantului. Este recomandabil ca ad ugarea sau modificarea unui num r mic de butoane s se
efectueze pe o bar de unelte predefinit , în timp ce proiectele mari s dispun de bare de unelte proprii. Indiferent de
calea aleas , configura ia standard poate fi restaurat oricând.

Modific rile pot fi efectuate în timpul proiect rii (design-time) sau în timpul execu iei (run-time) prin proceduri Visual Basic.
Este preferabil ca modific rile principale s se efectueze în timpul proiect rii i doar eventualele modific ri dinamice,
func ie de ac iunile utilizatorului, s se efectueze în run-time. O schimbare frecvent a sistemului de meniuri poate
îngreuna ac iunile utilizatorului.

Utilizarea meniurilor

La orice bar de unelte, built-in sau proprie, se pot ad uga controale pop-up, acelea i ca la crearea
meniurilor/submeniurilor. Aceast ac iune este un compromis acceptabil între modificarea unei bare de meniu i
238
introducerea unui mare num r de butoane unelte. Reamintim butonul Draw, sau AutoShapes, de pe bara de unelte
Drawing care deschide un meniu.

Ad ugarea meniurilor, submeniurilor i intr rilor la o bar de unelte se realizeaz în modul descris în sec iunile
precedente care se refer la personalizarea meniurilor.

Utilizarea controalelor Text box, List box i Combo box

Controale de tip text box, list box i combo box se pot ad uga atât la barele de unelte built-in cât i la barele proprii.
Aceste controale pot fi utile pentru ob inerea repetat a unor informa ii de la utilizator sau pentru executarea unei
proceduri dependente de valoarea controlului.

Dialogul Customize suport ad ugarea unor controale predefinite (built-in) la orice bar de unelte. Pentru ad ugarea
unor controale proprii se va utiliza Visual Basic prin care se pot proiecta i ad uga controale de tipurile discutate aici.
Dac dialogul Customize este deschis, se poate modifica l imea oric rui control (built-in sau propriu) text box, list box
sau combo box.

Modific rile barelor de unelte în timpul proiect rii (design-time)

În aceast sec iune se prezint crearea unei noi bare de unelte, ad ugarea de controale noi (built-in sau proprii),
eliminarea controalelor dintr-o bar de unelte, gruparea controalelor i schimbarea dimensiunilor controalelor text box, list
box i combo box. Se poate de asemenea modifica sau edita imaginea de pe un control.

Ad ugarea unei bare de unelte

Dac se dore te ca uneltele proprii s fie con inute într-o bar de unelte separat , procesul se desf oar în dou etape:
crearea barei i ad ugarea controalelor (similar lucrului cu barele de meniu). Se poate utiliza dialogul Customize sau
Visual Basic.

Dialogul Customize

• Se afi eaz dialogul Customize


• În fi a Toolbars click New.
• În Toolbar name se introduce numele noii bare de unelte i OK. Se afi eaz o bar de unelte flotant , cu numele
introdus. La aceasta se pot ad uga controale.

Noul toolbar este ad ugat la lista Toolbars de pe fi a Toolbars a dialogului Customize.

Visual Basic

Se utilizeaz Add a colec iei CommandBars pentru a crea o nou bar de unelte. Prin fixarea argumentului Position la
msoBarLeft, msoBarTop, msoBarRight, msoBarBottom sau msoBarFloating se stabile te dac obiectul
CommandBar creat este flotant sau aliniat la o latur (docked).

Urmatorul exemplu creeaz i afi eaz o bar de unelte nou numit "Custom Tools".

Set cstm = CommandBars.Add(Name:="Custom Tools", Position:=msoBarFloating, _


MenuBar:=False, Temporary:=False)
cstm.Visible = True

239
Adaugarea i gruparea controalelor

Pe lâng ad ugarea controalelor la orice bar de unelte, acestea pot fi separate prin linii dup func ionalitate.

Dialogul Customize

Prin dialogul Customize se pot ad uga controale built-in în modul urm tor:

• Se afi eaz dialogul Customize


• Prin fi a Toolbars se vizualizeaz bara de unelte care se modific .
• În fi a Commands se alege categoria necesar de comenzi. Comenzile categoriei sunt afi ate în caseta
Commands.
• Se trage controlul care se adaug din lista Commands în pozi ia sa de pe bara de unelte.

Pentru ad ugarea controalelor proprii fiecare aplica ie Office are particularit ile ei, prezentate în continuare.

Microsoft Access

Pentru ad ugarea unui control care execut un macro se urmeaz pa ii descri i anterior dar în Categories (fi a
Commands) se selecteaz All Macros. Se trage apoi macroul dorit din lista Commands pe bara de unelte.

Pentru un control care execut o procedur de tip Function se procedeaz similar în primii pa i dar pe bar se trage
orice control (din orice categorie). Dup pozi ionarea pe bara de unelte, click dreapta pe control i deschiderea dialogului
Control Properties în care se fixeaz numele în Caption i ac iunea de executare a procedurii Visual Basic în On
Action. Expresia trebuie s aib sintaxa: =functionname().

Microsoft Excel

Se urmeaz aceia i pa i descri i anterior, dar în Categories se alege Macros, se trage controlul Custom Button din
lista Commands în pozi ia stabilit pe bara de unelte. Click dreapta pe noul control i Assign Macro in meniul
contextual. În dialogul Assign Macro se selecteaz macroul executat de buton.

Microsoft Word

Similar procedurii de la Excel, în Categories se alege Macros i se trage din lista Commands denumirea procedurii
dorite pe bara de unelte care se modific . Utilizând meniul contextual afi at pentru noul control se stabilesc atributele
sale.

Este de rev zut i observa ia f cut la subiectul similar de la meniuri privind procedurile proprii care au acela i nume cu
controalele built-in.

Microsoft PowerPoint

Se procedeaz la fel ca în Word.

Modificarea aparen ei unei unelte

Aspectul unui buton de pe o bar de unelte poate fi o imagine, un text sau ambele. Aspectul este determinat de stilul
butonului, fixat prin comenzile din meniul contextual disponibil în timp ce este activ dialogul Customize.

Stilurile posibile pentru un buton sunt descrise în tabelul urm tor.

240
Stilul Aspectul butonului

Default Style Numai imaginea butonului

Text Only (în meniuri) Numai imaginea butonului

Text Only (în rest) Numai numele

Image And Text Imaginea i numele

Atunci când dialogul Customize este activ, se poate schimba imaginea de pe buton într-unul din modurile descrise la
procedura similar de la intr rile unui meniu.

Gruparea controalelor

Într-un mod similar celui de la gruparea comenzilor de pe un meniu, pentru a începe un grup cu un control se activeaz
dialogul Customize i în meniul contextual al controlului se alege Begin Group. O nou activare a acestei comenzi
elimin linia separatoare de grup.

Visual Basic

Se utilizeaz metoda Add a colec iei CommandBarsControls pentru ad ugarea unui nou control la obiectul
CommandBar care reprezint toolbarul care se modific . Ad ugarea unui control built-in se efectueaz specificând
num rul ID al controlului în argumentul Id al metodei Add. Urm torul exemplu adaug controlul built-in Spelling la bara
numit "Quick Tools".

Set mySpell = CommandBars("Quick Tools").Controls.Add(Id:=2)

Pentru ad ugarea unui control propriu se adaug un nou control i apoi se fixeaz proprietatea OnAction pe procedura
Visual Basic executat la clickarea controlului. În argumentul Type se d valoarea msoControlButton pentru a ar ta c
este bvorba de un buton. Se poate stabili proprietatea FaceId la ID-ul unui control built-in pentru a-i da o imagine definit .

Urm torul exemplu (în Excel) adaug un buton pe bara de unelte Standard, înaintea butonului Save. Butonul reprezint
procedura OpenDatabaseProc. Exemplul stabile te imaginea butonului la o gril (ID 987).

Set databaseItem = CommandBars("Standard").Controls. _


Add(Type:=msoControlButton, Before:=3)
With databaseItem
.OnActiona = "OpenDatabaseProc"
.FaceId = 987
End With

Pentru a începe un nou grup se fixeaz pe True proprietatea BeginGroup a obiectului CommandBarButton,
CommandBarPopup sau CommandBarComboBox reprezentând controlul.

Se utilizeaz Controls(index), unde index este titlul sau indicele controlului, pentru a returna obiectul reprezentând
controlul.

Ad ugarea i ini ializarea controalelor text box, list box i combo box

Dac un control de acest tip este built-in, ad ugarea lui se poate efectua prin dialogul Customize în mod similar
ad ug rii altor controale built-in.
241
Pentru ad ugarea i ini ializarea con inutului unui control propriu de tip text box, list box sau combo box se poate utiliza
doar Visual Basic. Prin metoda Add a colec iei CommandBarControls se poate crea un asemenea control specificând
drept tip al controlului (în argumentul Type) una dintre valorile

Controlul Argumentul Type

Text box msoControlEdit

List box msoControlDropDown

Combo box msoControlComboBox

Se poate folosi proprietatea Style a unui control text box, list box sau combo box pentru a indica dac titlul (textul) apare
în stânga boxei respective.

Urm torul exemplu adaug un control combo box cu eticheta "Quarter" la o bar de unelte proprie i atribuie controlului
macro-ul cu numele "ScrollToQuarter".

Set newCombo = CommandBars("Custom1").Controls. _


Add(Type:=msoControlComboBox)
With newCombo
.AddItem "Q1"
.AddItem "Q2"
.AddItem "Q3"
.AddItem "Q4"
.Style = msoComboNormal
.OnAction = "ScrollToQuarter"
End With

La executarea aplica iei Visual Basic, procedura atribuit controlului în proprietatea OnAction este apelat de fiecare
dat când se modific controlul. În procedur se poate utiliza proprietatea ActionControl a obiectului CommandBars
pentru a g si care control a fost schimbat i a returna valoarea modificat . Proprietatea ListIndex returneaz intrarea
introdus în combo box.

Eliminarea unui control dintr-o bar de unelte

Eliminarea controalelor poate fi necesar atât pentru c unele ac iuni sunt executate prin interfa a proprie proiectat , cât
i pentru simplificarea interfe ei cu un utilizator mai pu in experimentat.

Restaurarea configura iilor standard este posibil pentru barele de unelte built-in. Barele de unelte i controalele proprii
trebuiesc create din nou în vederea restaur rii unei configura ii ini iale.

Dialogul Customize

Pentru a terge un control:

o Se deschide dialogul Customize.


o Se afi eaz bara de unelte care se modific prin fi a Toolbars.
o Click dreapta pe controlul care se elimin i comanda Delete din meniul contextual.

242
Pentru a elimina o întreag bar de unelte proprie se deschide dialogul Customize, click pe numele barei în lista
Toolbars a fi ei sinonime i click pe butonul Delete. Nu se pot elimina barele built-in (acestea se afi eaz sau nu prin
View – Toolbars etc.).

Visual Basic

Se utilizeaz metoda Delete pentru a elimina din colec ia corespunz toare un obiect de control sau bar de unelte
proprie. Nu se poate elimina o bar de unelte built-in.

Urm torul exemplu Excel elimin controlul Print din bara de unelte Standard.

CommandBars("Standard").Controls("Print").Delete

iar pentru a terge o bar proprie de unelte

CommandBars("Custom Bar").Delete

Restaurarea barelor de unelte built-in

Din dialogul Customize

o Se afi eaz dialogul Customize.


o În fi a Toolbars se selecteaz bara de unelte care se restaureaz .
o Click Restore.

În Visual Basic se utilizeaz metoda Reset:

CommandBars("Standard").Reset

Barele de unelte proprii nu se restaureaz în mod automat; ele se creeaz din nou.

Modific rile barelor de unelte în timpul execu iei (run-time)

Barele de unelte pot fi programate astfel încât s r spund dinamic la schimb rile de condi ii din timpul execu iei.
Ac iunile posibile uzuale sunt interzicerea accesului la un buton i comutarea imaginii ap sat/ridicat.

Afi area sau ascunderea controalelor i barelor de unelte

Pentru m rirea spa iului de lucru sau pentru simplificarea interfe ei cu utilizatorul, o bar de unelte poate fi afi at doar
atunci când este necesar . Vizibilitatea unei bare este dependent de valoarea propriet ii Visible, cu valorile True i
False. Fixarea valorii True este echivalent cu selectarea barei în lista Toolbars din dialogul Customize i click pe OK.

Urm toarea procedur Excel, atribuit intr rii de meniu View MyToolbar din meniul View, comut st rile intr rii din meniu
i proprietatea Visible a barei de unelte de fiecare dat când utilizatorul face click pe intrarea din meniu.

Sub ViewMyAppToolbar()
With CommandBars("Worksheet Menu Bar").Controls("View"). _
Controls("View MyToolbar")
If .State = msoButtonUp Then
.State = msoButtonDown
CommandBars("MyAppTools").Visible = True
Else
243
.State = msoButtonUp
CommandBars("MyAppTools").Visible = False
End If
End With
End Sub

Atunci când o bar de unelte este vizibil , utilizatorul poate ac iona orice control de pe ea. Prin fixarea propriet ii Visible
drept True sau False se poate efectiv ad uga sau elimina un control din spa iul de lucru al utilizatorului f r a terge
efectiv controlul.

Observa ie. Deoarece Microsoft Word salveaz personaliz rile la nivel de documente sau abloane, barele de unelte
proprii i controalele proprii sunt vizibile doar dac documentul sau template-ul este disponibil. Microsoft Excel salveaz
personaliz rile la nivel de spa iu de lucru i se va utiliza proprietatea Visible în coduri activate de evenimente pentru a
modifica dinamic interfa a cu utilizatorul.

Mutarea i redimensionarea barelor de unelte

Adaptarea proeminen ei pe ecran a unei bare de unelte la contextul curent a aplica iei se poate efectua i prin
schimbarea locului pe ecran, a dimensiunilor.

Propriet ile Height, Width, Left, Top i Position permit manevr ri de pozi ie i dimensiune pentru un obiect
CommandBar.

Restaurarea barelor de unelte built-in

Metoda Reset realizeaz restaurarea unui obiect predefinit. Urm torul exemplu realizeaz refacerea tuturor barelor de
unelte built-in i eliminarea tuturor barelor proprii. Pentru aceasta se folose te proprietatea BuiltIn care returneaz True
pentru un obiect predefinit.

For Each cb In CommandBars


If cb.BuiltIn Then
cb.Reset
Else
cb.Delete
End If
Next

Observa ie. Prin restaurarea barelor built-in se elimin i toate controalele proprii inserate în acele bare. Se poate pierde
astfel accesul la o procedur din aplicatia Visual Basic. Pentru a ocoli aceast capcan se recomand ca eliminarea
controalelor proprii de pe o bar de unelte built-in s se efectueze individual, în func ie de contextul curent i nu prin
restaurare global .

Permiterea i interzicerea accesului la controale

Ca alternativ la afi area i ascunderea controalelor se poate permite sau interzice accesul prin manevrarea propriet ii
Enabled. Proprietatea poate fi utilizat i pentru aflarea st rii curente a controlului.

Urm torul exemplu inhib butonul al treilea de pe bara Standard.

CommandBars("Standard").Controls(3).Enabled = False

Un control interzis produce un beep la ac ionare i nu lanseaz procedura asociat .

244
Indicarea st rii activ/inactiv a unui buton

Pentru butoanele care comut între dou st ri, proprietatea State, cu valorile msoButtonDown i msoButtonUp, poate
fi utilizat , similar exemplelor de la meniuri, pentru reprezentarea grafic a celor dou op iuni posibile.

Modificarea controalelor Text box, List box i Combo box

Dac se utilizeaz controale proprii de tip text box, list box sau combo box, în timpul execu iei se poate modifica textul
afi at în zona text a controlului sau ad uga/elimina intr ri în listele controalelor.

Proprietatea Text reflect textul afi at în zona text a controlului i poate fi fixat pe o valoare reflectând modific ri din
aplica ie.

Metodele AddItem i RemoveItem permit procesarea listelor din controale.

Alte propriet i i metode se vor studia din Help. De exemplu exist posibilitatea declar rii unui antet de list (intr ri
separate de celelalte printr-o linie).

ID-uri de controale i intr ri de meniu

Fiecare aplica ie Office con ine un set unic de bare de meniuri i de unelte i un set unic de intr ri de meniuri i de
controale, doar o mic parte dintre acestea apar efectiv în aplica ie. De asemenea, dup cum s-a explicat la începutul
capitolului, fiecare aplica ie are un mod unic de memorare a meniurilor i barelor de unelte.

În timp ce func ionalitatea asociat cu fiecare intrare built-in de meniu i cu fiecare unealt apar ine unei aplica ii Office
specifice, titlul, imaginea de pe buton, l imea i alte propriet i implicite sunt memorate într-o resurs partajat de toate
aplica iile. Referin ele la componentele con inute în aceast unic resurs se fac prin numerele ID specifice intr rilor de
meniu i uneltelor.

Aceea i resurs comun con ine de asemenea propriet ile implicite ale controalelor pop-up care afi eaz meniurile built-
in. Totu i, aceste controale pop-up nu con in i intr rile meniurilor built-in, cu alte cuvinte controalele pop-up sunt vide.

Referirea la ID-uri poate fi ocolit prin utilizarea dialogului Customize. Sunt îns situa ii când referin a este necesar :

o Se dore te atribuirea unui intr ri la un meniu/bar de unelte predefinit sau proprie iar intrarea respectiv
nu este disponibil din dialogul Customize în design-time.
o Se adaug o intrare built-in la un meniu sau la o bar de unelte în run-time.
o Se dore te copierea unei imagini de buton la alt buton în run-time.

Se poate atribui ID-ul unui element built-in la argumentul Id al metodei Add pentru colec ia CommandBarsControls, sau
se poate atribui ID-ul unui element la proprietatea FaceId a oric rui control propriu sau built-in.

Observa ie. Chiar dac resursa partajat con ine informa ie despre orice element de interfa din toate aplica iile Office,
nu se pot ad uga într-o aplica ie intr ri i controale a c ror func ionalitate este con inut în alt aplica ie. Se poate totu i
copia, i în cazul func ionalit ilor distincte, imaginea butoanelor de la o aplica ie la alta.

Pentru determinarea ID-urile elementelor de interfa dintr-o aplica ie Office, se poate urma una din c ile:

o Într-un modul se scrie cod pentru atribuirea unui element de meniu sau control dintr-o bar de unelte la o
variabil obiect. Se utilizeaz apoi mijloacele de debug pentru a vedea valoarea propriet ii Id a
obiectului. Num rul ob inut se memoreaz i poate fi ulterior utilizat.

245
o Se execut urm toarea procedur într-o aplica ie Office pentru a crea un document text care con ine lista
ID-urilor i titlurilor tuturor comenzilor built-in din aplica ie.

Public Sub outputIDs()


Const maxId = 4000
Open "c:\ids.txt" For Output As #1
' crearea unei bare temporare cu toate elementele disponibile asignate
Set cbr = CommandBars.Add("Temporary", msoBarTop, False, True)
For i = 1 To maxId
On Error Resume Next
cbr.Controls.Add ID:=i
Next
On Error GoTo 0
' scrierea ID i titlu pentru fiecare control
For Each btn In cbr.Controls
Write #1, btn.ID, btn.Caption
Next
' eliminarea barei de comand i închiderea fi erului de ie ire
cbr.Delete
Close #1
End Sub

o Executarea procedurii urm toare într-o aplica ie Office pentru a crea un set de bare de unelte proprii care
con in atâtea butoane câte valori valide de proprietate FaceId exist în Office; fiecare imagine de buton i
textul ToolTip este fixat la o asemenea valoare. Se poate referi încruci at ID-ul unei comenzi built-in la
proprietatea FaceId a unui buton de pe aceste bare i reciproc.

Sub MakeAllFaceIds()
' Make fourteen bars with 300 faces each.
' Note that maxId is greater than last valid ID, so
' error will occur when first invalid ID is used
Const maxId = 3900
On Error GoTo realMax
For bars = 0 To 13
firstId = bars*300
lastId = firstId + 299
Set tb = CommandBars.Add
For i = firstId To lastId
Set btn = tb.Controls.Add
btn.FaceId = i
btn.ToolTipText = "FaceId = " & i
Next
tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(lastId))
tb.Width = 591
tb.Visible = True
Next
' Delete the button that caused the error and set toolbar name
realMax:
btn.Delete
tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(i–1))
tb.Width = 591
tb.Visible = True
End Sub

246
Not . ID-urile controalelor pop-up pentru meniurile built-in sunt în domeniul 30002 – 30426. Reamintim c aceste ID-uri
returneaz copii vide ale meniurilor predefinite.

Forme grafice (shapes) i stratul de desen

Visual Basic dispune de un model de obiecte, reprezentând stratul de desen, comun aplica iilor Microsoft Word, Microsoft
Excel i Microsoft PowerPoint. Obiectul cel mai sus în ierarhia acestui model este colec ia Shapes, care con ine toate
obiectele grafice – AutoShapes, forme libere, obiecte OLE, imagini – care pot fi incluse în stratul de desen al
documentului. Este de notat c formele grafice incluse în stratul de text din Word nu sunt incluse în colec ia Shapes.

Pentru o discu ie mai ampl privind controalele ActiveX, care sunt o categorie special de forme grafice, se va vedea
capitolul Dialoguri i controale ActiveX.

Observa ie. Pentru simplificarea exprim rii se utilizeaz termenul "form " pentru shape, de i "form grafic " ar fi mai
potrivit în contextul subiectului.

Obiectele Shape, ShapeRange i Shapes

Exist trei obiecte diferite care reprezint formele: colec ia Shapes, reprezentând toate formele din stratul de desen dintr-
un document Microsoft Excel, Word sau PowerPoint, colec ia ShapeRange, care reprezint o submul ime de forme din
stratul de desen i obiectul Shape, care reprezint o form grafic individual . În general, se utilizeaz colec ia Shapes
atunci când se adaug forme pe stratul de desen sau se parcurg toate formele; se utilizeaz obiectul Shape când se
dore te formatarea sau procesarea unei anumite forme grafice i se utilizeaz colec ia ShapeRange când se dore te
procesarea/formatarea unui grup de forme grafice.

O colec ie ShapeRange poate con ine oricâte elemente. Dac include un singur obiect, este similar unui obiect Shape.
Se poate utiliza o colec ie ShapeRange care con ine toate elementele din Shapes pentru a formata toate formele în
acela i timp. Propriet ile i metodele care se aplic obiectului Shape se pot aplica de asemenea i colec iei
ShapeRange.

Returnarea colec iei Shapes

O referin la colec ia Shapes se ob ine prin proprietatea sinonim aplicat unui obiect document. Exemplul urm tor
selecteaz toate formele din stratul de desen:

myDocument.Shapes.SelectAll

Returnarea obiectului Shape

Un obiect Shape poate fi ob inut prin intermediul colec iei Shapes, în modul general de ob inere a unui element dintr-o
colec ie, dup unul dintre exemplele urm toare:

myDocument.Shapes(3).Duplicate
myDocument.Shapes("Red Square").Duplicate

Fecare form are un nume atribuit în mod implicit, cum ar fi "Rectangle 3", ob inut la ad ugarea formei la colec ia
Shapes. Prin proprietatea Name se poate atribui un nume sugestiv. Acest lucru se poate realiza concomitent cu
ad ugarea/crearea formei:

myDocument.Shapes,AddShape(msoShapeRectangle, 144, 144, 72, 72) _


.Name = "Red Square"

247
Aceast metod , care utilizeaz obiectul returnat de metoda AddShape, poate fi utilizat i cu alte propriet i sau metode
ale obiectului Shape.

Returnarea colec iei ShapeRange

Prin referin e de tipul Shapes.Ranges(index), unde index este fie numele, fie indicele, fie un tablou de denumiri sau de
indici, se returneaz o colec ie ShapeRange care reprezint un subset a colec iei Shapes. Exemplul urm tor umple
formele 1 i 3 din myDocument:

myDocument.Shapes.Range(Array(1, 3)).Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientLateSunset

Se utilizeaz Selection.ShapeRange pentru a returna o colec ie ShapeRange care reprezint toate formele din selec ie.
Prin Selection.ShapeRange(index), unde index este un indice sau un nume de form , se ob ine accesul la un obiect
Shape din selec ie:

ActiveWindow.Selection.ShapeRange(1).Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientLateSunset

Observa ie. Macro recorderul genereaz cod bazat pe selec ie. Atunci când se scrie cod direct, sau se editeaz codul
generat de macro recorder, se poate crea un cod mai eficient prin returnarea formelor direct din colec ia Shapes.

Desenarea unei forme pe un Document, Worksheet sau Slide

Ad ugarea unei forme pe stratul de desen se efectueaz printr-una dintre metodele colec iei Shapes dedicate acestui
scop. Fiecare tip de form se ob ine printr-o metod specific i acestea sunt enumerate în tabelul urm tor.

Tipul de form grafic Metoda Parametri

Callout AddCallout (Type, Left, Top, Width, Height, Anchor)

Note ata abile (doar PowerPoint) AddComment (Left, Top, Width, Height)

Linie sau curb care conecteaz dou forme diferite AddConnector (Type, BeginX, BeginY, EndX, EndY)

Curb Bézier AddCurve (SafeArrayOfPoints)

Control nativ de formular Excel (doar Microsoft AddFormControl (Type, Left, Top, Width, Height)
Excel)

Etichet AddLabel (Orientation, Left, Top, Width, Height)

Linie AddLine (BeginX, Beginy, EndX, EndY)

Sound sau movie (doar PowerPoint) AddMediaObject (FileName, Left, Top, Width, Height)

Control ActiveX (doar Word; pentru Excel i AddOLEControl (ClassType, Left, Top, Width, Height,
PowerPoint se utilizeaz AddOLEObject) Anchor)

Obiect OLE scufundat sau legat AddOLEObject (ClassType, FileName, LinkToFile,


DisplayAsIcon, IconFileName, IconIndex,
IconLabel, Left, Top, Width, Height,
Anchor)

248
Imagine AddPicture (FileName, LinkToFile,
SaveWithDocument, Left, Top, Width,
Height, Anchor)

Rezervare de loc pentru text sau pentru un obiect AddPlaceholder (Type, Left, Top, Width, Height)
grafic (doar PowerPoint)

Linie poligonal închis sau deschis AddPolyline (SafeArrayOfPoints)

AutoShape (form predefinit ) AddShape (Type, Left, Top, Width, Height)

TextBox AddTextbox (Orientation, Left, Top, Width, Height)

WordArt AddTextEffect (PresetTextEffect, Text, FontName,


FontSize, FontBold, FontItalic, Left, Top,
Anchor)

Titlu de diapozitiv (doar PowerPoint) AddTitle –

Form liber BuildFreeform (EditingType, X1, Y1)

ConvertToShape –

Între parametri se remarc Left i Top care specific pozi ia formei, Width i Height care fixeaz dimensiunile obiectului
grafic. Pentru explica ii suplimentare asupra parametrilor care nu sunt suficient de explici i se vor studia intr rile
respective din Help.

Editarea unei forme

Prin intermediul propriet ilor i metodelor obiectelor Shapes i ShapeRange se pot modifica formele grafice
reprezentate. Acestea pot fi repozi ionate în document, redimensionate, eliminate; se poate schimba aspectul lor i li se
poate ad uga text.

Determinarea propriet ilor i metodelor adecvate

Propriet ile i metodele care controleaz atributele i comportarea comune tuturor tipurilor de forme se aplic direct
obiectelor Shapes i ShapeRange. Propriet ile i metodele care se aplic doar unor categorii de forme sunt încapsulate
în obiecte secundare care se acceseaz prin obiectul Shape.

Propriet i i metode comune

În aceast categorie sunt incluse propriet ile care controleaz dimensiunea i pozi ia formei (Left, Top, Height, Width)
i metode care controleaz comport ri generice de editare (cum ar fi Duplicate i Zorder). Un exemplu uzual este

With myDocument.Shapes(1)
.Height = 50
.Width = 100
End With

Propriet i i metode specifice

Atributele specifice unui anumit tip de form sunt grupate sub obiecte secundare, cum ar fi FillFormat, con inând
propriet ile care se aplic formelor cu culori de umplere, sau CalloutFormat, con inând toate propriet ile baloanelor
249
(callouts). Pentru a lucra cu acest tip de atribute trebuie s se returneze mai întâi obiectele care le con in. De exemplu, se
utilizeaz proprietatea Fill pentru a returna obiectul FillFormat i se poate aplica apoi proprietatea ForeColor:

myDocument.Shapes(1).Fill.FillColor.RGB = RGB(255,0,0)

În tabelul urm tor sunt prezentate obiectele accesibile din obiectul Shape i care con in propriet ile i metodele
specifice. Se remarc faptul c nu toate denumirile propriet ilor con in cuvântul "Format" existent în obiectul returnat
(precum Fill care returneaz FillFormat).

Proprietatea obiectului Shape Obiectul returnat Aplicabil la

Callout CalloutFormat Baloane de dialog

ConnectorFormat (Excel i ConnectorFormat Conectori de forme


PowerPoint)

ControlFormat (Excel) ControlFormat Controale de formular native

Fill FillFormat Forme cu culori de umplere (toate cu excep ia liniilor)

Line LineFormat Toate formele (LineFormat reprezint linia sau chenarul)

LinkFormat LinkFormat Obiecte OLE legate, imagini legate (doar Word), câmpuri
legate (doar Word)

OLEFormat OLEFormat Obiecte OLE

PictureFormat PictureFormat Imagini i obiecte OLE

Shadow ShadowFormat Toate formele

TextEffect TextEffectFormat Obiecte WordArt

ThreeD ThreeDFormat Forme care pot fi reliefate

WrapFormat (doar Word) WrapFormat Forme care pot fi înconjurate de text

Încercarea de a returna obiecte secundare (cum ar fi CalloutFormat, ConnectorFormat, OLEFormat, PictureFormat


sau TextEffectFormat) dintr-un tip inadecvat de form produce eroare. Pentru alte obiecte (FillFormat, LineFormat,
ShadowFormat sau ThreeDFormat) nu se produce eroare chiar dac forma container nu suport obiectul returnat.

Pentru a nu avea probleme se va utiliza proprietatea Type i, când este aplicabil , proprietatea AutoShapeType, înainte
de aplicarea unei metode sau propriet i specifice i se va introduce o secven de tratare a erorii.

For Each sh In myDocument.Shapes


If sh.Type = msoLinkedOLEObject Then
sh.LinkFormat.Update
End If
Next

250
Culorile de umplere ale formelor

Prin culorile de umplere se în elege nu numai culoarea efectiv utilizat pentru colorarea suprafe ei formei ci i efectele
utilizate la colorare, precum i posibilitatea de a utiliza o imagine drept fundal etc. Obiectul FillFormat reprezint întreaga
umplere a formei, propriet ile i metodele sale permit stabilirea culorii, tipului, transparen ei. Deoarece atributele legate
de culori i tipuri de umplere sunt interdependente, stabilirea unui atribut produce, de regul , modific ri ale altor atribute,
astfel încât s se ob in o mul ime consistent de atribute. Din acela i motiv multe atribute sunt read-only, valorile lor fiind
atribuite în func ie de metodele utilizate.

Tipul de umplere se stabile te printr-una dintre metodele Background (doar PowerPoint), OneColorGradient,
Patterned, PresetGradient, PresetTextured, Solid, TwoColorGradient, UserPicture sau UserTextured,
corespunzând op iunilor disponibile în interfa a utilizator a aplica iilor. Prin propriet ile read/write BackColor, ForeColor,
Transparency i Visible se poate controla aspectul umplerii.

Deoarece sunt foarte multe valori predefinite pentru propriet i sau argumentele metodelor, valorile respective se vor lua
din intr rile Help corespunz toare obiectelor implicate.

Urm torul exemplu adaug o form dreptunghiular la document, fixeaz cele dou culori i tipul de gradient pentru
umplere:

Public Sub fil()


Dim sh As Shape
Set sh = ThisDocument.Shapes.AddShape(msoShapeRectangle, 90, 90, 90, 50)
sh.WrapFormat.Type = wdWrapTight
With sh.Fill
.ForeColor.RGB = RGB(200, 0, 0)
.BackColor.RGB = RGB(0, 200, 170)
.TwoColorGradient msoGradientHorizontal, 1
.Visible = msoTrue
End With
End Sub

Ad ugarea de umbre i efecte 3-D

Proprietatea Shadow a obiectului Shape returneaz un obiect ShadowFormat prin care se controleaz umbririle formei.
Urm torul exemplu produce ad ugarea unei umbre albastre semitransparente, cu dimensiune de 4 puncte:

With sh.Shadow
.Transparency = 0.5
.ForeColor.RGB = RGB(0, 0, 255)
.Visible = msoTrue
.OffsetY = 4
.OffsetX = 4
End With

Proprietatea ThreeD a obiectului Shape returneaz un obiect ThreeDFormat care controleaz reliefarea formei.
Urm torul exemplu adaug efectul de extrudare i precizeaz o adâncime de 50 de puncte, purpurie, perpendicular i
luminat de sus

With sh.ThreeD
.Visible = msoTrue
.Depth = 50
.ExtrusionColor.RGB = RGB(255, 0, 255)

251
.Perspective = msoFalse
.PresetLightingDirection = msoLightingTop
End With

Este normal ca acest efect s nu fie suportat de anumite forme.

Ad ugarea de text la o form

Zona din interiorul unei forme care poate con ine text este numit cadru cu text, text frame, i este reprezentat de un
obiect TextFrame. Acest obiect, returnat de proprietatea TextFrame, con ine textul propriu-zis, precum i propriet ile i
metodele care controleaz alinierea i ancorarea cadrului cu textul.

Doar formele built-in de tip AutoShapes bidimensionale au asociate cadre cu text. Înaintea referirii obiectului TextFrame
se verific disponibilitatea acestuia prin proprietatea HasTextFrame (valabil în PowerPoint) sau prin verificarea
propriet ii Type. Se poate utiliza i tratarea erorilor în cazul în care proprietatea TextFrame poate fi aplicat unui obiect
care nu o suport .

În Microsoft Word se utilizeaz proprietatea TextRange a obiectului TextFrame pentru a returna un obiect Range care
reprezint textul din cadrul respectiv:

ActiveDocument.Shapes(1).TextFrame.TextRange.Text = " … "

În Microsoft Excel se utilizeaz proprietatea Characters a obiectului TextFrame pentru a returna un obiect Characters
care reprezint textul din interiorul cadrului:

ActiveWorksheet.Shapes(1).TextFrame.Characters.Text = " … "

În PowerPoint, se utilizeaz proprietatea TextRange a obiectului TextFrame pentru a returna un obiect TextRange care
reprezint domeniul textului din cadrul respectiv:

ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text = " … "

Lucrul cu obiecte OLE

Propriet ile i metodele obiectului OLEFormat, cum ar fi Activate i DoVerb, controleaz obiectul OLE con inut într-o
form . Obiectul OLEFormat este returnat de proprietatea OLEFormat a obiectului Shape:

With myDocument.Shapes(3)
If .Type = msoEmbeddedOLEObject Or _
.Type = msoLinkedOLEObject Then
.OLEFormat.DoVerb
End If
End With

Utilizarea propriet ii Object a obiectului OLEFormat returneaz obiectul OLE con inut în forma desenat specificat (în
Excel trebuie s se utilizeze de dou ori proprietatea Object într-o linie, separate de operatorul punct, pentru a returna
obiectul OLE).

Urm torul exemplu, executat din Word sau PowerPoint, adaug text la celula A1 a primei foi de calcul dintr-un caiet Excel
con inut în forma a treia din myDocument.

With myDocument.Shapes(3)

252
.OLEFormat.Activate
.OLEFormat.Object.Worksheets(1).Range("A1").Value = " noul text "
End With

Proprietatea Application a obiectului OLE, returnat de proprietatea sinonim , d acces la obiectul din vârful ierarhiei
modelului de obiecte al aplica iei care a creat obiectul OLE. Urm torul exemplu, executat din Microsoft Excel (se va
remarca dubla utilizare a propriet ii Object), afi eaz numele aplica iei în care a fost creat fiecare obiect OLE scufundat
în foaia activ :

For Each s In ActiveSheet.Shapes


If s.Type = msoEmbeddedOLEObject Then
s.OLEFormat.Activate
MsgBox s.OLEFormat.Object.Object.Application.Name
End If
End With

Lucrul cu mai multe forme

Pentru a lucra cu mai multe forme se poate parcurge o colec ie Shapes sau ShapeRange i lucra cu fiecare element al
colec iei sau se poate construi o colec ie ShapeRange cu toate formele grafice care se prelucreaz i se aplic metode
sau propriet i întregii colec ii ShapeRange.

Exist i posibilitatea, disponibil în interfa a utilizator, de a grupa mai multe forme grafice, precum i posibilitatea de
aliniere a formelor.

Dac opera iunea dorit se poate executa în interfa a utilizator pe o selec ie multipl de forme grafice, atunci construirea
unei colec ii ShapeRange este recomandat .

Dac opera iunea nu se poate efectua în interfa a utilizator pe o selec ie multipl , atunci parcurgerea unei colec ii,
Shapes sau ShapeRange, este calea adecvat . Parcurgerea poate fi efectuat printr-o structur uzual For Each …
Next:

For Each sh In myDoc.Shapes


If sh.Type = msoAutoShape Then
sh.TextFrame.TextRange.InsertAfter " (version 1)"
End If
Next

Construirea unui ShapeRange

Dac este necesar ob inerea unui domeniu de forme care s con in doar forme de anumite tipuri, se va utiliza o
instruc iune condi ional de testare a atributelor i se va ad uga denumirea sau indicele formei selectate la un tablou
dinamic. Se va construi apoi un obiect ShapeRange utilizând acest tablou.

Urm torul exemplu construie te un domeniu de forme cu toate formele de tip AutoShapes din document i apoi le
grupeaz .

With myDocument.Shapes
numShapes = .Count
If numShapes > 1 Then
numAutoShapes = 0
ReDim autoShpArray(1 To numShapes)
For i = 1 To numShapes
253
If .Item(i).Type = msoAutoShape Then
numAutoShapes = numAutoShapes + 1
autoShpArray(numAutoShapes) = .Item(i).Name
End If
Next
If numAutoShapes > 1 Then
ReDim Preserve autoShpArray(1 To numAutoShapes)
Set asRange = .Range(autoShpArray)
asRange.Group
End If
End If
End With

Lucrul cu colec ia ShapeRange

Atunci când se aplic propriet i sau metode colec iei ShapeRange, se va ine seama de urm toarele principii:

• Aplicarea unei metode colec iei este echivalent cu aplicarea acelei metode la fiecare obiect Shape din colec ie.
• Stabilirea unei propriet i a colec iei este echivalent cu stabilirea acelei propriet i fiec rui obiect Shape din
colec ie.
• proprietate a colec iei care returneaz o constant , returneaz valoarea comun dac toate obiectele
componente au o aceea i valoare, sau constant "mixed" (de exemplu msoLineDashStyleMixed pentru stilul de
punctare a liniei).
• proprietate a colec iei care returneaz un tip de dat simplu, cum ar fi Long, Single sau String, returneaz
valoarea propriet ii pentru a form dac toate formele au aceea i valoare a propriet ii.
• Valoarea anumitor propriet i poate fi returnat sau stabilit numai dac exist exact o form în colec ie. Dac
exist mai multe forme în colec ie, atunci apare o eroare. Acest fapt apare atunci când se utilizeaz o proprietate
sau metod care se poate aplica doar pentru un obiect.

Aceste principii ac ioneaz i atunci când se lucreaz cu propriet i sau metode ale formelor, grupate în obiecte
secundare ale colec iei ShapeRange (cum ar fi FillFormat).

Urm torul exemplu construie te un obiect ShapeRange din dou forme numite i aplic ambelor o umplere de tip
gradient.

Set myRange = myDoc.Shapes.Range(Array("Big Star", "Little" Star"))


myRange.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass

Metodele Align i Distribute sunt utilizate pentru alinierea sau distribuirea uniforma a formelor dintr-o colec ie
ShapeRange. Prin metoda Zorder se poate modifica ordinea pe Z care determin ordinea de suprapunere a formelor.

Metoda Group realizeaz gruparea tuturor formelor dintr-o colec ie ShapeRange. Prin Ungroup, Regroup se realizeaz
opera iunile sinonime din interfa a utilizator.

Dac se dore te lucrul cu o form individual dintr-un grup, dar f r a renun a la grupare în prealabil, se utilizeaz
proprietatea GroupItems a obiectului Shape care reprezint grupul. Proprietatea returneaz un obiect GroupShapes i
metoda Item a acestui obiect returneaz o form individual din grupul de forme:

With myDocument.Shapes
.AddShape(msoShapeIsoscelesTriangle, 10, 10, 100, 100).Name = "shpOne"
. AddShape(msoShapeIsoscelesTriangle, 150, 10, 100, 100).Name = "shpTwo"
. AddShape(msoShapeIsoscelesTriangle, 300, 10, 100, 100).Name =
With .Range(Array("shpOne", "shpTwo", "shpThree")).Group

254
.Fill.PresetTextured msoTextureBlueTissuePaper
.GroupItems(2).Fill.PresetTextured msoTextureGreenMarble
End With
End With

Tratarea erorilor i depanarea programelor

Acest capitol arat cum s se utilizeze uneltele de depanare i verificare a programelor oferite de Visual Basic Editor.
Sunt prezentate i modurile în care se pot controla erorile din execu ie (run-time errors) ap rute în urma încerc rii de a
executa opera iuni interzise.

Informa iile din acest capitol se aplic proiectelor VBA din Microsoft Excel 97, Word 97 i PowerPoint 97.

Cum se gestioneaz erorile

În mod ideal, procedurile Visual Basic n-ar trebui s con in cod de tratare a erorilro. Realitatea arat îns c probleme
hardware sau ac iuni neanticipate ale utilizatorului pot s produc erori în execu ie, ca urmare programul se opre te i
exist pu ine anse ca utilizatorul s continue execu ia aplica iei. Sunt posibile i erori care de i nu opresc execu ia
produc rezultate ulterioare eronate.

De exemplu, procedura urm toare returneaz True dac fi ierul specificat exist i False dac nu, dar nu con ine
instruc iuni de tratare a erorilor.

Function FileExists (filename) As Boolean


FileExists = (Dir(filename) <>"")
End Function

Func ia Dir returneaz primul fi ier care se potrive te numelui specificat sau un ir de lungime zero în cazul când nu
exist nici o potrivire.

Codul anterior pare a fi corect i acoperitor pentru toate situa iile posibile. Totu î, dac litera de drive specificat nu este
valid , apare eroarea "Device unavailable". Dac unitatea este de floppy disk, func ia va func iona corect doar dac în
unitate este o dischet i poarta este închis . În caz contrar Visual Basic va semnala eroarea "Disk not ready" i execu ia
se opre te.

Pentru a ocoli asemenea situa ii, trebuie s se utilizeze modalit ile de error-handling din VBE pentru a intercepta erorile
(sau "a prinde" - trapping) i a executa ac iuni corective. La apari ia unei erori, Visual Basic stabile te diferite propriet i
ale obiectului reprezentând eroare, Err, cum ar fi num rul erorii, descrierea etc. Obiectul Err poate fi utilizat într-o rutin
de tratare a erorii astfel încât aplica ia poate r spunde inteligent la o situa ie de eroare.

De exemplu, probleme legate de unitate, cum ar fi o unitate invalid sau o unitate de floppy f r dischet , pot fi tratate
dup modelul urm tor.

Function FileExists (filename) As Boolean


Dim Msg As String
' Trecerea la tratarea erorilor
On Error GoTo CheckError
FileExists = (Dir(filename) <> "")
' nu a ap rut nici o eroare
Exit Function
CheckError: ' secven a de tratare a erorii ap rute
' definirea constantelor care reprezint eroarea
Const mnErrDiskNotReady = 71, mnErrDeviceUnavailable = 68
255
' vbExclamation, vbOK, vbCancel, vbCritical i vbOKCancel
' sunt constante definite în biblioteca VBA
If (Err.Number = mnErrDiskNotReady) Then
Msg = "Put a floppy disk in the drive and close the door"
' Afi area mesajului
If MsgBox(Msg, vbExclamation & vbOKCancel) = vbOK Then
Resume
Else
Resume Next
End If
ElseIf Err.Number = mnErrDeviceUnavailable Then
Msg = "This drive or path does not exist: " & filename
MsgBox Msg, vbExclamation
Resume Next
Else
Msg = "Unexpected error #" & Str(Err.Number) & " occurred: " _
& Error.Description
' Afi area mesajului
MsgBox Msg, vbCritical
Stop
End If
Resume
End Function

În acest cod, proprietatea Number a obiectului Err con ine num rul asociat cu eroarea aparut ; proprietatea Description
con ine o scurt descriere a erorii. Instruc iunea Resume returneaz controlul la instruc iunea care a produs eroarea iar
Resume Next returneaz controlul la instruc iunea urm toare celei care a produs eroarea.

Proiectarea unei rutine de tratare a erorilor

O secven de tratare a erorilor, error handler, este o rutin care capteaz i r spunde la erori în aplica ie. Asemenea
secven e se pot ad uga la orice procedur unde se anticipeaz posibilitatea unei erori (se poate presupune c orice
instruc iune Visual Basic poate produce o eroare, cu excep ia cazurilor când se tie explicit c acest fapt nu poate avea
loc). Procesul de proiectare a unui error handler necesit trei pa i:

1. Stabilirea, sau permiterea, unei capt ri de erori prin specificarea locului din program unde se va efectua transferul
controlului atunci când apare o eroare.

Instruc iunea On Error permite captarea erorii i transferul controlului execu iei la eticheta specificat .

2. Scrierea unei rutine de tratare a erorilor, care s r spund tuturor erorilor anticipate. Dac execu ia i-a transferat
controlul în aceast secven , se zice c secven a este activ (capcana de prindere a erorii este activ ).

3. Ie irea (p r sirea) secven ei error-handling.

Detalii sunt oferite în sec iunile care urmeaz .

Stabilirea capcanei de erori

O capcan de erori este activat atunci când se execut o instruc iune On Error, care specific o secven de tratare a
erorilor. Capcana r mâne deschis atât timp cât procedura care o con ine este activ , adic pân când este executat o
instruc iune Exit Sub, Exit Function, Exit Property, End Sub, End Function sau End Property din procedura care
include secven a de tratare a erorilor. De i numai o capcan de erori poate fi permis la un moment dat în orice

256
procedur , se pot crea mai multe capcane alternative care s fie activate la diferite momente. O capcan de erori poate fi
inhibat prin utilizarea instruc iunii On Error GoTo 0.

Pentru activarea unei capcane de erori se utilizeaz instruc iunea On Error GoTo line, unde line este eticheta care
identific secven a de instruc iuni, din procedur , care trateaz erorile.

Scrierea unei rutine de tratare a erorilor

Primul pas în scrierea unei rutine error-handling este ad ugarea unei etichete de linii pentru marcarea începutului
secven ei de tratare a erorilor. O conven ie comun este aceea de a plasa codul error-handler la sfâr itul procedurii i a-l
preceda de o instruc iune Exit Sub, Exit Function sau Exit Property. Aceasta permite procedurii s nu execute codul de
tratare a erorilor atunci când nu apar erori.

Corpul rutinei de tratare a erorilor con ine cod de identificare a erorii ap rute, prin structuri Select Case sau
If...Then...Else. Este obligatoriu ca o alternativ s se refere la erorile neanticipate i care nu sunt tratate individual.

Proprietatea Number a obiectului Err con ine un cod numeric reprezentând cea mai recent eroare. Utilizarea obiectului
Err în combina ie cu structurile Select Case sau If...Then...Else, se pot lua ac iuni specifice fiec rei erori.

Ie irea din rutina de tratare a erorilor

Urm torul tabel cuprinde instruc iunile prin care se poate ie i dintr-o secven error-handling. Acest fapt înseamn , în
general, cedarea controlului execu iei c tre alt instruc iune din procedura activ .

Instruc iunea Descriere

Resume [0] Execu ia programului se reia cu instruc iunea care a cauzat eroarea sau cel mai recent apel
al procedurii con inând rutina error-handling. Este utilizat pentru a repeta o opera iune dup
ce s-a corectat situa ia care a produs eroarea.

Resume Next Reia execu ia programului cu instruc iunea imediat urm toare celei care a cauzat eroarea.
Dac eroarea a ap rut în afara procedurii care con ine codul de eroare, execu ia se reia cu
instruc iunea imediat urm toare apelului la procedura unde a ap rut eroarea, dac procedura
apelat nu are activat o secven de eroare.

Resume line Reia execu ia programului cu instruc iunea având eticheta specificat în line, unde line este o
etichet de linie (sau un num r de linie diferit de zero) care se g se te în aceea i procedur
ca i error-handler-ul.

Err:Raise Declan eaz eroarea de execu ie având num rul specificat. Atunci când o asemenea
Number:=number instruc iune este executat în interiorul rutinei de eroare, Visual Basic caut lista de apeluri
pentru alt rutin de tratare a erorilor. (Lista de apeluri este lan ul de proceduri apelate pentru
a ajunge în punctul curent de execu ie. Informa ii suplimentare se g sesc în sec iunea
"Ierarhia trat rii erorilor.)

Diferen a dintre Resume i Resume Next

Diferen a este c Resume continu execu ia cu instruc iunea care a generat eroarea (instruc iunea este reexecutat ), în
timp ce Resume Next continu cu instruc iunea care urmeaz celei care a generat eroarea. În general, se utilizeaz
Resume atunci când eroarea poate fi corectat . Se poate scrie cod care s nu arate utilizatorului c a avut loc o eroare,
sau cod care s permit utilizatorului s corecteze eroarea.

257
Exemplul urm tor încearc efectuarea unei împ r iri "sigure", f r a afi a erorile care pot s apar : "Division by zero"
(numitor egal cu zero, num r tor nenul), "Overflow" ( i numitorul i num r torul sunt egali cu zero) sau "Illegal procedure
call" (un operand este o valoare nenumeric , sau nu poate fi considerat numeric). In toate cele trei cazuri procedura
urm toare returneaz Null.

Function Divide (numer, denom) As Variant


Const mnErrDivByZero = 11, mnErrOverFlow = 6, mnErrBadCall = 5
On Error GoTo MathHandler
Divide = numer / denom
Exit Function
MathHandler:
If Err.Number = mnErrDivByZero Or Err.Number = mnErrOverFlow _
Or Err.Number = mnErrBadCall Then
Divide = Null
Else
MsgBox "Unanticipated error " & Err.Number & ": " & _
Err.Description, vbExclamation
End If
Resume Next
End Function

Reluarea execu iei la o linie specificat

Prin Resume line se d controlul execu iei la linia specificat . Urm torul exemplu ilustreaz utilizarea acestei instruc iuni
într-o variant a procedurii FileExists prezentat într-un exemplu anterior.

Function VerifyFile As String


Const mnErrBadFileName = 52, mnErrDriveDoorOpen = 71
Const mnErrDeviceUnavailable = 68, mnErrInvalidFileName = 64
Dim strPrompt As String, strMsg As String, strFileSpec As String
strPrompt = "Enter file specification to check:"
StartHere:
strFileSpec = "*.*"
strMsg = strMsg & vbCRLF & strPrompt
' Let the user modify the default
strFileSpec = inputBox(strMsg, "File Search", strFileSpec, 100, _
100)
' Exit if user deletes default
If strFileSpec = "" Then Exit Function
On Error GoTo Handler
VerifyFile = Dir(FileSpec)
Exit Function
Handler:
Select Case Err.Number
Case ErrInvalidFileName, ErrBadFileName
strMsg = "Your file specification was invalid; _
try another."
Case mnErrDriveDoorOpen
strMsg = "Close the disk drive door and try again."
Case mnErrDeviceUnavailable
strMsg = "The drive you specified was not found. _
Try again."
Case Else
Dim intErrNum As Integer
intErrNum = Err.Number
258
Err.Clear
Err.Raise Number:=intErrNum ' Regenerate the error
End Select
Resume StartHere ' The user can try another file name
End Function

Dac este g sit un fi ier care se potrive te specifica iei, func ia returneaz numele fi ierului. Dac nu se potrive te nici un
fi ier, func ia returneaz un ir de lungime zero. În cazul apari iei unei dintre erorile anticipate, se afi eaz mesajul
corespunz tor (prin intermediul variabilei strMsg) i utilizatorul poate încerca un nou nume prin reluarea de la eticheta
StartHere.

Dac apare o eroare diferit de cele anticipate ( i posibile în opera iunea efectuat ), pe ramura de program Case Else se
regenereaz eroarea încât urm toarea capcan de erori din lista de apeluri poate s intre în ac iune. Acest fapt este
necesar din cauz c dac eroarea nu ar fi regenerat , codul ar continua s se execute la linia Resume StartHere. Prin
regenerare, eroarea apare din nou i noua eroare va fi captat la urm torul nivel din stiva de apeluri.

Ierarhia de tratare a erorilor

Un error-handler permis este unul care a fost activat prin executarea unei instruc iuni On Error i nu a fost interzis (prin
On Error GoTo 0 sau prin p r sirea procedurii care îl con ine). Un error-handler activ este cel care se execut curent.
Pentru a fi activ, o secven error-handling trebuie s fie mai întâi permis , dar nu toate secven ele permise sunt i active.
De exemplu, dup o instruc iune Resume, un handler este dezactivat dar r mâne permis.

La apari ia unei erori într-o procedur , care nu are o secven error-handling permis , sau într-o rutin error-handling
activ , Visual Basic caut lista de apeluri pentru a g si o alt rutin permis de tratare a erorilor. Lista de apeluri este
secven a de apeluri care conduce la procedura curent ; ea este afi at în dialogul Call Stack, disponibil în modul break
prin meniul View, comanda Call Stack.

C utarea în lista de apeluri

Presupunem urm toarea succesiune de apeluri:

1. O procedur eveniment apeleaz procedura A.

2. Procedura A cheam procedura B.

3. Procedura B apeleaz procedura C.

În timp ce se execut C, celelalte proceduri sunt suspendate. Dac apare o eroare în procedura C iar procedura nu are
un error- handler, Visual Basic caut înapoi în lista de apeluri - mai întâi B, apoi A, apoi procedura de eveniment, dar atât
- i execut prima secven întâlnit de tratare a erorii. Dac nu exist nici o asemenea secven , atunci se afi eaz un
mesaj implicit de eroare i se opre te execu ia aplica iei.

Dac Visual Basic g se te o secven error-handling, execu ia continu în acea rutin , ca i cum eroarea ar fi ap rut în
procedura care con ine rutina error handling respectiv . Dac o instruc iune Resume sau Resume Next este executat
în rutina error handling, execu ia continu dup cum este ar tat în tabelul urm tor.

Instruc iunea Rezultatul

Resume Apelul la procedura pe care Visual Basic tocmai a cercetat-o în lista de apeluri este reexecutat.
În apelurile considerate mai sus, dac procedura A are un error handler permis care include o
instruc iune Resume, Visual Basic reexecut apelul la procedura B.

259
Resume Next Execu ia se întoarce la instruc iunea care urmeaz ultimei instruc iuni executate în acea
procedur . Aceasta este instruc iunea care urmeaz apelului la procedura pe care Visual Basic
tocmai a cercetat-o în lista de apeluri.
În lista de apeluri exemplificat , dac procedura A are un error handler permis care include o
instruc iune Resume Next, execu ia se întoarce la instruc iunea de dup apelul la procedura B.

De notat c instruc iunea executat este în procedura unde s-a g sit rutina de tratare a erorilor i nu în mod necesar în
procedura unde a ap rut eroarea. Dac nu se ine seama de acest aspect esen ial al trat rii erorilor, execu ia poate
p rea de neexplicat în momentul apari iei unei erori. Pentru o verificare mai simpl a codului, se poate trece în modul
break în momentul apari iei unei erori, dup cum este explicat ulterior în acest capitol ("Oprirea trat rii erorilor").

Dac erorile tratate în secven a error-handler nu includ eroarea ap rut , se poate produce o eroare neanticipat în
procedura care are un error handler permis: procedura poate s bucleze la infinit, în special când error handlerul execut
o instruc iune Resume. Pentru a preveni o asemenea situa ie, se va utiliza metoda Raise a obiectului Err într-o secven
Case Else (sau similar ) din handler. Aceasta genereaz o eroare din secven a de tratare activ , for ând Visual Basic s
caute în lista de apeluri un handler care s se ocupe de eroarea ap rut .

Efectul unei c ut ri regresive în lista de apeluri este greu de prev zut, deoarece depinde de instruc iunea Resume sau
Resume Next executat . Trebuie gândit c execu ia nu se reia, în mod necesar, în procedura unde a ap rut eroarea, ci
în procedura unde este un error-handler activ.

Indica ii pentru o tratare complex a erorilor

La scrierea unei aplica ii Visual Basic mari, care utilizeaz diverse module, codul de tratare a erorilor poate fi foarte
complex. Se vor urm ri urm toarele linii generale:

o În timpul verific rii/depan rii codului, se va utiliza metoda Raise a obiectului Err pentru a regenera
eroarea în toate secven ele de eroare pentru cazurile neanticipate. Pe lâng o c utare ierarhic pentru
un handler care s trateze eroarea, Visual Basic va afi a un mesaj de eroare pentru acele erori care nu
sunt tratate în cod. Se pot identifica astfel erori posibile i care pot fi considerate la o nou dezvoltare a
aplica iei.
o Se va utiliza metoda Clear dac trebuie s se ini ializeze în mod explicit obiectul Err dup tratarea unei
erori. Acest fapt este necesar atunci când se utilizeaz tratarea pe loc a erorilor cu On Error Resume
Next. Visual Basic apeleaz automat metoda Clear de fiecare dat când execut orice tip de instruc iune
Resume, Exit Sub, Exit Function, Exit Property sau orice instruc iune On Error.
o Dac nu se dore te ca alt procedur din lista de apeluri s capteze eroarea, se va utiliza instruc iunea
Stop pentru a for a terminarea codului. Instruc iunea Stop permite examinarea contextului erorii în
mediul de dezvoltare.
o Se va scrie o procedur error handler de siguran (fail-safe) sigur care s fie apelat de toate
secven ele de tratare a erorilor ca ultim ac iune pentru erorile care nu sunt gestionate. Aceast
procedur poate efectua o terminare controlat a aplica iei prin desc rcarea formelor i salvarea datelor.

Testarea trat rii erorilor prin generarea de erori

Simularea erorilor este util în timpul verific rii aplica iei sau când se doreste tratarea unei condi ii particulare ca i cum ar
fi echivalent unei erori de execu ie. De exemplu, se scrie un modul care utilizeaz un obiect definit într-o aplica ie
extern i se dore te ca erorile returnate de acel obiect s fie tratate de restul aplica iei precum erorile Visual Basic.

Pentru a testa toate erorile posibile se vor genera erorile prin cod. Aceast opera iune implic metoda Raise a obiectului
Err. Metoda are sintaxa

object.Raise number, source, description, helpfile, helpcontext

260
unde

object este obiectul Err.

number este un întreg Long identificând natura erorii. Erorile Visual Basic (atât Visual Basic cât i definite de utilizator)
sunt în domeniul 0-65535. La stabilirea propriet ii Number pentru coduri proprii de eroare în module clas se va ad uga
num rul de cod propriu la constanta vbObjectError. De exemplu, generarea erorii cu num rul 1050 implic atribuirea
valorii vbObjectError + 1050 la proprietatea Number.

source este op ional, ir denumind obiectul sau aplica ia care genereaz eroarea. La stabilirea acestei propriet i pentru
un obiect se va utiliza project.class. Dac nu se precizeaz sursa se utilizeaz ID-ul proiectului Visual Basic curent.

description este optional, ir care descrie eroarea. În cazul când nu se specific acest argument se atribuie irul implicit
pentru o eroare Visual Basic (cum este returnat de func ia Error) sau "Application-defined or object-defined error" în cazul
unei cod propriu de eroare.

helpfile este optional, calea complet c tre un fi ier Microsoft Windows Help în care se poate g si ajutor pentru eroarea
generat . Implicit se va utiliza informa ia asociat cu fi ierul Visual Basic Help.

helpcontext este optional, ID de context pentru intrarea din fi ierul de ajutor. În mod implicit se consider informa ia unei
erori Visual Basic, dac exist .

În cazul utiliz rii metodei Raise f r specificarea anumitor argumente iar valorile propriet ilor obiectului Err con in valori
care nu au fost cur ate, aceste valori sunt luate în considerare.

Este de men ionat c instruc iunea Error poate fi utilizat de asemenea pentru generarea de erori, dar obiectul Err
dispune de o informa ie mai bogat . Acest fapt este util în special la crearea modulelor clas .

Se poate simula orice eroare Visual Basic prin considerarea num rului de cod al erorii respective.

Definirea erorilor proprii

În afara erorilor definite de Visual Basic, utilizatorul poate s defineasc erori proprii, care s permit identificarea unor
condi ii proprii aplica iei proiectate, captarea acestor erori efectuându-se mai departe dup procedura general . Procesul
de definire se realizeaz prin ad ugarea de noi numere de eroare la constanta vbObjectError.

Constanta vbObjectError rezerv numere de la offsetul propriu la suma offsetului cu 512. Utilizând un num r mai mare
decât acesta asigur c numerele proprii de eroare nu intr în conflict cu viitoarele versiuni de Visual Basic.

Pentru a defini numere de eroare proprii se adaug constante la sec iunea de declara ii a modulului:

' Error constants


Const gLostCarrier = 1 + vbObjectError + 512
Const gNoDialTone = 2 + vbObjectError + 512

Se poate utiliza ulterior metoda Raise pentru noile numere de eroare, cu utilizarea eventual a descrierilor proprii de
eroare.

Tratarea inline a erorilor

Atunci când se testeaz apari ia erorilor imediat dup fiecare linie de cod care poate produce erori, se zice c tratarea
erorilor este inline. Utilizând acest mod de tratare a erorilor, se pot scrie func ii i instruc iuni care returneaz numerele de
261
eroare ap rute; se poate genera o eroare Visual Basic într-o procedur i gestiona eroarea în procedura apelant ; se
poate scrie o func ie care s returneze o dat de tip Variant i utiliza acest rezultat în procedura apelant .

Returnarea numerelor de eroare

Cea mai simpl metod de acest gen este crearea unor func ii i instruc iuni care returneaz , atunci când apar erori,
numere de eroare (sau constante cu aceast semnifica ie) în loc de valorile uzuale. De exemplu

Function FileExists (p As String) As Long


If Dir (p) <> "" Then
FileExists = conSuccess
Else
FileExists = conFailure
End If
End Function

care poate fi utilizat prin

Dim ResultValue As long


ResultValue = FileExists ("C:\Testfile.txt")
If ResultValue = conFailure Then
... ' se trateaaz eroarea
Else
... ' se proceseaz fi ierul
End If

Lucrul esen ial în tratarea inline a erorilor este testarea apari iei unei erori imediat dup instruc iunea sau apelul de func ie
care poate s produc eroarea. În acest mod se poate proiecta un handler care anticipeaz exact tipul de erori care pot
s apar . Aceast abordare nu necesit ca o eroare de execu ie s apar efectiv.

Tratarea erorilor în procedura apelant

Alt metod pentru a indica apari ia unei erori este s se genereze o eroare Visual Basic în procedur activ i s se
trateze eroarea într-un handler inline din procedura apelant .

Exemplul urm tor arat o variant a procedurii FileExists în care se genereaz un num r de eroare în cazul e ecului.
Înaintea apelului func iei, instruc iunea On Error Resume Next stabile te propriet ile obiectului Err dar nu precizeaz o
rutin error-handling.

Instruc iunea On Error Resume Next este urmat de codul de tratare a erorii. Acesta testeaz propriet ile obiectului Err
pentru a vedea dac a ap rut o eroare. Dac Err.Number nu con ine zero, atunci a ap rut o eroare.

Function FileExists (p As String)


If Dir (p) <> "" Then
Err.Raise conSuccess
Else
Err.Raise conFailure
End If
End Function

Dim ResultValue As Long


On Error Resume Next
ResultValue = FileExists ("C:\Testfile.txt")

262
If Err.Number = conFailure Then
... ' se trateaz eroarea
Else
... ' se continu programul
End If

Urm torul exemplu, mai complex, utilizeaz atât valoarea returnat , cât i un argument pentru a detecta apari ia unei
erori.

Function Power (X As Long, P As Integer, ByRef Rezult As Long) _


As Long
On Error GoTo ErrorHandler
Result = X^P
Exit Function
ErrorHandler:
Power = conFailure
End Function

' Apelul func iei Power


Dim lngReturnValue As Long, lngErrorMayBe As Long
lngErrorMayBe = Power (10, 2, lngReturnValue)
If lngErrorMayBe = conFailure Then
... ' tratarea erorii
Else
... ' continuarea programului
End If

Utilizarea datelor de tip Variant

Alt cale pentru a returna informa ii despre erorile eventuale este utilizarea datelor de tip Variant i func iile asociate,
potrivit exemplului urm tor. O variabil de tip Variant are un indicator privind tipul de dat con inut i acest tag poate fi
fixat ca un cod de eroare Visual Basic.

Function Power (X As Long, P As Integer) As Variant


On Error GoTo ErrorHandler
Result = X^P
Exit Function
ErrorHandler:
Power = CVErr(Err.Number) ' converte te codul de eroare în tagged Variant
End Function

' Apelul func iei Power


Dim varReturnValue As Variant
varReturnValue = Power (10, 2)
If IsError (varReturnValue) Then
... ' tratarea erorii
Else
... ' continuarea programului
End If

Tratarea centralizat a erorilor

Atunci când se adaug cod de tratare a erorilor la o aplica ie, tratarea inline produce trat ri repetate ale acelora i erori.
Codul poate fi redus prin scrierea unor proceduri apelate repetat de secven ele error handling.
263
Func ia FileErrors din exemplul urm tor afi eaz un mesaj adecvat erorii produse i, când este posibil, permite
acoperirea erorii. Este returnat procedurii apelante un cod cu ac iunea de urmat. Este de notat c , undeva în program, se
vor defini constantele utilizate.

Function FileErrors () As Integer


Dim intMsgType As Integer, strMsg As String
Dim intResponse As Integer
' Valoarea returnat În eles
' 0 Resume
' 1 Resume Next
' 2 Eroare netratabil
' 3 Eroare necunoscut
intMsgType = vbExclamation
Select Case Err.Number
Case mnErrDeviceUnavailable ' error 68
strMsg = " That device appears unavailable."
intMsgType = vbExclamation + 4
Case mnErrDiskNotReady 'error 71
strMsg = "Insert a disk in the drive and close the door."
Case mnErrDeviceIO 'error 57
strMsg = " Internal disk error."
intMsgType = vbExclamation + 4
Case mnErrDiskFull ' error 61
strMsg = " Disk is full. Continue?"
intMsgType = vbExclamation + 3
Case mnErrBadFileName, mnErrBadFileNameOrNumber ' error 64, 52
strMsg = " That filename is illegal."
Case mnErrPathDoesNotExist ' error 76
strMsg = " That path doesn't exist."
Case mnErrBadFileMode ' error 54
strMsg = " Can't open your file for that type of access."
Case mnErrFileAlreadyOpen ' error 55
strMsg = " This file is already open."
Case mnErrInputPastEndOfFile ' error 62
strMsg = " This file has a nonstandard end-of-file marker,"
strMsg = strMsg & "or an attempt was made to read beyond"
strMsg = strMsg & "the end-of-file marker."
Case Else
FileErrors = 3
Exit Function
End Select
intResponse = MsgBox (strMsg, intMsgType, "Disk Error")
Select Case intResponse
Case 1, 4 ' butoanele OK, Retry
FileErrors = 0
Case 5 ' butonul Ignore
FileErrors = 1
Case 2, 3 ' butoanele Cancel, End
FileErrors = 2
Case Else
FileErrors = 3
End Select
End Function

264
Aceast procedur trateaz erorile comune legate de fi iere i unitatea de dischet . Pentru celelalte erori se returneaz
valoarea 3. Procedura apelant va trebui apoi s trateze aceast eroare, s o genereze înc o dat prin metoda Raise
sau s cheme alt procedur care s trateze eroarea neanticipat .

Inhibarea trat rii erorilor

Dac o capcan de erori a fost permis într-o procedur , aceasta este scoas automat la p r sirea procedurii. Sunt
situa ii când este necesar anularea capcanei înainte de p r sirea procedurii gazd . Acest fapt este realizat de
instruc iunea On Error GoTo 0. Dup executarea acestei instruc iuni, Visual Basic detecteaz erorile dar nu sunt captate
în procedur . Instruc iunea poate fi utilizat oriunde, inclusiv în interiorul unei rutine error handler.

Depanarea programelor care au rutine de tratare a erorilor

Atunci când se depaneaz programe, analiza comport rii poate fi complicat în cazul capt rii erorilor de c tre rutinele
error handler. Posibilitatea de a transforma în comentarii liniile On Error din fiecare modul simplific analiza dar este
stânjenitoare.

Este de preferat modalitatea prin care tratarea erorilor este inhibat i, de fiecare dat când apare o eroare, se intr în
modul break. Pentru aceasta, se va selecta op iunea Break on All Errors din fi a General a dialogului Options (meniul
Tools). Selectarea acestei op iuni are ca efect, la apari ia unei erori, intrarea în modul break i afi area ferestrei Watch
cu codul care a produs eroarea.

Tratarea erorilor din obiectele referite

În procedurile care fac referin la unul sau mai multe obiecte este mult mai dificil s se determine unde apare o eroare,
mai ales dac eroarea apare într-un obiect al altei aplica ii. De exemplu, s consider m o aplica ie care const dintr-un
modul form (MyForm), care face referin la un modul clas (MyClassA), care face referin la un obiect Microsoft Excel
Worksheet.

Dac obiectul Worksheet nu rezolv o eroare particular ap rut în foaia de calcul ci o regenereaz , Visual Basic va
trece eroarea c tre obiectul care se refer la obiectul Worksheet., adic MyClassA. Visual Basic remapeaz în mod
automat erorile netratate ap rute în obiecte din afara Visual Basic c tre codul de eroare 440.

Obiectul MyClassA poate fie s trateze eroarea (ceea ce este preferabil), fie s o regenereze. Interfa a specific faptul c
orice obiect care regenereaz o eroare ap rut într-un obiect referit nu poate s propage pur i simplu eroarea (s
transmit codul de eroare 440), ci trebuie s o remapeze la un num r de eroare cu semnifica ie definit . Acest num r
poate fi un num r Visual Basic (dac se poate efectua o asemenea echivalare), sau un num r propriu, ad ugat dup
procedura explicat anterior.

De câte ori este posibil, un modul clas va trebui s trateze orice eroare care apare în interiorul modulului i orice eroare
care apr în obiecte referite i nerezolvate de obiectele însele. Exist totu i erori care nu pot fi tratate din cauz c nu pot fi
anticipate. Exist i cazuri când este mai potrivit o tratare a erorii de c tre obiectul care face referin a decât de obiectul
referit.

Atunci când apare o eroare în modulul unei forme, Visual Basic genereaz unul dintre numerele de eroare predefinite.

Observa ie. Dac se creeaz o clas public , trebuie ca fiecare secven care trateaz o eroare non-Visual Basic s fie
bine documentat . Al i programatori care se refer la aceast clas trebuie s cunoasc cum s trateze erorile transmise
de obiectul respectiv.

La regenerarea unei erori, celelalte propriet i ale obiectului Err se vor l sa neschimbate. Dac eroarea transmis nu
este tratat , propriet ile Source i Description pot fi afi ate pentru a ajuta utilizatorul s ia m suri corective.

265
Tratarea erorilor transmise din obiecte referite

Un modul clas ar putea s includ urm toarea secven pentru tratarea erorilor pe care le poate aborda i regenerarea
celor care nu pot fi rezolvate. Secven a este explicat dup prezentarea codului.

MyServerHandler:
Select Case ErrNum
Case 7 ' eroarea out-of-memory
...
Case 440 ' erori din obiecte externe
Err.Raise Number:=vbObjectError + 9999
' eroare din alt obiect Visual Basic
Case Is > vbObjectError And Is < vbObjectError + 65536
ObjectError = ErrNum
Select Case ObjectError
' acest obiect trateaz erorile pe baza
' documenta iei obiectului de unde provine eroarea
Case vbObjectError + 10
...
Case Else
' remaparea erorii ca o eroare obiect generic i regenerarea ei
Err.Raise Number:=vbObjectError + 9999
End Select
Case Else
' remaparea erorii ca o eroare obiect generic i regenerarea ei
Err.Raise Number:=vbObjectError + 9999
End Select
Err.Clear
Resume Next

Instruc iunea Case 440 capteaz erorile care apar într-un obiect referit extern aplica iei Visual Basic. În acest exemplu,
eroarea este propagat utilizând valoarea 9999, deoarece este dificil pentru acest tip de handler central s determine
cauza erorii. Apari ia unei astfel de erori este, de obicei, rezultatul unei erori fatale de automatizare (o eroare care
produce oprirea execu iei componentei) sau din cauza unui obiect care nu a tratat corect o eroare captat . Eroarea 440
nu ar trebui propagat decât în cazul unei erori fatale. Dac aceast secven ar fi scris pentru un handler inline (vezi
sec iunea "Tratarea inline a erorilor"), ar fi posibil s se determine cauza erorii i s se corecteze.

Instruc iunea Case Is > vbObjectError And Is < vbObjectError + 65536 capteaz erorile care au originea într-un obiect din
aplica ia Visual Basic, sau din obiectul care con ine handlerul. Numai asemenea obiecte pot produce erori în domeniul
specificat.

Documenta ia pentru codul de eroare oferit pentru obiect trebuie s defineasc codurile posibile, semnifica ia lor, astfel
încât aceast por iune a handlerului s poat fi scris adecvat erorilor anticipate. Codurile de eroare efective pot fi
documentate f r offsetul vbObjectError sau pot fi documentate dup ce s-a ad ugat deplasarea, în care caz
instruc iunea Case Else trebuie s scad deplasarea vbObjectError. Pe de alt parte, erorile obiectelor pot fi constante,
ar tate în biblioteca de tipuri a obiectului i vizibile în Object Browser. În acest caz se utilizeaz constanta de eroare în
Case Else i nu codul de eroare.

Orice eroare care nu este tratat trebuie s fie regenerat cu un nou num r, dup cum este în instruc iunea Case Else.
În aplica ia proprie se poate proiecta un handler care s anticipeze acest nou num r definit. Dac aplica ia este o clas
public , trebuie s fie inclus în documenta ie o explica ie a acestei noi erori.

Ultima instruc iune Case Else capteaz i regenereaz orice alt eroare care nu a fost tratat anterior. Deoarece aceast
parte a capcanei va prinde erori care au sau nu ad ugat deplasarea vbObjectError, remaparea se va efectua simplu

266
c tre un cod generic "unresolved error". Acest cod se va ad uga la vbObjectError indicând oric rui handler c aceast
eroare provine dintr-un obiect referit.

Depanarea trat rii erorilor din obiecte referite

Deoarece depanarea aplica iilor care se refer la obiecte create în Visual Basic sau la clase definit în module clas este
dificil , se recomand selectarea op iunii Break in Class Module din fi a General a dialogului Options (meniul Tools).
Cu aceast op iune selectat , orice eroare dintr-un modul clas duce la intrarea clasei în modul break a debuggerului,
permi ând analiza erorii.

Depanarea programelor

Tehnicile de depanare prezentate în acest capitol utilizeaz uneltele de analiz oferite de Visual Basic. Mediul de
dezvoltare Visual Basic nu poate s identifice sau s fixeze erorile, dar ofer unelte pentru a analiza fluxul execu iei i
cum se schimb valorile variabilelor i propriet ilor. Se poate considera c uneltele de depanare ajut la examinarea
aplica iei pentru a în elege ce se întâmpl i de ce.

Uneltele de depanare oferite de Visual Basic includ puncte de oprire (breakpoints), expresii de oprire (break expressions),
expresii de urm rire (watch expressions), executarea codului pas cu pas (instruc iune cu instruc iune sau procedur cu
procedur ) i afi area valorilor variabilelor i propriet ilor. Sunt oferite de asemenea posibilit i speciale cum ar fi
editarea codului i continuarea execu iei (edit-and-continue), stabilirea urm toarei instruc iuni care s se execute dup o
eroare i testarea cu aplica ia în modul break.

Tipuri de erori

Exist trei tipuri de erori care se pot intâlni într-un program.


Erori de compilare. Acestea rezult din scrierea incorect a codului. Aceste erori sunt detectate de Visual Basic la
compilarea codului.
Erori de execu ie. Acestea apar în timpul execu iei aplica iei ( i sunt detectate de Visual Basic) atunci când o instruc iune
încearc s efectueze o opera iune imposibil (de genul împ r irii prin zero).
Erori de logic . Acestea apar atunci când aplica ia nu se execut în modul gândit la proiectare. O aplica ie poate s fie
corct sintactic, s se execute f r a efectua opera iuni imposibile i totu i s produc rezultate incorecte. Doar
testarea aplica iei i analiza rezultatelor poate spune c aplica ia func ioneaz corect.

Unelte de depanare

Nu exist artificii magice pentru depanare i nu exist o secven fix de opera iuni care s lucreze întotdeauna. În
esen , ajutorul oferit în depanare este pentru o mai bun în elegere a mersului aplica iei. Se poate astfel fotografia
starea aplica iei la un moment dat, instantaneul ob inut cuprinzând valori ale variabilelor, expresiilor i propriet ilor,
precum i numele apelurilor active de proceduri.

Bara de unelte Debug Imaginea al turat arat bara de unelte Debug din mediul Visual Basic Editor.

267
În tabelul urm tor se explic pe scurt func ionalitatea uneltelor principale din aceast bar .

Unealta de depanare Scop

Run/Continue Comut din modul design în modul run (Run) sau din modul break în modul run (Continue).

Break Comut din run time în modul break.

Reset Comut din run time sau modul break în modul design.

Toggle Breakpoint Define te o linie într-un modul, unde Visual Basic suspend execu ia aplica iei.

Step Into Execut urm toarea linie executabil din aplica ie i intr în proceduri.

Step Over Execut urm toarea linie executabil din aplica ie dar nu intr în proceduri.

Step Out Execut restul de cod din procedura curent i se opreste la linia urm toare din procedura
apelant .

Locals Window Afi eaz valoarea curent a variabilelor locale.

Immediate Window Permite executarea de cod sau interogarea unei valori în timp ce aplica ia este în break mode.

Watch Window Afi eaz valorile unor expresii selectate.

Quick Watch Listeaz valoarea curent a unei expresii în timp ce aplica ia este în modul break.

Call Stack În timp ce aplica ia este în modul break, afi eaz o cutie de diaolg care arat toate procedurile
care au fost apelate dar înc nu s-au executat complet.

Sec iunile urm toare aduc explica ii suplimentare asupra modului de utilizare efectiv a acestor unelte.

Evitarea "bug"-urilor

Respectarea urm toarelor reguli poate conduce la evitarea introducerii unor bug-uri în aplica ie.

o Aplica ia se proiecteaz cu aten ie prin notarea evenimentelor importante i a modului în care codul va
r spunde la fiecare eveniment. Fiecare procedur general , ca i fiecare procedur eveniment trebuie s
aib un scop specific, bine definit.
o Se vor include cât mai multe comentarii. La întoarcerea în cod i analiza comport rii aplica iei,
comentariile privind scopul fiec rei rutine sunt de un real ajutor.
o Se vor utiliza, pe cât posibil, referin e explicite. Variabilele obiect se declar dup cum sunt listate
obiectele în cutia Classes din Object Browser i nu prin tipuri Variant sau Object.
o Se va dezvolta sau adapta o schem consistent de construc ie a denumirilor pentru variabilele i
obiectele din aplica ie.
o Se va utiliza declara ia Option Explicit pentru a ocoli erorile de tastare a identificatorilor i confundarea
unui control cu altul.

Design Time, Run Time i Break Mode

Se utilizeaz Visual Basic în design time pentru a crea o aplica ie i în run time pentru a o executa. În break mode
execu ia programului este suspendat astfel încât se pot examina i modifica date. Bara de titlu Visual Basic arat
întotdeauna modul utilizat curent.

268
Caracteristicile celor trei moduri i tehnicile pentru comutarea între ele sunt listate în urm torul tabel.

Mod Descriere

Design time Lucrul la crearea unei aplica ii se execut în acest mod. Se pot proiecta formulare, trasa controale, scrie
cod etc. Nu se poate executa cod sau utiliza unelte de depanare, cu excep ia stabilirii de puncte de oprire
i cre rii de expresii de urm rire.
Pentru a trece la run time click pe butonul Run. Pentru trecerea în break mode click pe Step Into din
meniul meniul Run i aplica ia intr în modul break la prima instruc iune executabil .

Run time În timpul execu iei, când aplica ia are controlul, se interac ioneaz cu aplica ia ca orice alt utilizator. Se
poate vedea codul dar nu se poate schimba.
Pentru a trece în design time se ac ioneaz butonul Reset iar pentru a trece în break mode click pe
butonul Break.

Break mode Execu ia este suspendat în timpul rul rii aplica iei. Se poate vedea i edita codul, examina sau modifica
date, reporni aplica ia, sfâr i execu ia sau continua din punctul de oprire.
Pentru comutarea în run time, click pe butonul Continue (acela i cu Run). Trecerea în design time se
ob ine prin butonul Reset.
Se poat fixa puncte de oprire i expresii de urm rit în design time, dar celelalte unelte de depanare
lucreaz doar în modul break.

Utilizarea ferestrelor de depanare

Cu ajutorul ferestrelor de depanare se pot monitoriza valorile expresiilor i variabilelor în timp ce se parcurg instruc iunile
aplica iei. Exist trei ferestre de depanare: Immediate, Watch i Locals. Pentru afi area oric reia dintre aceste ferestre
se activeaz comanda corespunz toare din meniul View sau butonul corespunz tor de pe bara Debug.

Fereastra Immediate arat informa ia care rezult din instruc iunile de depanare din cod sau care este cerut prin
instruc iuni scrise direct în fereastr .

Fereastra Watch arat valorile curente ale expresiilor urm rite (watch expressions), acelea pentru care s-a hot rât
monitorizarea. O expresie de oprire (break expression) este o expresie santinel care produce intrarea Visual Basic în
modul break atunci când o anumit condi ie definit devine adev rat . În fereastra Watch, coloana Context indic
procedura, modulul, sau modulele în care fiecare expresie santinel este evaluat . Fereastra Watch poate afi a o
valoare pentru o expresie urm rit numai dac instruc iunea curent este în contextul specificat; în caz contrar, coloana
Value afi eaz un mesaj indicând c instruc iunea nu este în context.

Fereastra Locals arat valorile oric rei variabile din domeniul procedurii curente. Dup cum execu ia trece din procedur
în procedur , con inutul ferestrei Locals se modific pentru a reflecta doar variabilele aplicabile procedurii curente. O
variabil care reprezint un obiect apare în fereastra Locals cu un semn plus (+) în stânga numelui s u. Se poate
efectua click pe semn pentru a expanda variabila, afi a propriet ile obiectului i valorile curente. Dac o proprietate a
obiectului con ine un alt obiect, acesta poate fi expandat de asemenea. Aceea i examinare se poate aplica pentru
variabilele care con in tablouri sau tipuri definite de utilizator.

Utilizarea modului break

În design time se poate schimba aspectul sau codul aplica iei, dar nu se pot vedea efectele schimb rilor. În run time se
poate urm ri cum se comport aplica ia, dar nu se poate interveni direct în cod.

Modul Break opre te execu ia aplica iei i ofer un instantaneu al condi iilor în orice moment. Variabilele i valorile
propriet ilor sunt p strate, astfel încât se poate analiza starea curent a aplica iei i introduce modific ri care afecteaz
execu ia aplica iei. Când aplica ia este în modul break se pot efectua urm toarele ac iuni:
269
o Modificarea codului aplica iei.
o Observarea st rii interfe ei.
o Determinarea apelurilor procedurilor.
o Urm rirea valorilor variabilelor, propriet ilor i instruc iunilor.
o Schimbarea valorilor variabilelor i propriet ilor.
o Controlarea fluxului execu iei prin aflarea/stabilirea instruc iunii urm toare.
o Execu ia imediat a unor instruc iuni Visual Basic.
o Controlarea manual a oper rii aplica iei.

Intrarea în modul break la o instruc iune cu probleme

În timpul depan rii unui program este uneori de dorit oprirea aplica iei în acel loc din cod unde se b nuie te existen a
unei probleme. Acesta este unul dintre motivele pentru care Visual Basic prevede puncte de oprire i instruc iuni Stop.
Un punct de oprire (breakpoint) define te o instruc iune sau o mul ime de condi ii unde Visual Basic opre te execu ia în
mod automat i trece aplica ia în modul break f r a executa instruc iunea care con ine punctul de oprire.

Se poate intra în modul break i manual, prin oricare dintre ac iunile

o CTRL+BREAK
o Comanda Break din meniul Run
o Butonul Break de pe bara de unelte Debug.

Este posibil s se opreasc execu ia atunci când aplica ia nu are de lucru (idle - este între procesarea unor evenimente).
Când se întâmpl acest fapt, execu ia nu se opre te la o linie specific , dar Visual Basic comut oricum la modul break.

Se poate intra automat în modul break automat atunci când se întâmpl oricare dintre urm toarele condi ii:

o O instruc iune genereaz o eroare de execu ie netratat .


o O instruc iune genereaz o eroare de execu ie i a fost selectat Break on All Errors în fi a General
(meniul Tools).
o O expresie de oprire definit în dialogul Add Watch s-a modificat sau a devenit True, dup cum a fost
definit .
o Execu ia atinge o linie cu un punct de oprire.
o Execu ia atinge o instruc iune Stop.

Fixarea unei erori run-time i continuare

Anumite erori din execu ie rezult din neglijen a cu care este scris codul. Aceste erori pot fi corectate u or prin declararea
variabilelor, modificarea denumirilor etc. Dup o asemenea corectur programul poate continua chiar din linia unde s-a
oprit. Acest fapt se realizeaz prin ac ionarea comenzii Continue (meniul Run) sau butonul Continue. La continuarea
aplica iei se poate verifica fixarea erorii.

Dac se selecteaz op iunea Break on All Errors, Visual Basic inhib tratarea erorilor din cod, încât la orice eroare
semnalat se intr în modul break. Erorile vor fi captate de secven ele de tratare doar dac op iunea Break on All Errors
nu este selectat .

Anumite erori, cum ar fi schimbarea declara iilor de variabile, ad ugarea unor noi variabile etc., necesit repornirea
aplica iei. În acest caz Visual Basic prezint un mesaj care las repornirea aplica iei la voia utilizatorului.

Monitorizarea datelor prin expresii de urm rire

Atunci când un calcul nu produce rezultatul a teptat sau apar probleme când o anumit proprietate sau variabil ia o
valoare particular , este de interes s se poat identifica momentul în care o expresie î i schimb sau atinge o valoare.
270
Visual Basic monitorizeaz în mod automat expresiile definite de utilizator drept expresii santinel (de urm rit). La
trecerea aplica iei în modul break, aceste expresii apar în fereastra Watch.

Se poate de asemenea instrui o expresie urm rit s treac aplica ia în modul break atunci valoarea ei se modific sau
devine True (pentru condi ii). Acest mod de operare reduce, de obicei, parcurgerea pas cu pas a proiectului pân când se
atinge o anumit condi ie (de exemplu, o variabil de ciclare ajunge la o anumit valoare, sau un indicator dintr-o
procedur este modificat).

Ad ugarea, editarea sau eliminarea unei expresii urm rite

Toate opera iunile din titlu se pot efectua atât în design time, cât i în modul break. Pentru a ad uga o expresie santinel
se utilizeaz dialogul Add Watch afi at din meniul Debug.

Se utilizeaz dialogul Edit Watch, afi at tot din meniul Debug, pentru modificarea sau eliminarea unei expresii definite.
Cele dou dialoguri, Add Watch i Edit Watch, au aceea i structur de controale cu excep ia butonului Delete care
apare doar în dialogul Edit Watch.

Componentele comune celor dou dialoguri sunt prezentate în tabelul urm tor.

Componenta Descriere

Zona text Expression Con ine expresia pe care expresia urm rit o evelueaz . Aceast expresie este o
variabil , o proprietate, un apel de func ie sau orice alt expresie valid . În dialogul Add
Watch aceast box de text con ine expresia curent (dac exist ).

Grupul de op iuni Context Stabile te domeniul variabilelor urm rite în expresie. Se va completa atunci când exist
variabile sinonime cu domenii diferite. Se poate restrânge domeniul la o procedur
specific sau la un modul anumit, sau se poate extinde la întreaga aplica ie prin
selectarea intr rilor All Procedures i All Modules. Visual Basic poate evalua mai u or o
variabil într-un context restrâns.

Grupul de op iuni Watch Type Stabile te cum r spunde Visual Basic la expresia urm rit :
- urm re te expresia i afi eaz valoarea în fereastra Watch atunci când aplica ia intr
în modul break;
- aplica ia intr în modul break automat atunci când se modific valoarea expresiei sau
când aceasta devine True.

Observa ie. Se poate ad uga o expresie urm rit prin tragerea expresiei dintr-un modul în fereastra Watch.

Utilizarea urm ririi rapide

Când aplica ia este în modul break, se poate verifica valoarea unei propriet i, variabile sau expresii pentru care nu s-a
definit în prealabil o expresie de urm rire. Se folose te în acest scop dialogul Quick Watch (din meniul Debug sau de pe
bara sinonim ). Dialogul arat valoarea expresiei selectate înrtr-un modul. Pentru a continua urm rirea acestei expresii,
se ac ioneaz butonul Add (inhibat dac opera iunea de urm rire nu este posibil ); fereastra Watch este afi at etc.

Utilizarea unui punct de oprire

În execu ie, un punct de oprire (breakpoint) produce oprirea execu iei programului exact înaintea unei linii specifice de
cod. Atunci Visual Basic execut o procedur i se ajunge la o linie de cod care are fixat un punct de oprire, atunci
aplica ia este trecut în modul break.

271
Se poate stabili sau anula un punct de oprire în modul break, în design time sau în run time dac aplica ia este inactiv
(idle). Pentru a fixa un punct de oprire se efectueaz un click pe marginea din stânga ferestrei modulului, în dreptul
instruc iunii (vezi figura de mai sus). Instruc iunea astfel marcat este colorat potrivit culorii specificate în dialogul
Options (meniul Tools), fi a Editor Format. Prin click pe indicatorul de breakpoint se anuleaz punctul de oprire
respectiv.

Se remarc în figura anterioar c instruc iunea curent este i ea marcat prin culoare i un indicator pe latura din
stânga a ferestrei de cod. Atunci când se atinge un punct de oprire i aplica ia este oprit , se poate examina starea
curent a aplica iei, focusul putând fi mutat între forme, module, ferestrele de depanare.

Aplica ia este oprit exact înaintea execut rii liniei care con ine punctul de oprire. Dac se dore te observarea efectului
execut rii acestei instruc iunii se va ac iona Step Into sau Step Over.

Pentru izolarea unei probleme reamintim c o instruc iune poate s contribuie indirect la eroare datorit atribuirii unor
valori incorecte. Examinarea valorilor variabilelor i propriet ilor se efectueaz în modul break prin ferestrele Locals,
Quick Watch, expresii urm rite i fereastra Immediate.

Utilizarea instruc iunii Stop

O alternativ la fixarea unui punct de oprire este plasarea unei instruc iuni Stop. La întâlnirea unei instruc iuni Stop,
Visual Basic opre te execu ia i comut în modul break. De i Stop ac ioneaz ca un breakpoint, instruc iunea nu poate fi
fixat sau inhibat în acela i mod.

Reamintim c o instruc iune Stop opre te doar temporar execu ia în timp ce o instruc iune End opre te execu ia,
reini ializeaz variabilele i produce întoarcerea la modul design. O aplica ie oprit prin Stop poate fi continuat prin
Continue din meniul Run.

Executarea unor secven e de cod selectate

Dac se poate identifica instruc iunea care a cauzat eroarea, un singur breakpoint poate localiza problema ivit . Este mai
frecvent situa ia în care o întreag secven de cod este b nuit c produce execu ia incorect a aplica iei. În acest caz,
un breakpoint izoleaz zona de cod i se parcurge apoi întreaga por iune pas cu pas prin Step Into i Step Over. Dac
este necesar, se poate de asemenea s ri peste instruc iuni sau reîntoarce execu ia la o nou linie.

Pentru comenzile descrise în tabelul urm tor trebuie ca aplica ia s fie în modul break.

Modul de parcurgere Descriere

Step Into Execut instruc iunea curent i se opre te la urm toarea linie, chiar dac ea este în alt
procedur .

Step Over Execut întreaga procedur apelat de linia curent i se opre te la linia urm toare liniei curente.

Step Out Execut restul procedurii curente i se opre te la instruc iunea urm toare celei care a apelat
procedura curent .

272
Utilizarea comenzii Step Into

Se utilizeaz Step Into pentru a executa o singur instruc iune. Visual Basic trece temporar în run time, execut
instruc iunea curent i avanseaz la urm toarea instruc iune, revine în modul break. Pentru acest tip de opera iune se
ac ioneaz butonul Step Into din bara Debug.

În cazul scrierii mai multor instruc iuni pe o aceea i linie, Visual Basic le va considera separat (punctele de oprire apar
doar la prima instruc iune din linie).

Utilizarea comenzii Step Over

Comanda Step Over se aplic tot instruc iunii curente, dar aceasta trebuie s con in un apel la o procedur . Dac prin
comanda Step Into s-ar trece în procedur pas cu pas, prin Step Over procedura este executat ca o unitate i se trece
apoi la instruc iunea urm toare în procedura curent . Pentru acest tip de opera iune se ac ioneaz butonul Step Over din
bara Debug.

Acest tip de ac iune este util atunci când procedura apelat este verificat . Totu i, dac în procedura apelat exist o
instruc iune Stop sau este definit un punct de oprire, atunci execu ia este stopat în acele locuri.

Utilizarea comenzii Step Out

Prin comanda Step Out se m re te viteza de parcurgere a secven elor de cod în sensul c dac se tie c restul
instruc iunilor dintr-o procedur nu pot crea probleme, atunci ele pot fi executate în bloc i nu pas cu pas. Se revine în
procedura apelant , la instruc iunea urm toare apelului. Pentru acest tip de opera iune se ac ioneaz butonul Step Out
din bara Debug.

Trecerea peste sec iuni de cod

În modul break se poate selecta o instruc iune oarecare, mai departe pe firul execu iei, i click pe Run To Cursor din
meniul Debug permite reluarea execu iei din punctul selectat. Se pot astfel s ri secven e neinteresante de cod.

Stabilirea instruc iunii urm toare

O ac iune similar celei descrise în sec iunea anterioar este selectarea unei instruc iuni oriunde în procedura curent i
click Set Next Statement din meniul Debug. Se pot astfel urm ri doar anumite fire de execu ie sau se pot reexecuta
anumite secven e pentru alte valori date variabilelor/propriet ilor.

Indicarea instruc iunii urm toare

Prin click pe Show Next Statement din meniul Debug se plaseaz punctul de inser ie în linia care urmeaz a fi
executat . Este o modalitate util mai ales când se depaneaz o secven error handler i nu se tie exact care este
urm toarea instruc iune. Comanda este disponibil doar în modul break.

Monitorizarea listei de apeluri (Call Stack)

Dialogul Call Stack, afi at prin meniul/bara de unelte Debug, arat o list a apelurilor active de proceduri. Dialogul poate
fi afi at doar în modul break. Apelurile active sunt cele care au ini iat proceduri care nu au fost complet executate. Prin
lista afi at se poate trasa ordinea de apeluri care au dus la instruc iunea curent . Cu cât asemenea lan uri de apeluri
sunt mai lungi, cu atât depanarea aplica iei este mai dificil .

În lista din dialogul Call Stack toate apelurile active sunt prezentate într-o serie de apeluri înl n uite. Ea plaseaz cea mai
timpurie procedur apelat la baza listei i adaug apelurile urm toare în topul listei. Informa ia dat pentru fiecare

273
procedur începe cu numele modulului, urmat de numele procedurii. Prin butonul Show din dialog se afi eaz
instruc iunea dintr-o procedur care trece controlul aplica iei c tre urm toarea procedur din list .

Observa ie. Deoarece dialogul Call Stack nu indic variabila asignat unei instan e a unei clase, nu se poate distinge
între instan e multiple ale claselor.

Testarea datelor i procedurilor cu fereastra Immediate

În procesul de depanare sau de experimentare a unei aplica ii, este adesea necesar s se execute proceduri individuale,
s se evalueze expresii sau s se atribuie noi valori variabilelor sau propriet ilor. Toate aceste ac iuni pot fi executate din
fereastra Immediate. Expresiile sunt evaluate i rezultatele sunt tip rite în fereastra Immediate.

Tip rirea informa iilor în fereastra Immediate

Exist dou metode pentru tip rirea în fereastra Immediate

• Includerea unor instruc iuni Debug.Print în codul aplica iei,


• Introducerea direct în fereastra Immediate a instruc iunilor care utilizeaz metoda Print.

Aceste tehnici ofer urm toarele avantaje în raport cu utilizarea expresiilor urm rite:

• Aplica ia nu trebuie oprit pentru a ob ine informa ii. Datele i mesajele sunt afi ate pe m sur ce aplica ia se
execut .
• Informa iile sunt afi ate într-o fereastr separat (Immediate), încât nu se interfereaz cu ie irea v zut de
utilizatori.

Tip rirea din codul aplica iei

Metoda Print trimite ie irea c tre fereastra Immediate atunci când se include calificarea cu obiectul Debug. De exemplu

Debug.Print "Salary = "; Salary

Aceast tehnic lucreaz cel mai bine atunci când exist un loc particular în aplica ie în care variabila urm rit (aici
Salary) se modific . De exemplu, instruc iunea anterioar poate apar ine unei structuri repetitive.

Tip rirea din fereastra Immediate

Dac aplica ia este în modul break, se poate muta focalizarea în fereastra Immediate pentru a examina date. Aici se pot
evalua expresii valide, inclusiv expresii care se refer la propriet i. Modulul activ curent determin domeniul de referin .

Orice instruc iune care utilizeaz metoda Print poate fi înscris i la terminarea cu ENTER se va evalua expresia i se va
afi a rezultatul. Un semn de întrebare (?) poate înlocui metoda Print:

? ActiveDocument.Name

executat din Microsoft Word, afi eaz în fereastra Immediate numele documentului Word activ.

Atribuirea de valori

În modul break, se pot atribui valori la propriet i i variabile. Urm torul exemplu prezint o schem de utilizare a ferestrei
Immediate pentru calcule. Fiecare linie (cu excep ia celor care afi eaz rezultatele) se va termina cu ENTER:

274
x=2
? x+3
5
y=3
? x*y
6

Se poate modifica valoarea unei propriet i sau a unei variabile din proiect i relua apoi executarea aplica iei. Dac
Option Explicit este prezent în modulul curent, toate variabilele invocate în fereastra Immediate trebuie s fie declarate
în modul. Domeniul se aplic apelurilor de proceduri ca i variabilelor.

Testarea procedurilor cu fereastra Immediate

În fereastra Immediate se poate evalua orice instruc iune executabil valid Visual Basic, dar nu se accept declara ii de
date. Se pot utiliza apeluri la proceduri care permit astfel testarea procedurii cu diverse seturi de argumente.

X = Quadratic(2,8,8)
DisplayGraph 50, Arr1
Form_MouseDown 1,0,100,100

La ap sarea tastei ENTER, Visual Basic comut la run time pentru a executa instruc iunea i se întoarce apoi în modul
break. În acest moment se pot vedea rezultatele i efectele asupra variabilelor i propriet ilor.

Se poate apela orice procedur din forma activ curent, ca i orice procedur dintr-un modul, cu excep ia cazului în care
procedura este Private, caz în care se poate apela doar în timpul execut rii modulului.

O procedur poate fi executat în mod repetat, fiecare apel este men inut de Visual Basic ca o instan separat .
Aceasta permite testarea separat a diferitelor seturi de argumente. Dialogul Call Stack men ine o list a procedurilor
executate de fiecare comand din fereastra Immediate. Se poate prin urmare utiliza Call Stack pentru a selecta orice
instan a procedurii i afi a apoi valorile variabilelor din procedur .

Observa ie. De i cele mai multe instruc iuni sunt suportate de fereastra Immediate, o structur de control este permis
doar dac poate fi exprimat complet pe o linie: se utilizeaz caracterul ":" pentru separarea instruc iunilor care alc tuiesc
structura de control.

Verificarea numerelor de eroare

Se poate utiliza fereastra Immediate pentru a afi a mesajul asociat cu un num r specific de eroare. De exemplu, tastarea
instruc iunii

Error 58

produce o caset cu mesajul asociat erorii

File already exists

Trucuri utile în fereastra Immediate

o Dup introducerea unei instruc iuni, aceasta se poate reexecuta prin mutarea punctului de inser ie înapoi
în instruc iune i ENTER.
o Înainte de ENTER se poate edita instruc iunea curent .

275
o Se poate utiliza mouse-ul sau s ge ile pentru a naviga în fereastra Immediate. Nu se apas ENTER
decât pe instruc iunea care se execut .
o CTRL+HOME mut punctul de inser ie la linia de început a ferestrei; CTRL+END îl mut la ultima linie.
o Tastele HOME i END mut punctul de inser ie la începutul i, respectiv, sfâr itul liniei curente.

Considera ii speciale

Anumite evenimente care sunt o parte comun cu utilizarea Microsoft Windows pot s ridice probleme speciale pentru
depanarea unei aplica ii. Este important s fim con tien i de aceste probleme pentru a nu complica procesul de
depanare.

Dac r mânem con tien i de modul în care modul break poate pune evenimentele în dezacord cu ceea ce aplica ia
a teapt , avem o ans s g sim solu ii. În anumite proceduri de evenimente, trebuie s utiliz m instruc iuni Debug.Print
pentru a monitoriza valorile variabilelor/propriet ilor în loc s utiliz m expresii santinel sau puncte de oprire.

Oprirea execu iei în procedurile evenimentelor MouseDown sau KeyDown

Dac se opre te execu ia în timpul unei proceduri eveniment MouseDown, se poate l sa butonul mouse-ului sau utiliza
mouse-ul pentru alte taskuri. Când se continu execu ia, totu i, aplica ia presupune c butonul mouse-ului este înc
ap sat. Nu se va ob ine evenimentul MouseUp pân când nu se apas din nou butonul mouse-ului i apoi se elibereaz .

Când se apas butonul mouse-ului în run time, se opre te execu ia în evenimentul MouseDown dac aici este un
breakpoint. În acest scenariu nu se va ob ine niciodat evenimentul MouseUp. Solu ia este eliminarea breakpoint-ului din
procedura MouseDown.

Dac execu ia se opre te în timpul procedurii KeyDown, se aplic din nou considera iile anterioare. Dac exist un
breakpoint în procedura evenimentului KeyDown, nu se va ob ine niciodat evenimentul KeyUp.

Oprirea execu iei în procedurile evenimentelor GotFocus i LostFocus

Dac se opre te execu ia în procedurile evenimentelor GotFocus sau LostFocus, temporizarea sistemului de mesaje
poate cauza rezultate inconsistente. Pentru aceasta se vor utiliza instruc iuni Debug.Print în locul punctelor de oprire din
procedurile care trateaz evenimentele GotFocus i LostFocus.

Distribuirea solu iilor Microsoft Excel 97, Word 97 i PowerPoint 97

În acest capitol se discut probleme privind distribuirea solu iilor dezvoltate pentru Microsoft Excel 97, Word 97 i
PowerPoint 97. Pe lâng modul efectiv de distribuire sunt reamintite i opera iuni preparatorii cum ar fi protejarea codului,
erori posibile etc.

Preg tirea solu iei pentru distribuire

În momentul în care s-a închegat o solu ie trebuie s se ia o serie de decizii în vederea distribuirii solu iei. Prima decizie
este cum s se împacheteze proiectul: ca un simplu document sau ca un add-in (sau template în Word).

Dac se decide distribuirea ca un add-in, este important s se decid cum i când se va înc rca: automat sau la cerere.

În sfâr it, trebuie s se decid asupra modului de protejare a codului i, evident, asupra unei ultime verific ri în ceea ce
prive te corectitudinea codului (de obicei ultimul bug apare chiar înainte de punctul final al proiectului).

Alegerea modului de împachetare a solu iei

276
Atunci când se ascrie o solu ie în Visual Basic for Applications, se ob ine un proiect asociat unui document. La distribuirea
solu iei trebuie s se decid dac utilizatorul trebuie s aib acces la document i codul asociat sau numai la cod.

Dac se dore te accesul atât la document cât i la cod, se va distribui documentul – adic document Word, caiet Excel
sau prezentare PowerPoint. Acest caz este frecvent la scrierea unei solu ii verticale – o solu ie foarte specific pentru un
utilizator foarte specific. De exemplu, dac se creeaz în Microsoft Word un formular de testare a performan ei, atunci
atât documentul cât i codul care îl automatizeaz trebuie s fie accesibil utilizatorului.

Dac , pe de alt parte, se dore te ca numai codul (proiectul) s fie accesibil, atunci se va distribui ca un add-in (Microsoft
Excel i PowerPoint) sau ca un template global (Word).

Observa ie. Utilizatorii nu au acces la foile de calcul dintr-un add-in deoarece acestea sunt ascunse automat la crearea
unui add-in dintr-un caiet. În mod similar, atunci când o prezentare PowerPoint este organizat ca un add-in, slide-urile
sale sunt eliminate automat. Pentru o discu ie suplimentar se va citi sec iunea "Salvarea solu iei ca un Add-in sau Global
Template".

Se poate interzice accesul utilizatorului la documentul asociat proiectului, fie din cauz c documentul nu este pentru
utilizator, fie pentru c el con ine date pe care utilizatorul nu trebuie s le modifice sau s le vad . Acesta este cazul când
solu ia con ine proceduri care extind i adapteaz setul de op iuni ale aplica iei – proceduri care sunt proiectate s aib o
larg aplicabilitate, independente de un document specific. De exemplu, dac se scriu proceduri care automatizeaz
sarcini de formatare a foilor de calcul, utilizatorul trebuie s aib acces la aceste proceduri din orice caiet deschis, dar nu
trebuie s acceseze caietul asociat proiectului.

La distribuirea solu iei ca un add-in sau template trebuie s se decid separat dac se va proteja codul proiectului.

Controlul înc rc rii unui Add-in sau Global Template

Dac se decide distribuirea solu iei proprii ca un add-in sau template, este normal s se decid momentul înc rc rii
acestuia. Utilizatorul poate întotdeauna s încarce un add-in utilizând dialogul Template and Add-Ins sau Add-Ins
(meniul Tools), dar nu aceasta este solu ia cea mai bun . Sa alternativ se poate stabili ca un add-in sau template global
s se încarce automat la pornirea aplica iei. Sau, pentru a nu încetini pornirea aplica iei, se poate alege înc rcarea ca
r spuns la un eveniment anumit sau prin alegerea unei comenzi. În sfâr it, se poate înc rca un add-in sau un template
global în mod programatic.

Înc rcarea unui Add-In sau Global Template la start

Posibilit ile unui add-in devin accesibile unui utilizator doar dup ce add-in-ul este înc rcat. De exemplu, când un
template global este înc rcat, Word mixeaz meniurile, barele de unelte, intr rile AutoText i macrourile din template cu
meniul Word. Din acest motiv se poate inten iona ca înc rcarea add-inului sau a template-ului s aib loc la activarea
aplica iei Word, Excel sau PowerPoint.

Pentru a înc rca add-inuri sau template-uri în mod automat la pornirea aplcia iei, trebuie s se palseze în folderul Office
Startup, localizat de obicei pe calea "Program Files\Microsoft Office\ Office\Startup".

În Microsoft Excel se poate de asemenea palsa un add-in în folderul Xlstart sau în folderul desemnat ca un folder de
pornire alternativ. Acest fapt se realizeaz prin atribuirea unei c i i a unui nume de folder la cheia

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\AltStartup

din Windows registry.

Înc rcarea automat a unui Add-In în Microsoft Excel prin comanda OPEN din Windows Registry

277
În plus fa de memorarea unui add-in într-unul dintre folderele de pornire (vezi sec iuena precedent ), se poate utiliza
comanda OPEN din Windows Registry pentru a specifica fi ierele addÎn care se încarc automat la pornirea aplica iei
Excel.

Trebuie s se creeze câte o comand OPEN în cheia de registru

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel

pentru fiecare fi ier add-in. Pentru cazul mai multor fi iere se utilizeaz OPEN pentru primul fi ier, OPEN1 pentru al
doilea, OPEN2 pentru al treilea etc.

Sintaxa pentru comanda OPEN este

OPEN =[ /Switch] pathandfilename

unde

/Switch poate fi /R sau /F. Comutatorul /R deschide fi ierul read-only iar /F este utilizat pentru a cere înc rcarea caietelor.
Microsoft Excel citeste doar atâta informa ie dintr-un workbook cât este necesar pentru referirea func iilor utilizator. Un
exemplu este

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\OPEN = /R

"C:\OFFICE\OFFICE\LIBRARY\ANALYSIS\ANALYS32.XLL"

Comanda OPEN este suportat doar din motive de compatibilitate i este necesar pentru cererea de înc rcare a
macrourilor. Alternativ recomandat este prezentat ulterior în acest capitol, o dat cu Init Commands i Init Menus.

Înc rcarea automat a unui Add-In în Microsoft PowerPoint utilizând valoarea AutoLoad din Windows Registry

Opera iunea de înc rcare automat a unui add-in prin valorile din Windows Registry se poate efectua i în PowerPoint,
dar valorile fixate sunt altele decât în Excel.

Numele fi ierului add-in se va da, în Windows Registry, ca subcheie fie sub HKEY_CURRENT_USER, fie sub
HKEY_LOCAL_MACHINE. Valoarea Path a cheii trebuie s fie loca ia add-in-ului. Valoarea AutoLoad se va fixa pe 1
pentru o înc rcare automat .

Înc rcarea Add-In-urilor care au fost înc rcate în sesiunea precedent

Un add-in înc rcat i înregistrat în sesiunea curent Excel sau PowerPoint va fi înc rcat automat la o nou pornire a
aplica iei.

Un template global înc rcat în Word r mâne disponibil pentru sesiunea curent , dar nu este reînc rcat automat la o nou
pornire a aplica iei.

Observa ie. Un add-in ad ugat listei din dialogul Add-Ins (utilizând butonul Add New) din Excel sau PowerPoint este
înregistrat sub HKEY_CURRENT_USER. În continuare, aceste add-in-uri înregistrate vor fi accesibile doar pentru
utilizatorul intrat pe ma in în momentul ad ug rii.

278
Înc rcarea programatic a unui Add-In sau Global Template

Colec ia Addins permite instalarea prin program a unui add-in sau template global.

În Word sau Microsoft Excel se va stabili la True proprietatea Installed a obiectului Addin:

Addins("C:\…\Gallery.dot").Installed = True

În PowerPoint, proprietatea Loaded a obiectului Addin se va stabili la True pentru înregistrarea automat , aceea i
valoare dându-se propriet ii Registered pentru a înregistra add-in-ul.

With Addins("C:\…\mytools.ppa")
.Loaded = True
.Registered = True
End With

Înc rcarea programatic a unui add-in ca r spuns la un eveniment

Dac se dore te înc rcarea programatic a unui add-in ca r spuns la un eveniment, codul care comand aceast
opera iune se plaseaz în procedura de eveniment.

Deschiderea i înc rcarea programatic a unui template global prin linia de comand

Se utilizeaz urm toarea linie de comand , de exemplu, unde path este loca ia fi ierului Add-in.dot, pentru a instala un
add-in numit Add-in.dot, i executarea unei proceduri numit Main din modulul denumit Add-inInstall:

WinWord "<Path>\Add-in.dot" /mAdd-inInstall

Word are un num r de argumente pe linia de comand . Comutatorul /m execut codul din modulul specificat. De notat c
nu exist nici un spa iu dup "m" i c nu se specific procedura Main; doar o procedur denumit Main se va executa, în
lipsa unei asemenea proceduri nu se execut nimic la înc rcarea modulului. În continuare este un exemplu de procedur
Main.

' numele modulului este Add-inInstall, pentru a func iona cu


' linia de comand din exemplul anterior
Option Explicit
Sub Main()
'Check to see if Add-In is loaded in Add-In list
Dim wkbAddin As Word.AddIn
On Error GoTo ErrorHandler
Set wkbAddin = AddIns(ThisDocument.Name)
If wkbAddin Is Nothing Then
' Add the template to the add-ins collection and install it
Set wkbAddin = AddIns.Add(ThisDocument.FullName, True)
End If
' If template is the active document close it
If ThisDocument.Name = ActiveDocument.Name Then
' The Add-in should not be dirty
ThisDocument.Close
End If
Exit Sub
Errorhandler:
' Only ignore "Subscript out of range" errors
279
Select Case Err.Number
Case 9, 5941
Err.Clear
Resume Next
Case Else
' Assert the error when in Debug mode
#If DebugMode Then
AssertError
#End If
' Insert other error handling code here
End Select
End Sub

Desc rcarea programatic a unui Add-in sau Template

Un add-in r mâne înc rcat pân când se termin sesiunea curent , pân la desc rcarea prin program sau pân la
desc rcarea prin dialogul Add-Ins (sau Templates and Add-ins) activat prin meniul Tools. Prin desc rcarea unui add-in
se salveaz memoria disponibil .

În Word sau Microsoft Excel, pentru desc rcarea unui add-in sau template global, se stabile te la False proprietatea
Installed a obiectului Addin.

Addins(C:\…\Gallery.dot").Installed = False

În PowerPoint, proprietatea Loaded a obiectului Addin se va stabili pe False pentru desc rcare, iar proprietatea
Registered se va stabili pe False pentru a înl tura înregistrarea add-in-ului.

Înc rcarea la cerere

Înc rcarea unui add-in sau template la pornirea aplica iei poate s creasc semnificativ timpul pornirii aplica iei. Se poate
utiliza atunci înc rcarea la cerere pentru a amâna înc rcarea pân atunci când utilizatorul apeleaz o comand sau o
procedur din add-in.

Este de men ionat c wizard-urile i add-in-urile ini iate de o comand din menu sunt înc rcate, în mod automat, la
cerere.

Exist mai multe tehnici pentru a stabili înc rcarea la cerere, specifice diferitelor aplica ii.

Observa ie. Dac se inten ioneaz utilizarea unui add-in sau template ca o bibliotec de cod, apelat din alte proiecte,
nu trebuie ca aceasta s fie înc rcat explicit deoarece Visual Basic va înc rca add-in-ul sau template-ul referit la cerere,
atunci când o procedur din bibliotec este apelat .

Utilizarea referin elor explicite în Microsoft Excel

Prima metod de înc rcare la cerere este utilizarea unei referin e explicite atunci când se atribuie un nume de macro la o
unealt . Urm toarea linie cheam procedura MySub care st în modulul ThisWorkbook din caietul (add-in) "C:\My
Documents\MyTools.xla":

'C:\My Documents\MyTools.xla'!ThisWorkbook.MySub

Add-in-ul este înc rcat doar atunci când este executat macro-ul.

280
Pentru solu ii care sunt distribuite utilizând un program de instalare se va vedea sec iunea "Ad ugarea de meniuri i
submeniuri la Microsoft Excel f r înc rcarea unui Add-In".

Înc rcarea la cerere a bibliotecilor de func ii în Microsoft Excel

Dac se distribuie o solu ie care con ine o bibliotec de func ii macro ar fi de dorit înc rcarea la cerere a acestei biblioteci.
De asemenea, în mod normal este de dorit ca func iile s fie listate în Function Wizard. Pentru înc rcarea la cerere a
func iilor este nevoie de macro-uri XLM (Microsoft Excel 4.0 macro sheets). Aceste macro-uri sunt de obicei doar
"înveli uri" pentru func ii Visual Basic.

Atunci când Microsoft Excel vede c un Add-In este marcat pentru înc rcarea la cerere, el cite te doar anteturile macro-
urilor func ii; ra iunea de prezentare sub form XLM este aceea c informa ia din anteturi poate fi citit f r a înc rca
Visual Basic for Applications (care se va înc rca doar atunci când este necesar).

Modificarea unui add-in pentru a beneficia de înc rcare la cerere

1. Se adaug la caietul add-in o foaie Microsoft Excel 4.0 macro: click dreapta pe un tab Worksheet i selectare
Insert, din dialog se va selecta Ms Excel 4.0 Macro.
2. Crearea unui macro func ie care învele te o func ie Visual Basic.

o În prima celul se scrie numele func iei.


o În celula de sub numele func iei se insereaz func ia Argument(Name_Text, Data_Type_ID).
o Name_Text este numele parametrului. Ideal ar fi ca acesta s fie numele parametrului func iei din VBA
pe care se presupune c -l reprezint .
o Data_Type_ID este ID-ul care determin tipul de dat pe care Excel îl accept pentru acest argument;
acest parametru este op ional.
o Se repet pa ii b, c i d pentru fiecare parametru din func ia VBA.
o Dac este necesar s se specifice tipul rezultatului se va utiliza func ia Result(Data_Type_ID).
o Func ia Return(value) semnaleaz sfânr itul macro-ului func ie.
o Se selecteaz toate celulele care con in macro-ul.
o Se selecteaz Define din submeniul Name (meniul Insert).
o Se denume te domeniul cu numele func iei.
o Se selecteaz butonul radio Function din grupul Macro.
o Click pe Add i apoi OK.

1. Se selecteaz Insert din bara de meniu i Define din submeniul Name. Se adaug numele "__DemandLoad"
care se refer la "=TRUE" (se tasteaz exact a a în boxa Refers To). Este de observat c exist dou caractere
"_" în fa a lui DemandLoad. Click Add, apoi Close.
2. Se stabile te proprietatea IsAddin a obiectului Workbook la TRUE.
3. Se salveaz caietul.

În continuare este un exemplu de macro care înf oar o func ie VBA.

MyFunction
=ARGUMENT("szArgOne")
=ARGUMENT("intArgTwo")
=RETURN(vMyFunction(szArgOne, intArgTwo))

Func ia VBA fiind de forma

Function vMyFunction (szArgOne As String, intArgTwo As Integer) As String



End Function

281
Ace ti pa i permit ca add-in-ul s fie înc rcat la cerere. Dup ce este înc rcat, add-in-ul nu este desc rcat din memorie
pân când se termin instan a curent a aplica iei Excel.

Ad ugarea meniurilor în Excel f r înc rcarea unui Add-in

Microsoft Excel 97 are dou chei noi de registru, care sunt citite la pornirea aplica iei i care creeaz intr ri de meniu
oferind puncte de intrare într-un add-in; acest add-in se încarc doar atunci când este cerut de o comand dintr-un meniu,
care se refer la add-in. Cheile respective sunt Init Menus i Init Commands. În continuare se prezint de asemenea i
cheia Delete Commands, care permite eliminarea unor intr ri de meniu.

Cheia Init Menus

(HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Menus) con ine câte o valoare String pentru fiecare


menu ad ugat unei mare de meniu built-in. Fiecare nume de valoare este unic i identific meniul creat. irul are sintaxa:

Value_name = Menu_bar_num, Menu_name,Menu_position[, Menu_parent]

Argument Descriere

Menu_bar_num Num rul barei de meniu built-in la care se dore te ad ugarea meniului. Barele de meniu se
schimb dup tipul foii active. Numerele sunt:
3 Nil menu bar (nu exist caiet deschis)
10 worksheet, dialog sheet, macro sheet 4.0
11 chart sheet
12 modul Visual Basic

Menu_name Numele noului meniu

Menu_position Pozi ia noului meniu pe bara meniu. Aceasta poate fi numele unui meniu dup care se plaseaz
cel nou, sau un num r indicând pozi ia noului meniu de la stânga barei meniu.

Menu_parent Este op ional: dac se define te un submeniu, acesta este numele sau num rul meniului care
va con ine noul submeniu, definirea c ruia fiind controlat de restul parametrilor.

Cheia Init Comands

(HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Commands) con ine câte o valoare de tip string pentru


fiecare comand ad ugat unui meniu. Fiecare nume de valoare este unic i identific comanda ad ugat . irul are
sintaxa

Value_name = Menu_bar_num,Menu_name,Command_name,Macro,

Command_position,[ Macro_key] ,[ Status_text] ,[ Help_reference]

parametrii fiind explica i în tabelul urm tor.

Argument Descriere

Menu_bar_num Num rul barei de meniu built-in la care se dore te ad ugarea meniului. Barele de meniu
se schimb dup tipul foii active. Numerele sunt:
10 Worksheet, dialog sheet, macro sheet 4.0

282
11 Chart sheet
12 modul Visual Basic

Menu_name Numele meniului sau submeniului. Submeniurile sunt indicate printr-un ir


"meniu\submeniu", caracterul backslash delimitând numele meniului de cel al submeniului.
Submeniul trebuie s fie existent deja sau s fie declarat în cheia Init Menu.

Command_name Numele noii comenzi.

Macro Referin a la o procedur dintr-un caiet add-in. Alegerea comenzii deschide add-in-ul i
execut procedura. Procedura va terge comanda ad ugat de aceast cheie de registru
i o va înlocui cu o comand care va executa procedura necesar .

Command_position Pozi ia noii comenzi în meniu. Aceasta poate fi numele unei comenzi dup care se
plaseaz cea nou , sau un num r indicând pozi ia noii comenzi pe meniu. Dac este omis,
comanda apare la sfâr itul meniului.

Macro_key Este op ional, cheia ata at procedurii, dac exist .

Status_text Este op ional, mesajul afi at în bara de stare atunci când se selecteaz comanda.

Help_reference Este op ional, numele fi ierului i num rul intr rii pentru un Help ata at comenzii.

Cheia Delete Commands

Se poate utiliza cheia Delete Commands pentru a terge comenzi din meniurile buil-in. Add-In Manager (comanda Add-
Ins din meniul Tools) cite te i scrie valori în cheia Delete Commands. Cheia con ine câte un ir pentru fiecare
comand care este tears din meniu. Fiecare nume de valoare este unic i identific comanda eliminat . irul are
sintaxa

Value_name = Menu_bar_num,Menu_name,Command_position

Argument Descriere

Menu_bar_num Num rul barei de meniu built-in unde se dore te modificarea meniului. Barele de meniu se
schimb dup tipul foii active. Numerele sunt:
3 Nil menu bar (nu exist caiet deschis)
10 worksheet, dialog sheet, macro sheet 4.0
11 chart sheet
12 modul Visual Basic

Menu_name Numele meniu

Menu_position Pozi ia comenzii pe bara meniu. Aceasta poate fi numele unei comenzi sau un num r indicând
pozi ia comenzii în meniu.

Observa ie. Este recomandabil s nu se elimine comanda Exit din meniul File dac nu s-a creat o cale alternativ de
p r sire a aplica iei Microsoft Excel.

Înc rcarea la cerere în PowerPoint

Pentru o înc rcare la cerere a unui add-in PowerPoint, singura posibilitate este s se creeze un DLL pentru a ad uga
intr ri de meniuri i bare de unelte atunci când PowerPoint este înc rcat.
283
Pentru a ad uga un DLL, se creeaz o cheie cu numele add-in-ului DLL sub cheia \Office\8.0\PowerPoint\DLL Addins\
din Windows Registry. Sub cheia creat se adaug trei valori denumite: AutoLoad, InitFunction i Path.

o AutoLoad – <DWORD> – este 0 sau 1. O valoare egal cu 1 arat c DLL este înc rcat automat la
pornirea aplica iei PowerPoint.
o InitFunction – <STRING> – numele func iei din DLL pe care PowerPoint trebuie s o apeleze o dat ce
DLL este înc rcat. Aceast func ie din DLL va crea intr rile de meniu i barele de unelte dorite.
o Path – <STRING> – calea complet i numele fi ierului DLL.

Acest DLL trebuie s adauge intr rile necesare în meniuri, s creeze barele de unelte i s stabileasc propriet ile
OnAction prin referirea complet calificat a numelor de macro-uri dintr-un fi ier add-in VBA (*.ppa, *.ppz).

Înc rcarea la cerere din Word

Pentru implementarea unei scheme de înc rcare la cerere, trebuie s se utilizeze cod cu legare târzie. În aceast situa ie
codul r spunde de deschiderea i închiderea template-urilor (vezi i sec iunea "Apelul procedurilor utilizând referin e cu
legare târzie").

Scrierea codului executat la înc rcarea sau desc rcarea unui Add-in sau Global Template

Se poate scrie cod care s se execute ca r spuns la înc rcarea sau desc rcarea unui add-in. De exemplu, atunci când
se încarc un add-in se poate executa o procedur care s afi eze o bar de unelte dând acces la func iunile add-in-ului.
În mod similar, la desc rcarea add-in-ului, aceea i bar de unelte se poate elimina prin executarea unei proceduri
speciale. Fiecare aplica ie are totu i un mod propriu de realizare a acestor ac iuni.

Microsoft Excel – evenimentele AddinInstall i AddinUninstall

Fiecare add-in are dou evenimente, AddinInstall i AddinUninstall, care sunt declan ate la înc rcarea i, respectiv,
desc rcarea add-in-ului, atât prin dialogul Add-ins cât i programatic. Aceste evenimente sunt locurile ideale de plasare
a intr rilor în cheile Init Menus i Init Commands din Windows Registry.

Se poate utiliza evenimentul Open a unui caiet pentru a efectua înregistrarea caietului i ad ugarea lui la dialogul Add-
In. În urm torul exemplu se prezint o structur general de utilizare a procedurilor evenimentelor AddinInstall i
AddinUninstall.

Option Explicit
Private Sub Workbook_AddinInstall()
' Add code to customize the Microsoft Excel User Interface (UI) here
MsgBox "Addin Installed"
End Sub
Private Sub Workbook_AddinUninstall()
' Add code to remove customization of the Microsoft Excel UI here
MsgBox "Addin Uninstalled"
End Sub
Private Sub Workbook_Open()
' Check to see if add-in is loaded in Microsoft Excel's AddIn list
Dim wkbAddIn As Excel.AddIn
On Error GoTo Errorhandler
Set wkbAddIn = AddIns(ThisWorkbook.Name)
If wkbAddIn Is Nothing Then
' Setting the CopyFile argument to true will cause the add-in
' to be copied to the local harddisk if it is on a removeable
' medium.

284
Set wkbAddIn = AddIns.Add(ThisWorkbook.FullName, True)
' Thenext line will cause the Workbook.AddInInstalled event
' to fire.
wkbAddIn.Installed = True
End If
' Initialize add-in here.
Exit Sub
Errorhandler:
' Only ignore "Subscript out of range" errors.
If Err.Number = 9 Then
Err.Clear
Resume Next
Else
' Assrt the error when in Debug mode.
#If DebugMode Then
AssertError
#End If
' Insert other error handling code here.
End If
End Sub

Microsoft PowerPoint – Procedurile Auto_Open i Auto_Close

De i nu suport evenimente, un add-in PowerPoint suport procedura Auto_Open care se execut la înc rcarea
fi ierului add-in i procedura Auto_Close care se execut la desc rcarea fi ierului add-in.

Procedurile Auto_Open i Auto_Close se execut doar dac ele se g sesc în fi ierul add-in. Prezen a lor într-un fi ier
de prezentare (*.ppt) nu produce nici un efect.

Microsoft Word – Procedurile AutoExec i AutoExit

La crearea unui template în Word, se poat crea procedurile numite AutoExec i AutoExit, care se execut atunci când
template-ul este înc rcat sau desc rcat. De exemplu, se pot utiliza AutoExec i AutoExit pentru a afi a sau ascunde bare
de unelte atunci când utilizatorul încarc sau descarc template-ul.

Se pot crea de asemenea module cu denumirile AutoExec i AutoExit, fiecare con inând o procedur de tip Sub denumit
Main. Procedura Main din modulul AutoExec se va executa la înc rcarea proiectului, iar Main din modulul AutoExit atunci
când proiectul este desc rcat.

Observa ie. Dac fi ierul este deschis ca un document, macroul AutoExec sau modulul sinonim nu se vor executa. În
locul acestora se execut procedura AutoOpen sau/ i procedura de eveniment Document_Open (vezi intrarea de Help -
Using Events with the Document Object).

Urm torul exemplu ini iaz monitorizarea evenimentelor aplica iei încât se pot utiliza evenimentele obiectului
Application. Primele dou rutine trebuie s fie plasate într-un modul clas denumit CAppEvents, ultimele trebuie s fie
plasate într-un modul standard numit AutoExec. Procedura Main din modulul AutoExec, apelat automat la înc rcarea in
memorie a template-ului care con ine proiectul, instan iaz clasa CAppEvents. Evenimentul Class_Initialize leag
variabila App la obiectul Application. Visual Basic va executa apoi procedura evenimentului DocumentChange de fiecare
dat când documentul activ se schimb .

' Class module named CAppEvents


Public WithEvents App As Word.Application
Private Sub Class_Initialize()
' Make the class self_initializing by connecting the object declared
285
' in the class mnodule with the Application object.
Set App = Application
End Sub
Private Sub App_DocumentChange()
' Display a message box with the active document name
If Documents.Count > 0 Then MsgBox ActiveDocument.Name
End Sub

' In a standard module named AutoExec


Global AppEvent As CAppEvents
Public Sub Main()
' Instantiate and initialize the CAppEvents class. This is all
' that is needed to have the above class work.
Set AppEvent = New CAppEvents
End Sub

În Word se poate dori includerea codului care s gestioneze un add-in în procedurile evenimentelor Open, Close i New
ale unui document, care se execut atunci când un template global este deschis sau închis ca un document sau când
este creat un nou document pe baza ablonului. Se pot utiliza de asemenea procedurile evenimentelor Startup, Quit i
DocumentChange ale obiectului Application. În acest caz se va revedea modul în care se pot utiliza evenimentele
obiectului Application.

Observa ie. Dac într-un document exist atât macro-urile AutoClose, AutoNew i AutoOpen, cât i procedurile
evenimentelor similare, atunci se vor executa atât macro-uri cât i procedurile.

Verificarea final a codului

Înaintea împachet rii solu iei ca un add-in sau un template global, este util o ultim verificare pentru eliminarea unor
erori frecvente, amintite în continuare.

Verificarea referin elor la ActiveWorkbook sau ActiveDocument

Reamintim c dac proiectul VB dintr-un add-in sau template global con ine o referin explicit sau implicit la
documentul activ sau la caietul activ, el sa ve referi în execu ie la acel document sau caiet care se va întâmpla s fie activ
în momentul aplic rii referin ei. Pentru referin a la add-in sau template se va utiliza prin urmare ThisWorkbook sau
ThisDocument.

De exemplu, ambele proceduri scrise în continuare apeleaz foaia denumit "Addin Definition" în caietul care este activ în
momentul execu iei codului. Prima procedur con ine o referin explicit , prin ActiveWorkbook. A doua procedur are o
referin implicit : deoarece nu se refer explicit la un caiet anumit, referin a este presupus în caietul activ.

Sub ExplicitReference()
Set rMnuTable = ActiveWorkbook.Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub
Sub ImplicitCode()
Set rMnuTable = Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub

Urm torul cod utilizeaz proprietatea ThisWorkbook pentru a realiza o referin la caietul în care se execut codul –
adic în caietul add-in.
286
Sub CorrectCode()
Set rMnuTable = ThisWorkbook.Worksheets("Addin Definition). _
Range("MenuDefinition")
Add_Menu rMnuTable
End Sub

Apelul rutinelor din alte proiecte

Dac se dore te apelarea unor func ii, proceduri i clase care sunt definite în alt proiect, proiectul apelant trebuie s aib
o referin la proiectul apelat. Este de notat c nu se pot crea referin e la prezent ri PowerPoint decât în cazul în care
acestea sunt salvate ca add-in-uri PowerPoint; dup salvarea ca un add-in prezentarea poate fi referit din alte
prezent ri.

Este evident c pentru a utiliza referin e la proiecte trebuie ca proiectele implicate s poarte denumiri diferite (de regul ,
la începutul utiliz rii VBA, proiectele se las cu denumirile implicite). Numele implicit al unui proiect se poate
vedea/modifica fie în fereastra Properties, fie în Project Name din dialogul Project Properties (ob inut prin click dreapta
în VBE i alegerea project name Properties).

Referin a la un alt proiect se realizeaz manual prin dialogul References ( meniul Tools) sau programatic prin metoda
AddFromFile a colec iei References. Linia urm toare stabile te o referin din caietul activ la proiectul din add-in-ul
MyTools.xla:

ActiveWorkbook.VBProject.References.AddFromFile "C:\Tools\MyTools.xla"

Este îns de notat c înainte de a stabili programamtic o referin , trebuie (în Word, Excel, PowerPoint) stabilit o
referin la biblioteca de tipuri Visual Basic for Applications Extensibility. Aceast bibliotec ofer obiectele care permit
lucrul programatic cu proiectul VBA.

Observa ie. Rutina Auto_Open dintr-un add-in referit nu este executat la înc rcare prin referin dintr-un alt add-in sau
prezentare.

Evitarea referin elor nerezolvate

La salvarea i distribuirea unui add-in sau template, referin ele stabilite pentru proiectul asociat r mân valabile. Totu i,
dac add-in-urile sau abloanele referite nu sunt la acelea i loca ii pe ma ina utilizatorului cum erau pe ma ina de
dezvoltare, referin ele nu vor putea fi rezolvate la beneficiar i solu ia nu va fi executat .

În PowerPoint, Visual Basic încearc s rezolve referin a prin c utarea în acela i folder cu proiectul apelant.

În Word i Microsoft Excel, Visual Basic încearc rezolvarea referin elor prin c utare în loca iile:

1. În acela î folder cu add-in-ul sau template-ul apelant.


2. În folderul r d cin a aplica iei gazd .
3. În folderul System i Windows.
4. În toate folderele variabilei de mediu Path.

În Microsoft Excel, Visual Basic prive te de asemenea în folderele ad ugate la valoarea Add-in Path din registry.

Dac o referin nu este rezolvat dup completarea c ut rii prezentate, execu ia este oprit .

În continuare sunt enumerate câteva metode care pot fi utilizate în evitarea/rezolvarea referin elor nerezolvate.

287
o Toate fi ierele se vor livra în acela i folder. Aceasta este solu ia comun .
o În Excel se poate actualiza cheia de registry Add-ins Path. Microsoft Excel 97 ofer cheia de registru

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Add-in Path

care puncteaz c tre folderele unde Microsoft Excel prive te pentru add-in-uri. Valoarea Add-in
Path este un ir care const din c i multiple delimitate de caractere ";". La instalarea aplica iei
Excel, programul Setup adaug c ile c tre folderele Library, Analysis i Solver. Alte programe de
instalare pot s modifice valoarea Add-in Path. Modificarea trebuie s fie "politicoas ": noile
intr ri se vor ad uga celor existente. Programele de tip uninstall trebuie s elimine doar
por iunea din valoare ad ugat la instalare.

o Ad ugarea folderului solu iei la variabila de mediu Path.

Se pot utiliza func iile API GetEnvironmentVariable i SetEnvironmentVariable pentru


ad ugarea temporar a folderului solu iei, sau se poate utiliza scrierea în instruc iunea Path din
Autoexec.bat pentru o ad ugare permanent .

Exemplul urm tor utilizeaz func iile GetEnvironmentVariable i SetEnvironmentVariable pentru a modifica temporar
variabila de mediu Path.

Option Explicit
Private Declare Function GetEnvironmentVariable Lib "kernel32" _
Alias "GetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" _
Alias "SetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpValue As String) As Long
' AppWord is a user defined compile directive
#If AppWord = True Then
Public Sub AutoExec()
AppendEnvironmentPath ThisDocument
End Sub
#End If
'AppExcel is a user defined compile directive
#If AppExcel = True Then
Public Sub Workbook_Open()
AppendEnvironmentPath ThisWorkbook
End Sub
#End If
Private Sub AppendEnvironmentPath (ThisDocObject As Object)
Const ENV_PATH As String = "Path"
Dim iRet As Long
Dim szPath As String
SzPath = String(1024, 0)
' Retrieve the current environment setting.
IRet = GetEnvironmentVariable(ENV_PATH, szPath, 1024)
If iRet Then
' iRet contains the length of the returned string.
' trim any trailing characters
szPath = Mid$(szPath, 1, iRet)
' See if the template path is included in the path statement.
If InStr(1,szPath, ThisDocObject.Path, vbTextCompare) = 0 Then

288
' Path is not part of the environment.
szPath = szPath & ";" & ThisDocObject.Path
iRet = SetEnvironmentVariable (ENV_PATH, szPath)
If iRet = 0 Then
' Handle error here. Template path was not appended to
' environment.
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"Path environment was not set."
End If
End If
Else
' should raise an error here. This should never happen …
Err.Raise vbObjectError + Err.LastDllError, _
ThisDocObject.Name & ".AppendEnvironmentPath", _
"No path environment was found."
End If
End Sub

o Se poate scrie un add-in agent de referin (reference broker) care s adapteze referin ele pentru a
ma in specific . Un asemenea agent de referin ar trebuie s verifica referin a i s lege înainte ca
solu ia s se execute (sau la momentul înc rc rii). Acest tip de component este bun pentru solu ii
trietajate (three-tier). Agentul trebuie s lege dinamic componenta front-end de componenta back-end pe
baza versiunii, nivelului de securitate sau al i parametri determina i de administrator. Aceast tehnic
poate fi utilizat la actualizarea automat a componentelor. O cale pentru determinarea dac o referin
este valid este utilizarea propriet ii IsBroken a obiectului Reference. Proprietatea IsBroken este True
dac referin a nu se refer la o intrare valid în Windows Registry.

Apelul unei rutine dintr-un Add-in PowerPoint f r fixarea unei referin e

Dac se dore te înc rcarea temporar a unui fi ier add-in i executarea unei rutine din fi ier, se va utiliza o instruc iune
Application.Run i imediat apoi se va desc rca fi ierul add-in. La executarea Application.Run, Microsoft PowerPoint va
înc rca add-in-ul i Va executa macroul specificat. Pentru a desc rca fi ierul se utilizeaz proprietatea Loaded, dup
modelul:

Sub CallAddInMacro()
Application.Run "…\MyAddIn.ppa!MyMacro"
AddIns("MyAddIn").Loaded = False
End Sub

Ultima instruc iune poate fi înlocuit i cu

AddIns(AddIns.Count).Loaded = False

Apelul rutinelor folosind referin e legate târziu

Se poate apela orice procedur public , proprietate sau variabil din modulul ThisDocument sau ThisWorkbook al unui
document sau caiet utilizând o referin târzie la obiectul asociat Document sau Workbook. De exemplu, urm toarele
instruc iuni atribuie obiectul Document, returnat de Open, unei variabile obiect. Dup aceea se apeleaz procedura
MySub din modulul clas ThisDocument al documentului:

Dim objDoc As Object


Set objDoc = Documents.Open(szFileName)
289
objDoc.MySub

Dac documentul reprezentat de variabila objDoc nu are, în modulul s u ThisDocument, o procedur public denumit
MySub, atunci apare o eroare de execu ie. În acest mod se poate apela cod doar din module ThisDocument sau
ThisWorkbook. Dac se dore te apelul unor proceduri din alte module, clase sau forme ale proiectului asociat
documentului/caietului deschis, se vor scrie proceduri intermediare în modulul ThisDocument sau ThisWorkbook pentru
a le accesa.

Observa ie. Procedeul descris nu func ioneaz în PowerPoint deoarece nu exist un modul ThisPresentation în proiect.

Protejarea sau neprotejarea codului

Stabilirea propriet ii IsAddin nu protejeaz codul surs al proiectului. Pentru protejarea codului se va marca Lock
project for viewing (meniul Tools, project Properties, fi a Protection) i se va fixa o parol . Dac se fixeaz doar
parola, f r blocarea accesului la cod, acesta poate fi v zut dar nu pot s deschid dialogul project Properties f r
cunoa terea parolei. Dup stabilirea parolei proiectul se va salva obi nuit prin Save (meniul File din Visual Basic Editor).

Pentru înl turarea protec iei se va elimina marcarea boxei de control Lock project for viewing i parola introdus .

Salvarea solu iei ca un Add-in sau Global Template

Fiecare aplica ie din Microsoft Office are un mod propriu de creare a unui add-in. În Microsoft Excel i PowerPoint se
salveaz fi ierul într-un format specific. În Word se salveaz documentul ca un fi ier template (.dot).

Crearea unui Add-in în Excel

La transformarea unui caiet într-un add-in, foile caietului sunt ascunse i procedurile din proiect sunt ascunse utilizatorului
(procedurile nu mai apar în dialogul Macros).

Pentru crearea unui add-in Excel, se fixeaz pe True proprietatea IsAddIn a caietului care con ine codul. O cale de
realizare a acestui lucru este salvarea unei copii a caietului respectiv ca un add-in Excel prin selectarea tipului de fi ier
Microsoft Excel Add-In (*.xla) în dialogul Save As.

Proprietatea poate fi stabilit i manual din VBE: se selecteaz "ThisWorkbook" în Project Explorer i se modific
proprietatea IsAddIn în Properties Window. Dup ce proprietatea IsAddIn este fixat pe True, caietul este ascuns în
Microsoft Excel.

Proprietatea se poate stabili i programatic.

Observa ie. Dac este nevoie s se modifice elementele caietului dup crearea add-in-ului, se fixeaz proprietatea
IsAddIn la False, caietul devine vizibil i editabil. Dup modificare se reface proprietatea IsAddIn i se salveaz caietul.

Crearea unui Add-in PowerPoint

Atunci când se salveaz o copie a prezent rii ca un add-in, toate diapozitivele prezent rii sunt înl turate i numai
proiectul VB asociat este compilat i memorat în noul fi ier add-in PowerPoint (*.ppa). Procedurile din add-in sunt
ascunse i nu apar în dialogul Macros.

Înaintea salv rii prezent rii ca un add-in se recomand salvarea normal ca o prezentare (fi ier .ppt) i apoi crearea unei
copii ca add-in prin alegerea tipului PowerPoint Add-In (*.ppa) în dialogul Save As.

Dac este nevoie de modific ri, acestea se efectueaz în fi ierul .ppt i se salveaz din nou ca un add-in (fi ier .ppa).
290
Crearea unui template global Word

Microsoft Word nu suport un format de fi ier de tip add-in, similar cu Excel sau PowerPoint. Un template global, sau un
template care a fost înc rcat în memorie încât macro-urile sale sunt disponibile din orice document, este echivalentul
Word al unui add-in.

Pentru crearea unui template global se alege Document Template (*.dot) în Savve As Type din dialogul Save As.

Depanarea unui Add-in sau Global Template

Pentru depanare se utilizeaz , cu unele particularit i, deprotejarea codului i efectuarea ac iunilor uzuale de verificare a
codului.

Depanarea unui Add-in Excel

Pentru depanarea unui add-in Excel o dat înc rcat, se înl tur protec ia proiectului respectiv. Dac este necesar s se
vad caietul asociat se fixeaz proprietatea IsAddIn la False.

Depanarea unui Add-in PowerPoint

Aplica ia PowerPoint necesit fixarea unei valori de registru pentru depanarea unui add-in, deoarece nu se afi eaz în
mod implicit în Project Explorer add-in-urile înc rcate. Pentru vizibilitatea acestora se va fixa sub cheia

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\PowerPoint\Options

valoarea DebugAddins la 1. Urm toarea pornire a aplica iei PowerPoint va afi a în Project Explorer toate add-in-urile
înc rcate. Din acest moment se poate deproteja codul etc.

Prin fixarea valorii 1 pentru DebugAddins se onoreaz i punctele de oprire din macro-urile atribuite ac iunilor din slide
show (dialogul Action Setting din meniul SlideShow).

Depanarea unui template global Word

Se deschide template-ul global, se deprotejeaz dac este necesar i se efectueaz depanarea in mod uzual.

Distribuirea solu iilor prin Setup Wizard

Microsoft Office Developer's Edition include un Setup Wizard prin care se poate crea un program Setup de instalare a
solu iei oferite. Prin intermediul unor dialoguri succesive se preia informa ia necesar construirii unei mul imi de foldere –
imagini de disc – cu programul de instalare i fi ierele necesare. Aceste foldere se pot copia pe dischete sau loca ie de
re ea etc.

În continuare sunt enumerate facilit ile rezolvate de wizard-ul de instalare:

o Copierea fi ierelor în loca iile necesare.


o Crearea shortcut-urilor Windows pentru pornirea solu iei.
o Ad ugarea cheilor din Windows Registry necesare.
o Definirea componentelor selectabile la instalare.
o Instalarea versiunii run-time de Access.
o Instalarea unor componente Microsoft Office: Graph 97, Replication Manager, drivere ISAM (indexed
sequential access method), fi iere necesare pentru ODBCDirect.
o Executarea unei aplica ii sau deschiderea unui fi ier dup terminarea instal rii.
291