Sunteți pe pagina 1din 278

Office Automation

Programa cursului
Visual Basic for Applications (VBA) - Notiuni de baza;
o Mediul de programare VBA;
o Fundamentele limbajului: structuri de control, tipuri de date, constante, variabile.
Obiecte. Proprietti. Metode. Colectii.
Principalele obiecte Excel
o Obiectul Application;
o Obiectul Workbook;
o Obiectul Range;
o Evenimente.
Principalele obiecte Word
o Obiectul Application;
o Obiectul Document;
o Obiectul Range;
o Obiectul Selection;
o Obiectul Find, Replacement;
o Evenimente.
Principalele obiecte Access
o Obiectul Application;
o Obiectul Form;
o Obiectul Report.
Meniuri si bare de unelte
o Modificri n proiectare;
o Modificarea programatic;
o Colectia CommandBars.
Ajutor prin Office Assistant.
Data Access Objects (DAO)
o Obiecte DAO;
o Utilizare DAO cu Microsoft Jet;;
o Date ODBC;
o Utilizare DAO cu ODBCDirect;
o Utilizare ODBCDirect.
Controale ActiveX. Dialoguri. Controlarea erorilor.
o Dialoguri personalizate;
o Controale n Word, Excel, PowerPoint;
o Utilizarea programatic a controalelor;
o Controlarea erorilor;
o Testarea programelor.
Documentatie
VBA - Bazele programarii
nstructiunile VBA
Operatiuni de intrare-iesire
Visual Basic Editor
Modele de obiecte
Obiecte Microsoft Word ()
Obiecte Microsoft Word ()
Obiecte Microsoft Word ()
Controale ActiveX si Dialoguri
1
Obiecte Microsoft Excel
Obiecte Microsoft Access
DAO (Data Access Objects) ()
DAO (Data Access Objects) ()
Obiecte Microsoft PowerPoint
Meniuri si bare de unelte
Forme grafice
Conventiile Reddick
2
BAZELE PROGRAMARII Visual Basic for Application (VBA)
ipuri !e !ate
Variabilele si constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate.
Spre deosebire de alte limbaje de programare, exista un tip universal tipul Variant , care poate contine
aproape orice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct
declararea explicita poate fi utilizata atunci cnd se doreste economisirea memoriei (tipul Variant aloca mai
multa memorie), viteza n executie sau atunci cnd se scriu date ntr-un fisier n acces direct.
Boolean
Domeniu !e "alori# True sau False (valorile logice)
Memorie# 2 bytes
Declarator !e tip#
O$ser"atii% 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.
B&te
Domeniu !e "alori# 0255 (numere ntregi, fara semn)
Memorie# 1 byte
Declarator !e tip#
O$ser"atii%
'urrenc&
Domeniu !e "alori# -922 337 203 685 477.5808 922 337 203 685 477.5807
Memorie# 8 bytes
Declarator !e tip# @
O$ser"atii% Utilizate pentru calcule banesti (sau alte situatii n care precizia este foarte
importanta). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obtine 15
cifre la partea ntreaga si 4 cifre la partea zecimala (reprezentare n virgula fixa).
Date
Domeniu !e "alori# 1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59
Memorie# 8 bytes
Declarator !e tip#
3
O$ser"atii% nformatiile de tip data calendaristica si/sau timp orar sunt memorate drept numere
flotante, partea ntreaga reprezentnd data calendaristica, partea fractionara reprezentnd
timpul.
La convertiri, miezul noptii este 0, miezul zilei este .5, numerele negative reprezinta date nainte
de 30 decembrie 1899.
Poate fi atribuit ca valoare de tip date orice literal care reprezinta o data calendaristica
recunoscuta ca atare, literalul trebuind sa fie cuprins ntre simboluri #, de exemplu #1 Jan 99#.
Decimal
Domeniu !e "alori# (vezi observatiile)
Memorie# 12 bytes
Declarator !e tip#
O$ser"atii% Valorile de tip Decimal sunt memorate ca ntregi fara semn nsotiti de un factor de
scala, ntre 0 si 28, specificnd numarul de zecimale. Pentru scala=0 (fara parte zecimala), cea
mai mare valoare posibila este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea
mai mare valoare este +/-7.9228162514264337593543950335 iar cea mai mica valoare nenula
este +/-0.0000000000000000000000000001.
Nota: Deocamdata, tipul Decimal poate fi utilizat doar ca subtip n Variant, adica nu se pot
declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal
prin functia Cdec (functia forteaza o expresie sa fie de un tip specificat, din aceeasi categorie
de functii fiind si CBool, CByte etc.).
Dou$le
Domeniu !e "alori# numere negative de la -1.79769313486232E308 pna la
-4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pna la
1.79769313486232E308 (numere flotante n dubla precizie).
Memorie# 8 bytes
Declarator !e tip# #
O$ser"atii%
Integer
Domeniu !e "alori# -32 768 32 767.
Memorie# 2 bytes
Declarator !e tip# %
O$ser"atii%
Long
4
Domeniu !e "alori# -2 147 483 648 2 147 483 647.
Memorie# 4 bytes
Declarator !e tip# &
O$ser"atii%
O$(ect
Domeniu !e "alori# (vezi observatiile)
Memorie# 4 bytes
Declarator !e tip#
O$ser"atii% Adrese pe 32 de biti care se refera la obiecte. Prin instructiunea Set se atribuie
unei variabile declarate de tip Object referinta la obiectul dorit.
Nota. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o
atasare trzie (la timpul executiei run-time binding). Pentru o atasare timpurie (la timpul
compilarii compile-time binding) se va utiliza o variabila declarata cu numele clasei respective.
)ingle
Domeniu !e "alori# numere negative de la -3.402823E38 pna la -1.401298E-45; numere
pozitive de la 1.401298E-45 pna la 3.402823E38.
Memorie# 4 bytes
Declarator !e tip# !
O$ser"atii%
)tring
Domeniu !e "alori# sir de lungime variabila: pna la 2^31 caractere; sir de lungime fixa: pna
la 2^16 caractere.
Memorie# 2 bytes
Declarator !e tip# $
O$ser"atii% Un sir de lungime fixa declarat Public nu poate fi utilizat ntr-un modul de clasa.
Variant (!efault)
Domeniu !e "alori# aceleasi cu domeniile specificate la tipurile precedente si care pot fi
subtipuri ale tipului Variant, cu mentiunea ca toate subtipurile numerice au domeniul de la
Double.
5
Memorie# n functie de subtipul valorii: valorile numerice ocupa 16 bytes, valorile de tip String
necesita 22 bytes plus cte un byte pentru fiecare caracter.
Declarator !e tip#
O$ser"atii% Este tipul specificat implicit (n lipsa unei declaratii explicite) pentru o constanta,
variabila, sau argument (caz care, desi nerecomandat, poate elimina erorile provocate de
diferentele de tip ale argumentelor la apelul procedurilor).
Cu exceptia datelor de tip String cu lungime fixa si a datelor cu tipuri definite de utilizator, tipul
Variant poate contine orice alt tip de data. n plus poate sa contina valorile speciale Empty,
Error, Nothing si Null. Tipul considerat pentru o data continuta ntr-un Variant poate fi
determinat cu functia VarType sau TypeName.
Valorile unei variabile Variant pot sa-si converteasca valorile automat. n general, datele
numerice sunt memorate n tipul de origine, dar este posibil ca ele sa fie promovate la tipul
superior daca rezultatul unei operatii necesita acest fapt. De exemplu o valoare declarata initial
drept nteger si atribuita unui Variant va fi memorata ca un ntreg pna cnd, ridicnd-o de
exemplu la o putere, valoarea ei excede domeniul tipului nteger. n acest caz are loc
promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). Daca
depasirea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va
semnala eroare.
Utilizarea tipului Variant permite o tratare mai diferentiata a sirurilor de cifre: n operatii
numerice vor fi considerate numere iar n operatii cu siruri vor fi considerate siruri.
Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite.
Valorile speciale au semnificatia:
o Empty este valoarea unui Variant care nu a fost initializat. n calcule numerice este considerat 0
iar n operatii cu siruri este sirul de lungime zero.
o Null este valoarea unui Variant care, n mod programatic, nu contine date.
o Error este valoarea utilizata pentru a arata ndeplinirea unei conditii de eroare (prin convertirea
unui real cu functia CVErr). Procesarea se va efectua de catre utilizator, tratarea automata a
erorilor nu este activata la setarea acestor valori.
o Nothing este utilizata pentru disocierea unei variabile de tip Object de un obiect efectiv.
ipuri !efinite !e utili*ator
Un tip de data definit de utilizator reprezinta echivalentul unei nregistrari dintr-un fisier (baza de date), adica o
grupare de entitati de tipuri diferite. Definirea are loc la nivel de modul, prin instructiuni Type. Pentru clauzele
care apar se va vedea discutia de la domeniul variabilelor.
+Pri"ate , Pu$lic- &pe varname
elementname +(+subscripts-)- As type
+elementname +(+subscripts-)- As type-
% % %
En! &pe
6
unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot
utiliza si componente de tipuri utilizator deja definite. Componentele pot fi si tablouri, caz n care apar definitiile
specifice (vezi declararea variabilelor).
Declararea constantelor. "aria$ilelor si ta$lourilor
/ume
La denumirea procedurilor, constantelor, variabilelor si argumentelor ntr-un modul Visual Basic
se cere respectarea urmatoarelor reguli:
primul caracter trebuie sa fie o litera;
nu se utilizeaza spatiu, punct (.), semnul exclamarii(!), sau caracterele @, &, $, #
lungimea denumirii nu poate depasi 255 de caractere;
la acelasi nivel de existenta nu pot sa existe denumiri identice. Pot sa existe totusi, n acelasi modul, o
variabila privata si o variabila la nivel de procedura care sa poarte acelasi nume.
n general, nu se recomanda definirea unor denumiri identice cu nume de functii, instructiuni sau metode
existente n Visual Basic. Daca s-a ajuns totusi la aceasta situatie, atunci utilizarea functiei intrinseci limbajului,
a instructiunii sau metodei care intra n conflict cu un nume asignat necesita calificarea ei n raport de
biblioteca asociata. De exemplu, VBA.Left este apelul la functia Left atunci cnd este definita de utilizator si o
variabila Left. Nota. Visual Basic nu este case-sensitive, deci denumirea unei entitati nu are ca atribut distinctiv
capitalizarea literelor, dar mediul de programare VBA pastreaza capitalizarea din instructiunea unde este
definit un nume.
Declararea constantelor
Definirea unei constante se realizeaza prin instructiunea Const, n care se poate specifica tipul, domeniul si
valoarea constantei. Valoarea unei constante nu se poate schimba programatic.
+Pu$lic , Pri"ate- 'onst constname +As type- 0 expression
Public cuvnt cheie, optional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din toate modulele. Nu este permis n proceduri.
Private cuvnt cheie, optional, utilizat la nivel de modul pentru a declara constante recunoscute n toate
procedurile din modulul n care apare declaratia. Nu este permis n proceduri.
constname numele constantei (obligatoriu).
type tipul constantei: Byte, Boolean, nteger, Long, Currency, Single, Double, Decimal (nca nu este
suportat), Date, String, sau Variant. Fiecare constanta presupune o clauza As type proprie; n lipsa clauzei se
va atasa automat tipul cel mai apropiat expresiei.
expression combinatie de identificatori, constante, operatori (cu exceptia s) care produce un sir, numar sau
obiect. Nu se pot utiliza variabile, functii utilizator sau functii VBA predefinite.
n mod implicit, constantele sunt private. La nivel de procedura, sau de modul clasa, domeniul lor nu poate fi
modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificata prin Public.
Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n
afara unei proceduri este definita n modulul respectiv.
7
Mai multe declaratii de constante pot fi scrise pe o aceeasi linie, separate prin virgule la nivel de atribuiri de
expresii. n acest caz, cuvintele Public sau Private care apar se aplica ntregii linii.
E1emple
Const NrLinii = 15
Public Const Mesajnitial = "Tastati numarul de linii"
Private Const NrLinii as nteger = 15
Public Const NrLinii = 15, Pondere as Single = 1.21
Este de remarcat ca, n ultima linie, doar Pondere este de tip Single, n timp ce NrLinii este de tip nteger (n
lipsa clauzei As type se atribuie tipul expresiei).
Declararea "aria$ilelor
Variabilele, simple sau tablou, se definesc prin instructiunile Dim, Private, Public, ReDim sau Static. Numele
unei variabile trebuie sa 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 contine instructiunea Option Explicit cu sintaxa
Option E1plicit
si care trebuie sa apara naintea oricarei proceduri din modul, toate variabilele trebuie sa fie declarate prin
instructiunile mentionate. Lipsa instructiunii Option Explicit permite ca variabilele sa fie definite acolo unde este
nevoie de ele prin simpla mentionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceasta ultima
posibilitate poate produce erori greu detectabile.
Sintaxa instructiunilor de declarare a variabilelor este urmatoarea si se observa asemanarea clauzelor.
Dim +2it3E"ents- varname+(+subscripts-)- +As +/e4- type-
Pri"ate +2it3E"ents- varname+(+subscripts-)- +As +/e4- type-
Pu$lic +2it3E"ents- varname+(+subscripts-)- +As +/e4- type-
)tatic varname+(+subscripts-)- +As +/e4- type-
ReDim +Preser"e- varname(subscripts) +As type-
varname numele variabilei (obligatoriu).
subscripts dimensiunile tabloului de date (daca se declara o variabila tablou). Pot exista pna la 60 de
indici, separati prin virgule, declararea dimensiunilor pentru un indice fiind de forma
[lower o] upper
Limita inferioara este, implicit, 0, dar poate fi controlata prin instructiunea Option Base.
8
Daca nu se indica limitele indicilor (dar parantezele sunt prezente), se defineste o variabila
tablou dinamica (nu si prin )tatic) ale carei dimensiuni pot fi precizate/redefinite prin
instructiunea ReDim.
New permite crearea implicita a unui obiect (atunci cnd se declara o variabila de tip obiect). O noua
instanta a obiectului este creata la prima referinta a variabilei definite. Clauza nu poate sa apara la declararea
variabilelor de tipuri intrinseci si nici la declararea instantelor obiectelor dependente.
type tipul variabilei definite: Byte, Boolean, nteger, Long, Currency, Single, Double, Decimal (nesuportat
nca), Date, String (pentru siruri cu lungime variabila), String * length (pentru siruri cu lungime fixa), Object,
Variant, tip utilizator sau tip de obiect.
Daca se definesc mai multe variabile ntr-o instructiune, definitiile se separa prin virgula iar clauza de tip nu
este extinsa si la variabilele definite ulterior.
Desi toate instructiunile permit declararea unor variabile (simple sau tablou), fiecare instructiune are un efect
distinct n ceea ce priveste vizibilitatea variabilelor si persistenta valorilor.
Dim defineste variabile att la nivel de modul ct si la nivel de procedura. Variabilele definite la nivel de
modul sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedura sunt vizibile
doar n procedura respectiva.
Private este utilizata la nivel de modul pentru a declara variabile accesibile doar n procedurile acelui
modul.
Public este utilizata pentru a declara variabile accesibile n toate procedurile din toate modulele si din
toate aplicatiile. Prin includerea instructiunii Option Private Module este posibil ca variabilele publice sa
fie vizibile doar n proiectul n care sunt definite.
Static este utilizata la nivel de procedura nestatica pentru a declara variabile care si pastreaza
valoarea de la o executie a procedurii la alta, att timp ct modulul n care apare procedura nu este
resetat sau repornit. Variabilele definite prin Static sunt vizibile doar n procedura respectiva. Este de
remarcat ca se poate defini o ntreaga procedura utiliznd clauza Static (vezi definirea procedurilor),
caz n care toate variabilele sunt statice.
ReDim este utilizata la nivel de procedura pentru realocarea memoriei variabilelor tablou dinamice.
Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni si pastreaza valorile deja
existente. (Pentru detalii vezi si VBA Help).
E1emple
Dim x As Double, ColtStanga As nteger
Private , 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
9
Proce!uri
Printr-o procedura se ntelege, similar altor limbaje de programare, o multime de instructiuni care este
identificata printr-un nume si care se executa unitar printr-un singur apel. Ar trebui, pentru claritatea
programului, ca o procedura sa efectueze o prelucrare unitara identificabila n logica programului.
Exista trei tipuri principale de proceduri: Sub, Function si Property. Ultimul tip este caracteristic definirii unui
obiect si va fi prezentat ulterior. O procedura de tip Sub poate primi si transmite informatii prin intermediul unor
variabile publice sau/si a unor parametri. Numele procedurii nu are atasata nici o valoare. O procedura de tip
Function se deosebeste prin aceea ca numele procedurii are atasata o valoare (valoarea functiei) si poate fi
utilizat ca orice alta variabila din proiect.
O$ser"atie% Orice instructiune executabila trebuie sa apartina unei proceduri. Declaratiile pot sa apara si n
afara procedurilor, la nivel de modul.
Proce!uri )u$
Organizarea generala a unei proceduri de tip Sub este
+Pri"ate , Pu$lic- +)tatic- )u$ name (+arglist-)
+instructiuni-
+E1it )u$-
+instructiuni-
En! )u$
Public, Private, Static determina vizibilitatea procedurii. Public = vizibila pentru toate procedurile si toate
modulele (n functie de Option Private se defineste vizibilitatea pentru alte proiecte). Private = vizibila doar
pentru procedurile din modulul unde procedura este declarata. Static = arata ca toate variabilele locale si
pastreaza valorile ntre apeluri.
name numele procedurii.
arglist lista de argumente, separate prin virgule.
Prin instructiunea Exit Sub se poate iesi din procedura si altminteri dect prin linia finala.
Argumentele se definesc dupa sintaxa:
+Optional- +B&Val , B&Ref- +ParamArra&- varname+( )- +As type- +0 defaultvalue-
Optional arata ca parametrul nu este obligatoriu. Parametrii optionali trebuie sa fie grupati la sfrsitul listei
(aparitia clauzei Optional cere ca toti parametrii care urmeaza sa aiba aceeasi clauza).
ByVal arata ca apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este
regasita dupa parasirea procedurii, calculele efectundu-se pe o copie a parametrului).
ByRef arata ca apelul paramatrului se face prin referinta (orice modificare a valorii transmise este regasita
dupa parasirea procedurii). Acesta este modul implicit de transmitere a parametrilor.
10
ParamArray folosit doar ca ultim argument n lista, denota un tablou Optional de elemente de tip Variant.
Clauza ParamArray permite definirea unui numar arbitrar de parametri. ParamArray nu poate fi utilizat
mpreuna cu ByVal, ByRef, sau Optional.
varname numele argumentului. Daca este tablou se vor indica parantezele.
type tipul parametrului transmis: Byte, Boolean, nteger, Long, Currency, Single, Double, Decimal, Date,
String (doar lungime variabila), Object, Variant. Pentru parametrii obligatorii (fara Optional) poate fi si un tip
definit sau de obiect.
defaultvalue defineste valoarea implicita pentru argumentele optionale. Poate fi orice expresie, dar pentru
tipul Object se admite doar Nothing.
Apelul unei proce!uri )u$
Pentru a executa o procedura de tip Sub din alta procedura (vezi si discutia privind vizibilitatea) se
mentioneaza, pe o linie separata, numele procedurii urmat sau nu de parametri. Daca este necesar, datorita
apelarii unui alt proiect sau modul, atunci apelul este dupa modelul:
Nume_proiect%Nume_modul%Nume_procedura lista de argumente
unde lista de argumente poate sau nu sa fie inclusa ntre paranteze. Argumentele efective sunt separate n
lista prin virgule si trebuie sa respecte ordinea (si tipul) argumentelor din definitia procedurii. n cazul
procedurilor cu multe argumente, dintre care multe optionale, transferul poate provoca erori de scriere a
codului (un argument optional necesita totusi virgula sa, de unde o numarare atenta a virgulelor etc.). Pentru
asemenea situatii (n special) se permite si transferul valorilor prin intermediul tehnicii de argumente denumite.
Aceasta se realizeaza alcatuind lista de argumente, la apelul procedurii, din intrari de forma
nume_argument#0valoare_argument
separate prin virgule si la care nu mai conteaza ordinea initiala a argumentelor. Se vor specifica doar
parametrii care se transmit efectiv (adica valorile optionale dorite si toate valorile neoptionale).
Pentru apelul unei proceduri se va studia si instructiunea Call.
Proce!uri 5unction
O procedura de tip Function este similara, ca definitie, unei proceduri Sub, dar are particularitatea ca
returneaza o valoare prin numele sau (care se comporta deci ca o variabila).
+Pu$lic , Pri"ate- +)tatic- 5unction name [(arglist)] +As type-
[statements]
[name = expression]
+E1it 5unction-
[statements]
[name = expression]
En! 5unction
11
Este de remarcat ca se poate atasa un tip numelui functiei (adica valorii functiei) si se va remarca existenta
instructiunilor prin care se atribuie functiei valorile calculate.
Valoarea returnata de o functie poate fi utilizata ntr-o alta expresie prin includerea numelui functiei urmat,
ntre paranteze, de valorile efective ale parametrilor.
Daca apelul se face prin intermediul instructiunii Call, valoarea functiei nu poate fi utilizata. n asemenea
situatii se activeaza de fapt doar prelucrarile colaterale (care, pentru claritatea codului, nici nu sunt
recomandate).
E1emple !e proce!uri
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
Dim cilBaza As Single, cilLaterala As Single
cilBaza = Pi*raza^2
cilLaterala = 2*Pi*raza*inaltime
cilAria = 2*cilBaza + cilLaterala
End
Apelul functiei poate fi ntr-o instructiune de genul
CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar
n timp ce apelul subrutinei poate fi
AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa
Organi*area generala a unui proiect VBA
12
Obiectele si prelucrarile necesare realizarii unei aplicatii VBA (presupunnd ca se doreste 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 prelucrarile proiectate n VBA sunt atasate documentelor (actiunilor) unor aplicatii particulare (Word,
Excel etc.), proiectele sunt salvate o data cu documentele pe care le nsotesc. Acest fapt nu reduce aria de
probleme abordabile ntruct prelucrarile propriu-zise nu sunt limitate la documentul nsotit (se poate deschide
astfel un document Word alb si sa se efectueze orice prelucrare dorita, fara a avea obligatia de a scrie ceva n
documentul deschis).
ntr-un proiect VBA sunt identificabile urmatoarele componente:
Module standard (denumite initial module de cod). Contin declaratii si proceduri generale. Exista de
asemenea si module care contin tratarea evenimentelor specifice documentului de care este atasat
proiectul.
Module de clasa. Contin definirea obiectelor create de utilizator.
Forme. Contin definitiile dialogurilor din interfata proiectata de utilizator ca si codul program necesar
controlarii dialogurilor.
Referinte. ntr-un proiect este mentinuta lista altor proiecte, care sunt referite n proiectul curent.
Un modul de cod poate ncepe cu o sectiune de declaratii. Prin declaratii ntelegem instructiuni neexecutabile
prin care se definesc constante, variabile si proceduri externe. Utiliznd Public, Static, Private se precizeaza si
domeniul de vizibilitate a entitatilor definite.
Gestionarea (crearea, editarea, stergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului
VBA, care este prezentat ntr-o sectiune separata.
Domeniul unei "aria$ile. constante sau proce!uri
Domeniul unei entitati reprezinta multimea instructiunilor unde poate fi referita acea entitate. Se poate vorbi
astfel de vizibilitatea unei entitati. Domeniul este dependent de locul definirii entitatii, de clauzele care apar la
definire si de parametrii globali ai proiectului.
/ota% Este de remarcat ca utilizarea unei denumiri n afara domeniului initial prefigurat produce,
n lipsa instructiunii Option Explicit, crearea unei noi entitati, fara nici o legatura cu cea
precedenta, sursa de erori greu detectabile. Acesta este motivul pentru care se recomanda
declararea explicita a tuturor variabilelor.
Exista trei tipuri de domenii:
o la nivel de procedura;
o la nivel de modul, privat;
o la nivel de modul, public.
/i"elul proce!ura
O variabila sau constanta definita ntr-o procedura este vizibila doar n procedura respectiva. Daca o
asemenea entitate trebuie referita si n alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau
se va transmite procedurii prin intermediul argumentelor.
/i"el !e mo!ul. pri"at
13
Variabilele si constantele definite la nivel de modul (n sectiunea Declarations) sunt Private n mod implicit,
adica sunt vizibile doar n modulul respectiv. Utilizarea clauzei Private nu este deci necesara, dar este
recomandata.
/ota% Daca se utilizeaza instructiunea Option Private Module (n sectiunea Declarations a modulului) atunci
variabilele si procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declaratii, procedurile
publice (din toate modulele standard sau clasa) sunt vizibile n toate proiectele care se refera la proiectul
curent. Procedurile, variabilele si constantele publice din alte module (cum ar fi modulele atasate formelor)
sunt Private pentru proiectul de definitie, deci ele nu sunt accesibile proiectelor care se refera la proiectul unde
sunt declarate.
/i"el !e mo!ul. pu$lic
Variabilele declarate la nivel de modul drept Public sunt vizibile n toate procedurile din proiect. Procedurile
sunt publice n mod implicit, cu exceptie procedurilor de tratare a evenimentelor, care sunt Private n mod
implicit. A se vedea si nota anterioara.
Viata unei "aria$ile
Prin viata unei variabile se ntelege timpul ct variabila are o valoare. Este evident ca valoarea unei variabile
se poate modifica pe durata vietii sale, dar definitoriu este faptul ca variabila are o anumita valoare pe ntreaga
durata a vietii sale. La parasirea domeniului, variabila "moare" si nu mai are atasata o valoare.
La nceputul executiei unei proceduri, toate variabilele sunt initializate:
Variabila numerica 0 (zero)
Sir de lungime variabila "" (sir de lungime zero)
Sir de lungime fixa Completat cu caracterul
Chr(0) (avnd codul ASC
0)
Variabila Variant Empty
Variabile de tip utilizator fiecare element este
initializat separat, potrivit
tipului primar
Variabila Object Nothing (pna la asignarea
unei referinte prin Set)
Variabilele care nu sunt modificate si pastreaza valoarea initiala.
Variabilele declarate prin Dim la nivel de procedura au valoare pna la terminarea executiei procedurii (chiar
daca se trece prin apel n alte proceduri).
Variabilele declarate prin Static, la nivel de procedura, au aceeasi viata ca si variabilele declarate la nivel de
modul si si pastreaza valoarea pna la terminarea executiei codului (inclusiv de la un apel la altul). ncluderea
clauzei Static n instructiunea Sub sau Function are ca efect declararea tuturor variabilelor definite n
procedura respectiva drept variabile statice (deci care si pastreaza valorile ntre apeluri).
14
Variabilele declarate la nivel de modul standard si pastreaza valoarea pe tot timpul executiei. Variabilele
declarate la nivel de modul clasa si pastreaza valoarea att timp ct exista o instanta a clasei. Diferenta fata
de variabilele Static este aceea ca memoria este utilizata permanent (nu se elibereaza la parasirea
domeniului).
Varia$ile O$(ect
Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object
Dim myDoc As Object
sau specificnd exact numele de clasa dintr-o biblioteca de obiecte referita
Dim myDoc As Word.Document
n primul mod de definire (ca Object) nu se poate efectua la momentul compilarii existenta obiectului, nu se
poate verifica utilizarea corecta a proprietatilor si metodelor obiectului si nu se poate lega aceasta informatie
de variabila obiect definita. Atasarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul
executiei si se efectueaza prin instructiunea Set.
Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai
rapida, se face la momentul compilarii si poate nlatura mai rapid erori posibile n utilizarea metodelor si
proprietatilor obiectului.
nstructiunea Set are sintaxa:
)et objectvar = 6+/e4- objectexpression | /ot3ing7
unde
o objectvar este numele variabilei (sau proprietatii)
o New permite crearea unei noi instante a clasei
o Objectexpression este o expresie constnd n numele unui obiect, alta variabila declarata de
acelasi tip obiect, sau functie ori metoda care returneaza un obiect de acelasi tip obiect
o Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem si de
memorie utilizate.
n general, atunci cnd se utilizeaza Set pentru a asigna o referinta de obiect la o variabila, nu se creeaza o
copie a obiectului pentru acea variabila. Este creata doar o referinta la obiect. Astfel, mai multe variabile de tip
obiect pot sa se refere la acelasi obiect: orice schimbare a obiectului se va reflecta n toate variabilele care
refera obiectul. Utiliznd clauza New se va crea efectiv o copie (instanta) a obiectului.
E1emple
Prin urmatoarele doua instructiuni se defineste variabila objWord care este legata trziu de o aplicatie Word:
Dim objWord As Object
Set obhWord = CreateObject("Word.Application")
Legarea timpurie se poate efectua prin
Dim objWord As Word.Application
15
Este de remarcat ca instructiunea Set apeleaza o functie care creeaza si returneaza o referinta la un obiect
ActiveX.
'onstante pre!efinite ($uilt8in)
Bibliotecile de obiecte din fiecare aplicatie Office furnizeaza o multime de constante predefinite, care pot fi
utilizate pentru a stabili proprietati sau pentru a transmite argumente catre proprietati sau metode. Constantele
sunt, de regula, grupate n tipuri enumerate care reprezinta valorile posibile pentru o proprietate specifica.
Desi este posibila sa se utilizeze valoarea numerica a constantei este recomandat sa se utilizeze constanta
numita ntruct dezvoltari ulterioare ale mediului Microsoft Office (ca si ale aplicatiilor din Visual Studio) tind sa
pastreze compatibilitatea ntre denumirile constantelor si nu ntre valorile efective.
De exemplu se prefera
Application.DisplayAlerts = wdAlertAll
n loc de
Application.DisplayAlerts = -1
pentru a fixa ca Word sa afiseze toate mesajele de alerta la executia unei proceduri. Codul scris astfel este si
mai explicit.
16
I/)R9'I9/ILE VBA
Generalitati
Exista trei categorii de instructiuni Visual Basic:
instructiuni de declarare (prezentate la declararea variabilelor) prin care se denumesc si se declara
tipul pentru variabile, constante si proceduri;
instructiuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau
constantelor;
instructiuni executabile (prezentate n continuare) care initiaza actiuni: executa metode sau proceduri,
controleaza fluxul executiei codului.
n mediul de dezvoltare VBA, sintaxa instructiunilor este verificata automat dupa ce se trece la instructiunea
urmatoare (prin Enter).
'ontinuarea instructiunilor
O instructiune poate sa fie scrisa pe mai multe linii prin utilizarea caracterului de continuare a liniei "_"
precedat de un spatiu. De exemplu, crearea prin program a unui tabel ntr-un document Word:
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=3, _
NumColumns:= 3
unde, pe lnga continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de
adaugare a unui nou tabel la colectia de tabele a documentului.
Doua instructiuni pot fi scrise pe o aceeasi linie daca sunt separate cu caracterul ":".
Etic3etarea liniilor
O linie poate fi identificata:
printr-o eticheta: orice nume, care respecta regulile generale, care ncepe n prima coloana a liniei si se
termina cu caracterul ":"
printr-un numar: orice combinatie de cifre, care ncepe n prima coloana a liniei si este unic n modulul
respectiv.
dentificatorii de linii pot fi utilizati n instructiuni de control, desi codul astfel construit nu respecta regulile
programarii structurate..
'omentarii
Textele explicative (necesare documentarii codului) pot fi introduse pe linii separate sau n continuarea liniei
de cod.
O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Rem urmat de un spatiu.
Comentariul de pe aceeasi linie cu o instructiune se introduce printr-un apostrof urmat de comentariu.
17
Operatori
n formarea expresiilor de diverse tipuri, operatorii sunt cei utilizati aproape general n limbajele de programare
de nivel nalt. Pentru fixarea termenilor si notatiilor sunt totusi prezentati, pe categorii, nsotiti, acolo unde este
cazul de scurte explicatii.
Operatori aritmetici
Operator )emnificatie O$ser"atii
^ Ridicarea la
putere
rezultatul este Double sau Variant(Double)
cu exceptia: daca un operand este Null,
rezultatul este tot Null
* nmultirea rezultatul este dat de cel "mai precis" factor,
ordinea crescatoare a "preciziei" fiind, pentru
nmultire, Byte, nteger, Long, Single,
Currency, Double si Decimal. Daca o
expresie este Null, rezultatul este Null. O
expresie Empty este considerata ca 0.
Pentru exceptii se va studia Help
*(operator).
/ mpartirea rezultatul este, n general, Double sau
Variant(Double). Daca o expresie este Null,
rezultatul este Null. O expresie Empty este
considerata ca 0. Pentru exceptii se va
studia Help /(operator).
\ mpartirea
ntreaga
nainte de mpartire, operanzii sunt rotunjiti la
Byte, nteger sau Long. Rezultatul este Byte,
Variant(Byte), nteger, Variant (nteger),
Long, sau Variant(Long). Daca o expresie
este Null, rezultatul este Null. O expresie
Empty este considerata ca 0.
Mod Restul
mpartirii
operanzii sunt rotunjiti la ntregi si se obtine
restul mpartirii. Rezultatul este Byte,
Variant(Byte), nteger, Variant (nteger),
Long, sau Variant(Long). Daca o expresie
este Null, rezultatul este Null. O expresie
Empty este considerata ca 0.
+ Adunarea
numerica sau
concatenarea
sirurilor
n general, operanzi numerici produc
adunarea, iar operanzi siruri produc
concatenarea. n cazul numeric, rezultatul
este de tipul cel "mai precis" al operanzilor,
ordinea de "precizie" fiind pentru adunare si
scadere: Byte, nteger, Long, Single, Double,
Currency si Decimal. Deoarece operanzii pot
fi orice expresie, pentru o informare
completa (de exemplu operanzi Variant) se
va studia Help +(operator).
18
- Scaderea sau
inversarea
semnului
operanzii pot fi doar numerici. Rezultatul
este de tipul cel "mai precis" al operanzilor,
ordinea de "precizie" fiind pentru adunare si
scadere: Byte, nteger, Long, Single, Double,
Currency si Decimal. Daca o expresie este
Null, rezultatul este Null. O expresie Empty
este considerata ca 0. Pentru exceptii se va
studia Help -(operator).

Operatori !e comparare
Relatiile care exista ntre diferite tipuri de entitati se pot evidentia prin comparatii avnd una dintre formele
urmatoare:
result = expression1 comparisonoperator expression2
result = object1 Is object2
result = string Li:e pattern
unde
result este o variabila numerica
expression este o expresie oarecare
comparisonoperator este un operator relational
object este un nume de obiect
string este o expresie sir 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 (daca este adevarata relatia), False (daca relatia este neadevarata), Null (daca cel putin
un operand este Null).
Operatorul Is produce True daca variabilele se refera la acelasi obiect si False n caz contrar.
Operatorul Li:e compara doua siruri cu observatia ca al doilea tremen este un sablon. Prin urmare rezultatul
este True daca primul sir operand este format dupa sablon, False n caz contrar. Atunci cnd un operand este
Null, rezultatul este tot Null.
Comportarea operatorului Like depinde de instructiunea Option Compare, care poate fi:
Option Compare Binary, ordinea este cea a reprezentarii interne binare, determinata n Windows de
codul de pagina.
19
Option Compare Text, compararea este insenzitiva la capitalizarea textului, ordinea este determinata
de setarile locale ale sistemului.
Constructia sablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere:
? un caracter oarecare
* oricte caractere (chiar nici unul)
# o cifra oarecare (09).
[charlist] oricare dintre caracterele enumerate n lista, un domeniu de litere poate fi dat prin utilizarea cratimei.
[!charlist] orice caracter care nu este n lista
Observatie. Pentru a utiliza n sablon caracterele speciale cu valoare de wildcard se vor utiliza constructii de
tip lista: [[], [?] etc. Paranteza dreapta va fi indicata singura: ].
Pentru alte observatii utile se va studia Help Like operator.
Operatori !e concatenare
Pentru combinarea sirurilor de caractere se pot utiliza operatorii & si +.
n sintaxa
expression1 & expression2
unde operanzii sunt expresii oarecare, rezultatul este
de tip String, daca ambii operanzi sunt String
de tip Variant(String) n celelalte cazuri
Null, daca ambii operanzi sunt Null.
nainte de concatenare, operanzii care nu sunt siruri se convertesc la Variant(String). Expresiile Null sau
Empty sunt tratate ca siruri de lungime zero ("").
Operatori logici
Pentru operatiile logice sunt utilizati urmatorii operatori, uzuali n programare.
Operator )emnificatie O$ser"atii
And conjunctia logica Null cu False da False, Null cu True sau cu Null
da Null. Operatorul And realizeaza si operatia de
conjunctie bit cu bit pentru expresii numerice.
Eqv echivalenta
logica
Daca o expresie este Null, rezultatul este Null.
Eqv realizeaza si compararea bit cu bit a doua
expresii numerice, pozitionnd cifrele binare ale
rezultatului dupa regulile de calcul ale
echivalentei logice: 0 Eqv 0 este 1 etc.
20
mp implicatia logica True mp Null este Null, False mp * este True,
Null mp True este True, Null mp False (sau
Null) este Null. Operatorul mp realizeaza si
compararea bit cu bit a doua expresii numerice,
pozitionnd cifrele binare ale rezultatului dupa
regulile de calcul ale implicatiei logice: 1 mp 0
este 0, n rest rezultatul este 1.
Not negatia logica Not Null este Null. Prin operatorul Not se poate
inversa bit cu bit valorile unei variabile,
pozitionndu-se corespunzator un rezultat
numeric.
Or disjunctia logica Null Or True este True, Null cu False (sau Null)
este Null. Operatorul Or realizeaza si o
comparatie bit cu bit a doua expresii numerice
pozitionnd bitii corespunzatori ai rezultatului
dupa regulile lui Or logic.
Xor disjunctia
exclusiva
Daca un operand este Null, atunci rezultatul este
Null. Se poate efectua operatia de sau exclusiv
si bit cu bit pentru doua expresii numerice
[b1+b2(mod 2)].
Instructiuni !e atri$uire
Atribuirea se poate efectua prin instructiunea Let (pentru valori atribuite variabilelor si proprietatilor), Set
(pentru atribuirea de obiecte la o variabila de tip obiect), Lset si Rset (pentru atribuiri speciale de siruri sau
tipuri definite de utilizator).
Instructiunea Let
Atribuie valoarea unei expresii la o variabila sau proprietate.
+Let- varname 0 expression
unde varname este nume de variabila sau de proprietate.
Este de remarcat forma posibila (si de fapt general utilizata) fara cuvntul Let.
O$ser"atii. Valoarea expresiei trebuie sa fie compatibila ca tip cu variabila (sau proprietatea): valori numerice
nu pot fi atribuite variabilelor de tip String si nici reciproc.
Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect daca valoarea expresiei
Variant poate fi interpretata compatibila cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip
String (cu exceptia 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 efectuata doar daca ambii termeni au acelasi tip definit. Pentru alte
situatii se va utiliza instructiunea Lset.
21
Nu se poate utiliza Let (cu sau fara cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n
aceasta situatie instructiunea Set.
Instructiunea L)et
Copie, cu aliniere la stnga, un sir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Deoarece copierea este binara, poate fi utilizata 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
L)et stringvar 0 string
L)et varname1 0 varname2
unde
stringvar, string reprezinta variabila de tip String si expresia de acelasi tip implicate ntr-o atribuire de siruri.
varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instructiunea Type) diferite.
Zona de memorie alocata celei de a doua variabile este copiata (aliniata la stnga) n zona de memorie a
primei variabile.
Caracterele care ramn neocupate se completeaza cu spatii, iar daca zona de unde se copie este mai mare,
caracterele din dreapta se pierd (sunt trunchiate).
Instructiunea L)et
Copie, cu aliniere la dreapta, un sir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.
Sintaxa este
R)et stringvar 0 string
Caracterele ramase neocupate n variabila sunt completate ccu spatii. nstructiunea RSet nu se poate utiliza
(analog lui LSet) pentru tipuri definite de utilizator.
Instructiuni e1ecuta$ile
Executia unui program are loc, n lipsa oricarui control, instructiune cu instructiune, de la stnga la dreapta si
de sus n jos. Acest sens poate fi modificat, ntr-o oarecare masura, prin ordinea de precedenta a operatiilor n
evaluarea expresiilor. Este evident ca o asemenea structura simpla nu poate cuprinde toate aspectele
programarii si din acest motiv necesitatea structurilor de control a fluxului executiei. Unele instructiuni au fost
pastrate doar din motive de compatibilitate cu versiunile initiale ale limbajului, n locul lor fiind preferate
structuri mai evoluate sau similare altor limbaje de programare.
Instructiuni !e transfer (Go)u$;Return. Goo. OnError.
On;Go)u$. On;Goo)
Aceasta categorie cuprinde instructiunile prin care controlul executiei este transferat la o alta instructiune din
procedura. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul
programarii structurate) si prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de
programare.
22
Go)u$;Return
n cadrul unei proceduri un grup de instructiuni poate fi organizat ca o subrutina (similar unei proceduri on-line,
nenumite) identificata prin linia de nceput. Transferul controlului la acest grup de instructiuni si revenirea la
locul apelului se poate efectua prin GoSub.Return cu sintaxa
Go)u$ line
...
line
...
Return
unde line este o eticheta de linie sau un numar de linie din aceeasi procedura.
Pot exista mai multe instructiuni Return, prima executata produce saltul la instructiunea care urmeaza celei
mai recente instructiuni GoSub executate.
Goo
Realizeaza tranferul controlului executiei la o linie din aceeasi procedura.
Goo line
unde line este o eticheta de linie sau un numar de linie din aceeasi procedura.
On Error
Permite controlul erorilor prin transferul controlului la rutine de tratare.
O$ser"atie% Este prezentata n sectiunea dedicata controlului erorilor.
On;Go)u$. On;Goo
Permit o ramificare multipla, dupa valoarea unei expresii. Se recomanda, pentru claritatea codului, utilizarea
structurii Select Case n locul acestor structuri.
On expression Go)u$ destinationlist
On expression Goo destinationlist
unde
expression este o expresie numerica avnd valoare ntreaga (dupa o eventuala rotunjire) ntre 0 si 255
inclusiv.
destinationlist este o lista de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de
ambele categorii), din aceeasi procedura cu instructiunea.
Daca valoarea expresiei este negativa sau mai mare dect 255 se produce o eroare.
23
Daca valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfera controlul la linia
identificata de al k-lea element al listei.
Daca valoarea expresiei este 0 sau mai mare dect numarul de elemente din lista, transferul se efectueaza la
linia care urmeaza instructiunea On...GoSub sau On...GoTo.
Instructiuni de terminare sau oprire a programului
(DoEvents, End, Exit, Stop)
Terminarea executiei programului sau oprirea temporara (pauza) se pot realiza prin instructiunile enumerate
aici.
DoE"ents
Desi nu este o instructiune VBA ci este o functie, includerea ei este naturala prin aceea ca permite cedarea
controlului catre sistemul de operare, care poate astfel sa functioneze n regim de multitasking. Actiunea poate
fi realizata si prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este
DoE"ents( )
Functia returneaza, n general, valoarea 0.
Controlul este redat programului dupa ce sistemul de operare a terminat procesarea evenimentelor din coada
de evenimente, ca si procesarea tuturor caracterelor din coada SendKeys.
O$ser"atie. Pentru alte observatii se va studia documentatia comenzii DoEvents.
En!
Termina executia unei proceduri (sub forma prezentata aici) sau indica sfrsitul codului unei structuri de tip
bloc (cum ar fi End Function, End f etc., prezentate la structurile respective).
Sintaxa, n ipostaza opririi executiei, este:
En!
Prin aceasta instructiune, care poate fi plasata oriunde n program, executia este terminata imediat, fara a se
mai executa eventualele instructiuni scrise pentru tratarea unor evenimente specifice sfrsitului de program
(Unload, Terminate etc.).
Fisierele deschise prin Open sunt nchise si toate variabilele sunt eliberate. Obiectele create din modulele
clasa sunt distruse, iar referintele din alte aplicatii la asemenea obiecte sunt invalidate. Memoria este
eliberata.
E1it
Prin instructiunea Exit, sub una din multiplele ei forme, se ntrerupe o ramura de executie (cum ar fi o
procedura, o structura iterativa etc.) pentru a se continua nivelul apelant. Sintaxa este
E1it Do
E1it 5or
24
E1it 5unction
E1it Propert&
E1it )u$
si efectele sunt prezentate la structurile respective. Nu trebuie confundata cu instructiunea End.
)top
Efectul instructiunii este dependent de modul de executiei a programului. Daca se executa varianta compilata
a programului (fisierul .exe) atunci instructiunea este similara instructiunii End (suspenda executia si nchide
fisierele deschise). Daca executia este din mediul VBA, atunci se suspenda executia programului, dar nu se
nchid fisierele deschise si nu se sterge valoarea variabilelor. Executia poate fi reluata din punctul de
suspendare.
)top
nstructiunea este similara introducerii unui punct de oprire (Breakpoint) n codul sursa.
Structuri iterative (Do...Loop, For...Next, For Each...Next,
While...Wend, With)
Prin intermediul constructiilor de tip bloc prezentate n aceasta sectiune se poate repeta, n mod controlat, un
grup de instructiuni. n cazul unui numar nedefinit de repetitii, conditia de oprire poate fi testata la nceputul
sau la sfrsitul unui ciclu, prin alegerea structurii adecvate.
Do;Loop
Se vor utiliza structuri Do.Loop pentru a executa un grup de instructiuni de un numar de ori nedefinit aprioric.
Daca se cunoaste numarul de cicluri, se va utiliza structura For.Next.
nainte de continuare se va testa o conditie (despre care se presupune ca poate fi modificata n instructiunile
executate). Diferitele variante posibile pentru Do.Loop difera dupa momentul evaluarii conditiei si decizia
luata.
Do +623ile , 9ntil7 condition-
+statements-
+E1it Do-
+statements-
Loop
sau
Do
+statements-
+E1it Do-
25
+statements-
Loop +623ile , 9ntil7 condition-
unde
condition este o expresie care valoare de adevar True sau False. O conditie care este Null se considera False.
statements sunt instructiounile care se repeta atta timp (while) sau pna cnd (until) conditia devine True.
Daca decizia este de a nu continua ciclarea, atunci se va executa prima instructiune care urmeaza ntregii
structuri (deci de dupa linia care ncepe cu Loop).
Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceasta sintaxa).
Daca apare o comanda Exit Do se poate omite chiar si conditia din enunt ntruct executia se va termina prin
aceasta decizie.
Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metoda) a unei bucle
transfera controlul la nivelul Do imediat superior.
Executia structurilor este explicata n tabelul urmator
Do While.Loop Testeaza conditia la nceputul buclei, executa
bucla numai daca rezultatul este True si continua
astfel pna cnd o noua evaluare produce False.
Do Until.Loop Testeaza conditia la nceputul buclei, executa
bucla numai daca rezultatul este False si continua
astfel pna cnd o noua evaluare produce True.
Do.Loop While Se executa ntotdeauna bucla o data, se testeaza
conditia la sfrsitul buclei si se repeta bucla att
timp ct conditia este True. Oprirea este pe
conditie falsa.
Do.Loop Until Se executa ntotdeauna bucla o data, se testeaza
conditia la sfrsitul buclei si se repeta bucla att
timp ct conditia este False. Oprirea este pe
conditie adevarata.

5or;/e1t
Atunci cnd se cunoaste numarul de repetari ale unui bloc de instructiuni, se va folosi structura For.Next.
Structura utilizeaza o variabila contor, a carei valoare se modifica la fiecare ciclu, oprirea fiind atunci cnd se
atinge o valoare specificata. Sintaxa este:
5or counter = start o end +)tep step-
+statements-
26
+E1it 5or-
+statements-
/e1t +counter-
unde
counter este variabila contor (numara repetarile), de tip numeric. Nu poate fi de tip Boolean sau element de
tablou.
start este valoarea initiala a contorului.
end este valoarea finala a contorului.
step este cantitatea care se aduna la contor la fiecare pas. n cazul n care nu se specifica este implicit 1.
Poate fi si negativa.
statements sunt instructiunile care se repeta. Daca nu se specifica, atunci singura actiune este cea de
modificare a contorului de un numar specificat de ori.
Actiunea este dictata de pasul de incrementare si relatia dintre valoarea initiala si cea finala.
nstructiunile din corpul structurii se executa daca
o counter <= end pentru step >= 0 sau
o counter >= end pentru step < 0.
Dupa ce toate instructiunile s-au executat, valoarea step este adaugata la valoarea contorului si instructiunile
se executa din nou dupa acelasi test ca si prima data, sau bucla For.Next este terminata si se executa prima
instructiune de dupa linia Next.
Specificarea numelui contorului n linia Next poate clarifica textul sursa, mai ales n cazul cnd exista structuri
For.Next mbricate.
Corpul unei bucle For.Next poate include (complet) o alta structura For.Next. n asemenea situatii,
structurile mbricate trebuie sa aiba variabile contor diferite.
nstructiunile Exit For pot fi plasate oriunde n corpul unei bucle si provoaca abandonarea ciclarii. Controlul
executiei se transfera la prima instructiune de dupa linia Next.
5or Eac3;/e1t
Similara structurii For.Next, structura For Each.Next repeta un grup de instructiuni pentru fiecare element
dintr-o colectie de obiecte sau dintr-un tablou (cu exceptia celor de un tip utilizator). Este utila atunci cnd nu
se cunoaste numarul de elemente sau daca se modifica, n timpul executiei, continutul colectiei.
Sintaxa este:
5or Eac3 element In group
+statements-
27
+E1it 5or-
+statements-
/e1t +element-
unde
element este variabila utilizata pentru parcurgerea elementelor. Daca se parcurge o colectie de
obiecte, atunci element poate fi Variant, o variabila generica de tip Object, sau o variabila obiect
specifica pentru biblioteca de obiecte referita. Pentru parcurgerea unui tablou, element poate fi
doar o variabila de tip Variant.
group este numele colectiei de obiecte sau al tabloului.
statements este grupul de istructiuni executate pentru fiecare element.
Executia unei structuri For Each.Next este
1. Se defineste element ca numind primul element din grup (daca nu exista nici un element, se transfera
controlul la prima instructiune de dupa Next se paraseste bucla fara executarea instructiunilor).
2. Se executa instructiunile din corpul buclei For.
3. Se testeaza daca element este ultimul element din grup. Daca raspunsul este afirmatif, se paraseste
bucla.
4. Se defineste element ca numind urmatorul element din grup.
5. Se repeta pasii 2 pna la 4.
nstructiunile Exit For sunt explicate la For.Next.
Buclele ForEach...Next pot fi mbricate cu conditia ca elementele utilizate la iterare sa fie diferite.
O$ser"atie. Pentru stergerea tuturor obiectelor dintr-o colectie se va utiliza For.Next si nu For Each.Next.
Se va utiliza ca numar de obiecte colectie.Count.
23ile;2en!
Executa un grup de instructiuni att timp ct este adevarata o conditie. Sintaxa
23ile condition
+statements-
2en!
Este recomandat sa se utilizeze o structura Do.Loop n locul acestei structuri.
2it3
Programarea orientata pe obiecte produce, datorita calificarilor succesive, constructii foarte complexe atunci
cnd se numesc proprietatile unui obiect. n cazul modificarilor succesive ale mai multor proprietati ale
aceluiasi obiect, repetarea zonei de calificare poate produce erori de scriere si conduce la un text greu de citit.
Codul este simplificat prin utilizarea structurii With.End With. O asemenea structura executa o serie de
instructiuni pentru un obiect sau pentru o variabila de tip utilizator. Sintaxa este:
28
2it3 object
+statements-
En! 2it3
unde
object este numele unui obiect sau a unui tip definit de utilizator
statements sunt instructiunile care se executa pentru entitatea precizata.
Permitnd omiterea recalificarilor din referintele la obiectul precizat, orice constructie de tipul
".nume" este interpretata n instructiunile structurii drept "object.nume".
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 calificarile
eventuale la acest obiect vor fi efectuate.
Nu se recomanda saltul n si dintr-un bloc With.
)tructuri !e !eci*ie (If;3en;Else. )elect 'ase)
Ramificarea firului executiei dupa rezultatul verificarii unei conditii este o necesitate frecventa n orice
implementare.
Pe lnga structurile prezentate, se pot utiliza trei functii care realizeaza alegeri n mod liniarizat (pe o linie de
cod): Choose(), if(), Switch().
If;3en;Else
O asemenea structura, ntlnita de altfel n toate limbajele de programare, executa un grup de instructiuni ca
raspuns la ndeplinirea unei conditii (compusa sau nu din mai multe conditii testate secvential). Sintaxa
permite o mare varietate de forme:
If condition 3en +statements- +Else elsestatements-
sau
If condition 3en
+statements-
+ElseIf condition-n 3en
+elseifstatements- ...
+Else
+elsestatements--
29
En! If
unde
condition are una din formele: expresie numerica sau sir care se poate evalua True sau False (Null este
interpretat False);
expresie de forma &peOf objectname Is objecttype, evaluata True daca objectname este de tipul obiect
specificat n objecttype.
statements, elsestatements, elseifstatements sunt blocurile de instructiuni executate atunci cnd conditiile
corespunzatoare sunt True.
La utilizarea primei forme, fara clauza Else, este posibil sa se scrie mai multe instructiuni, separate de ":", pe
aceeasi linie.
Verificarea conditiilor implica evaluarea tuturor subexpresiilor, chiar daca prin jocul operanzilor si operatorilor
rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True).
)elect 'ase
nstructiunea Select Case se poate utiliza n locul unor instructiuni Elsef multiple (dintr-o structura f.Then.
Elsef) atunci cnd se compara aceeasi expresie cu mai multe valori, diferite ntre ele. nstructiunea Select
Case furnizeaza, prin urmare, un sistem de luare a deciziilor similar instructiunii f.Then.Elsef. Totusi,
Select Case produce un un cod mai eficient si mai inteligibil. Sintaxa este:
)elect 'ase testexpression
+'ase expressionlist-n
+statements-n-- %%%
+'ase Else
+elsestatements--
En! )elect
unde
testexpression este o expresie numerica sau sir.
expressionlist-n este lista, separata prin virgule, a uneia sau mai multe expresii de forma:
e1pression.
e1pression o e1pression. Cuvntul o introduce un interval de valori, valoarea minima fiind prima
specificata.
Is comparisonoperator e1pression. Se va utiliza Is cu operatori de comparare (exceptnd Is si Li:e)
pentru a specifica un domeniu de valori.
statements-n reprezinta una sau mai multe instructiuni care se vor executa daca testexpression este egala cu
un element din expressionlist-n.
30
elsestatements reprezinta una sau mai multe instructiuni care se vor executa daca testexpression nu este
egala cu nici un element din listele liniilor Case.
Daca testexpression se potriveste cu un element dintr-o lista Case, se vor executa instructiunile care urmeaza
aceasta clauza Case pna la urmatoarea clauza Case, sau pna la End Select. Control executiei trece apoi la
instructiunea care urmeaza liniei finale End Select. Rezulta ca daca testexpression se regaseste n mai multe
liste, doar prima potrivire este considerata.
Clauza Case Else are semnificatia uzuala "altfel, n rest, n caz contrar etc.", adica introduce instructiunile care
se executa atunci cnd expresia de test nu se potriveste nici unui element din listele clauzelor Else. Daca
aceasta este situatia si nu este specificata o clauza Case Else, atunci executia urmeaza cu prima instructiune
de dupa End Select.
nstructiunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare
structura are End Select propriu, includerea este completa).
Apeluri de proceduri si programe
n aceasta sectiune se prezinta doar functia Shell(), deoarece despre proceduri si apelul lor s-a discutat n
capitolul 1.
5unctia )3ell()
Executa un program executabil si returneaza un Variant(Double) reprezentnd D-ul de task al programului n
caz de succes; n caz contrar returneaza zero. Sintaxa este
)3ell(pathname+,windowstyle-)
unde
pathname este Variant (String). Contine numele programului care se executa, argumentele
necesare si poate da calea completa (daca este nevoie).
indostyle este Variant (nteger) si precizeaza stilul ferestrei n care se va executa programul
(implicit este minimizat, cu focus).
Valorile posibile pentru argumentul windowstyle sunt
'onstanta numita Valoarea )emnificatia
VbHide 0 Fereastra este ascunsa iar focus-ul
este pe fereastra ascunsa.
VbNormalFocus 1 Fereastra are focus-ul si este
dimensionata si pozitionata normal.
VbMinimizedFocus 2 Fereastra este afisata ca o icoana
(minimizata) dar are focus-ul.
VbMaximizedFocus 3 Fereastra maximizata, cu focus.
VbNormalNoFocus 4 Fereastra este normala (restaurata
31
la marimea si pozitia cea mai
recenta) dar nu are focus-ul.
Fereastra activa curenta si
pastreaza focus-ul.
VbMinimizedNoFocus 6 Fereastra minimizata, fara focus.
Fereastra activa curenta si
pastreaza focus-ul.
Daca functia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se
executa asincron, deci nu exista certitudinea ca acest program se termina nainte de executia instructiunilor
care urmeaza liniei Shell.
32
Operatiuni !e intrare<iesire
n categoria operatiunilor de /O se pot deosebi
schimbul de informatii cu utilizatorul: acesta se poate desfasura prin intermediul unor formulare (forms)
predefinite (nputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului
VBA.
schimbul de informatii cu fisiere si/sau baze de date: acesta se realizeaza prin intermediul unor
instructiuni dedicate acestor operatii.
Dialogul stan!ar! cu utili*atorul
n general, utilizatorul raspunde la aparitia unei boxe de dialog prin actionarea butonului adecvat raspunsului
sau si/sau prin nscrierea unei informatii ntr-o zona dedicata acestui scop. nformatia nscrisa este transferata
programului ca valoare a functiei care initiaza dialogul grafic.
5unctia InputBo1
Apelul functiei nputBox afiseaza o boxa de dialog care contine un mesaj, doua butoane (OK si Cancel) si o
zona text n care se poate tasta un raspuns (de tip String, chiar daca se transmite o valoare numerica). Se
asteapta ca utilizatorul sa introduca un text n zona rezervata sau sa actioneze un buton. Textul introdus este
transmis ca valoare a functiei la actionarea butonului OK (sau Enter), iar actionarea butonului Cancel (ca si
nchiderea dialogului ca fereastra) transmite un sir de lungime zero (indiferent de valoarea zonei text. Sintaxa
este
InputBo1(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
unde
prompt este expresia String cu mesajul afisat n dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai
multe linii prin combinatii 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. Daca este omis se va folosi titlul aplicatiei.
default este expresia de tip String, optionala, continnd textul afisat initial n zona text rezervata utilizatorului.
Textul este, n lipsa modificarii lui, retransmis ca raspuns (actionnd butonul OK).
xpos este expresia numerica specificnd pozitia orizontala a dialogului (n twips, de la latura stnga a
ecranului). n lipsa argumentului, boxa de dialog este centrata orizontal.
ypos este expresia numerica specificnd pozitia verticala a dialogului (n twips, de la latura de sus a
ecranului). n lipsa argumentului, boxa de dialog este pozitionata la aproximativ o treime de ecran.
helpfile este expresia de tip String care identifica fisierul Help utilizat.Daca este indicat helpfile, trebuie sa fie
precizat si context. Textul de ajutor poate fi vazut prin tasta F1, anumite aplicatii afiseaza si un buton Help.
context Expresie numerica cu numarul de context Help al intrarii corespunzatoare dialogului afisat. Apare
obligatoriu mpreuna cu helpfile.
Daca valoarea functiei nu este atribuita (sau utilizata ntr-o alta expresie), este evident ca se pierde, fara
semnalarea vreunei erori.
33
5unctia MsgBo1
Un dialog mai simplu dect nputBox este realizat prin forma predefinita afisata de functia MsgBox. Se
afiseaza un mesaj ntr-o boxa de dialog si se asteapta ca utilizatorul sa actioneze unul dintre butoanele
existente (numarul si tipul lor lor este fixat la proiectarea aplicatiei). Functia returneaza un ntreg indicnd care
buton a fost actionat. Sintaxa este
[intvariable=]MsgBo1(prompt[, buttons] [, title] [, helpfile, context])
unde
prompt este textul mesajului (Vezi nputBox)
buttons este o expresie numerica egalacu suma valorilor care specifica numarul, tipul si atributele butoanelor.
Aici se fixeaza si modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaza). Valoarea
implicita este 0.
title,helpfile, context identice cu argumentele similare descrise la nputBox.
Constantele recomandate pentru formarea argumentului buttons sunt
'onstanta Valoare Descriere
VbOKOnly 0 Numai butonul OK
VbOKCancel 1 OK si Cancel
VbAbortRetrygnore 2 Abort, Retry si gnore
VbYesNoCancel 3 Yes, No si Cancel
VbYesNo 4 Yes si No
VbRetryCancel 5 Retry si Cancel
VbCritical 16 coana de Critical Message
VbQuestion 32 coana de Warning Query
VbExclamation 48 coana Warning Message
Vbnformation 64 coana de nformation 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
34
VbApplicationModal 0 Application modal: aplicatia curenta
este oprita pna cnd raspunde
utilizatorul
VbSystemModal 4096 System modal: toate aplicatiile sunt
oprite pna cnd utilizatorul raspunde
la dialog
Valorile 0-5 descriu butoanele, 16,32,48 si 64 descriu stilul icoanei afisate, 0, 256 si 512 determina butonul
implicit, iar ultimul grup (0 si 4096) determina modalitatea boxei de dialog. La formarea argumentului Buttons
se va aduna doar cte un numar din fiecare grup.
Pentru a utiliza valoarea returnata de functie, aceasta trebuie inclusa ntr-o expresie (eventual atribuita unei
variabile ntregi).
Valorile returnate de functie si care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorita
de utilizator sunt
'onstanta Valoare Descriere
VbOK 1 OK
VbCancel 2 Cancel
VbAbort 3 Abort
VbRetry 4 Retry
Vbgnore 5 gnore
VbYes 6 Yes
VbNo 7 No
Actionarea tastei Esc este echivalenta cu actionarea butonului Cancel (daca acesta este prezent). Daca n
dialog este prezent butonul Help, actionarea lui nu termina dialogul.
9tili*area fisierelor
Procesarile tipice programate n VBA prelucreaza informatii din doua mari categorii de fisiere:
fisiere ale aplicatiilor server (.doc n Word, .xls n Excel etc.)
fisiere utilizator (create si/sau gestionate de proiect pentru date de intrare, temporare sau de iesire).
!ccesarea directa a fisierelor din prima categorie "fara apelul aplicatiei server specifice# poate produce
coruperea fisierului, astfel $nc%t nu mai este recunoscut de aplicatia mama. &relucrarea acestor fisiere
trebuie sa fie executata $n aplicatiile care le-au creat.
Pentru lucrul cu un fisier utilizator (n continuare prin fisier se va ntelege, fara alte precizari, un fisier utilizator)
acesta trebuie mai nti deschis (instructiunea Open), operatiunea producnd si crearea fisierului n cazul unui
35
fisier inexistent (nou). Dupa utilizare fisierul trebuie sa fie nchis (operatiune efectuata, la terminarea normala a
programului, n mod automat).
Un fisier are atasat un numar de identificare, unic pentru un proces. dentificare fisierului se poate efectua, n
program, prin numele sau sau prin numarul atasat. Numarul poate fi n domeniul 1255 pentru fisierele proprii
aplicatiei si n domeniul 256511 pentru fisiere accesibile din alte aplicatii. Un numar neutilizat (liber) poate fi
furnizat de apelul la functia FreeFile().
Exista trei moduri de acces la nregistrarile unui fisier, acces definit la deschiderea acestuia.
acces secvential (modurile nput, Output si Append), utilizat de regula pentru scrierea fisierelor text
(rapoarte, jurnale etc.);
acces raandom (aleator) (modul Random), n cazul cnd este necesar sa se scrie si sa se citeasca
nregistrarile ntr-o ordine nedefinita, operatiunile de intrare/iesire fiind amalgamate ntre ele;
acces binar (modul Binary), utilizat la citirea/scrierea fisierelor byte cu byte (de exemplu fisiere bitmap).
Un fisier deschis cu un mod de acces trebuie exploatat n acest mod pna cnd este nchis si deschis n alt
mod (daca structura lui permite asa ceva).
nstructiunile tipice pentru accesul la informatiile dintr-un fisier sunt
Mo!ul !e
acces
)criere 'itire
Secvential Print #, Write # nput #
Random Put Get
Binar Put Get
Deoarece gestionarea fisierelor nu se rezuma doar la scriere/citire, n tabelul urmator este un rezumat al
principalelor operatiuni pe care le suporta fisierele, cu instructiunile care faciliteaza respectiva actiune.
Actiune Instructiuni
Citire Get. Input. Input =. Line Input =
Controlul iesirilor Format, Print, Print =. )pc. a$. Width
#
Copierea unui fisier FileCopy
Creare, acces Open
Fixarea atributelor FileAttr, GetAttr, SetAttr
Fixarea pozitiei active de
citire/scriere
)ee:
nchidere 'lose. Reset
36
nformatii despre un fisier EO5. FileAttr, FileDateTime, FileLen,
5ree5ile, GetAttr, Loc. LO5. )ee:
Lungimea unui fisier FileLen
Operatii asupra fisierelor Dir, Kill, Lock, Unlock, Name
Scriere Print =. Put. 2rite =
Doar instructiunile si functiile des utilizate sunt prezentate n continuare, pentru celelalte se va studia intrarea
corespunzatoare din Help (n mediul VBA).
Open
Deschide un fisier n sensul ca rezerva o zona tampon (buffer) pentru fisier si determina modul de acces
utilizat. Nu se pot efectua instructiuni de /O pe un fisier daca acesta nu este deschis n prealabil. Sintaxa:
Open pathname 5or mode +Access access- +lock- As +=-filenumber +Len0reclength-
unde
pathname expresie String care specifica numele fisierului (poate include ntreaga cale unitate, directoare etc.,
dupa regulile uzuale);
mode cuvnt cheie care specifica modul de acces la fisier: !ppend, 'inary, (nput, )utput sau *andom; daca
nu se specifica nimic se va considera acces *andom;
access clauza optionala specificnd operatiunile /O permise pentru fisier: *ead, +rite sau *ead +rite,
lock clauza optionala specificnd operatiile asupra fisierului permise altor procese care se executa (cnd
fisierul este deschis): -hared, .ock *ead, .ock +rite si .ock *ead +rite.
filenumber numarul de fisier pentru fisierul deschis (ntre 1 si 511, vezi observatia din partea introductiva);
functia FreeFile furnizeaza urmatorul numar disponibil;
reclength numar (<=32,767) exprimnd, n octeti, lungimea nregistrarii (la aceesul *andom) sau lungimea
bufferului (la accesul secvential); la accesul Binary, clauza este ignorata.
Daca fisierul indicat nu exista, atunci este creat un fisier cu acest nume n cazurile care presupun o iesire n
fisier: modurile Append, Binary, Output sau Random.
Un fisier poate fi deschis n mai multe moduri simultan (prin instructiuni Open distincte pentru fiecare mod, cu
numere diferite) daca exista compatibilitate ntre moduri: Binary, nput si Random permit acest lucru, Append,
Output nu permit (fisierul trebuie mai nti nchis si abia apoi deschis ntr-un asemenea mod).
5ree5ile
Functia returneaza un ntreg reprezentnd urmatorul numar de fisier disponibil.
5ree5ile+(rangenumber)-
37
rangenumber este un Variant care specifica domeniul din care se solicita un numar liber de fisier: 0 (valoarea
implicita) returneaza un numar n 1255 (pentru fisiere proprii, 1 returneaza un numar n 256511 (pentru
fisiere accesate din alte aplicatii).
Get
Citeste date dintr-un fisier deschis si le transfera ntr-o variabila. Datele citite cu Get sunt, n general, scrise n
fisier cu comanda Put.
Get +=-filenumber, +recnumber-, varname
unde
filenumber este numarul fisierului de unde se citesc date (fisierul trebuie sa fie deschis)
recnumber numar optional n format Variant (Long), reprezinta numarul nregistrarii (modul *andom) sau
numarul octetului (modul Binary) de unde ncepe citirea. Prima pozitie este 1.
varname numele variabilei unde se transfera informatia.
Daca nu se specifica numarul nregistrarii se va citi din pozitia activa de dupa ultima instructiune Get, Put sau
Seek. Argumentul lipsa este indicat prin virgule: Get #4,,FileBuffer.
Pentru observatiile privind actiunea instructiunii Get, separat pentru modul Random si Binary, se va studia
Help - Get. Observatiile sunt utile atunci cnd se opereaza, n special, cu tipurile Variant si cu tablouri.
Put
Scrie valoarea unei variabile date ntr-un fisier deschis n prealabil. Datele scrise cu Put sunt, n general, citite
din fisier cu Get.
Put +=-filenumber, +recnumber-, varname
unde
filenumber este numarul fisierului unde se scriu datele (fisierul trebuie sa fie deschis);
recnumber numar optional n format Variant (Long), reprezinta numarul nregistrarii (modul *andom) sau
numarul octetului (modul Binary) unde ncepe scrierea. Prima pozitie este 1.
varname numele variabilei a carei valoare se scrie n fisier.
Daca nu se specifica numarul nregistrarii se va scrie n pozitia activa de dupa ultima instructiune Get, Put sau
Seek. Argumentul lipsa este indicat prin virgule: Put #4,,FileBuffer.
Pentru observatiile privind actiunea instructiunii Put, separat pentru modul Random si Binary, se va studia
Help - Put. Observatiile sunt utile atunci cnd se opereaza, n special, cu tipurile Variant si cu tablouri.
Input =
Citeste date dintr-un fisier secvential si le transfera n variabilele specificate.
38
nstructiunea se va utiliza doar cu fisierele deschise n modul nput sau Binary, datele citite cu nput # sunt
scrise, de regula, cu Write #.
Input =filenumber, varlist
unde
filenumber numarul fisierului (deschis n prealabil);
varlist lista de variabile, delimitate de virgule, pentru care se citesc valorile din fisier. Nu se pot include nume
de tablouri sau variabile Object, dar se accepta elemente de tablou si variabiel de tipuri utilizator.
Pentru situatiile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaza fara modificari.
Pentru alte situatii:
Informatia citita Valoarea asignata
Virgula sau linie goala Empty
#NULL# Null
#TRUE# sau #FALSE# True sau False
#yyyy-mm-dd hh:mm:ss# Data si/sau timpul reprezentat de
expresie
#ERROR errornumber# errornumber (variabila este un Variant
considerat drept eroare)
Ghilimelele duble (" ") sunt ignorate n sirul de intrare.
Pentru o citire corecta, datele din fisier trebuie sa apara n aceeasi ordine si de acelasi tip cu variabilele din
lista. O variabila numerica primeste valoarea 0 daca intrarea corespunzatoare nu este numerica. Atingerea
sfrsitului de fisier cnd operatiunea de citire nu este ncheiata, provoaca eroare.
ntruct utilizarea fisierelor este, n mod uzual, aceea de memorare controlata a unor informatii (si nu aceea de
a descifra informatii scrise ntr-o structura necunoscuta), se recomanda scrierea cu Write # n cazul utilizarii
ulterioare a comenzii nput #.
5unctia Input()
Citeste si returneaza un sir de caractere citite dintr-un fisier deschis n mod nput sau Binary. Datele citite prin
aceasta functie sunt scrise, de regula, prin Print # sau Put.
Input(number, +=-filenumber)
unde
number orice expresie numerica specificnd numarul de caractere care se citesc.
filenumber numar de fisier (deschis).
39
Spre deosebire de instructiunea nput #, functia nput returneaza toate caracterele citite (inclusiv virgule, CR,
LF, ghilimele si spatii de nceput).
Pentru fisierele deschise pentru acces Binary, ncercarea de a citi prin functia nput pna cnd EOF
returneaza True genereaza eroare (procedeul este valid pentru citirea din fisiere binare cu Get). Se vor utiliza
functiile LOF and Loc pentru detectarea sfrsitului de fisier.
O$ser"atie. Pentru date pe octeti din fisiere text se va utiliza functia nputB, cu o sintaxa similara, unde
number specifica numarul de octeti de returnat (n loc de numarul de caractere). A se vedea si Help
Returning Strings from Functions.
Line Input =
Citeste o singura linie dintr-un fisier secvential (deschis) si asigneaza sirul obtinut unei variabile de tip String.
O linie este considerata terminata la ntlnirea caracterului CR (Chr(13)) sau a combinatiei CR+LF
(Chr(13)&Chr(10)). Caracterele CR si/sau LF nu sunt adaugate sirului asignat (se poate considera ca
secventa lor a fost sarita).
Line Input =filenumber, varname
unde
filenumber numarul atasat fisierului (deschis),
varname nume de variabila String sau Variant.
Datele citite cu Line nput # sunt, de regula, scrise cu Print #.
2rite =
Scrie o nregistrare ntr-un fisier secvential. Datele scrise prin Write # sunt citite, de regula, cu nput #.
Utilizarea scrierii cu Write # asigura o delimitare corecta a fiecarui cmp scris, ceea ce permite regasirea
corecta (fara alte artificii) a informatiilor la citirea cu nput #. n acelasi timp, informatiile sunt regasite corect
indiferent de configurarile locale.
Sintaxa este
2rite =filenumber, +outputlist-
unde
filenumber numarul atasat fisierului (deschis n prealabil),
outputlist o lista de expresii numerice sau sir, separate prin virgule, spatii sau punct-virgula, ale
caror valori se scriu n fisier.
Specificarea unei virgule dupa filenumber fara outputlist produce o linie goala n fisier.
Sunt respectate urtmatoarele reguli de scriere:
datele numerice sunt scrise cu punct ca separator zecimal (indiferent de setarile locale);
datele Boolean sunt scrise ca #TRUE# sau #FALSE#, nefiind traduse dupa setarile locale;
40
datele calendaristice si timpul sunt scrise potrivit formatului de data universala; daca o componenta
este omisa (sau este zero), se scrie doar partea indicata;
Null se scrie drept #NULL#, iar Empty nu produce nimic n iesire;
Date de tip Error apare #ERROR errorcode#.
nstructiunea Write # insereaza ntre virgule ntre elementele scrise n fisier, ca si ghilimele n jurul sirurilor de
caractere (nu este prin urmare nevoie ca utilizatorul sa introduca separatori pentru claritate). Dupa ce toate
valorile au fost scrise, se insereaza automat o combinatie CR+LF, astfel nct urmatoarea scriere va fi pe un
rnd nou.
Print =
Scrie ntr-un fisier secvential date formatate ca pe ecran (display-formatted). Prin urmare, cu exceptiile
specificate n continuare, setarile locale sunt respectate. Datele scrise cu Print # sunt, de regula, citite cu Line
nput # sau cu nput.
Sintaxa este
Print =filenumber, +outputlist-
unde
filenumber numarul atasat fisierului (deschis n prealabil),
outputlist lista de expresii formatate ale caror valori sunt tiparite. Elementele se separa prin virgule, spatii sau
punct si virgula.
Un element al listei de iesire este de forma
+6)pc(n) , a$+(n)-7- +expression- +charpos-
unde
-pc"n# insereaza n spatii n iesire
/ab"n# pozitioneaza punctul de insertie (nceputul zonei de scriere) la o coloana indicata absolut de n.
Utiliznd doar Tab se trece la urmatoarea zona de iesire.
expression expresia a carei valoare se tipareste (numerica sau String).
charpos Specifica pozitia punctului de insertie pentru urmatorul caracter care va fi tiparit, potrivit tabelului care
urmeaza. Daca nu se specifica, urmatoarea tiparire va fi pe rndul urmator.
c3arpos Locul punctului !e insertie
> mediat dupa ultimul caracter
tiparit
Tab(n) Coloana cu numarul n
Tab nceputul urmatoarei zone de
tiparire
41
Daca se omite outputlist dar se include un separator dupa filenumber, se va insera o linie goala n fisier.
Datele logice sunt scrise drept True, False (fara traduceri locale).
Datele calendaristice sunt scrise potrivit setarii locale pentru format scurt.
Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fara traduceri locale).
nformatiile numerice scrise sunt dupa configurarile locale (separator zecimal).
Pentru o interpretare corecta, utilizatorul trebuie sa separe valorile afisate prin formatari adecvate.
Pentru afisari n fereastra mmediate a mediului VBA, se va vedea si metoda Print (vezi Help Print Method).
'lose
nchide unul sau mai multe fisiere deschise prin Open pentru instructiuni de /O. Prin acesta operatiune se
rupe legatura ntre fisiere si numerele atasate si se elibereaza zonele tampon rezervate. Pentru un fisier nchis
nu se mai pot executa operatiuni /O (pna la o noua deschidere).
Sintaxa este
'lose +filenumberlist-
unde
filenumberlist este lista de numere atasate fisierelor care se nchid, de forma
[[#]filenumber] [, [#]filenumber] .; daca lista nu este prezenta, atunci se vor nchide toate fisierele care sunt
deschise.
nainte de nchidere, n fisierele deschise pentru Output sau Append se scriu zonele buffer nescrise nca.
Reset
nchide toate fisierele deschise prin instructiuni Open. Sintaxa este
Reset
naine de nchidere se scriu n fisiere toate bufferele nescrise nca.
)ee:
Stabileste pozitia (nregistrarii sau octetului) ntr-un fisier unde se va efectua urmatoarea operatiune de
intrare/iesire, fisierul fiind deschis prin Open (vezi si functia Seek). Sintaxa
)ee: +=-filenumber, position
unde
filenumber numarul atasat fisierului.
position numar ntre 1 si 2,147,483,647, inclusiv, care indica locul urmatoarei
operatii /O.
42
Numerele nregistrarilor specificate n instructiunile Get si Put au priorirtate n raport cu pozitia fixata prin Seek
(are loc o repozitionare).
Daca operatiunea Seek indica o pozitie dupa sfrsitul fisierului, urmatoarea operatiune de scriere (fara
repozitionare) extinde fisierul.
Pozitia indicata nu poate fi zero sau negativa.
5unctia )ee:
Returneaza, ca un ntreg Long, pozitia curenta /O dintr-un fisier specificat. Fisierul trebuie sa fie n prealabil
deschis.
)ee:(filenumber)
filenumber este un numar de fisier.
Valoarea returnata este ntre 1 si 2,147,483,647 (echivalent cu 2^31 1), inclusiv (vezi si setarea pozitiei prin
instructiunea Seek) si are semnificatia din urmatorul tabel.
Mo!ul !e acces Valoarea returnata
Random Numarul urmatoarei nregistrari (care
va fi citita sau scrisa)
Binary, Output,
Append, nput
Pozitia octetului (numerotat de la 1) la
care va avea loc urmatoarea
operatiune /O
EO5
Returneaza un ntreg cu valoarea logica True (-1) atunci cnd se atinge sfrsitul unui fisier deschis pentru
citire (Random, Binary sau nput). Pentru fisierele dschise n iesire functia genereaza mereu True.
EO5(filenumber)
filenumber este un ntreg continnd numarul fisierului testat.
Utilizarea uzuala este
Do While Not EOF(filenum)
. (instructiuni, inclusiv citire din fisierul filenum)
Loop
Pentru acces secvential (nput) se ntoarce False pna cnd se atinge sfrsitul de fisier, pentru fisierele
Random sau Binary se returneaza False pna cnd ultima instructiune Get executata nu a putut citi o
nregistrare ntreaga.
43
Citirea cu nput dintr-un fisier deschis Binary produce eroare la utilizarea mecanismului general (pna cnd
EOF () este true): se va utiliza citirea cu Get sau citirea cu nput mpreuna cu functiile LOF sau Loc.
Loc
Returneaza, ca Long, pozitia curenta de citire/scriere ntr-un fisier deschis.
Loc(filenumber)
filenumber este numarul atasat fisierului.
Valoarea functiei depinde de modul de acces
Mo! Valoarea returnata
Random Numarul ultimei nregistrari scrise sau citite
Sequential Pozitia curenta mpartita la 128. (Se spune
ca aceasta informatie nu este niciodata
utila sau utilizata)
Binary Pozitia ultimului octet citit sau scris.
Functia Loc este utilizata, mpreuna cu functia LOF, la testarea sfrsitului de fisier la citiri Binary (schema
generala este data la LOF).
LO5
Returneaza un Long care reprezinta, n octeti, marimea unui fisier deschis prin Open. Pentru fisierele
nedeschise se poate utiliza, n acelasi scop, functia FileLen().
LO5(filenumber)
filenumber este numarul atasat fisierului.
Utilizarea acestei functii, mpreuna cu functia Loc, pentru determinarea sfrsitului de fisier (similar cu EOF)
accesat Binary este dupa schema generala:
Open filename For Binary As filenum
Do While 0urrent.ocation < LOF(filenumber)
. (citire din fisierul filenum )
0urrent.ocation = Loc(filenumber)
.
Loop
44
Visual Basic E!itor
n aceasta sectiune se prezinta mediul de dezvoltare Visual Basic for Applications integrat n Microsoft Office
97. nformatiile sunt, n general, valabile pentru Microsoft Excel 97, Word 97 si PowerPoint 97 care sunt
prevazute cu un mediu complet de dezvoltare VBA, numit Visual Basic E!itor% Atunci cnd vor fi necesare,
se vor da explicatii suplimentare pentru Access 97.
Utiliznd Visual Basic Editor, numit n continuare VBE, se poate crea, edita, depana si executa cod program
asociat cu documente Microsoft Office.
Proiectele dezvoltate n VBE, desi sunt asociate aplicatiilor din Office, nu pot fi reduse, ca problematica, la
procesarea de texte (Word), calcul tabelar (Excel), prezentari electronice (PowerPoint) sau baze de date
(Access). Este corect sa se considere aceste proiecte drept aplicatii similare celor dezvoltate n alte medii de
programare, avnd nsa la dispozitie componentele aplicatiilor din Office. Cu alte cuvinte, nu este vorba de o
limitare a posibilitatilor de prelucrare, ci o potentare a acestora prin apelul posibil la obiectele din Office.
O obiectie la utilizarea VBA este aceea ca proiectul se poate executa doar dintr-o aplicatie Office (deci
deschiznd, chiar formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente
disponibile n dezvoltarea proiectului compenseaza acest neajuns. n plus nu trebuie uitat ca orice aplicatie
necesita o interfata utilizator (puternica n Microsoft Office) si ca aplicatiile de baza sunt ntretinute si
completate de Microsoft, astfel nct proiectele noastre se vor actualiza si ele o data cu componentele Office.
Un ultim argument este acela ca mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio
(Visual Basic, C++ etc.) astfel ca practica n VBA poate fi considerata introductiva catre alte aplicatii RAD.
Interfata grafica VBE
Pentru a deschide editorul VB, mai nti se va porni o aplicatie din Microsoft Office, apoi se poate actiona
combinatia Alt+F11 (daca nu a fost atribuita altei operatiuni), sau
butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizata
ntr-o aplicatie Office, sau
Meniul Tools, Macro, Visual Basic Editor.
n Access se va activa fisa Modules a proiectului.
nterfata grafica VBE este suficient de complexa, asemanatoare mediilor de programare din Visual Studio. Pe
lnga obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu
anumite categorii de obiecte:
Properties Window pentru vizualizarea si fixarea proprietatilor n momentul proiectarii (design-time);
Project Explorer care permite navigarea, vizualizarea si modificarea proiectelor deschise la un moment
dat;
Code Window unde este se scrie si este vizibil codul sursa al proiectului activ;
Locals Window care permite vizualizarea variabilelor locale cu valorile lor;
mmediate Window care permite executarea imediata a unei linii de cod;
Watch Window unde se afiseaza valorile unor expresii specificate (utile n depanarea programelor).
Properties 2in!o4
Prin proprietate a unui obiect se ntelege o caracteristica a respectivului obiect (cum ar fi culoarea sau
vizibilitatea etc.). Fixarea valorii proprietatii se reflecta n aparenta obiectului sau n comportamentul lui (de
exemplu, fixarea proprietatii ShowSpellingErrors la valoarea True arata n document erorile de scriere).
45
Fereastra Properties poate fi utilizata, n momentul proiectarii, pentru a
vizualiza toate proprietatile obiectului activ si a modifica valorile dorite.
n partea superioara este cutia de obiecte n care se poate selecta un
obiect (sau mai multe) dintre cele vizibile.
n fisa Alphabetic se listeaza proprietatile modificabile ale obiectului
selectat, n ordine alfabetica. Se poate modifica valoarea unui atribut
prin selectarea numelui proprietatii si tastarea sau selectarea noii
valori.
n fisa Categorized sunt listate proprietatile dupa categorii, ntr-un
control de tip Explorer, in care ramurile pot fi expandate sau.
Fereastra Properties poate fi aratata (cnd nu este vizibila), prin
comanda Properties 2in!o4 din meniul Vie4.
Pro(ect E1plorer
Codul sursa asociat cu un workbook, document, template sau prezentare este asociat ntr-un proiect. care
este memorat si salvat n mod automat o data cu caietul Excel, documentul Word, sablonul sau prezentarea
respectiva. n fereastra Project Explorer se pot vedea, modifica si naviga printre toate proiectele asociate
oricarui document, caiet, sablon sau prezentare deschise.
Pentru un proiect se listeaza, ntr-un control de tip Explorer, obiectele
care recunosc evenimente, formele, modulele, referintele. Pentru a
vedea codul dintr-un modul sau codul asociat unui obiect, se
selecteaza respectivul modul sau obiect si se apasa butonul View
Code (primul din stnga). Pentru a vedea interfata utilizator pentru un
obiect sau forma se selecteaza si se apasa butonul View Object (cel
din mijloc). Pentru a vedea organizarea n foldere a elementelor listate
n Project Explorer se va apasa butonul Toggle Folders.
Fiecare element este nsotit, n arborele de structura, de icoana
specifica elementului: proiect, folder, referinta, obiect etc.
'o!e 2in!o4
Fereastra principala a Editorului Visual Basic este cea n care se poate scrie codul sursa. Deoarece
procedurile sunt asociate unor obiecte de interfata, sau apartin unui modul, mai nti se va selecta, din Project
Explorer, modulul sau forma vizata si apoi se va apasa butonul View Code.
Pentru a vedea mai mult de o procedura n fereastra de cod, se va selecta boxa de control Default to 5ull
Mo!ule Vie4 n fisa E!itor din Options (meniul ools) (n caz contrar se va vedea doar cte o procedura).
n partea de sus a ferestrei se gasesc doua boxe:
Object Box unde se poate selecta obiectul
pentru care se afiseaza procedurile asociate;
Procedures/Events Box unde se poate
selecta procedura pentru care se
vizualizeaza/editeaza codul. Procedurile pot fi
de tip eveniment, daca obiectul selectat este
46
o forma utilizator. Selectarea unei proceduri produce o defilare a textului astfel nct pointerul sa 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
utiliznd bara de divizare etc.
Actionarea butonului Procedure View con (primul din stnga, pe bara de jos a ferestrei) sau a butonului Full
Module View con produce alegerea ntre vizualizarea unei singure proceduri sau a tuturor procedurilor din
modul.
Locals 2in!o4
Utila n procesul de punere la punct a programului, fereastra Locals serveste la afisarea automata a tuturor
variabilelor declarate n procedura curenta. Continutul ferestrei este actualizat de fiecare data cnd se trece
din modul Run n modul Break sau atunci cnd se navigheaza n stiva de apeluri.
Pentru o descriere a ferestrei se va vedea sectiunea dedicata depanarii programelor.
Imme!iate 2in!o4
Permite scrierea si executia imediata a unei linii de cod. Linia poate fi copiata n si dintr-o fereastra de cod.
n modul de executie Break, instructiunea din fereastra mmediate este executata n contextul procedurii
afisate n Procedure Box.
Pentru actiunile posibile n fereastra mmediate, se va studia Help mmediate Window Keyboard Shortcuts.
2atc3 2in!o4
Este fereastra unse sunt afisate automat valorile expresiilor urmarite n etapa de depanare a proiectului.
Pentru o descriere a ferestrei Watch se va vedea sectiunea dedicata depanarii programelor.
)crierea proce!urilor
nstructiunile unui proiect se pot nscrie, dupa modul lor de creare, n doua mari categorii:
scrise de aplicatia de baza (Word, Excel etc.) prin traducerea actiunilor interfetei utilizator (meniuri,
comenzi etc.) n cod VBA. Aceasta operatiune este cea de nregistrare a unui macro.
scrise ntr-o fereastra de cod de catre utilizator (proiectant), cu asistenta mediului VBE.
?nregistrarea unui macro
Actiunea este utila att prin aceea ca operatiuni simple pot fi traduse usor n instructiuni VBA, procedurile pot fi
editate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cautare/nlocuire sau formatari de
obiecte grafice) codul generat automat ofera un bun model de utilizare a obiectelor, proprietatilor si metodelor
aplicatiei.
Pentru a nregistra un macro:
Se afiseaza bara de unelte Visual Basic (meniul Vie4 - ool$ars si selectarea barei dorite).
Pe bara Visual Basic se actioneaza butonul Recor! Macro.
n dialogul Recor! Macro se nlocuieste numele dat implicit n boxa Macro /ame si apoi O@.
47
Se poate utiliza boxa )tore macro pentru a alege locul de memorare a codului.
Se executa actiunile menite sa fie nregistrate/traduse n VB, n succesiunea dorita.
Pe bara )top Recor!ing (aparuta la initierea procesului de nregistrare) se apasa butonul )top
Recor!ing.
Pentru a vedea liniile de cod generate, se deschide n aplicatia de baza meniul ools, comanda Macro, apoi
Macros, se selecteaza dupa denumire si se apasa butonul E!it.
Codul sursa poate fi vazut si prin navigarea n VBE prin Pro(ect E1plorer, ferestre de cod etc.
Din punctul de vedere al programarii se poate spune ca un macro este o procedura publica fara argumente,
deci poate fi scrisa si direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile
care pot fi executate din dialogul Macros (ools - Macro - Macros) sunt macro-uri.
)crierea unei proce!uri
Daca se doreste scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific,
se ca crea o procedura ntr-un modul standard.
Pentru a crea un modul standard nou (gol), se merge n Pro(ect E1plorer n proiectul unde se adauga
modulul nou creat si se da comanda Mo!ule din meniul Insert.
Pentru a deschide un modul standard existent, se va selecta modulul din Pro(ect E1plorer si se apasa
butonul Vie4 'o!e (sau dublu click).
Pentru a adauga o procedura la un modul, se selecteaza modulul n Project Explorer, se deschide meniul
nsert si se da comanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta optiunile
definitorii (subrutina sau functie, publica sau nu etc.) si se da OK. Dupa aceasta se pot adauga liniile de cod
ale procedurii.
)crierea unei proce!uri !e e"eniment (e"ent proce!ure)
Daca se doreste scrierea de cod sursa care sa se execute automat atunci cnd are loc un anumit eveniment
(cum ar fi deschiderea unui document, actionarea unui buton etc.), trebuie sa se scrie o procedura asociata
evenimentului respectiv. O asemenea procedura se va numi procedura evenimentului.
Anumite obiecte din aplicatiile Microsoft Office recunosc un set predefinit de evenimente, care pot fi
declansate de catre sistem sau de catre utilizator. Evenimentele specifice fiecarui obiect trebuie sa fie studiate
separat (se va studia sectiunea din Help pentru fiecare aplicatie), doa principalele obiecte, cu proprietatile,
metodele si evenimentele lor, sunt prezentate si n acest curs, n capitole separate.
Modul cum aplicatia raspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de
eveniment. O asemenea procedura se va scrie n fereastra Code asociata obiectului. De fiecare data cnd
apare evenimentul se executa procedura evenimentului respectiv. De exemplu, daca se scrie o procedura
asociata cu evenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere
a acelui documentului.
O procedura de eveniment este memorata n documentul, caietul, foaia de calcul, diapozitivul, forma utilizator
etc. unde poate fi declansat evenimentul. Pentru a vedea codul sursa al procedurii, se va selecta obiectul n
Project Explorer si click pe butonul View Code pentru a deschide fereastra de cod asociata. Dintr-o fereastra
de cod deschisa, asociata, se va selecta obiectul vizat, din boxa de obiecte, si n boxa de proceduri vor fi
48
listate atunci toate procedurile evenimentelor, chiar daca ele nu sunt efectiv scrise. Selectarea unui eveniment
va scrie (daca nu exista) liniile obligatorii ale procedurii si va fixa cursorul de editare n procedura respectiva.
Numele unei proceduri de eveniment este format din numele obiectului, care recunoaste evenimentul, urmat
de caracterul "_" si de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii
care se executa la deschiderea unui document.
Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dupa
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.
O$ser"atie. Daca se doreste ca o procedura sa fie asociata cu un document specific, dar nu cu un eveniment
specific, atunci procedura se va scrie n sectiunea (General) a documentului respectiv (de exemplu o rutina
care sa poata fi apelata din mai multe proceduri de eveniment).
9nelte VBE pentru scrierea instructiunilor
Deoarece multe dintre denumirile obiectelor, proprietatilor sau metodelor care apar n codul VBA sunt
complexe, mediul de dezvoltare ofera o serie de unelte pentru completarea automata a cuvintelor cheie,
pentru oferirea de ajutor n reamintirea denumirilor etc.
Daca s-au tastat suficient de multe caractere nct VB poate recunoaste un cuvnt, atunci prin CTRL+SPACE,
sau click pe butonul 'omplete 2or! de pe bara de unelte E!it. completeaza cuvntul.
n dialogul Options (meniul Tools) se pot activa urmatoarele actiuni, executate automat la completarea unei
linii de cod:
verificarea automata a sintaxei Auto Syntax Check;
obligativitatea declararii tuturor variabilelor, adaugarea automata a instructiunii Option Explicit la orice
nou modul Require Variable Declaration;
afisarea unei liste cu informatii utile (logice la pozitia curenta a cursorului) la completarea instructiunii
Auto List Member;
afisarea informatiei despre proceduri si parametrii lor Auto Quick nfo;
afiseaza, doar n modul Break, valoarea unei variabile peste care este plasat cursorul Auto Data
Tips;
alinierea automata a liniilor noi la nceputul liniei precedente Auto ndent;
fixarea latimii ntre pozitiile tabulatorului, 1 la 32 de spatii (implicit fiind 4) Tab Width.
Pe bara de unelte Edit exista cteva butoane, care ajuta la completarea cuvintelor si expresiilor n timpul
scrierii instructiunilor:
List Properties/Methods deschide o cutie n fereastra Code cu proprietatile si metodele permise
pentru obiectul care precede caracterul punct ("."), utila atunci cnd se opereaza cu obiecte.
List Constants deschide n fereastra de cod, la punctul de insertie, o cutie cu constantele permise
pentru proprietatea care precede semnul egal ("=") n instructiunea curenta.
Quick nfo ofera, ca ajutor, sintaxa pentru o variabila, functie etc. prin analiza locului punctului de
insertie pe linia curenta.
Parameter nfo arata o cutie, la punctul de insertie, cu informatia despre parametrii functiei n care
este pointerul.
Complete Word accepta caracterele pa care le propune VBE drept completare la cuvntul tastat.
Comment Block care transforma n comentarii liniile selectate.
49
Uncomment Block nlatura semnul de comentarii la liniile selectate.
E1ecutarea unei proce!uri )u$
O procedura poate sa se execute:
automat, ca raspuns la declansarea unui eveniment (procedura evenimentului);
din VBE, daca punctul de insertie este n procedura si se actioneaza butonul Run )u$A9ser5orm de
pe bara de unelte )tan!ar! sau De$ug;
ca un macro, Run din dialogul Macros (ools - Macro) al aplicatiei de baza;
apelata din alta procedura.
La apelul unei proceduri din alta procedura se va tine seama de interactiunea declaratiilor Pu$lic, Pri"ate, ca
si de referintele la alte proiecte (meniul ools - References).
50
Mo!ele !e o$iecte
Aproape toate actiunile programate n VB implica manevrarea programatica a unor obiecte. Toate aplicatiile
din Microsoft Office sunt alcatuite din componente formate din obiecte sau care gestioneaza obiecte.
n aceasta sectiune se prezinta principalele concepte din programarea orientata pe obiecte, ca si uneltele si
tehnicile disponibile pentru a explora si utiliza obiectele specifice din Office 97.
Deoarece fiecare aplicatie din Office are un model propriu de obiecte, va fi dedicat cte un capitol pentru
Word, Excel etc., n care se vor prezenta particularitatile de operare si obiectele specifice aplicatiei.
Pri"ire generala
Orice aplicatie poate fi gndita ca ansamblul a doua lucruri: continut si functionalitate. Continutul se refera la
documentele pe care le contine aplicatia, la elementele care compun documentele, la informatiile privind
atributele elementelor. Functionalitatea se refera la modurile, caile n care se poate lucra cu continutul
aplicatiei, de exemplu: deschiderea, nchiderea documentelor, adaugarea, copierea, formatarea elementelor
etc.
Continutul si functionalitatea unei aplicatii sunt divizate n unitati discrete de continut si functionalitate
specifica, numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul,
sectiuni ale unui document Word etc., fiecare avnd evident un continut si o functionalitate specifica, cele
doua componente fiind unitar legate ntre ele. Obiectele unei aplicatii sunt ierarhizate n structuri, modelul de
obiecte al aplicatiei..
Obiectul de nivel maxim al unei aplicatii este, uzual, obiectul Application, care este aplicatia nsasi. Obiectul
Application contine alte obiecte care pot fi accesate numai cnd obiectul Application exista (deci cnd
aplicatia se executa). De exemplu, obiectul Application Excel contine obiecte 2or:$oo:, dupa cum obiectul
Application Word contine obiecte Document. Deoarece obiectul Document depinde de existenta obiectului
Application Word, se spune ca obiectul Document este copilul obiectului Application; invers, obiectul
Application se zice parintele obiectului Document.
Este uzual ca un obiect, care este copil al altui obiect, sa aiba, la rndul sau, alte obiecte copii. De asemenea,
este posibil ca un copil sa aiba mai multi parinti.
Modul n care obiectele, care alcatuiesc o aplicatie, sunt aranjate relativ unele fata de altele, mpreuna cu
modul n care continutul si functionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau
modelul de obiecte. Fiecare aplicatie are un model de obiecte propriu, reprezentarea grafica a ierarhiei de
obiecte pentru aplicatie poate fi vazuta n Visual Basic Help din aplicatie.
Fiecare obiect din ierarhie are un continut si o functionalitate care se aplica, ambele, att obiectului nsusi, ct
si tuturor obiectelor descendente din ierarhie. Cu ct obiectul este situat mai sus n ierarhie, cu att este mai
vast domeniul continutului si functionalitatii sale. Locul unui obiect n model este gndit astfel nct continutul
si functionalitatea lui sunt adecvate domeniului sau. Se poate gndi si faptul ca, daca aplicatia este divizata n
obiecte, fiecare obiect ofera acces la arii specifice de continut si functionalitate.
Afirmatiile care implica obiecte utilizeaza si termenii de "continut n" pentru copil si "contine" pentru parinte.
Astfel, obiectul Application Word contine obiecte Document, dar obiectul )election este continut $n obiectul
2in!o4s etc.
Proprietati si meto!e
51
Pentru a avea acces la continutul si functionalitatea unui obiect, pentru nceput trebuie sa se identifice obiectul
(subiect discutat n continuare). Dupa identificare, obiectul este accesibil prin intermediul proprietatilor si
metodelor sale.
n general, prin proprietate se ntelege un atribut numit al obiectului. Valoarea atributului (proprietatii) poate fi
modificata (de cele mai multe ori) sau poate fi obtinuta (stiuta) programatic.
Prin metoda se ntelege o procedura care actioneaza asupra unui obiect. Pentru a distinge o metoda de o
procedura obisnuita (care poate de asemenea sa actioneze asupra unui obiect, n general vorbind), trebuie
precizat ca metodele implementeaza functionalitatea obiectului, sunt specifice obiectului caruia i se aplica si
sunt definite o data cu obiectul (deci la proiectarea aplicatiei de baza, n cazul obiectelor Office). Orice
procedura utilizator actioneaza asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect.
n general, se utilizeaza proprietatile pentru a accesa continutul si se apeleaza metodele pentru a realiza
functionalitatea obiectului. Totusi, aceasta distinctie este relativa: exista proprietati care se apropie de metode
si metode care seamana a fi proprietati. Atunci cnd vom discuta despre obiecte definite de utilizator se va
vedea ca este usor sa se treaca granita dintre metode si proprietati n proiectarea obiectelor.
Legatura !intre mo!elul o$iectelor si interfata utili*ator
Exista doua cai prin care utilizatorul poate interactiona cu obiectele aplicatiei:
o manual (utiliznd interfata utilizator a aplicatiei);
o programatic (utiliznd un limbaj de programare).
n accesul manual se utilizeaza tastatura, mouse-ul sau cheile directe pentru a naviga catre acea parte si
functie a aplicatiei care executa ceea ce se doreste (formatarea unui paragraf, stergerea unor formule dintr-o
celula, modificarea unui slide etc.).
n accesul programatic, de exemplu n instructiuni Visual Basic, se navigheaza n ierarhia de obiecte pentru a
identifica obiectul vizat si apoi se utilizeaza proprietatea sau metoda care produce efectul urmarit. De
exemplu, prin linia urmatoare, scrisa ntr-o procedura,
Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100
se navigheaza n caietul Activitate la foaia Vanzari si se nscrie valoarea 100 n celula A5. Este evident ca
nscrierea are loc efectiv doar n momentul executiei procedurii.
Deoarece ambele moduri de acces, interfata utilizator a aplicatiei de baza si Visual Basic, ajung la acelasi
continut si functionalitate, multe dintre obiectele, proprietatile si metodele existente n modelele de obiecte
Office au aceleasi denumiri cu elementele din interfata utilizator (denumiri de meniuri, comenzi, actiuni etc.).
Se poate observa, explicabil din punctul de vedere al evolutiei catre modelele obiectuale, o asemanare globala
a modelului de obiecte cu interfata utilizator. Aceasta asemanare este ntarita si de faptul ca pentru orice
actiune posibila prin interfata utilizator exista posibilitatea de a scrie cod Visual Basic echivalent (vezi si
discutia cu nregistrarea macro-urilor).
Din exemplul prezentat la accesul din VB, este de retinut importanta cunoasterii locului ocupat de obiectul
procesat n ierarhia de obiecte: pentru a utiliza proprietatile sau metodele lui trebuie identificat corect prin
navigarea (calificarea) de la nivelul cel mai de sus pna la el. ntregul traseu (cu exceptia nivelului Application,
care este uneori subnteles) trebuie specificat ca n exemplul aratat.
'olectii !e o$iecte
52
O colectie este un obiect care include obiecte similare (dar nu neaparat), astfel nct se poate opera cu
ansamblul lor. Acest lucru nu nseamna ca metodele sau proprietatile obiectelor (daca sunt toate de acelasi
tip) se aplica tuturor elementelor colectiei. Ca obiect separat, o colectie are proprietati si metode specifice
(numarul de elemente, adaugarea unui nou element etc.).
De regula, colectiile definite n Office (exista posibilitatea de a defini noi colectii) se remarca prin aceea ca au
forma de plural a denumirii elementelor lor: 2or:$oo:s este colectia de obiecte 2or:$oo:, Documents este
colectia de obiecte Document etc.
Elementele (membrii) colectiei se pot identifica prin numarul de ordine (ncepnd cu 1) sau prin nume (rezulta
ca ansamblul elementelor este ordonat). Astfel instructiunea
Presentations.tem("Perspective").Close
utilizata n PowerPoint produce activarea prezentarii cu numele Perspective si apoi o nchide. Exemplul
utilizeaza metoda tem pentru a returna elementul colectiei de prezentari cu numele specificat. De regula,
aceasta metoda este implicita, deci
Presentations("Perspective").Close
este o forma echivalenta.
Numarul de elemente ale colectiei se pot afla prin proprietatea 'ount, se pot adauga noi elemente prin
metoda A!! etc.
O utilizare frecventa a colectiilor este parcurgerea tuturor elementelor ntr-o structura For Each.Next sau
For.Next:
Public Sub DocScris()
For Each doc n Documents
f doc.Words.Count > 1 Then
MsgBox doc.Name + Str(doc.Words.Count)
End f
Next
End Sub
care, ntr-o aplicatie Word, afiseaza numele tuturor documentelor deschise cu mai mult de un cuvnt scris.
Automati*area actiunilor prin folosirea o$iectelor
Prin automatizarea unei actiuni se ntelege scrierea unei proceduri care sa produca, la executarea ei, actiunea
dorita. Executia poate fi comandata direct sau ca raspuns la declasarea unui eveniment.
Pentru a automatiza o actiune n Microsoft Office, se va obtine o referinta la obiectul care dispune de
continutul si functionalitatea pe care le urmarim si se vor aplica proprietatile si metodele adecvate. Procesul
poate necesita o succesiune de asemenea operatii.
53
O$tinerea unei referinte la un o$iect
Pentru a obtine o referinta la un obiect trebuie sa se construiasca o expresie care ajunge sa acceseze un
obiect din modelul de obiecte si apoi, utiliznd proprietati si/sau metode, sa se navigheze n sus sau n jos prin
ierarhia de obiecte pna cnd ajungem la obiectul dorit.
Proprietatile si metodele utilizate pentru a returna punctul de start si pentru a parcurge ierarhia de obiecte se
numesc accesori de obiecte (object accessors) sau accesori.
Cteva idei utile pentru construirea expresiei care returneaza referinta la un obiect sunt urmatoarele:
o un loc obisnuit 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 referinta la
obiectul Application. Urmatoarea expresie returneaza o referinta la obiectul Application
(pentru orice biblioteca de obiecte care contine un obiect Application).
Application
o pentru a ajunge din vrful ierarhiei pna la un obiect, se vor parcurge obiectele de pe toate
nivelele, utiliznd accesori care returneaza un obiect din altul. De exemplu, proprietatea
Documents a obiectului Word Application returneaza obiectul colectie Documents, care
reprezinta toate documentele deschise. Prin urmare urmatoarea expresie ntoarce o referinta la
obiectul colectie Documents:
Application.Documents
o Exista accesori directi (shortcut accessors) care dau acces direct la obiecte din model fara sa
fie necesar un acces prin vrful ierarhiei. Asemenea accesori sunt Documents, 2or:$oo:s,
Presentations care dau acces imediat la colectia de documente din Word, Excel si
PowerPoint. Exista si alte proprietati cu rol de accesori directi: Acti"e2in!o4,
Acti"eDocument, Acti"e2or:s3eet, Acti"e'ell. De exemplu, urmatoarea instructiune nchide
documentul Word activ:
ActiveDocument.Close
O$ser"atie. Se poate utiliza drept shortcut orice accesor care apare n zona Mem$ers of din Object Browser
atunci cnd este selectat Bglo$alsC n zona 'lasses; adica nu trebuie sa se returneze obiectul caruia i se
aplica proprietatea sau metoda naintea utilizarii proprietatii sau metodei, ntruct Visual Basic poate sa
determine din contextul n care se executa codul carui obiect i se aplica proprietatea sau metoda respectiva.
o Pentru a returna un singur element al unei colectii se va utiliza proprietatea sau metoda Item cu
numele sau numarul de ordine al elementului. Pentru cele mai multe colectii, Item este implicit,
deci poate lipsi
Workbooks.tem("Vanzari")
Workbooks("Vanzari")
o Pentru a "urca" n ierarhia de obiecte, se utilizeaza, de obicei, proprietatea Parent a obiectului
curent. De notat ca proprietatea Parent poate returna uneori, n special daca obiectul este
membru al unei colectii, "bunicul" obiectului n locul parintelui (adica parintele colectiei n locul
colectiei). De exemplu
54
Document.Parent
o returneaza obiectul Application si nu Documents.
o Prin functia &pe/ame (executata eventual n mmediate Window) se poate gasi ce tip de
obiect ntoarce proprietatea Parent (functia nu este limitata la aceasta proprietate, vezi VB
Help).
Aplicarea proprietatilor si meto!elor
Dupa obtinerea unei referinte la obiectul urmarit, acestuia i se pot aplica proprietati si metode pentru a
modifica valoarea unui atribut sau pentru a-l procesa. Se utilizeaza operatorul punct (".") pentru a separa
expresia care returneaza o referinta la obiect de proprietatea sau metoda care se aplica obiectului. De
exemplu
ActiveWindow.Left = 200
fixeaza pozitia din stnga a ferestrei active utiliznd proprietatea Left a obiectului 2in!o4, referinta la acest
obiect fiind returnata de accesorul direct Acti"e2in!o4.
ActiveDocument.Close
nchide documentul activ (n Word) utiliznd metoda 'lose a obiectului Document la care returneaza o
referinta accesorul Acti"eDocument.
Proprietatile si metodele pot avea argumente care sa precizeze valorile sau actiunile. Urmatorul exemplu
Word utilizeaza metoda PrintOut cu specificarea paginilor care se tiparesc:
ActiveDocument.PrintOut From:=" 3", To:=" 7"
Este uneori necesar sa se navigheze prin mai multe nivele n modelul de obiecte pentru a ajunge la ceea ce
se considera date reale n aplicatie, cum ar fi valorile din celulele foii de calcul sau textul dintr-un document
Word. Urmatoarele exemple Word arata cum se poate ajunge la text din vrful ierarhiei de obiecte:
o Proprietatea Application returneaza o referinta la obiectul Application.
o Proprietatea Documents a obiectului Application returneaza o referinta la colectia
Documents.
o Metoda Item a colectiei Documents returneaza o referinta la un songur obiect Document.
o Proprietatea 2or!s a obiectului Document returneaza o referinta la colectia 2or!s.
o Metoda Item a colectiei 2or!s returneaza o referinta la un singur obiect Range.
o Proprietatea e1t a obiectului Range stabileste textul itemului referit.
Astfel, urmatorul exemplu completeaza primul cuvnt din document
Application.Documents.tem(1).Words.tem(1).Text = "Primul "
Deoarece proprietatea Documents este o proprietate globala, poate fi utilizat fara calificativul Application;
deoarece Item este proprietate sau metoda implicita pentru colectia de obiecte, nu trebuie enuntata explicit.
Din aceste considerente, exemplul urmator realizeaza exact aceeasi actiune ca si exemplul precedent:
Documents(1).Words(1).Text = :Primul "
Pentru alte exemple de referinte si de utilizare a metodelor si proprietatilor se vor urmari exemplificarile de la
capitolele urmatoare.
55
A(utor Dn scrierea programelor
Pentru o imagine completa a uneltelor si mecanismelor prin care mediul de programare VB sustine activitatea
de scriere a instructiunilor sursa se va citi si capitolul dedicata mediului VBE.
9tili*area Macro Recor!er
nregistrarea unui macro ofera un ajutor important atunci cnd se cunoaste realizarea unei actiuni n interfata
utilizator a aplicatiei de baza si se doreste cunoasterea obiectelor, proprietatilor si metodelor care pot sa
realizeze acea actiune (sau ceva asemanator).
n general, codul generat de nregistrarea macro nu este foarte eficient si robust, deoarece nregistrarea
pleaca de la obiectul selectat n momentul startului si realizeaza doar navigarea n restul modelului de obiecte.
Orice utilizare ulterioara va necesita o selectare sau activare similara pentru a ndeplini actiunea asteptata.
Trebuie sa se considere codul nregistrat doar o prima schita a procedurii, modificari ulterioare trebuind sa
produca o varianta mai clara si mai robusta.
Codul generat este mai robust si mai flexibil daca va contine expresii care navigheaza prin ierarhia de obiecte
fara sa nceapa cu un obiect selectat sau activat. dei n acest sens pot fi obtinute din studierea exemplelor
date n Visual Basic Help: pozitionarea punctului de insertie pe o denumire de proprietate sau metoda si
actionarea tastei F1 afiseaza subiectul respectiv din Help.
O cale directa de accesare a fisierului de ajutor pentru un obiect este pozitionarea n graficul care prezinta
ierarhia de obiecte (specifica fiecarei aplicatii) si dublu click pe un obiect afiseaza subiectul dedicat obiectului
n VB Help.
Exemplele prezentate n Help pot fi copiate, n mod uzual, utiliznd Clipboard, n fereastra de cod.
O$(ect Bro4ser
Fiecare aplicatie din Microsoft Office are o biblioteca de obiecte (object library sau type library), care contine
informatii despre obiectele, proprietatile, metodele, evenimentele si constantele predefinite ale aplicatiei.
Pentru accesul la informatia respectiva se poate utiliza Object Browser, unealta 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
consulta, sau <All libraries> pentru a vedea o lista
completa. Daca biblioteca dorita nu este n lista celor
disponibile, se va crea o referinta la aceasta biblioteca prin
alegerile corespunzatoare n dialogul References (meniul
ools) al proiectului curent.
n boxa 'lasses se afiseaza numele tuturor obiectelor si
tipurilor enumerate (constantele predefinite) n bibliotecile
referite.
/ota. O clasa este un tip, o descriere a unui obiect. Un obiect este o instanta efectiva a unei clase. Deseori
acesti termeni sunt utilizati unul n locul celuilalt, daca nu se produc confuzii (uneori chiar si atunci).
56
n boxa Mem$ers of se afiseaza toate proprietatile, metodele si evenimentele proprii (asociate) clasei
selectate n boxa 'lasses.
Selectarea unei intrari n lista poate fi completata cu F1 pentru a vedea textul ajutator, iar n zona inferioara
(Detail pane) se afiseaza infromatii privind sintaxa, starea read-only sau read-write, biblioteca unde apartine,
tipul rezultatului returnat (data sau obiect). Daca o informatie este de tip legatura, activarea acesteia produce
informatii suplimentare, lucru util pentru a deduce modul de navigare catre obiect. n figura prezentata se vede
proprietatea 'ount a clasei A!!Ins, proprietatea returnnd o valoare de tip Long. Textul din zona Detail
poate fi copiat (prin Clipboard) sau dus prin drag-and-drop ntr-o fereastra cod.
Legarea timpurie si uneltele !e construire a instructiunilor
Atunci cnd se creeaza ntr-o aplicatie o variabila obiect care se refera la un obiect furnizat de alta aplicatie,
Visual Basic trebuie sa verifice ca obiectul exista si ca proprietatile si metodele utilizate pentru obiect sunt
specificate corect. Acest proces de verificare se numeste legare (binding). Legarea poate sa apara n timpul
executiei proiectului (legare trzie) sau n timpul compilarii (legare timpurie). Codul legat trziu este mai ncet
dect codul legat timpuriu. n plus, uneltele de ajutor n scrierea codului pot sa lucreze corect doar n cazul
legarii timpurii.
Pentru a lega timpuriu codul se vor parcurge etapele:
Se stabileste o referinta la biblioteca de tipuri care contine obiectele referite (Tools - References).
Se declara variabila obiect de un tip specific (de exemplu As Document si nu As Object).
Daca se scrie cod care utilizeaza obiecte din mai multe biblioteci, se va specifica numele aplicatiei
unde sunt declarate obiectele, mai ales daca obiecte cu acelasi nume exista n mai multe biblioteci. (de
exemplu As Excel.Window).
Daca o proprietate sau o metoda utilizata returneaza un tip generic Object si nu un tip specific, atunci pentru
legarea timpurie se va declara mai nti o variabila de tipul specific si apoi se va atribui rezultatul generic
returnat acestei variabile, dupa modelul
Dim testWs As Worksheet
Set testWs = Workbooks(1).Worksheets(1)
necesar deoarece metoda Item a obiectului 2or:s3eets returneaza un tip O$(ect si nu 2or:s3eet (chiar
daca se refera la o foaie de calcul).
Programarea o$iectelor altei aplicatii
Se poate executa, ntr-o aplicatie din Office, cod care sa lucreze cu obiecte din alta aplicatie. Pentru a realiza
acest lucru, se va urmari schema urmatoare:
1. Se stabileste o referinta la biblioteca de tipuri a celeilate aplicatii (meniul Tools - References).
2. Se declara variabile obiect care vor referi obiecte din alta aplicatie cu tipuri specifice. Se va urmari
calificarea fiecarui tip cu numele aplicatiei care expune obiectul. Exemplul urmator declara o variabila
care se refera la un document Word si o variabila care se refera la un caiet Exce:
Dim appWD As Word.Application, wbXL As Excel.Workbook
3. Se utilizeaza functia CreateObject cu identificatorul programatic OLE al obiectului cu care se doreste
sa se lucreze n cealalta aplicatie, dupa modelul
57
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Visible = True
4. Pentru informatii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic dentifiers".
5. Se aplica obiectului, continut n variabila, proprietatile si metodele dupa modelul urmator, care creeaza
un nou document Word:
Dim appWD As Word.Application
Set appWD = CreateObject("Word.Application.8")
appWD.Documents.Add
6. La sfrsitul lucrului cu cealalta aplicatie, se va utiliza metoda Quit pentru a o nchide, dupa modelul
appWD.Quit
58
O$iecte Microsoft 2or! (I)
O$iectul Application
Proprietati (obiectul Application)
DisplayScrollBars
DisplayStatusBar
Height
Width
WindowState
ActiveDocument
ActivePrinter
ActiveWindow
Documents
Selection
Windows
Metode (obiectul Application)
Quit
O$iectul Document
Referirea unui Document
Deschiderea documentelor
Crearea/salvarea documentelor
Activarea unui document
Tiparirea unui document
nchiderea documentelor
Accesarea obiectelor din Document
O$iectul Range
Obiect Range sau obiect Selection
Referinta prin metoda Range
Referinta prin proprietatea Range
Modificarea unui document
Lucrul cu textul din Range
Redefinirea unui obiect Range
Atribuirea obiectelor Range
Visual Basic suporta un set de obiecte care corespund direct elementelor din Microsoft Word 97, cele mai
multe familiare celor care cunosc interfata utilizator din Word: obiectul Document reprezinta un document
deschis, obiectul Boo:mar: reprezinta un bookmark (semn de carte, punct de referinta) ntr-un document etc.
Orice element din Word documente, tabele, paragrafe, cmpuri etc. poate fi reprezentat printr-un obiect
din Visual Basic. Pentru automatizarea lucrului n Word se utilizeaza metodele si proprietatile acestor obiecte.
Modelul de obiecte din Word 97 cuprinde aproximativ 180 de obiecte. O reprezentare grafica a structurii
ierarhice se poate vedea n Help "Microsoft Word Objects". O descriere detaliata a unui obiect se obtine prin
dublu click pe numele obiectului (n diagrama) sau, uzual, prin indexul din Help. La instalarea aplicatiei trebuie
sa se mearga pe 'ustom si sa se selecteze Online Eelp for Visual Basic.
Dintr-un document Word, pentru a ajunge la modelul de obiecte se deschide dialogul Eelp si se merge pe
succesiunea 'ontents an! In!e1 8 Microsoft 2or! Visual Basic Reference 8 Visual Basic Reference 8
Getting )tarte! 4it3 Visual Basic 8 Microsoft 2or! O$(ects.
Din editorul VB se ajunge la continutul si indexul VB Help for Word prin succesiunea Eelp 8 'ontents an!
In!e1 8 Microsoft 2or! Visual Basic Reference (din fisa Contents) Shortcut to Microsoft Word Visual
Basic Reference.
59
n cele ce urmeaza se vor prezenta doar principalele obiecte (mai sus n ierarhie, cele mai des utilizate, pentru
operatiunile curente etc.) cu principalele metode si proprietati si pentru scopurile uzuale.
O$iectul Application
La pornirea unei sesiuni Word se creeaza automat un obiect Application. Se utilizeaza proprietatile si
metodele obiectului Application pentru a controla sau returna (afla) atributele ntregii aplicatii, a controla
aspectul ferestrei Word si pentru a accesa restul modelului de obiecte. Se utilizeaza proprietatea Application
pentru a returna obiectul Application Word.
Proprietati (Application)
Dintre proprietatile care controleaza aspectul vizibil al aplicatiei mentionam cteva n continuare.
Displa&)crolllBars
Exprima faptul daca sunt sau nu afisate barele de defilare. Read/write.
La citire, returneaza o valoare Boolean:
True, daca un document, cel putin, are o bara de defilare
False, daca n nici o fereastra de document nu exista bare de defilare.
Valoarea proprietatii se poate modifica:
Atribuirea valorii True afiseaza barele de defilare n toate ferestrele
Atribuirea valorii False elimina barele de defilare din toate ferestrele.
Application.DisplayScrollBars = True
Application.DisplayScrollBars = False
Pentru barele orizontale sau verticale, individual, se utilizeaza proprietatile Displa&Eori*ontal)crollBar si
Displa&Vertical)crollBar pentru o fereastra sppecificata.
Displa&)tatusBar
Exprima faptul daca este afisata bara de stare a aplicatiei. Read/write. Boolean.
La citire, returneaza o valoare Boolean: True daca bara este afisata, False n caz contrar.
La scriere atribuirea unei valori logice produce efectul evident.
Eeig3t
Read/write. Long.
naltimea ferestrei aplicatiei Word. Pentru a vedea dimensiunea maxima admisa se va utiliza proprietatea
9sa$leEeig3t.
2i!t3
Read/write. Long.
60
Returneaza sau fixeaza latimea obiectului, n puncte.
With Application
.Height = 450
.Width = 600
End With
2in!o4)tate
Read/write. Long.
Returneaza sau stabileste starea ferestrei aplicatiei. Poate fi una dintre valorile wdWindowStateMaximize,
wdWindowStateMinimize sau wdWindowStateNormal, cu interpretari evidente. Valoarea
wdWindowStateNormal arata o fereastra care nu este minimizata sau maximizata.
Pentru a putea seta starea ferestrei, aceasta trebuie sa fie activa (se va utiliza metoda Acti"ate n acest
scop). Urmatoarea instructiune maximizeaza fereastra aplicatiei Word
Application.WindowState = wdWindowStateMaximize
***
Alte proprietati care controleaza comportarea globala a aplicatiei Word, cum ar fi cele care corespund
atributelor accesate prin comanda Options din meniul ools, se gasesc la obiectul Options.
Utiliznd proprietatea Options a obiectului Applications, se returneaza un obiect Options care poate fi apoi
configurat, dupa exemplul
With Application.Options
.AllowDragAndDrop = True
.ConfirmConversions = False
.MeasurementUnit = wdPoints
End With
Pentru informatii complete se va studia obiectul Options.
***
Dintre proprietatile obiectului Application care ofera acces la obiecte situate mai jos n ierarhie (accesori) sunt
enumerate cele mai des utilizate.
Acti"eDocument
Read-only.
Returneaza un obiect Document care reprezinta documentul activ (cel care are focusul). Daca nu exista nici
un document deschis, atunci apare o eroare.
Acti"ePrinter
Read/write. String.
Returneaza sau stabileste numele imprimantei active. Exemplul urmator alege imprimanta activa:
61
ActivePrinter = "HP LaserJet 4 local on LPT1:"
Se observa utilizarea denumirii din mediul Windows.
Acti"e2in!o4
Read-only.
Returneaza un obiect 2in!o4 care reprezinta fereastra activa. Daca nu exista nici o fereastra deschisa,
apare o eroare.
MsgBox Application.ActiveWindow
ActiveWindow = "Fereastra activa"
Primul exemplu afiseaza numele ferestrei active, al doilea atribuie un nou nume ferestrei active. Este de
remarcat ca numele ferestrei nu este obligatoriu identic cu numele documentului si ca exemplele functioneaza
corect pentru ca proprietatea implicita a obiectului returnat este numele (/ame).
Documents
Read-only.
ntoarce colectia Documents a tuturor documentelor deschise.
)election
Read-only.
ntoarce obiectul )election, care reprezinta un domeniu selectat (redus eventual la punctul de insertie). Este
de remarcat ca exista o singura selectie pe fereastra (sau ochi de fereastra) si doar una este activa cea
returnata.
Pentru exemple se va vedea prezentarea obiectului )election.
2in!o4s
Read-only.
Returneaza colectia 2in!o4s a tuturor ferestrelor document. Colectia corespunde ferestrelor cu denumirile
(si numerele de ordine) listate la meniul 2in!o4 din Word.
MsgBox Windows.Count
afiseaza numarul ferestrelor deschise n Word (atasate unor documente).
Meto!e (Application)
Dintre metodele obiectului Application enumeram doar Fuit, celelalte sunt sau mai rar utilizate, sau se mai
aplica si altor obiecte si vor fi prezentate ulterior.
Fuit
62
Apelul procedurii duce la nchiderea aplicatiei Word si, optional, salveaza sau ruteaza documentele deschise.
Sintaxa:
expression.Fuit(SaveChanges, Format, RouteDocument)
unde
expression este o expresie care returneaza un obiect Application.
-ave0hanges este de tip Variant, optional, si specifica daca Word salveaza documentele naintea nchiderii.
Poate fi o constanta (de tipul enumerat WdSaveOptions) wdDoNotSaveChanges, wdPromptToSaveChanges
sau wdSaveChanges, interpretarile fiind evidente.
)riginal1ormat este de tip Variant, optional, si specifica modul n care Word salveaza documentele al caror
format original nu a fost acela de document Word. Poate fi o constanta (de tipul enumerat WdOriginalFormat)
dintre wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.
*oute2ocument este de tip Variant, optional. Este True daca se doreste directarea documentului catre
urmatorul recipient. Daca documentul nu are atasata o fisa de rutare (routing slip), argumentul este ignorat
(vezi obiectul Routing)lip).
n exemplul urmator
Application.Quit SaveChanges:=wdPromptToSaveChanges, OriginalFormat:=wdWordDocument
se paraseste Word, se ntreaba utilizatorul daca se salveaza documentele care au fost modificate de la ultima
salvare si toate documentele se salveaza n format Word (indiferent de formatul initial).
O$iectul Document
Deschiderea sau crearea unui fisier n Word produce crearea unui obiect Document. Se utilizeaza
proprietatile si metodele obiectului Document sau ale colectiei Documents pentru a deschide, crea, salva,
activa si nchide fisiere.
n prezentarea obiectului Document alegem calea actiunilor uzuale asupra unui document si nu listarea
proprietatilor si metodelor (dect acolo unde este absolut necesar).
Returnarea unui o$iect Document
Se poate obtine orice document deschis ca un obiect Document prin
Documents(index)
unde index este numele documentului (ca sir) sau numarul de ordine al documentului n colectie. Deoarece
numarul de ordine se poate schimba, prin modificarea colectiei, se recomanda utilizarea numelor
documentelor. n exemplul
Set wdRaport = Documents("Raport.doc")
variabila wdRaport, definita de tip obiect, contine un obiect Document care se refera la documentul deschis
"Raport.doc". Orice transformare a variabilei se va reflecta n documentul Raport.doc.
63
Se poate utiliza si proprietatea Acti"eDocument (vezi Application) pentru a returna obiectul Document care
se refera la documentul activ:
f Documents.Count >= 1 Then
MsgBox ActiveDocument.Name
Else
MsgBox "Nici un document nu este deschis"
End f
Desc3i!erea !ocumentelor
Pentru a deschide un document existent, se va utiliza metoda Open a colectiei Documents, metoda care
deschide documentul specificat si l adauga la colectia Documents. Returneaza un obiect Document.
Sintaxa, n versiunea aplicabila aici, este
expression.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,
PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format)
unde
expression este o expresie care returneaza un obiect Documents.
1ileName este de tip Variant si contine numele documentului (inclusiv calea, daca este necesar). n Windows
se pot specifica mai multe fisiere separate prin spatii. Este semnalata eroare daca fisierul specificat nu exista.
0onfirm0onversions este de tip Variant, optional. Are valoarea True pentru a afisa dialogul 'on"ert 5ile daca
fisierul nu este n format Word.
*ead)nly este de tip Variant, optional. Are valoarea True daca documentul se deschide ca read-only.
!dd/o*ecent1iles este de tip Variant, optional. Are valoarea True daca numele fisierului se adauga listei
fisierelor recent utilizate (de la baza meniului 5ile).
&assord2ocument este de tip Variant, optional si reprezinta parola necesara la deschiderea documentului.
&assord/emplate este de tip Variant, optional si reprezinta parola necesara la deschiderea sablonului
(template).
*evert este de tip Variant, optional. Controleaza ce se ntmpla daca FileName este numele unui fisier deja
deschis: True pentru a neglija orice schimbari nesalvate si redeschiderea documentului; False pentru a activa
documentul deschis.
+rite&assord2ocument este de tip Variant, optional. Este parola necesara pentru salvarea schimbarilor
aduse documentului.
+rite&assord/emplate este de tip Variant, optional. Este parola necesara pentru salvarea modificarilor
aduse sablonilui.
1ormat este de tip Variant, optional. ndica tipul de conversie utilizat la deschiderea documentului. Poate fi o
constanta (din tipul enumerat 4!Open5ormat) dintre:
wdOpenFormatAuto, wdOpenFormatDocument WdOpenFormatRTF,
64
,
wdOpenFormatTemplate, wdOpenFormatText, WdOpenFormatUnicodeText.
Valoarea implicita este wdOpenFormatAuto.
Pentru o mai buna informare asupra ultimului argument, se va studia obiectul 5ile'on"erter.
n exemplul urmator se deschide fisierul Test.doc din folderul curent:
Set wdTestDoc = Documents.Open(FileName:="test.doc")
Este de remarcat, n exemplu, ca fisierul este n directorul curent, ceea ce poate produce erori la executarea
codului: este suficent ca utilizatorul sa schimbe folderul pentru ca documentul test.doc sa nu mai fie gasit. Din
acest motiv este de preferat ca numele sa con de remarcat, n exemplu, ca fisierul este n directorul curent,
ceea ce poate produce erori la executarea codului: este suficent ca utilizatorul sa schimbe folderul pentru ca
documentul test.doc sa nu mai fie gasit. Din acest motiv este de preferat ca numele sa contina calea
completa, ceea ce contribuie la robustetea codului. n acelasi scop se vor utiliza proprietatile Pat3)eparator
(a obiectului Application), care returneaza caracterul separator utilizat de sistemul de fisiere, diferit n
DOS/Windows si Macintosh si Default5ilePat3 (a obiectului Options), care returneaza/seteaza cai ale
folderelor specificate.
n exemplul urmator se utilizeaza obiectul FileSearch pentru a determina daca exista fisierul care trebuie
deschis:
defaultDir = Options.DefaultFilePath(wdDocumentsPath)
With Application.FileSearch
.FileName = "test.doc"
.Lookn = defaultDir
.Execute
f .FoundFiles.Count = 1 Then
Documents.Open FileName:=defaultDir & _
Application.PathSeparator & "test.doc"
Else
MsgBox "Fisierul test.doc nu este gasit"
End f
End With
Se va observa utilizarea structurii With.End With si a modului cum se formeaza argumentul FileName din
cale si denumire.
O alta modalitate de deschidere a unui document este prin afisarea dialogului Open uzual n Office (ca si n
alte aplicatii Windows). Acest mod se realizeaza prin
Dialogs(wdDialogFileOpen).Show
care returneaza un obiect Dialog ce se refera la dialogul Open (din meniul 5ile) iar metoda )3o4 afiseaza si
executa actiunile executate n boxa de dialog Open.
Utilizarea metodei Displa& (n locul metodei )3o4) produce doar afisarea dialogului fara nici o alta actiune.
Daca utilizatorul apasa butonul O@ al boxei, atunci este returnata valoarea -1 si se poate sti numele fisierului
selectat n boxa dupa modelul urmator:
65
Set dlg = Dialogs(wdDialogFileOpen)
aButton = dlg.Display
fSelected = dlg.Name
f aButton = -1 Then
Documents.Open FileName:=fSelected
End f
O$ser"atie. Pentru o discutie mai ampla asupra utilizarii cutiilor de dialog definite n Word se va vedea Word
VB Help "Displaying built-in Word dialog boxes".
Pentru a determina daca un anumit document este deschis se poate enumera colectia Documents si testa
numele documentelor deschise. n urmatorul exemplu se activeaza documentul "cautat.doc" daca este
deschis si se deschide daca nu este deja deschis.
docFound = True
For Each aDoc n Documents
f nStr(1,aDoc.Name,"cautat.doc",1) Then
aDoc.Activate
Exit For
Else
docFound = False
End f
Next aDoc
f docFound = False Then Documents.Open FileName:="cautat.doc"
Pentru a determina cte documente sunt deschise se utilizeaza proprietatea 'ount a colectiei Documents:
f Documents.Count = 0 Then MsgBox "Nu este deschis nici un document"
'rearea si sal"area !ocumentelor
Pentru a crea un nou document se utilizeaza metoda A!! aplicata colectiei Documents. Metoda returneaza
documentul creat ca un obiect Document, astfel nct valoarea returnata poate fi atribuita 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 = nchesToPoints(1.25)
ultima instructiune fixeaza marginea de sus la 1.25".
Documentul nou devine documentul activ.
Pentru a salva un document nou pentru prima data, se utilizeaza metoda )a"eAs a obiectului Document.
Exemplul urmator este de acest fel:
ActiveDocument.SaveAs FileName:="salvat.doc"
Documentul activ este salvat cu numele "salvat.doc" si poate fi identificat cu acest nume n colectia
Documents.
66
Exemplul urmator construieste o expresie mai complicata, exploatnd cele spuse mai sus: se creeaza un nou
document care este salvat imediat cu un nume si apoi se insereaza n document un tabel cu doua linii si trei
coloane.
Documents.Add.SaveAs FileName:="vanzari.doc"
Documents("vanzari.doc").Tables.Add _
Range:=Selection.Range, NumRows:=2, NumColumns:=3
Pentru salvarea modificarilor efectuate ntr-un document, se utilizeaza metoda )a"e a colectiei Documents:
Documents("vanzari.doc").Save
Utilizarea metodei )a"e cu un document nou deschide dialogul )a"e As pentru a ntreba utilizatorul despre
numele dat fisierului.
Pentru salvarea tuturor fisierelor deschise se va utiliza metoda )a"e aplicata colectiei Documents.
Metoda )a"e are sintaxa dependenta de obiectul caruia i se aplica:
expression.)a"e
unde expression este orice expresie care returneaza un obiect Document sau emplate, este aplicabila unui
document sau template.
expression.)a"e(NoPrompt, OriginalFormat)
este aplicabila colectiei Documents. Argumentele sunt
expression este orice expresie care returneaza un obiect Documents%
No&rompt este de tip Variant, optional. Are valoarea True pentru ca Word sa salveze automat toate
documentele, False pentru ca Word sa ntrebe utilizatorul naintea de salvarea fiecarui document care a fost
modificat.
OriginalFormat este de tip Variant, optional. Specifica modul n care sunt salvate documentele.
Poate fi o constanta (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser
sau wdWordDocument.
Acti"area unui !ocument
Pentru activarea unui alt document se aplica metoda Acti"ate obiectului Document respectiv. Reamintim ca
la crearea unui nou document, acesta ramne activ. Documentul activat trebuie sa fie deschis (inclus n
colectia Documents):
Documents("raport.doc").Activate
Doc1.Activate
daca variabila Doc1 a primit ca valoare un document deschis.
Metoda Acti"ate, aplicabila mai multor obiecte (vezi Word VB Help Activate Method), are sintaxa
expression.Acti"ate
67
unde expression este orice expresie care returneaza un obiect caruia i se poate aplica metoda.
iparirea unui !ocument
ntruct tiparirea unui document este gestionata de mai multe comenzi si parametri, din dialoguri diferite n
mediul Word, controlul tiparirii din Visual Basic necesita eventuale interventii asupra obiectului Options
(pentru a fixa parametrii accesati uzual prin ools 8 Options 8 fisa Print) si utilizarea metodei PrintOut,
aplicabila obiectului Document.
Proprietatile obiectului Options, care privesc tiparirea, sunt identificate usor prin aceea ca numele lor ncepe
cu Print: Print'omments, PrintEi!!ene1t, PrintDra4ingO$(ects, Print5iel!'o!es etc., atribuirea valorii
True fiind echivalenta cu marcarea boxei de control din dialogul Word corespunzator.
Metoda PrintOut este aplicabila obiectelor Application, Document sau Window si are parametri
corespunzatori optiunilor din dialogul Print (meniul 5ile din mediul Word). Sintaxa, cu specificarea si
explicarea principalelor argumente, este
expression.PrintOut(Background, Append, Range, OutputFileName, From, To, tem, Copies, Pages,
PageType, PrintToFile, Collate, FileName)
unde
expression este orice expresie care returneaza un obiect Application. Document sau 2in!o4. Background
este de tip Variant, optional. Are valoarea True daca tiparirea are loc n fundal (macro-ul continua n timpul
tiparirii documentului).
!ppend este de tip Variant, optional. Are valoarea True atunci cnd, la tiparirea n fisier, documentul este
adaugat fisierului specificat n argumentul OutputFileName; are valoarea False pentru rescrierea fisierului
OutputFileName.
*ange este de tip Variant, optional si specifica tipul de domeniu tiparit. Poate fi una din constantele (de tip
WdPrintOutRange): wdPrintAllDocument, wdPrintCurrentPage, wdPrintFromTo, wdPrintRangeOfPages sau
wdPrintSelection.
)utput1ileName este de tip Variant, optional. Daca PrintToFile este True, atunci argumentul da numele
(eventual cu cale) pentru fisierul unde are loc tiparirea.
1rom este de tip Variant, optional. Specifica numarul paginii de unde ncepe tiparirea, daca Range este
wdPrintFromTo.
/o este de tip Variant, optional. Specifica numarul paginii pna unde se tipareste, daca Range este
wdPrintFromTo.
(tem este de tip Variant, optional. Specifica elementul care se tipareste. Poate fi o constanta (de tipul
enumerat WdPrintOuttem): wdPrintAutoTextEntries, wdPrintComments, wdPrintDocumentContent,
wdPrintKeyAssignments, wdPrintProperties sau wdPrintStyles.
0opies este de tip Variant, optional. Specifica numarul de copii tiparite.
&ages este de tip Variant, optional. Specifica numerele paginilor si secventele de pagini care se tiparesc,
separate prin virgule, daca Range este wdPrintRangeOfPages. De exemplu, "2, 6-10" nseamna pagina 2 si
paginile de la 6 la 10.
68
&age/ype este de tip Variant, optional. Specifica tipul de pagini tiparite. Poate fi o constanta (de tipul
WdPrintOutPages): wdPrintAllPages, wdPrintEvenPagesOnly sau wdPrintOddPagesOnly.
&rint/o1ile este de tip Variant, optional. Are valoarea True pentru a trimite comenzile de tiparire catre un fisier.
Numele fisierului este dat n argumentul OutputFileName.
0ollate este de tip Variant, optional. Are valoarea True pentru a tipari toate paginile documentului naintea
tiparirii urmatoarei copii (argument valabil n cazul tiparirii mai multor copii ale documentului argumentul
Copies).
1ileName este de tip Variant, optional. Numele fisierului (inclusiv calea, daca este n alt folder dect cel
curent) care contine documentul care se tipareste. Daca argumentul este omis, atunci se tipareste documentul
activ. Argumentul este admis doar pentru obiectul Application.
Exemplul urmator fixeaza pentru documentul activ tiparirea textului ascuns si tipareste primele trei pagini:
Options.PrintHiddenText = True
ActiveDocument.PrintOut Range:=wdPrintFromTo, From:=" 1", To:=" 3"
Daca tiparirea se efectueaza cu valorile curente (implicite) ale parametrilor, atunci este suficienta comanda:
ActiveDocument.PrintOut
Se observa ca operatiunea de tiparire necesita, pentru o procesare mai fina, specificarea documentului,
specificarea paginilor, a tipului de tiparire (toate, pagini pare sau impare), specificarea destinatiei (imprimanta
sau fisier).
Se va vedea si proprietatea Page)etup care controleaza atributele paginii pentru document, sectiune etc.
?nc3i!erea !ocumentelor
Pentru nchidere se aplica metoda 'lose obiectului Document sau colectiei Documents.
Documents("raport.doc").Close
Daca s-au efectuat modificari n document, de la ultima salvare, se afiseaza dialogul de salvare. nchiderea
tuturor documentelor deschise se efectueaza aplicnd metoda 'lose pentru ntreaga colectie:
Documents.Close
Metoda 'lose este aplicabila mai multor obiecte. Sintaxa pentru Documents sau Document este
expression.'lose(SaveChanges, OriginalFormat, RouteDocument)
unde
expression este o expresie care returneaza un obiect Document sau Documents.
-ave0hanges este de tip Variant, optional. Specifica tipul de actiune privind salvarea documentului nainte de
nchidere. Poate fi o constanta (de tip 2!)a"eOptions): wdDoNotSaveChanges, wdPromptToSaveChanges
sau wdSaveChanges, cu interpretari evidente.
69
)riginal1ormat este de tip Variant, optional. Specifica formatul documentului la salvare (poate fi o constanta
(de tip 2!Original5ormat): wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.
*oute2ocument este de tip Variant, optional. Are valoarea True daca documentul este rutat catre urmatorul
recipient. Daca documentul nu are atasata o fisa de rutare (routing slip), argumentul este ignorat (vezi obiectul
Routing)lip).
Urmatorul exemplu nchide, fara salvare, toate documentele:
Documents.Close SaveChanges:=wdDoNotSaveChanges
Accesarea o$iectelor !intr<un !ocument
Din obiectul Document se pot accesa, prin proprietati sau metode, obiecte care corespund entitatilor care
formeaza documentul scris n Word. Dintre obiectele accesibile mentionam (nu toate): Boo:mar:s.
'3aracters. 'omman!Bars. 'omments. DocumentProperties. En!notes. 5iel!s. 5ootnotes.
5orm5iel!s. 5rames. E&perLin:s. In!e1es. Lists. Listemplates. Page)etup. Paragrap3s. Range.
Re"isions. )ections. )entences. )3apes. )tor&Ranges. )t&les. )u$!ocuments. a$les.
a$lesOf'ontents. a$lesOf5igures. emplate. Varia$les. 2in!o4s. 2or!s.
De exemplu, prin
MsgBox "Sunt " & ActiveDocuments.Tables.Count & " tabele n document"
afiseaza un mesaj cu numarul tabelelor existente n documentul activ.
Este evident ca utiliznd proprietatile si metodele obiectelor astfel returnate se pot modifica programatic
obiectele referite: se pot adauga si formata tabele, cmpuri, paragrafe, cuvinte etc.
ActiveDocument.Footnotes.Add Range:=myRange, Text:="Textul notei de subsol adaugate"
adauga o nota de subsol la locul din document specificat de variabila myRange.
O$iectul Range
Un obiect Range reprezinta o zona continua dintr-un document. Fiecare obiect Range este definit de o pozitie
(de caracter) de nceput si de o pozitie (de caracter) de sfrsit. Utilizat pentru identificarea unor portiuni din
document, obiectul Range este similar obiectului Boo:mar:, diferenta fiind totusi importanta: un obiect Range
exista doar att timp ct se executa procedura care l-a definit.
Atunci cnd pozitia de nceput este identica cu pozitia de sfrsit, obiectul Range identifica punctul de insertie.
Nu exista limitari asupra ntinderii unui obiect Range.
Obiectele Range sunt independente de selectia din document: se poate defini si modifica un domeniu fara sa
se schimbe selectia. Se pot defini, de asemenea, domenii multiple ntr-un document, n timp ce selectia este
unica ntr-un ochi de fereastra..
Pentru a ntelege toate proprietatile obiectului Range (si ale altor obiecte, de altfel), trebuie stiut ca zonele
unui document se presupun structurate n episoade (stories). Un episod (story) este o zona de text diferita de
celelalte zone din acel document. Astfel, daca un document contine text principal (body text), note de subsol si
anteturi, atunci documentul contine un episod cu textul principal, un episod cu note de subsol si un episod cu
anteturi. Exista 11 tipuri diferite de episoade posibile ntr-un document, corespunznd urmatoarelor constante
(din WdStoryType):
70
WdEndnotesStory wdEvenPagesFooterStory wdEvenPagesHeaderStory
WdFirstPageFooterStory wdFirstPageHeaderStory wdFootnotesStory
WdMainTextStory wdPrimaryFooterStory wdPrimaryHeaderStory
WdTextFrameStory
Tipul episodului pentru un obiect de gen domeniu (Range), selectie ()election) sau semn de carte
(Boo:mar:) este returnat de proprietatea )tor&&pe. Cunoasterea acestei proprietati este importanta prin
aceea ca mediul Word deschide ferestre sau ochiuri diferite dupa episodul n care este punctul de insertie
(selectia), Pentru navigarea programatica ntre aceste ochiuri trebuie sa se cunoasca valoarea proprietatii
)tor&&pe.
Proprietatile )tart. En! si )tor&&pe identifica un obiect Range n mod unic. )tart si En! specifica sau
returneaza pozitiile de nceput si, respectiv, de sfrsit ale obiectului Range. Pozitia de caracter de la nceputul
fiecarui episod este 0, pozitia de dupa primul caracter este 1 s.a.m.d.
Proprietatile )tart si En! sunt de tip Long, read/write. Pozitiile returnate sunt relative la nceputul episodului.
Daca fixarea unei proprietati strica ordinea naturala dintre start si end, atunci cealalta valoare este fixata
automat la valoarea atribuita.
Prin atribuirea de valori proprietatilor )tart si En! se poate modifica dimensiunea domeniului referit.
O$iect Range "s% o$iect )election
n general, este de preferat sa se opereze cu obiecte Range n loc de obiecte )election, deoarece:
se pot defini si utiliza mai multe obiecte Range (doar un obiect )election pe fereastra);
procesarea obiectelor Range nu modifica textul selectat;
procesarea obiectelor Range este mai rapida dect a selectiei.
La nregistrarea unui macro creeaza, de obicei, referinte la obiectul )election. Utilizarea obiectului Range
poate simplifica totusi codul creat. Urmatorul exemplu aplica stilul bold primelor doua cuvinte din document si
insereaza un paragraf dupa cele doua cuvinte:
Set myRange = ActiveDocument.Range(Start:=0, End:=ActiveDocument.Words(2).End)
myRange.Bold = True
myRange.nsertParagraphAfter
Este interesant de comparat acest cod cu secventa obtinuta la nregistrarea unui macro care efectueaza
aceeasi sarcina.
Returnarea unui o$iect Range prin meto!a Range
Aplicata unui obiect Document, metoda Range returmeaza un obiect Range situat n episodul principal.
Sintaxa este
expression.Range(Start, End)
unde
expression este orice expresie care returneaza un obiect Document.
71
-tart este de tip Long, optional. Specifica punctul de nceput (n pozitii de caracter).
3nd este de tip Long, optional. Specifica punctul de sfrsit (n pozitii de caracter).
Pozitiile de caracter ncep cu 0 la nceputul documentului. Sunt numarate toate caracterele, inclusiv
caracterele netiparibile. Caracterele ascunse se numara chiar daca nu sunt afisate. Daca nu se specifica
pozitiile de nceput si/sau sfrsit, se considera, implicit, nceputul si sfrsitul documentului.
Exemplul urmator scrie n bold primele 10 caractere ale documentului:
ActiveDocument.Range(Start:=0, End:=10).Bold = True
Daca este necesar ca obiectul Range returnat sa fie referit de mai multe ori, se va utiliza instructiunea )et prin
care se atribuie obiectul returnat unei variabile obiect:
Dim myRange As Range
Set myRange = ActiveDocument.Range
myRange.nsertAfter Text:="Final"
Se observa definirea unei variabile obiect de tip specificat Range, obtinerea unui obiect Range egal cu tot
documnetul (prin nespecificarea valorilor de start si end), atribuirea acestui obiect variabilei definite si
utilizarea variabilei pentru a referi obiectul. Efectul este inserarea cuvntului "Final" dupa ultimul caracter din
document.
n exemplul urmator se observa utilizarea unui obiect Range doar ca punct de referinta n document
(asemenea unui Boo:mar:):
Set inceputDoc = ActiveDocument.Range(Start:=0, End:=0)
Pozitiile de start si end pot fi specificate direct sau prin intermediul proprietatilor )tart si En! ale altor obiecte
cum ar fi )election, Boo:mar: sau Range, ca n exemplul urmator n care se defineste un domeniu care se
refera la a doua si a treia propozitie 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 )elect a
obiectului pentru a produce selectarea textului din domeniu si a verifica, astfel, definirea corecta a obiectului
Range:
myRange.Select
selecteaza portiunea de text continuta n variabila myRange, careia n prealabil i s-a atribuit un Range.
Returnarea unui o$iect Range prin proprietatea Range
Proprietatea Range este disponibila pentru multiple obiecte de exemplu Paragrap3. Boo:mar:. En!note.
'ell si este utilizata pentru ntoarcerea unui obiect Range.
Exemplele urmatoare sunt usor interpretabile. Pentru explicatii complete se vor studia obiectele respective.
Active.Document.Paragraphs(1).Range
72
ActiveDocument.Tables(1).Rows(1).Range
ActiveDocument.Bookmarks(1).Range
Nu trebuie uitata structura With.End With pentru procesari multiple ale aceluiasi obiect Range.
Mo!ificarea unei portiuni a unui !ocument
Visual Basic include obiecte care pot fi utilizate pentru a modifica urmatoarele tipuri de elemente ale
documnetului: caractere, cuvinte, propozitii, paragrafe si sectiuni. Tabelul urmator arata proprietatile (aplicabile
unor diverse obiecte) care corespund acestor elemente si obiectele returnate:
e1presia
o$iect
returnat
2or!s(index) Range
'3aracters(index) Range
)entences(index) Range
Paragrap3s(index) Paragrap3
)ections(index) )ection
Pentru ultimele doua colectii din tabel este de notat ca pentru a junge la obiectul Range corespunzator se va
apela la proprietatea Range. Prin urmare
Paragraphs(index).Range
Sections(index).Range
dau acces la obiectele Range respective.
Pentru modificarea unui domeniu de text din document, se poate crea un obiect Range cu acele elemente
(caractere, propozitii, paragrafe etc.). Aplicarea proprietatilor si metodelor obiectului Range astfel creat va
produce modificarea textului referit de obiect:
ActiveDocument.Words(1).Case = wdUpperCase
trece primul cuvnt din document n majuscule. De remarcat ca proprietatea 'ase este aplicata obiectului
Range returnat de ActiveDocument.Words(1).
n formarea obiectelor Range sunt importante proprietatile )tart si En! care dau nceputul si sfrsitul.
Proprietatile elementelor documentului, specificate n tabelul anterior n prima coloana, sunt admise pentru
obiectele Document, )election si Range.
Lucrul cu te1tul !intr<un o$iect Range
Accesul la continutul unui obiect Range este realizat prin proprietatea e1t. Proprietatea e1t returneaza
textul neformatat (plain text) al domeniului referit. Atunci cnd se seteaza aceasta proprietate, textul
domeniului referit este nlocuit de valoarea atribuita proprietatii.
73
primCuvant = ActiveDocument.Words(1).Text
ActiveDocument.Words(1).Text = "Capitol"
returneaza sau modifica primul cuvnt din documentul activ.
Pentru inserarea unui text naintea sau dupa un obiect Range se utilizeaza, respectiv, metodele InsertBefore
sau InsertAfter. Dupa inserarea unui text, domeniul este extins automat pentru a include si textul inserat
(nainte sau dupa).
Sintaxa metodelor este
expression.InsertBefore(Text)
expression.InsertAfter(Text)
unde
expression este o expresie care returneaza un obiect )election sau Range.
/ext este de tip String si reprezinta textul care se insereaza.
Pentru inserarea caracterelor speciale se va utiliza functia Chr, sau constantele Visual Basic cum ar fi vbCr,
vbLf, vbCrLf sau vbTab.
nserarea unui text dupa un domeniu care se refera la un ntreg paragraf are loc dupa marca de paragraf.
Drept urmare textul este inserat la nceputul paragrafului urmator. Pentru a anula acest lucru se va identifica
sfrsitul de domeniu (Range sau )election) si se va scadea cu 1 pozitia finala (deci se va trece n fata
caracterului marca de paragraf). Exemplul urmator arata mecanismul utilizat:
Set Doc = ActiveDocument
Set myRange = Doc.Range( _
Start:=Doc.Paragraphs(1).Range.End - 1, _
End:=Doc.Paragraphs(1).Range.End - 1)
myRange.nsertAfter " sfarsit de paragraf."
Un domeniu poate fi redus la punctul de nceput sau de sfrsit (proprietatile )tart si En! devin egale cu pozitia
de caracter respectiva) prin metoda 'ollapse. Sintaxa este
expression.'ollapse(Direction)
unde
expression este o expresie care returneaza un obiect Range sau )election.
2irection este de tip Variant, optional si indica directia n care are loc implozia domeniului. Poate fi o constanta
(de tip 2!'ollapseDirection) dintre: wdCollapseEnd sau wdCollapseStart. Valoarea implicita este
wdCollapseStart.
Utilizarea metodei cu 4!'ollapseEn!, atunci cnd domeniul se refera la un ntreg paragraf, produce un
domeniu situat dupa marca de paragraf.
Pentru formatarea textului dintr-un obiect Range, se utilizeaza
74
proprietatea 5ont pentru formatarea caracterelor
proprietatea Paragrap35ormat pentru formatarea paragrafelor.
Proprietatea 5ont returneaza un obiect 5ont care dispune de toate metodele si proprietatile necesare pentru
aplicarea formatarilor admise pentru caractere n Word.
Proprietatea Paragrap35ormat returneaza un obiect Paragrap35ormat care permite efectuarea tuturor
formatarilor admise pentru un paragraf n Word.
Deoarece ambele obiecte, 5ont si Paragrap35ormat sunt foarte complexe dar reprezinta actiuni de rutina
pentru un utilizator Word nu vor fi prezentate aici. Exemplul urmator constituie un model suficient pentru orice
alta actiune care implica aceste obiecte:
With ActiveDocument.Paragraphs(1).Range.Font
.Name = "Times New Roman"
.Size = 14
.AllCaps = True
End With
With ActiveDocument.Paragraphs(1).Range.ParagraphFormat
.Leftndent = nchesToPoints(0.5)
.Space1
End With
Textul sursa precedent realizeaza pentru primul paragraf din documentul activ setarea fontului ca "Times New
Roman", de marime 14 si scris cu majuscule. n formatarea paragrafului se realizeaza indentarea din stnga
cu 1.5" si spatierea la un rnd.
Re!efinirea unui o$iect Range
Pentru modificarea limitelor unui obiect Range se pot utiliza, n mod uzual, proprietatile )tart si En!:
myRange.End = myRange.End + 10
Metodele Mo"e)tart si Mo"eEn! produc o actiune similara, dar se pot utiliza unitati diverse, predefinite,
pentru extinderea domeniului. Ambele metode returneaza un intreg care arata numarul de unitati cu care s-a
modificat )tart sau En!, sau 0 daca operatiunea nu s-a putut realiza. Sintaxa este
expression.Mo"e)tart(Unit, Count)
expression.Mo"eEn!(Unit, Count)
unde
expression este o expresie care returneaza un obiect Range sau )election.
4nit este de tip Variant, optional. Reprezinta unitatea cu care se deplaseaza 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 )election poate fi si wdLine.
Valoarea implicita este wdCharacter.
0ount este de tip Variant, optional. Numarul maxim de unitati cu care se muta punctul de start/end. Poate fi
negativ sau pozitiv, cu interpretarile curente. n cazul cnd operatiunea produce inversarea fizica a pozitiilor de
Start si End, cele doua pozitii devin egale (Range sufera un colaps). Valoarea implicita este 1.
75
n exemplul urmator
myRange.MoveEnd Unit:=wdParagraph, Count:=1
se extinde domeniul nct sa cuprinda si urmatorul paragraf.
O$ser"atie. Exista si metode mai fine cum ar fi Mo"e9ntil, Mo"e23ile, Mo"e)tart9ntil, Mo"eEn!23ile etc.
Se va vedea intrarea respectiva din Word VB - Help.
Metoda )etRange poate fi utilizata pentru modificarea simultana a limitelor unui obiect Range existent. Nu
trebuie sa se confunde cu metoda Range, care defineste obiectul.
expression.SetRange(Start, End)
unde
expression este o expresie care returneazaun obiect Range sau )election.
-tart este de tip Long, pozitia noua de start.
3nd este de tip Long, pozitia noua de sfrsit (end).
De exemplu:
myRange.SetRange Start:=myRange.Start, End:=myRange.End+10
care extinde domeniul cu 10 caractere.
Pentru deplasarea obiectului Range cu un numar de unitati se va studia metoda /e1t. Acest procedeu se
poate folosi la parcurgerea seceventiala a unei secvente de cuvinte, paragrafe. Este de reamintit ca o
asemenea parcurgere poate fi efectuata si prin structura For Each.Next.
Atri$uirea o$iectelor Range
O prima procedura este cea, exemplificata mai sus, n care se utilizeaza instructiunea )et pentru atribuirea
unui Range la o variabila obiect, instructiune care poate opera si n ipostaza
Set Range2 = Range1
La modificarea unui obiect, schimbarea se va reflecta automat si n celalalt obiect.
Este de observat ca printr-o instructiune de atribuire directa
Range2 = Range1
se atribuie proprietatea implicita a obiectului Range1 (adica proprietatea Text) proprietatii implicite a obiectului
Range2. Prin urmare codul este echivalent cu
Range2.Text = Range1.Text
care nu modifica obiectele Range respective (doar continutul lui Range2). Cele doua obiecte pot fi la locatii
diferite, doar continutul este acelasi si legatura dintre ele nu se stabileste permanent.
76
Prin proprietatea Duplicate se creeaza un nou obiect Range, duplicat, cu aceleasi limite si text:
Set Range2 = Range1.Duplicate
Modificarea limitelor unui obiect nu influenteaza limitele celuilalt, dar modificarea textului poate produce
modificarea celuilalt n cazul suprapunerii domeniilor.
77
O$iecte Microsoft 2or! (II)
O$iectul )election
Deplasarea si extinderea selectiei
Metoda GoTo
Metodele GoToNext, GoToPrevious
Obiecte accesibile din Selection
Selection proprietati si metode uzuale
Proprietatea Text
Formatarea textului selectat
Returnarea obiectului Range
Proprietatea nformation
Determinarea tipului de selectie
O$iectele 5in! si Replacement
Find
ClearFormatting
Execute
Selection.Find
Range.Find
Replacement
O$iectele a$le. 'olumn. Ro4 si 'ell
Colectia Tables
Obiectul Table
Colectia Columns
Obiectul Column
Colectia Rows, obiectul Row
Colectia Cells
Obiectul Cell
Exemple cu obiectele Table, Column, Row si Cell
O$iectul )election
Atunci cnd se proceseaza un document n Microsoft Word, este uzual sa se selecteze o portiune de text si sa
se formateze/modifice/etc. portiunea selectata. n Visual Basic, operatiunea de selectare prealabila nu este
necesara, obiectul Range permite toate actiunile pentru domenii determinate ale documentului. Totusi, atunci
cnd se doreste ca, programatic, sa se raspunda unei selectii efectuate de utilizator, sau sa se modifice
selectia etc., se poate opera cu obiectul )election.
Exista un singur obiect )election pe ochi de fereastra si doar un obiect este activ la un moment dat
(corespunznd locului unde este puctul de insertie, cu toata zona selectata adiacenta). Este evident, din lucrul
n Word, ca o selectie poate sa se refere la un ntreg domeniu sau poate fi redusa la punctul de insertie.
Obiectul )election este returnat de proprietatea )election a obiectelor Application, 2in!o4 sau Pane.
Utilizata cu Application, proprietatea returneaza obiectul )election care se refera la selectia activa. Prin
urmare
Selection.nsertAfter Text:=" Text adaugat dupa selectie"
utilizeaza proprietatea )election a obiectului Application (fiind globala nu trebuie specificat obiectul), este
returnata selectia activa si se insereaza un text, similar metodei InsertAfter de la Range.
Daca se lucreaza cu selectia dintr-o fereastra particulara, obiectul respectiv se specifica:
78
Windows("Document2").Selection.Paragraphs(1).SpaceBefore = nchesToPoints(0.15)
mareste la 0.15" spatiul dinaintea primului paragraf din selectie (daca selectia este punctul de insertie, se
modifica paragraful curent).
Urmatorul exemplu insereaza text n antetul primei pagini
With ActiveWindow
.View.Type = wdPageView
.View.SeekVCiew = wdSeekPrimaryHeader
.ActivePane.Selection.nsertAfter Text:="Capitolul "
End With
n general, metodele si proprietatile uzuale ale obiectului )election sunt similare celor de la obiectul Range.
Este totusi de amintit ca obiectul Selection are corespondent grafic n document: zona selectata. Orice
extindere sau implozie se vede imediat.
Deplasarea si e1tin!erea selectiei
Deoarece nu exista dect o selectie pe ochi de fereastra, selectarea unei noi zone muta implicit si obiectul
Selection. Aceasta selectare se efectueaza aplicnd metoda Select unui element din document:
ActiveDocument.Words(1).Select
permite mutarea selectiei la primul cuvnt, astfel nct se poate utiliza dupa aceea metoda Selection:
Selection.Text = "Primul"
pentru modificarea textului selectat.
Exista un numar de metode care deplaseaza selectia n document (prin modificarea corespunzatoare a
obiectului )election).
Mo"e(Unit, Count) reduce selectia la punctul de sfrsit (0ount > 0) sau de nceput (0ount < 0) si deplaseaza
apoi punctul de insertie astfel obtinut 0ount unitati (in sensul pozitiv sau negativ).
Mo"eEn!, Mo"e)tart similare descrierilor de la obiectul Range
Mo"eLeft(Unit,Count,Extend) unde 4nit poate fi wdCell, wdCharacter, wdWord sau wdSentence, 0ount este
numarul de unitati, 3xtend arata tipul actiunii: wdMove pentru colaps la stnga si mutarea selectiei, wdExtend
pentru extensie spre stnga.
Mo"eRig3t(Unit,Count,Extend) este similara metodei Mo"eLeft, dar actiunea este spre dreapta.
Mo"eDo4n(Unit,Count,Extend), MoveUp(Unit,Count,Extend) cu actiune similara metodelor precedente, dar
directia de actiune este sus-jos. 4nit poate fi wdLine, wdParagraph, wdWindow sau wdScreen. 3xtend poate fi
wdMove sau wdExtend, cu sensul explicat anterior.
Exemple:
Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove
muta punctul de insertie la nceputul paragrafului urmator.
79
Selection.MoveEnd Unit:=wdParagraph, Count:=1
extinde selectia prin mutarea pozitiei finale la sfrsitul paragrafului.
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
extinde selectia activa cu un cuvnt spre dreapta.
Utilizarea metodelor Goo/e1t, GooPre"ious sau Goo permite mutarea selectiei prin alegerea tipului de
element tinta din document, a directiei etc.
Meto!a Goo
Aplicata obiectului Selection, muta punctul de insertie n pozitia de caracter imediat precedenta elementului
specificat si returneaza un obiect Range (cu exceptia specificarii elementelor wdGoToGrammaticalError,
wdGoToProofreadingError sau wdGoToSpellingError, caz n care Obiectul Range include si textul eronat).
Sintaxa este
expression.Goo(What, Which, Count, Name)
unde
expression este o expresie care returneaza un obiect Document, Range sau )election.
+hat este de tip Variant, optional si precizeaza tipul elementului unde se muta punctul de insertie (selectia).
Poate fi una dintre constantele (de tipul enumerat WdGoTotem):
wdGoToBookmark wdGoToComment wdGoToEndnote
wdGoToEquation wdGoToField wdGoToFootnote
wdGoToGrammaticalError wdGoToGraphic wdGoToHeading
wdGoToLine wdGoToObject wdGoToPage
wdGoToPercent wdGoToProofreadingError wdGoToSection
wdGoToSpellingError wdGoToTable
+hich este de tip Variant, optiomal si specifica modul de mutare a selectiei. Poate fi una dintre constantele (de
tip WdGoToDirection): wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious sau
wdGoToRelative.
0ount este de tip Variant, optional si indica numarul utilizat la determinarea elementului (n functie de tipul de
actiune dat de +hich). Este doar pozitiv si pentru gasirea unui element anterior se va utiliza wdGoToPrevious
cu un 0ount > 0.
Name este Variant, optional si da numele elementului tinta, daca +hat este wdGoToBookmark,
wdGoToComment, wdGoToField sau wdGoToObject.
Exemple:
Selection.GoTo What:=wdGoToHeading, Which:=wdGoToFirst
80
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"
Meto!ele Goo/e1t. GooPre"ious
Pentru actiuni limitate doar la deplasarea cu un singur element, metodele cu sintaxa (pentru obiectele Range
sau Selection):
GoToNext(What)
GoToPrevious(What)
unde
+hat este una dintre constantele de tip WdGoTotem (vezi metoda GoTo).
Metodele returneaza un obiect Range (vezi discutia de la GoTo).
O$iecte accesi$ile !in )election
Cele mai multe obiecte accesibile din obiectele Range si Document sunt disponibile si din obiectul Selection.
Se pot astfel procesa obiectele din interiorul selectiei. Lista obiectelor care sunt referite din Selection este
Bookmarks, Borders, Cells, Characters, Columns, Comments, Document, Endnotes, Fields, Find, Font,
Footnotes, FormFields, Frames, HeaderFooter, Hyperlinks, nlineShapes, PageSetup, ParagraphFormat,
Paragraphs, Revision, Range, Rows, Sections, Sentences, Shading, ShapeRange, Tables, Words.
Aceste obiecte (colectii de obiecte) sunt returnate prin proprietatile cu aceleasi denumiri ale obiectului
Selection. De exemplu
Selection.Paragraphs.Leftndent = nchesToPoints(0.5)
Selection.Words(1).talic = True
MsgBox Selection.Footnotes(1).Range.Text
Pentru parcurgerea tuturor obiectelor dintr-o colectie returnata se va folosi structuraFor Each.Next:
For Each aBook n Selection.Bookmarks
MsgBox aBook.Name
Next aBook
Proprietati si meto!e u*uale ale o$iectului )election
Proprietatea e1t
Se va utiliza proprietatea Text pentru a returna sau stabili continutul obiectului Selection:
strText = Selection.Text
Selection.Text = "Hello World"
Se va utiliza metoda nsertBefore sau nsertAfter pentru inserarea unui text nainte sau dupa selectie (cu
extinderea corespunzatoare a selectiei).
81
5ormatarea te1tului selectat
Se vor utiliza proprietatile Font si ParagraphFormat pentru accesul la proprietatile si metodele proprii
caracterelor si, respectiv, paragrafelor:
With Selection.Font
.Name = "Times New Roman"
.Size = 14
End With
Selection.ParagraphFormat.Leftndent = nchesToPoints(0.5)
Returnarea o$iectului Range
O importanta deosebita o are proprietatea Range, care returneaza un obiect Range ce se refera la selectia
curenta. n acest mod se poate exploata faptul ca pot exista mai multe obiecte Range si memora selectii
succesive:
Set myRange = Selection.Range
O alta utilizare este aceea cnd anumite metode sau proprietati se pot aplica doar unui obiect Range:
Selection.Range.CheckSpelling
Proprietatea Information
Returnarea informatiilor despre selectie, cum ar fi numarul paginii curente, numarul total de pagini, faptul ca
selectia este n antet sau picior de pagina etc. Sintaxa este
expression.Information(Type)
unde
expression este o expresie care returneaza un obiect Range sau )election.
/ype este de tip Long si precizeaza tipul informatiei care se returneaza. Poate fi una dintre cele
35 de constante de tip Wdnformation, dintre care mentionam (doar pentru a exemplifica tipuri
de informatii obtinute):
o wdActiveEndAdjustedPageNumber numarul paginii care contine sfrsitul activ al selectiei sau
domeniului. Numarul este ajustat pentru a considera personalizarile efectuate de utilizator
(numar de nceput etc.).
o wdActiveEndPageNumber numarul paginii care contine sfrsitul activ al selectiei sau
domeniului. Numarul este dat relativ la nceputul documnetului, si nu este modificat de
personalizarile efectuate de utilizator (numar de nceput etc.).
o wdHorizontalPositionRelativeToPage pozitia orizontala a selectiei sau domeniului; distanta de
la marginea stnga a selectiei la latura stnga a paginii. Distanta este data n twips (20 twips =
1 point, 72 points = 1 inch). Daca selectia sau domeniul nu este n zona ecran, atunci se
ntoarce 1.
o wdnHeaderFooter ntoarce True daca selectia/domeniul este n ochiul de fereastra antet sau
footer, sau n header sau footer (n page layout view).
o wdWithnTable ntoarce True daca selectia este ntr-un tabel.
o wdZoomPercentage ntoarce procentajul curent de marire a documentului, dupa cum este
fixat de proprietatea Percentage.
82
Exemplul urmator afiseaza, daca selectia este ntr-un tabel, numarul de coloane si de linii ale tabelului:
f Selection.nformation(wdWithnTable) = True Then
MsgBox "Coloane = " & Selection.nformation(wdMaximumNumberOfColumns) _
& vbCR & "Linii = " & Selection.nformation(wdMaximumNumberOfRows)
End f
Determinarea tipului !e selectie (te1t sau punct !e insertie)
Prin proprietatea &pe se poate obtine informatia privind tipul selectiei. Valoarea returnata, Long, este una
dintre constantele tipului enumerat 2!)election&pe:
wdNoSelection, wdSelectionBlock, wdSelectionColumn,
wdSelectionFrame, wdSelectionnlineShape, wdSelectionP,
wdSelectionNormal, wdSelectionRow, wdSelectionShape
Dintre aceste constante, wdSelectionNormal reprezinta selectia uzuala a unei portiuni de text,
wdSelectionBlock reprezinta selectia sub forma de bloc dreptunghiular, wdSelectionP este selectia redusa la
punctul de insertie.
Exemplul urmator selecteaza paragraful care contine punctul de insertie, daca selectia este redusa la punctul
de insertie:
f Selection.Type = wdSelectionP Then
Selection.Paragraphs(1).Range.Select
End f
O$iectele 5in! si Replacement
Gasirea si nlocuirea unor domenii specificate de text dintr-un document este o operatiune frecventa n
procesarea textelor. Pentru realizarea programatica, n Visual Basic, dispunem de obiectele 5in! (pentru
gasirea textului specificat) si Replacement (pentru nlocuire).
Obiectul 5in! este permis fie din )election, fie din Range. Exista mici deosebiri ntre cele doua moduri de
acces, legate ndeosebi de transformarea obiectelor daca procesul de cautare se termina cu succes.
Obiectul Replacement este accesibil din obiectul 5in! si permite toate actiunile disponibile n boxa de dialog
5in! an! Replace (meniul E!it din Word).
Schema generala pentru realizarea unei cautari urmata, sau nu, de o nlocuire este
o stabilirea parametrilor cautarii/nlocuirii, prin proprietatile obiectului 5in!/ Replacement. n
proprietatea e1t se precizeaza textul cautat sau nlocuitor.
o executarea cautarii/nlocuirii prin aplicarea metodei E1ecute.
5in!
Dintre proprietatile obiectului 5in! mentionam
5ont, returneaza un obiect Font pentru care se pot stabili atributele cautate.
5ormat, este setat pe True daca n cautare se considera formatul textului. Read-write, Boolean.
83
5or4ar!, directia cautarii: True pentru nainte, False pentru napoi. Read/wtite, Boolean.
5oun! este True daca s-a gasit o potrivire. Read, Boolean.
Matc3'ase este True pentru o cautare care diferentiaza majusculele de minuscule. Read-write,
Boolean.
Matc32il!car!s este True daca textul cautat contine caractere sablon de cautare. Read/write,
Boolean.
Paragrap35ormat, returneaza un obiect ParagraphFormat prin care se pot stabili atribute de paragraf
cautate.
)t&le permite stabilirea stilului cautat (predefinit sau utilizator). Pentru lista constantelor ce denumesc
stilurile predefinite se va vedea Word VB Help Style Property.
e1t, contine textul cautat. Read-write, String.
2rap precizeaza modul de continuare n cazul atingerii sfrsitului (sau nceputului) fisierului sau
negasirii textului n domeniul cautat. Poate fi o constanta (de tip WdFindWrap): wdFindAsk
consultarea utilizatorului, wdFindContinue continuarea n restul documentului, wdFindStop oprirea
la epuizarea domeniului de cautare. Read/write, Long.
Obiectul 5in! are doua metode:
o 'lear5ormatting pentru nlaturarea oricarei formatari a textului cautat, necesara pentru a initia
o noua cautare de formate;
o E1ecute pentru a efectua cautarea pe baza atributelor fixate.
'lear5ormatting
Anuleaza orice formatare specificata pentru o operatiune de cautare sau nlocuire. Corespunde butonului No
Formatting din dialogul Find and Replace (meniul Edit).
expression.'lear5ormatting
unde
expression este o expresie care returneaza un obiect Find sau Replacement.
E1ecute
Executa operatiunea 5in! specificata. Returneaza True daca operatiunea de cautare se termina cu succes
(este gasita o potrivire cu textul cautat). Unele dintre argumentele metodei acopera valori ale proprietatilor
obiectului 5in!.
expression.E1ecute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike,
MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace)
unde
expression este o expresie care returneaza un obiect 5in!.
1ind/ext este de tip Variant, optional. Reprezinta textul cautat. Pentru cautarea unui format anume se va
specifica un sir vid (""). Se pot utiliza caracterele speciale, similar celor disponibile n cautarile Word uzuale.
5atch0ase este de tip Variant, optional. True sau False dupa cum n cautare are importanta capitalizarea
caracterelor.
5atch+hole+ord este de tip Variant, optional. Este True daca n cautare se vor potrivi doar cuvinte ntregi.
84
5atch+ildcards este de tip Variant, optional. True daca textul cautat utilizeaza sabloane de cautare
(wildcards).
5atch-ounds.ike este de tip Variant, optional. True daca operatiunea de cautare accepta si cuvinte care
"suna" la fel cu textul cautat.
5atch!ll+ord1orms este de tip Variant, optional. True daca operatiunea de cautare accepta ca succes toate
formele textului cautat.
1orard este de tip Variant, optional. True pentru o cautare nainte (spre sfrsitul documentului).
+rap este de tip Variant, optional. Controleaza continuarea operatiunii la epuizarea domeniului cercetat.
Valorile posibile sunt date la proprietatea Wrap: wdFindContinue, wdFindStop sau wdFindAsk.
1ormat este de tip Variant, optional. True daca n cautare este specificata o formatare (de caracter sau
paragraf).
*eplace+ith este de tip Variant, optional. Textul nlocuitor. Pentru a specifica un obiect grafic sau nontext,
elementul se trece n Clipboard si se specifica "^c" n ReplaceWith.
*eplace este de tip Variant, optional. Specifica numarul de nlocuiri. Poate fi o constanta (de tip WdReplace):
wdReplaceAll, wdReplaceNone sau wdReplaceOne.
)election%5in!
Returnarea unui obiect 5in! din obiectul )election produce schimbarea selectiei la ndeplinirea criteriilor de
cautare. Textul care corespunde proprietatilor cautarii devine noua selectie. Urmatorul exemplu selecteaza
urmatoarea aparitie a cuvntului "Hello", cautarea oprindu-se la atingerea sfrsitului documentului:
With Selection.Find
.Forward = True
.Wrap = wdFindStop
.Text = "Hello"
.Execute
End With
Acelasi efect se putea obtine folosind argumentele metodei E1ecute:
Selection.Find.Execute FindText:="Hello", Forward:=True, Wrap:=wdFindStop
Range%5in!
Utilizarea proprietatii 5in! a obiectului Range nu produce modificarea selectiei curente, dar obiectul Range
respectiv este redefinit la gasirea textului care ndeplineste conditiile:
With ActiveDocument.Content.Find
.Text = "blue"
.Forward = True
.Execute
f .Found = True Then .Parent.Bold = True
End With
85
De remarcat ca proprietatea 'ontent returneaza obiectul Range care contine episodul principal al
documentului (textul principal). Codul din exemplu executa o cautare a primei aparitii a cuvntului "blue" n
documentul activ. Daca operatiunea se termina cu succes, atunci obiectul Range este redefinit la cuvntul
gasit, astfel nct prin %Parent se face referinta la obiectul Range redefinit si cuvntul "blue" este trecut n stilul
bold. Acelasi efect se obtinea prin
Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="blue", Forward:=True
f myRamge.Find.Found = True Then myRange.Bold = True
atributele cautarii fiind definite prin argumentele metodei E1ecute.
O$iectul Replacement
Referinta la obiectul Replacement se obtine prin proprietatea Replacement a obiectului 5in!:
expression.Find.Replacement
Obiectul Replacement reprezinta atributele textului nou (nlocuitor) ntr-o operatiune de cautare cu nlocuire.
Dintre proprietatile obiectului Replacement amintim:
5ont, returneaza un obiect Font prin care se pot stabili atributele caracterelor noului text.
Paragrap35ormat, returneaza un obiect ParagraphFormat prin care se pot stabili atribute de paragraf
pentru noul text.
)t&le permite stabilirea stilului pentru textul nou (predefinit sau utilizator). Pentru lista constantelor ce
denumesc stilurile predefinite se va vedea Word VB Help Style Property.
e1t, contine textul nlocuitor (nou). Read-write, String.
Obiectul Replacement are doar metoda 'lear5ormatting, prin care se anuleaza toate atributele de format
asociate noului text. Este util sa se aplice metoda naintea definirii unei noi formatari pentru textul nlocuitor.
Sintaxa este similara metodei de la obiectul 5in!.
Executarea unei operatiuni de nlocuire necesita, de obicei, precizarea argumentului Replace al metodei
E1ecute (pentru 5in!):
With Selection.Find
.ClearFormatting
.Text = "hi"
.Replacement.ClearFormatting
.Replacement.Text = "hello"
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue
End With
executa o cautare a cuvntului "hi", neformatat, si nlocuirea tuturor aparitiilor cu cuvntul "hello", de
asemenea neformatat. Cautarea si nlocuirea are loc n tot documentul, indiferent de unde se ncepe. Selectia
se modifica la fiecare ntlnire a cuvntului "hi", deoarece se pleaca din obiectul )election.
With ActiveDocument.Content.Find
.ClearFormatting
.Font.Bold = True
With .Replacement
.ClearFormatting
.Font.Bold = False
86
End With
.Execute FindText:="", ReplaceWith:="", Format:=True, Replace:=wdReplaceAll
End With
n acest exemplu se utilizeaza att pentru cautare, ct si pentru nlocuire textul vid, ceea ce produce doar o
nlocuire a formatului bold cu formatul normal. Este de remarcat, pentru nlocuirea formatelor, combinatia de
valori ale argumentelor 5in!e1t, Replace2it3, 5ormat. Selectia nu se modifica, deoarece s-a plecat din
obiectul Range (returnat de proprietatea 'ontent).
O$iectele a$le. 'olumn. Ro4 si 'ell
Prelucrarea tabelelor, un subiect foarte important n procesarea textelor, este posibila programatic prin
utilizarea obiectelor
a$le, care refera un tabel din document,
'olumn, care refera o coloana dintr-un tabel,
Ro4, care refera o linie dintr-un tabel si
'ell, care refera o celula dintr-un tabel.
Datorita complexitatii lucrului cu tabele (trasare libera, uniri de celule, divizari de celule etc.), metodele si
proprietatile obiectelor amintite pot uneori sa se produca rezultate neasteptate (ca si n procesarea uzuala din
Word) daca nu sunt ntelese exact.
n general obiectele sunt accesate ca elemente din colectiile respective, dar exista si posibilitatea accesarii
individuale.
'olectia a$les
Reprezinta multimea tuturor tabelelor dintr-o selectie, domeniu sau document. Serveste pentru returnarea unui
tabel:
expression.a$les(index)
sau pentru adaugarea, programatica, a unui nou tabel la colectie utiliznd metoda A!!:
expression.A!!(Range, NumRows, NumColumns)
unde
expression este o expresie care returneaza un obiect Tables.
*ange este obiectul Range care refera domeniul unde se insereaza tabelul n document. Daca domeniul nu
este redus la punctul de insertie, atunci tabelul adaugat nlocuieste tot domeniul continut.
Num*os, de tip Long, este numarul initial de linii ale tabelului.
Num0olumns, de tip Long, este numarul initial de coloane ale tabelului.
O$iectul a$le
Este returnat prin numarul de ordine dintr-o colectie Tables.
87
Proprietatile obiectului se refera la formatarea globala a tabelului sau la obiectele componente ale unui tabel.
Din prima categorie fac parte:
o Auto5ormat&pe, de tip Long, read only, este o constanta de tip WdTableFormat (vezi intrarea
din Help corespunzatoare) care arata daca tabelul este formatat prin AutoFormat. De exemplu,
wdTableFormatNone reprezinta un tabel neformatat, pe cnd wdTableFormatProfessional arata
selectarea formatului automat Professional. Vezi si metoda Auto5ormat.
o )3a!ing returneaza un obiect )3a!ing prin care se stabilesc atributele de umbrire.
o 9niform, de tip Boolean, read only, are valoarea True daca toate liniile au acelasi numar de
coloane.
Accesul la obiectele componente se realizeaza prin proprietatile
o Bor!ers, colectia de chenare a tabelului,
o 'olumns, colectia de coloane,
o Ro4s, colectia de linii.
Metodele obiectului Table permit att operatiuni asupra ntregului tabel (autoformat, stergere, selectare,
sortare, divizare etc.), ct si accesul la celulele tabelului. Mentionam:
o 'ell(Row,Column) returneaza un obiect 'ell care refera celula de pe linia Row si coloana
Column din tabel. Row si Column sunt de tip Long si au valori de la 1 la numarul maxim de linii,
respectiv coloane.
o Delete produce eliminarea obiectului, deci stergerea din document a tabelului.
o )elect realizeaza selectarea tabelului, astfel nct se poate opera apoi cu proprietatea
)election.
o )ort(ExcludeHeader, FieldNumber, SortFieldType, SortOrder, FieldNumber2, SortFieldType2,
SortOrder2, FieldNumber3, SortFieldType3, SortOrder3, CaseSensitive, LanguageD) produce
sortarea tabelului. Datorita sintaxei complexe, argumentele vor fi studiate n Word VB Help.
o )plit(BeforeRow) duce la divizarea tabelului nainte de linia indicata n BeforeRow (de tip
Variant, poate fi un numar de linie sau un obiect Ro4).
'olectia 'olumns
Reprezinta colectia coloanelor unui tabel si este returnata prin proprietatea 'olumns a unui obiect a$le.
Dintre proprietati enumeram
o Bor!ers, returneaza colectia de chenare,
o )3a!ing, returneaza un obiect )3a!ing prin care se stabilesc atributele de umbrire,
o 2i!t3 returneaza sau stabileste latimea coloanelor, n puncte. Read/write, de tip Long.
o 5irst returneaza prima coloana din colectie. Read only.
o Last returneaza ultima coloana din colectie. Read only.
Metodele permit operatiuni specifice tuturor colectiilor (Count, Add) sau specifice obiectului coloane de tabel:
o A!!(BeforeColumn) prin care se adauga o noua coloana n fata coloanei referite de
BeforeColumn (care este de tip Variant, optional, returneaza un obiect Column).
o Auto5it care ajusteaza latimea coloanei, daca este posibil, pentru a cuprinde textul interior.
o Distri$ute2i!t3 care produce o redistribuire a latimilor nct toate coloanele sa fie egale.
o )et2i!t3(ColumnWidth, RulerStyle) care stabileste latimea coloanelor: 0olumn+idth, de tip
Single, este latimea n puncte; *uler-tyle, de tip Long, controleaza modul n care este ajustata
latimea. RulerStyle poate fi una dintre constantele WdRulerStyle: wdAdjustFirstColumn
88
modifica doar prima coloana, wdAdjustNone nu modifica celelalte coloane,
wdAdjustProportional ajusteaza toate coloanele din dreapta, wdAdjustSameWidth aceeasi
latime tuturor coloanelor specificate. Ultimul argument este mai important pentru stabilirea
latimii unor celule sau unei singure coloane (aplicnd metoda obiectelor respective si nu
colectiei).
O$iectul 'olumn
Reprezinta o singura coloana dintr-un tabel. Este referita ca element al colectiei 'olumns:
expression.Tables(index tabel).'olumns(index)
Dintre proprietatile obiectului mentionam:
o Bor!ers. )3a!ing. 2i!t3 sunt similare celor enumerate la colectia 'olumns.
o 'ells returneaza colectia de celule din coloana referita.
o In!e1, read only, Long, returneaza numarul de ordine al coloanei n colectia 'olumns.
o Is5irst. IsLast sunt True daca este referita prima, respectiv ultima coloana din colectie.
o /e1t. Pre"ious returneaza urmatorul element, respectiv precedentul element din colectia
'olumns.
Metodele obiectului Column sunt
o Auto5it. Delete. )elect. )et2i!t3 cu explicatii evidente sau similare metodelor sinonime
prezentate anterior.
o )ort(ExcludeHeader, SortFieldType, SortOrder, CaseSensitive, LanguageD) care ordoneaza
celulele coloanei. Argumentele sunt
o 3xclude6eader, optionala, este True daca se omite din ordonare prima linie.
o -ort1ield/ype, optional, Variant, arata tipul de sortare poate fi una dintre constantele
WdSortFieldType: wdSortFieldAlphanumeric (valoarea implicita), wdSortFieldDate sau
wdSortFieldNumeric.
o -ort)rder, optional, Variant, specifica ordinea. Poate fi o constanta de tip WdSortOrder:
wdSortOrderAscending (implicita) sau wdSortOrderDescending.
o 0ase-ensitive, optional, Variant, este True daca se ia n considerare capitalizarea literelor.
mplicit este False.
o .anguage(2, optional, Variant, specifica limbajul de sortare. Poate fi una dintre constantele
WdLanguageD (vezi WdLanguageD Property n Word VB Help).
'olectia Ro4s. O$iectul Ro4
Reprezinta colectia liniilor dintr-un tabel si, respectiv, o linie a tabelului. Utilizarea acestor obiecte este similara
operarii cu obiectele 'olumns si 'olumn. Exista o serie de proprietati specifice, linie antet, mpartirea ntre
pagini etc, dar corespund direct atributelor din Word si au semnificatii evidente.
'olectia 'ells
Reprezinta celulele dintr-o coloana, linie, selectie sau domeniu.
Pe lnga proprietatile similare celor prezentate la coloane (Bor!ers. )3a!ing. 2i!t3. Eeig3t etc.) este utila
proprietatea
89
o VerticalAlignment care returneaza sau stabileste alinierea verticala a textului n celule. Poate
fi o constanta de tip 2!VerticalAlignment: wdAlignVerticalBottom, wdAlignVerticalCenter,
wdAlignVerticalJustify sau wdAlignVerticalTop. Read/write Long.
Metodele mai des ntrebuintate sunt
o A!!(BeforeCell) care adauga o noua celula naintea celulei referite de 'efore0ell (de tip
Variant, optionala, returneaza un obiect Cell).
o Merge care produce fuzionarea tuturor celulelor din colectie. Rezultatul este o singura celula n
tabel.
o )plit(NumRows, NumColumns, MergeBeforeSplit) care produce divizarea celuleor din colectie
potrivit valorilor argumentelor:
o Num*os, Num0olumns reprezinta numarul liniilor, coloanelor dupa divizare. Optionale, de tip
Variant.
o 5erge'efore-plit este de tip Variant, optional si are valoarea True daca se doreste fuzionarea
celulelor nainte de divizare.
o )etEeig3t(RowHeight, HeightRule) stabileste naltimea pentru toata linia unei celule implicate.
o *o6eight este Single si da naltimea n puncte.
o 6eight*ule este Variant, optionala si da regula de ajustare a celorlalte linii; poate fi una dintre
constantele de tip WdRowHeightRule wdRowHeightAtLeast (valoarea implicita),
wdRowHeightAuto sau wdRowHeightExactly.
o )et2i!t3(ColumnWidth, RulerStyle), cu explicatia de la Columns.
o Distri$uteEeig3t. Distri$ute2i!t3 care distribuie naltimea, respectiv latimea, n mod egal.
O$iectul 'ell
Reprezinta o celula dintr-un tabel. Poate fi returnata prin metoda Cell dintr-un obiect Table sau ca element al
colectiei Cells.
Proprietati de identificare sunt cele care returneaza, ca obiecte sau ca index, coloana si linia celulei:
o 'olumn. 'olumnIn!e1 returneaza ca obiect sau ca index coloana celulei.
o Ro4. Ro4In!e1 returneaza ca obiect sau ca index linia celulei.
Proprietati navigare n colectia Cells sunt
o /e1t. Pre"ious cu semnificatia imediata.
Proprietatile de aspect si dimensiuni sunt cele prezentate la 'olumnsA'olumn.
Proprietatea care da acces la continutul celulei si permite deci adaugarea de text etc. este:
o Range care returneaza un obiect Range.
Metodele aplicabile unui obiect Cell sunt
o Auto)um insereaza un cmp formula care calculeaza suma valorilor din tabel situate deasupra
sau la stnga celulei.
o Delete(ShiftCells) elimina celula referita, -hift0ells arata cum are loc actiunea. -hift0ells este
Variant, optional si poate avea o valoare dintre constantele de tip WdDeleteCells:
wdDeleteCellsEntireColumn, wdDeleteCellsEntireRow, wdDeleteCellsShiftLeft sau
wdDeleteCellsShiftUp (potrivit optiunilor uzuale de la operarea n Word).
90
o 5ormula(Formula, NumFormat) insereaza n celula o formula specificata si formateaza
rezultatul. Argumentele
o 1ormula este sirul care contine o formula admisa n Word De exemplu "=SUM(ABOVE)". Daca
mai sus sau la stnga celulei sunt valori numerice, formula este optionala si se completeaza
potrivit alegerilor implicite Word.
o Num1ormat este de tip Variant, optional si specifica formatul pentru rezultat ntr-o forma admisa
(vezi Word VB Help Numeric Picture (\#) field switch).
o Merge(MergeTo) produce unirea celulei curente cu celula referita, ca obiect, de MergeTo.
o )elect produce selectarea celulei, deci se poate apela apoi proprietatea globala Selection.
o )etEeig3t, )et2i!t3 stabilesc naltimea si latimea celulei potrivit descrierii de la 'ells.
o )plit(NumRows, NumColumns) divizeaza celula n numarul indicat de linii si coloane. Valorile
neprecizate sunt considerate 1.
E1emple cu o$iecte a$le. 'olumn. Ro4. 'ell
Subiectul este foarte amplu si pentru mai multe exemple se vor studia subiectele corespunzatoare din Word
Visual Basic Help.
f Selection.Tables.Count >=1 Then
Selection.Tables(1).ConvertToText Separator:=wdSeparateByTabs
End f
converteste n text primul tabel din selectie, daca selectia contine tabele, separnd continutul 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 referinte la celula din prima linie si prima coloana a primului tabel din documentul activ. Ambele linii
se refera la aceeasi celula.
i = 1
For Each celula n ActiveDocument.Tables(1).Range.Cells
celula.Range.nsertBefore Text:="Celula " & i
i = i+1
Next celula
produce numerotarea celulelor din primul tabel al documentului. Este de remarcat utilizarea proprietatii Range
a obiectului Table (pentru a returna un obiect Range pentru care se returneaza colectia Cells), ca si utilizarea
proprietatii Range a obiectului Cell pentru inserarea de text.
ActiveDocument.Tables(1).Columns(1).Select
selecteaza prima coloana a primului tabel.
ActiveDocument.Tables(1).Rows(1).Shading.Texture = wdTexture10Percent
aplica o umbrire de 10% primei linii din tabel.
91
O$iecte Microsoft 2or! (III)
9tili*area o$iectului Eea!er5ooter
'olectia )t&les
Obiectul Style
'olectia 'omman!Bars
'olectia Dialogs
'Gmpuri 8 a!augare. e!itare
Verificarea unui o$iect
Mo!ificarea comen*ilor 2or!
Lucrul cu e"enimente
Evenimente pentru Document
Evenimente pentru Application
Evenimente pentru ActiveX
Auto Macro
Automati*area aplicatiilor
Automatizarea Word din alta aplicatie
Automatizarea altei aplicatii din Word
Comunicarea cu obiectele scufundate
n continuare sunt prezentate doar unele aspecte, considerate mai des utilizate, ale operarii cu alte obiecte
(dect cele prezentate n precedentele doua fisiere) din modelul de obiecte al aplicatiei Microsoft Word. Pentru
informatii mai ample se va studia Word VB Help sau alte materiale bibliografice.
9tili*area O$iectului Eea!er5ooter
Obiectul Eea!er5ooter poate sa reprezinte fie un antet, fie un picior de pagina. Obiectul Eea!er5ooter este
un membru al colectiei Eea!er5ooters, care este accesibila din obiectul )ection. Este important de stiut ca
nu se pot adauga elemente la colectia HeadersFooters. Un document Word poate sa aiba anteturi/picioare de
pagina pentru prima pagina, pentru pagini pare si pentru pagini impare si toate acestea sunt reprezentate.
Se utilizeaza proprietatile Eea!ers(index) sau 5ooters(index), ale obiectului )ection, pentru a returna un
obiect individual Eea!er5ooter, unde index este o constanta din tipul enumerat 2!Eea!er5ooterIn!e1:
wdHeaderFooterEvenPages, wdHeaderFooterFirstPage sau wdHeaderFooterPrimary. Este nsa evident, dupa
denumiri, ca Eea!ers se refera la anteturi iar 5ooters la picioare de pagina.
Urmatorul exemplu arata cum se poate modifica prin program un picior de pagina (de pe pagina impara):
Set oRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range
With oRange
.Delete
.Fields.Add Range:=oRange, Type:=wdFieldFileName, Text:="\p"
.nsertAfter Text:=vbTab
.nsertAfter Text:=vbTab
.Collapse Direction:=wdCollapseStart
.Fields.Add Range:=oRange, Type:=wdFieldAuthor
End With
Se observa definirea unui Range pentru a referi continutul piciorului de pagina, stergerea vechiului continut,
adaugarea unui cmp cu numele fisierului (n e1t se da switch-ul \p de inserare a caii fisierului), inserarea a
doua caractere TAB (pentru pozitionarea n dreapta a denumirii fisierului), comprimarea domeniului la punctul
de start si inserarea unui cmp cu numele autorului (din informatia adiacenta documentului).
92
Un obiect Eea!er5ooter poate fi returnat si prin proprietatea Eea!er5ooter a obiectului )election, cu
mentiunea ca selectia trebuie sa fie ntr-un antet sau picior de pagina. Aceasta conditie se realizeaza, de
exemplu, prin utilizarea proprietatii Vie4, aplicata ferestrei active, care returneaza un obiect Vie4.
Proprietatea &pe a obiectului Vie4 permite returnarea/stabilirea tipului de viziune (constante 2!Vie4&pe,
read/write, Long): wdMasterView, wdNormalView, wdOnlineView, wdOutlineView, wdPageView sau
wdPrintPreview. n modul page layout (wdPageView), proprietatea )ee:Vie4 returneaza sau stabileste care
element din document este afisat (constante 2!)ee:Vie4, Read/write, Long): wdSeekCurrentPageFooter,
wdSeekCurrentPageHeader, wdSeekEndnotes, wdSeekEvenPagesFooter, wdSeekEvenPagesHeader,
wdSeekFirstPageFooter, wdSeekFirstPageHeader, wdSeekFootnotes, wdSeekMainDocument,
wdSeekPrimaryFooter sau wdSeekPrimaryHeader.
Urmatorul exemplu insereaza un numar de pagina centrat, n piciorul de pagina al paginii curente:
With ActiveWindow.View
.Type = wdPageView
.SeekView = wdSeekCurrentPageFooter
End With
Selection.HeaderFooter.PageNumbers.Add _
PageNumberAlignment:=wdAlignPageNumberCenter
Exemplul mai arata si modul de inserare a numerelor de pagina: prin proprietatea Page/um$ers se
returneaza colectia cmpurilor cu numerele de pagina incluse n respectivul antet sau picior de pagina.
Proprietatea A!! a colectiei adauga un nou cmp numar de pagina (n mod uzual singurul element al
colectiei), referit printr-un obiect Page/um$er pentru care se pot stabili o serie de atribute, dupa cum altele
(renceperea numerotarii, tipul de numerotare) se stabilesc la nivel de colectie.
n sfrsit, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi si picioare de pagina
existente, se stabilesc din proprietatile obiectului Page)etup, care reprezinta comanda uzuala Page )etup
(Word meniul File).
Se utilizeaza proprietatea Different5irstPageEea!er5ooter a obiectului Page)etup pentru a specifica o
prima pagina diferita, proprietatea O!!An!E"enPagesEea!er5ooter pentru anteturi/picioare de pagina
diferite pentru pagini pare/impare. Daca proprietatea O!!An!E"enPagesEea!er5ooter este True, atunci se
returneaza antetul/piciorul paginii impare prin 4!Eea!er5ooterPrimar& si antetul/piciorul paginii pare prin
4!Eea!er5ooterE"enPages.
'olectia )t&les
Accesibila din obiectul Document, prin proprietatea )t&les, colectia )t&les reprezinta toate stilurile din
documentul respectiv. dentificarea unui stil particular se efectueaza uzual prin
expression.)t&les(index)
unde
expression returneaza un obiect Document
index este nume de stil (definit de utilizator), constanta 2!Builtin)t&le (nume de stil predefinit, cum ar fi
wdStyleHeading1) sau numar (indicele n colectie). Numele trebuie dat exact, cu spatieri daca asa a fost
definit, cu exceptia capitalizarii.
Adaugarea unui nou stil definit de utilizator se realizeaza prin metoda A!!, avnd sintaxa
93
expression.A!!(Name, Type)
unde
expression este o expresie care returneaza un obiect )t&les.
Name este String si reprezinta numele noului stil.
/ype este Variant, optional si stabileste tipul stilului. Poate fi una dintre constantele 2!)t&le&pe:
wdStyleTypeParagraph sau wdStyleTypeCharacter.
O$iectul )t&le
Reprezinta un singur stil predefinit sau definit de utilizator. Obiectul )t&le include atributele stilului ca
proprietati, dintre care enumeram:
o 5ont da acces la obiectul 5ont care permite formatarea caracterelor
o Paragrap35ormat da acces catre formatarea paragrafului
o /e1tParagrap3)t&le stabileste stilul pentru urmatorul paragraf
o BuiltIn care este True daca 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 sablonul atasat documentului activ ca un document Word (singurul mod n care se pot schimba
stiluri ntr-un template) si se modifica proprietatea 5ont a stilului "Heading 1", dupa care se nchide template-
ul.
'olectia 'omman!Bars
Ansamblul meniurilor si barelor de unelte sunt reprezentate de colectia 'omman!Bars. Dupa cum se stie din
operarea Word, la personalizarea mediului trebuie sa se precizeze domeniul de valabilitate al personalizarilor:
sablon, document etc. n mod analog, nainte de a modifica programatic mediul de utilizare se va apela
proprietatea globala 'ustomi*ation'onte1t pentru a preciza locul de memorare al modificarilor mediului.
Pentru salvarea modificarilor de comenzi n sablonul Normal se va utiliza
CustomizationContext = NormalTemplate
iar pentru salvarea n sablonul atasat documentului
CustomizationContext = ActiveDocument.AtttachedTemplate
Exemplul urmator adauga comanda Dou$le 9n!erline la bara de unelte 5ormatting:
CustomizationContext = NormalTemplate
CommandBars ("Formatting").Controls.Add Type:=msoControlButton, D:=60, Before:=7
94
Pentru o discutie mai ampla se va citi capitolul dedicat meniurilor si barelor de unelte.
'olectia Dialogs
Dialogurile mediului Word (cum ar fi Open. )a"e As etc.) sunt activate n Visual Basic prin apelul colectiei
Dialogs. La aceasta colectie nu se pot adauga alte elemente. Exista totusi posibilitatea, discutata ntr-un
capitol separat, de a proiecta dialoguri utilizator.
Pentru accesarea unui dialog, se utilizeaza Dialogs(index), unde index este o constanta de tip
2!2or!Dialog, care identifica boxa de dialog necesara. Se returneaza astfel un obiect Dialog care poate fi
exploatat prin proprietatile si metodele sale. Exemplul urmator afiseaza dialogul Open:
dlgAnswer = Dialogs(wdDialogFileOpen).Show
Denumirile sunt construite, n general, prin "wdDialog" & "nume meniu" & "nume comanda", de exemplu
wdDialog & File & PageSetup => wdDialogFilePageSetup. O parcurgere a elementelor tipului enumerat
2!2or!Dialog, prin intermediul Object Browser-ului, este edificatoare.
Pentru informatii mai ample se vor studia articolele din Word Visual Basic Help "Displaying built-in Word
dialog boxes", "Built-in dialog box argument lists".
Dintre proprietatile si metodele unui obiect Dialog mentionam:
o &pe, proprietatea care returneaza tipul boxei built-in. Poate fi una dintre constantele
2!2or!Dialog. Read-only, Long.
o Defaulta$, proprietatea care returneaza sau stabileste fisa activa la afisarea dialogului. Poate
fi o constanta de tip 2!2or!Dialoga$. Read/write, Long.
o Displa&, metoda care afiseaza dialogul, fara a transmite actiunile efectuate de utilizator asupra
dialogului.
o )3o4, metoda care afiseaza dialogul, actiunile utilizator fiind transmise sau executate.
o E1ecute, metoda care aplica configurarea curenta a optiunilor dintr-un dialog.
A!augarea si e!itarea cGmpurilor !intr<un !ocument
Se pot adauga cmpuri la un document prin aplicarea metodei A!! colectiei 5iel!s.
expression.A!!(Range, Type, Text, PreserveFormatting)
unde
expression este o expresie care returneaza un obiect 5iel!s.
*ange este o expresie care returneaza un Range. Este domeniul unde se adauga cmpul.
Daca domeniul nu este redus la punctul de insertie, cmpul nlocuieste domeniul.
/ype este de tip Variant, optional. Stabileste cmpul care se insereaza. Poate fi o constanta de
tip 2!5iel!&pe (vezi Help).
/ext este de tip Variant, optional. Text aditional necesar specificarii cmpului (de exemplu
informatii de gen switch).
&reserve1ormatting este de tip Variant, optional. Are valoarea True pentru a pastra formatarea
cmpului si la actualizari.
95
Dintre proprietatile obiectului 5iel!, membru al colectiei 5iel!s, mentionam
o Result, care returneaza un obiect Range reprezentnd rezultatul cmpului.
o 'o!e, care returneaza un obiect Range reprezentnd codul cmpului.
o /e1t, care returneaza urmatorul cmp n colectie.
o Pre"ious, care returneaza cmpul precedent din colectie.
Dintre metode amintim
o Do'lic:, echivalent cu actionarea cmpului de catre mouse.
o 9p!ate, care produce actualizarea rezultatului (recalcularea).
Exemplul urmator schimba codul primului cmp din selectie, actualizeaza cmpul si afiseaza rezultatul:
f Selection.Fields.Count >=1 Then
With Selection.Fields(1)
.Code.Text = "CREATEDATE \*MERGEFORMAT"
.Update
MsgBox .Result.Text
End With
End f
O$ser"atie. Pentru alte obiecte, cum ar fi )3apes, care reprezinta obiectele dintr-un strat de
desen (drawing layer), se vor vedea capitolele dedicate obiectelor comune tuturor aplicatiilor
Office.
Verificarea !aca un o$iect este "ali!
n aceasta sectiune se discuta cteva tehnici pentru verificarea validitatii unei valori returnate de o expresie
sau care este memorata ntr-o variabila. Aceste verificari pot elimina erori n executia codului proiectat.
Se poate utiliza functia &pe/ame pentru a determina un tip de obiect. Sintaxa este
&pe/ame(varname)
unde varname este un Variant care contine orice variabila cu exceptia variabilelor de un tip definit de utilizator.
n exemplul urmator se afiseaza un mesaj n bara de stare a aplicatiei n cazul cand )election%/e1t5iel!
returneaza un obiect 5iel! (informatie utila n prelucrarea formularelor):
f TypeName(Selection.NextField) = "Field" Then StatusBar = "Mai exista un cmp"
O forma echivalenta este
Set myField = Selection.NextField
f TypeName(myField) = "Field" Then StatusBar = "Mai exista un cmp"
n cazul cnd nu s-ar fi returnat un obiect, valoarea functiei era Nothing:
f Not (myField s Nothing) Then myField.Update
96
Este disponibila proprietatea globala IsO$(ectVali! prin care se determina daca obiectul referit de o variabila
este un obiect valid. Aceasta proprietate returneaza False daca obiectul referit a fost sters (nu exista).
Utilizarea este
expression.IsO$(ectVali!(Object)
unde
expression este o expresie care returneaza un obiect Application, optionala.
)bject este de tip O$(ect, o variabila care se refera la un obiect.
Exemplul urmator efectueaza o trecere prin toate paragrafele, le numara si compara cu proprietatea Count (o
verificare de dragul exemplificarii):
Dim i As nteger
i = 1
Do While sObjectValid(ActiveDocument.Paragraphs(i).Next)
i = i + 1
Loop
MsgBox Str(i) & " paragrafe = (?) " & Str(ActiveDocument.Paragraphs.Count)
Mo!ificarea comen*ilor 2or!
Majoritatea comenzilor Word pot fi modificate prin transformarea lor n macro-uri.
Pentru afisarea listei cu toate comenzile Word disponibile, se urmeaza secventa de comenzi, initiata din Word:
o ools
o Macro
o selecteaza 2or! comman!s n lista Macro in
o n boxa Macro name se afiseaza toate comenzile, denumirile avnd ca prima aprte numele
meniului utilizat implicit pentru comanda (de genul 5ileOpen).
Se poate nlocui o comanda Word printr-un macro, daca se scrie o procedura macro (reamintim ca o
procedura fara argumente este recunoscuta ca un macro) cu acelasi nume ca si comanda. Daca se creeaza o
procedura cu numele 5ile)a"e, aceasta este executata de catre Word atunci cnd se da comanda )a"e
(meniul 5ile), sau se click-eaza butonul )a"e (de pe bara )tan!ar!) sau se tasteaza combinatia directa
asociata cu 5ile)a"e.
Pentru scrierea unei proceduri de acest gen se poate urma
o ools => Macro => Macros => 2or! comman!s n Macro in
o selectarea comenzii care se nlocuieste
o selectarea locului de memorare n boxa Macro in. De exemplu Normal.dot pentru valabilitate
generala (obtinerea unui macro global).
o 'reate
Editorul Visual Basic deschide un modul care contine un sablon al noii proceduri, cum ar fi
Sub FileSaveHtml()
'
' FileSaveHtml Macro
97
' Save file as HTML document
'
WordBasic.FileSaveHtml

End Sub
n care se pot completa/sterge orice instructiuni.
Pentru a reveni la comanda Word initiala este suficient sa se elimine sau sa se redenumeasca procedura cu
numele comenzii.
Se poate nlocui, de asemenea, o comanda Word daca se creeaza un modul de cod avnd acelasi nume cu
comanda (de exemplu 5ile)a"e) si care contine o procedura denumita "Main".
Lucrul cu e"enimente
Un eveniment este o actiune recunoscuta de un obiect si pentru care se poate scrie cod care sa se execute,
ca raspuns la producerea evenimentului. Evenimentele pot sa se produca att ca rezultat al actiunii
utilizatorului sau prin program, ct si prin declansarea de catre sistem.
n Microsoft Word sunt recunoscute mai multe categorii de evenimente: asociate unui document, asociate
aplicatiei si asociate controalelor ActiveX.
E"enimente ale o$iectului Document
Trei evenimente sunt recunoscute de obiectul Document: 'lose. /e4 si Open.
o 'lose se produce atunci cnd se nchide documentul. Daca procedura de raspuns este
memorata ntr-un template, se executa att la nchiderea oricarui document bazat pe sablon,
ct si la nchiderea sablonului daca este deschis pentru editare.
o /e4 se produce la crearea unui nou document bazat pe sablon (codul de raspuns este
memorat n sablon, nu n document). O procedura de raspuns la /e4, memorata n document,
nu se va executa niciodata.
o Open se produce la deschiderea documentului. Vezi si observatia legata de sablon de la
'lose.
Procedurile de raspuns la aceste evenimente se scriu n modulul clasa intitulat "ThisDocument". Pentru a crea
o procedura se urmeaza etapele:
1. n Project Explorer, sub proiectul Normal sau document, se dublu clickeaza ThisDocument. (n viziunea
Folder, ThisDocument este localizat n folderul Microsoft Word Objects.)
2. n lista Object se selecteaza Document.
3. n lista Procedure se selecteaza evenimentul dorit (Close, New sau Open). Ca rezultat se adauga n
modul o procedura vida, denumita standard.
4. Se completeaza procedura cu instructiunile necesare scopului urmarit.

Urmatorul exemplu maximizeaza fereastra aplicatiei Word atunci cnd documentul este deschis:
Private Sub Document_Open()
Application.WindowState = wdWindowStateMaximize
End Sub
98
Domeniul de valabilitate (vizibilitate) a unei proceduri eveniment depinde de locul memorarii (de revazut
completarile date la enumerarea evenimentelor).
Procedurile eveniment din template-ul Normal nu au un domeniu global. Ele se vor executa doar daca
sablonul Normal este si sablonul atasat documnetului.
Procedurile care exista si n document si n template-ul atasat se vor executa amndoua.
E"enimente ale o$iectului Application
Evenimentele aplicatiei apar atunci cnd utilizatorul paraseste aplicatia sau atunci cnd focalizarea este
mutata pe alt document. Totusi, diferit fata de obiectul Document sau de controalele ActiveX, obiectul
Application nu recunoaste evenimentele n mod implicit (nu raspunde n mod standard la producerea lor). Din
acest motiv, nainte de a utiliza evenimentele obiectului Application, se va crea un modul clasa nou si se
declara un obiect de tip Application cu evenimente. Se utilizeaza, n acest scop, comanda 'lass Mo!ule din
meniul Insert al mediului VBE.
O$ser"atie. Denumirile utilizate n continuarea acestei sectiuni nu sunt standard, cu exceptiile evidente.
Pentru a permite evenimentele obiectului Application, se va adauga modulului clasa definit o declaratie de
tipul
Public WithEvents App As Application
Dupa ce noul obiect a fost declarat cu evenimente, el apare n lista O$(ect a modulului clasa si se pot scrie
procedurile eveniment pentru noul obiect (selectabile din lista Proce!ure).
nainte ca procedurile sa se execute, trebuie sa se conecteze obiectul declarat n modulul clasa cu obiectul
Application. Acest lucru se poate efectua din orice modul utiliznd, de exemplu, declaratia
Public apl As New EventClass
unde EventClass este numele modulului clasa creat.
Dupa crearea variabilei obiect apl (o instanta a clasei EventClass), se poate stabili egalitatea ntre obiectul
App al clasei EventClass si obiectul Application Word prin
Sub nitializeApp()
Set apl.App = Application
End Sub
Dupa executarea procedurii nitializeApp, obiectul App din clasa EventClass puncteaza catre obiectul
Application Word si procedurile evenimentelor din clasa se vor executa la aparitia evenimentelor
corespunzatoare.
Exista doua evenimente recunoscute de obiectul Application (dupa permiterea lor, ca mai sus):
o Document'3ange, care se produce la crearea unui nou document, la deschiderea unui
document, sau la activarea unui alt document (mutarea focalizarii).
o Fuit, care are loc la parasirea aplicatiei Word de catre utilizator.
Urmatorul exemplu asigura ca barele de unelte Standard si Formatting sunt vizibile nainte de parasirea
aplicatiei (nct urmatoarea activare a aplicatiei le afiseaza):
99
Private Sub App_Quit ()
CommandBars("Standard").Visible = True
CommandBars("Formatting").Visible = True
End Sub
E"enimentele controalelor Acti"eH
Un document Word poate sa includa controale ActiveX cum ar fi boxe de control, liste ascunse, butoane de
comanda. Pentru a scufunda un asemenea obiect ntr-un document, cel mai simplu este sa se vizualizeze
cutia de unelte pentru controale prin
o actionare buton dreapta mouse pe o bara de unelte
o selectare 'ontrol ool$o1
sau
o meniul Vie4 => ool$ars => selectare 'ontrol ool$o1.
Din cutia de controale se apasa categoria de controale dorita si la punctul de insertie se insereaza o instanta a
obiectului. Dublu click pe obiectul inserat da acces la rutinele de procesare a evenimentelor asociate
controlului. Pentru a vedea executia procedurilor se va actiona unealta E1it Design Mo!e din 'ontrol
ool$o1%
Word implementeaza, pentru controalele ActiveX dintr-un document, evenimentele
o Lost5ocus, care apare atunci cnd focalizarea este mutata de la control la alt obiect,
o Got5ocus, care apare atunci cnd focalizarea este mutata pe controlul ActiveX scufundat.
Fiecare control ActiveX recunoaste, totusi, evenimente aditionale, explicate la obiectele respective. n acest
curs mai multe explicatii si exemple sunt date n capitolul "Controale ActiveX si dialoguri".
9tili*area macro<urilor automate (Auto Macro)
Anumite proceduri macro, identificate prin denumirile speciale recunoscute ca atare de aplicatie, sunt
executate n mod automat la efectuarea unei operatii specifice. Word recunoaste urmatoarele denumiri drept
macro-uri automate:
AutoE1ec care se executa la pornirea aplicatiei Word sau se ncarca un template
global.
Auto/e4 care se executa la fiecare creare a unui document nou.
AutoOpen care se executa la deschiderea unui document existent.
Auto'lose care se executa la nchiderea unui document.
AutoE1it care se executa la nchiderea aplicatiei Word sau la descarcarea unui sablon
global.
Macrourile automate sunt recunoscute daca
o Modulul este bnumit cu numele macro-ului si contine o procedura denumita "Main."
o O procedura, n orice modul, are o denumire rezervata.
100
Macrourile automate pot fi memorate oriunde, template-ul Normal, alt sablon sau n document, cu exceptia
procedurii AutoExec care nu se executa daca nu este memorata n Normal template sau un template global
memorat n folderul Startup.
n cazuri de conflict de denumiri, se executa macro-ul automat memorat n contextul cel mai apropiat, adica n
ordinea: document7attached template7Normal template.
O$ser"atie. Apasarea tastei Shift simultan cu comanda previne executarea unui macro automat. De exemplu,
la crearea unui nou document pe baza unui template care are o procedura AutoNew, apasarea tastei Shift n
momentul actionarii butonului OK din dialogul New, previne executarea macr-ului (tasta trebuie pastrata
apasata pna cnd se afiseaza noul document).
ntr-o procedura care poate declansa un macro automat, prevenirea executiei se ia prin instructiunea
WordBasic.DisableAutoMacros
Automati*area aplicatiilor
Pentru a putea schimba date cu alte aplicatii, cum ar fi Excel, Access etc., se utilizeaza tehnica de
automatizare a aplicatiilor (cunoscuta anterior drept OLE Automation). Automatizarea permite returnarea,
editarea si exportul datelor prin referirea obiectelor, proprietatilor, metodelor altor aplicatii. Obiectele aplicatii
referite n alta aplicatie sunt denumite o$iecte !e automati*are.
Automati*area aplicatiei 2or! !in alta aplicatie
A% Primul pas pentru a face aplicatia Word disponibila n alta aplicatie, pentru automatizare (deci pentru
manevrarea programatica sau nu a obiectelor Word), este crearea unei referinte la biblioteca de tipuri Word
(2or! t&pe li$rar&):
o ools (din Visual Basic Editor)
o References
o selectarea boxei de control Microsoft 2or! I%J O$(ect Li$rar&.
B% Se declara o variabila obiect care va referi un obiect Application Word, dupa exemplul
Dim appWD As Word.Application.8
'% Se apeleaza functia 'reateO$(ect (pentru crearea unui obiect de automatizare) sau GetO$(ect (pentru
regasirea unui obiect de automatizare existent) cu Word OLE Programmatic dentifier (Word.Application.8 sau
Word.Document.8), ca n exemplul urmator. Pentru a vedea sesiunea Word se utilizeaza proprietatea Visi$le:
Dim appWD As Word.Application.8
Set appWD = CreateObject("Word.Application.8")
appWD.Visible = True
Functia 'reateO$(ect returneaza un obiect Application Word si-l asigneaza variabilei appWD. Utiliznd
obiectele, proprietatile si metodele obiectului Application Word se poate controla aplicatia Word prin
intermediul variabilei appWD. De exemplu, crearea unui nou document
appWD.Documents.Add
101
D% Functia 'reateO$(ect porneste o sesiune Word pe care automatizarea nu o nchide atunci cnd expira
variabila obiect care se refera la obiectul Application Word. Nici stabilirea referintei obiectului la /ot3ing nu
produce nchiderea aplicatiei Word. Pentru aceasta se va utiliza metoda Fuit a aplicatiei Word.
Urmatorul exemplu, din Microsoft Excel, insereaza datele din celulele A1:B10 din Sheet1 ntr-un document
Word nou si, n acest document, le aranjeaza ntr-un tabel. Comentariile incluse explica etapele prelucrarii.
'
'declararea variabilei obiect appWD
'
Dim appWD As Word.Application
Err.Number = 0
On Error GoTo notloaded
'
'obtinerea unui obiect Word Application, daca este pornita o sesiune Word
'
Set appWd = GetObject(, "Word.Application.8")
notloaded:
f Err.Number = 429 Then
'
' se initiaza o sesiune Word (nu este alta sesiune deschisa)
'
Set appWD = CreateObject("Word.Application.8")
theError = Err.Number
End f
'se vizualizeaza 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 doua coloane separate prin TAB
'
For Each c n Worksheets ("Sheet1").Range("A1:B10")
.nsertAfter Text:=c.Value
Count = Count +1
f Count Mod 2 = 0 Then
.nsertAfter Text:=vbCr
Else
.nsertAfter Text:=vbTab
End f
Next c
'
' convertirea textului n tabel si autoformatarea tabelului
'
.Range.ConvertToTable Separator:=wdSeparateByTabs
.Tables(1).AutoFormat Format:=wdTableFormatClassic1
End With
'
' salvarea documentului Word
'
myDoc.SaveAs FileName:="C:\Temp.doc"
End With
102
'
' nchiderea sesiunii Word, daca sesiunea este deschisa de acest cod
'
f theError = 429 Then appWD.Quit
'
' eliberarea variabilei appWD
'
Set appWD = Nothing
Automati*area altei aplicatii !in 2or!
Pentru a controla alte aplicatii dintr-un document Word, se va proceda n mod analog automatizarii aplicatiei
Word din alte aplicatii (vezi sectiunea precedenta).
Cele doua exemple, unul referitor la Excel, celalalt la PowerPoint, devin mai explicite dupa revederea
exemplului anterior.
Textul selectat n documentul Word activ este trimis catre o foaie de calcul Excel, n celula A1:
Dim xlObj As Excel.Application.8
f Tasks.Exists("Microsoft Excel") = True Then
Set xlObj = GetObject(, "Excel.Application.8")
Else
Set xlObj = CreateObject(, "Excel.Application.8")
End f
xl.Obj.Visible = True
f xlObj.Workbooks.Count = 0 Then xlObj.Workbooks.Add
xlObj.Worksheets("Sheet1").Range("A1").Value = Selection.Text
Set xlObj = Nothing
Exemplul urmator creeaza o nuoa prezentare PowerPoint, completeaza prima boxa text cu numele
documentului Word activ si a doua boxa text cu primul paragraf al documentului. La terminare se elibereaza
variabila obiect aplicatie.
Dim pptObj As PowerPoint.Application.8
f Tasks.Exists("Microsoft PowerPoint") = True Then
Set pptObj = GetObject(, "PowerPoint.Application.8")
Else
Set pptObj = CreateObject(, "PowerPoint.Application.8")
End f
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
'omunicarea cu o$iectele 2or! scufun!ate
Se poate utiliza proprietatea Application a oricarui obiect Word pentru a returna obiectul Word Application.
Acest lucru este util pentru returnarea obiectului Word Application dintr-un document Word scufundat n alta
aplicatie.
103
Urmatorul exemplu, executat din Excel, necesita ca Shapes(1) din foaia activa sa fie un document Word
scufundat (obtinut prin Insert;O$(ect;). Prin exemplu se modifica 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).nsertBefore Text:="Textul nou"
n mod similar, exemplul urmator, executat din PowerPoint, necesita ca Shapes(1) din primul slide sa 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
104
'ontroale Acti"eH si Dialoguri
Proiectarea casetelor !e !ialog utili*ator
Crearea unui nou dialog
Scrierea procedurilor de raspuns la evenimente
'ontroale
Label
TextBox
ListBox
ComboBox
CheckBox
OptionButton
ToggleButton
CommandButton
TabStrip
MultiPage
Frame
mage
9tili*area !ialogurilor utili*ator
Afisarea unui dialog
Obtinerea/editarea proprietatilor n executie
9tili*area controalelor Dn !ocumente 2or!. E1cel. Po4erPoint
Controale ActiveX n documente Word
Controale ActiveX n foi de calcul Excel
Controale ActiveX n diapozitive PowerPoint
Controlarea programatica a controalelor din documentele aplicatiilor
Proiectele create n Visual Basic for Applications pot fi completate cu o interfata utilizator evoluata, sub forma
unor cutii de dialog la nivelul celor existente deja n Microsoft Office. Performantele si aspectul dialogurilor
utilizator sunt mbunatatite prin posibilitatea de plasare a unor controale ActiveX (numite anterior controale
OLE).
Un control ActiveX trebuie gndit ca un obiect caruia i se pot stabili atribute (prin proprietati) si care
recunoaste evenimente (este "viu").
Aceste controale, cu proprietati ajustabile, recunosc multiple evenimente. Astfel, prin scrierea procedurilor
eveniment, interfata cu utilizatorul proiectului poate fi personalizata si diferentiata corespunzator.
Controalele ActiveX pot fi plasate si direct n documentele aplicatiilor: documente Word, foi de calcul Excel,
diapozitive PowerPoint. nserarea acestora este facilitata de cutia de unelte Control Toolbox, care poate fi
afisata la fel cu orice alta bara de unelte.
Aplicatiile din Office 97 utilizeaza aceleasi unelte pentru proiectarea dialogurilor, astfel nct prezentarea care
urmeaza este valabila pentru toate proiectele VBA (din Word, Excel, PowerPoint si, cu unele exceptii, pentru
Access).
Proiectarea $o1elor !e !ialog utili*ator
Crearea unui dialog utilizator (termenul utilizator este adaugat pentru diferentierea de dialogurile built-in,
ncorporate mediului si se refera la cel care scrie codul si nu la cel care l va utiliza, confuzia nefiind att de
mare nct sa trebuiasca o denumire speciala) necesita parcurgerea mai multor etape:
105
o crearea unei forme (form sau UserForm), care constituie suportul pe care sunt adaugate
controalele;
o plasarea controalelor pe forma;
o stabilirea proprietatilor pentru controale;
o scrierea procedurilor de raspuns la evenimentele formei si controalelor plasate pe ea.
Atunci cnd se proiecteaza un dialog, n Visual Basic Editor, suntem n mo!ul !e proiectare (design mode).
n acest mod se pot edita controalele si controalele nu reactioneaza la evenimente. La executia boxei de
dialog, deci la afisarea dialogului exact cum va fi vazut de un utilizator, suntem n mo!ul !e e1ecutie (run
mode). Controalele raspund evenimentelor n modul executie.
'rearea unui nou !ialog
Orice boxa de dialog utilizator din proiect este o forma (sau UserForm). O UserForm noua contine o bara de
titlu si o zona goala n care se pot plasa controale.
o Din meniul Insert, n Visual Basic Editor, se alege 9ser5orm.
Este afisata o forma noua ale carei proprietati se stabilesc n fereastra
Properties (vezi figurile atasate, n figura cu forma sunt plasate si doua
controale).
Proprietatile formei sunt clasificate n categoriile:
o aparenta (Appearence);
o comportare (Be3a"iour);
o font (5ont);
o Diverse (Misc);
o imagine (Picture);
o pozitie (Position);
o defilare ()crolling).
dupa cum se vizualizeaza alegnd fisa Categorized din fereastra Properties.
Proprietatile de aparenta se refera la culorile utilizate, la efectele
vizuale de umplere etc.
Proprietatile de comportare descriu modul de continuare a actiunilor la
parasirea ultimului control de pe forma ('&cle) sau accesul
utilizatorului la obiect (Ena$le!).
Prin 5ont se specifica fontul utilizat implicit pe forma (poate fi modificat
pentru fiecare control n parte).
n Misc se gasesc proprietatile care stabilesc numele formei, memoria
utilizata la afisare, imaginea mouse-ului etc.
n Picture se dau specificatiile imaginii utilizate pentru pavarea formei.
n Position sunt specificatiile de pozitie si dimensiuni.
n )crolling se fixeaza vizibilitatea si pozitia barelor de defilare.
106
Concomitent cu afisarea formei, n Design Mode, devine vizibila si cutia cu controale, Toolbox, (vezi figura).
Pentru a adauga un control pe forma, se trage controlul dorit pe forma si se ajusteaza
dimensiunile n mod uzual, sau se click-eaza controlul dorit, cursorul devine cursor
cruce si se ntinde pe forma cu dimensiunile dorite.
Operatiunea de dragare din cutie pe forma poate fi efectuata si n sens invers:
tragerea unui control, sau a unui grup de controale, de pe forma n cutie de unelte
creeaza un template care poate fi reutilizat.
Dupa adaugarea controalelor pe forma, se utilizeaza comenzile din meniul 5ormat
sau butoanele de pe bara de unelte 9ser5orm din VBE pentru a ajusta alinierea si
spatierea controalelor. Se utilizeaza dialogul a$ Or!er (din meniul Vie4) pentru a modifica ordinea de
parcurgere a controalelor la tastari succesive de Tab (n executie run time).
VBE stabileste proprietatea a$In!e1 a controloalelor pentru a determina ordinea la Tab-uri.. Daca se doreste
ca utilizatorul sa nu aiba acces prin Tab la un control, se va stabili proprietatea a$)top la False. Pentru
aceasta, se actioneaza butonul drept al mouse-ului pe control si selectarea comenzii Properties din meniul
contextual.
)crierea proce!urilor !e raspuns la e"enimente
Fiecare forma sau control recunoaste un set predefinit de controale, care pot fi declansate fie de utilizator, fie
de sistem. De exemplu, un buton de comanda recunoaste evenimentul 'lic: declansat de actionarea cu
mouse-ul, iar forma recunoaste evenimentul Initiali*e care apare atunci cnd este initializata.
Pentru a scrie o procedura eveniment, se deschide fereastra Code prin dublu click pe UserForm sau pe
controlul respectiv, selectarea numelui evenimentului n boxa Proce!ure a ferestrei Code. Procedurile
eveniment au denumiri create ntr-un mod standard: numele formei sau controlului, liniuta de subliniere si
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 atasate proceduri fiind scrise n bold.
La scrierea codului de raspuns la evenimente, controalele sunt numite cu denumirile existente la acel moment.
Cum aceste denumiri pot fi modificate oricnd n dezvoltarea proiectului, procedurile eveniment atasate nu se
redenumesc n mod automat. Se recomanda astfel ca denumirile sa fie acordate nainte de scrierea
procedurilor respective, n caz contrar orice modificare a numelor trebuie sa fie nsotita de modificarile
denumirilor procedurilor.
'ontroale
n aceasta sectiune se explica, pe scurt, principalele controale disponibile n proiectarea dialogurilor.
La$el 'ontrol
Un control La$el este utilizat pentru afisarea unui text, descriptiv, cum ar fi titluri, captari, instructiuni de ajutor.
Textul afisat nu este si nu poate fi legat de surse de date.
Proprietatea implicita este 'aption. reprezentnd textul afisat.
Evenimentul implicit este 'lic:. declansat la actionarea butonului stng mouse pe control.
107
e1tBo1 'ontrol
Afiseaza informatie scrisa de utilizator sau primita dintr-o multime organizata de date.
Daca TextBox este legata de o sursa de date, atunci modificarea informatiei afisate produce si modificarea
informatiei din sursa de date (de exemplu un cmp dintr-o tabel). nformatia afisata poate fi formatata doar
unitar (acelasi font, acelasi stil).
Proprietatea implicita este Value, reprezentnd continutul boxei.
Evenimentul implicit este '3ange, declansat la modificarea proprietatii Value.
ListBo1 'ontrol
Afiseaza o lista de valori si permite selectarea unei sau mai multor intrari din lista.
ntr-o ListBo1 cu o singura coloana se poate adauga o intrare prin metoda A!!Item.
Daca ListBo1 este legata de o sursa de date, atunci este memorata valoarea selectata n sursa.
Controlul ListBo1 poate sa apara ca o lista ori ca un grup de controale
OptionButton sau '3ec:Bo1. Pentru aceasta din ultima optiune se va stabili
proprietatea List)t&le la Option; proprietatea Multi)elect va determina atunci
intrarile: Single butoane radio, Multi sau Extended boxe de control.
Proprietatea implicita este Value, reprezentnd valoarea selectata curent (din
coloana data de proprietatea Boun!'olumn).
Evenimentul implicit este 'lic:.
'om$oBo1 'ontrol
Combina posibilitatile de la ListBo1 si e1tBo1: utilizatorul poate introduce o valoare
noua (ca la e1tBo1), sau poate selecta o valoare dintr-o lista (ca la ListBo1). Grafic, un
control 'om$oBo1 arata ca o lista ascunsa (doar o linie este afisata).
Daca se leaga controlul la o sursa de date (celule dintr-o foaie de calcul) va fi afisata valoarea selectata n
sursa. Pentru un control cu mai multe coloane, proprietatea Boun!'olumn determina unde se afiseaza sursa
de date.
Proprietatea implicita este Value, reprezentnd valoarea selectata.
Evenimentul implicit este '3ange.
'3ec:Bo1 'ontrol
Afiseaza starea selectat / neselectat a unui element. Este utilizat pentru alegeri ntre doua alternative (Yes/No,
True/False sau On/Off.).
Selectarea este afisata prin prezenta unui X n caseta corespunzatoare si starea curenta este Da, Adevarat,
Prezent etc. Neselectarea este aratata printr-o caseta vida si indica starea Nu, Fals, Absent etc. n functie de
valoarea proprietatii riple)tate, controlul poate sa aiba si valoarea Null.
108
La legarea de o sursa de date, schimbarea starii se reflecta n modificarea valorii sursei. Un CheckBox
suspendat (disabled) afiseaza starea dar nu poate fi modificat.
Proprietatea implicita este Value. , adica Null starea null (nici selectat nici deselectat), (1) True (selectat),
0 False (deselectat).
Evenimentul implicit este Click.
OptionButton 'ontrol
Permite afisarea elementului selectat dintr-un grup de optiuni. Controlul este cunoscut si ca buton radio
(apasarea unui buton de selectare a unei game de lungimi de unda le deselecteaza pe celelalte). Este de
observat ca butoanele de optiune dintr-un frame sunt mutual exclusive. Figura este capturata din modul
Design.
Daca un OptionButton este legat la o sursa de date, controlul poate sa arate
valori Yes/No, True/False sau On/Off, corespondentele ntre valori si starea
controlului fiind evidente. Schimbarea starii butonului modifica si sursa.
Un control inhibat este desenat sters si nu arata nici o valoare. n functie de
proprietatea riple)tate, controlul poate avea si valoarea Null.
oggleButton 'ontrol
Arata starea de selectare a unui element (similar unui checkbox) prin imaginea grafica a unui buton apasat
sau nu.
Daca un control ToggleButton este legat de o sursa de date, controlul arata valoarea
curenta a sursei ca Yers/No, True/False, On/Off sau ceva similar. Butonul apasat reprezinta
Yes, True sau On. Daca ToggleButton este legat de o sursa de date, schombarea starii
controlului se reflecta si n valoarea sursei.
Un control ToggleButton inhibat (disabled) este desenat neclar, arata totusi valoarea dar nu poate fi modificat.
Proprietatea implicita este Value, adica Null starea null (nici selectat nici deselectat), (1) True (selectat), 0
False (deselectat).
Evenimentul implicit este 'lic:.
'omman!Button 'ontrol
Este utilizat pentru indicarea nceperii, terminarii sau ntreruperii unei actiuni. Este reprezentat grafic precum
butoanele uzuale OK, Cancel etc. din dialogurile aplicatiilor din Office (si nu numai).
n general, pentru realizarea scopului este utilizata procedura (sau macro) asociat evenimentului 'lic:. Pe un
'omman!Button se poate afisa text (proprietatea 'aption), imagine (proprietatea Picture) sau ambele.
Proprietatea implicita este Value, ntotdeauna False. Stabilind proprietatea Value drept True (ntr-o
procedura), initiaza evenimentul 'lic: al butonului de comanda.
Evenimentul implicit este 'lic:.
a$)trip 'ontrol
109
Este utilizat, de obicei, pentru prezentarea unor seturi de informatii (ca valori ale unor controale grafice),
fiecare grup de informatii apartinnd altei entitati. Prin urmare structura informatiei afisate este ntotdeauna
aceeasi, dar se refera la entitati diferite (persoane, fapte etc.).
Din punct de vedere grafic, se poate confunda acest control cu MultiPage,
diferenta fiind aceea ca la a$)trip zona de afisare (client region) este comuna
tuturor fiselor (doar informatia se modifica), pe cnd la MultiPage fiecare fisa
(pagina) are o zona proprie, cu controale proprii.
Se poate spune ca daca se pastreaza structura informatiei, atunci se va utiliza un
control a$)trip, un tab definind purtatorul informatiilor. Daca informatia este
structurata n categorii, atunci se poate utiliza controlul MultiPage, fiecare
categorie avnd propria zona client.
O$ser"atie% a$)trip este implementat ca un container a unei colectii a$s de obiecte a$.
Proprietatea implicita pentru a$)trip este )electe!Item, care returneaza obiectul a$ selectat si este folosit
la controlarea programatica a obiectului.
Evenimentul implicit este '3ange, declansat la selectarea altui a$.
MultiPage 'ontrol
Prezinta mai multe pagini de informatii distincte. Spre deosebire de
controlul TabStrip, selectarea altei pagini poate prezenta o alta structura de
informatii.
n acest mod se pot afisa seturi consistente (categorii) de informatii,
pastrnd n acelasi timp unitatea ntregii nregistrarii.
O$ser"atie% MultiPage este implementat ca un container a unei colectii Pages de obiecte Page.
Proprietatea implicita este Value, care returneaza indexul paginii avtive curente (n colectia Pages).
Evenimentul implicit este '3ange, declansat la schimbarea paginii.
5rame 'ontrol
Reprezentat grafic ca un chenar cu o denumire, controlul serveste la gruparea unor controale. Grupul poate fi
unit doar prin categoria de informatii, permitnd utilizatorului o identificare rapida a controalelor, dar, pentru
anumite controale cum ar fi OptionButton, gruparea are efect si n comportarea controalelor din grup.
Exemplul de la OptionButton arata un 5rame care include butoane radio: acestea sunt mutual exclusive.
Exemplul de la oggleButton arata un 5rame similar, dar butoanele pot fi actionate n orice configuratie.
Evenimentul implicit este 'lic:.
Image 'ontrol
Permite afisarea unui imagini (poze) pe o forma, ca element al datelor reprezentate pe forma si nu ca un
simplu element decorativ. De exemplu fotografia unui angajat n forma cu informatiile personale ale
angajatului. Cu alte cuvinte, nu se controleaza aspectul grafic al imaginii, ci modul cum ea apare n control (de
unde, ct de mare etc.).
110
Controlul permite taierea (retezarea) imaginii, dimensionare, mariri, dar nu permite editarea propriu-zisa (care
va fi efectuata printr-un program de grafica).
Daca se da controlului o dimensiune egala cu cea a formei, atunci Image poate furniza un fundal pe care se
pot pozitiona alte controale.
Sunt suportate formatele .bmp, .cur, .gif, .ico, .jpg, .wmf de fisiere grafice.
Evenimentul implicit este 'lic:.
9tili*area !ialogurilor utili*ator
Pentru a schimba informatii cu utilizatorul proiectului printr-o cutie de dialog utilizator, trebuie ca
o dialogul sa fie afisat,
o sa se accepte actiunile utilizatorului asupra controalelor din dialog si, la nchiderea dialogului,
o sa se dispuna de informatia introdusa de utilizator (pentru a fi procesata, pentru a controla
actiunile ulterioare etc.).
Afisarea unui !ialog
Afisarea unui dialog pentru testare, deci n Design Mode, se realizeaza prin comanda Run )u$A9ser5orm
(meniul Run din VBE). Afisarea dialogului n mod programatic se realizeaza utiliznd metoda )3o4 dupa
modelul
[object.])3o4
daca object nu este specificat, atunci se va considera implicit dialogul asociat modulului activ UserForm.
Daca obiectul specificat nu este ncarcat la apelarea metodei, atunci VB l ncarca automat. O cutie de dialog
utilizator este ntotdeauna modala, deci utilizatorul trebuie sa raspunda (chiar daca prin nchidere) nainte de a
utiliza altceva din aplicatie. Nu se executa alte instructiuni pna cnd dialogul nu este ascuns sau nchis
(descarcat unloaded). Este posibil totusi sa se lucreze n alte aplicatii.
O$tinerea si sta$ilirea proprietatilor Dn e1ecutie
Pentru modificari ale proprietatilor unui control este necesar ca valorile acestora sa fie citite si redefinite n
timpul executiei (Run time sau Run Mode).
Asemenea actiuni sunt, de exemplu, utile atunci cnd pentru un control se dau valori implicite (default), deci
valori cu care dialogul sa se afiseze indiferent de actiunile de la alte afisari anterioare. n acest caz, se va
adauga codul corespunzator n procedura de eveniment Initiali*e a dialogului. Afisarea formei declanseaza
evenimentul Initiali*e si astfel au loc si atribuirile de valori specificate.
Exemplul urmator presupune existenta unei forme UserForm, denumita frmPhoneOrders, care are
o un control TextBox, denumit txtCustomerName,
o un control ListBox, denumit lstRegions,
o un control CheckBox, denumit chkSendExpress.
Codul urmator realizeaza initializarea valorilor de pe forma, nct orice aratare a formei se realizeaza n
aceeasi configuratie:
111
Private Sub UserForm_nitialize()
With frmPhoneOrders
.txtCustomerName.Text = "Mamma S.R.L." 'se initializeaza TextBox
.chkSendExpress.Value = True 'se initializeaza CheckBox
With .lstRegions
.Addtem "asi" 'se initializeaza ListBox
.Addtem "Suceava"
.Addtem "Botosani"
.Listndex = 2 'se selecteaza ultima intrare
End With
End With
End Sub
Este de remarcat ca desi n modelele de obiecte Word, Excel si PowerPoint colectiile sunt indexate de la 1, n
tablourile si colectiile asociate formelor se foloseste indexarea de la 0. De aici selectarea ultimei intrari (cu
numarul de ordine 3) din lista prin instructiunea Listndex = 2.
Daca se doreste stabilirea valorilor initiale pentru un control, dar apelurile ulterioare sa retina modificarile
efectuate, se vor da aceste valori nainte afisarii dialogului. Urmatorul exemplu arata o procedura care
afiseaza forma dupa atribuirea valorilor implicite.
Private Sub GetUserName( )
With UserForm1
.lstRegions.Addtem "North"
.lstRegions.Addtem "South"
.lstRegions.Addtem "East"
.lstRegions.Addtem "West"
.txtSalesPersonD.Text = "0000"
.Show
End With
End Sub
Prin setarea proprietatilor unui control si aplicarea metodelor n timpul executiei, se pot efectua modificari ntr-
un dialog utilizator care se executa, modificari aparute ca raspuns la actiunile si alegerile utilizatorului. De
exemplu, accesibilitatea unor controale poate fi controlata prin modificarea proprietatii Ena$le!. Daca
proprietatea este setata pe False, atunci utilizatorul nu poate accesa controlul: cum ar fi interzicerea accesului
la butonul OK pna cnd o anumita informatie nu este completata n dialog.
Exemplul urmator arata cum accesul la un grup de butoane radio nu este permis dect daca o CheckBox este
marcata:
Private Sub CheckBox1_Change()
With Me ' Me se refera la forma curenta
f .CheckBox1.Value = True Then
.OptionButton1.Enabled = False
.OptionButton2.Enabled = False
.OptionButton3.Enabled = False
Else
.OptionButton1.Enabled = True
.OptionButton2.Enabled = True
.OptionButton3.Enabled = True
End f
End With
End Sub
112
Prin intermediul metodei )et5ocus se controleaza focalizarea. Un control care are focusul este cel care
raspunde la intrarile din tastatura. De exemplu
Private Sub mage1_Click ()
Me.CheckBox1.SetFocus
End Sub
realizeaza trecerea focusului la '3ec:Bo1K atunci cnd imaginea din controlul ImageK (unde este scrisa
procedura eveniment) este click-ata.
n timpul executiei se pot manevra si proprietatile/metodele formei. n acest mod se modifica dinamic aspectul
formei.
Astfel, o utilizare frecventa este aceea cnd se modifica portiunea afisata a formei, vizualiznd (deci dnd
acces) controale suplimentare, sau ascunzndu-le (nu mai pot fi accesate, desi nu sunt inhibate). n acest
scop se opereaza cu proprietatea Eeig3t.
Presupunem ca o forma, cu un buton radio, este dimensionata n proiectare cu Eeig3t = 120 si se adauga un
control, de exemplu un '3ec:Bo1, la baza formei, controlul fiind pozitionat prin proprietatea op setata la mai
mult de 120 (deci n afara zonei afisate din forma). Se adauga urmatoarele proceduri eveniment:
Private Sub UserForm_nitialize ()
Me.Height = 120 'Orice afisare a formei readuce naltimea la 120
End Sub

Private Sub OptionButton1_Click ()
With Me
.Height = 300 .Height
'Modificarea butonului radio basculeaza ntre cele doua dimensiuni ale formei
End With
End Sub
Pentru ca exemplul sa functioneze corect se presupune ca forma extinsa la 180 afiseaza si boxa de control.
n exemplul urmator se arata cum putem parcurge informatii printr-un obiect TabStrip. Valoarea afisata ntr-o
boxa text este modificata dupa indexul tab-ului selectat:
Private Sub TabStrip1_Click (ByVal ndex As Long)
f ndex = 0 Then
Me.TextBox1.Text = "7710 Park Lane"
Elsef ndex = 1 Then
Me.TextBox1.Text = "5520 5th Avenue"
End f
End Sub
De amintit ca numerotarea ncepe de la 0 ntr-o colectie de pe o forma.
Validarea informatiilor introduse de un utilizator este un alt subiect important n procesarea unui dialog. Pentru
efectuarea verificarilor ca utilizatorul a introdus tipul corect de informatii printr-un control, se va testa valoarea
atunci cnd controlul pierde focusul sau cnd ntregul dialog este nchis. Evenimentele Enter si E1it pot fi
utilizate n acest scop.
113
Enter apare imediat nainte ca un control sa primeasca efectiv focusul de la alt control de pe aceeasi forma.
Exit apare imediat nainte ca un control sa piarda focusul n favoarea altui control de pe aceeasi forma.
Sintaxa procedurilor eveniment respective este
Pri"ate )u$ object_Enter( )
Pri"ate )u$ object_E1it( B&Val Cancel As M)5orms%ReturnBoolean)
unde
object este un nume valid de control care recunoaste evenimentul
0ancel este starea evenimentului: False arata procesarea evenimentului de catre control (optiunea implicita);
True arata ca evenimentul este tratat de aplicatie si focusul ramne pe controlul curent.
Deoarece evenimentul Enter se declanseaza nainte ca focusul sa fie dat unui control, poate fi utilizat pentru
afisarea unui text explicativ, de procesare a respectivului obiect.
n scrierea procedurii pentru E1it nu trebuie uitata atribuirea valorii True argumentului pentru ca focusul sa
ramna pe controlul curent.
De studiat si metoda )et5ocus prin care un anumit control de pe forma primeste focusul.
Urmatorul exemplu previne utilizatorul sa paraseasca o zona text n care trebuie sa introduca neaparat o
valoare numerica:
Private Sub txtCustAge_Exit (ByVal Cancel As MsForms.ReturnBoolean)
f Not sNumeric(txtCustAge.Text) Then
MsgBox "Vrsta trebuie sa fie numerica"
Cancel = True
End f
End Sub
Pentru verificarea datelor nainte de nchiderea dialogului, se include codul corespunzator (prin care se pot
verifica valorile mai multor controale de pe forma) n aceeasi procedura care descarca (nchide) dialogul. Daca
exista erori de completare se va parasi procedura, prin Exit Sub, nainte de executarea instructiunii Unload si
se va da focusul primului control eronat.
Exemplul urmator se executa la actionarea butonului de comanda, denumit cmdOK, si previne parasirea
dialogului prin actionarea acestui buton daca boxa text txtCustAge nu este numerica:
Private Sub cmdOK_Click ()
f Not sNumeric (txtCustAge.Text) Then
MsgBox "Vrsta trebuie sa fie numerica"
txtCustAge.SetFocus 'Controlul reprimeste focusul
Exit Sub 'Se paraseste procedura
End f
custAge = txtCustAge.Text 'Se salveaza valoarea controlului
Unload Me 'Se descarca forma
End Sub
Este de mentionat ca pentru trecerea valorii n alt modul de cod, variabila custAge trebuie calificata, de
exemplu ThisDocument.custAge.
114
La nchiderea unui dialog, toate datele introduse de utilizator se pierd. Returnarea valorilor controalelor dintr-o
forma dupa ce forma a fost descarcata conduce la valorile implicite n locul celor introduse/selectate de
utilizator. Din acest motiv, informatia necesara trebuie sa fie salvata n variabile de la nivelul modul, naintea
descarcarii formei. Exemplul precedent utilizeaza n acest scop variabila custAge, care trebuie sa fie declarata
la nivel de modul prin
Public custAge As nteger
de exemplu.
Cutiile de dialog utilizator sunt afisate ntotdeauna drept mo!ale. Prin urmare utilizatorul trebuie sa nchida
dialogul nainte de a se ntoarce n aplicatia principala.
nchiderea (descarcarea) formei se realizeaza prin instructiunea 9nloa!. n mod uzual se va include n forma
cel putin un buton de comanda prin actionarea caruia se nchide forma.
Exemplul urmator insereaza n documentul Word textul introdus de utilizator n boxa txtUserName si nchide
forma, la actionarea butonului de comanda denumit cmdOK:
Private Sub cmdOK_Click ()
ActiveDocument.Content.nsertAfter txtUserName.Text
Unload UserForm1
End Sub
Pentru a utiliza aceeasi boxa de dialog n mai multe aplicatii (Word, Excel, PowerPoint accepta aceleasi
dialoguri). Daca dialogul contine totusi referiri la obiecte specifice unei aplicatii, atunci utilizarea n alta
aplicatie nu este lipsita de erori.
Pentru reutilizarea dialogurilor proiectate se exporta ca un fisier .frm care poate fi importat n alte aplicatii:
n VBE unde s-a proiectat forma, right-click pe 9ser5orm din Pro(ect E1plorer, click E1port 5ile.
Se alege un nume si )a"e. Se obtine un fisier nume.frm.
n VBE unde se doreste reutilizarea formei, right-click pe proiectul respectiv din Pro(ect E1plorer, click
pe Import 5ile.
Selectarea numelui formei si Open.
9tili*area controalelor Dn
!ocumente 2or!. foi !e calcul E1cel sau
!iapo*iti"e Po4erPoint
n acelasi mod n care controalele se adauga unei forme, acestea pot fi adaugate unui document, foi de calcul
sau slide pentru a le transforma n obiecte interactive. De exemplu, se pot adauga boxe text, lista, butoane
radio etc. unui document, pentru a-l transforma ntr-un formular online. Se pot adauga butoane de comanda
pe o foaie de calcul pentru a executa proceduri macro uzuale etc.
Desi modul de operare este foarte asemanator, exista deosebiri precum
o adaugarea controalelor se realizeaza cu ajutorul cutiei de unelte 'ontrol ool$o1 (si nu
ool$o1 ca n VBE). Afisarea acestei cutii se realizeaza din Vie4 < ool$ars < 'ontrol
ool$o1%
o bascularea ntre Design mo!e si Run mo!e se efectueaza n Word sau Excel prin actionarea
butoanelor E1it Design Mo!e si Design Mo!e de pe bara Visual Basic. n PowerPoint se
115
trece n )li!e )3o4 pentru a fi n Run Mo!e si se revine ntr-o viziune de editare pentru
Design Mo!e.
o un control poate avea multimi diferite de evenimente ntr-un document, foaie sau slide n raport
cu acelasi control de pe o forma. De exemplu, un buton de comanda dintr-o forma are
evenimentul Exit, n timp ce un buton de comanda dintr-un document nu recunoaste acest
eveniment.
'ontroale Acti"eH Dn !ocumente 2or!
La adaugarea si operarea cu controale ntr-un document Word sunt importante urmatoarele idei:
Controalele ActiveX se pot adauga fie stratului (layer-ului) de text fie stratului de desen. Pentru
plasarea controlului n text, se va actiona simultan tasta SHFT si click-ul pe controlul din 'ontrol
ool$o1. n acest caz, controlul se va insera ca un caracter, pentru un aspect bun trebuie sa se
lucreze la atributele liniei si paragrafului. Pentru plasarea unui control n layer-ul de desen se
actioneaza unealta din 'ontrol ool$o1 fara a actiona si tasta SHFT. n acest caz, controlul este
similar unui obiect Picture din documentul Word.
Un control adaugat pe stratul text este un obiect Inline)3apes la care se obtine acces programatic
prin colectia Inline)3apes. Un control adaugat pe stratul de desen este un obiect )3ape la care se
ajunge programatic prin colectia )3apes.
Controalele din stratul text sunt tratate precum caracterele si sunt pozitionate n linia de text, se muta o
data cu textul sau cu inserarea de caractere etc.
Controalele din 'ontrol ool$o1 nu pot fi aduse prin dragare n document. La click pe un control,
acesta este inserat la punctul de insertie (pe stratul text) sau ntr-o pozitie bazata pe aceasta (pe startul
de desen). nserarea consecutiva a mai multor obiecte n aceeasi pozitie pe stratul de desen poate sa
produca o stiva din care vedem doar ultimul control plasat, de aici controalele trebuiesc duse n locuri
distincte din document.
n Design Mo!e. controalele ActiveX sunt vizibile doar n viziunile Page La&out sau Online La&out%
Controalele ActiveX din stratul de desen sunt ntotdeauna n Run Mo!e n "i*iunile Page La&out sau
Online La&out%
Daca se intentioneaza ca utilizatorul sa fie capabil sa se mute ntre controalele unui formular online
prin actionarea tastei TAB, controalele se vor plasa pe stratul text si se va proteja forma prin click pe
butonul Protect 5orm de pe bara de unelte 5orms.
Daca, la crearea unui formular online, se doreste adaugarea de cmpuri de formular n locul
controalelor ActiveX, se va utiliza bara de unelte 5orms.
'ontroale Acti"eH Dn foi !e calcul E1cel
Se pot adauga controale, la caiete sau foi de calcul, lnga datele pe care le controleaza, astfel nct operarea
n foaia de calcul sa se efectueze ct mai cursiv si mai pe nteles.
Urmatoarele afirmatii puncteaza principalele aspecte ale plasarii controalelor ActiveX pe o foaie de calcul
Excel.
n plus fata de proprietatile standard ale controalelor, se pot utiliza pentru controalele dintr-o foaie
Excel proprietatile: BottomRightCell, LinkedCell, ListFillRange, Placement, PrintObject, TopLeftCell si
ZOrder. La aceste proprietati se ajunge n mod uzual. Urmatorul exemplu arata cum se poate realiza,
prin program, o defilare a ferestrei active pna cnd controlul CommandButton1 ajunge n coltul din
stnga sus:
Set t = Sheet1.CommandButton1.TopLeftCell
With ActiveWindow
.ScrollRow = t.Row
.ScrollColumn = t.Column
116
End With
Anumite metode si proprietati din Microsoft Excel Visual Basic sunt inhibate atunci cnd un control
ActiveX este activat. De exemplu, metoda )ort nu poate fi utilizata cnd un control este activ. n acest
caz se va activa n prealabil un alt element de pe foaie, dupa modelul:
Private Sub CommandButton1_Click
Range("a1").Activate
Range("a1:a10").Sort Key1:=Range("a1")
CommandButton1.Activate
End Sub
Se observa revenirea la activarea butonului de comanda dupa ce s-a efectuat sortarea.
Controalele dintr-un workbook Excel scufundat ntr-un document al altei aplicatii nu vor functiona daca
utilizatorul va utiliza dublu click pentru editarea caietului. Controalele vor functiona daca utilizatorul va
deschide caietul prin right-click si Open din meniul direct.
La salvarea unui workbook Excel 97 n format Microsoft Excel 5.0/95, toata informatia asociata cu
controalele ActiveX se pierde.
Cuvntul cheie Me dintr-o procedura eveniment a unui control ActiveX de pe o foaie de calcul se refera
la foaia de calcul si nu la control.
'ontroale Acti"eH Dn !iapo*iti"e Po4erPoint
Adaugarea controalelor ActiveX la diapozitive PowerPoint pot produce un schimb de informatii cu utilizatorul,
de exemplu personalizari ale prezentarii dupa optiunile privitorului.
Principalele aspecte care trebuie urmarite sunt:
Un control de pe un slide este ntotdeauna n Design Mode, cu exceptia viziunii Slide Show.
Pentru ca un control particular sa apara pe toate diapozitivele, se va plasa pe Slide Master.
Cuvntul cheie Me dintr-o procedura eveniment a unui control dintr-un slide, se refera la slide. Daca
evenimentul este a unui control de pe master, atunci Me se refera la master si nu la slide-ul afisat n
momentul cnd s-a declansat evenimentul.
Scrierea codului eveniment pentru slide-uri este similara scrierii de cod pentru controalele de pe o
forma. Exemplul urmator stabileste culoarea de fundal a diapozitivului pe care se gaseste butonul de
comanda:
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 navigatie. Daca acestea sunt pozitionate din Master, vor fi
disponibile pe toate diapozitivele. De exemplu, adaugnd la Slide Master doua butoane denumite,
respectiv, cmdBack si cmdForward, si scriind procedurile de eveniment urmatoare, demonstratia poate
fi condusa actionnd respectivele butoane.
Private Sub cmdBack_Click ()
Me.Parent.SlideShowWindow.View.Previous
End Sub
Sub cmdForward_Click ()
117
Me.Parent.SlideShowWindow.View.Next
End Sub
Pentru a lucra cu toate controalele ActiveX de pe un slide anume fara a afecta celelalte forme
desenate (-hapes) de pe slide, se poate construi o colectie ShapeRange care contine doar
controalele. Se pot aplica apoi metode si proprietati ntregii colectii sau parcurge, n mod uzual,
colectia pentru a procesa fiecare control n parte. Exemplul urmator aliniaza controalele de pe primul
diapozitiv din prezentarea activa si le aranjeaza vertical.
With ActivePresentation.Slides(1).Shapes
numShapes = Count
f numShapes > 1 Then
numControls = 0
ReDim ctrlArray(1 To numShapes)
For i = 1 To numShapes
f .tem(i).Type = msoOLEControlObject Then
numControls = numControls + 1
ctrlArray(numControls) = .tem(i).Name
End f
Next
f numControls > 1 Then
ReDim Preserve ctrlArray(1 To numControls)
Set ctrlRange = .Range(ctrlArray)
ctrlRange.Distribute msoDistributeVertically, True
ctrlRange.Align msoAlignLefts, True
End f
End f
End With
Lucrul. prin program. cu controale !in !ocumentele aplicatiilor
Accesul programatic la un control se poate obtine prin numele controlului sau prin intermediul colectiei careia i
apartine. Denumirea unui obiect este cea specificata drept valoare a proprietatii (/ame) n fereastra
Properties a controlului.
Urmatoarele exemple prezinta principalele actiuni care implica controale si documente.
Stabilirea titlului (caption) unui control:
CommandButton1.Caption = "Run"
Daca numele controlului se utilizeaza n afara modulului clasa asociat documentului, foii de calcul sau
diapozitivului care contine controlul, atunci numele controlului trebuie calificat cu numele documentului
respectiv:
Sheet1.CommandButton1.Caption = "Run"
Se poate accesa un control ActiveX si prin colectia )3apes, OLEO$(ects sau Inline)3apes, dupa caz.
o Controalele adaugate la stratul de desen al unui document, foaie sau slide sunt continute n
obiectele )3ape si pot fi gestionate programatic prin intermediul colectiei )3apes.
o n Excel, controalele ActiveX sunt continute de asemenea n obiectele OLEO$(ect si pot fi
programate prin colectia OLEO$(ects.
118
o n Word, controalele ActiveX adaugate n stratul text sunt continute n obiectele Inline)3ape si
pot fi controlate prin colectia Inline)3apes.
Pentru accesul prin intermediul colectiilor, se utilizeaza numele obiectului )3ape care contine un control
particular si nu numele din cod al controlului. n Excel si PowerPoint, numele obiectului care contine un control
este numele de cod implicit al controlului (cum ar fi CommandButton1). n Word, numele obiectului (de forma
implicita Control 1) care contine un control nu este legat de numele de cod al controlului. Pentru a schimba
numele de cod al unui control se selecteaza controlul si se schimba valoarea proprietatii (/ame)% Pentru a
schimba numele unui obiect )3ape, OLEO$(ect sau altui obiect care contine un control se va schimba
valoarea proprietatii /ame.
o Adaugarea unui buton de comanda la prima foaie de calcul:
Worksheets(1).OLEObjects.Add "Forms.CommandButton.1" _
Left:=10, Top:=10, Height:=20, Width:=100
o nstructiunea urmatoare stabileste proprietatea Left a controlului:
Worksheets(1).OLEObjects("CommandButton1").Left = 10
o Urmatorul exemplu stabileste titlul obiectului:
Worksheets(1).OLEObjects("CommandButton1").Object.Caption = "Run"
o Adaugarea unei boxe de control la documentul activ, pe stratul text:
ActiveDocument.nlineShapes.AddOLEControl ClassType:="Forms.CheckBox.1"
o Stabilirea unor atribute ale controalelor dintr-un document Word:
ActiveDocument.nlineShapes(1).Width = 200
ActiveDocument.nlineShapes(1).OLEFormat.Object.Value = True
o Adaugarea unui control ComboBox la stratul de desen:
ActiveDocument.Shapes.AddOLEControl ClassType:="Forms.ComboBox.1"
o Fixarea unor proprietati ale unui ComboBox de pe stratul de desen
ActiveDocument.Shapes("Control 1").Left = 100
ActiveDocument.Shapes("Control 1").OLEFormat.Object.Text = "Reed"
o Adaugarea si modificarea unui buton de comanda 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"
119
O$iectele Microsoft E1cel
O$iectul Application
O$iectul 2or:$oo:
Deschiderea unui Workbook
Metoda GetOpenFilename
Crearea/salvarea unui Workbook
Metoda Add (colectia Workbooks)
Metoda SaveAs
Metoda Save
Metoda GetSaveAsFilename
nchiderea unui Workbook
Metoda Close
O$iectul Range
Referinte de tip A1 sau nume de domeniu
Utilizarea indicilor de linii si coloane
Utilizarea proprietatii Offset
Utilizarea proprietatilor CurrentRegion si UsedRegion
Parcurgerea unui domeniu de celule
Utilizarea instructiunii For Each.Next
Utilizarea instructiunii Do.Loop
Utilizarea proprietatii Address
E"enimentele !in E1cel LM
Permiterea si inhibarea evenimentelor
Utilizarea evenimentelor
Evenimentele obiectului Worksheet
Exemplu
Evenimentele obiectului Chart
Exemplu
Evenimentele obiectului Workbook
Exemplu
Evenimentele obiectului Application
Utilizarea modulelor clasa cu evenimente
Visual Basic suporta un set de obiecte care corespund direct elementelor din Microsoft Excel, cele mai multe
identificabile dupa denumirea uzuala din mediul Excel. Astfel, obiectul Workbook reprezinta un caiet, obiectul
Worksheet reprezinta o foaie de calcul iar obiectul Range reprezinta un domeniu de celule dintr-o foaie de
calcul. Fiecare element din Microsoft Excel caiet, foaie, diagrama, celula etc. poate fi reprezentat printr-un
obiect n Visual Basic. Prin scrierea unor proceduri, care controleaza aceste obiecte, se pot automatiza
operatiile efectuate n Excel.
Pentru a vedea modelul de obiecte pentru Microsoft Excel, se va cauta "Microsoft Excel Objects" n Help.
Pentru a vedea fisierele de Help necesare se va urma calea: Visual Basic E!itor N Eelp N 'ontents an!
In!e1 N ('ontents tab) N Microsoft E1cel Visual Basic Reference N )3ortcut to Microsoft E1cel Visual
Basic Reference% Fisierele sunt disponibile daca la instalarea aplicatiei s-a marcat boxa Online Eelp for
Visual Basic%
Dintre cele peste 100 de obiecte care alcatuiesc ierarhia de obiecte Excel, vom prezenta n acest capitol doar
pe cele mai importante. Prezentarea este simplificata si din cauza ca prezentarea obiectelor Word a conturat
problematica modelelor de obiecte Office si a fixat anumite reguli de operare cu aceste obiecte.
120
O$iectul Application
Cele mai multe proprietati ale obiectului Application Excel controleaza atributele de vizualizare ale ferestrei
aplicatiei sau comporatrea globala a aplicatiei. De exemplu, valoarea proprietatii Displa&5ormulaBar este
True daca bara de formule este vizibila, iar valoarea proprietatii )creen9p!ating este False daca actualizarea
ecranului este inhibata.
n plus, proprietatile obiectului Application ofera acces la obiectele situate mai jos n ierarhie de obiecte
(constituie ceea ce s-a numit accesori). Astfel, proprietatea 2in!o4s da acces la colectia 2in!o4s
(reprezentnd toate ferestrele deschise n aplicatie), proprietatea 2or:$oo:s da colectia 2or:$oo:s a tutror
caietelor deschise etc. Din aceasta categorie enumeram:
o '3arts, colectia tuturor foilor de tip chart,
o Dialogs, colectia tuturor dialogurilor predefinite n mediul Excel,
o /ames, colectia tutror numelor create n caietul activ,
o Recent5iles, colectia fisierelor utilizate recent (dupa lista din meniul File),
o )3eets, colectia tutror foilor deschise n caietul activ,
o 2in!o4s,
o 2or:$oo:s,
o 2or:s3eets, colectia tuturor foilor de calcul din caietul activ.
Returnarea unui obiect particular din colectie se efectueaza dupa procedurile generale, explicate n capitolele
introductive.
n categoria accesorilor mai pot fi ncadrate proprietatile care returneaza un obiect Range: Acti"e'ell, 'ells,
Ro4s, 'olumns, )election (daca este selectat un domeniu de celule).
Proprietatile Acti"e2or:$oo:. Acti"e)3eet. Acti"e'3art si Acti"e2in!o4 returneaza obiectele care
reprezinta elementele active corespunzatoare din Excel.
Anumite metode si proprietati care se aplica obiectului Application se aplica si unor obiecte situate mai jos n
ierarhie. Utilizarea acestor proprietati si metode la nivelul Application vor modifica toate caietele, foile
deschise. De exemplu, metoda 'alculate aplicata la nivelul Application produce recalcularea tuturor foilor,
din toate caietele, pe cnd utilizata la nivel de 2or:$oo: sau de 2or:s3eet produce recalcularea doar a
foilor locale.
O$iectul 2or:$oo:
Dupa cum se stie, similarul unui document din Word este n Excel caietul (workbook). Deschiderea sau
nchiderea unui fisier n Excel implica deci deschiderea sau nchiderea unui caiet. n Visual Basic, metodele
utilizate la lucrul cu fisiere sunt metode ale obiectului 2or:$oo: sau ale colectiei 2or:$oo:s.
Desc3i!erea unui 2or:$oo:
Pentru a deschide un caiet se utilizeaza metoda Open. Metoda este aplicata ntotdeauna colectiei
2or:$oo:s, returnata prin proprietatea globala cu aceeasi denumire. Exemplul urmator deschide caietul
"Book1.xls" din folderul curent si afiseaza apoi valoarea din prima celula a primei foi:
Sub OpenBook1()
Set myBook = Workbooks.Open(Filename:="Book1.xls")
MsgBox myBook.Worksheets(1).Range("A1").Value
End Sub
121
Este de remarcat ca obiectul 2or:$oo: returnat de metoda se refera la caietul deschis, care ramne activ.
Asupra utilizarii utilizarii sau nu a caii pe care se gaseste fisierul se vor reciti cele spuse la deschiderea
documentelor Word.
Exista doua foldere remarcabile pentru care se poate obtine n mod automat calea: folderul cu fisierele Excel
executabile si folderul Library (creat automat la instalarea aplicatiei). Obtinerea acestor cai se realizeaza prin
proprietatile Pat3 si Li$rar&Pat3 ale obiectului Application). Astfel
EXEPath = Application.Path & Application.PathSeparator
LibPath = Application.LibraryPath & Application.PathSeparator
returneaza, respectiv, calea catre fisierele executabile Excel si calea catre fisierele de biblioteca. O cale
returnata se termina cu separatorul adecvat sistemului pe care se executa aplicatia, astfel nct codul este
independent de platforma Windows sau Macintosh). nstructiunile
fName = LibPath & "Book1.xls"
Set myBook = Workbooks.Open(Filename:=fName)
considerate mpreuna cu atribuirea variabilei LibPath de mai sus, realizeaza deschiderea fisierului Book1.xls
din folderul Library.
Se poate lasa utilizatorului optiunea de a decide aupra numelui fisierului care se deschide. Acest lucru se
poate realiza prin metoda GetOpen5ilename a obiectului Application. Metoda afiseaza cutia de dialog
standard Open. dar, n loc sa deschida fisierul selectat, returneaza un sir cu numele complet calificat al
fisierului. Urmatorul exemplu demonstreaza metoda:
Sub DemoGEtOpenFilename()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
MsgBox "Opening " & fName
Set myBook = Workbook.Open (Filename:=fName)
End Sub
Meto!a GetOpen5ilename
Afiseaza dialogul Open si returneaza numele de fisier selectat fara a deschide efectiv fisierul.
expression.GetOpen5ilename(FileFilter, Filterndex, Title, ButtonText, MultiSelect)
unde
expression este o expresie care returneaza un obiect Application.
1ile1ilter este de tip Variant, optional. Este un sir specificnd criteriile de filtrare a fisierelor listate n dialog.
Sirul consta n perechi formate din sirul de filtrare si din specificarea filtrului n format MS-DOS, toate
elementele fiind separate prin virgule. n partea rezervata, doua filtre MS-DOS sunt separate prin ";". Exemple:
"Text Files (*.txt),*.txt,Add-n Files (*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se
considera "All Files (*.*),*.*".
1ilter(ndex este de tip Variant, optional. Specifica indexul criteriului de filtrare implicit. de la 1 la numarul de
filtre specificat n 1ile1ilter. mplicit se considera 1.
122
/itle este de tip Variant, optional. Specifica titlul boxei de dialog. mplicit este "Open".
ButtonText este specific pentru Macintosh.
5ulti-elect este de tip Variant, optional. Este True atunci cnd se pot selecta mai multe nume de fisiere, False
daca este permisa selectarea unui singur fisier. mplicit este False. n cazul selectiei multiple se va returna un
tablou de denumiri (chiar daca este selectat un singur fisier).
Metoda returneaza numele fisierului selectat sau numele introdus de utilizator. n cazul cnd utilizatorul
anuleaza boxa (prin 'ancel), se returneaza False. Metoda poate schimba att folderul curent ct si unitatea.
'rearea si sal"area unui 2or:$oo:
Se creeaza un nou caiet prin aplicarea metodei A!! la colectia 2or:$oo:s. Valoarea returnata se va atribui
(prin Set) unei variabile obiect pentru a putea referi noul caiet n program. Noul workbook devine activ.
Meto!a A!! (colectia 2or:$oo:s)
Returneaza un obiect 2or:$oo:. Sintaxa
expression.Add(Template)
unde
expression este o expresie care returneaza un obiect 2or:$oo:s. (Metoda se poate aplica, cu parametri
specifici, tuturor colectiilor.)
/emplate este de tip Variant, optional. Determina modul de creare a noului caiet. Daca argumentul este un sir
cu numele (posibil cu cale) unui fisier Excel, noul caiet este deschis dupa modelul fisierului specificat.
Argumentul poate fi o constanta (de tipul enumerat XlWBATemplate), caz n care se va crea un caiet cu o
singura foaie de tipul determinat de constanta. Valorile posibile sunt: xlWBATChart,
xlWBATExcel4ntlMacroSheet, xlWBATExcel4MacroSheet sau xlWBATWorksheet. Daca argumentul este
omis, atunci se creeaza un caiet cu un numar de foi egal cu proprietatea )3eetsIn/e42or:$oo: a obiectului
Application).
Salvarea unui caiet se efectueaza prin metoda )a"eAs (la prima salvare) sau prin metoda )a"e. Exista,
similar metodei GetOpen5ilename, metoda Get)a"eAs5ilename (pentru Application).
Meto!a )a"eAs
are sintaxa
expression.)a"eAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended,
CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout)
unde
expression returneaza un obiect 2or:$oo:.
1ilename, optional, Variant. Contine numele noului fisier, poate include o cale.
1ile1ormat, optional, Variant. Specifica formatul de fisier utilizat la salvare. Lista formatelor admise (cele care
se pot selecta si la salvarea din Excel) se gaseste n Help la proprietatea 5ile5ormat.
123
&assord, optional, Variant. Un sir unde capitalizarea este considerata (cel mult 15 caractere) care contine
parola de protejare a fissierului.
+rite*es&assord, optional, Variant. Un sir care contine parola necesara pentru scrierea fisierului. Daca la
deschidere nu se da parola exacta, fisierul este deschis doar n citire.
*ead)nly*ecommended, optional, Variant. Este True pentru a afisa, la deschidere, un mesaj cu
recomandarea de a deschide fisierul doar n citire.
CreateBackup, optional, Variant. Este True daca se creeaza o copie backup.
!ccess5ode, optional, Variant. Contine modul de acces la workbook. Poate fi una dintre constantele (din tipul
XlSaveAsAccessMode): xlShared (shared list), xlExclusive (exclusive mode) sau xlNoChange (nu se modifica
modul de acces). Ultima valoare este cea implicita. Argumentul este ignorat daca se salveaza xlShared fara a
schimba numele fisierului. Pentru schimbarea modului de acces se utilizeaza metoda E1clusi"eAccess.
0onflict*esolution, optional, Variant. Specifica modul de rezolvare a conflictelor de schimbare n cazul cnd
fisierul este shared. Poate fi una dintre constantele (de tip XlSaveConflictResolution): xl4ser*esolution
(afiseaza un dialog privind conflictul si rezolvarea)), xlLocalSessionChanges (accepta automat modificarile
locale) sau xlOtherSessionChanges (accepta celelalte schimbari n locul modificarilor locale). Prima constanta
este valoarea implicita.
!dd/o5ru, optional, Variant. Este True daca se adauga numele fisierului la lista fisierelor utilizate recent.
mplicit este False.
/ext0ode&age, /ext8isual.ayout, optionale, Variant. Neutilizate n versiunea U.S. English.
Meto!a )a"e
Salveaza modificarile caietului specificat.
expression.)a"e
unde
expression returneaza un obiect Workbook.
Pentru marcarea unui fisier drept salvat fara a-l scrie efectiv pe disc, se va atribui valoarea True proprietatii
)a"e!.
Meto!a Get)a"eAs5ilename
Similar metodei GetOpen5ilename, aceasta metoda afiseaza dialogul standard )a"e As, returneaza un
nume de fisier, dar nu salveaza nici un fisier.
expression.Get)a"eAs5ilename(nitialFilename, FileFilter, Filterndex, Title, ButtonText)
unde
expression este o expresie care returneaza un obiect Application.
(nitial1ilename, optional, Variant. Specifica numele de fisier propus. Daca acest nume este omis, atunci se va
utiliza numele caietului activ.
124
1ile1ilter, optional, Variant. Sirul care specifica criteriul de filtrare. Pentru structura sirului se va revedea
metoda GetOpen5ilename de la deschiderea documentelor.
1ilter(ndex, optional, Variant. Este indicele criteriului de filtrare, de la 1 la numarul de filtre dat la FileFilter.
mplicit este 1.
/itle, optional, Variant. Titlul boxei de dialog.
'utton/ext este specific Macintosh.
Metoda returneaza numele de fisier selectat sau cel introdus de utilizator. Numele returnat poate include si
calea. Metoda returneaza False daca dialogul este nchis de utilizator prin Cancel. Metoda poate schimba
folderul sau unitatea curenta.
Urmatorul exemplu creaza un nou caiet si-l salveaza prin metoda Get)a"eAs5ilename:
Sub CreateAndSave()
Set newBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
newBook.SaveAs Filename:=fName
End Sub
?nc3i!erea unui 2or:$oo:
Pentru a nchide un workbook, se va aplica metoda 'lose a obiectului 2or:$oo:. nchiderea poate avea loc
cu sau fara salvarea modificarilor.
Meto!a 'lose
Produce nchiderea obiectului. Aplicata colectiei Workbooks are sintaxa
expression.'lose
unde
expression returneaza un obiect 2or:$oo:s. Daca exista modificari ale caietelor, se va afisa dialogul de
interogare asupra eventualei salvari.
Aplicata obiectelor 2in!o4 si 2or:$oo: metoda are sintaxa
expression.'lose(SaveChanges, FileName, RouteWorkbook)
unde
expression este o expresie care returneaza un obiect 2or:$oo: sau 2in!o4.
-ave0hanges este optional, Variant. Daca nu exista modificari, argumentul este ignorat. Daca exista
modificari n caiet dar caietul mai apare si n alta fereastra deschisa, atunci argumentul este de asemenea
ignorat. Daca exista modificari si caietul nu mai apare n alta fereastra, atunci salvarea se efectueaza dupa
valorile: True salvarea modificarilor sub numele dat la FileName sau dialog Save As; False nu se salveaza
modificarile; argument omis interogare utilizator.
125
1ileName este optional, Variant. Salveaza modificarile sub acest nume.
*oute+orkbook este optional, Variant. Daca nu este indicata nici o rutare (nu exista nici un Routing)lip
atasat), argumentul este ignorat. Altfel, Excel efectueazarutarea documentului dupa valorile acestui argument:
True trimite caietul la urmatorul recipient; False caietul nu este transmis mai departe; omis interogarea
utilizatorului asupra trimiterii.
nchiderea unui workbook din Visual Basic nu executa macrourile Auto_'lose din workbook. Se va utiliza
metoda RunAutoMacros pentru executarea macrourilor automate de nchidere. Aceste macrouri sunt
mentinute n Excel din motive de compatibilitate, deci se refera la foi automatizate n versiuni Excel mai vechi.
Exemplul urmator arata deschiderea unui caiet, modificari temporare ale caietului si nchiderea fara salvarea
modificarilor:
Sub OpenChangeClose()
Do
fName = Application.GetOpenFilename
Loop Until fName <> False
Set myBook = Workbooks.Open (Filename:=fName)
' Aici se modifica foile de calcul
myBook.Close SaveChanges:=False
End Sub
O$iectul Range
Prin intermediul unui obiect Range se poate referi o singura celula, un domeniu de celule, o ntreaga linie sau
coloana, o selectie cu arii multiple sau un domeniu 3-D. Din acest motiv obiectul Range este oarecum neuzual
prin aceea ca poate reprezenta att o singura celula ct si o multime de celule. Nu exista un obiect colectie
pentru Range, asa ca un obiect Range poate fi gndit fie ca un obiect, fie ca o colectie, dupa situatie.
Exista foarte multe proprietati si metode care returneaza 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 exacta a acestor proprietati si metode se vor cauta subiectele respective n Help.
n continuare sunt mentionate, mai mult prin exemple, moduri de lucru cu obiecte Range.
126
Referinte !e tip AK sau nume !e !omeniu
Unul dintre modurile uzuale de returnare a unui obiect Range este acela al utilizarii unei referinte de tip A1 sau
al unui nume definit.
inserarea unei valori ntr-o celula:
Worksheets("Sheet1").Range("A1").Value = 3
inserarea unei formule ntr-o celula:
Range("B1").Formula = "=510*RAND()"
inserarea aceleeasi valori ntr-un ntreg domeniu de celule:
Range("C1:E3").Value = 6
stergerea continutului unor celule:
Range("A1","E3").ClearContents
Stabilirea stilului bold pentru un domeniu numit (la nivel de workbook):
Range("myRange").Font.Bold = True
Atribuirea aceleeasi valori fiecarei 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 mentionat ca expresiile care nu sunt calificate se refera la foaia curenta, deci multe din exemplele de
mai sus nu ar opera daca foaia curenta este o foaie de tip chart.
O cauza frecventa de erori este utilizarea proprietatii Range ca argument al altei metode fara calificarea
completa a obiectului 2or:s3eet caruia i se aplica Range. Exemplul urmator
Sub SortRange()
Worksheets("Sheet1").Range("A1:B10").Sort _
Key1:=Range("A1"), Order1:=xlDescending
End Sub
nu va functiona corect dect daca Sheet1 este foaia activa, altminteri calificarea argumentului Key1 nu este
completa. Pentru o executie independenta de context ar trebui folosit
Key1:=Worksheets("Sheet1").Range("A1")
9tili*area in!icilor !e linii si coloane
O celula specifica poate fi returnata utiliznd indicii numerici de linie si coloana pentru celula referita.
127
Pentru a da o valoare celulei A1 se poate utiliza:
Worksheets("Sheet1").Cells(1,1).Value = 3
Pentru a insera o formula n celula B1 din foaia activa:
Cells(1,2).Formula = "=510*RAND()"
Pentru a fixa o variabila obiect la domeniul format din celula A1
Set objRange = Worksheets("Sheet1").Cells(1,1)
Referintele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instructiuni de ciclare.
Exemplul urmator anuleaza toate celulele din domeniul A1:D10, cu o valoare mai mica dect 0.01:
Sub RoundToZero()
For rwndex = 1 to 10
For colndex = 1 to 4
f Worksheets("Sheet1").Cells(rwndex,colndex) < 0.01 Then
Worksheets("Sheet1").Cells(rwndex,colndex).Value = 0
End f
Next colndez
Next rwndex
End Sub
n exemplul urmator se arata o solutie la listarea, ntr-o foaie separata, a tuturor denumirilor create n caietul
activ si a domeniilor referite de acestea.
Sub ListNames()
Set newSheet = Worksheets.Add
= 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
9tili*area proprietatii Offset
Atunci cnd este necesara referirea la un domeniu prin deplasari relative la alt domeniu de celule, se poate
utiliza proprietatea Offset, a obiectului Range, care n argumentele *o)ffset si 0olumn)ffset arata
deplasarea fata de obiectul Range curent. Este returnat un nou obiect Range.
Exemplul urmator determina cteva tipuri de date din celulele domeniului A1:A10, tipurile determinate fiind
nscrise, ca text, n celula corespunzatoare din dreapta, B1:B10.
Sub ScanColumn ()
For Each c n Worksheets("Sheet1").Range("A1:A10").Cells
f Application.sText(c.Value) Then
c.Offset(0,1).Value = "Text"
Elsef Application.sNumber (c.Value) Then
c.Offset(0,1).Value = "Number"
Elsef Application.sLogical (c.Value) Then
128
c.Offset(0,1).Value = "Boolean"
Elsef Application.sError (c.Value) Then
c.Offset(0,1).Value = "Error"
Elsef c.Value = "" Then
c.Offset(0,1).Value = "(blank cell)"
End f
Next c
End Sub
9tili*area proprietatilor 'urrentRegion si 9se!Range
Aceste doua proprietati, explicate n continuare, sunt utile atunci cnd nu se stie de la nceput ct de mare
este domeniul pe care se opereaza.
Prin regiunea curenta se ntelege un domeniu dreptunghiular de celule, limitat de linii si coloane goale,
eventual de marginile foii de calcul si de linii si coloane goale. Proprietatea 'urrentRegion se aplica unui
obiect Range si pot fi mai multe regiuni curente pe o foaie de calcul, dupa obiectul Range caruia i se aplica
proprietatea. Proprietatea returneaza un obiect Range, reflectnd extensia, n sensul prezentat mai sus, al
obiectului Range caruia i se aplica proprietatea.
Domeniul utili*at este determinat de celule nevide situate cel mai la stnga sus si cel mai la dreapta jos ntr-o
foaie de calcul. Un asemenea domeniu contine toate celule nevide din foaie, ca si celule vide interpuse pna
la completarea unui domeniu dreptunghiular si este unic pe o foaie de calcul. Este natural ca proprietatea
9se!Range sa se aplice obiectului 2or:s3eet si nu unui obiect Range. Proprietatea returneaza un obiect
Range.
Urmatorul exemplu aplica celulelor cu valori numerice dintr-o lista, 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 urmeaza presupune ca foaia activa contine date dintr-un experiment desfasurat n timp: prima
coloana contine datele calendaristice, a doua coloana contine ora nregistrarii valorilor, coloanele a treia si a
patra contin masuratorile experimentului. Procedura prezentata combina primele doua coloane ntr-o singura
valoare de tip Date, converteste valoarea obtinuta din GMT (Greenwich Mean Time) n PST (Pacific Standard
Time) si le formateaza. Deoarece nu se stie daca exista si coloane goale ntre cele patru coloane cu date, se
utilizeaza 9se!Range.
Sub ConvertDates ()
Set myRange = ActiveSheet.UsedRange
myRange.Columns("C").nsert
Set dateCol = myRange.Columns("C")
For Each c n dateCol.Cells
f c.Offset(0,-1).Value <>"" Then
c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)"
End f
Next c
dateCol.NumberFormat = "mmm-dd-yyyy hh:mm"
dateCol.Copy
dateCol.PasteSpecial Paste:=xlValues
myRange.Columns("A:B").Delete
129
dateCol.AutoFit
End Sub
Exista si alte proprietati si metode care produc fie subdomenii, fie supradomenii pornind de la un obiect
Range. Printre acestea enumeram: Areas. 'ells. 'olumns. Entire'olumn. EntireRo4. Range si Ro4s.
Parcurgerea unui !omeniu !e celule
Dintre multiplele moduri de parcurgere a celulelor dintr-un domeniu, se prezinta parcurgerile prin instructiunile
5or Eac3 ; /e1t si Do ; Loop, unele fiind deja utilizate n exemplele anterioare.
9tili*area instructiunii 5or Eac3 ; /e1t
Acesta este modul recomandat de parcurgere a elementelor unei colectii.
Un exemplu anterior devine
Sub RoundToZero ()
For Each r n Worksheets(Sheets1").Range("A1:D10").Cells
f Abs(r.Value) < 0.01 Then
r.Value = 0
End f
Next r
End Sub
Pentru ca operatiunea anterioara sa aiba loc pe un domeniu selectat de utilizator, se poate utiliza metoda
InputBo1, specificndu-i utilizatorului sa selecteze un domeniu de celule. Metoda returneaza un obiect Range
care reprezinta selectia. Codul este completat cu instructiuni de tratare a erorilor uzuale.
Sub RoundToZero ()
Worksheets("Sheet1").Activate
On Error GoTo PressedCancel
Set r = Application.nputBox( _
Prompt:="Select a range of cells", _
Type:=8)
On Error GoTo 0
For Each c n r.Cells
f Abs(c.Value) < 0.01 Then
c.Value = 0
End f
Next c
Exit Sub
PressedCancel:
Resume
End Sub
Daca nu se doreste selectarea de catre utilizator a domeniului procesat, se poate utiliza proprietatea
'urrentRegion sau proprietatea 9se!Region pentru a returna obiectul Range prelucrat. De exemplu, daca
se stie ca domeniul ncepe cu celula A1 si nu include linii sau coloane vide, atunci se poate utiliza
Set r = Worksheets("Sheet1").Range("A1").CurrentRegion
pentru a returna ntregul domeniu (compact) de celule care se prelucreaza.
130
Urmatoarele doua exemple arata cum se poate ascunde fiecare a doua coloana din domeniul utilizat n
Sheet1. Primul exemplu, utiliznd For Each.Next
Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For Each col n r.Columns
f col.Column Mod 2 = 0 Then
col.Hidden = True
End f
Next col
End Sub
Al doilea exemplu, utiliznd For.Next:
Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
For i = 1 To r.Columns.Count
f i Mod 2 = 0 Then
r.Columns(i).Hidden = True
End f
Next i
End Sub
9tili*area instructiunii Do;Loop
Atunci cnd procesarea unui domeniu modifica domeniul (de exemplu prin stergerea unor linii/coloane),
utilizarea instructiunii For Each.Next nu produce cele mai bune rezultate. Solutia este atunci utilizarea
instructiunii Do.Loop. Exemplul urmator sorteaza o lista si elimina liniile elementelor duplicate:
Sub RemoveDuplicates ()
Worksheets("Sheet1").Range("A1").Sort _
Key1:=Worksheets("Sheet1").Range("A1")
Set currentCell = Worksheets("Sheet1").Range("A1")
Do While Not sEmpty(currentCell)
Set nextCell = currentCell.Offset(1,0)
f nextCell.Value = currentCell.Value Then
currentCell.EntireRow.Delete
End f
Set currentCell = nextCell
Loop
End Sub
Este de notat ca structura repetitiva poate fi nlocuita prin
Do While currentCell.Value <> ""
' instructiunile de eliminare a liniilor cheilor duplicate
Loop
9tili*area proprietatii A!!ress
Aplicarea proprietatii Address returneaza adresa de celule a domeniului, adresa fiind sub forma de sir de
caractere. Aceasta utilizare este utila, n general, pentru verificare si depanarea codului. Exemplul urmator
arata o forma de completare a unei proceduri anterioare cu instructiuni de control a mersului programului
131
Sub HideColumns ()
Set r = Worksheets("Sheet1").UsedRange
MsgBox r.Address ' doar pentru depanare
For i = 1 To r.Columns.Count
f i Mod 2 = 0 Then
r.Columns(i).Hidden = True
MsgBox r.Columns(i).Address ' doar pentru depanare
End f
Next i
End Sub
Acelasi efect se poate obtine prin stabilirea unor expresii de urmarire (watch expressions) de forma r.!ddress
si r.0olumns"i#.!ddress, valorile respective pot fi examinate n fereastra Imme!iate. Pentru o discutie mai pe
larg se va studia capitolul dedicat depanarii si manevrarii erorilor.
E"enimentele !in E1cel LM
O buna parte din codul scris ntr-o aplicatie este continut n proceduri de raspuns la evenimente. Cunoasterea
evenimentelor si alegerea unor raspunsuri adecvate produc o aplicatie senzitiva, vie, care interactioneaza bine
cu utilizatorul.
n Microsoft Excel 97 se pot scrie proceduri eveniment la nivelurile: worksheet, chart, workbook si application.
n plus fata de versiuni anterioare, sunt posibile si proceduri eveniment cu argumente.
Procedurile de raspuns la evenimente la nivelurile Worksheet si Workbook sunt create n mod implicit pentru
orice foaie de calcul, foaie de diagrama sau caiet. Pentru a scrie proceduri de raspuns la evenimentele de la
nivelul Chart sau pentru Application, trebuie sa se creeze un nou obiect utiliznd cuvntul cheie 2it3E"ents
ntr-un modul clasa. (vezi discutia din sectiunea dedicata subiectului n acest capitol).
Permiterea si in3i$area e"enimentelor
n mod uzual, toate evenimentele sunt permise. Cu alte cuvinte evenimentele au loc, sunt recunoscute ca
atare si se executa procedurile corespunzatoare fiecarui eveniment.
n cazul cnd nu se doreste executarea procedurii de raspuns, acest lucru este controlat prin inhibarea
evenimentului, cu efectul nerecunoasterii evenimentului de catre sistem si, drept urmare, neexecutarea
procedurii asociate.
Proprietatea EnableEvents, a obiectului Application, poate primi valoarea True sau False dupa cum
evenimentele sunt permise sau inhibate.
Urmatorul exemplu executa salvarea caietului fara producerea evenimentului BeforeSave:
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True
9tili*area e"enimentelor
Completarea procedurilor implicite de raspuns la evenimente se efectueaza prin accesul la codul procedurilor
si scrierea de cod n mod uzual.
Pentru a vedea procedurile de eveniment ale unei foi (de calcul sau diagrama):
132
o click dreapta pe cotorul foii (pe bara de jos, unde se vad cotoarele tuturor foilor din caietul
activ), comanda Vie4 'o!e din meniul contextual, alegerea numelui evenimentului n lista
derulanta Proce!ure, sau
o meniul ools, comanda Macro si selectarea optiunii Visual Basic E!itor. Se selecteaza foaia
dorita n Project Explorer, butonul Vie4 'o!e si se alege numele evenimentului din lista
Proce!ure.
E"enimentele o$iectului 2or:s3eet
E"eniment Descriere
Acti"ate Apare atunci cnd utilizatorul activeaza
foaia. Acest eveniment se va utiliza n locul
proprietatii On)3eetActi"ate
BeforeDou$le'lic: Apare atunci cnd utilizatorul executa un
dublu click ntr-o celula a foii. Se va utiliza
n locul proprietatii OnDou$le'lic:.
BeforeRig3t'lic: Apare atunci cnd utilizatorul executa un
click dreapta ntr-o celula a foii.
'alculate Apare cnd utilizatorul recalculeaza foaia.
Acest eveniment se va utiliza n locul
proprietatii On'alculate.
'3ange Apare atunci cnd utilizatorul schimba o
formula dintr-o celula. Se va utiliza n locul
proprietatii OnEntr&.
Deacti"ate Apare atunci cnd foaia este activa si
utilizatorul activeaza o alta foaie. Nu apare
atunci cnd utilizatorul muta focusul de la o
fereastra la alta fereastra a aceleeasi foi.
Acest eveniment se va utiliza n locul
proprietatii On)3eetDeacti"ate.
)election'3ange Apare atunci cnd utilizatorul selecteaza o
celula din foaie.
O prezentare completa si exemple se gasesc n intrarile respective din Help.
E1emplu
n codul care urmeaza, se reajusteaza dimensiunea coloanelor la fiecare recalculare:
Private Sub Worksheet_Calculate ()
Columns("A:F").AutoFit
End Sub
Este de remarcat ca modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea
evenimentelor".
133
E"enimentele o$iectului '3art
Declansate atunci cnd utilizatorul activeaza sau modifica o diagrama, evenimentele recunoscute de obiectul
Chart sunt prezentate n tabelul urmator.
E"eniment Descriere
Acti"ate Apare atunci cnd utilizatorul activeaza foaia
diagrama (nu apare la diagramele scufundate).
Acest eveniment se va utiliza n locul proprietatii
On)3eetActi"ate
BeforeDou$le'lic: Apare atunci cnd utilizatorul executa un dublu
click pe diagrama. Se va utiliza n locul proprietatii
OnDou$le'lic:.
BeforeRig3t'lic: Apare atunci cnd utilizatorul executa un click
dreapta pe diagrama.
'alculate Apare cnd utilizatorul reprezinta n diagrama
date noi sau modificate.
Deacti"ate Apare atunci cnd foaia este activa si utilizatorul
activeaza o alta foaie. Nu apare atunci cnd
utilizatorul muta focusul de la o fereastra la alta
fereastra a aceleeasi foi. Acest eveniment se va
utiliza n locul proprietatii On)3eetDeacti"ate.
DragO"er Apare atunci cnd utilizatorul dragheaza date
peste diagrama.
DragPlot Apare atunci cnd utilizatorul dragheaza un
domeniu de celule peste diagrama.
MouseDo4n Apare atunci cnd utilizatorul executa un click cu
un buton al mouse-ului n timp ce pointerul
acestuia este pozitionat pe diagrama.
MouseMo"e Apare la miscarea pointerului mouse-ului peste
diagrama.
Mouse9p Apare atunci cnd utilizatorul elibereaza un buton
al mouse-ului n timp ce pointerul acestuia este
pozitionat pe diagrama.
Resi*e Apare la redimensionarea diagramei.
)elect Apare la selectarea unui element al diagramei.
)eries'3anges Apare atunci cnd utilizatorul modifica valoarea
unei punct de pe diagrama.
134
Evenimentele foilor de diagrame sunt permise n mod implicit. Pentru a scrie proceduri de eveniment pentru
diagramele scufundate, trebuie sa se creeze un nou obiect utiliznd 2it3E"ents ntr-un modul de clasa.
E1emplu
Se schimba culoarea chenarului unui punct atunci cnd utilizatorul schimba valoarea punctului:
Private Sub Chart_SeriesChange (ByVal Seriesndex As Long, _
ByVal Pointndex As Long)
Set p = ActiveChart.SeriesCollection(Seriesndex).Points(Pointndex)
p.Border.Colorndex = 3
End Sub
E"enimentele o$iectului 2or:$oo:
Aceste evenimente se declanseaza atunci cnd utilizatorul schimba un caiet sau orice foaie din caietul
respectiv.
E"eniment Descriere
Acti"ate Apare atunci cnd utilizatorul activeaza
caietul.
A!!InInstall Apare atunci cnd utilizatorul instaleaza
caietul ca un add-in. Se va utiliza n locul
macro-ului Auto_Add.
A!!In9ninstall Apare atunci cnd utilizatorul dezinstaleaza
caietul ca un add-in. Se va utiliza n locul
macro-ului Auto_Remove.
Before'lose Apare naintea nchiderii caietului. Se va
utiliza n locul macro-ului Auto_Close.
BeforePrint Apare naintea tiparirii caietului.
Before)a"e Apare nainte ca utilizatorul sa salveze foaia.
Acest eveniment se va utiliza n locul
proprietatii On)a"e.
Deacti"ate Apare atunci cnd caietul este activ si
utilizatorul activeaza un alt caiet.
/e4)3eet Apare dupa ce utilizatorul creeaza o noua
foaie.
Open Apare la deschiderea caietului. Evenimentul
se va utiliza n locul macroului Auto_Open.
)3eetActi"ate Apare la activarea unei foi din caiet. Se va
utiliza n locul proprietatii On)3eetActi"ate.
)3eetBeforeDou$le'lic: Apare la dublu click pe o celula (nu este
135
utilizat cu foile diagrama). Se va utiliza n
locul proprietatii OnDou$le'lic:.
)3eetBeforeRig3t'lic: Apare la click dreapta pe o celula a unei foi
din caiet (nu este utilizat cu foile diagrama).
)3eet'alculate Apare la recalcularea unei foi (nu este
utilizata cu foile diagrama). Se utilizeaza n
locul proprietatii On'alculate.
)3eet'3ange Apare la modificarea formulei dintr-o celula
(nu este utilizata cu foile diagrama). Se
utilizeaza n locul proprietatii OnEntr&.
)3eetDeacti"ate Apare la activarea altei foi din caiet. Se
utilizeaza n locul proprietatii
On)3eetDeacti"ate.
)3eet)election'3ange Apare la modificarea selectiei dintr-o foaie de
calcul (nu functioneaza cu foile diagrama).
2in!o4Acti"ate Apare atunci cnd utilizatorul muta focusul pe
orice fereastra a caietului. Se utilizeaza n
locul proprietatii On2in!o4.
2in!o4Deacti"ate Apare atunci cnd utilizatorul muta focusul n
afara oricarei fereastre a caietului. Se
utilizeaza n locul proprietatii On2in!o4.
2in!o4Resi*e Apare atunci cnd utilizatorul deschide,
redimensioneaza, maximizeaza sau
minimizeaza orice fereastra a caietului.
Pentru explicatii se vor studia intrarile corespunzatoare din Help.
E1emplu
Deschiderea caietului maximizeaza fereastra aplicatiei Excel:
Sub Workbook_Open ()
Application.WindowState = xlMaximized
End Sub
E"enimentele o$iectului Application
Aceste evenimente se declanseaza la crearea/deschiderea unui caiet sau atunci cnd este modificata orice
foaie din orice caiet deschis.
E"eniment
(pentru Application)
Descriere
136
/e42or:$oo: Apare la crearea unui nou caiet.
)3eetActi"ate Apare atunci cnd utilizatorul activeaza o foaie
dintr-un caiet deschis. Se va utiliza n locul
proprietatii On)3eetActi"ate.
)3eetBeforeDou$le'lic: Apare la dublu click pe o celula dintr-un caiet
deschis (nu este utilizat cu foile diagrama). Se
va utiliza n locul proprietatii OnDou$le'lic:.
)3eetBeforeRig3t'lic: Apare la click dreapta pe o celula a unei foi
dintr-un caiet deschis (nu este utilizat cu foile
diagrama).
)3eet'alculate Apare la recalcularea unei foi (nu este utilizata
cu foile diagrama). Se utilizeaza n locul
proprietatii On'alculate.
)3eet'3ange Apare la modificarea formulei dintr-o celula (nu
este utilizata cu foile diagrama). Se utilizeaza
n locul proprietatii OnEntr&.
)3eetDeacti"ate Apare la activarea altei foi dintr-un caiet. Se
utilizeaza n locul proprietatii
On)3eetDeacti"ate.
)3eet)election'3ange Apare la modificarea selectiei dintr-o foaie de
calcul (nu functioneaza cu foile diagrama).
2in!o4Acti"ate Apare atunci cnd utilizatorul muta focusul pe
orice fereastra deschisa n aplicatie. Se
utilizeaza n locul proprietatii On2in!o4.
2in!o4Deacti"ate Apare atunci cnd utilizatorul muta focusul n
afara oricarei fereastre a aplicatiei. Se
utilizeaza n locul proprietatii On2in!o4.
2in!o4Resi*e Apare atunci cnd utilizatorul
redimensioneaza, maximizeaza sau
minimizeaza orice fereastra deschisa n
aplicatie.
2or:$oo:Acti"ate Apare atunci cnd se muta focusul pe un caiet
deschis
2or:$oo:A!!InInstall Apare la instalarea unui workbook ca un add-
in.
2or:$oo:A!!In9ninstall Apare la dezinstalarea unui workbook ca un
add-in.
2or:$oo:Before'lose Apare nainte ca un caiet deschis sa fie nchis.
137
2or:$oo:BeforePrint Apare nainte ca un caiet deschis sa fie tiparit.
2or:$oo:Before)a"e Apare nainte ca un caiet deschis sa fie salvat.
2or:$oo:Deacti"ate Apare atunci cnd utilizatorul muta focusul n
afara unui caiet deschis.
2or:$oo:/e4)3eet Apare la adaugarea unei noi foi la un caiet
deschis.
2or:$oo:Open Apare atunci cnd utilizatorul deschide un
caiet.
9tili*area mo!ulelor clasa cu e"enimente
Deoarece diagramele scufundate ntr-o foaie de calcul si obiectul Application nu au evenimente permise n
mod implicit, trebuie sa se urmeze urmatoarele etape pentru a utiliza evenimentele recunoscute de aceste
obiecte.
Se creeaza un modul de tip clasa si se declara un obiect de tip '3art sau Application cu evenimente.
Pentru crearea modulului clasa se da comanda 'lass Mo!ule din meniul Insert.
Pentru permiterea evenimentelor obiectului Application se adauga declaratia
Public WithEvents App As Application
Obiectul nou creat apare n boxa O$(ect din modulul clasa si se pot scrie procedurile evenimentelor
pentru noul obiect.
Se conecteaza obiectul declarat n modul la obiectul Application. Pentru aceasta operatiune, n orice
modul se da instructiunea
Public X As New EventClass
unde EventClass este numele dat, de exemplu, modulului clasa creat, similar pentru X.
dupa crearea instantei X a obiectului EventClass se poate stabili obiectul App al clasei EventClass egal
cu obiectul Application Microsoft Excel.
Sub nitializeApp ()
Set X.App = Application
End Sub
Dupa executarea procedurii de initializare, obiectul App din modulul EventClass puncteaza catre
obiectul Application Microsoft Excel si procedurile eveniment din modulul clasa vor fi executate la
declansarea evenimentelor.
Desi procedura poate parea laborioasa, ideea poate fi utilizata pentru ca aceleasi proceduri eveniment sa fie
asociate mai multor obiecte.
Sa presupunem ca am efectuat etapele precedente pentru un obiect diagrama. S-a utilizat astfel declaratia
Public WithEvents cht As Chart
138
n etapa 2 si codul urmator
Dim C1 As New EventClass
Dim C2 As New EventClass
Sub nitializeCharts ()
Set C1.cht = Worksheets (1).ChartObjects(1).Chart
Set C2.cht = Worksheets (1).ChartObjects(2).Chart
End Sub
pentru initializare.
Aceeasi tehnica se poate utiliza si pentru obiectele 2or:s3eet si 2or:$oo: pentru a utiliza evenimentele noii
clase cu mai multe foi de calcul, n plus fata de evenimentele implicite.
139
O$iectele Microsoft Access
O$iectele accesi$ile Dn Microsoft Access
O$iectele Microsoft Access
O$iectul Application
Utilizarea obiectului Application n automatizare
'olectia 5orms
Referirea la un obiect Form
Proprietatile obiectului Form
Proprietatea Me (obiectul Form)
Proprietatea Section (obiectul Form)
Proprietatea Properties (obiectul Form)
Proprietatea Module (obiectul Form)
Proprietatea RecordSource (obiectul Form)
Module atasate formelor
Crearea formelor n timpul executiei
'olectia Reports
Referirea obiectelor Report
Module asociate rapoartelor
Crearea rapoartelor n timpul executiei
Functiile CreateForm, CreateReport
Functiile CreateControl, CreateReportControl
Exemplu de creare a unui raport
'olectia 'ontrols
Controale Microsoft Access
Controale ActiveX
Referirea obiectelor Control
Proprietatile obiectului Control
Proprietatea Hyperlink (obiectul Control)
Proprietatea ControlType (obiectul Control)
Controale legate de date (Data-Bound Controls)
Controale care au o colectie Controls
'olectia Mo!ules
Referirea la obiecte Module
Module standard si module clasa
Proprietatile obiectului Module
Determinarea numarului de linii
Lucrul cu procedurile
Metodele obiectului Module
Adaugarea de text la un modul
Evenimentele unui modul clasa
'olectia References
Referirea obiectelor Reference
Proprietatile obiectului Reference
Metodele colectiei References
Stabilirea unei referinte n Visual Basic
O$iectul Do'm!
Metoda OpenForm
Metoda RunCommand
O$iectul )creen
Proprietatile obiectului Screen
140
O baza de date Microsoft Access este alcatuita din diferite tipuri de obiecte. Unel sunt utilizate pentru a afisa
date din baza, altele pentru memorarea si gestionarea datelor iar altele ca ajutor n programare.
Unele obiecte sunt furnizate de Access, altele sunt oferite de diferite componente. n continuare se discuta
doar obiectele din Access: forme, rapoarte, controale si module.
O$iectele accesi$ile Dn Microsoft Access
Deoarece Microsoft Access include mai multe componente, fiecare cu multimea proprie de obiecte, anumite
seturi de obiecte sunt accesibile doar daca se specifica o referinta la biblioteca respectiva, referinta
efectundu-se n mod uzual prin marcarea bibliotecii n lista afisata la comanda References din meniul ools.
Access face referinta, n mod automat, la bibliotecile de obiecte:
o Microsoft Access 8.0. Aici sunt obiectele prezentate n acest capitol (5orm, Mo!ule,
Application etc.).
o Microsoft DAO 3.5. Aici sunt continute obiectele de acces la date (Data Access Objects DAO)
cum ar fi TableDef, QueryDef prin care se determina structura de date si se pot accesa datele
prin cod VB. Aceste obiecte sunt discutate ntr-un capitol separat.
o Visual Basic for Applications. Aici sunt continute trei obiecte care ajuta la programare: De$ug,
Err si 'ollection.
Microsoft Access include, de asemenea, biblioteca Microsoft Office 8.0, dar aceasta trebuie sa fie referita
pentru a avea acces la obiecte cum ar fi 'omman!Bar, 5ile)earc3 sau Assistant.
Alte biblioteci trebuie sa fie referite daca obiectele lor sunt necesare n cadrul procesului de automatizare: de
exemplu Microsoft Excel.
Pentru a lucra cu obiectele Microsoft Access din alte aplicatii care suporta automatizarea, n aplicatiile
respective se va face referire la biblioteca de obiecte Microsoft Access 8.0.
O$iectele Microsoft Access
Biblioteca de obiecte Microsoft Access 8.0 contine obiectele si colectiile enumerate n tabelul urmator.
Obiectele si utilizarea lor sunt descrise n continuarea capitolului.
O$iectul sau colectia Descriere
Application Reprezinta aplicatia Microsoft Access
(obiect)
5orm Reprezinta o forma deschisa (obiect)
5orms Contine toate formele deschise. (colectie)
Report Reprezinta un raport deschis (obiect)
Reports Contine toate rapoartele curente deschise
(colectie)
'ontrol Reprezinta un control pe o forma, raport
sau sectiune sau din alt control (obiect)
141
'ontrols Contine toate controalele de pe o forma
sau raport (colectie)
Mo!ule Reprezinta un modul standard sau un
modul clasa (obiect)
Mo!ules Contine toate modulele deschise curent
(colectie)
Reference Reprezinta o referinta la o biblioteca de
obiecte (obiect)
References Reprezinta toate referintele stabilite n mod
curent (colectie)
Do'm! Reprezinta o actiune macro din Visual
Basic (obiect)
)creen Reprezinta aranjarea curenta a obiectelor
pe ecran.
Obiectele Access sunt organizate n mod ierarhic, arborele de structura fiind urmatorul
Proprietatile, metodele si evenimentele asociate sunt vizibile, n mod similar tutror obiectelor accesate n VBA,
prin Object Browser. Pentru a deschide acest instrument, se deschide un modul si apoi se da comanda
O$(ect Bro4ser din meniul Vie4 (sau F2).
O$iectul Application
Obiectul Application reprezinta aplicatia Microsoft Access si este obiectul de nivel cel mai nalt din ierarhia de
obiecte Access, continnd toate celelalte obiecte si colectii.
Obiectul Application este obiectul implicit din ierarhia de obiecte. Drept urmare, atunci cnd se lucreaza din
interiorul aplicatiei Access, nu este necesara referirea lui explicita cnd se utilizeaza una dintre proprietatile
sau metodele sale, sau cnd se scrie o referinta la un obiect sau o colectie inclusa. Referirea explicita nu
produce, totusi, erori.
Specificare obiectului Application este necesara doar atunci cnd, prin procedeul de automatizare, se lucreaza
cu obiecte din ierarhia Access n interiorul altei aplicatii.
9tili*area o$iectului Application Dn automati*are
Atunci cnd se lucreaza cu obiectele Access din alte aplicatii, cum ar fi Excel sau Visual Basic, trebuie sa se
introduca o referinta la biblioteca de obiecte si orice referire la un obiect Access trebuie sa nceapa cu
Application, care permite intrarea n ierarhie.
Automatizarea trebuie sa nceapa cu etapele:
o stabilirea, aplicatia gazda, a unei referinte la biblioteca de obiecte Microsoft Access
o declararea unei variabile obiect care sa reprezinte obiectul Application Microsoft Access
o returnarea unei referinte la obiectul Application su asignarea acestei referinte la variabila obiect.
142
n Visual Basic Editor, aceste etape se realizeaza prin:
o deschiderea unui modul, comanda References din ools, selectarea Microsoft Access I%J
O$(ect Li$rar& n lista A"aila$le References. Este evident ca se presupune instalarea
prealabila a produsului Microsoft Access 97, n caz contrar referinta nu este disponibila.
o Pentru declararea variabilei obiect este recomandata formularea
Dim appAccess As Access.Application
o Dupa declararea variabilei, returnarea unei referinte la obiectul Application se poate obtine prin
functia 'reateO$(ect (daca Microsoft Access nu este lansat) sau GetO$(ect (daca Microsoft
Access este deja lansat). Asignarea referintei la variabila obiect definita este de exemplu:
Set appAccess = CreateObject("Access.Application.8")
o unde numarul versiunii poate lipsi daca exista o singura versiune instalata de Access.
o Daca aplicatia gazda suporta /e4 se poate utiliza o singura instructiune pentru declararea
variabilei si asignarea referintei:
Dim appAccess As New Access.Application
o diferenta fiind ca n aceasta varianta nu este deschis efectiv Microsoft Access pna cnd nu se
lucreaza programatic cu variabila obiect, de exemplu
appAccess.NewCurrentDatabase "NewDb.mdb"
Dupa parcurgerea etapelor descrise, se poate utiliza variabila obiect creata pentru accesul la ierarhia de
obiecte Access. Urmatorul exemplu, care lucreaza din Excel pe baza de date standard (furnizata de Microsoft
Office si utilizata frecvent pentru exemplificari) Northwind, deschide o forma si lucreaza cu ea. Pentru a vedea
functionarea exemplului se va deschide Excel, se va trece codul ntr-un modul si 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 prealabila a unei referinte la biblioteca de obiecte
Microsoft DAO 3.5 si utilizarea apoi a proprietatii DBEngine a obiectului Application Microsoft Access pentru
returnarea unei referinte la obiectul DBEngine DAO. Prin acest din urma obiect se obtine acces la toata
ierahia de obiect DAO.
143
'olectia 5orms
Obiectul 5orm reprezinta o forma Access deschisa ntr-unul din modurile de vizualizare 2esign, 1orm sau
2atasheet. Obiectele 5orm sunt grupate n colectia 5orms, care contine doar formele deschise curent n baza
de date.
n tabelul urmator sunt rezumate relatiile obiectelor 5orm si ale colectiei 5orms:
O$iectul sau
colectia
Este continut(a) Dn 'ontine
5orm (obiect) 5orms Colectia 'ontrols
Colectia Properties
Obiectul Mo!ule
5orms (colectie) Application Obiecte 5orm
Referirea la un o$iect 5orm
Pentru a lucra cu o forma n Visual Basic, trebuie sa se returneze o referinta la obiectul 5orm corespunzator,
referinta obtinndu-se prin intermediul colectiei 5orms. O forma poate fi referita doar daca este deschisa iar
deschiderea unei forme se realizeaza prin metoda Open5orm a obiectului Do'm!.
Ca orice element dintr-o colectie, o forma poate fi referita prin nume sau prin indexul din cadrul colectiei.
Referinta prin nume se poate face n mod explicit, daca se cunoaste numele formei n momentul proiectarii
aplicatiei:
Dim frm As Form
Set frm = Forms!Employees
sau prin notatia cu paranteze, n cazul n care numele este cunoscut doar la momentul executiei, ca n
exemplul urmator:
Function SetFormCaption (strFormName As String)
Dim frm As Form
' Se deschide forma
DoCmd.OpenForm strFormName
' Se returneaza o referinta la obiectul Form
Set frm = Forms(strFormName)
' Se schimba captarea formei
frm.Caption = Date
End Function
Referinta prin indice este de genul Forms(1), indexarea colectiei Forms ncepnd cu 0 (zero). n acest mod de
referire trebuie sa se lucreze cu grija deoarece numerotarea se reface la orice nchidere a unei forme, prin
urmare o forma anumita poate avea indici diferiti n momente diferite de executie.
144
Cum colectia 5orms cuprinde formele deschise la momentul respectiv, nu se poate adauga si nici nu se poate
elimina un membru al colectiei (operatiuni posibile pentru alte colectii din VBA). Deschiderea si nchiderea
unei forme produce operatiunile de adaugare/eliminare a elementelor din colectie.
Pentru cazuri singulare (cum ar fi un obiect care nu se utilizeaza n mod repetat), referinta la o forma se poate
efectua si direct, prin invocarea modulului clasa al formei:
Form_Employees.Visible = True
Proprietatile o$iectului 5orm
Dintre proprietatile obiectului 5orm sunt prezentate doar cteva, considerate mai importante. Pentru celelalte
se va studia intrarea corespunzatoare din Help (Form Object).
Proprietatea Me (5orm O$(ect)
Returneaza o referinta la forma n care se executa codul curent. Proprietatea poate fi utilizata n procedurile
din modulul formei, poate fi utilizata pentru trecerea ca argument a obiectului 5orm fara a sti numele formei.
Utilizarea proprietatii produce un cod independent de numele formei.
Urmatorul exemplu arata cum, la fiecare ncarcare (deschidere) a formei, se poate modifica culoarea de fundal
a sectiunii detaliu din forma. n acest scop se scrie cod n procedura eveniment respectiva:
' Procedura se adauga la modulul formei
Private Sub Form_Load ()
' nitializarea 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 ca atunci cnd se lucreaza cu o forma Access din alta aplicatie, prin automatizare, nu se poate
utiliza Me pentru a referi forma din aplicatia gazda.
Proprietatea )ection (5orm O$(ect)
O forma este divizata n Access n cinci sectiuni: detaliu (detail), antet (header), subsol (footer), antet de
pagina (page header) si subsol de pagina (page footer). Proprietatea returneaza o referinta la o sectiune
particulara, utilizarea acesteia permite stabilirea proprietatilor sectiunii. Pentru obiectul Form, sectiunile sunt
identificate prin
In!e1 /ume )emnificatie
0 acDetail Form detail
1 acHeader Form header
2 acFooter Form footer
3 acPageHeader Form page header
4 acPageFooter Form page footer
145
Un numar de proprietati se aplica mai degraba unei sectiuni dintr-o forma dect obiectului 5orm. De exemplu,
proprietatea Bac:'olor se aplica unei sectiuni si nu unei forme (a se vedea exemplul precedent). O sectiune
are de asemenea o proprietatea 'ontrols, care returneaza o referinta la colectia 'ontrols pentru acea
sectiune.
Urmatorul exemplu tipareste, n fereastra Debug, numele tuturor controalelor din sectiunea de detalii:
Sub ControlsBySection (frm As Form)
Dim ctl As Control
' Enumerarea controalelor din sectiunea de detalii
For Each ctl n frm.Section(acDetail).Controls
Debug.Print ctl.Name
Next ctl
End Sub
Proprietatea Properties (5orm O$(ect)
Returneaza o referinta la colectia Properties a obiectului 5orm. Colectia Properties contine toate proprietatile
formei si pot fi enumerate prin instructiunea 5or Eac3;/e1t.
La colectia Properties nu se poate adauga programatic o noua proprietate.
Urmatorul exemplu tipareste toate proprietatile unui obiect Form
Sub EnumerateFormProperties(frm As Form)
Dim prp As Property
' enumerarea proprietatile unei forme
For Each prp n frm.Properties
Debug.Print prp.Name, prp.Value
Next prp
End Sub
Proprietatea Mo!ule (5orm O$(ect)
Aplicata unui obiect 5orm, proprietatea Mo!ule returneaza o referinta la obiectul Mo!ule asociat formei.
Referinta poate fi asignata unei variabile de tip Mo!ule.
Modulul asociat cu o forma nu exista n mod automat din momentul creerii formei. Proprietatea EasMo!ule
determina daca o forma are un modul asociat. Daca proprietatea Mo!ule este referita n modul proiectare,
Access creeaza modulul asociat si stabileste valoarea True pentru EasMo!ule. Referirea la proprietatea
Mo!ule a unei forme n executie (run-time) pentru care EasMo!ule este False produce eroare.
Proprietatea Recor!)ource (5orm O$(ect)
Prin proprietatea aceasta se leaga o tabela sau o interogare (9uery) la forma. Dupa ce proprietatii
RecordSource i-a fost atribuit numele unei tabele sau interogari sau o instructiune SQL se pot afisa date din
tabela, interogare sau SQL pe forma. Un exemplu este
Forms!frmCustomers.RecordSource = "Customers"
prin care se leaga forma de o tabela.
Mo!ule atasate formelor
146
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, exista trei cai de creare a modulului asociat:
o click Code de pe meniul View cnd forma este n modul de vizualizare Design. Modulul este
creat si salvat mpreuna cu forma chiar daca nu contine code.
o Stabilirea proprietatii HasModule la True. Aceasta se poate efectua din foaia de proprietati din
Access sau din Visual Basic. Stabilirea proprietatii la False elimina modulul si codul continut.
o Referirea la proprietatea Module a formei din Visual Basic. Proprietatea returneaza o referinta
la obiectul Module asociat formei, crend mai nti modulul daca el nu exista.
n lucrul cu module asociate, trebuie retinut ca o forma fara modul asociat se deschide mai repede. Prin
urmare nu se vor crea module daca nu exista necesitatea scrierii de cod pentru forma. Eliminarea modulelor
inutile reduce si dimensiunea bazelor de date.
Un modul de forma contine toate procedurile eveniment definite pentru forma, ca si alte proceduri specifice
formei. De notat ca o procedura care se acceseaza din multiple locuri ale bazei de date trebuie plasata ntr-un
modul standard.
'rearea formelor Dn timpul e1ecutiei
Pentru generarea unei forme n timpul executiei (run-time) se poate utiliza functia 'reate5orm. Functiile
asociate sunt 'reate'ontrol si Delete'ontrol care adauga sau elimina controale de pe o forma.
Se poate, de asemenea, sa se adauge programatic, n timpul executiei, cod n modulul asociat formei prin
metodele si proprietatile obiectului Mo!ule. De exemplu, metoda 'reateE"entProc creeaza o procedura
eveniment pentru obiectul specificat (aici forma, dar poate fi si raport, control etc.). Metoda InsertLines
permite inserarea unor linii de cod, ca si Inserte1t, A!!5rom5ile, A!!5rom)tring etc.
Urmatorul exemplu creeaza o forma si adauga o procedura 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
' creeaza noua forma si returneaza o referinta la ea
Set frm = CreateForm
' returneaza o referinta la modul
Set mdl = frm.Module
' creeaza procedura evenimentului Load
lngLine = mdl.CreateEventProc("Load", "Form")
strLine = vbTab & "Me.Caption = " & Date
' stabileste captarea formei n evenimentul Load
mdl.nsertLines lingLine + 1, strLine
' returneaza True daca functia se termina cu succes
CreateFormWithCode = True

Exit_CreateFormWitwCode:
Exit Function

Error_CreateFormWithCode:
MsgBox Err & ": " & Err.Description
CreateFormWithCode = False
147
Resume Exit_CreateFormWithCode
End Function
O discutie ceva mai ampla se gaseste la sectiunea dedicata colectiei Mo!ules.
'olectia Reports
Un obiect Report reprezinta un raport microsoft Access care este deschis n Design view, Print Preview sau
Layout Preview. Toate obiectele Report sunt membri ai colectiei Reports. De accentuat ca doar rapoartele
deschise sunt reprezentate n colectie.
Relatiile n sus si n jos ale colectiei Reports n ierarhia de obiecte sunt date n tabelul urmator:
O$iectul sau
colectia
Este continut(a) Dn 'ontine
Report (obiect) Reports Colectia 'ontrols
Colectia Properties
Obiectul Mo!ule
Reports (colectie) Application Obiecte Report
Obiectele Report au caracteristici similare cu obiectele Form.
Referirea o$iectelor Report
Pentru a referi un raport trebuie ca acesta sa fie deschis, operatiune realizata prin metoda OpenReport a
obiectului Do'm!.
Referintele se returneaza n mod uzual, dupa unul dintre modelele:
Dim rpt As Report ' defineste variabila obiect rpt de tip Report
Set rpt = Reports!nvoice ' referinta prin nume cunoscut
Set rpt = Reports("nvoice") ' referinta prin sirul care contine numele
Set rpt = Reports(0) ' referinta prin indicele din colectie (bazat pe zero)
Mo!ule asociate rapoartelor
Ca si un obiect Form, obiectul Report poate avea asociat un modul care este un modul clasa. Modulul de cod
asociat nu exista pna cnd nu este referit:
o click Code de pe meniul View cnd raportul este n modul de vizualizare Design. Modulul este
creat si salvat cu raportul chiar daca nu contine code.
o Stabilirea pentru obiectul Report a proprietatii HasModule la True. Aceasta se poate efectua din
foaia de proprietati din Access sau din Visual Basic. Stabilirea proprietatii la False elimina
modulul si codul continut.
o Referirea, din Visual Basic, la proprietatea Module a raportului. Proprietatea returneaza o
referinta la obiectul Module asociat raportului, crend mai nti modulul daca el nu exista.
'rearea rapoartelor Dn timpul e1ecutiei (run time)
148
Pentru crearea programatica a rapoartelor se utilizeaza functie 'reateReport. Controalele se pot adauga sau
elimina, n run time, prin functiile 'reateReport'ontrol sau DeleteReport'ontrol.
5unctiile 'reate5orm. 'reateReport
Sintaxa apelurilor este
'reate5orm([database[, formtemplate]])
'reateReport([database[, reporttemplate]])
unde
database este un sir, identifica baza de date care contine raportul sau forma creata. Daca este omis, se va
utiliza baza curenta (conform returului functiei 'urrentD$). Baza de date specificata, daca este diferita de
baza curenta, trebuie deschisa ca o baza de date biblioteca (vezi intrarile din Help pentru "library databases").
formtemplate, reporttemplate sunt, respectiv, siruri cu numele sabloanelor utilizate la crearea noului obiect.
Daca este omis, se va alege n mod implicit sablonul specificat de fisa 5orms/Reports din dialogul Options
deschis de comanda Options din meniul ools.
Functiile deschid un obiect nou, minimizat, n modul de vizualizare Design.
Sabloanele specificate pot fi create anterior ca sabloane sau pot fi orice forma, respectiv raport, din baza de
date specificata n argumentul database.
5unctiile 'reate'ontrol. 'reateReport'ontrol
Ambele functii creeaza un control cu atributele specificate pe o forma, respectiv pe un raport. Att forma ct si
raportul trebuie sa fie deschise. Sintaxa este
'reate'ontrol(formname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])
'reateReport'ontrol(reportname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])
unde
formname, reportname reprezinta numele formei sau raportului unde se creeaza controlul.
controltype este o constanta predefinita care reprezinta tipul controlului. Se pot vedea prin Object Browser cu
alegerile Access n Project/Library si Constants n Classes si copia n cod. Fara explicatii (denumirile sunt
suficient de sugestive): acLabel, acRectangle, acLine, acmage, acCommandButton, acOptionButton,
acCheckBox, acOptionGroup, acBoundObjectFrame, acTextBox, acListBox, acComboBox, acSubform,
acObjectFrame, acPage, acPageBreak, acCustomControl, acToggleButton, acTabCtl.
section este o constanta identificnd sectiunea. Poate fi o constanta dintre
'onstanta )emnificatia
acDetail (Default) Detail section
acHeader Form or report header
149
acFooter Form or report footer
acPageHeader Page header
acPageFooter Page footer
acGroupLevel1Header Group-level 1 header (reports
only)
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 ncepnd cu 9
parent este un sir care identifica controlul parinte. Pentru controalele care nu sunt copii se utilizeaza sirul vid
sau se omite argumentul.
columnname numele cmpului unde este legat controlul, daca este un control legat de date. Daca nu este
cazul, se utilizeaza sirul vid.
left, top sunt expresii numerice ale coordonatelor relative la coltul din stnga sus, n twips.
idth, height sunt expresii numerice indicnd latimea si naltimea controlului, n twips.
Functiile 'reate'ontrol si 'reateReport'ontrol pot fi utilizate doar n modul de vizualizare Design (vezi si
efectul functiilor 'reate5orm, 'reateReport). n stabilirea relatiilor parinte-copil se va avea n vedere relatia
de pe forma/raport. De exemplu, caseta text (control tata) si eticheta asociata (control copil, subordonat). Sau,
un grup de optiuni este parinte pentru boxele de control continute etc. Doar controalele label, check box,
option button sau toggle button pot avea controale parinte, desi pot fi create si independent.
Controalele care pot fi legate de un cmp de date sunt text box, list box, combo box, option group si bound
object frame. n plus, controalele toggle button, option button si check box pot fi legate de un cmp daca nu
sunt continute ntr-un grup de optiuni (option group).
La legarea unui cmp, proprietatile controlului sunt modificate automat pentru a se conforma proprietatilor
corespunzatoare ale cmpului.
Pentru a nlatura un control se vor utiliza instructiunile Delete'ontrol si DeleteReport'ontrol cu sintaxa
Delete'ontrol formname, controlname
DeleteReport'ontrol reportname, controlname
Semnificatia argumentelor este evidenta.
E1emplu !e creare a unui raport
150
Folosind automatizarea din Excel, exemplul creeaza o tabela legata ntr-o baza de date Access si realizeaza
un raport pe baza datelor din tabele legata.
Pentru utilizarea exemplului trebuie sa se creeze un caiet Excel cu numele Revenue.xls, sa se completeze
datele ntr-o foaie a caietului si sa se denumeasca un domeniu DataRange care include datele. Dupa aceea,
se va trece codul urmator ntr-un modul din caiet. n proiectul Excel se vor stabili referinte la bibliotecile de
obiecte Microsoft Access 8.0 si DAO 3.5.
Este esential ca, naintea executiei codului, sa fie instalat n sistem driver-ul Microsoft Excel SAM
(Msexcl35.dll). Daca nu este instalat, se va executa Setup pentru a-l instala. Driver-ul Microsoft Excel SAM
permite fisierelor Excel 97 sa lucreze cu motorul de baze de date Microsoft Jet.
' se introduce n sectiunea 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 nteger

' se declara calea catre baza de date Northwind (din Office)
Const conPath As String = "C:\Program Files ."
' Se deschide baza de date
appAccess.OpenCurrentDatabase conPath & "Northwind.mdb"
' se returneaza referinta la baza
Set dbs = appAccess.CurrentDb
' se creeaza un obiect tabela nou
Set tdf = dbs.CreateTableDef("XLData")
' se specifica sirul de conectare la driver-ul Excel SAM
tdf.Connect = "EXCEL 8.0; Database=C:\My Documents\Revenue.xls"
' se specifica tabela sursa ca un domeniu numit n foaie
tdf.SourceTableName = "DataRange"
' se adauga noua tabela legata la baza
dbs.TableDefs.Append tdf
' se creeaza noul raport
Set rpt = appAccess.CreateReport
' se specifica tabela legata drept sursa de date a raportului
rpt.RecordSource = tdf.Name
' se creeaza un control pe raport pentru fiecare cmp din tabela
For Each fld n 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 aplicatia activa
AppActivate "Microsoft Access"
End Sub
151
'olectia 'ontrols
Un obiect 'ontrol reprezinta un control de pe o forma sau dintr-un raport Access. Obiectele 'ontrol sunt
grupate n colectia 'ontrols. Legaturile n ierarhia de obiecte Access sunt date n tabelul urmator.
O$iectul sau
colectia
Este continut(a) Dn 'ontine
'ontrol (obiect) 'ontrols Colectia 'ontrols cnd
controlul este un grup
de optiuni (option
group) sau un control
tab.
Colectia Properties
Obiect E&perlin:
Obiecte 'ontrol
'ontrols (colectie) Obiecte 5orm
Obiecte Reports
Obiecte 'ontrol, 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.
Obiecte 'ontrol
Exista doua tipuri de controale:
o preconstruite, n biblioteca de obiecte Microsoft Access 8.0, accesibile printr-o cutie de unelte,
o controale ActiveX (denumite si controale ).3 sau custom controls).
'ontroale Microsoft Access
Urmatorul tabel contine lista controalelor predefinite. Controalele sunt cu denumirile de clasa, dupa cum apar
n Object Browser. Fiecare control este un obiect cu proprietatile, metodele si evenimentele lui. Pentru detalii
se vor studia intrarile sinonime din Help.
'ontrolul Descriere
Boun!O$(ect5rame Afiseaza o imagine, diagrama sau obiect OLE
memorat ntr-o tabela Access.
'3ec:Bo1 ndica selectarea unei optiuni
152
'om$oBo1 Combina lista ascunsa si o caseta text.
'omman!Button Un buton cu rol de pornire a unei operatiuni
atunci cnd se efectueaza click pe el.
Image Afiseaza o imagine.
La$el Afiseaza un text explicativ.
Line Afiseaza o linie orizontala, verticala sau
diagonala
ListBo1 Afiseaza o lista de valori.
O$(ect5rame Afiseaza o imagine, diagrama sau obiect OLE
care nu este memorat ntr-o tabela.
OptionButton ndica daca o optiune este selectata (buton
radio).
OptionGroup Afiseaza un set de optiuni.
Page Afiseaza controale pe o pagina a unui control
tab.
PageBrea: Marcheaza nceputul unui nou ecran sau a unei
pagini tiparite.
Rectangle Afiseaza un dreptunghi.
)u$5ormA)u$Report Afiseaza o forma n interiorul altei forme sau un
raport n interiorul altui raport.
a$'ontrol Afiseaza pagini multiple, fiecare continnd o
multime de controale.
e1tBo1 Afiseaza date de tip text.
oggleButton ndica daca o optiune este selectata sau nu
(on/off) prin imaginea unui buton apasat sau nu.
'ontroale Acti"eH
Un control ActiveX este un obiect care poate fi plasat pe o forma pentru a afisa date sau efectua actiuni. Spre
deosebire de controalele preconstruite, codul asociat este memorat n fisiere separate, care trebuiesc instalate
pentru a putea utiliza controlul ActiveX.
n Microsoft Access sunt disponibile controalele
o Calendar, care permite afisarea si actualizarea unui calendar pe o forma. nstalarea controlului
se cere la instalarea Microsoft Access.
153
o WebBrowser, care permite afisarea paginilor Web si alte documente ntr-o forma Access. Acest
control este instalat separat (din folderul ValuPack al CD-ului Office sau direct prin instalarea
browserului Microsoft nternet Explorer).
Referirea o$iectelor 'ontrol
Un control poate fi referit repetat prin declararea unei variabile care sa-l reprezinte. Declararea poate fi facuta
explicit, daca se cunoaste tipul obiectului:
Dim txt As TextBox
sau, daca nu se stie tipul controlului sau daca variabila contine o referinta la un control ActiveX, ea este
declarata de tip generic 'ontrol si poate primi referinte la orice tip de control (alternativa utila pentru trecerea
unor argumente de tipuri diferite de controale unei proceduri) .
Pentru referinta unui obiect Control individual se pot utiliza mecanismele uzuale pentru colectii:
Set txt = Forms!Employees!LastName ' care se refera la controlul TextBox
' cu numele LastName de pe forma Employees
Set txt = Me!LastName ' similar exemplului precedent, dar referinta este
' n forma care se executa curent
Set txt = Me![Last Name] 'daca numele contine spatii
Set ctl = Me.Controls(0) ' prin indice, bazat pe zero
Set ctl = Me.Controls("LastName")
Proprietatile o$iectului 'ontrol
Datorita marii varietati de controale, proprietatile sunt foarte numeroase (de exemplu Text Box Control are
peste 50 de proprietati) nct aici se discuta doar doua care merita o atentie speciala.
Proprietatea E&perlin: ('ontrol O$(ect)
Prin aplicarea proprietatii este returnata o referinta la un obiect E&perlin:, care reprezinta un text sau grafica
definind un salt la un fisier, bookmark ntr-un fisier, pagina HTML pe WWW sau pe intranet.
Controalele care suporta proprietatea E&perlin: sunt combo box, command button, image, label si text box.
Fiecare poate afisa o hiperlegatura pe care utilizatorul o poate clicka pentru navigare. Atunci cnd se dispune
de o referinta la un obiect E&perlin: dintr-un control, utilizarea metodei 5ollo4 (a obiectului E&perlin:)
produce saltul la locatia indicata.
Exemplul urmator contine o functie care returneaza True n cazul n care controlul trecut drept argument
contine o hiperlegatura valida.
Function FollowControlHyperlink (ctl As Control) As Boolean
Const conNoHyperlink As nteger = 7976

' permiterea controlului erorilor
On Error GoTo Error_FollowControlHyperlink
' urmarirea adresei indicate
ctl.Hyperlink.Follow
' returneaza True daca saltul este corect
FollowControlHyperlink = True

Exit_ FollowControlHyperlink:
154
Exit Function

Error_ FollowControlHyperlink:
f Err = conNoHyperlink Then
FollowControlHyperlink = False
End f
Resume Exit_ FollowControlHyperlink
End Function
Proprietatea 'ontrol&pe ('ontrol O$(ect)
Aplicata unui obiect Control, proprietatea indica tipul particular de control al obiectului. Utilizarea proprietatii
poate duce si la schimbarea tipului de control (de exemplu Text Box n Combo Box) nu numai la aflarea tipului.
Valorile proprietatii sunt
acLabel acRectangle AcLine acmage
acCommandButton acOptionButton AcCheckBox acOptionGroup
acBoundObjectFrame acTextBox AcListBox acComboBox
acSubform acObjectFrame AcPage acPageBreak
acCustomControl acToggleButton AcTabCtl
cu interpretari imediate.
Urmatorul exemplu verifica proprietatea 'ontrol&pe pentru fiecare control de pe o forma si stabileste
proprietatea Loc:e! la valoarea True pentru casetele de text si boxele combo.
Function LockTextControls (frm As Form) As Boolean
Dim ctl As Control

' tratarea erorilor
On Error GoTo Error_LockTextControls

' parcurgerea controalelor
For Each ctl n frm.Controls
' se prelucreaza doar controalele Text Box si Combo Box
f ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
ctl.Locked = True
End f
Next ctl
' returneaza True pentru succes
LockTextControls = True

Exit_LockTextControls:
Exit Function

Error_LockTextControls:
MsgBox Err & ": " & Err.Description
LockTextControls = False
Resume Exit_ LockTextControls
End Function
155
'ontroale legate !e !ate (Data<Boun! 'ontrols)
Anumite controale din Microsoft Access pot fi legate de date, ceea ce nseamna ca ele afiseaza date
memorate ntr-o tabela, interogare sau instructiune SQL. Aceasta categorie de controale include: bound object
frame, check box, combo box, list box, option button, option group, text box, subform si subreport.
Si unele controale ActiveX (de exemplu Calendar control) pot fi, de asemenea, legate de date.
Controalele legate de date au o proprietate 'ontrol)ource prin care se fixeaza numele cmpului tabelei,
interogarii sau instructiunii SQL din care se iau datele afisate de control. Este de notat ca mai nainte de
stabilirea acestei proprietati trebuie sa se fixeze proprietatea Recor!)ource a formei/raportului pentru a
specifica tabela, interogarea sau instructiunea SQL care furnizeaza date formei/raportului.
Exemplul urmator stabileste proprietatea Recor!)ource a unei forme si proprietatea 'ontrol)ource a unui
control text box, numit Text0, n procedura de tratare a evenimentului de ncarcare a formei.
Private Sub Form_Load ()
' sursa de nregistrari a formei
Me.RecordSource = "Employees"
' sursa de date a controlului
Me!Text0.ControlSource = "LastName"
End Sub
'ontroale care au o colectie 'ontrols
a$ control si Option group control au, la rndul lor, o colectie 'ontrols care poate contine mai multe
controale.
Colectie 'ontrols apartinnd unui grup de optiuni contine controale de tip options button, check box, toggle
button sau label.
Controlul a$ contine o colectie Pages reprezentnd paginile controlului (vezi figura urmatoare). Colectia
Pages contine obiecte Page care sunt controale (au 'ontrol&pe = ac&age).
Fiecare obiect Page are colectia 'ontrols a tuturor controalelor din pagina respectiva.
Celelalte controale (text box, option group, option button, toggle button, check box, combo box, list box,
command button, bound object frame si unbound object frame) au o colectie 'ontrols cu cel mult un element:
label reprezentnd eticheta atasata controlului.
'olectia Mo!ules
Un obiect Mo!ule reprezinta un modul din Microsoft Access. Toate obiectele Mo!ule sunt incluse n colectia
Mo!ules, membru al obiectului Application. S-a vazut ca un obiect 5orm sau Report poate sa contina de
asemenea un singur obiect Mo!ule.
Multimea tuturor modulelor dintr-o baza de date Microsoft Access constituie proiectul Visual Basic al bazei de
date. Colectia Mo!ules contine doar modulele deschise curent n proiect. Modulele care nu sunt deschise
pentru editare nu sunt incluse n colectia Mo!ules.
Pentru a deschide un modul n Visual Basic se utilizeaza metoda OpenMo!ule a obiectului Do'm!.
Relatiile stabilite de ierarhia de obbiecte sunt
156
O$iectul sau
colectia
Este continut(a) Dn 'ontine
Mo!ule (obiect) Colectia Mo!ules
Obiecte 5orm
Obiecte Report
(Nimic)
Mo!ules (colectie) Obiectul Application Obiecte Mo!ule
Referirea la o$iecte Mo!ule
Accesul la un modul se obtine prin intermediul colectiei, n mod uzual. Astfel
Dim mdl As Module
Set mdl = Modules![ Utility Functions] ' returneaza o referinta
'la modulul cu numele dat
Set mdl = Modules(" Utility Functions") ' - idem-
Set mdl = Modules(0) ' returneaza o referinta
' la primul modul al colectiei
Modulele clasa asociate formelor sau rapoartelor care sunt deschise se regasesc n colectia Modules.
Pentru modulele asociate formelor/rapoartelor care nu sunt deschise vezi discutia de la prezentarea obiectelor
forme si rapoarte.
Mo!ule stan!ar! si mo!ule clasa
Reamintim cteva notiuni prezentate n capitolele introductive.
Microsoft Access contine doua tipuri de module: module standard (standard modules) si module de clasa
(class modules). Ambele tipuri sunt disponibile n tab-ul Mo!ules din fereastra Database a mediului Access. O
forma sau un raport pot avea de asemenea un modul de clasa asociat.
Codul care trebuie sa fie accesibil din orice procedura se va scrie ntr-un modul standard. Acestea sunt
publice n mod implicit, deci procedurile si variabilele de nivel modul sunt vizibile n mod uzual n tot proiectul.
De asemenea, daca proiectul este referit de alt proiect Access, codul dintr-un modul standard poate fi utilizat
n proiectul care efectueaza referinta.
Modulele de clasa sunt ntotdeauna private. Se pot utiliza modulele clasa pentru a crea obiecte utilizate n
proiectul curent, dar ele nu se pot partaja cu alte proiecte. Procedurile )u$ si 5unction definite ntr-un modul
de clasa devin metode ale obiectului definit iar price procedura de tip Propert& Let. Propert& Get si Propert&
)et devin proprietatile obiectului.
Se pot utiliza modulele clasa asociate cu o forma sau raport pentru a defini procedurile declansate de
evenimente si se pot adauga oricte proceduri utilizate doar n modulul clasa respectiv.
Proprietatile o$iectului Mo!ule
O descriere sumara a proprietatilor este continuta n tabelul urmator. Explicatii detaliate se obtin din Help.
157
Proprietatea Descriere O$ser"atii
Application Returneaza o referinta la
obiectul Application.
Permite obtinerea accesului
la ierarhia de obiecte
Access.
'ountOfDeclarationLines Returneaza numarul de
linii de cod din sectiunea
Declarations a modulului.
Long, numaratoarea ncepe
cu 1
'ountOfLines Returneaza numarul de
linii de cod din modul
Long, numaratoarea ncepe
cu 1
Lines Returneaza textul
continut n liniile de cod
specificate
object.Lines(line, numlines)
/ame Da numele modulului
Parent Returneaza o referinta la
obiectul sau colectia care
contine modulul

ProcBo!&Line Returneaza numarul liniei
la care ncepe definirea
procedurii
object.ProcBo!&Line( _
procname, prockind)
Proc'ountLines Returneaza numarul de
linii dintr-o procedura
object.Proc'ountLines( _
procname, prockind)
ProcOfLine Returneaza numele
procedurii care contine o
linie specificata
object.ProcOfLine( _
line, pprockind)
Proc)tartLine Returneaza numarul liniei
la care ncepe o
procedura
object.Proc)tartLine( _
procname, prockind)
&pe ndica tipul modulului AcStandardModule sau
0, acClassModule sau 1.
Determinarea numarului !e linii !intr<un mo!ul
Liniile unui modul sunt numarate ncepnd cu 1. Numarul ultimei linii dintr-un modul este egal cu valoarea
proprietatii 'ountOfLines. Numarul ultimei linii din sectiunea Declarations a unui modul este egal cu valoarea
proprietatii 'ountOfDeclarationLines.
Numerele de linii nu apar efectiv n modul, ele sunt utilizate doar pentru referinte.
Lucrul cu proce!urile
158
Proprietatile Lines. ProcBo!&Line. Proc'ountLines. ProcOfLine si Proc)tartLine sunt utilizate pentru a
obtine informatii despre procedurile unui modul. Procedurile pot fi de tip )u$, 5unction, Propert& Get,
Propert& Let sau Propert& )et. Primele doua tipuri sunt considerate de acelasi tip, ultimele trei privesc
crearea de proprietati ntr-un modul clasa.
Proprietatea ProcBo!&Line returneaza numarul liniei la care ncepe definirea procedurii, adica linia care
include o instructiune )u$. 5unction sau Propert& GetALetA)et%
Proprietatea ProcLine)tart returneaza numarul liniei care urmeaza dupa separatorul de proceduri, daca sunt
selectate optiunile 5ull Mo!ule Vie4 si Proce!ure )eparator n fisa Mo!ule din dialogul Option (meniul
ools). Acest numar poate fi diferit de cel returnat de ProcBo!&Line, deoarece sunt considerate si liniile
comentariu, vide etc din fata liniei de definire. Proc)tartLine returneaza numarul primei linii a ntregii
procedurii.
Exemplul urmator utilizeaza proprietatile enumerate pentru a tipari o procedura n fereastra Debug (exemplul
modifica usor exemplul din Help).
Function ProcLinenfo(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_ProcLinenfo
' Se deschide modulul specificat
DoCmd.OpenModule strModuleName
' Returneaza o referinta la obiectul Module
Set mdl = Modules(strModuleName)

' se numara liniile din procedura
lngCount = mdl.ProcCountLines(strProcName, vbext_pk_Proc)
' Determina linia de start
lngStartLine = mdl.ProcStartLine(strProcName, vbext_pk_Proc)

' se determina linia de definire
lngBodyLine = mdl.ProcBodyLine(strProcName, vbext_pk_Proc)
Debug.Print

' se tiparesc liniile de nceput
Debug.Print "Lines preceding procedure " & strProcName & ": "
Debug.Print mdl.Lines(lngStartLine, lngBodyLine - lngStartLine)

' determinarea numarului ultimei linii
lngEndProc = (lngBodyLine + lngCount - 1) - Abs(lngBodyLine - lngStartLine)

' tiparirea liniilor din corpul procedurii

Debug.Print "Body lines: "
Debug.Print mdl.Lines(lngBodyLine, (lngEndProc - lngBodyLine) + 1)

Exit_ProcLinenfo:
Exit Function

Error_ProcLinenfo:
MsgBox Err & " :" & Err.Description
159
ProcLinenfo = False
Resume Exit_ProcLinenfo
End Function
Procedura poate fi apelata, de exemplu, din baza de date exemplificatoare Northwind prin
Sub GetProcnfo()
ProcLinenfo "Utility Functions", "sLoaded"
End Sub
Meto!ele o$iectului Mo!ule
Tabelul urmator contine o sinteza a metodelor obiectului Module.
Meto!a Descriere
A!!5rom5ile Adauga la modul continutul unui fisier text.
A!!5rom)tring Adauga modulului continutul unui sir de
caractere.
'reateE"entProc Creeaza o procedura eveniment ntr-un
modul clasa.
DeleteLines Elimina din modul liniile specificate.
5in! Gaseste, ntr-un modul, textul specificat.
InsertLines nsereaza o linie sau un grup de linii de cod
la o pozitie specificata din modul.
ReplaceLines nlocuieste o linie dintr-un modul cu textul
specificat.
A!augare !e te1t la un mo!ul
Pentru a insera text ntr-un modul, este recomandata metoda InsertLines prin care se poate specifica linia
unde are loc inserarea.
Exemplul din Help (intrarea nsertLines Method) creeaza o forma noua, adauga un buton de comanda,
creeaza procedura evenimentului Click si insereaza o linie de cod cu metoda InsertLines.
Daca textul care se doreste adaugat trebuie sa fie ntr-un modul nou, acesta se poate crea prin metoda
Run'omman! a obiectului Application (comanda Mo!ule din meniul Insert trebuie sa fie permisa):
RunCommand acCmdNewObjectModule
Pentru lista integrala a constantelor permise la aplicarea metodei se va vedea intrarea "RunCommand Method
Constants" n Help.
Exemplul urmator utilizeaza metoda AddFromFile pentru a adauga continutul unui fisier text la un modul nou.
Modulul creat este salvat cu acelasi nume ca si fisierul text.
160
Function AddFromTextFile(strFileName) As Boolean
Dim strModuleName As String, intPosition As nteger
Dim intLength As nteger
Dim mdl As Module

' memorarea numelui de fisier ntr-o variabila
strModuleName = strFileName
' eliminarea caii din numele fisierului
Do
' gasirea caracterului \
intPosition = nStr(strModuleName, "\")
f intPosition = 0 Then
Exit Do
Else
intLength = Len(strModuleName)
' eliminare cale din sir
strModuleName = Right (strModuleName, Abs(intLength intPosition))
End f
Loop

' eliminarea extensiei
intPosition = nStr(strModuleName, ".")
f intPosition > 0 Then
intLength = Len(strModuleName)
strModuleName = Left(strModuleName, intPosition 1)
End f

' Crearea modulului nou
RunCommand acCmdNewObjectModule
' salvarea modulului
DoCmd.Save , strModuleName
' returnarea referintei la obiectul Module
Set mdl = Modules(strModuleName)
' adaugarea fisierului text
mdl.AddFromFile strFileName
' salvarea modulului modificat
DoCmd.Save
End Function
O$ser"atie. Daca executia procedurii n linia care executa prima salvare a modulului are loc n modul pas cu
pas, atunci focusul este n modulul de unde se executa codul si nu n modulul nou creat. n acest fel, Visual
Basic va ncerca, mai degraba, salvarea modulului cu focusul si nu a modulului nou creat.
E"enimentele unui mo!ul clasa
Modulele de clasa, care nu sunt asociate cu o forma sau un raport, au doua evenimente: Initiali*e si
erminate.
Evenimentul Initiali*e se declanseaza la crearea unei noi instante a obiectului.
erminate apare atunci cnd se elimina un obiect utilizator din memorie.
161
Pentru a crea procedurile de raspuns la evenimente, se deschide modulul clasa, se selecteaza 'lass n boxa
O$(ect si se alege Initiali*e sau erminate n lista Proce!ure.
Evenimentele pot fi utilizate, de exemplu, pentru a initializa o variabila la nivel de modul o data cu crearea
obiectului.
'olectia References
Un obiect Reference reprezinta o referinta din Microsoft Access la alt proiect sau la o biblioteca de obiecte.
Obiectele Reference sunt continute n colectia References, fiecare element din colectie corespunznd unei
referinte selectate n dialogul References (meniul ools).
Colectia References si obiectele Reference pot fi utilizate din Visual Basic pentru a adauga referinte, pentru a
verifica referintele existente sau pentru a anula referintele care nu mai sunt necesare.
O$iectul sau
colectia
Este continut(a) Dn 'ontine
Reference (obiect) References (nimic)
References
(colectie)
Application Obiecte Reference
Referirea o$iectelor Reference
Un obiect Reference este accesat prin intermediul colectiei 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 ca numerotarea
' colectiei References ncepe cu 1
Proprietatile o$iectului Reference
Tabelul urmator prezinta pe scurt proprietatile obiectului Reference.
Proprietatea Descriere
BuiltIn ndica daca referinta este implicita,
necesara bunei functionari a aplicatiei
Microsoft Access.
'ollection Returneaza o referinta la colectia
References.
5ullPat3 Returneaza calea si numele de fisier al
proiectului referit sau al bibliotecii de
obiecte.
162
G9ID Returneaza identificatorul global unic
(GUD Globally Unique dentifier) al
proiectului referit sau al bibliotecii de
obiecte. Un GUD este memorat n registry-
ul Windows.
IsBro:en ndica daca referinta puncteaza catre o
referinta valida.
@in! ndica daca obiectul Reference puncteaza
la un proiect Visual Basic (valoarea Pro(ect
sau 1) sau la o biblioteca (&peLi$ sau 0).
Ma(or Returneaza valoarea din stnga punctului
zecimal din numarul de versiune al fisierului
referit.
Minor Returneaza valoarea din dreapta punctului
zecimal din numarul de versiune al fisierului
referit.
/ame Returneaza numele proiectului sau al
bibliotecii de obiecte catre care duce
referinta.
Meto!ele colectiei References
Obiectul Reference nu are asociate metode. Metodele colectiei References sunt
Meto!a Descriere
A!!5rom5ile Creeaza o referinta la un fisier care contine
un proiect sau o biblioteca de obiecte.
References.A!!5rom5ile(filename)
A!!5romG9ID Creeaza o referinta la un proiect sau
biblioteca de obiecte pornind de GUD-ul
fisierului, memorat n registry.
Object.A!!5romG9ID(guid)
Item Returneaza un element particular al
colectiei References.
Remo"e Elimina un obiecte Reference din colectia
References%
)ta$ilirea unei referinte Dn Visual Basic
163
Primele doua metode enumerate n tabelul precedent, A!!5rom5ile si A!!5romG9ID, permit stabilirea unei
referinte n mod programatic. Urmatorul exemplu creeaza o referinta n timpul executiei.
Function AddReference (strFilePath As String) As Boolean
Dim ref As Reference

Const conReferenceExists As Long = 32813
On Error GoTo Error_AddReference
' Adauga o referinta la un proiect sau biblioteca de obiecte
Set ref = References.AddFromFile(strFilePath)
AddReference = True

Exit_AddReference:
Exit Function

Error_AddReference:
f Err <> conReferenceExists Then
MsgBox Err & ": " & Err.Description
End f
AddReference = False
Resume Exit_AddReference
End Function
Apelul acestei functii poate fi efectuat dupa modelul

Sub SetSolutionsReferences ()
Const strRefPath As String = "C:\Program Files\Microsoft Office" _
& "\Office\Samples\Solutions.mdb"
f AddReference (strRefPath) = True Then
MsgBox "Reference set successfully."
Else
MsgBox "Reference not set successfully."
End f
End Sub
O$iectul Do'm!
Metodele obiectului DoCmd sunt utilizate pentru a executa actiuni (macro-uri) Microsoft Access din Visual
Basic. De altfel, aceasta este singura utilitate a obiectului DoCmd, acesta neavnd proprietati si evenimente.
Sintaxa este
[application.]Do'm!.method [arg1, arg2, ...]
unde
application este obiectul Application, optional
method este una dintre metodele suportate de obiect
arg1, arg2, ... sunt argumentele metodei selectate.
Omiterea argumentelor care sunt optionale este echivalenta cu acceptarea valorilor implicite ale acestora.
Obiectul DoCmd nu suporta metode care corespund cu actiunile
164
AddMenu.
MsgBox. Se utilizeaza functia MsgBo1.
RunApp. Se utilizeaza functia )3ell pentru a executa alta aplicatie.
RunCode. Se executa functia direct n Visual Basic (instructiunea 'all).
SendKeys. Se utilizeaza instructiunea )en!@e&s.
SetValue. Se stabileste valoarea direct n Visual Basic (instructiunea Let).
StopAllMacros. Se utilizeaza instructiunile )top sau En!.
StopMacro. Se utilizeaza instructiunile E1it )u$ sau E1it 5unction.
ImportantO Pentru o lista completa a actiunilor, care coincide, excepnd cele enumerate, cu lista metodelor
obiectului, se va urma: Eelp 8 Do'm! O$(ect 8 Action 'onstants (lista alfabetica a actiunilor) sau actions.
reference topics (actiuni grupate pe categorii). Pentru explicatii complementare se va urmari att subiectul
privind metoda ct si subiectul privind actiunea sinonima.
Pentru exemplificare prezentam doua metode ale obiectului Do'm!.
Meto!a Open5orm
Se executa din Visual Basic actiunea OpenForm. Sintaxa este
Do'm!%Open5orm formname[, view][, filtername][, wherecondition][, datamode]
[, windowmode][, openargs]
unde
formname este un sir cu numele valid al unei forme din baza de date curenta. Daca se executa codul nre-o
biblioteca, forma se va cauta mai nti n baza de date biblioteca si apoi n baza curenta.
vie este modul de vizualizare Access si poate avea una din valorile: ac2esign, ac1orm2-, acNormal
(default), ac&revie. Valoarea implicita deschide forma n Form view.
filtername este un sir care contine numele valid al unei interogari din baza de date curenta. wherecondition
este un sir care contine o clauza valida WHERE SQL, fara cuvntul WHERE.
datamode este una dintre constantele: ac1orm!dd, ac1orm3dit, ac1orm&roperty-ettings "default#,
ac1orm*ead)nly. Argumentul fixeaza modul de acces la date (adaugare, editare etc.). Argumentele acopera
proprietatile Allo4E!its. Allo4Deletions. Allo4A!!itions si DataEntr& ale formei, proprietatile sunt
considerate n modul implicit (ac1orm&roperty-ettings).
indomode stabileste modul de afisare a ferestrei formei. Poate fi o constanta: ac2ialog (proprietatile Mo!al
si Pop9p ale formei sunt Yes), ac6idden (forma este ascunsa), ac(con (forma este minimizata),
ac+indoNormal (valoarea implicita, forma este afisata potrivit proprietatilor sale).
openargs este un sir utilizat pentru stabilirea proprietatii OpenArgs a formei. Aceasta valoare poate fi utilizata
ulterior de cod (de exemplu ntr-o procedura eveniment). Argumentul este valabil doar n Visual Basic (nu
exista pentru actiunea sinonima Access).
Meto!a Run'omman!
Prin aceasta metoda, aplicabila obiectului Application sau Do'm!, se executa o comanda dintr-un meniu
predefinit sau dintr-o bara de unelte. Sintaxa este
[object.]Run'omman! command
165
unde
object este Application sau Do'm!, optional.
command este o constanta intrinseca specificnd comanda care se executa.
Lista tuturor constantelor admise ca argument de comanda se poate vedea n Help (intrarea RunCommand
Method Constants) sau n Object Browser (Access n lista Project/Library, AcCommand n lista Classes).
Meniurile si barele de unelte construite de utilizator nu pot fi accesate prin metoda Run'omman!.
O$iectul )creen
Obiectul )creen se refera 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 Acti"e5orm pentru a returna o referinta la forma din fereastra activa, fara a sti numele formei.
Obiectul )creen nu poate fi utilizat pentru activarea formei, raportului sau controlului. Acest efect se obtine
prin metoda )electO$(ect a obiectului Do'm!.
Referirea la )creen atunci cnd nu exista nici o forma activa, raport sau control, produce o eroare de
executie.
Proprietatile o$iectului )creen
Tabelul urmator contine proprietatile obiectului )creen.
Proprietatea Descriere
Acti"e'ontrol Returneaza o referinta la controlul care are
focusul.
Acti"eDatas3eet Returneaza o referinta la foaia de date care are
focusul.
Acti"e5orm Returneaza o referinta la forma care are focusul.
Acti"eReport Returneaza o referinta la raportul care are focusul
Application Returneaza o referinta la obiectul Application.
MousePointer Stabileste sau ntoarce valoarea tipului de pointer
al mouse-ului.
Parent Returneaza o referinta la obiectul care contine
obiectul )creen.
Pre"ious'ontrol Returneaza o referinta la controlul care a avut
anterior focusul.
Tipul de pointer poate fi:
166
Valoare E1plicatie
0 (Default) Forma pointerului este determinata
de Microsoft Access
1 Normal Select (Arrow)
3 Text Select (-Beam)
7 Vertical Resize (Size N, S)
9 Horizontal Resize (Size E, W)
11 Busy (Hourglass)
Potrivit celor spuse anterior, utilizarea obiectului )creen trebuie sa implementeze si tratarea erorilor deoarece
daca obiectul asteptat nu are focusul, atunci se produce o eroare. Este de preferat sa se utilizeze mai nti
metoda )et5ocus pentru a focaliza obiectul dorit si apoi sa se utilizeze )creen. Metoda )et5ocus este cea
asociata formei, raportului, controlului tinta. Este interzisa utilizarea obiectului )creen cu metoda Outputo
(care produce iesirea unor date pe o forma, raport etc.) a obiectului Do'm!.
Este de notat ca proprietatea Acti"e5orm si proprietatea Me nu produc n mod necesar aceeasi referinta. Me
reprezinta forma n care se executa curent codul, pe cnd Acti"e5orm returneaza forma activa pe ecran si
care poate fi diferita de cea n care se executa n acel moment cod Visual Basic. De exemplu, un eveniment
Timer poate sa apara pe o forma care nu este activa. n acest caz Me este utilizat pentru a referi forma pe
care se produce evenimentul Timer iar Acti"e5orm se refera la forma activa pe ecran cnd se produce
evenimentul Timer.
Urmatorul exemplu utilizeaza evenimentul Timer pentru a interoga forma activa la intervale regulate de timp.
Forma n care se declanseaza evenimentul poate fi sau nu forma activa.
Private Sub Form_Load ()
Me.Timernterval = 30000
End Sub

Private Sub Form_Timer ()
Const conFormNotActive As nteger = 2475
Const conFormnDesignView As nteger = 2478

On Error GoTo Error_Timer
' reconsulta sursa de date pentru forma activa
Screen.ActiveForm.Requery

Exit_Timer:
Exit Sub

Error_Timer:
f Err = conFormNotActive Or Err = conFormnDesignView Then
Resume Exit_Timer
Else
MsgBox Err & ": " & Err.Description
End f
End Sub
167
O$ser"atie. ntervalul de timp, din proprietatea imerInter"al este n milisecunde, instructiunea
Me.Timernterval = 30000 stabileste prin urmare declansarea evenimentului la fiecare 30 de secunde.
Stabilirea intervalului se efectueaza n procedura evenimentului Load.
168
DAO (Data Access O$(ects) (I)
Lucrul cu o$iectele DAO
Proiectarea bazelor de date n Microsoft Access
Stabilire unei referinte la biblioteca de obiecte DAO
Referirea obiectelor DAO n Visual Basic
Adaugarea de noi obiecte DAO la o colectie
Lucrul cu date externe
Utilizare DAO cu surse de date ODBC
9tili*are Dao cu Microsoft Pet
Obiectul DBEngine
Colectia Workspaces
Metoda CreateWorkspace
Colectia Errors
Colectia Databases
Colectia TableDefs
Colectia Fields
Colectia ndexes
Colectia QueryDefs
Colectia Parameters (obiectul QueryDef)
Colectia Relations (obiectul Database)
Biblioteca de tipuri Microsoft DAO ofera o cale de control a unei baze de date din orice aplicatie care suporta
Visual Basic for Applications. Anumite obiecte DAO reprezinta structura bazei de date iar altele reprezinta
datele nsasi. Prin intermediul obiectelor DAO se pot crea si gestiona baze de date locale sau la distanta ntr-o
multitudine de formate, se poate lucra cu datele lor.
n acest capitol se explica cum se pot programa obiectele DAO din aplicatiile Microsoft Office.
Lucrul cu o$iectele DAO
Obiectele DAO se utilizeaza pentru a lucra n mod programatic cu o baza de date. Principalele actiuni privesc:
crearea unei baze de date, modificarea structurii tabelelor, interogarilor, indexarilor si relatiilor,
regasirea, adaugarea, stergerea sau modificarea datelor din baza,
implementarea securitatii datelor,
lucrul cu date n diferite formate de fisiere si legarea tabelelor din alte baze de date la baza curenta,
conectarea la baze de date pe servere la distanta si construirea de aplicatii client/server.
O$ser"atie. Pentru a utiliza obiectele DAO, trebuie ca la instalarea pachetului Microsoft Office sa se selecteze
si boxa de control Data Access.
Obiectele DAO sunt organizate ntr-o structura ierarhica. Obiectul DBEngine este de nivelul cel mai nalt si
contine toate celelalte obiecte si colectii ale ierarhiei DAO. Urmatorul tabel contine o descriere sumara a
obiectelor.
O$iect Descriere
'onnection Conectarea prin retea la o baza de date Open
Database Connectivity (ODBC).
'ontainer nformatii de securitate pentru diferite tipuri de obiecte
169
ale bazei de date.
Data$ase Baza de date deschisa.
DBEngine Obiectul cel mai de sus al ierarhiei.
Document nformatia de securitate pentru obiecte individuale din
baza de date.
Error nformatii de eroare privind accesul la date.
5iel! Cmp n obiecte a$leDef. Fuer&Def. Recor!set.
In!e1. Relation%
Group Contul grupului n baza curenta.
In!e1 ndexul tabelei.
Parameter Parametru de interogare.
Propert& Proprietate a unui obiect.
Fuer&Def Definitia unei interogari salvate n baza de date.
Recor!set Multime de nregistrari definite de o tabela sau de o
interogare.
Relation Legatura (relatia) dintre doua cmpuri de tabel sau
interogari.
a$leDef Definitia unei tabele salvate n baza de date
9ser Contul utilizatorului n grupul de lucru curent.
2or:space Sesiunea DAO activa.

Proiectarea $a*elor !e !ate Dn Microsoft Access
Desi se pot crea baze de date prin VB cu DAO, uneori, pentru baze de date cu oarecare grad de permanenta,
se poate alege varianta de
a proiecta baza de date n mediul Access destinat pentru asemenea operatiuni si
deschiderea bazei cu DAO din alta aplicatie care suporta Visual Basic.
La crearea unei baze de date n Access, urmatoarele lucruri sunt de retinut.
o Cnd se deschide un fisier .mdb creat n Access din alta aplicatie, nu se poate lucra cu forme,
rapoarte, macro-uri sau module Access. Formele si rapoartele trebuiesc proiectate,
deasemenea si codul VB, n aplicatia unde se lucreaza.
170
o Daca se scrie cod pentru procesarea unei baze de date n Access, codul respectiv nu se va
executa n mod necesar si la copierea n modulele altei aplicatii. Pentru executie trebuie, n
acest caz, sa se elimine/nlocuiasca toate entitatile specifice Access-ului (obiecte, metode,
proprietati sau functii).
o n Access se utilizeaza functia 'urrentD$ pentru a returna o referinta la baza de date curent
deschisa n fereastra Access. Se poate utiliza DAO pentru a lucra cu aceasta baza. Daca se
copie acest cod n alta aplicatie care are Visual Basic, se va modifica textul sursa nct sa se
utilizeze metoda OpenData$ase a obiectului 2or:space.
o Microsoft Access creeaza proprietati suplimentare ale obiectelor DAO. Atunci cnd se formeaza
o baza cu DAO n Visual Basic si aceasta baza este deschisa ulterior n microsoft Access, se
pot observa si alte proprietati adaugate obiectelor. Aceste proprietati sunt si ele enumerate n
colectia Properties a obiectului DAO.
)ta$ilirea unei referinte la $i$lioteca !e o$iecte DAO
Referinta se poate realiza n mod automat, de exemplu de catre Microsoft Access, sau manual prin
succesiunea uzuala: Visual Basic Editor meniul ools References selectare Microsoft DAO Q%R O$(ect
Li$rar&. Dupa stabilirea referintei se pot vedea obiectele DAO n Object Browser selectnd DAO n lista
Pro(ectALi$rar&.
Pentru anumite probleme de compatibilitate, pentru proiectele mai vechi, se poate referi Microsoft DAO
S%RAQ%R compatibility library. Proba completa pentru a vedea daca este nevoie de referirea bilbiotecii de
compatibilitate este compilarea codului sub DAO 3.5. Daca nu exista erori rezulta ca nu este necesara
biblioteca de compatibilitate.
Referirea o$iectelor DAO Dn Visual Basic
Obiectele DAO pot fi referite n cod n acelasi mod ca orice alt obiect. Deoarece obiectul DBEngine nu are o
colectie, poate fi referit direct. Celelalte obiecte se vor referi n cadrul colectiilor unde apartin si potrivit locului
din ierarhia deobiecte.
Fiecare obiect poate fi referit ntr-o colectie
prin valoarea proprietatii /ame a obiectului respectiv sau
prin numarul de ordine din colectie. Obiectele DAO sunt indexate plecnd cu 0.
Exemple:
Databases("Salariati")
Databases(0)
Referirea unui obiect Data$ase n cod se realizeaza si prin pozitionarea n ierarhie:
Dim dbs As Database
Set dbs = DBEngine.Workspaces(0).Databases(0)
prin care se obtine o referinta la prima baza de date (indicele 0 din colectia Data$ases) din prima zona de
lucru (indicele 0 din colectia 2or:spaces), zona implicita. De notat ca daca se lucreaza ntr-o aplicatie diferita
de Access, atunci trebuie sa se deschida o baza de date cu metoda OpenData$ase mai nainte de a rula
codul precedent.
Pentru aplicatiile diferite de Access, calificarea obiectelor poate produce mai multa claritate, plus certitudinea
referii corecte:
171
Dim dbs As DAO.Database
A!augarea !e noi o$iecte DAO la o colectie
Dupa cum s-a precizat deja, anumite obiecte DAO reprezinta structura bazei de date, celelalte oferind mijloace
de lucru cu datele din baza. Obiectele care reprezinta structura bazei sunt salvate o data cu baza. n general,
obiectele utilizate n lucrul cu datele din baza nu sunt salvate ci sunt create de fiecare data cnd este nevoie
de ele.
Crearea unui nou obiect DAO care trebuie salvat cu baza de date se va completa cu utilizarea metodei
Appen! a colectiei asociate de obiecte salvate.
Exemplul urmator da o imagine despre acest proces. Exmplul creeaza un nou obiect a$leDef (care
reprezinta o noua tabela) cu un nou obiect 5iel! (care reprezinta un cmp din noua tabela). Obiectul 5iel!
creat se adauga la colectia 5iel!s a noii tabele iar noul obiect a$leDef este adaugat la colectia a$leDefs a
obiectului Data$ase care reprezinta baza de date deschisa.
Function AddTable () As Boolean
' declaratii
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("Archivednvoices")
Set fld = tdf.CreateField("Orderd", dbLong)

' adaugarea la colectiile adecvate, care se salveaza
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
O$ser"atie. n Access se va utiliza CurrentDb pentru a returna o referinta la baza de date curenta deschisa.
Lucrul cu !ate e1terne
Se poate utiliza DAO pentru lucrul cu diferite formate de baze de date. Exista trei mari categorii de formate de
baze de date accesibile prin DAO.
Prima categorie este caracterizata de formatul Microsoft Jet. Se poate utiliza DAO cu toate bazele de date
create cu Microsoft Jet, incluznd cele create n Microsoft Access, Microsoft Visual Basic, Microsoft Visual C+
+ si Microsoft Excel.
172
A doua categorie este caracterizata de formatul SAM instalabil. Un driver SAM care se poate instala este un
driver care ofera acces la formate de baze de date externe prin DAO si Microsoft Jet. La instalarea aplicatiei
se poate cere instalarea oricarui driver pentru formatele:
Microsoft FoxPro
dBase
Paradox
Microsoft Excel
Microsoft Exchange/Outlook
Lotus 1-2-3
Date tabelare n fisiere 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 si mai mari, necesita un
driver ODBC. Adesea o sursa de baze ODBC este pe un server de retea, adica ODBC este util pentru
dezvoltarea aplicatiilor client/server. Urmatoarea sectiune trateaza subiectul mai pe larg.
9tili*are DAO cu surse !e !ate ODB'
Exista doua moduri diferite de utilizare DAO cu ODBC: prin Microsoft Jet, sau prin noua tehnologie numita
ODBCDirect.
Daca se lucreaza cu o baza de date creata cu Microsoft Jet database engine sau ntr-un format extern
suportat de un driver instalabil SAM, toate operatiunile DAO sunt procesate prin Microsoft Jet.
Daca se lucreaza cu o sursa de date ODBC, operatiunile DAO se pot procesa fie prin Microsoft Jet, fie prin
ODBCDirect care ocoleste motorul Microsoft Jet si lucreaza direct cu datele n sursa ODBC. Alegerea este n
functie de tipul de operatiuni efectuate.
Se poate utiliza DAO cu Microsoft Jet, pentru surse ODC, atunci cnd 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 cnd se executa interogari sau proceduri memorate pe un server
back_end cum ar fi Microsoft SQL Server, sau cnd aplicatia client unde se lucreaza necesita capacitatile
specifice ODBC cum ar fi actualizari n loturi sau interogari asincrone. ODBC poate efectua anumite operatiuni
client/server mult mai repede.
Deoarece nu toate posibilitatile DAO sunt accesibile cu ODBCDirect, Microsoft DAO mai suporta nca ODBC
prin Microsoft Jet. Se poate astfel utiliza ODBC prin Microsoft Jet, prin ODBCDirect, sau prin ambele cu o
singura sursa de date ODBC.
Metoda care este utilizata n accesarea unei surse ODBC este determinata de tipul spatiului de lucru n care
se lucreaza. Un spatiu de lucru, reprezentat printr-un obiect Workspace, este o sesiune deschisa pentru un
cont utilizator particular. O sesiune marcheaza o succesiune de operatii efectuate de motorul de baze de date,
ncepe cu intrarea (log on) utilizatorului si se termina la iesirea utilizatorului (log off). Operatiunile pe care un
utilizator le poate executa n timpul unei sesiuni sunt determinate de drepturile conferite acelui utilizator. Daca
nu se specifica tipul spatiului de lucru, DAO creeaza un spatiu n mod implicit.
Cu DAO 3.5 se poate crea oricare dintre cele doua spatii de lucru pentru operatii ODBC. n spatiul Microsoft
Jet se utilizeaza accesul prin Jet, n spatiul ODBCDirect se va utiliza cealalta posibilitate. Fiecare spatiu de
lucru are propriul model de obiecte si vor fi prezentate n continuarea capitolului.
173
9tili*are DAO cu Microsoft Pet
Spatiile de lucru Microsoft Jet includ obiecte pentru definirea structurii bazei de date, cum ar fi a$leDef,
Fuer&Def. 5iel!. In!e1. Parameter si Relation. Alte obiecte, cum ar fi Recor!set, sunt utile pentru
procesarea datelor din baza. O a treia categorie de obiecte, cum ar fi 9ser, Group, 'ontainer si Document,
servesc pentru asigurarea securitatii datelor.
Pentru a vedea ntreaga ierarhie de obiecte pentru spatiul 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".
n schema urmatoare este prezentata doar partea superioara a ierarhiei. La prezentarea fiecarui obiect se vor
aduce unele explicatii suplimentare.
Se observa ca obiectul de nivel cel mai nalt, DBEngine, nu apartine unei colectii, deci poate fi referit direct.
Toate celelalte obiecte sunt referite prin colectia la care apartin. Sagetile fara obiect terminal puncteaza catre
structuri nereprezentate n figura.
O$iectul DBEngine
Obiectul DBEngine, de nivel maxim n ierarhia de obiecte DAO, este obiectul implicit al modelului, astfel nct
mentionarea lui explicita poate fi omisa n multe situatii.
Pe nivelul imediat inferior al ierarhiei se gasesc doua colectii: 2or:spaces spatiile de lucru, Errors erorile
aparute n timpul unei operatiuni DAO. Colectia 2or:spaces este implicita si referinta la ea poate fi omisa.
O referinta la primul obiect 2or:space din colectia 2or:spaces poate fi obtinuta prin una din instructiunile
Set wrk = DBEngine.Workspaces (0)
Set wrk = DBEngine (0)
Set wrk = Workspaces (0)
n care se observa prezenta optionala a obiectelor implicite.
Proprietatile obiectului DBEngine sunt prezentate n tabelul urmator.
Proprietatea Descriere
Default&pe Long, determina tipul spatiului de lucru:
db4se:et Microsoft Jet database engine
db4se)2'0 ODBC data source
Default9ser.
DefaultPass4or!
Siruri, numele utilizatorului si parola
IniPat3 Sir, informatia despre cheia din Windows Registry
care contine valorile pentru Microsoft Jet database
engine (numai spatiile de lucru Microsoft Jet).
174
Loginimeout ntreg, timpul ct se asteapta intrarea unu
utilizator.
)&stemDB Sir, calea pentru localizarea curenta a fisierului cu
informatia despre grupurile de lucru, orkgroup
(doar spatii Microsoft Jet).
Version Sir, informatii despre versiunea DAO.
Daca nu se creeaza un obiect 2or:space specific, un asemenea obiect este creat n mod automat de DAO
atunci cnd este necesar. Atributele implicite ale acestui spatiul sunt Default9ser egal cu Admin iar
DefaultPass4or! egal cu sirul vid "".
n mod implicit, proprietatea Default&pe are valoarea dbUseJet si spatiul de lucru este Microsoft Jet.
Proprietatea poate fi acoperita pentru un spatiu particular prin tipul precizat la crearea acestuia.
Metodele obiectului DBEngine sunt
Meto!a Descriere
Beginrans.
'ommitrans.
Roll$ac:
Metodele care controleaza efectuarea tranzactiilor.
'ompactData$ase.
RepairData$ase
Compactarea bazei de date, refacerea unei baze
deteriorate.
'reateData$ase.
'reate2or:space
Crearea unei baze de date sau a unui spatiu de
lucru.
I!le Suspenda procesarea datelor din baza
Open'onnection.
OpenData$ase
Deschide si returneaza o referinta la un obiect
'onnection, respectiv Data$ase.
RegisterData$ase Completeaza n Windows Registry informatia
ODBC.
)etOption nlocuieste temporar valorile din Windows Registry
pentru spatiile Microsoft Jet
Unele metode sunt prezentate n continuare. Pentru mai multe informatii despre functiuni si parametri se vor
vedea intrarile respective din DAO Help.
'olectia 2or:spaces
Obiectul DAO 2or:space defineste o sesiune pentru un utilizator, bazata pe permisiunile (drepturile)
utilizatorului. Se utilizeaza obiectul 2or:space pentru a gestiona sesiunea curenta. 2or:space contine
bazele de date deschise si ofera mecanismul necesar tranzactiilor si securitatii aplicatiei. Colectia
2or:spaces contine toate obiectele active 2or:space din DBEngine, care au fost adaugate colectiei.
175
La nceputul lucrului cu obiecte DAO din Visual Basic, DAO creeaza n mod automat un spatiu implicit.
Referirea la acesta se realizeaza prin
Dim wrk As Workspace
Set wrk = Workspaces (0)
adica se refera primul obiect din colectie.
Spatiile de lucru DAO pot fi partajate sau ascunse. Un spatiu este ascuns pna cnd utilizatorul l marcheaza
drept partajat prin adaugarea obiectului 2or:space la colectia 2or:spaces. Dupa adaugare, spatiul este
accesat prin intermediul colectiei. Un obiect 2or:space necesar doar pentru o procedura particulara se poate
crea dar fara adaugarea la colectia 2or:spaces.
Dupa cum s-a mai spus, exista doua tipuri de obiecte 2or:space: Microsoft Jet si 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 SAM instalabile si surse de date ODBC. ntr-un spatiu ODBCDirect, se poate
utiliza DAO pentru a accesa date din surse ODBC fara a trece prin motorul Jet. ntr-o aceeasi aplicatie se
poate lucra cu ambele tipuri de spatii de lucru.
'rearea unui spatiu Microsoft Pet
Se utilizeaza metoda 'reate2or:space a obiectului DBEngine. Exemplul urmator utilizeaza constanta de tip
!$9sePet. Daca proprietatea Default&pe este fixata pe !$9sePet, atunci argumentul de tip nu este necesar
si se creeaza n mod automat un spatiu Microsoft Jet.
Dim wrk As Workspace
Set wrk = CreateWorkspace("JetWorkSpace", "Admin", "", dbUseJet)
noul spatiu fiind pentru utilizatorul Admin si fara parola.
Noul spatiu de lucru nu este adaugat n mod automat la colectia 2or:spaces, pentru aceasta se va utiliza
metoda Appen! a colectiei. Acest lucru este necesar atunci cnd spatiul nou definit este utilizat si n afara
procedurii unde a fost creat.
Meto!a 'reate2or:space (o$iectul DBEngine)
Sintaxa
Set workspace = 'reate2or:space(name, user, password, type)
unde
orkspace este o variabila obiect care reprezinta obiectul 2or:space care se creeaza.
name este sirul care contine numele unic al obiectului. ncepe cu o litera, are lungimea maxima 20.
user identifica proprietarul noului obiect 2or:space.
passord contine parola pentru noul obiect 2or:space, un sir pna la 14 caractere cu exceptia lui null.
type este optional si stabileste tipul spatiului (!$9sePet, !$9seODB')
176
Dupa utilizarea metodei este creat obiectul 2or:space, ncepe o noua sesiune si obiectul poate fi referit n
cod. Obiectele 2or:space nu sunt permanente, nu se pot salva iar proprietatea /ame nu mai poate fi
modificata dupa trecerea obiectului n colectia 2or:spaces.
Daca tipul este stabilit la !$9seODB' si nu exista deja create spatii Jet, atunci motorul Jet nu este ncarcat n
memorie si toata activitatea se efectueaza cu sursa de date ODBC identificata n obiectul 'onnection.
Pentru a elimina un obiect 2or:space din colectia 2or:spaces, se nchid toate bazele de date si conexiunile
si apoi se utilizeaza metoda 'lose a obiectului 2or:space.
'olectia Errors (o$iectul DBEngine)
Un obiect Error contine informatia despre o eroare aparuta n timpul unei operatiuni DAO. Aparitia mai multor
erori n aceeasi operatiune se reflecta n obiecte Error distincte, multimea acestora formnd colectie Errors.
Atunci cnd o noua operatiune genereaza o eroare, colectie Errors este golita si completata cu noile erori.
Operatiunile DAO care nu genereaza erori nu au efect asupra colectiei Errors.
Erorile sunt indexate n colectie n ordinea crescatoare a nivelelor de eroare. Nivelul cel mai nalt (deci ultimul
obiect din colectie) este eroare raportata de VBA, identica cu eroarea raportata de obiectul VBA Err.
Colectia Errors are:
proprietatea 'ount, care da numarul elementelor din colectie
metoda Refres3, care actualizeaza colectia potrivit situatiei curente.
Obiectul Error nu are dect proprietatile (nu contine metode sau colectii)
Description, sirul care contine descrierea erorii
Eelp'onte1t, este un Long cu identificatorul de context din fisierul Help asociat
Eelp5ile, contine calea completa catre fisierul Help
/um$er, numarul (Long) al erorii. Pentru o lista completa se va vedea intrarea /rappable 5icrosoft :et
and 2!) 3rrors din Help.
)ource, un sir continnd numele obiectului sau aplicatiei care a generat eroarea.
'olectia Data$ases
Obiectul Data$ase reprezinta o baza de date deschisa. Aceasta poate fi o baza Jet sau o sursa externa de
date. Colectia Data$ases contine toate bazele de date deschise curent.
Situarea n ierarhie este
O$iectul sau
colectia
Este continut Dn 'ontine
Data$ase (obiect) Colectia
Data$ases
Colectia 'ontainers
Colectia Fuer&Defs
Colectia Properties
Colectia Recor!sets
177
Colectia Relations
Colectia a$leDefs
Data$ases
(colectie)
Obiectul
2or:space
Obiecte Data$ase
Desc3i!erea unei $a*e !e !ate
Metoda OpenData$ase, a obiectului DBEngine sau a obiectului 2or:space, deschide o baza de date si
returneaza o referinta la obiectul care o reprezinta. Utilizarea metodei cu obiectul DBEngine deschide baza de
date n spatiul de lucru implicit, ca n exemplul urmator
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 prelucreaza nregistrarile 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 utilizeaza functia 'urrentD$ pentru a returna o referinta la baza de date curenta.
Metoda OpenData$ase se utilizeaza pentru deschiderea altei baze de date dect cea curent deschisa sau
pentru a deschide baze n spatiul de lucru ODBCDirect.
Dim dbs As Database
Set dbs = CurrentDb
Debug.Print dbs.Name
'rearea cu DAO a !uplicatelor unei $a*e !e !ate (database replicas)
Diferite necesitati de arhivare sau de lucru n retea impun crearea si gestionarea unor copii ale unei baze de
date. Una dintre copii este desemnata drept Design Master, celelalte copii find denumite duplicate sau replici.
Replicile pot fi mentinute pe aceeasi masina sau pe masini diferite.
Adaugarea, modificarea sau stergerea obiectelor se poate efectua doar n Design Master. Datele pot fi
modificate n Design Master si n orice replica a bazei de date. Atunci cnd un utilizator modifica date dintr-o
178
baza duplicata, utilizatorii celorlalte replici pot sa-si sincronizeze replicile, astfel nct aceleasi date sa fie n
toate copiile.
Se poate utiliza DAO pentru a face o baza replicabila, pentru a crea replici, le sincroniza si gestiona multimea
replicilor. Se pot crea, de asemenea, replici partiale care contin doar o submultime de nregistrari dintr-o
replica totala. Utilizarea replicilor partiale permite sincronizarea unei replici doar cu datele necesare si nu cu
ntreaga baza de date.
Pentru ca o baza de date sa admita replici trebuie sa se fixeze proprietatea Replica$le sau proprietatea
Replica$leBool a obiectului Data$ase corespunzator. Aceste proprietati nu exista pentru obiectul Data$ase
pna cnd nu sunt create prin metoda 'reatePropert& si adaugate la colectia Properties. Dupa permiterea
replicarilor, crearea unei baze duplicat se realizeaza prin metoda Ma:eReplica.
Diferenta dintre proprietatile Replica$le si Replica$leBool este de valori: prima are o valoare sir, a doua o
valoare logica.
Urmatorul exemplu creeaza manual o copie a bazei de date, o face replicabila si creeaza o replica a bazei.
Function ReplicateDatabase (strDBName As String) As Boolean
Dim dbs As Database, prp As Property
Dim strBackup As String, strReplica As String
Const conPropNotFound As nteger = 3270
On Error GoTo Err_ReplicateDatabase
f nStr(strDBName, ".mdb") > 0 Then
strBackup = Left(strDBName, Len(strDBName) - 4)
Else
strBackup = strDBName
End f

strReplica =strBackup & "Replica" & ".mdb"
f MsgBox("Make backup copy of file?", vbOKCancel) = vbOK Then
strBackup = strBackup & ".bak"
FileCopy strDBName, strBackup
MsgBox "Copied file to " & "strBackup"
End f

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:
f Err = conPropNotFound Then
Set prp = dbs.CreateProperty("ReplicableBool", dbBoolean, True)
dbs.Properties.Append prp
Resume Next
Else
MsgBox "Error " & ": " & Err.Description
End f
179
ReplicateDatabase = False
Resume Exit_ReplicateDatabase
End Function
'olectia a$leDefs
Un obiect a$leDef reprezinta definitia memorata a unei tabele din baza sau a unei tabele legate din spatiul
de lucru Microsoft Jet. Toate obiectele a$leDef memorate ntr-o baza de date formeaza colectia a$leDefs%
Relatiile din ierarhie sunt
O$iectul sau
colectia
Este continut Dn 'ontine
a$leDef (obiect) Colectia a$leDefs Colectia 5iel!s
Colectia In!e1es
Colectia Properties
a$leDefs
(colectie)
Obiectul Data$ase Obiecte a$leDef
'rearea prin co! a unei ta$ele
Metoda de creare este 'reatea$leDef a obiectului Data$ase. Dupa crearea unui nou obiect a$leDef. dar
nainte de adaugarea la baza, trebuie sa se defineasca unul sau mai multe cmpuri pentru tabela definita.
Sintaxa metodei 'reatea$leDef este
)et tabledef = database.'reatea$leDef (name, attributes, source, connect)
unde
tabledef este o variabila obiect reprezentnd obiectul a$leDef care se creeaza.
database este o variabila obiect reprezentnd obiectul Data$ase unde se doreste crearea noului obiect.
name este un sir optional, care contine denumirea tabelei.
attributes este o constanta sau o combinatie de constante indicnd caracteristici ale tabelei. Lista este n Help
- a$leDef object - Attri$utes Property.
source este un Variant (subtip String), optional. Contine numele tabelei n baza de date externa care este
sursa datelor. Sirul devine proprietatea )ourcea$le/ame a noului obiect.
connect, un Variant (subtip String), optional. Contine informatia despre sursa unei baze deschise, o baza de
date utilizata ntr-o interogare pass-through, sau o tabela legata. La proprietatea 'onnect se pot gasi mai
multe informatii.
Argumentele care se omit la crearea tabelei se vor asigna prin proprietati nainte de adaugarea obiectului la
colectie. Dupa aceea nu mai sunt disponibile toate proprietatile.
Pentru eliminarea unui obiect TableDef se utilizeaza metoda Delete a colectiei TableDefs.
180
Urmatorul exemplu realizeaza crearea unei tabele pentru baza de test Northwind.
Function CreateErrorsTable () As Boolean
Dim dbs As Database, tdf As TableDef, fld As Field, idx As ndex
Dim rst As Recordset, intCode As nteger, strErr As String
Const conAppObjErr = "Application-defined or object-defined error"

' creeaza tabela Errors cu cmpurile ErrorCode si ErrorString
Set dbs = CurrentDb

On Error Resume Next
' stergerea unei tabele Errors existente
dbs.TableDefs.Delete "Errors"

On Error GoTo Error_CreateErrorsTable
' crearea tabelei
Set tdf = dbs.CreateTableDef("Errors")
' creare cmpuri
Set fld = tdf.CreateField("ErrorCode", dbnteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("ErrorString", dbMemo)
tdf.Fields.Append fld

' creare index
Set idx = tdf.Createndex("ErrorCodendex")
Set fld = idx.CreateField("ErrorCode")
With idx
.Primary = True
.Unique = True
.Required = True
End With
idx.Fields.Append fld
tdf.ndexes.Append idx

' deschidere recordset n tabela Errors
Set rst = dbs.OpenRecordset("Errors")
' stabilirea indexului pentru recordset
rst.ndex = "ErrorCodendex")

' aratarea pointerului clepsidra
DoCmd.Hourglass True

' ciclarea n codurile de eroare
For intCode = 1 To 32767
On Error Resume Next
strErr = ""
' tentativa de aparitie a une erori
Err.Raise intCode
' verificarea daca eroarea este VBA, DAO sau Access
' daca eroarea nu este VBA, atunci proprietatea Description a obiectului
'Err contine textul "Application-defined or object-defined error"
f Err.Description <> conAppObjErr Then
strErr = Err.Description
' se utilizeaza metoda AccessError pentru returnarea sirului descriptiv
' pentru erorile DAO si Access.
181
Elsef AccessError(intCode)<>conAppObjErr Then
strErr = AccessError(intCode)
End f

' daca numarul de eroare are un sir descriptiv, se adauga la tabela definita
f Len(strErr) > 0 Then
'Adaugarea noii nregistrari la recordset
rst.AddNew
' adaugarea numarului erorii la tabela
rst!ErrorCode = intCode
' adaugarea sirului descriptiv
rst!ErrorString.AppendChunk strErr
' actualizare nregistrare
rst.Update
End f
Next intCode

DoCmd.Hourglass False
' nchidere recordset
rst.Close
MsgBox "Errors table created"
' aratarea noii tabele n fereastra Database (din Access)
RefreshDatabaseWindow

CreateErrorsTable = True

Exit_CreateErrorsTable:
Exit Function

Error_CreateErrorsTable:
MsgBox Err & ": " & Err.Description
CreateErrorsTable = False
Resume Exit_CreateErrorsTable
End Function
Legarea unei ta$ele la o $a*a !e !ate
Pentru a utiliza ntr-o baza de date tabele dintr-o sursa de date externa, aceasta trebuie legata la baza de
date. Se pot lega tabele care sunt n alta baza de date Microsoft Jet, sau tabele din alte programe si formate
de fisiere, cum ar fi Microsoft Excel, dBase, Microsoft FoxPro etc. Acest mod este mai eficient dect sa se
deschida baza de date externa direct, mai ales daca tabela vine dintr-o sursa de date ODBC.
Pentru a lega o tabela la o baza de date, se utilizeaza metoda 'reatea$leDef pentru a crea o noua tabela.
Dupa aceea se specifica valorile pentru proprietatile 'onnect si )ourcea$le/ame ale noului obiect creat.
Se poate stabili de asemenea proprietatea Attri$utes. n final se adauga tabela la colectia a$leDefs.
Urmatorul exemplu leaga o foaie de calcul Excel 8.0 ca o tabela la o baza de date. nainte de executarea unui
astfel de exemplu trebuie sa ne convingem ca pe sistem este instalat driverul Microsoft Excel SAM
(Msexcl35.dll). Acest driver permite fisierelor Excel 97 sa lucreze cu Microsoft Jet database engine.
Function LinkExcelTable() As Boolean
Dim dbs As DAO.Database, tdf As DAO.TableDef

Const errNoSAM As nteger = 3170
Const conPath As String = _
182
"C:\Program Files . \Northwind.mdb"

On Error GoTo Err_LinkExcelTable
' returneaza o referinta la baza de date Northwind
Set dbs = OpenDatabase(conPath)
' creeaza un nou obiect TableDef
Set tdf = dbs.CreateTableDef("LinkedTable")
' specifica domeniul care este tabela sursa
tdf.SourceTableName = "DataRange"
' specifica sirul de conectare
tdf.Connect = "EXCEL 8.0; DATABASE=C:\My Documents\XLTable.xls"
' adaugarea noului obiect la colectie
dbs.TableDefs.Append tdf
LinkExcelTable = True

Exit_LinkExcelTable:
Exit Function

Err_LinkExcelTable:
f Err = errNoSAM Then
Dim strErr As String
strErr = Err & ": " & Err.Description
strErr = strErr _
& " You may not have the SAM driver installed properly ."
MsgBox strErr, vbOKOnly, "Error!"
Else
MsgBox "Error " & Err & ": " & Err.Description
End f
End Function
'olectia 5iel!s
n spatiul de lucru Microsoft Jet, obiectul Field reprezinta un cmp dintr-o tabela, interogare, index, relatie sau
recordset. Colectie 5iel!s contine toate obiectele 5iel! asociate, respectiv, obiectele a$leDef. Fuer&Def.
In!e1. Relation sau Recor!set%
Localizarea n ierarhia de obiecte este
O$iectul sau
colectia
Este continut Dn 'ontine
5iel! (obiect) Colectia 5iel!s Colectia Properties
5iel!s (colectie) Obiectul a$leDef
Obiectul In!e1
Obiectul Fuer&Def
Obiectul Recor!set
Obiectul Relation
Obiecte 5iel!
183
Colectia 5iel!s este colectia implicita a unui obiect a$leDef. Fuer&Def. In!e1. Relation sau Recor!set.
ceea ce nseamna ca nu trebuie facuta o referinta la colectie n mod explicit. De exemplu, urmatoarele
instructiuni returneaza o referinta la cmpul 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 colectia 5iel!s a unui obiect a$leDef. Fuer&Def. In!e1 sau Relation, obiectul 5iel! este o unitate
structurala. El reprezinta o coloana dintr-o tabela, avnd un tip particular de date. Daca se creeaza o baza de
date n Microsoft Access, se pot crea cmpuri pentru toate aceste obiecte si sa se fixeze proprietatile lor n
mediul Access si nu este necesara utilizarea programarii n acest scop.
ntr-un obiect Recor!set, un obiect 5iel! contine date si poate fi utilizat pentru a citi date dintr-o nregistrare
sau scrie date ntr-o nregistrare. n interfata utilizator Access nu se poate lucra, totusi, cu cmpurile obiectului
Recor!set; trebuie sase faca apel la DAO.
Colectia 5iel!s a obiectului a$leDef contine toate cmpurile definite. Pentru un obiect Fuer&Def, colectia
contine toate cmpurile incluse n interogare din una sau mai multe tabele. Colectia 5iel!s a obiectului In!e1
include cmpurile pentru care este definit indexul.
Pentru un obiect Relation, colectia contine cmpurile implicate n relatie. Tipic, exista doua cmpuri n colectia
5iel!s: unul care este cheia primara, specificat de proprietatea a$le a obiectului Relation; al doilea este
cmpul extern corespunzator, din tabela specificata de proprietatea 5oreigna$le a obiectului Relation%
Colectia 5iel!s a obiectului Recor!set contine cmpurile specificate n argumentul source a metodei
OpenRecor!set. Argumentul source specifica sursa nregistrarilor pentru noul obiect Recor!set si poate fi un
nume de tabela, nume de interogare sau o instructiune SQL care returneaza nregistrari.
Proprietatea Value a obiectului 5iel! se aplica doar unui obiect din colectia 5iel!s a unui obiect Recor!set.
Proprietatea returneaza valoare datei memorate n acel cmp n nregistrarea curenta. Deoarece Value este
proprietatea implicita a obiectului 5iel! iar 5iel!s este colectia implicita a obiectului Recor!set, se poate
returna valoarea unui cmp fara a specifica explicit fie 5iel!s, fie Value. Exemplul urmator 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")
' referinta explicita la colectie si valoare
Debug.Print rst.Fields("LastName").Value
' referinta explicita la valoare
Debug.Print rst!FirstName.Value
' referinte implicite
Debug.Print rst!Title
'olectia In!e1es
184
Un obiect In!e1 reprezinta un index dintr-o tabela a bazei de date, n spatiul de lucru Microsoft Jet. Colectia
In!e1es contine toate obiectele In!e1 definite pentru o tabela particulara.
Pozitia n ierarhia de obiecte este urmatoarea:
O$iectul sau
colectia
Este continut Dn 'ontine
In!e1 (obiect) Colectia In!e1es Colectia 5iel!s
Colectia Properties
In!e1es (colectie) Obiectul a$leDef Obiecte In!e1
Un index mareste viteza de cautare si sortare a tabelei. Se poate mbunatati performanta interogarii bazei de
date prin indexarea cmpurilor pe ambele parti ale jonctiunilor, cmpuri care sunt sortate, sau cmpuri care
sunt utilizate drept criterii de interogare. Totusi, indexurile pot sa mareasca dimensiunea bazei si sa
ncetineasca performanta cnd se actualizeaza cmpuri indexate, cnd se adauga sau se elimina date.
Performanta poate fi redusa si n cazul aplicatiilor multiuser. Din aceste motive utilizarea indexurilor va fi
facuta cu atentie.
Un index specifica ordinea n care nregistrarile sunt accesate din tabelele bazei de date ntr-un obiect
Recor!set de tip tabela.
Pentru a crea un index cu DAO, operatiune posibila pentru unul sau mai multe cmpuri, trebuie
o metoda 'reateIn!e1 pentru obiectul a$leDef.
o metoda 'reate5iel! pentru obiectul In!e1 cu scopul creerii unui obiect 5iel! pentru fiecare
cmp (coloana) care se include n obiectul In!e1.
o Stabilirea proprietatilor obiectului In!e1.
o Metoda Appen! pentru fiecare obiect 5iel! care se adauga la colectia 5iel!s.
o Metoda Appen! pentru adaugarea noului obiect In!e1 la colectia In!e1es.
Urmatorul exemplu este ilustrativ.
Sub SeekRecord ()
Const conPath As String = _
"C:\Program Files\ . \Northwind.mdb"
Dim dbs As Database, tdf As TableDef, idx As ndex
Dim fld As Field, fldLast As Field, fldFirst As Field
Dim rst As Recordset

' returnarea unei referinte la baza de date Northwind
Set dbs = DBEngine().OpenDatabase(conPath)
' returnarea unei referinte la tabela Employees
Set tdf = dbs.TableDefs("Employees")
' crearea unui index nou pe cmpurile LastName si FirstName
Set idx = tdf.Createndex("FirstLastName")
' crearea cmpurilor din index
Set fldLast = idx.CreateField("LastName", dbText)
Set fldFirst = idx.CreateField("FirstName", dbText)
' adaugarea obiectelor Field
185
idx.Fields.Append fldLast
idx.Fields.Append fldFirst
' fixarea proprietatii Required
idx.Required = True
' adaugarea noului obiect index
tdf.ndexes.Append idx
' deschiderea recordset-ului de tip tabela
Set rst = dbs.OpenRecordset("Employees")
' fixarea proprietatii ndex a obiectului Recordset
rst.ndex = idx.Name
' efectuarea operatiunii de cautare
rst.Seek "=", "King", "Robert"
' tiparirea valorilor tuturor cmpurilor cu exceptia cmpului Photo
For Each fld n rst.Fields
f fld.Type <> dbLongBinary Then
Debug.Print fld
End f
Next fld
End Sub
O$ser"atie. n mediul Microsoft Access se poate lucra cu multimea indexurilor n meniul Vie4, comanda
In!e1es.
'olectia Fuer&Defs
Printr-o interogare ntelegem o operatiune, formalizata, prin care este returnata o multime de nregistrari care
satisfac cerinte impuse sau se executa o actiune specifica asupra unei multimi de nregistrari selectate dupa
cerintele din interogare.
Un obiect Fuer&Def reprezinta o interogare n DAO. Obiectele Fuer&Def pot fi salvate cu baza de date n
Microsoft Jet sau pot fi temporare n ODBCDirect si Jet.
Relatiile n ierarhia de obiecte DAO sunt
O$iectul sau
colectia
Este continut Dn 'ontine
Fuer&Def (obiect) Colectia Fuer&Defs Colectia 5iel!s
Colectia Parameters
Colectia Properties
Fuer&Defs (colectie) Obiectul Data$ase Obiecte Fuer&Def
Obiectele Fuer&Def ofera:
folosirea proprietatii )FL pentru a fixa sau returna definitia interogarii;
folosirea colectiei Parameters pentru a fixa sau returna parametrii interogarii;
utilizarea proprietatii &pe pentru a determina daca interogarea selecteaza nregistrarile dintr-o tabela
existenta, creeaza o noua tabela etc.;
utilizarea proprietatii Ma1Recor!s pentru a limita numarul de nregistrari returnate de o nregistrare;
folosirea proprietatii ODB'imeout pentru a indica timpul de asteptare a rezultatului unei interogari.
186
n spatiul de lucru Microsoft Jet mai sunt posibile:
utilizarea proprietatii ReturnRecor!s pentru a indica, la interogari prin SQL, returnarea de nregistrari;
utilizarea proprietatii 'onnect pentru a realiza o interogare a unei baze ODBC prin SQL.
n spatiul ODBCDirect sunt specifice
utilizarea proprietatii Prepare pentru a determina daca se invoca ODBC SQLPrepare AP la
executarea interogarii;
utilizarea proprietatii 'ac3e)i*e pentru depozitarea (cache) nregistrarilor returnate de interogare.
Obiectele Fuer&Def temporare nu sunt salvate pe disc si nu sunt adaugate la colectia Fuer&Defs. n general,
interogarile temporare sunt utile atunci cnd frazele SQL sunt create, repetat, n timpul executiei.
Un obiect Fuer&Def permanent din spatiul Jet poate fi gndit ca o instructiune SQL compilata. Astfel,
interogarea este mai rapida dect o instructiune SQL executata prin metoda OpenRecor!set%
Pentru a crea un obiect Fuer&Def se utilizeaza metoda 'reateFuer&Def%
n spatiul Jet, daca se precizeaza numele noului obiect se creeaza un obiect Fuer&Def permanent si care
este adaugat automat la colectia Fuer&Defs si salvata n disc. Daca se da implicit sau explicit un nume vid, "",
atunci rezultatul este un obiect Fuer&Def temporar.
n spatiul ODBCDirect o interogare este ntotdeauna temporara.
Colectia Fuer&Def contine toate obiectele Fuer&Def deschise. Cnd o interogare este nchisa, ea este
nlaturata automat din colectia Fuer&Def%
Referinta la un obiect permanent Fuer&Def este uzuala, prin intermediul colectiei:
QueryDefs(0)
QueryDefs("name")
QueryDefs![name]
Referinta la obiectele temporare Fuer&Def se poate obtine doar prin variabilele obiect la care s-au asignat
interogarile.
'rearea interogarilor permanente
nterogarile permanente, salvate mpreuna cu baza de date, pot fi create n Visual Basic cu DAO sau n
interfata utilizator din Microsoft Access.
Exemplul urmator constituie un model pentru crearea unei interogari.
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)
187
Set rst = qdf.OpenRecordset
Obiectul Fuer&Def nou creat nu trebuie adaugat la colectia Fuer&Defs, deoarece prin specificarea unei valori
nenule a argumentului name se creeaza o interogare permanenta si aceasta este adaugata automat la
colectie. Un nume nul ar duce la crearea unei interogari temporare (n spatiul ODBCDirect toate obiectele
Fuer&Def sunt ntotdeauna temporare).
'olectia Parameters (Fuer&Def O$(ect)
Un obiect Parameter reprezinta o valoare transmisa unei interogari. Colectia Parameters contine toate
obiectele Parameter definite de un obiect Fuer&Def. Localizarea n ierarhia de obiecte DAO este precizata n
tabelul alaturat.
O$iectul sau
colectia
Este continut Dn 'ontine
Parameter (obiect) Colectia
Parameters
Colectia Properties
Parameters
(colectie)
Obiectul Fuer&Def Obiecte Parameter
Daca se doreste ca utilizatorul sau aplicatia sa ofere o valoare n timpul executiei, prin care sa se limiteze
multimea nregistrarilor returnate de o interogare, aceasta se realizeaza prin definirea parametrilor interogarii.
Pentru a crea un parametru se utilizeaza declaratia SQL PARAMETERS. Sintaxa declaratiei este:
PARAMETERS name datatype [, name datatype [, .]]
Declaratia PARAMETERS precede restul instructiunii SQL si este separata prin caracterul ";", dupa exemplul
urmatoarei instructiuni SQL:
PARAMETERS [ Beginning OrderDate] DATETME,[ Ending OrderDate] DATETME;
SELECT * FROM Orders
WHERE (OrderDate Between [ Beginning OrderDate] And [ Ending OrderDate] );
Fiecare parametru definita n instructiunea SQL este reprezentata de un obiect Parameter n colectia
Parameters a obiectului Fuer&Def bazat pe instructiunea SQL. Valoarea unui parametru se poate specifica
prin fixarea proprietatii Value a obiectului Parameter. Exemplul urmator realizeaza o asemenea operatiune.
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 referintei la baza curenta
Set dbs = CurrentDb
' constructia sirului SQL
strSQL = "PARAMETERS [Beginning OrderDate] DATETME, " _
& "[Ending OrderDate] DATETME; SELECT * FROM Orders " & _
188
"WHERE (OrderDate Between [Beginning OrderDate] " _
& "AND [ Ending OrderDate] )';"
' eliminarea interogarii daca ea exista
dbs.QueryDefs.Delete "ParameterQuery"

On Error GoTo Err_NewParameterQuery
' crearea unui nou obiect QueryDef
Set qdf = dbs.CreateQueryDef("ParameterQuery", strSQL)

' fixarea valorilor parametrilor
f dteStart > dteEnd Then
MsgBox "Start date is later than end date."
Exit Function
End f
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
Functia poate fi apelata din fereastra Debug prin
? NewParameterQuery(#6-30-95#, #6-30-96#)
O$ser"atie. n Microsoft Access se pot defini parametrii unei interogari n Query Design View.
'olectia Relations (o$iectul Data$ase)
Un obiect Relation reprezinta o relatie ntre cmpuri din tabele sau nterogari. Colectia Relations contine
toate obiectele Relation ale unei baze de date. Localizarea n ierarhia de obiecte DAO a spatiului de lucru
Microsoft Jet este
O$iectul sau
colectia
Este continut Dn 'ontine
Relation (obiect) Colectia Relations Colectia 5iel!s
Colectia Properties
189
Relations (colectie) Obiectul Data$ase Obiecte Relation
Relatii Dntre ta$ele
Separarea informatiilor ntre mai multe tabele ale unei baze de date, dupa criterii care tin de subiect, categorie,
administrare etc., ridica problema reunirii informatiilor pentru necesitati de raportare a lor. Pentru rezolvarea
acestei probleme o prima operatiune este aceea de a stabili relatii ntre tabele.
Prin relatie se ntelege, n problematica bazelor de date, o asociere stabilita ntre doua cmpuri (denumite
cmpuri cheie, de regula cu acelasi nume) din doua tabele. n acest mod nregistrarile celor doua tabele pot fi
coordonate nct nregistrarile curente sa contina informatii corelate dupa cmpurile asociate.
Relatia lucreaza prin potrivirea valorilor cmpurilor cheie. n cele mai multe cazuri, cmpurile cheie sunt cheia
primara dintr-o tabela (s-o numim tabela A), care constituie un identificator unic pentru fiecare nregistrare, si o
cheie externa din alta tabela (s-o numim tabela B).
Exista trei tipuri de relatii: one-to-one, one-to-many, many-to-many dupa numarul nregistrarilor din cele doua
tabele, care ndeplinesc conditia de matching.
O relatie one-to-many, cea mai frecventa, o nregistrare din tabela A poate sa se potriveasca cu mai multe
nregistrari din tabela B; invers, o nregistrare din tabela B are doar o nregistrare din A cu care se potriveste.
ntr-o relatie many-to-many, o nregistrare din tabela A poate sa se potriveasca cu mai multe nregistrari din
tabela B, iar o nregistrare din tabela B poate sa se corespunda cu mai multe nregistrari din tabela A. Acest tip
de relatie este posibil prin definirea unei a treia tabele (tabela de jonctiune junction table) ale carei cmpuri
chei primare sunt n relatie cu cheile externe din tabelele A si B. Astfel, o relatie many-to-many este formata
din doua relatii one-to-many care implica o a treia tabela.
Relatia one-to-one presupune ca nregistrarile din tabelele A si B sunt n corespondenta una la una, fiecare
nregistrare din A se poate potrivi doar cu o nregistrare din B si reciproc. Desi nu este o situatie uzuala, prin
aceea ca legatura foarte puternica ar presupune ca informatia trebuia grupata ntr-o singura tabela, relatia
one-to-one poate fi utilizata pentru divizarea unei tabele cu prea multe cmpuri sau izolarea unei parti a
tabelei.
Modul de relatie creat de Microsoft Access depinde de definirea cmpurilor care sunt puse n relatie (chei
primare, indexuri unice etc.).
O$iectul Relation
Obiectul Relation poate fi utilizat pentru a crea noi relatii sau pentru a examina relatiile existente n baza
curenta. Proprietatile obiectului servesc la specificarea tipului de relatie, a tabelelor care participa n relatie,
cnd sa se forteze integritatea referentiala (integritatea referentiala *eferential integrity este un sistem de
reguli utilizate n Access pentru a asigura ca relatiile dintre nregistrarile tabelelor legate sunt valide si ca nu se
sterg sau modifica date legate; integritatea referentiala interzice adaugarea de nregistrari la o tabela legata
pentru care nu exista cheie primara, modificarea valorilor n tabela primara care conduce la nregistrari orfane
n tabela legata etc.) si cnd sa se execute actualizarile si stergerile n cascada (actualizari n cascada
cascading update pentru relatiile care impun integritatea referentiala, o optiune care, n cazul modificarii unei
chei primare din nregistrarile tabelei primare, conduce la actualizarea automata a cheilor externe n toate
nregistrarile legate din tabelele externe; stergeri n cascada cascading delete similar, dar pentru stergeri
de nregistrari: stergerea unei inregistrari din tabela primara produce stergerea nregistrarilor legate din
tabelele externe). Toate aceste notiuni sunt prezentate, pe scurt, n continuare.
190
Adaugarea unui obiect Relation la colectia Relations, se va crea obiectul prin metoda 'reateRelation si se
adauga la colectie prin metoda Appen!. Astfel, obiectul Relation este salvat o data cu obiectul Data$ase%
Eliminarea unui obiect Relation se realizeaza metoda Delete.
Referirea la un obiect Relation se realizeaza n mod uzual:
Relations(0)
Relations("name")
Relations![name]
Actiunile principale realizate prin utilizarea obiectului Relation sunt enumerate n continuare.
Stabilirea unei relatii impuse ntre cmpuri din tabele de baza (o tabela de baza este o tabela a unei
baze de date Microsoft Jet) dar nu relatii care implica tabele si interogari legate (o tabela legata este o
baza externa, legata de o baza de date Jet).
Stabilirea unei relatii neimpuse ntre orice tip de tabela sau interogare nativa sau legata.
Utilizarea proprietatii /ame pentru a referi relatia dintre cmpurile din tabela primara (prin tabela
primara se ntelege partea "one" dintr-o relatie one-to-many) referita si tabela externa (tabela de pe
partea "many" a relatiei one-to-many) care face referirea.
Utilizarea proprietatii Attri$utes pentru a determina daca relatia dintre cmpuri este one-to-one si cum
sa se impuna integritatea referentiala. De asemenea, tot prin Attri$utes, se poate determina daca
motorul Microsoft Jet poate efectua actualizarea n cascada si stergerea n cascada n tabelele legate
prin relatii.
Utilizarea proprietatii Attri$utes pentru a determina daca relatia este asociere stnga (left join, include
toate nregistrarile din prima tabela din stnga chiar daca nu exista nici o potrivire cu nregistrari din
a doua tabela din dreapta) sau asociere dreapta (right join, include toate nregistrarile din a doua
tabela din dreapta chiar daca nu exista potriviri cu nregistrari din prima tabela din stnga relatiei).
Utilizarea proprietatii /ame a obiectelor 5iel! din colectia 5iel!s a obiectului Relation pentru a stabili
sau returna numele cmpurilor din cheia primara a tabelei referite, sau setarile proprietatii
5oreign/ame a obiectelor 5iel! pentru a stabili sau returna denumirile cmpurilor din cheia externa a
tabelei care face referinta.
Un obiect Relation are o colectie 5iel!s care contine doua cmpuri, cte unul n fiecare tabela a
relatiei.Cmpurile relatiei trebuie sa aiba acelasi tip de data si trebuie sa aiba valori comune. Se vor utiliza
proprietatile a$le si 5oreigna$le ale obiectului Relation pentru a specifica tabele care iau parte la relatie si
cum sunt legate. La crearea unei relatii one-to-many, tabela de pe partea "one" a relatiei este tabela n care
cmpul din legatura este cheia primara. Prin urmare proprietatea a$le trebuie sa fie numele acestei tabele.
Tabela de pe partea "side" a relatiei este tabela n care cmpul legat este cheie externa iar numele tabelei se
va da proprietatii 5oreigna$le%
Urmatorul exemplu creeaza o relatie ntre tabelele Employees si Orders din baza de date de test Northwind.
Cele doua tabele sunt unite prin cmpul EmployeeD care este cheie primara n baza Employees toate
valorile acestui cmp sunt unice si cheie externa pentru Orders aceeasi valoare poate sa apara n mai
multe nregistrari.
Function NewRelation() As Boolean
Dim dbs As Database
Dim fld As Field, rel As Relation
' calea catre baza de date Northwind
Const conPath As String = _
"C:\Program Files\ . \Northwind.mdb"
On Error GoTo Err_NewRelation
' returneaza o referinta la baza curenta
Set dbs = OpenDatabase(conPath)
191
' gasirea unei relatii EmployeesOrders deja existente
For Each rel n dbs.Relations
f rel.Table = "Employees" And rel.ForeignTable = "Orders" Then
' mesaj de stergere a relatiei existente
f MsgBox(rel.Name & " already exists. " & vbCrLf _
& "This relation will be deleted and re-created.", vbOK) = vbOK Then
dbs.Relations.Delete rel.Name
Else
' daca utilizatorul raspunde cu Cancel
Exit Function
End f
End f
Next rel

' crearea noii relatii si stabilirea proprietatilor ei
Set rel = dbs.CreateRelation("EmployeesOrders", "Employees", "Orders")
' stabilirea proprietatilor pentru fortarea integritatii referentiale
rel.Attrbutes = dbRelationDeleteCascade + dbRelationUpdateCascade
' creare cmp n colectia Fields a obiectului Relation, la creare se fixeaza Name
Set fld = rel.CreateField("EmployeeD")
' numele pentru cmpul extern
fld.ForeignName = "EmployeeD"

' adaugarea 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
O$ser"atie. n Microsoft Access se lucreaza cu relatiile prin meniul ools Relations3ips.
192
DAO (Data Access O$(ects) (II)
Colectia Recordsets
Obiecte Recordset de tip tabela
Obiecte Recordset de tip dynaset
Obiecte Recordset de tip snapshot
Obiecte Recordset de tip forward-only
Metodele obiectelor Recordset
Securitatea datelor
Colectia Properties
Accesarea !atelor ODB'
Utilizarea Microsoft Jet pentru date ODBC
Utilizarea ODBCDirect pentru date ODBC
nregistrarea unei surse de date ODBC
Utilizarea DAO cu ODBCDirect
Obiectul DBEngine
Colectia Workspace
Colectia Connections
Deschiderea conectarilor asincrone
Colectia Databases
Comutarea ntre Connection si Database
Colectia QueryDefs
Executarea interogarilor asincrone
Colectia Parameters
Colectia Recordsets
Obiecte Recordset de tip dinamic
Deschiderea asincrona a obiectelor Recordset
Colectia Fields
Utilizare ODBCDirect
Utilizarea actualizarii optimiste n lot
Tratarea coliziunilor
Utilizarea cursoarelor n spatiile ODBCDirect
Caracteristicile cursoarelor
Cursoare client-side sau server-side
Alegerea tipului de cursor
Blocarea nregistrarilor
Limitari ale cursoarelor
Regasirea multimilor multiple de rezultate
Lucrul cu proceduri memorate
'olectia Recor!sets
Obiectul Recor!set reprezinta o multime de nregistrtari din baza de date. Colectia Recor!sets contine toate
obiectele Recor!set deschise. Situarea n ierarhia de obiecte este
O$iectul sau
colectia
Este continut Dn 'ontine
Recor!set (obiect) Colectia
Recor!sets
Colectia 5iel!s
Colectia
Properties
193
Recor!sets
(colectie)
Obiectul Data$ase Obiecte Recor!set
Obiectele Recor!set sunt utilizate pentru modificarea datelor memorate ntr-o tabela a unei baze de date
(structura tabelei poate fi modificata prin comenzi DAO sau SQL).
Crearea unui obiect Recor!set se obtine din metoda OpenRecor!set cu sintaxa:
)et recordset = object.OpenRecor!set (source, type, options, lockedits)
Descrierea parametrilor se va vedea n Help OpenRecordset method.
DAO ofera cinci tipuri de obiecte Recor!set#
table (doar n spatii de lucru Jet),
dynaset,
snapshot,
forard-only,
dynamic (doar n spatii ODBCDirect).
O$ser"atie. Un obiect Recor!set trebuie ntotdeauna nchis dupa terminarea lucrului cu el si nainte de a
nchide obiectul Data$ase n care a fost creat. Pentru aceasta se utilizeaza metoda 'lose a obiectului
Recor!set%
O$iecte Recor!set !e tip ta$ela
Un obiect Recor!set de tip tabela reprezinta o tabela de baza (base table) din baza de date. Toate cmpurile
si nregistrarile din tabela sunt incluse ntr-un obiect Recor!set de tip tabela. Acesta poate fi utilizat ntr-un
spatiu de lucru Microsoft Jet pentru a adauga, sterge sau modifica nregistrari din tabela.
Un obiect Recor!set poate fi deschis pe tabelele de baza ale unei baze de date Jet, dar nu pe tabelele din
surse ODBC sau tabele legate. Se mai poate utiliza Recor!set cu bazele de date instalabile SAM (FoxPro,
dBase sau Paradox) pentru a deschide aceste tabele n mod direct mai degraba dect sa se lege acestea la
baza de date curenta.
nformatii complete despre un obiect table-type Recor!set se obtin din DAO Help "Table-Type Recordset
Object Summary", de unde sunt legaturi catre toate proprietatile si metodele obiectului. ntrarea poate fi atinsa
eventual prin Database Object > Summary > Database Object, Databases Collection Summary, de unde
este o legatura catre Recor!sets.
Proprietatea Recor!'ount a unui obiect Recor!set de tip tabela returneaza numarul de nregistrari din
tabela.
Obiectul Recor!set de tip tabela poate utiliza indexurile definite pentru tabela de baza. La crearea obiectului
se poate preciza n proprietatea In!e1 numele unui index definit pentru tabela. Metoda )ee: va cauta n
ordinea data de index.
Pentru a crea un obiect Recor!set de tip tabela se va specifica valoarea !$Opena$le pentru argumentul
type a metodei OpenRecor!set a obiectului Data$ase.
O$ser"atie. Pentru o tabela legata dintr-o sursa de date externa se va utiliza mai nti metoda
OpenData$ase pentru deschiderea bazei si apoi se deschide un obiect Recor!set de tip tabela.
194
Exemplul urmator creeaza un obiect Recor!set de tip tabela, foloseste metoda )ee: pentru localizarea unei
nregistrari si fixeaza nregistrarea gasita drept nregistrare curenta.
Function ReturnEmployeesRecord(strKey As String) As Boolean
Dim dbs As Database, rst As Recordset
Const conPath As String = _
"C:\Program Files\ . \Northwind.mdb"
On Error GoTo Err_ReturnEmployeesRecord
' returnarea referintei la baza de date
Set dbs = OpenDatabase(conPath)
' deschidere recordset pentru tabela Employees
Set rst = dbs.OpenRecordset("Employees", dbOpenTable)
' fixarea indexului
rst.ndex = "LastName"
' operatiunea de cautare
rst.Seek "=", strKey ' valoarea cautata este argument al functiei
' verificarea gasirii
f rst.NoMatch = False Then
' tiparirea unor cmpuri din nregistrarea gasita
Debug.Print rst!EmployeeD, rst!FirstName & " " & rst!LastName, rst!Title
ReturnEmployeesRecord = True
Else
ReturnEmployeesRecord = False
End f

Exit_ReturnEmployeesRecord:
' nchidere recordset si baza
rst.Close
dbs.Close
Exit Function

Err_ReturnEmployeesRecord:
MsgBox "Error " & Err & ": " & Err.Description
ReturnEmployeesRecord = False
Resume Exit_ReturnEmployeesRecord
End Function
O$iecte Recor!set !e tip !&naset
Un obiect Recor!set de tip dynaset reprezinta rezultatul unei cautari n una sau mai multe tabele. Obiectul
este o multime dinamica de inregistrari care se poate utiliza pentru adaugarea, modificarea sau stergerea
nregistrarilor n una sau mai multe tabele ale bazei. Cu un obiect Recor!set de tip dynaset se pot extrage si
actualiza date ntr-o uniune multipla de tabele, incluznd tabele legate din mai multe baze de date. Obiecte
Recor!set de tip dynaset se pot crea att n spatii de lucru Microsoft Jet, ct si n spatii de lucru ODBCDirect.
Daca obiectul implica o sursa de date la distanta, el consta ntr-o serie de bookmark-uri, fiecare identificnd
unic o nregistrare din recordset. Date efective nu sunt returnate dect la referirea lor explicita.
Pentru a determina numarul de nregistrari din recordset se aplica mai nti metoda Mo"eLast astfel
regasindu-se toate nregistrarile din multime.
Obiectul Recor!set de tip dynaset poate fi actualizat, dar nu toate cmpurile suporta operatia. Proprietatea
Data9p!ata$le a obiectului 5iel! respectiv arata daca se poate modifica valoarea cmpului. Obiectul nu se
poate actualiza daca
195
pagina de date necesara este blocata de alt utilizator
nregistrarea a fost deja modificata de la ultima citire
utilizatorul nu are drepturile necesare
cel putin o tabela sau un cmp este read-only
obiectul Recor!set a fost creat din mai multe tabele fara instructiunea JON
obiectul include cmpuri dintr-o sursa de date ODBC, sau tabele Paradox, si nu exista un index unic pe
acele tabele.
Crearea unui obiect dynaset-type Recor!set se indica utiliznd constanta !$OpenD&naset pentru
argumentul type al metodei OpenRecor!set. dupa 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)
' initializarea sirului 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)
' tiparirea nregistrarilor din recordset
Do Until rst.EOF
Debug.Print rst!FirstName, rst!LastName, rst!HireDate
Rst.MoveNext
Loop
' nchiderea recordsetului si a bazei
rst.Close
dbs.Close
End Sub
O$iecte Recor!set !e tip snaps3ot
Un obiect Recor!set de tip snapshot este o multime statica de nregistrari care reprezinta rezultatul unei
interogari. Un snapshot include toate valorile pentru toate cmpurile cerute n interogare, fie ca exista n cod
referinte la ele sau nu. Obiectul Recor!set de tip snapshot necesita mai putine resurse dect cel de tip
dynaset, dar datele nu pot fi actualizate n obiectul Recorset de tip snapshot.
nitial, la parcurgerea nregistrarilor din obiect, toate datele sunt copiate n memorie si apoi, daca multimea
este prea vasta, ntr-o baza de date Jet temporara de pe masina utilizatorului. Printre nregistrarile unui obiect
snapshot se poate naviga n ambele sensuri.
Pentru a crea un obiect snapshot-type Recor!set se specifica valoarea !$Open)naps3ot pentru argumentul
type al metodei OpenRecor!set%
O$iecte Recor!set !e tip for4ar!<onl&
Un obiect Recor!set de tip forward-only este identic cu unul de tip snapshot cu exceptia faptului ca
nregistrarile pot fi defilate doar nainte (nu se poate efectua dect o singura trecere prin nregistrari).
196
ntr-un obiect recordset de acest tip exista doar o singura nregistrare la un moment dat. Rezulta ca nu se pot
utiliza metode cum ar fi Mo"eLast. Mo"e5irst. Mo"ePre"ious%
Obiectele de acest tip, utile atunci cnd nregistrarile sunt parcurse doar o data, ofera cea mai mare viteza de
acces.
Crearea unui obiect forward-only-type Recor!set este produsa de constanta !$Open5or4ar!Onl& atribuita
argumentului type al metodei OpenRecor!set%
Meto!ele o$iectelor Recor!set
n tabelul urmator este o prezentare a metodelor permise pentru diferite tipuri de obiecte Recor!set% Este
inclus si tipul dinamic, disponibil doar n spatii ODBCDirect.
Jet = operatiune permisa n spatiul Microsoft Jet
ODBC = operatiune permisa n spatiul de lucru ODBCDirect
Met3o! a$le D&naset )naps3ot 5or4ar!<
Onl&
D&namic
A!!/e4 Jet Jet/ODBC ODBC * ODBC ODBC
'ancel ODBC ODBC ODBC ODBC
'ancel9p!ate Jet Jet/ODBC ODBC * ODBC ODBC
'lone Jet Jet Jet
'lose Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC
'op&Fuer&Def Jet Jet Jet
Delete Jet Jet/ODBC ODBC * ODBC ODBC
E!it Jet Jet/ODBC ODBC * ODBC ODBC
5ill'ac3e Jet
5in!5irst Jet Jet
5in!Last Jet Jet
5in!/e1t Jet Jet
5in!Pre"ious Jet Jet
GetRo4s Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC
Mo"e Jet Jet/ODBC Jet/ODBC Doar nainte,
fara offset
ODBC
197
Mo"e5irst Jet Jet/ODBC Jet/ODBC ODBC
Mo"eLast Jet Jet/ODBC Jet/ODBC ODBC
Mo"e/e1t Jet Jet/ODBC Jet/ODBC ODBC
Mo"ePre"ious Jet Jet/ODBC Jet/ODBC ODBC
/e1tRecor!set ODBC ODBC ODBC ODBC
OpenRecor!set Jet Jet Jet
ReTuer& Jet/ODBC Jet/ODBC Jet/ODBC ODBC
)ee: Jet
9p!ate Jet Jet/ODBC ODBC * ODBC ODBC
* n spatiul ODBCDirect anumite operatiuni depind de driver (daca acesta suporta sau nu operatiunea
respectiva)
Pentru proprietatile diferitelor tipuri de obiecte Recor!set se vor studia intrarile respective din Help.
)ecuritatea !atelor
Microsoft Access dispune de doua metode de asigurare a securitatii informatiilor:
stabilirea de parole pentru deschiderea bazelor de date si
securitate la nivel de utilizator, prin fixarea drepturilor de acces la diferite obiecte ale bazei de date.
Securitatea la nivel de utilizator/grup se realizeaza cu ajutorul obiectelor Group. mpreuna cu obiectele 9ser.
'ontainer. Document si 2or:space%
Obiectul Group reprezinta un grup de conturi iar obiectul 9ser reprezinta un cont individual. Utilizatorii pot fi
membri ai grupurilor. Atunci cnd se stabileste securitatea bazei, aceasta se efectueaza pentru un obiect
particular sau multime de obiecte specificnd tipul de drepturi pe care utilizatorul sau grupul l are asupra
obiectelor respective. Daca un grup are o anumita permisiune pentru un obiect, toti utilizatorii grupului au
aceeasi permisiune. nvers, daca un utilizator are drepturi asupra unui obiect, grupul la care apartine
utilizatorul are aceleasi drepturi. Grupurile pot fi create prin metoda 'reateGroup a obiectului 2or:space sau
9ser%
Obiectul 'ontainer reprezinta un set particular de obiecte dintr-o baza de date pentru care se pot atribui
drepturi ntr-un grup securizat. DAO ofera trei tipuri de obiecte 'ontainer; fiecare baza de date contine cel
putin aceste obiecte avnd denumirile: Databases bazele de date salvate , Tables tabelele si interogarile
salvate , Relationships relatiile salvate. O aplicatie poate sa defineasca si obiecte 'ontainer proprii;
Microsoft Access defineste obiectele 'ontainer cu denumirile Forms formele salvate , Modules modulele
salvate, Reports rapoartele salvate , Scripts macrourile salvate. Pentru stabilirea drepturilor se stabileste
proprietatea 9ser/ame a containerului respectiv si apoi proprietatea Permissions adecvata.
Fiecare obiect 'ontainer contine o colectie Documents, fiecare element Document reprezentnd un
document din baza. Att DAO ct si aplicatia ofera diferite tipuri de obiecte Document, de exemplu Database
198
(DAO), Form (Access) etc. Pentru stabilirea drepturilor se stabileste proprietatea 9ser/ame a documentului
respectiv si apoi proprietatea Permissions.
Pentru informatii detaliate se vor studia intrarile din Help pentru obiectele mentionate si legaturile propuse.
'olectia Properties
Cele mai multe obiecte DAO contin o colectie Properties. Fiecare obiect Propert& din colectie corespunde
unei proprietati a obiectului. Colectia proprietatilor poate fi utilizata fie pentru a determina ce proprietati se
aplica unui obiect particular, fie pentru a returna valorile existente ale proprietatilor. Exemplul urmator afiseaza
n fereastra Debug toate proprietatile obiectului reprezentnd baza de date curenta.
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 colectiei
For Each prp n dbs.Properties
Debug.Print prp.Name
Next prp
dbs.Close
End Sub
Anumite proprietati ale obiectelor DAO nu exista n mod automat n colectia Properties a obiectului respectiv.
nainte de utilizarea unei asemenea proprietati, trebuie sa se creeze un obiect Propert& care sa reprezinte
proprietatea si sa se adauge obiectul la colectia Properties% Din acest moment proprietatea poate fi utilizata la
fel cu toate celelalte existente n colectie.
Urmatoarea functie este o procedura generica utilizabila n cazul procesarii unei proprietati care nu exista n
mod implicit. Functia implementeaza tratarea erorilor. Prima data cnd se cheama procedura apare o eroare
deoarece nu exista proprietatea ceruta. n handler-ul erorii se creeaza noul obiect Propert& si se adauga la
colectia lui. Orice apel ulterior nu mai produce erori si proprietatea este stabilita pe valoarea specificata.
Function SetProperty(obj As Object, strName As String, _
intType As nteger, varSetting As Variant) As Boolean
Dim prp As Property

Const conPropNotFound As nteger = 3270

On Error GoTo Error_SetProperty
' referirea explicita la colectia Properties
obj.Properties(strName) = varSetting
SetProperty = True

Exit_SetProperty:
Exit Function

Error_SetProperty:
f Err = conPropNotFound Then
199
' creare proprietate, tip, valoare initiala
Set prp obj.CreateProperty(strName, intType, varSetting)
' adaugarea la colectia 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 f
End Function
De exemplu, pentru a fixa proprietatea Replica$leBool a obiectului Data$ase, se poate utiliza functia
precedenta prin
Sub ReplicateDatabase()
Dim dbs As Database
Const conPath As String = _
"C:\Program Files\ . \Northwind.mdb"

Set dbs = OpenDatabase(conPath, True)
f SetProperty(dbs, "ReplicableBool", dbBoolean, True) Then
Debug.Print "Database replicated successfully."
Else
Debug.Print "Database not replicated."
End f
End Sub
De fiecare data cnd se fixeaza sau se citeste o proprietate care nu exista n mod automat n colectia
Properties a unui obiect, referinta la colectia Properties trebuie sa fie explicita. De exemplu,
Debug.Print dbs.Properties("ReplicableBool")
Functia aratata n exemplul anterior poate fi utilizata pentru definirea unor proprietati proprii (introduse de
utilizator) pentru obiectele DAO. De exemplu, se poate defini o proprietate care sa memoreze numele
utilizatorului care a modificat ultima data o tabela. Si referintele la proprietatile definite de utilizator se vor
efectua n mod explicit.
Anumite aplicatii, cum ar fi Access, definesc proprietati proprii pentru obiectele DAO. De exemplu Microsoft
Access defineste proprietati pentru obiectele a$leDef. Fuer&Def. 5iel! si Document%
Accesarea !atelor ODB'
Atunci cnd este nevoie sa se lucreza cu surse de date ODBC, trebuie sa se decida daca se va utiliza DAO cu
Microsoft Jet, ODBCDirect sau ambele. n continuare se discuta pentru nceput avantajele fiecarui tip de acces
si alte probleme conexe domeniului. Alegerea modului de lucru este functie de posibilitatile de lucru oferite n
cele doua spatii.
9tili*area Microsoft Pet pentru !ate ODB'
Alegerea modului de acces Jet poate fi influentata de urmatoarele argumente. Posibilitatile enumerate sunt
proprii spatiilor de lucru Microsoft Jet si nu sunt suportate de spatiile ODBCDirect.
200
o Legaturi actuali*a$ile se pot actualiza date din obiecte Recor!set bazate pe legaturi
multiple de tabele
o )uport pentru ta$ele legate se pot memora legaturi permanenete la date de pe server ntr-o
baza locala Microsoft Jet. La legarea unei tabele, se poate memora (cache) informatia despre
structura tabelei, incluznd informatii despre cmpuri si indexuri, n baza locala. Acest fapt
mareste viteza de conectare la accesarile ulterioare ale sursei de date.
o )uport pentru meto!e 5in! se pot utiliza metodele 5in!5irst. 5in!/e1t. 5in!Pre"ious si
5in!Last cu obiectele Recor!set%
o Esecuri (failures) partiale ale actuali*arii interogarilor 8 daca esueaza o interogare de mari
dimensiuni, interogarea se opreste, da controlul utilizatorului pentru a decide sau nu daca se
pastreaza modificarile efectuate pna n momentul esecului.
o Proprietati !efinite !e utili*ator 8 se pot personaliza obiectele DAO prin adaugarea unor
proprietati persistente. De exemplu o proprietate Description care samemoreze un text
descriptiv al obiectului.
o Interogari Dncrucisate 8 se poate utilzia propozitia SQL TRANSFORM pentru a crea rezumate
ncrucisate (crosstab) ale datelor interogate.
o Acces la !ate eterogene se poate lucra cu date de pe server, baze de date Microsoft Jet
native (fisiere .mdb) si date SAM instalabile (FoxPro, Paradox, dBASE). Se pot efectua uniri de
tabele din surse diferite.
o 9tili*are programatica pentru Data Definition Language (DDL) se poate folosi DAO pentru
operatiuni care modifica structura bazei de date (adaugare de tabel, modificare etc.).
o Atasare !e forme si controale n spatiul Jet se pot atasa forme si controale datelor din
surse ODBC. Spatiul ODBCDirect nu suporta tabele legate deci nici forme sau controale.
9tili*are ODB'Direct pentru !ate ODB'
Cu ODBCDirect se pot accesa date de pe server utiliznd modelul de obiecte DAO existent direct n topul
interfetei de programare ODBC. ODBCDirect implementeaza un strat de cod peste ODBC AP, care stabileste
conexiunile, creeaza cursoare si executa proceduri utiliznd resurse minime de pe statia de lucru, fara a trece
prin Microsoft Jet. Avantajele utilizarii spatiului de lucru ODBCDirect sunt enumerate n continuare.
o Acces !irect aplicatia acceseaza sursa de date ODBC n mod direct. Se pot astfel
mbunatati performantele, reduce traficul de retea si beneficia de capacitatile de procesare ale
serverului (mai mari dect ale statiei de lucru).
o Re!ucerea necesarului !e resurse netrecnd prin Microsoft Jet, aplicatia cere mai putine
resurse locale. Daca se utilizeaza ODBCDirect din Access se va tine seama ca Microsoft
Access ncarca ntotdeauna Microsoft Jet (chiar daca operatiunile ODBCDirect nu trec pe
acolo).
o Im$unatatirea accesului la functionalitatea specifica ser"erului se pot utiliza avantajele
functiunilor specifice serverului ODBC si care nu sunt permise prin Microsoft Jet. De exemplu,
n spatiul ODBCDirect se poate specifica locul de memorare a cursorului: la client sau la server,
pentru serverele care suporta diferite tipuri de cursoare.
o Interogari asincrone se pot executa o interogare a bazei de date si apoi alte operatiuni fara
a astepta terminarea interogarii. Se pot testa proprietatile pentru a vedea stadiul executiei
interogarii. Astfel se poate simula concurenta si optimiza performanta aplicatiei.
o Actuali*are optimista Dn loturi modificarile locale se pot stoca n Recor!set si trimite apoi
serverului ntr-un singur lot.
o E1ecutarea proce!urilor memorate se pot manevra intrarile si iesirile procedurilor
memorate pe server; se pot specifica valori de intrare si verifica valorile returnate, operatiuni
imposibile n spatiul de lucru Jet.
?nregistrarea unei surse !e !ate ODB'
201
Pentru a putea fi utilizata, att n spatiul de lucru Microsoft Jet, ct si n spatiul ODBCDirect, o sursa de date
ODBC trebuie sa fie nregistrata. Acest proces memoreaza informatia despre sursa de date n Windows
Registry si ofera aceasta informatie aplicatiilor. nregistrarea se poate efectua att din managerul de ODBC
(disponibil n mediul Windows), ct si din Visual Basic.
Pasii necesari nregistrarii difera dupa sursa de date ODBC, driverele respective necesitnd informatii
specifice. n continuare se da, ca exemplu, nregistrarea sursei de date SQL Server utiliznd managerul de
ODBC:
1. Windows Control Panel => dublu click pe 32bit ODBC
2. Click A!! si apoi dublu click pe )FL )er"er%
3. n caseta Data )ouce /ame se tasteaza un nume (DSN). Acesta poate fi orice sir si nu trebuie sa
corespunda cu numele bazei de date sau tabelei accesate.
4. n Description se tasteaza o desciere a bazei de date, orice text de altfel.
5. n caseta )er"er se introduce numele serverului de retea unde se afla sursa datelor. Nu se include un
dublu backslash (\\) naintea numelui.
6. Click Options si se introduce numele bazei de date accesate n caseta Data$ase /ame.
Exemplul urmator contine codul necesar nregistrarii programatice a unei surse de date. Pentru aceasta se
utilizeaza metoda RegisterData$ase a obiectului DBEngine.
Function RegisterDB() As Boolean
Dim str As String

On Error GoTo Err_RegisterDB
' construirea sirului 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 RegisterData$ase completeaza informatia de conectare necesara la deschiderea sursei de date
ODBC. Sintaxa metodei este
DBEngine%RegisterData$ase dbname, driver, silent, attributes
unde
dbname este numele bazei de date,
202
driver este numele driverului ODBC,
silent este True daca se nu doreste afisarea dialogului driverului pentru fixarea atributelor,
attributes contine sirul atributelor care se trec n Windows Registry.
9tili*area DAO cu ODB'Direct
Modelul de obiecte pentru spatiul ODBCDirect include un subset de obiecte din spatiul Microsoft Jet la care se
adauga un obiect nou, 'onnection si clasa corespunzatoare. Diagrama urmatoare arata ierarhia de obiecte a
spatiului de lucru ODBCDirect.
O$iectul DBEngine
DBEngine contine att spatiile de lucru Jet, ct si spatiile de lucru ODBCDirect. Proprietatea Default&pe a
obiectului determina tipul spatiului creat n mod implicit la utilizarea metodei 'reate2or:space. Dupa cum s-a
mai precizat, la spatiile Microsoft Jet, valoarea !$9seODB' caracterizeaza spatiile ODBCDirect. Argumentul
implicit poate fi acoperit prin specificarea explicita a argumentului type la aplicarea metodei
'reate2or:space.
O$ser"atie. Daca programarea este efectuata in Microsoft Access, atunci nu se va specifica Proprietatea
Default&pe la valoarea dbUseODBC deoarece poate produce rezultate neasteptate (Access utilizeaza DAO
si Jet pentru multiple operatiuni).
nstructiunile urmatoare creeaza un spatiu ODBCDirect:
Dim wrkODBC As Workspace
Set wrkODBC = DBEngine.CreateWorkspace _
("NewODBCwrk", "Admin", "", dbUseODBC)
Tipul spatiului de lucru poate fi identificat prin proprietatea &pe a obiectului 2or:space. Este returnata una
dintre valorile !$9sePet sau !$9seODB', proprietatea fiind read-only, adicanu se poate modifica tipul
spatiului de lucru odata creat.
'olectia 2or:spaces
203
n acest model, fara a specifica de fiecare data, un obiect 2or:space reprezinta un spatiu de lucru
ODBCDirect, iar colectia 2or:spaces contine multimea tuturor spatiilor ODBC active. Situarea n ierarhie
este data n tabelul urmator.
O$iectul sau
colectia
'ontinut Dn 'ontine
2or:space (obiect) Colectia
2or:spaces
Colectia
'onnections
Colectia Data$ases
Colectia Properties
2or:spaces
(colectie)
Obiectul DBEngine Obiecte 2or:space
Un spatiu de lucru ODBCDirect ruteaza, n cazul utilizarii ODBC, apelurile direct la ODBC AP spre deosebire
de spatiul Microsoft Jet, care ruteaza mai nti apelurile la motorul de baze de date Jet si pe urma la ODBC
AP.
Referirea la un spatiu de lucru se efectueaza n mod uzual, prin intermediul colectiei:
DBEngine.Workspaces(index)
DBEngine.Workspaces("name")
DBEngine.Workspaces![name]
Principalele proprietati si metode utilizabile sunt
/ame. 9ser/ame si &pe (proprietati) pentru stabilirea/aflarea proprietatilor unei sesiuni.
Metoda 'lose pentru terminarea sesiunii.
Metoda OpenData$ase pentru a deschide o baza de date.
Metodele Beginrans. 'ommitrans si Roll$ac: pentru conducerea tranzactiilor.
Alte proprietati sunt prezentate n continuare.
'olectia 'onnections
Dupa crearea unui spatiu ODBCDirect, trebuie sa se conecteze la o sursa de date ODBC. Conectarea se
poate efectua prin deschiderea unei baze de date (metoda OpenData$ase, prezentata ulterior) sau prin
deschiderea unui nou obiect 'onnection.
Un obiect 'onnection reprezinta o conectare la o baza de date ODBC din spatiul ODBCDirect. Colectia
'onnections contine toate obiectele 'onnection deschise curent. La deschiderea unui nou obiect
'onnection. acesta este adaugat n mod automat la colectie. Analog, nchiderea unui obiect prin metoda
'lose elimina din colectie obiectul 'onnection nchis.
Avantajele utilizarii obiectului 'onnection sunt
204
o 'onectare asincrona% Operatiunea de conectare se desfasoara n paralel cu alte operatiuni si
poate fi verificata daca s-a efectuat.
o Interogare asincrona% Similar celor anterior spuse, dar pentru interogari.
o Obiecte Fuer&Def% Se pot defini obiecte Fuer&Def care reprezinta interogarile din sursa de
date ODBC.
Pentru a crea un obiect 'onnection se utilizeaza metoda Open'onnection, cu sintaxa
)et connection = workspace.Open'onnection (name, options, readonly, connect)
unde
connection este numele noului obiect,
workspace este numele unui obiect 2or:space de tip ODBCDirect din care se efectueaza conectarea,
name este numele unei surse de date nregistrate. Obiectul 'onnection creat poate fi referit prin
numele sursei (DSN) sau prin indexul din colectie,
options determina daca si cnd sa fie ntrebat utilizatorul la stabilirea conexiunii si daca aceasta este
asincrona; valorile se vor studia din Help - OpenConnection method,
readonly permite controlul actualizarii datelor: True pentru a interzice modificarea datelor.
connect este un sir de conectare valid care contine parametrii necesari driverului ODBC. Argumentul
poate contine numele utilizatorului, parola etc.
Sirul de conectare trebuie sa nceapa cu "ODBC;" si sa contina o serie de valori necesare driverului pentru a
accesa datele sursei. Componentele sirului difera dupa sursa de date. n mod uzual cerintele minime sunt D-
ul utilizatorului, parola si DSN, dupa modelul:
ODBC;UD=JamesK;PWD=OpenSesame;DSN=MasterData
Daca sirul de conectare nu contine toate elementele necesare, driverul ODBC afiseaza un dialog pentru
obtinerea informatiilor lipsa. Dialogul nu este afisat daca sirul de conectare este completat cu informatiile
necesare.
O$ser"atie. La conectarea la o baza de date Microsoft SQL Server care utilizeaza securitatea integrata se vor
omite parametrii UD si PWD deoarece se utilizeaza numele utilizator si parola din Windows NT. De exemplu,
sirul de conectare poate fi
ODBC;UD=;PWD=;DATABASE=Pubs;DSN=Pubs
Exemplul urmator ilustreaza utilizarea metodei Open'onection pentru a deschide un nou obiect 'onnection.
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 sirului de conectare
strConnect = "ODBC;DSN=Pubs;UD=sa;PWD=;DATABASE=Pubs"
' Crearea sirului SQL
205
strSQL = SELECT * FROM Authors WHERE State = 'MD';"
' Crearea spatiului 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)
' Tiparirea valorilor din recordset
Do Until rst.EOF
For Each fld n 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

Err_ OpenPubsConnection:
MsgBox "Error " & Err & ": " & Err.Description
OpenPubsConnection = False
Resume Err_ OpenPubsConnection
End Function
Dupa crearea obiectului 'onnection, se pot deschide obiecte Recor!set si executa interogari pe obiectul
'onnection.
La deschiderea unui obiect 'onnection, este creat un obiect Data$ase corespunzator si adaugat colectiei
Data$ases din spatiul de lucru. Reciproc, la deschiderea unei baze de date n spatiul ODBCDirect este creat
un obiect 'onnection si adaugat colectiei 'onnections. nchiderea oricarui obiect din perechea 'onnection.
Data$ase produce si nchiderea celuilalt obiect.
O$ser"atie. Ca si la Data$ase, se vor nchide mai nti toate obiectele Recor!set deschise.
Desc3i!erea conectarilor asincrone
Acest tip de conectare, necesar mai ales cnd conectarea dureaza mai mult, timp n care se pot efectua alte
operatiuni, este specificata prin constanta !$RunAs&nc data argumentului options al metodei
Open'onnection.
Dim wrk As Workspace, cnn As Connection, strConnect As String
Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)
strConnect = "ODBC;DSN=Pubs;UD=sa;PWD=;DATABASE=Pubs"
Set cnn = wrk.OpenConnection("",dbDriverNoPrompt + dbRunAsync, False, strConnect)
Proprietatea )tillE1ecuting a obiectului 'onnection poate fi testata pentru a determina stabilirea conexiunii.
Pentru a anula o conectare care ia prea mult timp se utilizeaza metoda 'ancel a obiectului.
'olectia Data$ases
206
Se poate utiliza metoda OpenData$ase a obiectului 2or:space pentru a deschide o baza de date si
conectarea astfel la o sursade date ODBC. Totusi, obiectul Data$ase nu suporta n spatiul de lucru
ODBCDirect toate functiunile pe care le ofera obiectul 'onnection. n special, nu se poate efectua conectarea
asincrona, executa interogari asincrone sau defini obiecte Fuer&Def reprezentnd interogari ale sursei de
date.
Pentru conectarea la o sursa ODBC prin OpenData$ase dintr-un spatiu de lucru ODBCDirect se va specifica
un sir de conectare valid n argumentul connect al metodei, dupa exemplul urmator.
Dim wrk As Workspace, dbs As Database
Dim strConnect As String

strConnect = ""ODBC;DSN=Pubs;UD=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 si proprietatile obiectului Data$ase, mentionam doar cteva.
metoda E1ecute pentru a efectua o interogare de tip actiune (action 9uery o interogare care copie
sau schimba date; sunt incluse adaugare, stergere, actualizare, n opozitie cu o interogare de tip
selectare care returneaza o multime de nregistrari).
Proprietatea 'onnect stabileste o conectare la o sursa de date ODBC.
Proprietatea Fuer&imeout pentru limitarea duratei de timp n care se executa o interogare.
Proprietatea Recor!sAffecte! pentru a determina numarul nregistrarilor modificate ntr-o interogare
actiune.
Metoda OpenRecor!set pentru executarea unei interogari de tip selectare si crearea unui obiect
Recor!set.
Proprietatea Version permite determinarea versiunii motorului de baze de date care a creat baza.
'omutarea Dntre o$iectele 'onnection si Data$ase
Pentru a utiliza avantajele fiecarui tip de conectare la o sursa ODBC, se poate trece de la un obiect la altul prin
proprietatea 'onnection a obiectului Data$ase sau prin proprietatea Data$ase a obiectului 'onnection.
Aceste proprietati pot fi folosite pentru a crea obiecte 'onnection din obiecte Data$ase si, reciproc, obiecte
Data$ase din obiecte 'onnection% Se pot astfel adauga capacitati ODBCDirect la aplicatii care utilizeaza
doar obiecte Data$ase.
De exemplu, se poate utiliza un obiect Data$ase pentru operatiunile uzuale, dar daca este nevoie de o
interogare asincrona, atunci se poate crea un obiect 'onnection din obiectul Data$ase si executa apoi
interogarea din 'onnection. Exemplul urmator ilustreaza aceasta metoda.
Sub DeleteRecords()
Dim dbs As Database, strConnect As String
Dim cnn As Connection

' Deschiderea bazei de date n spatiul de lucru implicit
strConnect = ""ODBC;DSN=Pubs;UD=sa;PWD=;DATABASE=Pubs"
Set dbs = OpenDatabase("", False, False, strConnect)

' crearea unui obiect Connection din Database.
' Daca spatiul de lucru este ODBCDirect, atunci interogarea se executa asincron
' Daca spatiul de lucru este Microsoft Jet, apare o eroare si
207
' interogarea se executa sincron.

Err = 0
On Error Resume Next
Set cnn = dbs.Connection
f Err = 0 Then
cnn.Execute "DELETE FROM Authors", dbRunAsync
Else
dbs.Execute "DELETE FROM Authors"
End f
End Sub
'olectia Fuer&Defs
Un obiect Fuer&Def reprezinta o definitie temporara a unei interogari din spatiul ODBCDirect. Colectia
Fuer&Defs contine toate interogarile existente curent n spatiul de lucru. Situarea n ierarhia de obiecte este
data n tabelul urmator.
O$iectul sau
colectia
'ontinut Dn 'ontine
Fuer&Def (obiect) Colectia Fuer&Defs Colectia
Parameters
Colectia Properties
Fuer&Defs
(colectie)
Obiectul
'onnection
Obiecte Fuer&Def
Obiectele Fuer&Def create n spatiile de lucru ODBCDirect sunt ntotdeauna temporare. Ele nu pot fi salvate
n sursa de date chiar daca li se atribuie un nume.
E1ecutarea interogarilor asincrone
Crearea si executarea interogarilor n spatiile ODBCDirect sunt similare cu crearea si executarea din spatiile
de lucru Microsoft Jet. nterogarea se creeaza prin metoda 'reateFuer&Def a obiectului 'onnection si
utilizarea metodelor E1ecute sau OpenRecor!set pentru interogarea rezultata.
Se pot utiliza interogari asincrone nct utilizatorii sa continue aplicatia n timp ce se executa interogarea si se
poate da utilizatorilor posibilitatea de a anula o interogare asincrona n cazul n care dureaza prea mult.
Exemplul urmator 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 spatiului de lucru
Set wrk = DBEngine.CreateWorkspace("ODBC","sa", "", dbUseODBC)
' crearea sirului de conectare
208
strConnect = ""ODBC;DSN=Publishers;UD=SA;PWD=;DATABASE=Pubs"
' deschiderea conexiunii
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' stergerea unei interogari anterioare
For Each qdf n cnn.QueryDefs
f qdf.Name = "DeleteLargeSales" Then
cnn.QueryDefs.Delete "DeleteLargeSales"
End f
Next qdf

' creare QueryDef
Set qdf = cnn.CreateQueryDef("DeleteLargeSales")
strSQL = "DELETE FROM sales WHERE qty = 100"
qdf.SQL = strSQL

' executarea asincron a interogarii
qdf.Execute dbRunAsync

While qdf.StillExecuting
' cod care se va executa pna cnd se termina interogarea
' Se verifica proprietatea StillExecuting pentru a detecta terminarea
Wend

DeleteLargeSales = True

Exit_DeleteLargeSales:
cnn.Close
wrk.Close
Exit Function

Err_DeleteLargeSales:
For Each errObj n Errors
Debug.Print errObj.Number, errObj.Description
Next errObj
DeleteLargeSales = False
Resume Exit_DeleteLargeSales
End Function
Exemplul urmator utilizeaza metoda E1ecute direct pe obiectul 'onnection (si nu obiectul Fuer&Def ca n
exemplul anterior).
Dim cnn As Connection, strConnect As String

strConnect = "ODBC;DSN=Publishers;UD=SA;PWD=;DATABASE=Pubs"
Set cnn = OpenConnection("", dbDriveNotPrompt, False, strConnect)
cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync
cnn.Close
La executarea unei interogari asincrone aceasta se poate anula prin testarea metodei )tillE1ecuting.
Exemplul urmator contine o asemenea tehnica.
Function CancelAsyncQuery() As Boolean
Dim wrk As Workspace, cnn As Connection, strConnect As String
Dim errObj As Error

209
On Error GoTo Err_CancelAsyncQuery
Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
strConnect ="ODBC;DSN=Pubs;UD=sa;PWD=;DATABASE=Pubs"
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' Pornirea unei tranzactii pentru a putea reface daca este necesar
wrk.BeginTrans
cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync
' Executarea altor operatiuni

' daca interogarea nu s-a terminat, anuleaza si reface
f cnn.StillExecuting Then
cnn.Cancel
wrk.Rollback
' daca interogarea s-a terminat, ncheierea tranzactiei
Else
wrk.CommitTrans
End f
CancelAsyncQuery = True

Exit_CancelAsyncQuery:
cnn.Close
wrk.Close
Exit Function

Err_CancelAsyncQuery:
For Each errObj n Errors
Debug.Print errObj.Number, errObj.Description
Next errObj
CancelAsyncQuery = False
Resume Exit_CancelAsyncQuery
End Function
Proprietatea )tillE1ecuting si metoda 'ancel pot fi utilizate mpreuna cu obiectele Fuer&Def. 'onnection si
Recor!set%
Un obiect 'onnection suporta o singura operatiune asincrona la un moment dat. n timpul executarii unei
interogari asincrone pe o conexiune nu se mai pot executa si alte operatiuni DAO, cum ar fi procesarea unui
recordset. Pentru a executa interogari asincrone multiple n acelasi timp se vor crea obiecte 'onnection
separate si se va executa fiecare interogare asincrona pe un obiect 'onnection diferit.
Daca se foloseste tehnica tranzactiilor simultan cu interogarile asincrone, aplicarea metodei 'ommitrans
poate opri executia pna cnd se termina interogarea. Din acest motiv se va verifica )tillE1ecuting periodic si
se va termina tranzactia doar dupa ce inteorgarea s-a ncheiat ()tillE1ecuting returneaza False) sau a fost
anulata.
Daca o interogare de tip actiune este anulata n afara unei tranzactii, atunci actualizarea nregistrarilor s-a
efectuat doar pna n momentul activarii metodei 'ancel si operatiunea nu poate fi refacuta prin Roll$ac:.
Pentru a nu permite operatiuni partiale de acest tip, metoda 'ancel se va utiliza doar n interiorul unei
tranzactii. n plus, daca interogarea asincrona este initiata ntr-o procedura si procedura este parasita nainte
de terminarea interogarii, aceasta va continua sa se execute.
Pentru a mbunatati performanta la regasirea datelor dintr-o sursa ODBC se poate utiliza stocarea locala a
nregistrarilor. Valoarea data n proprietatea 'ac3e)i*e a obiectului Fuer&Def specifica numarul de
nregistrari stocate. n mod implicit se stocheaza 100 de nregistrari.
210
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;UD=sa;PWD=;DATABASE=Pubs"
Set qdf = cnn.CreateQueryDef("temporary")
qdf.SQL = "SELECT * FROM roysched"
qdf.CacheSize = 200
Set rst = qdf.OpenRecordset()
' executarea operatiunilor necesare pe recordset

rst.Close
cnn.Close
End Sub
'olectia Parameters
Printr-un obiect Parameter se reprezinta un parametru transmis unei interogari (daca este cazul) sau unei
proceduri memorate pe server. Utilizarea parametrilor permite o mai mare flexibilitate a interogarilor, care nu
mai trebuiesc recompilate la fiecare modificare a parametrilor cautarii. Un obiect Parameter din spatiul
ODBCDirect este similar, cu mici diferente, unui obiect Parameter din spatiul Microsoft Jet. n ODBCDirect se
poate schimba valoarea proprietatii &pe (read-only n spatiul Jet). De asemenea se poate utiliza proprietatea
Direction pentru a indica daca un parametru este de intrare, de iesire, ambele sau valoarea returnata de o
procedura (a se vedea n Help - Direction Property).
'olectia Recor!sets
Un obiect Recor!set reprezinta nregistrarile care rezulta din executarea unei interogari pe un obiect
'onnection sau un obiect Data$ase, ntr-un spatiu de lucru ODBCDirect. Colectia Recor!sets contine toate
obiectele Recor!set deschise curent. Situarea n ierarhia de obiecte este prezentata n tabelul urmator
O$iectul sau
colectia
'ontinut Dn 'ontine
Recor!set (obiect) Colectia
Recor!sets
Colectia 5iel!s
Colectia Properties
Recor!sets
(colectie)
Obiectul
'onnection
Obiect Data$ase
Obiecte Recor!set
Obiectele Recor!set suportate n spatiul de lucru ODBCDirect sunt de tipurile: dynaset, snapshot, forward-
only si dinamic. Cu exceptia ultimului tip, toate celelalte tipuri de obiecte Recor!set au fost prezentate la
spatiul de lucru Microsoft Jet.
O$iecte Recor!set !e tip !inamic
Un obiect Recor!set de tip dinamic este similar unui obiect de tip dynaset, dar este actualizat n mod dinamic,
pe masura ce alti utilizatori executa modificari n tabela de baza.
211
Pentru a crea un obiect Recor!set de tip dinamic se va specifica valoarea !$OpenD&namic pentru
argumentul type al metodei OpenRecor!set%
Recordseturile de tip dinamic sunt disponibile doar pentru acele drivere ODBC care ofera propriile cursoare.
nainte de deschiderea unui Recor!set dinamic trebuie sa se asigure ca driverul ODBC suporta acest lucru.
Pentru driverele care nu ofera cursoare proprii, deci nu suporta recordseturi dinamice, se vor deschide obiecte
Recor!set de tip snapshot sau forward-only.
Avantajul utilizarii obiectelor Recor!set de tip dinamic este reflectarea imediata a tuturor schimbarilor din
date, inclusiv nregistrarile adaugate sau sterse. Pentru a realiza acest lucru este nsa necesar ca DAO sa
interogheze mereu tabelele de baza, ceea ce se traduce prin performanta redusa ca viteza. Acest tip se
recomanda, prin urmare, doar pentru situatii unde este esential sa se dispuna de cele mai recente actualizari
ale datelor.
Desc3i!erea asincrona a o$iectelor Recor!set
Pentru a deschide un Recor!set n mod asincron, similar interogarilor din spatiile ODBCDirect, se utilizeaza
constanta !$RunAs&nc ca valoare a argumentului options pentru metoda OpenRecor!set% Se pot astfel
utiliza metoda 'ancel si proprietatea )tillE1ecuting direct pe obiectul Recor!set% De exemplu, la
deschiderea unui Recor!set care dureaza foarte mult deoarece returneaza un mare numar de nregistrari,
utilizatorul poate fi lasat sa anuleze operatiunea pentru a specifica criterii mai restrictive de formare a
obiectului.
La anularea (prin 'ancel) a unei metode OpenRecor!set, obiectul Recor!set devine nevalabil si trebuie
redeschis pentru a regasi un obiect Recor!set corect.
Pentru cazul obiectelor Recor!set cu multe nregistrari este utila aplicarea metodei Mo"eLast n mod
asincron. Acest fapt se realizeaza utiliznd argumentul !$RunAs&nc cu metoda, sub forma
recordset.MoveLast dbRunAsync
n continuare se poate testa proprietatea )tillE1ecuting (a obiectului Recor!set) si aplica metoda 'ancel.
'olectia 5iel!s
n spatiul de lucru ODBCDirect, un obiect 5iel! reprezinta un cmp dintr-un obiect Fuer&Def sau obiect
Recor!set. Anumite procesari sunt enumerate n continuare.
Proprietatea Or!inalPosition este utilizata pentru determinarea ordinii obiectului 5iel! n colectia
5iel!s.
Proprietatea Value fixeaza sau returneaza data memorata n cmp.
Metodele Appen!'3un:, Get'3un: si proprietatea 5iel!)i*e returneaza sau fixeaza o valoare dintr-
un obiect OLE sau cmp memo a unui obiect Recor!set.
Proprietatile &pe. )i*e si Attri$utes determina tipul datelorcare pot fi memorate ntr-un cmp.
Proprietatile )ource5iel! si )ourcea$le determina sursa originala a datelor.
Proprietatile Value. Visi$leValue si OriginalValue sunt utilizate pentru verificarea completarii cu
succes a unei actualizari n loturi (problema este discutata si n continuare).
9tili*area ODB'Direct
n aceasta sectiune sunt prezentate cteva operatiuni uzuale ntr-un spatiul de lucru ODBCDirect: actualizarea
optimista n loturi, lucrul cu cursoare, lucrul cu proceduri memorate.
212
9tili*area actuali*arii optimiste Dn loturi
n multe aplicatii client-server, actualizarile optimiste apar pe principiul "nregistrare cu nregistrare". Aceasta
se ntmpla n mod uzual n modul
o Un utilizator editeaza o nregistrare.
o Utilizatorul vrea sa salveze nregistrarea.
o Serverul ncearca sa blocheze aceasta nregistrare; daca reuseste, nregistrarea este
actualizata, n caz contrar o violare a blocarii este tratata de catre aplicatie.
o Utilizatorul se muta la alta nregistrare si procesul se reia.
Desi acest mod de operare functioneaza bine n multe cazuri, este uneori mai eficient ca utilizatorul sa editeze
mai multe nregistrari care sunt stocate local si abia apoi sa le trimita serverului ntr-un singur lot pentru
actualizare. Metoda se numeste actualizare optimista n loturi (batch optimistic updating) si presupune etapele:
o Crearea unui spatiu ODBCDirect
o Stabilirea proprietatii Default'ursorDri"er. a spatiului de lucru, la valoare
!$9se'lientBatc3'ursor.
o Deschiderea unui obiect 'onnection sau Data$ase din spatiul ODBCDirect.
o Utilizarea metodei OpenRecor!set pentru obiectul deschis n pasul precedent cu scopul de a
deschide un Recor!set si specificarea constantei !$OptimisticBatc3 ca valoarea a
argumentului lockedits.
o Efectuarea editarilor necesare n obiectul Recor!set. Toate editarile sunt memorate local.
o La terminare, actualizarea sursei de date se efectueaza prin metoda 9p!ate a obiectului
Recor!set, cu specificarea valorii !$9p!ateBatc3 pentru argumentul type.
O$ser"atie. Daca se lanseaza (programatic) o actualizare n lot n timp ce o nregistrare din obiectul
Recor!set este editata de utilizator, nregistrarea care se editeaza va fi actualizata n mod automat nainte de
nceperea actualizarii n lot.
Exemplul urmator ilustreaza modul de utilizare a actualizarii n lot.
Function RunnBatch()
Dim wrk As Workspace, cnn As Connection, rst As Recordset
Dim strConnect As String

' crearea spatiului de lucru
Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
' stabilirea driverului de cursor implicit
wrk.DefaultCursorDriver = dbUseClientBatchCursor
' crearea sirului de conectare
strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UD=sa;PWD=;"
' deschiderea conexiunii
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' deschiderea recordsetului din conexiune
Set rst = cnn.OpenRecordset( _
"SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch)

' schimbarea nregistrarilor n recordsetul local
While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
213
Wend

' actualizarea nregistrarilor n sursa de date
rst.Update dbUpdateBatch
End Function
Daca mai multe nregistrari au fost editate local si se doreste ca nregistrarea curenta sa fie actualizata
naintea actualizarii n lot, se poate apela metoda 9p!ate si specifica !$9p!ate'urrentRecor! pentru
argumentul type. n acest mod se scrie nregistrarea curenta n sursa de date fara a se efectua alta
actualizare, exemplul urmator ilustraza metoda.
' Editarea si actualizarea primei nregistrari
' Doar prima nregistrare este scrisa n sursa de date
rst.MoveFirst
rst.Edit
rst!qty = rst!qty + 2
rst.Update dbUpdateCurrentRecord

' actualizarea restului de nregistrari
rst.Update dbUpdateBatch
ratarea coli*iunilor
La ncercarea de actualizare a unui grup de nregistrari ntr-un singur lot, este posibil ca alti utilizatori sa
editeze n acelasi timp una sau mai multe nregistrari din lot, producnd astfel o coliziune.
Pentru tratarea coliziunilor se va examina proprietatea Batc3'ollisions a obiectului Recor!set% Proprietatea
Batc3'ollisions returneaza un tablou care memoreaza bookmark-uri punctnd catre nregistrarile din obiectul
Recor!set pentru care au aparut coliziuni. De fiecare data cnd apare o coliziune n timpul actualizarii n lot,
este adaugat la tablou un pointer catre registrarea pentru care apare coliziunea. Se poate parcurge fiecare
asemenea bookmark si examina urmatoarele proprietatii ale obiectului 5iel! al nregistrarii curente.
Proprietatea Descriere
Value Valoarea curenta a cmpului din Recor!set.
Aceasta corespunde valorii cmpului dupa
apelul metodei 9p!ate.
OriginalValue Valoarea cmpului din obiectul Recor!set
nainte de apelul metodei 9p!ate.
Visi$leValue Valoarea cmpului dupa cum este memorata
n baza de date.
Dupa examinarea proprietatilor se poate alege o optiune dintre:
o Se poate forta scrierea n baza de date a valorii curente din obiectul Recor!set, suprascriind
valoarea originala a cmpului. Pentru aceasta se apeleaza metoda 9p!ate si specifica rue
pentru argumentul force.
o Se poate schimba valoarea curenta din obiectul propriu Recor!set la valoarea originala si forta
schimbarea n baza de date.
214
O$ser"atie. Apelul metodei 9p!ate cu !$9p!ateBatc3 ca argument type si rue ca argument force produce
trecerea n baza a tuturor modificarilor proprii si suprascrierea modificarilor efectuate de alti utilizatori. Din
acest motiv este mai sigur apelul metodei 9p!ate fara fortare si rezolvarea ulterioara a coliziunilor prin
folosirea tabloului returnat de proprietatea Batc3'ollisions mpreuna cu Value. OriginalValue si
Visi$leValue.
Urmatorul exemplu arata utilizarea tabloului returnat de proprietatea Batc3'ollision n fortarea n baza de
date a modificarilor din obiectul Recor!set local.
Function BatchForceChanges()
Dim rst As Recordset, cnn As Connection, varCollision As Variant
' deschiderea recordsetului pentru actualizarea optimista n lot
Set rst = cnn.OpenRecordset("SELECT * FROM sales", _
dbOpenDynaset, 0, dbOptimisticBatch)
' modificarea nregistrarilor din recordsetul local
While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
Wend
rst.Update dbUpdateBatch

' verificarea coliziunilor si fortarea modificarilor
For j = 0 to rst.BatchCollisionCount - 1
varCollision = rst.BatchCollision(j)
rst.BookMark = varCollision
rst.Update dbUpdateCurrentRecord, True
Next j
End Function
Exemplul urmator poate fi modificat astfel nct actualizarea nregistrarilor cu coliziuni sa nu se desfasoare
una cte una, desi metoda de fortare globala nu este tocmai indicata.
' deschidere recordset
Set rst = _
cnn.OpenRecordset(("SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch)
' modificare nregistrarilor
While Not rst.EOF
rst.Edit
rst!qty = rst!qty + 1
rst.Update
rst.MoveNext
Wend
rst.Update dbUpdateBatch, True
9tili*area cursoarelor Dn spatiile ODB'Direct
Un cursor indica pozitia nregistrarii curente dintr-o multime rezultat. Majoritatea tipurilor de cursoare contin o
reprezentare a datelor din sursa de date si nu sunt actualizabile. Numim keyset un cursor care contine date
efective si care sunt actualizabile.
215
Cu un cursor se lucreaza prin intermediul unui obiect DAO Recor!set. La deschiderea unui obiect Recor!set
prin DAO, ODBCDirect creeaza cursorul corespunzator. Fiecare tip de obiect Recor!set, cu exceptia celui de
tip tabela, corespunde unui tip diferit de cursor.
'aracteristicile cursoarelor
Se pot utiliza cursoare pentru a lucra cu multimi de date dintr-o sursa ODBC. Cursoarele pot:
o Sa reprezinte anumite nregistrari sau toate nregistrarile unei tabele
o Sa reprezinte anumite nregistrari sau toate nregistrarile unei uniuni de tabele
o Sa nu reprezinte nici o nregistrare
o Sa fie read-only sau actualizabile fie la cursor sau la nivel de cmp
o Sa fie complet navigabile sau doar nainte
o Sa existe fie la client, fie pe server.
'ursoare pe partea client sau pe partea ser"er
Un cursor necesita resurse temporare pentru a-si pastra datele. Aceste resurse pot fi n forma RAM, un fisier
paginabil cum ar fi memoria virtuala din Windows, sau fisiere/baze de date temporare. Daca resursele sunt
memorate pe masina clientului, cursorul este numit cursor client-side. Cu acest tip de cursor, serverul trimite
datele reprezentnd cursorul prin retea catre client, ca si datele cerute de cursor. Clientul gestioneaza
resursele temporare necesare.
Anumite motoare de baze de date, cum ar fi Microsoft SQL Server 6.0, suporta si cursoare de tip server-side.
Cu acest tip de cursor, serverul gestioneaza multimea de nregistrari rezultate cu resurse de pe server.
Serverul returneaza prin retea doar datele cerute de client. Utilizarea acestui tip de cursor poate creste
performanta aplicatiei, mai ales atunci traficul de retea este mare, dar apare conditia ca serverul sa poata oferi
resursele necesare tuturor cursoarelor cerute de clienti.
Alegerea tipului !e cursor
La deschiderea unui obiect Recor!set pe o sursa de date care nu este ODBC, constanta utilizata pentru
argumentul type al metodei OpenRecor!set determina tipul de recordset deschis. La deschiderea unui
Recor!set pe o sursa ODBC, acelasi argument, type, specifica tipul de cursor pe care l reprezinta obiectul
Recor!set% Fiecare tip de cursor corespunde unui tip de recordset. Urmatorul tabel arata efectul valorilor
argumentului type att pentru surse de date ODBC, ct si pentru surse non-ODBC.
'onstanta
(argumentul type)
Recor!set t&pe
(surse non-
ODBC)
'ursor t&pe
(surse de date ODBC)
!$OpenDinamic Dynamic type Dynamic
!$OpenD&naset Dynaset type Keyset
!$Open)naps3ot Snapshot type Static
!$Open5or4ar!Onl& Forward-only
type
Forward-only scrolling
(valoarea implicita)
O$ser"atie. Cum obiecte Recor!set de tip tabela nu exista n spatiile de lucru ODBCDirect, nu exista cursor
corespunzator acestui tip de recordset.
216
Proprietatea Default'ursorDri"er a obiectului 2or:space specifica unde este creat cursorul la client sau
pe server. Valorile posibile pentru proprietate sunt date n tabelul alaturat.
'onstanta
(proprietatea
Default'ursorDri"er)
Descriere
!$9seODB''ursor Utilizare cursoare la client. Rezultate
bune pentru multimi mici de nregistrari
rezultate.
!$9ser)er"er'ursor Utilizare cursoare pe server.
Performanta mai buna pentru multe
nregistrari dar poate duce la marirea
traficului de retea, nu toate sursele
ODBC suporta aceasta valoare.
!$9seDefault'ursor Utilizare cursoare pe server, daca este
posibil; cursoare client n caz contrar.
!$9se'lientBatc3'ursor Utilizarea cursoarelor lor la client. Cerut
la actualizarile n loturi.
!$9se/o'ursor Deschidere obiect Recor!set ca
forward-only, read-only, cu rowset = 1.
Blocarea Dnregistrarilor (Recor! Loc:ing)
La deschiderea unui obiect Recor!set se poate specifica si tipul de blocaj al nregistrarilor intentionat n cazul
actualizarilor. Pentru aceasta se utilizeaza argumentul lockedits al metodei OpenRecor!set. Urmatorul tabel
contine explicatii pentru tipurile posibile de blocaj si valorile corespunzatoare ale argumentului lockedits.
'onstanta
(argumentul lockedits)
Descrierea
tipului de blocaj al cursorului ODBC
!$Optimistic Pagina continnd nregistrarea este
blocata doar att timp ct nregistrarea
este actualizata prin metoda 9p!ate.
!$Pessimistic Pagina cu nregistrarea este blocata ct
mai devreme, de la utilizarea metodei
E!it.
!$OptimisticValue Utilizarea concurentei optimiste bazata pe
valorile nregistrarilor.
!$OptimisticBatc3 Utilizarea actualizarii optimiste n lot.
!$Rea!Onl& mplicita pentru spatiile ODBCDirect,
interzice modificari n datele obiectului
Recor!set.
217
Anumite combinatii de tipuri de cursoare si de blocaj nu functioneaza mpreuna. De exemplu, cu cursoarele
Microsoft SQL Server 6.0, specificarea !$Open)naps3ot pentru argumentul type cere specificarea
!$Rea!Onl& pentru lockedits. Combinatiile care merg se vor vedea n documentatia driverului cursorului.
Utilizarea unei combinatii nesuportate este raportata de DAO n colectia Errors, de unde poate fi analizata si
tratata prin alegerea urmatoarei combinatii plauzibile.
Limitari ale cursoarelor
Datorita valorilor implicite prezentate n tabelele anterioare, obiectul Recor!set implicit este read-only,
forward-only si nu poate fi actualizat. Editarea nregistrarilor necesita specificarea explicita a unui tip de blocaj
diferit de !$Rea!Onl& la aplicarea metodei OpenRecor!set%
Deoarece nu se pot deschide recordseturi de tip tabela n spatiul ODBCDirect, nu se pot utiliza proprietatea
In!e1 si metoda )ee: de regasire a datelor. De asemenea nu se pot utiliza metodele Find: 5in!5irst.
5in!/e1t. 5in!Pre"ious sau 5in!Last. n mediul client/server este mai eficient sa se selecteze doar datele
necesare si nu multimi mai vaste din care sa se gaseasca ulterior nregistrarile necesare. Aceasta nseamna
ca interogarile trebuie efectuate mai atent (mai restrictive).
Regasirea unor multimi multiple !e re*ultate
Orice propozitie SQL poate include mai multe propozitii SELECT sau proceduri memorate care invoca una sau
mai multe propozitii SELECT. Fiecare instructiune SELECT genereaza o multime de rezultate care trebuie sa
fie procesata de cod sau ignorata mai nainte ca resursele sa fie eliberate si urmatoarea multime de rezultate
sa fie disponibila pentru procesare. Deoarece nu se stie a priori cte multimi de rezultate sunt generate de o
procedura memorata, codul trebuie sa fie pregatit sa prelucreze un numar necunoscut de multimi. De notat ca
n cazul returnarii de catre o procedura memorata a mai multor multimi de rezultate, nici una dintre acestea nu
poate fi actualizata.
Se pot utiliza fie cursoare client-side, fie cele server-side pentru regasirea unor multiple multimi de rezultate.
Daca se utilizeaza cursoare client-side, multimile de rezultate sunt returnate de toate obiectele Recor!set.
Cursoarele server-side returneaza multiple multimi de rezultate doar la deschiderea unui Recor!set de tip
forward-only.
Pentru obtinerea mai multor multimi de rezultate
1. Stabilirea proprietatii Default'ursorDri"er la valoarea !$9se)er"er'ursor pentru specificarea
cursoarelor server-side
2. Crearea unui obiect Fuer&Def si stabilirea proprietatii )FL la un sir valid SQL care returneaza multiple
obiecte Recor!set%
3. Stabilirea proprietatii 'ac3e)i*e a obiectului Fuer&Def la 1 pentru a cere serverului trimiterea unei
singure nregistrari o data. La regasirea nregistrarilor n acest mod nu se utilizeaza efectiv cursorul.
4. Deschiderea obiectului Recor!set pe obiectul Fuer&Def creat. Se da valoarea !$Open5or4ar!Onl&
pentru argumentul type al metodei OpenRecor!set.
5. Utilizarea metodei /e1tRecor!set pentru a accesa urmatorul obiect Recor!set din grupul de obiecte
Recor!set returnat de server. Aceasta ignoreaza obiectul Recor!set curent si l nlocuieste cu
urmatorul obiect. Daca nu mai exista obiecte Recor!set atunci metoda /e1tRecor!set returneaza
valoarea False iar obiectul curent Recor!set va fi gol (empty).
Exemplul urmator tipareste valorile pentru fiecare cmp din fiecare nregistrare a fiecarei multimi 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
218

' creare spatiu ODBCDirect
Set wrk = DBEngine.CreateWorkspace(""ODBCDirect", "Admin", "", dbUseODBC)
' creare sir de conectare
strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UD=sa;PWD=;"
' deschidere conexiune
Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect)
' Creare instructiuni 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
Ser rst = qdf.OpenRecordset(dbOpenForwardOnly)

Do Until fDone = True
' tiparirea valorilor cmpurilor
While Not rst.EOF
For Each fld n 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 proce!uri memorate
Se pot utiliza obiecte ODBCDirect Fuer&Def pentru a executa proceduri memorate, inclusiv proceduri
memorate care necesita parametri de intrare si returneaza valori. Urmatorul exemplu creeaza procedura
numita GetEmps, memorata pe server.
strSQL = "CREATE PROCEDURE GetEmps AS"
strSQL = strSQL & "SELECT * FROM EMPLOYEE;"
cnn.Execute strSQL
Daca exista desi o procedura cu acest nume, se poate utiliza instructiunea DROP pentru a sterge mai nainte
versiunea veche:
strSQL = "DROP PROCEDURE GetEmps;"
cnn.Execute strSQL
Se poate executa procedura memorata utiliznd metoda E1ecute a obiectului 'onnection. Pentru a regasi
valoarea returnata se creeaza un obiect Fuer&Def si deschidem un recordset pe el.
Set qdf = cnn.CreateQueryDef("qry", "{ call GetEmps() }")
Set rst = qdf.OpenRecordset
219
Se utilizeaza obiectul Parameter pentru a lucra cu parametrii. Proprietatea Direction a obiectului Parameter
comunica DAO cum functioneaza parametrul. Driverul ODBC ncearca sa determine directia parametrului
(intrare sau iesire) dar proprietatea Direction este read/write asa ca directia poate fi schimbata. Urmatorul
exemplu creeaza o procedura memorata cu un parametru de intrare si o valoare returnata. Procedura este
executata si se regaseste valoarea returnata.
' crearea procedurii memorate pe server
strSQL = "CREATE PROCEDURE UpdateEmps (@invar int) AS RETURN @invar;"
cnn.Execute strSQL

' crearea QueryDef pentru a executa procedura memorata
Set qdf = cnn.CreateQueryDef("qry", "{ ? = call UpdateEmps(?) }")

' tratarea parametrilor
qdf.Parameters(0).Direction = dbParamReturnValue
qdf.Parameters(1) = 10
qdf.Execute

' obtinerea valorii returnate
var = qdf.Parameters(0).Value
220
Mo!elul !e o$iecte Po4erPoint
O$iectul Application
Returnarea unui obiect Application
Controlul aspectului ferestrei aplicatiei
Controlarea atributelor si comportarii globale
Accesarea principalelor obiecte
Accesarea obiectelor partajate de Ms Office
O$iectul Presentation
Returnarea obiectului Presentation
Deschiderea unei prezentari
Crearea unei prezentari
mportul dintr-un outline Word
Activarea unei prezentari
Numerotarea si dimensiunile slide-urilor
Stabilirea unui aspect unitar
Tiparirea unei prezentari
Salvarea unei prezentari
nchiderea unei prezentari
Configurarea si executarea unei prezentari
Accesul la diapozitivele prezentarii
O$iectele )li!es. )li!e si )li!eRange
Returnarea colectiei Slides
Returnarea unui obiect Slide
Returnarea unui obiect SlideRange
Adaugarea unei diapozitiv
Stabilirea fundalului si schemei de culori
Alegerea unui layout
Adaugarea de obiecte
Ordinea diapozitivelor
Stabilirea efectelor tranzitiei
Referirea notelor
O$iectul )election
Crearea unei selectii
Returnarea unei selectii
Returnarea unui obiect din selectie
O$iectele Vie4 si )li!e)3o4Vie4
Prezentari, ferestre, viziuni
Returnarea obeictelor View si SlideShowView
Navigarea printre diapozitive
Alipirea la un obiect View
Controlul viziunii din fereastra documentului
Returnarea diapozitivului curent
'ontrolul o$iectelor Dn sli!e s3o4
Controlul animatiei
Raspunsul la actiunea mouse-ului
Controlul unui clip
n acest capitol se prezinta principalele obiecte din modelul de obiecte Microsoft PowerPoint 97. Pentru a
vedea o imagine a ntregului model de obiecte PowerPoint ca si enumerarile complete ale proprietatilor si
metodelor se vor consulta, totusi, intrarile respective din Help.
Afisarea sistemului de help Microsoft PowerPoint Visual Basic este posibila daca la instalarea aplicatiei
PowerPoint s-a selectat instalarea componentei Online Eelp for Visual Basic. Pentru a vedea continutul si
221
indexul acestui sistem de fisiere Help, click pe 'ontents an! In!e1 n meniul Eelp din Visual Basic Editor
(VBE), iar n fisa 'ontents din dialogul Eelp opics dublu click pe "Microsoft PowerPoint Visual Basic
Reference".
O$iectul Application
La pornirea unei sesiuni PowerPoint, se creeaza un obiect Application. Proprietatile si metodele acestui
obiect sunt utilizate pentru controlarea atributelor si comportarii ntregii aplicatii si obtinerea accesului la restul
modelului de obiecte PowerPoint.
Urmatoarele proprietati pot fi utilizate fara calificatorul Application, constituind accesori la modelul de obiecte:
Acti"ePresentation. Acti"e2in!o4. A!!Ins. Assistant. 'omman!Bars. Presentations.
)li!e)3o42in!o4s si 2in!o4s. Pentru alte proprietati si metode este necesara calificarea. De exemplu:
Application.Quit
Cele mai utilizate proprietati si metode sunt prezentate, dupa functionalitate, n continuare.
Returnarea unui o$iect Application
Din cod executate n PowerPoint, obiectul Application este referit prin cuvntul cheie Application, ca n
exemplul anterior.
Daca se atribuie unei variabile obiectul Application, variabila se va declara de tip PowerPoint.Application,
dupa modelul
Dim appPPT As PowerPoint.Application
Set appPPT = Application
Se poate utiliza de asemenea proprietatea Application a oricarui obiect PowerPoint pentru a returna obiectul
Application PowerPoint. Aceasta metoda este utila atunci cnd este necesar sa se obtina referinta la obiectul
Application dintr-o prezentare PowerPoint scufundata n documentul altei aplicatii. Urmatorul exemplu,
executat din Excel, stabileste o variabila la obiectul aplicatie PowerPoint utiliznd primul shape (care trebuie
sa 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
Urmatorul exemplu creeaza un obiect Application PowerPoint din alta aplicatie, porneste PowerPoint si
deschide o prezentare existenta:
Set ppt = CreateObject("Powerpoint.Application.8")
ppt.Visible = True
ppt.Presentations.Open ".numele prezentarii, eventual cu cale"
'ontrolul aspectului ferestrei aplicatiei
Un rezumat al proprietatilor si metodelor care controleaza aspectul ferestrei n care se executa PowerPoint
este prezentat n tabelul urmator.
222
Actiunea Proprietatea sau meto!a
utila
Activarea ferestrei aplicatiei PowerPoint Metoda Acti"ate
Verificarea faptului ca fereastra aplicatiei
PowerPoint este activa
Proprietatea Acti"e
Stabilirea sau returnarea textului care apare
n bara de titlu a aplicatiei PowerPoint
Proprietatea 'aption
Stabilirea sau returnarea marimii si pozitiei
ferestrei PowerPoint pe ecran
Proprietatile Eeig3t. Left.
op si 2i!t3
Stabilirea sau returnarea vizibilitatii ferestrei
aplicatiei. Trebuie data valoarea rue la
crearea obiectului Application PowerPoint
n alta aplicatie pentru a vedea PowerPoint
pe ecran.
Proprietatea Visi$le
Stabilirea sau returnarea starii ferestrei
aplicatiei: maximizata, minimizata sau
flotanta.
Proprietatea
2in!o4s)tate
Multe dintre aceste proprietati si metode se aplica, de asemenea, obiectului Document2in!o4 pentru
controlarea aspectului ferestrei documentului.
'ontrolarea atri$utelor si comportarii glo$ale a aplicatiei
Atributele sau actiunile caracteristice pentru ntreaga aplicatie PowerPoint sunt controlate prin proprietatile si
metodele prezentate n tabelul urmator.
Actiunea Proprietatea sau meto!a
utila
Numele imprimantei active Proprietatea Acti"ePrinter
Returnarea numarului de constructie
PowerPoint
Proprietatea Buil!
Afisarea unui subiect de Help Metoda Eelp
Returnarea numelui sistemului de
operare
Proprietatea
Operating)&stem
Returnarea caii catre aplicatia
PowerPoint
Proprietatea Pat3
Parasirea (nchiderea) aplicatiei
PowerPoint
Metoda Fuit
Executarea unei proceduri Visual Metoda Run
223
Basic
Returnarea numarului de versiune Proprietatea Version
Accesarea principalelor o$iecte ale aplicatiei
Proprietatile enumerate n tabelul urmator dau acces la principalele obiecte continute n obiectul Application:
prezentari, ferestre ale documentului, ferestre de vizualizare a diapozitivelor. Toate proprietatile sunt ale
obiectului Application%
O$iectul returnat Proprietatea utili*ata
Presentations (colectie) Proprietatea Presentations
Prezentarea activa Proprietatea
Acti"ePresentation
Document2in!o4s (colectie) Proprietatea 2in!o4s
Fereastra documentului activ Proprietatea Acti"e2in!o4
A!!Ins (colectie) Proprietatea A!!Ins
)li!e)3o42in!o4s (colectie) Proprietatea
)li!e)3o42in!o4s
Accesarea o$iectelor parta(ate !e Microsoft Office
Obtinerea referintelor de obiecte comune tuturor aplicatiilor Microsoft Office, cum ar fi barele de meniuri si de
unelte, FileSearch etc., este rezumata n tabelul urmator.
Referinta la Proprietatea utili*ata
Office Assistant Proprietatea Assistant
Meniuri si bare de unelte PowerPoint Proprietatea 'omman!Bars
Cautarea fisierelor Proprietatea 5ile)earc3
Editorul Visual Basic Proprietatea VBE
O$iectul Presentation
Se creeaza un obiect Presentation de fiecare data cnd se deschide sau se creeaza un fisier (o prezentare)
n PowerPoint. Se va observa ca multe dintre proprietatile si metodele obiectului Presentation corespund
intrarilor din meniul 5ile. Proprietatile si metodele obiectului Presentation. sau ale colectiei respective, sunt
utilizate pentru a deschide, crea, salva sau nchide fisiere. Prin intermediul lor se vor controla atributele si
comportarea globala si, de asemenea, se va obtine acces la obiectele continute: slide-uri si mastere.
Returnarea o$iectului Presentation
224
Se va utiliza proprietatea Acti"ePresentation a obiectului Application pentru a returna prezentarea care este
afisata n fereastra activa. Urmatorul exemplu salveaza prezentarea activa:
ActivePresentation.Save
Se poate returna oricare dintre prezentarile deschise curent prin colectia Presentations, n modul uzual de
referire a unui element dintr-o colectie:
Presentations("Sample Presentation").Slides.Add 1, 1
adauga un nou slide la prezentarea "Sample Presentation".
Prin proprietatea Presentation a obiectelor Document2in!o4 si )li!e)3o42in!o4 se poate returna o
referinta la prezentarea care a creat respectivele ferestre (de remarcat ca proprietatea Parent returneaza un
obiect diferit daca obiectul apartine unei prezentari scufundate). Urmatorul exemplu afiseaza numele
prezentarii care se executa n prima fereastra slide show:
MsgBox SlideShowWindow(1).Presentation.Name
Pentru a returna un obiect Presentation reprezentnd o prezentare scufundata, se utilizeaza proprietatea
O$(ect a obiectului OLE5ormat pentru forma (shape) care contine prezentarea scufundata, dupa modelul
Dim embeddedPres As Presentation
Set embeddedPres = ActivePresentation.Slides(1).Shapes(3).OLEFormat.Object
prin care se atribuie variabilei embeddedPres prezentarea scufundata n al treilea shape de pe diapozitivul cu
numarul 1.
Desc3i!erea unei pre*entari e1istente
Metoda Open a colectiei Presentations (returnata de proprietatea sinonima a obiectului Application)
realizeaza deschiderea unei prezentari, dupa modelul
Dim myPres As Presentation
Set myPres = Presentations.Open _
(FileName:= " . nume fisier + cale (daca este necesara).")
myPres.Window(1).ViewType = ppViewSlideSorter
unde prezentarea deschisa este vizualizata n modul Slide Sorter.
'rearea unei pre*entari noi
n acest scop se utilizeaza metoda A!! a colectiei Presentations. Este uzual ca obiectul Presentation
obtinut sa fie atribuit unei variabile pentru procesare programatica ulterioara. n exemplul urmator se creeaza o
prezentare noua si se adauga 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 usoara la o prezentare. n
exemplul urmator se creeaza o noua prezentare care este salvata imediat cu un nume prin aplicarea metodei
)a"eAs. Este de remarcat ca proprietatea /ame a obiectului Presentation este read-only si prin urmare nu
225
poate fi modificata; astfel o prezentare este identificata n mod unic prin numele sau ntr-un proiect. Numele
poate fi utilizat n mod uzual pentru a obtine o referinta prin intermediul colectiei Presentations:
Presentations.Add.SaveAs "Sales Report"
Presentations("Sales Report").Slides.Add 1, ppLayoutTitle
Importul unei pre*entari !intr<o sc3ita (outline) 2or!
Crearea unei prezentari dintr-un outline scris n Word se realizeaza din Microsoft Word prin metoda PresentIt
a obiectului Document reprezentnd outline-ul. Exemplul urmator este ilustrativ:
Documents.Open("C:\Presentation Outline.doc").Presentt
Acti"area unei pre*entari
Nu exista o metoda Acti"ate pentru obiectul Presentation. Activarea prezentarii are loc o data cu activarea
uneia dintre ferestrele de document ale prezentarii:
Presentations("Sales Report").Windows(1).Activate
'ontrolul numerotarii si !imensiunii !iapo*iti"elor
Proprietatea Page)etup a obiectului Presentation returneaza un obiect Page)etup. Acest obiect contine
valorile pentru orientarea pagini de note si a diapozitivelor, dimensiuni si numerotare. Proprietatile obiectului
Page)etup sunt similare dialogului Page)etup din meniul 5ile, astfel nct anumite atribuiri produc n mod
automat efecte asupra altor parametri (de exemplu o latime mai mare dect naltimea produce o orientare
landscape). Proprietatile sunt:
5irst)li!e/um$er - returneaza sau stabileste numerotarea primului diapozitiv.
/otesOrientation. )li!eOrientation - returneaza sau stabilesc orientarea pe ecran si imprimanta a notelor si
diapozitivelor. Pot fi una dintre valorile (MsoOrientation): msoOrientationHorizontal, msoOrientationMixed sau
msoOrientationVertical.
)li!eEeig3t. )li!e2i!t3 - returneaza sau stabilesc dimensiunile unui diapozitiv, n puncte.
)li!e)i*e - tipul de dimensiune a unui diapozitiv. Poate fi una dintre constantele predefinite
(Pp)li!e)i*e&pe): ppSlideSize35MM, ppSlideSizeA4Paper, ppSlideSizeCustom, ppSlideSizeLetterPaper,
ppSlideSizeOnScreen sau ppSlideSizeOverhead.
Exemplul urmator stabileste pentru toate diapozitivele dimensiunea 11" x 8.5" si numerotarea diapozitivelor de
la 17.
With ActivePresentation.PageSetup
.SlideWidth = 11 * 72
.SlideHeight = 8.5 * 72
.FirstSlideNumber = 17
End With
Ar fi de remarcat ca stabilirea explicita a dimensiunilor produce trecerea proprietatii )li!e)i*e la valoarea
ppSlideSizeCustom si a proprietatii )li!eOrientation la msoOrientationHorizontal.
)ta$ilirea unui aspect unitar al pre*entarii
226
Se poate lucra programatic cu sabloane si cu elementele master ale unei prezentari.
Aplicarea unui sablon se efectueaza prin metoda Appl&emplate a obiectului Presentation, dupa modelul
ActivePresentation.ApplyTemplate " . template-ul, eventual cu cale ."
Proprietatile Ean!outMaster. /otesMaster. )li!eMaster sau itleMaster ale obiectului Presentation
returneaza un obiect Master care reprezinta masterul entitatii respective.
Utilizarea proprietatilor obiectului Master permite stabilirea fundalului, modificarea schemei de culori,
adaugarea de controale ActiveX, lucrul cu stilurile de text. Orice modificare efectuata pentru Master se reflecta
n categoria respectiva de elemente ale prezentarii.
Dintre proprietatile obiectului Master prezentam cteva n continuare, fiecare necesitnd nsa o cautare n
Help deoarece returneaza colectii de obiecte complexe.
Bac:groun! - returneaza un obiect )3apeRange reprezentnd background-ul diapozitivului.
'olor)c3eme - returneaza sau stabileste obiectul 'olor)c3eme reprezentnd schema de culori a
masterului.
Eea!ers5ooters - returneaza colectia Eea!ers5ooters care reprezinta antetul, subsolul, data si numarul de
pagina al diapozitivului.
Eeig3t. 2i!t3 - returneaza dimensiunile, n puncte. Sunt read-only pentru un master.
)3apes - returneaza colectia )3apes reprezentnd toate elementele care au foest plasate sau inserate n
master. Colectia poate contine desene, forme (shapes), obiecte OLE, imagini etc.
e1t)t&les - returneaza colectia e1t)t&les reprezentnd trei stiluri de text: title text (stilul titlului), body text
(textul din interiorul diapozitivului) si default text (textul din forme grafice shapes).
Urmatorul exemplu stabileste umplerea fundalului diapozitivului master:
ActivePresentation.SlideMaster.Background.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientBrass
Daca se doreste ca o forma specifica, cum ar fi o imagine sau un control ActiveX, sa apara pe toate slide-urile
unei prezentari, aceasta se va adauga la master. Un control ActiveX de pe master va raspunde la evenimente
din prezentarea diapozitivelor la fiecare click pe control, pe orice slide s-ar afla.
Modificarile uniforme ale textului se realizeaza prin intermediul stilurilor. Fiecare obiect e1t)t&le (din colectia
returnata de proprietatea e1t)t&les) contine un obiect e1t5rame care descrie cum este plasat textul n
boxa de text si un obiect Ruler care contine tab stopurile si informatia de indentare. Proprietatea Le"els a
obiectului e1t)t&le returneaza colectia e1t)t&leLe"els care contine informatia de formatare pentru 5 nivele
de lista ierarhizata (pentru titlu si corp se va utiliza ntotdeauna nivelul nti). Exemplul urmator utilizeaza
aceste proprietati pentru o formatare:
With ActivePresentation.SlideMaster.TextStyles(ppBodyStyle).Levels(1)
With .Font
.Name = "Arial"
.Size = 36
End With
227
With .ParagraphFormat
LineRuleAfter = False
.SpaceAfter = 6
End With
End With
O$ser"atie. Stilurile pentru titlu si textul interior se poate stabili n mod diferit pentru fiecare master. Stilul
textului din formele gafice nu se aplica pentru fiecare master, ci este global, pentru ntreaga prezentare.
iparirea unei pre*entari
Metoda PrintOut a obiectului Presentation tipareste prezentarea:
ActivePresentation.PrintOut
Optiunile de tiparire sunt fixate anterior tiparirii prin proprietatile si metodele obiectului PrintOptions (returnat
de proprietatea sinonima a obiectului Presentation).
Dintre proprietatile obiectului PrintOptions enumeram:
Output&pe care returneaza sau stabileste care elemente ale presentarii se tiparesc. Poate fi o constanta de
tip PpPrintOutput&pe#
ppPrintOutputBuildSlides ppPrintOutputNotesPages
ppPrintOutputOutline ppPrintOutputSixSlideHandouts
ppPrintOutputSlides (implicita) ppPrintOutputThreeSlideHandouts
ppPrintOutputTwoSlideHandouts
/um$erOf'opies care returneaza sau stabileste numarul de copii tiparite.
5itoPage care este True daca la tiparire se va scala diapozitivul nct sa se potriveasca foii de hrtie.
Ranges care returneaza obiectul PrintRanges reprezentnd domeniile de dipozitive care se tiparesc.
'ollate care este True (si implicit) daca o copie a prezentarii este tiparita complet naintea copiei urmatoare.
Exemplul urmator utilizeaza cteva asemenea proprietati:
With ActivePresentation.PrintOptions
.NumberOfCopies = 3
.Collate = True
.Parent.PrintOut
End With
unde se remarca faptul ca proprietatea Parent returneaza obiectul Presentation caruia i se poate folosi
proprietatea PrintOut%
)al"area unei pre*entari
Prima salvare a prezentarii, n care i se daun nume, se efectueaza prin metoda )a"eAs:
228
With Presentations.Add
.Slides.Add 1, ppLayoutTitle
.SaveAs "Sample"
End With
Urmatoarele salvari se obtin prin metoda )a"e:
ActivePresentation.Save
?nc3i!erea unei pre*entari
Pentru a nchide o prezentare se aplica obiectului Presentation metoda 'lose#
Presentations("Sample").Close
Daca prezentarea a fost modificata de la ultima salvare, este afisat, n mod automat, un mesaj de interogare
asupra salvarii. Pentru a nchide prezentarea fara salvare si fara afisarea mesajului se stabileste mai nti
proprietatea )a"e! la True:
With Application.Presentations("Sample")
.Saved = True
.Close
End With
'onfigurarea si e1ecutarea unei pre*entari
Se va utiliza proprietatea )li!e)3o4)ettings a obiectului Presentation pentru a returna obiectul sinonim
)li!e)3o4)ettings care reprezinta executia unei prezentari de diapozitive.
Obiectul )li!e)3o4)ettings are o singura metoda, Run. care executa prezentarea potrivit parametrilor
stabiliti de proprietatile obiectului )li!e)3o4)ettings.
Dintre proprietati enumeram cteva n continuare.
A!"anceMo!e returneaza sau stabileste valoarea care controleaza modul de trecere la urmatorul diapozitiv.
Poate fi o constanta de tip Pp)li!e)3o4A!"anceMo!e# ppSlideShowManualAdvance,
ppSlideShowRehearseNewTimings sau ppSlideShowUseSlideTimings.
)tarting)li!e. En!ing)li!e stabilesc sau returneaza diapozitivul cu care se ncepe executia prezentarii si cel
unde se termina vizionarea.
Loop9ntil)toppe! care este True daca prezentarea se executa ciclic pna la apasarea tastei ESC.
Range&pe returneaza sau fixeaza tipul de prezentare executata. Poate fi una dintre constantele de tip
Pp)li!e)3o4Range&pe# ppShowAll, ppShowNamedSlideShow sau ppShowSlideRange.
Urmatorul exemplu ilustreaza cteva proprietati:
With ActivePresentation.SlideShowSettings
.StartingSlide = 2
.EndingSlide = 4
.RangeType = ppShowSlideRange
.AdvanceMode = ppSlideShowUseSlideTimings
229
.LoopUntilStopped = True
.Run
End With
unde se remarca faptul ca ultima instructiune apeleaza metoda Run, dupa ce s-au fixat atributele executiei.
Accesul la !iapo*iti"ele pre*entarii
Prin metoda )li!es a obiectului Presentation se obtine accesul la diapozitivele prezentarii si, de aici, la textul
si grafica unui diapozitiv. Obiectul )li!e este prezentat n sectiunea urmatoare.
O$iectele )li!es. )li!e si )li!eRange
Exista trei obiecte diferite n modelul de obiecte PowerPoint care reprezinta diapozitive: colectia )li!es a
tuturor diapozitivelor dintr-o prezentare, colectia )li!eRange a diapozitivelor dintr-o submultime de diapozitive
si obiectul )li!e care reprezinta un diapozitiv individual. n general, se va utiliza colectia )li!es pentru
adaugarea unui diapozitiv si cnd se parcurg toate diapozitivele prezentarii; se va utiliza obiectul )li!e daca
se lucreaza cu un anumit diapozitiv; se va utiliza colectia )li!eRange pentru a formata sau lucra cu mai multe
diapozitive.
Returnarea colectiei )li!es
ntreaga multime de diapozitive a unei prezentari este referita prin proprietatea )li!es a obiectului
Presentation. Urmatorul exemplu insereaza slide-urile din Clipboard la sfrsitul prezentarii (pentru ca nu s-a
specificat locul lipirii prin .Paste(index)):
Activepresentation.Slides.Paste
Returnarea o$iectului )li!e
O referinta la un slide anumit se obtine prin intermediul colectiei )li!es n mod uzual prin metoda Item.
Metoda fiind implicita, mentioanrea ei este facultativa.
ActivePresentation.Slides(3).Copy
copie al treilea slide n Clipboard.
Fiecare diapozitiv al unei prezentari are atasat un numar de identificare unic, definit automat la crearea
diapozitivului. Atunci cnd n proiectarea unei prezentari se insereaza noi diapozitive, se sterg diapozitive, se
sorteaza etc., referirea prin indice nu returneaza ntotdeauna acelasi diapozitiv. Referirea prin numarul de
identificare conduce mereu la acelasi diapozitiv. Proprietatea )li!eID a unui slide returneaza numarul de
identificare, proprietatea fiind read-only. Proprietatea 5in!B&)li!eID permite specificarea unui slide prin D-ul
sau. Exemplul urmator utilizeaza aceste proprietati:
Dim newSlideD As Long
newSlideD = ActivePresentation.Slides.Add(1,ppLayoutTitleOnly).SlideD
ActivePresentation.Slides.FindBySlideD(newSlideD).Copy
Pentru a obtine o referinta la diapozitivul afisat curent ntr-o fereastra document sau de slide show, se
utilizeaza proprietatea )li!e a obiectului Vie4 al ferestrei, dupa modelul
Windows(2).View.Slide.Copy
230
Pentru a returna un slide dintr-o selectie, se foloseste )election%)li!eRange(index), unde index este numele
sau numarul de ordine din colectie:
ActiveWindow.Selection.SlideRange(1).Layout = ppLayoutTitle
Returnarea unui o$iect )li!eRange
Prin )li!es%Range(index), unde index este numele, indexul sau un tablou de asemenea elemente (nume sau
indici), se returneaza un obiect )li!eRange din colectia )li!es. Pentru diapozitivele selectate astfel se poate
realiza o formatare unitara etc.
With Activepresentation.Slides.Range(Array(1, 3))
.FollowMasterBackground = False
.Background.Fill.PresetGradient (msoGradientHorizontal, 1, msoGradientLateSunset)
End With
A!augarea unui !iapo*iti"
La colectia )li!es se aplica metoda A!!% Se creeaza un nou diapozitiv, se adauga la colectia tuturor
diapozitivelor. Metoda accepta doua argumente prin care se specifica locul noului slide si layout-ul
diapozitivului. Ca rezultat al aplicarii metodei se returneaza un obiect )li!e. Sintaxa:
expression.A!!(ndex, Layout)
unde
expression returneaza o colectie )li!es.
(ndex specifica rangul noului slide n colectia )li!es (locul efectiv ocupat). Nu poate depasi Slides.Count + 1.
.ayout specifica formatul noului diapozitiv. Poate fi una dintre constantele Pp)li!eLa&out#
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 urmator adauga un slide titlu la nceputul prezentarii active.
231
ActivePresentation.Slides.Add 1, ppLayoutTitleOnly
nserarea de diapozitive bazate pe un outline Word se realizeaza prin metoda Insert5rom5ile, dupa modelul
ActivePresentation.Slides.nsertFromFile _
FileName:=" . numele fisierului Word .", ndex:=3
Metoda are un domeniu mai larg de aplicabilitate, sintaxa este
expression.Insert5rom5ile(FileName, ndex, SlideStart, SlideEnd)
unde
expression returneaza o colectie )li!es%
1ileName este numele fisierului, eventual cu cale.
(ndex rangul diapozitivului din colectia )li!es specificata dupa care se insereaza noile diapozitive.
-lide-tart, -lide3nd specifica prin indicii de inceput si de sfrsit domeniul diapozitivelor din fisier care se
insereaza n colectia )li!es% ndicele omis este luat implicit drept indicele minim, respectiv maxim.
)ta$ilirea fun!alului si a sc3emei !e culori
Pentru o formatare globala se vor utiliza elementele master. Daca se doreste ca un diapozitiv sau un grup de
diapozitive sa aiba o formatare distincta, se va utiliza proprietatea Bac:groun! sau 'olor)c3eme a
obiectului )li!e sau )li!eRange.
Proprietatea Bac:groun! returneaza un obiect )3apeRange. se aplica proprietatea 5ill pentru returnarea
obiectului 5ill5ormat si acest obiect reprezinta umplerea fundalului. Proprietatile si metodele acestui obiect
modifica aspectul background-ului dorit. Este de mentionat ca pentru a pastra modificarile valabile doar pentru
diapozitivul (diapozitivele) procesat, proprietatea 5ollo4MasterBac:groun! trebuie fixata pe False.
Datorita complexitatii obiectului, 5ill5ormat se va studia din Help, pentru a vedea multiplele proprietati si
metode suportate.
Exemplul urmator da o imagine redusa a posibilitatilor de prelucrare grafica:
With ActivePresentation.Slides(1)
.FollowMasterBackground = False
.Background.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientDaybreak
End With
metoda PresetGra!ient aplica un efect vizual caracterizat de trei parametri, -tyle, 8ariant si
&reset;radient/ype, corespunznd dialogului 5ill Effects din PowerPoint (si nu numai).
Modificarea culorilor se poate realiza prin schimbarea schemei de culori sau prin editarea unei culori
particulare dintr-o schema. Proprietatea 'olor)c3eme a unui obiect )li!e sau )li!eRange returneaza
obiectul 'olor)c3eme care reprezinta schema de culori. Se poate schimba apoi schema sau se poate utiliza
metoda 'olors pentru a edita culori. Numerotarea schemelor de culori este cea din dialogul 'olor )c3eme
din PowerPoint. Exemplele urmatoare ilustreaza mecanismul modificarilor.
232
With ActivePresentation
.Slides(1).ColorScheme = .ColorScheme(3)
End With
sau
ActivePresentation.Slides(1).ColorScheme.Colors(ppTitle).RGB = RGB(0,255,0)
care coloreaza titlul n verde. Culorile schemei de culori pot fi referite printr-o constanta de tip
Pp'olor)c3emeIn!e1: ppAccent1, ppAccent2, ppAccent3, ppBackground, ppFill, ppForeground,
ppNotSchemeColor, ppShadow sau ppTitle, cu interpretarile imediate din PowerPoint.
Schema de culori este pierduta la aplicarea unui template, moment n care se schimba si schemele de culori
disponibile.
Alegerea unui la&out
La adaugarea unui diapozitiv s-a vazut ca se stabileste si layout-ul acestuia prin argumentul .ayout.
Returnarea sau modificarea layout-ului se realizeaza prin proprietatea La&out:
ActivePresentation.Slides(1).Layout = ppLayoutTextAndChart
La modificarea layout-ului sunt totusi pastrate si rezervarile care contin text sau obiecte.
A!augarea !e o$iecte la un !iapo*iti"
Se pot adauga obiecte (cum ar fi AutoShapes, obiecte OLE, imagini) la un diapozitiv utiliznd una dintre
metodele colectiei )3apes. O referinta la aceasta colectie se obtine prin proprietatea )3apes a obiectului
)li!e, colectia reprezentnd ntregul layer de desen de pe un diapozitiv. Operarea cu aceste obiecte este
descrisa ntr-un capitol separat, dedicat obiectelor desenate.
)c3im$area or!inii !iapo*iti"elor
Pentru a schimba locul unui diapozitiv ntr-o prezentare se utilizeaza metodele 'ut si Paste prin care se ia un
diapozitiv din locul vechi si se insereaza n noua pozitie:
With ActivePresentation.Slides
.tem(4).Cut
.Paste 6
End With
care muta diapozitivul diapozitivul 4 pe locul 6 din prezentare.
)ta$ilirea efectelor tran*itiei !iapo*iti"elor
Atributele tranzitiei unui diapozitiv sunt pastrate n proprietatile obiectului )li!e)3o4ransition, returnat de
proprietatea sinonima )li!e)3o4ransition a obiectului )li!e sau )li!eRange. Proprietatile privind tranzitia
corespund optiunilor disponibile prin dialogul specializat din PowerPoint: A!"anceOn'lic:. A!"anceOnime.
A!"anceime. Entr&Effect. )oun!Effect. )pee!%
Primele doua proprietati, A"anceOn'lic: si A"anceOnime, sunt True daca trecerea la urmatorul slide are
loc la click sau dupa un timp fixat de A!"anceime% Pot fi stabilite ambele tipuri de avans la True.
233
Entr&Effect stabileste modul de aparitie a noului diapozitiv. Poate avea una dintre valorile tipului enumerat
PpEntr&Effect, de forma ppEffectAppear, ppEffectBlindsHorizontal, ppEffectBlindsVertical, ppEffectBoxn si
nca alte vreo 60 de constante, descriind efectele selectabile prin dialogurile PowerPoint.
)oun!Effect returneaza obiectul sinonim care controleaza ce se va cnta cnd are loc tarnzitia. Metoda utila
(nu sunt multe altele) este Import5rom5ile prin care se specifica un fisier de tip sound.
)pee! precizeaza ritmul efectuarii tranzitiei. Returneaza sau stabileste acest ritm ca o constanta de tip
Ppransition)pee!: ppTransitionSpeedFast, ppTransitionSpeedMedium, ppTransitionSpeedMixed sau
ppTransitionSpeedSlow.
Exemplul urmator ilustreaza cteva dintre aceste proprietati.
With ActivePresentation.Slides(1).SlideShowTransition
.Speed = ppTransitionSpeedFast
.EntryEffect = ppEffectStripsDownLeft
.SoundEffect.mportFromFile "c:\.\bass.wav"
.AdvanceOnTime = True
.AdvanceTime = 5
End With
ActivePresentation.SlideShowSettings.AdvanceMode = _
ppSlideShowUseSlideTimings
n exemplu se remarca faptul ca proprietatea A!"anceMo!e ia valoarea ppSlideShowUseSlideTimings,
pentru considerarea timpului fixat la tranzitia diapozitivului.
Referirea notitelor "or$itorului ()pea:erUs notes)
Proprietatea /otesPages returneaza un obiect )li!eRange care reprezinta paginile de note pentru un
diapozitiv sau un domeniu de diapozitive. Obiectul returnat are anumite restrictii n privinta utilizarii unor
proprietati si metode n raport cu obiectul )li!eRange care reprezinta un domeniu de slide-uri.
Pentru a modifica toate diapozitivele simultan se va utiliza proprietatea /otesMaster a obiectului
Presentation. proprietatea care returneaza un obiect )li!e reprezentnd masterul notitelor.
ActivePresentation.Slides(1).NotesPage.Shapes.Placeholders(2) _
.TextFrame.TextRange.nsertAfter " .textul care se adauga. "
O$iectul )election
n PowerPoint, obiectul )election reprezinta selectia efectuata ntr-o fereastra de document. Se pot utiliza
metodele obiectului )election pentru a taia, copia, sterge sau deselecta portiunea selectata. Proprietatea
&pe a obiectului )election identifica tipul selectiei (diapozitive, shape, text sau nimic). Pentru returnarea unui
anumit tip de selectie se vor utiliza proprietatile )3apeRange. )li!eRange si e1tRange.
O$ser"atie. Codul bazat pe o selectie este n general ineficient si presupunerea selectarii prealabile a unei
entitati nu este de obicei necesara; de exemplu, se poate schimba fontul unui text si fara a-l selecta n
prealabil. Daca proiectul VBA porneste de la cod obtinut prin Macro Recorder, se va modifica pentru a-l face,
pe ct posibil, independent de selectie.
'rearea unei selectii
234
Se poate obtine o selectie fie n mod manual, fie aplicnd metoda )elect unuia dintre obiectele )3ape.
)3apeRange. )li!e. )li!eRange sau e1tRange. Exemplul urmator selecteaza formele 1 si 3 de pe slide-ul
1 din prezentarea activa:
ActivePresentation.Slides(1).Shapes.Range(Array(1,3)).Select
Este de retinut ca se poate efectua o selectie programatica doar daca s-ar putea efectua aceeasi selectie n
mod manual: obiectul trebuie sa fie accesibil, viziunea trebuie sa permita selectii de acel tip etc.
Returnarea unei selectii
Se va utiliza proprietatea )election a obiectului Document2in!o4 pentru a returna selectia din fereastra
respectiva:
ActiveWindow.Selection.Cut
Returnarea unui o$iect !in selectie
Prin proprietatea )3apesRange a obiectului )election se returneaza colectia )3apeRange care include toate
formele desenate din selectie. Se utilizeaza metoda Item pentru accesul la un obiect din colectie. Exemplul
urmator taie a treia forma desenata din selectia existenta n fereastra activa:
ActiveWindow.Selection.ShapeRange(3).Cut
Prin intermediul proprietatii e1tRange se poate accesa textul dintr-o selectie sau textul dintr-o forma
desenata. n continuare se prezinta principalele operatiuni realizate prin intermediul obiectului e1tRange.
Returnarea domeniului de text dintr-o selectie.
ActiveWindow.Selection.TextRange.Copy
Prin intermediul metodelor '3aracters. Lines. Paragrap3s. Runs. )entences sau 2or!s se poate obtine o
portiune anumita de text din textul continut n e1tRange.
Returnarea domeniului de text dintr-o forma desenata (shape) se realizeaza prin proprietatea a1tRange a
obiectului e1t5rame.
ActiveWindow.Selection.ShapeRange(3).TextFrame.TextRange _
.Characters(1,3).Font.Bold = True
Se utilizeaza proprietatea Ease1t5rame pentru a vedea daca o forma are atasat un cadru cu text si se
utilizeaza proprietatea Ease1t pentru a determina daca exista text n cadrul de text.
nserarea de text, data si timp sau numar de slide se realizeaza prin intermediul metodelor InsertAfter.
InsertBefore. InsertDateime. Insert)li!e/um$er sau Insert)&m$ol.
Prin proprietatea )li!eRange a obiectului )election se returneaza colectia )li!eRange care include toate
diapozitivele selectate. Exemplul urmator taie diapozitivele selectate n fereastra activa.
ActiveWindow.Selection.SlideRange.Cut
235
O$iectele Vie4 si )li!e)3o4Vie4
La deschiderea unui fisier n PowerPoint, se creeaza simultan un obiect Presentation, care reprezinta
continutul fisierului, un obiect Document2in!o4, care reprezinta interfata dintre utilizator si fisier n modul
design, un obiect Vie4, care reprezinta un container pentru continutul fisierului n modul design.
La pornirea unui slide show, se creeaza un obiect )li!e)3o42in!o4, care reprezinta interfata ntre utilizator
si fisier n modul run, si un obiect )li!e)3o4Vie4, care reprezinta un container pentru continutul fisierului n
modul run (de executie).
?ntelegerea pre*entarilor. ferestrelor si a "i*iunilor
Modificarile entitatilor care se vad pe ecranul aplicatiei se realizeaza prin modificarea unuia dintre obiectele
Presentation. Document2in!o4 sau Vie4. Care anume dintre obiecte se modifica este prezentat n
continuare.
Schimbarile efectuate asupra continutului efectiv al diapozitivelor cum ar fi adaugarea, stergerea sau
formatarea obiectelor sunt modificari ale prezentarii si sunt controlate de proprietatile si metodele obiectului
Presentation ca si de obiectele inferioare n ierarhia de obiecte PowerPoint.
Schimbarile efectuate asupra interfetei care afiseaza continutul cum ar fi modificarea dimensiunii ferestrei
sau comutarea afisarii n alb-negru sunt modificari ale ferestrei documentului sau ferestrei de demonstrare a
diapozitivelor si sunt controlate de proprietatile/metodele obiectelor Document2in!o4 sau
)li!e)3o42in!o4. Aceste modificari nu afecteaza continutul fisierului. Modiifcarile ferestrei documentului se
pastreaza la comutarea viziunilor.
Schimbarile efectuate asupra modului n care informatia este afisata cum ar fi daca se vede text si grafica
sau numai grafica, ct de mari apar pe ecran elementele sunt modificari ale viziunii si sunt controlate de
proprietatile si metodei obiectelor Vie4 si )li!e)3o4Vie4. Aceste modificari nu afecteaza continutul fisierului
si nu sunt retinute la comutarea viziunilor.
Returnarea o$iectelor Vie4 si )li!e)3o4Vie4
Obiectul Vie4 reprezinta modul n care informatia este afisata n fereastra documentului. Se utilizeaza
proprietatea Vie4 a obiectului Document2in!o4 pentru a returna un obiect Vie4. Urmatorul exemplu
fixeaza fereastra documentului sa se ajusteze automat la dimensiunile ferestrei aplicatiei.
Windows(1).View.ZoomToFit = True
Obiectul )li!e)3o4Vie4 reprezinta modul n care informatia este afisata n fereastra de slide show. Se
utilizeaza proprietatea Vie4 a obiectului )li!e)3o42in!o4 pentru a returna obiectul )li!e)3o4Vie4.
Urmatorul exemplu executa un slide show a prezentarii active cu inhibarea shortcut-urilor (metoda Run a
obiectului )li!e)3o4)ettings returneaza un obiect )li!e)3o42in!o4)
ActivePresentation.SlideShowSettings.Run.View _
.AcceleratorsEnabled = False
Urmatorul exemplu fixeaza culoarea pointerului si forma pointerului pentru al doilea slide show care se
executa curent (exista doar o fereastra pe aplicatie n care se executa un slide show, dar pot exista mai multe
aplicatii care executa slide show-uri n acelasi timp).
With SlideShowWindow(2).View
.PointerColor.RGB = RGB(255,0,0)
236
.PointerType = ppSlideShowPointerPen
End With
/a"igarea printre !iapo*iti"e
Prin metoda Goo)li!e a obiectului Vie4 sau )li!e)3o4Vie4 se activeaza slide-ul specificat. Este de
mentionat ca termenul "diapozitiv activ" depinde de viziunea curenta: n slide view sau n note view, slide-ul
curent este cel afisat; n outline view sau slide sorter view, slide-ul activ este cel selectat.
SlideShowWindows(1).View.GoToSlide 3
Se poate trece la primul diapozitiv prin metoda 5irst, la ultimul diapozitiv prin Last, sau se poate trece la un
slide show denumit prin metoda Goo/ame!)3o4. Prin ultima metoda se trece la alta prezentare de
diapozitive n timpul unei alte prezentari. Cnd prezentarea avanseaza, urmatorul diapozitiv aratat este
urmatorul din prezentarea unde s-a facut transferul si nu urmatorul din prezentarea curenta. Sintaxa este
expression.Goto/ame!)3o4(SlideShowName)
unde
expression este obligatorie, returneaza un obiect SlideShowView.
-lide-hoName este obligatoriu, numele slide show-ului unde se trece controlul.
SlideShowWindows(1).View.GotoNamedShow ".slide show-ul unde se trece ."
Alipirea continutului 'lip$oar!<ului la un o$iect Vie4
Prin metoda Paste a obiectului Vie4 se alipeste continutul din Clipboard la viziunea din fereastra de document
activa. Urmatorul exemplu copie selectia din prima fereastra n Clipboard si o alipeste apoi la viziunea din
fereastra a doua. Daca operatiunea nu poate avea loc (vezi tabelul urmator) se produce o eroare.
Windows(1).Selection.Copy
Windows(2).View.Paste
Operatiunea de alipire depinde de viziunea ferestrei. Situatiile posibile de copiere a continutului din Clipboard
sunt prezentate n tabelul urmator.
Vi*iunea )e poate alipi
-lide vie sau
notes page vie
Shapes, text sau diapozitive ntregi.
Formele alipite sunt adaugate n top-ul ordinei pe z si nu
nlocuiesc formele selectate.
Daca este selectata o forma, textul alipit va fi adaugat la
textul formei; daca este selectat text, textul alipit
nlocuieste selectia; daca nu este selectat nimic, textul
alipit este plasat ntr-un text frame propriu.
Daca se alipeste un ntreg slide, o imagine a slide-ului
este inserata pe diapozitiv, master sau pagina de note ca
237
un obiect scufundat.
)utline vie Text sau diapozitive ntregi.
Un slide alipit este inserat naintea slide-ului care contine
punctul de insertie.
Nu se pot alipi forme desenate n outline vie.
-lide sorter vie Diapozitive ntregi.
Un slide alipit este inserat la punctul de insertie sau dupa
ultimul slide din selectie.
Nu se pot alipi forme sau text n slide sorter vie.
Din tabel rezulta importanta alegerii unei viziuni corecte pentru prezentare nainte de a efectua o operatiune
de taiere+alipire.
)ta$ilirea sau "erificarea tipului !e "i*iune !in fereastra !ocumentului
Prin proprietatea &pe a obiectului Vie4 se obtine ce fel de viziune are documentul activ iar proprietatea
Vie4&pe a obiectului Document2in!o4 se utilizeaza pentru a stabili viziunea din fereastra documentului.
Urmatorul exemplu realizeaza o copiere cu fixarea tipului de viziune adecvat operatiunii de alipire.
Windows(1).Selection.Copy
With Windows(2)
.ViewType = ppViewSlide
.View.Paste
End With
Alte constante pentru viziuni sunt grupate n PpVie4&pe#
ppViewHandout, ppViewHandoutMaster, ppViewNotesMaster,
ppViewNotesPage, ppViewOutline, ppViewSlide,
ppViewSlideMaster, ppViewSlideShow, ppViewSlideSorter
ppViewTitleMaster
nterpretarile sunt imediate.
Returnarea !iapo*iti"ului curent
Proprietatea )li!e returneaza obiectul )li!e care reprezinta diapozitivul afisat n acel moment ntr-o fereastra
de slide show sau ntr-o fereastra document.
SlideShowWindows(1).View.Slide.Copy
238
Daca slide-ul afisat curent este dintr-o prezentare scufundata, se poate utiliza proprietatea Parent a obiectului
)li!e returnat de proprietatea sinonima pentru a returna prezentarea scufundata (proprietatea Presentation a
obiectului )li!e)3o42in!o4 sau Document2in!o4 returneaza prezentarea n care fereastra a fost creata
si nu prezentarea scufundata).
'ontrolarea comportarii o$iectelor Dn timpul unui sli!e s3o4
ntregul strat de desen de pe un diapozitiv este reprezentat de colectia )3apes si fiecare obiect de pe un
diapozitiv fie ca este o rezervare de loc (placeholder), o forma AutoShape sau un obiect OLE este
reprezentat de un obiect )3ape. Utiliznd proprietatile si metodele colectiei )3apes se pot adauga obiecte la
diapozitive si se obtine acces la obiectele individuale de pe un diapozitiv. Prin proprietatile si metodele unui
obiect )3ape se poate controla aspectul formei, textul sau obiectul OLE care este continut si modul n care se
comporta forma respectiva n timpul unui slide show.
n continuare se discuta doar despre comportarea formei desenate n slide show, aspectele celelalte fiind
discutate n capitolul dedicat desenelor din Microsoft Office.
'ontrolul animatiei
Obiectul Animation)ettings contine proprietatile si metodele care controleaza cum si cnd apare un shape
pe un anumit slide n timpul prezentarii. Urmatorul exemplu fixeaza forma a doua de pe primul slide sa devina
animata n mod automat dupa cinci secunde.
With ActivePresentation.Slides(1).Shapes(2).AnimationSettings
.AdvanceMode = ppAdvanceOnTime
.AdvanceTime = 5
.TextLevelEffect = ppAnimateByAllLevels
.Animate = True
End With
La lucrul cu proprietatile obiectului Animation)ettings este important sa se nteleaga interactiunea dintre
proprietatile obiectului ntre ele si cu proprietatea A!"anceMo!e a obiectului )li!e)3o4)ettings.
Efectele valorilor stabilite pentru proprietatile obiectului Animation)ettings nu devin vizibile dect daca forma
respectiva este animata, adica proprietatea Animate este fixata pe True.
n animarea textului proprietatea e1t9nitEffect stabileste unitatea de animatie (cuvnt, paragraf etc) prin
ppAnimateByCharacter, ppAnimateByParagraph, ppAnimateByWord sau ppAnimateUnitMixed. Proprietatea
e1tLe"elEffect (care interactioneaza cu precedenta la anumite valori) stabileste nivelul ierarhic al textului
animat:
ppAnimateByAllLevels ppAnimateByFifthLevel PpAnimateByFirstLevel
ppAnimateByFourthLevel ppAnimateBySecondLevel PpAnimateByThirdLevel
ppAnimateLevelMixed ppAnimateLevelNone.
Pentru introducerea temporizarii n animatie, se va stabili proprietatea A!"anceMo!e la ppAdvanceOnTime si
se va indica un numar de secunde n A!"anceime. Totodata, proprietatea A!"anceMo!e a obiectului
)li!e)3o4)ettings trebuie sa fie ppSlideShowUseSlideTimings.
239
Proprietatea AfterEffect controleaza ce se ntmpla dupa ce forma a devenit animata. Daca forma a fost
animata si alta forma nu este animata dupa ea, atunci efectele ulterioare nu sunt vizibile. n plus, efectul
proprietatii Dim'olor nu este vizibil dect daca AfterEffect este stabilit la ppAfterEffectDim.
Ordinea de animare a formelor de pe un slide este stabilita prin proprietatea AnimationOr!er, proprietatea
Entr&Effect stabileste modul de aparitie a formei iar '3art9nitEffect controleaza modul de animare al
elementelor unei diagrame.
'ontrolul raspunsului la actiunea mouse<ului
Efectul actiunilor mouse-ului (click sau trecere peste forma) este controlat de colectia Action)ettings%
Colectia contine doua obiecte identificate prin indexul ppMouseClick sau ppMouseOver reprezentnd,
respectiv, actiunile 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 remarca utilizarea indexului de identificare a actiunii la click pe forma si definirea unei actiuni prin
proprietatea Action.
Valorile posibile pentru Action sunt constantele PpAction&pe#
ppActionEndShow ppActionFirstSlide ppActionHyperlink
ppActionLastSlide ppActionLastSlideViewed ppActionMixed
ppActionNamedSlideShow ppActionNextSlide ppActionNone
ppActionOLEVerb ppActionPreviousSlide ppActionRunMacro
ppActionRunProgram.
Este de notat ca anumite actiuni sunt proprii doar unor tipuri de forme si se vor alege acele actiuni care sunt
disponibile n interfata utilizator din PowerPoint pentru forma procesata.
n urmatorul exemplu se stabileste ca, n slide show, atunci cnd a treia forma de pe al doilea diapozitiv este
click-ata, culoarea formei este momentan inversata, se aude fisierul sound "applause" si prezentarea revine la
primul slide.
With ActivePresentation.Slides(2).Shapes(3) _
.ActionSettings(ppMouseClick)
.Action = ppActionFirstSlide
.SoundEffect.Name = "applause"
.AnimateAction = True
End With
Daca se stabileste o proprietate a obiectului Action)ettings dar fara efectul scontat, se va verifica valoarea
atribuita proprietatii Action. Tabelul care urmeaza ofera cteva precizari.
240
Daca se
utili*ea*a
proprietatea
Pentru a efectua Valoarea necesara pentru
proprietatea Action
E&perlin: Stabilirea proprietatilor pentru
hiperlegatura care este
urmarita ca raspuns la
actiunea mouse-ului.
ppActionE&perlin:
Run Returnarea/stabilirea numelui
programului executat ca
raspuns la actiunile mouse-
ului.
ppActionRunProgram
Run Returnarea/stabilirea numelui
procedurii macro executate
ca raspuns la actiunea
mouse-ului.
ppActionRunMacro
ActionVer$ Stabilirea verbului OLE care
va fi invocat ca raspuns la
actiunea mouse-ului.
ppActionOLEVer$
)li!e)3o4/ame Stabilirea numelui slide show-
ului propriu care se va
executa ca raspuns la o
actiune a mouse-ului.
ppAction/ame!)li!e)3o4
Urmatorul exemplu utilizeaza proprietatea E&perlin:#
With ActivePresentation.Slides(1).Shapes(1).ActionSettings(ppMouseClick)
.Action = ppActionHyperlink
.Hyperlink.Address = "http://www.infoiasi.ro"
End With
'ontrolul unui clip
Obiectul Pla&)ettings, returnat prin proprietatea Pla&)ettings a obiectului Animation)ettings, contine
proprietati si metode care controleaza cum si cnd se deruleaza un clip media. Urmatorul exemplu insereaza
un movie numit "Clock.avi" n primul slide din prezentarea activa, fixeaza executia automata dupa animatia
sau tranzitia precedenta, specifica continuarea show-ului n timp ce se executa filmul si specifica faptul ca
obiectul movie este ascuns n timpul slide show-ului cu exceptia timpului cnd se executa.
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 functie de modul cum se insereaza clipul ca un obiect OLE (utiliznd comanda O$(ect din meniul Insert sau
utiliznd metoda A!!Me!iaO$(ect) sau ca un obiect media nativ (utiliznd meniul Mo"ies an! )oun!s sau
241
metoda A!!Me!iaO$(ect), se pot aplica diferite proprietati obiectului Pla&)ettings% Se regasesc astfel
optiunile disponibile n fisa Pla& )ettings din dialogul 'ustom Animation (deschis din meniul )li!e)3o4).
Modul preferat de inserare a clipurilor este ca obiecte native media, deoarece acestea nu necesita Windows
Media Player si reactioneaza astfel mai rapid. Multe dintre proprietatile obiectului Pla&)ettings se aplica
numai clipurilor media native. Proprietatea ActionVer$, care corespunde optiunilor listate n boxa O$(ect din
fisa Pla&)ettings a dialogului 'ustom Animation. este singura care nu se aplica clipurilor media native.
Utiliznd proprietatea &pe a obiectului )3ape se poate determina daca un clip este nativ (valoarea returnata
msoMedia) sau nu. Proprietatea Me!ia&pe a obiectului )3ape determina daca este sound sau movie
(ppMediaTypeMixed, ppMediaTypeMovie, ppMediaTypeOther sau ppMediaTypeSound). Urmatorul exemplu
fixeaza toate obiectele native sound din primul slide sa se execute mereu pna sunt oprite manual.
Dim so As Shape
For Each so n ActivePresentation.Slides(1).Shapes
f so.Type = msoMedia Then
f so.MediaType = ppMediaTypeSound Then
so.AnimationSettings.PlaySettings.LoopUntilStopped = True
End f
End f
Next
242
Meniuri si $are !e unelte
Mo!ificarea interfetei cu utili*atorul
Dialogul Customize
Visual Basic
Domeniul sc3im$arilor asupra interfetei utili*ator
Microsoft Access
Microsoft Excel
Mutarea unui element din spatiul de lucru n caiet
Eliminarea unui meniu/toolbar salvat n caiet
Microsoft Word
Microsoft PowerPoint
'omponente ale interfetei utili*ator
)istemul !e meniuri
Adaptarea sistemului de meniuri
Componente personale si componente built-in
Utilizarea submeniurilro
Utilizarea meniurilor contextuale
Text box, List box, Combo box
Modificarea n design-time
Adaugarea de bare de meniu proprii
Adaugarea meniurilor
Adaugarea submeniurilor
Adaugarea si gruparea comenzilor
Adaugarea si modificarea meniurilor contextuale
Stergerea componentelor de meniu
Restaurarea componentelor built-in
Modificarea n run-time
Afisarea unei bare de meniu
Afisarea dinamica a componentelor de meniu
Permiterea si inhibarea componentelor de meniu
ndicarea starii unei intrari de meniu
Redenumirea unei intrari
Bare !e unelte
Adaptarea barelor de unelte
Utilizarea meniurilor
Text box, List box, Combo box
Modificarea barelor de unelte n design-time
Adaugarea unei bare de unelte
Adaugarea si gruparea controalelor
Adaugarea si initializarea controalelor text box, list box, combo box
Eliminarea unui control
Restaurarea barelor de unelte built-in
Modificarea barelor de unelte n run-time
Afisarea/ascunderea controalelor si barelor de unelte
Mutarea si redimensionarea barelor de unelte
Restaurarea barelor de unelte built-in
Permiterea si interzicerea accesului la controale
ndicarea starii activ/inactiv a unui buton
Modificarea controalelor Text box, List box si Combo box
ID<uri !e controale si intrari !e meniu

243
nterfata cu utilizatorul este o parte foarte importanta a oricarei aplicatii. Acest fapt are o pondere mult mai
mare n proiectele dezvoltate n VBA deoarece aplicatiile gazda (Microsoft Office, Visio, Autocad etc.) dispun
de interfete utilizator sofisticate de care trebuie sa se apropie orice noua componenta.
Problematica poate fi despartita n:
o Personalizarea/modificarea interfetei aplicatiei de baza
o Dialogurile create de utilizator.
n acest capitol se discuta prima categorie de actiuni: tehnicile prin care se poate adapta, completa sau
modifica interfata cu utilizatorul propusa n mod standard n aplicatiile Microsoft Office 97. Se prezinta att
actiunile permise de mediu (prin dialogul 'ustomi*e comun aplicatiilor Word, Excel, PowerPoint, Access)
asupra meniurilor si barelor de unelte afisate, ct si actiunile programatice, din Visual Basic, asupra obiectelor
respective.
Mo!ificarea interfetei cu utili*atorul
nterfata cu utilizatorul prezenta n programele din Microsoft Office este formata din bare de meniu si bare de
unelte. Ca raspuns la activarea unei comenzi din meniu sau a unei unelte se va realiza o actiune a aplicatiei
gazda sau se va deschide un dialog pentru fixarea unor atribute ale actiunii dorite.
Exista doua posibilitati de adaptare a barelor de unelte si a meniurilor: dialogul 'ustomi*e si Visual Basic.
Desi dialogul difera usor de la o aplicatie la alta, obiectele programabile sunt aceleasi n toate aplicatiile
Microsoft Office (cu exceptia Outlook).
Dialogul 'ustomi*e
Prin intermediul casetei de dialog 'ustomi*e se pot efectua modificari ale interfetei utilizator n timpul
proiectarii aplicatiei Visual Basic (pentru simplitatea exprimarii utilizam formularea design-time). Cu alte
cuvinte, modificari efectuate nainte ca aplicatia sa se execute. Modificarile includ: adaugarea, stergerea,
mutarea, restaurarea componentelor meniurilor si barelor de unelte. De asemenea stabilirea proprietatilor
acestor componente, care nu se vor modifica n timpul executiei (cu formularea mai concisa run-time). Aceste
modificari pot fi efectuate si n Visual Basic, dar daca exista ambele posibilitati de modificare, cele din design-
time, direct n mediul aplicatiei gazda, se realizeaza mai usor.
Pentru afisarea dialogului 'ustomi*e se urmeaza
succesiunea: meniul Vie4 N ool$ars N
'ustomi*e% Acelasi efect se obtine prin punctarea
unei bare de unelte si click dreapta. Din meniul
contextual se alege apoi 'ustomi*e. Dialogul
afisat este, cu mici diferente specifice, acelas n
toate aplicatiile Office 97. Forma afisata de
Microsoft Word este data n figura alaturata.
Se observa cele trei fise si grupul de butoane din
dreapta.
Particularitatile importante ale dialogului sunt:
o n Access, fisa ool$ars contine un buton Properties care afiseaza dialogul ool$ar
Properties prin care se fixeaza proprietatile barelor de meniu sau de unelte,
o n Excel, fisa ool$ars contine un buton Attac3 care afiseaza dialogul Attac3 ool$ars prin
care se pot copia (atasa) la caietul activ bare de unelte/meniu din spatiul de lucru al aplicatiei,
244
o n Word, fisa 'omman!s contine o lista derulanta )a"e in n care se alege contextul
modificarilor din design-time (template, document etc.) si un buton @e&$oar! care initiaza un
dialog de stabilire a cheilor directe. Dialogul /e4ool$ar, care apare la click pe /e4 (fisa
ool$ars), contine de asemenea optiunea Ma:e tool$ar a"aila$le to pentru fixarea
domeniului de vizibilitate.
Dupa deschiderea dialogului 'ustomi*e se urmeaza aceeasi procedura pentru modificarea oricarui meniu
sau toolbar, indiferent daca este predefinit sau construit de utilizator. Pasii uzuali sunt
o n lista ool$ars din fisa ool$ars se selecteaza boxele de control alaturate denumirilor acelor
bare care se afiseaza; orice bara nou creata este afisata n mod automat;
o click pe orice intrare de meniu (inclusiv captarile de meniu/submeniu) sau control de pe o bara
de unelte pentru a o selecta; n timpul afisarii dialogului 'ustomi*a meniurile si uneltele nu sunt
active/executabile, pot fi doar selectate;
o click dreapta pe obiectul selectat si utilizarea comenzilor din meniul contextual pentru
transformarile dorite.
o n timpul afisarii dialogului 'ustomi*e se pot rearanja prin drag-and-drop toate intrarile din
meniuri/unelte. Tragerea n caseta dialogului elimina o intrare din meniu/bara de unelte, iar
operatiunea inversa adauga noi intrari.
Visual Basic
Personalizarea meniurilor si barelor de unelte se poate efectua programatic utiliznd portiunea reprezentnd
barele de comanda din modelul de obiecte, comuna tuturor aplicatiilor din Microsoft Office. Nivelul cel mai nalt
este colectia 'omman!Bars, returnata de proprietatea 'omman!Bars n toate aplicatiile din Office. Fiecare
bara de meniu, meniu contextual sau bara de unelte este reprezentata printr-un obiect 'omman!Bar n
aceasta colectie. Un obiect 'omman!Bar contine o colectie 'omman!Bar'ontrols reprezentnd
elementele de control ale barei respective.
erarhia acestor obiecte, pentru cazul Microsoft Word (similara
n toate celelalte aplicatii din Office), este prezentata n figura
alaturata.
Utilizarea acestor obiecte este explicata, pentru principalele
actiuni, n continuarea acestui capitol.
Se poate scrie cod care, executat o singura data, produce
crearea sau modificarea elementelor de control din interfata utilizator. Codul simuleaza modificarile din design-
time prin caseta 'ustomi*e. Sunt si situatii n care este nevoie de o combinatie programare + personalizare
pentru a realiza configurarea dorita a mediului aplicatiei:
o Daca nu se poate utiliza dialogul 'ustomi*e pentru crearea unei bare noi de meniu, aceasta se
va crea prin program si dupa aceea se poate configura prin dialogul 'ustomi*e.
o Daca aplicatia gazda nu ofera posibilitatea de afisare simultana a dialogului 'ustomi*e si a
meniurilor contextuale predefinite sau utilizator, modificarea acestora trebuie realizata n Visual
Basic.
o Daca aplicatia gazda nu ofera o interfata pentru adaugarea sau modificarea boxelor text, listelor
derulante drop-down sau combo box, trebuie utilizat codul Visual Basic pentru adaugarea si
proiectarea acestor controale.
Se poate scrie cod si pentru modificarea meniului sistem n timp ce aplicatia se executa (de exemplu inhibarea
unor comenzi sau adaugarea unui meniu etc.). Aceste modificari sunt cunoscute drept modificari n run-time.
245
Domeniul sc3im$arilor asupra interfetei utili*ator
Fiecare aplicatie Microsoft Office utilizeaza reguli usor diferite privind unde si cum se salveaza modificarile
aduse interfetei utilizator. Pentru un control corect al interfetei proiectate n aplicatia Visual Basic este
importanta ntelegerea domeniului de valabilitate al schimbarilor.
Microsoft Access
Se pot utiliza bare de meniu proprii sau meniuri contextuale proprii n trei moduri
o Atasate de o forma sau de un raport. Microsoft Access afiseaza meniurile proprii la deschiderea
formei sau la afisarea raportului n print preview. Pentru informatii suplimentare se va studia
subiectul "MenuBar Property" n Help.
o Drept un meniu contextual atasat unei forme, unui raport sau unui control dintr-o forma.
Microsoft Access afiseaza un asemenea meniu la click dreapta pe forma, raport sau control.
Pentru informatii suplimentare se va studia subiectul "ShortCutMenuBar Property" n Help.
o Ca o bara meniu globala, a aplicatiei. Microsoft Access afiseaza aceasta bara proprie n toate
ferestrele, cu exceptia formelor sau rapoartelor care au propria bara definita. Se poate specifica
bara de meniu utilizata n aplicatie prin dialogul )tartup.
Se pot utiliza una sau mai multe bare de unelte proprii ntr-o aplicatie. Se creeaza barele de unelte necesare si
se alege pentru afisare una dintre metodele urmatoare:
o Daca aplicatia are doar o bara de unelte utilizator, se va utiliza commanda ool$ars (din
meniul Vie4) pentru a o afisa; bara respectiva va apare de fiecare data cnd se porneste
aplicatia.
o Daca aplicatia are bare diferite pentru forme sau rapoarte, se va specifica bara necesara n
proprietatea ool$ar a formei sau raportului. Bara indicata se va afisa si ascunde mpreuna cu
forma.
o Daca sunt necesare mai multe bare de unelte proprii pentru o forma sau raport, sau daca se
doreste ascunderea/afisarea barelor predefinite, se va utiliza proprietatea Visi$le a obiectului
'omman!Bar n Visual Basic sau actiunea )3o4ool$ar n macro-uri.
o Daca se doreste ca aplicatia sa afiseze doar barele proprii, se pot ascunde barele de unelte
built-in prin comanda )tartup (meniul ools) si se deselecteaza boxa de control Allo4 Built<in
ool$ars.
Microsoft E1cel
Barele de meniu sau/si barele de unelte proprii pot fi salvate cu spatiul de lucru sau cu caietul. La parasirea
aplicatiei Excel, barele de unelte din spatiul de lucru sunt salvate automat n fisierul 4sername8.xlb (unde
4sername este numele utilizatorului curent utilizat la intrarea n Windows 95). Daca utilizatorul nu este logged
on, fisierul este Excel8.xlb. Barele de unelte salvate n caiet sunt memorate n fisierul caietului respectiv.
Meniurile si barele de unelte de la nivelul workbook permit proiectarea unei interfete pe masura oricarei
aplicatii (de exemplu un add-in) si distribuirea barelor si procedurilor atasate. Pentru distribuire, obiectele
proiectate se vor atasa caietului, care contine aplicatia, nct barele de unelte sa fie memorate n acelasi fisier
cu aplicatia.
Mutarea unui meniu sau $ara !e unelte !in spatiul !e lucru Dn caiet
Daca dialogul 'ustomi*e nu este deschis, se va afisa prin Vie4 < ool$ars < 'ustomi*e.
n fisa ool$ars a dialogului, click pe Attac3. Ca urmare a actiunii se afiseaza dialogul Attac3
ool$ars%
246
n caseta din stnga 'ustom tool$ars se selecteaza numele meniului sau barei de unelte care se
copie n caietul activ.
Click 'op&. Numele obiectului copiat apare n lista din dreapta ool$ars in 4or:$oo:.
Obiectul original, de la nivelul spatiu de lucru, poate fi eliminat n mod uzual actionnd butonul Delete din
dialogul 'ustomi*e, fisa ool$ars.
Daca versiunea de la nivelul saptiului de lucru (orkspace) nu este eliminata, aceasta poate fi modificata fara
afectarea versiunii de la nivelul caietului. n aceasta situatie, obiectul este modificat la nivelul spatiului de lucru,
aducerea versiunii din caiet la aceeasi configurare se realizeaza doar prin repetarea procedurii descrise, adica
prin copierea versiunii din spatiu peste versiunea din caiet.
Dupa copierea unui obiect (meniu sau bara de unelte) n caiet, obiectul devine disponibil numai dupa ce
utilizatorul n deschide. O versiune salvata n caiet retine nu numai numele si continutul, ci si asignarile de cod,
locul, dimensiunea, forma, pozitia n ecran si atributul de vizibilitate (ascuns sau vizibil).
Eliminarea unui meniuA$ara !e unelte sal"at Dn caiet
Versiunea salvata n caiet poate fi eliminata prin:
Daca dialogul 'ustomi*e nu este deschis, se va deschide dupa procedura uzuala.
n fisa ool$ars click pe Attac3. Se afiseaza dialogul Attac3 ool$ars.
n zona ool$ars in 4or:$oo: click pe numele obiectului care se elimina.
Click Delete.
O$ser"atie. Nu se poate utiliza Visual Basic pentru a atasa sau elimina obiecte bare de meniu sau de unelte
la un caiet.
La deschiderea unui caiet care contine obiecte de interfata pe masura, Microsoft Excel determina mai nti
daca exista deja un obiect cu aceeasi denumire n spatiul de lucru. Daca nu, este creata un nou meniu sau
bara de unelte n spatiul de lucru si 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 si salveaza modificarile n
spatiul de lucru la parasirea aplicatiei Excel.
Nu exista nici un mijloc prin care sa se redenumeasca un meniu sau toolbar, nct la redeschiderea caietului
spatiul de lucru contine deja obiectul cu numele respectiv si Microsoft Excel utilizeaza copia creata anterior n
locul obiectului din caiet. Procedurile atasate ramn totusi cele din caiet, adica aplicatia distribuita traieste n
continuare prin intrarile de meniuri sau unelte pastrate n spatiul de lucru. Acest mod de operare are accentul
pus pe actiunile utilizatorului, care are dreptul sa-si organizeze spatiul de lucru dupa voie.
Pentru a restaura versiunea originala distribuita, utilizatorul trebuie sa elimine copia din spatiul de lucru prin
procedura explicata anterior.
Microsoft 2or!
Word memoreaza meniurile si barele de unelte n sabloane, similar macrourilor. La modificarea unui meniu
sau toolbar, modificarile sunt memorate implicit n template-ul Normal si modificarile sunt accesibile n mod
global, adica un asemenea obiect poate fi afisat chiar daca documentul este bazat pe un alt sablon.
Un toolbar memorat ntr-un alt template este disponibil doar daca sablonul respectiv este atasat documentului
activ sau daca sablonul este ncarcat ca un template global (a se vedea meniul ools, comanda emplates
an! A!!<ins).
247
Daca se memoreaza o bara de unelte n document, afisarea ei este posibila doar daca documentul respectiv
este activ.
La distribuirea unei aplicatii Visual Basic cu meniuri si bare de unelte personale, aceste trebuie memorate ntr-
un sablon propriu sau ntr-un document. Deoarece fiecare utilizator are propriul template Normal, aplicatiile
Visual Basic nu trebuie sa modifice sablonul Normal. Este recomandat de asemenea sa se elimine obiectele
personale din interfata la parasirea aplicatiei.
Daca doua obiecte toolbar cu acelasi nume sunt disponibile simultan (unul ntr-un sablon, altul n document),
ambele sunt listate n dialogul 'ustomi*e si pot fi afisate separat sau mpreuna n acelasi timp.
n Visual Basic se poate adauga, modifica sau elimina bare meniu sau de unelte n orice document sau
template. Totusi, deoarece proprietatea 'omman!Bars se aplica doar obiectului Application, contextul
trebuie fixat nainte de efectuarea modificarilor. Similar utilizarii zonei )tore in din fisa 'omman!s, dialogul
'ustomi*e, n Visual Basic se va stabili valoarea proprietatii 'ustomi*ation'onte1t pentru a specifica un
obiect Document sau emplate. reprezentnd locul unde se executa modificari. Proprietatea
'ustomi*ation'onte1t se fixeaza naintea utilizarii proprietatii 'omman!Bars ceea ce asigura returnarea
unei referinte la colectia corecta (din document sau din template).
Microsoft Po4erPoint
Obiectele personale sunt memorate ntotdeauna n spatiul de lucru. La parasirea aplicatiei PowerPoint, barele
de unelte din spatiul de lucru sunt salvate n fisierul 4sername.pcb (unde 4sername este numele logon al
utilizatorului). Daca utilizatorul nu este logged on, fisierul este Powerpnt.pcb.
Deoarece obiectele din interfata nu sunt vizibile n timpul prezentarii, customizarea este limitata la schimbarea
meniurilor si uneltelor accesibile n design mode. Se poate utiliza fie dialogul 'ustomi*e, fie Visual Basic.
Daca aplicatia Visual Basic ofera o interfata modificata pentru proiectarea prezentarilor, se va utiliza Visual
Basic pentru modificarea interfetei si este o buna idee aceea ca la parasirea aplicatiei sa se elimine
modificarile efectuate.
'omponente ale interfetei utili*ator
Meniurile sunt liste cu comenzi din care utilizatorul poate sa aleaga. Meniurile ofera un mod convenabil si
consistent de a grupa comenzi asociate dupa functiuni si un mod simplu de acces al utilizatorului. Anumite
comenzi pot sa determine afisarea unor submeniuri, pe diferite nivele de organizare. Exista de asemenea
meniuri contextuale (shortcut menus) care ofera o modalitate de grupare a comenzilor uzuale aplicabile n
contextul limitat al unei actiuni specifice.
Se pot asigna chei de acces pentru a permite afisarea imediata a unui meniu, ca si asignarea unor taste
directe la comenzi. n plus, meniurile ocupa mai putin loc dect barele de unelte (nu toate comenzile sunt
afisate permanent).
Barele !e unelte contin 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.) si pentru comenzile pentru care se doreste
accesul printr-un simplu click. Barele de unelte ramn mereu vizibile si acest fapt conduce la o parcurgere mai
usoara pentru determinarea comenzii dorite. Dezavantajele includ necesitatea mouse-ului (controalele nu pot
fi accesate din tastatura) si ocuparea spatiului de lucru n detrimentul documentului principal.
Pentru prezentarea unui set complex de optiuni se va utiliza o caseta !e !ialog% Daca se doreste plasarea
unei unelte mai aproape de datele asociate, cea mai buna solutie poate fi plasarea unui control direct n
document.
248
Mai multe informatii pot fi gasite n capitolul 0ontroale !ctive< si dialoguri.
)istemul !e meniuri
n fiecare aplicatie Microsoft Office, sistemul de meniuri este compus dintr-o multime de meniuri si cte o
multime de intrari n fiecare meniu. Fiecare menu este fie un meniu, un submeniu sau un meniu contextual. n
continuare termenul de componenta se refera n mod generic la un meniu sau o intrare ntr-un meniu.
O bara de meniu este o bara asezata n partea superioara a ferestrei active si care afiseaza numele tuturor
meniurilor care sunt permise n aplicatie la un moment dat. O aplicatie din Microsoft Office poate sa modifice
bara de meniu afisata ca urmare a modificarii ferestrei active (de exemplu editarea unui obiect chart) sau ca
raspuns la instructiuni Visual Basic.
Un meniu este o lista de intrari care apare (se deruleaza) la click pe numele meniului din bara de meniu.
Un submeniu (child menu) este un meniu atasat de o latura a altui meniu (parent menu), adiacent unei captari
particulare a submeniului, localizata n meniul parinte. Fiecare captare de submeniu este marcata cu o
sageata punctnd spre dreapta. Submeniurile se pot adauga si la meniurile contextuale. Un submeniu este
afisat atunci cnd se puncteaza captarea corespunzatoare din meniul parinte.
Un meniu contextual este un meniu flotant n document si care contine un grup de comenzi adecvate pentru o
anume actiune (de exemplu procesarea unui paragraf). Meniul contextual este afisat atunci cnd utilizatorul
executa un click dreapta pe un obiect care are atasat un asemenea meniu.
Actiuni !e a!aptare a sistemului !e meniuri
Sistemul de meniuri se poate modifica ntr-o aplicatie Microsoft Office n diferite moduri:
o crearea de noi bare de meniu
o adaugarea de noi meniuri la barele preconstruite sau personale
o adaugarea de noi intrari (comenzi sau captari de submeniuri) la meniuri si submeniuri existente
(built-in sau custom)
o adaugarea si modificarea meniurilor contextuale
o atribuirea de macrouri la intrari din meniuri.
n plus, n orice moment se poate restaura meniul sistem predefinit la starea implicita (cea afisata la instalarea
aplicatiei).
A!augarea !e componente personale sau
mo!ificarea componentelor $uilt<in
Fiecare aplicatie din Office are un meniu sistem propriu. Componentele acestuia pot fi modificate sau se pot
crea si modifica componente personale.
249
Se alege modificarea unui meniu predefinit atunci cnd interventia este minima (de exemplu includerea unui
meniu care este legat de o macro).
Daca este necesara o interventie masiva, atunci se prefera crearea unei noi bare de meniu si adaugarea
componentelor proprii pe aceasta bara.
9tili*area su$meniurilor
Daca un meniu devine prea populat, atunci se impune mpartirea comenzilor pe submeniuri. n acest mod se
ofera utilizatorului mai putina informatie la un moment dat si aplicatia creste n claritate.
Organizarea submeniurilor se poate baza pe entitatile procesate (comenzi, clienti etc.) sau pe actiunile
suportate de entitati (adaugare, editare etc.).
9tili*area meniurilor conte1tuale
Daca se doreste ca utilizatorul sa aiba acces la comenzile (macar cele mai uzuale) aplicabile n contextul unui
obiect selectat, comenzi care, n mod uzual, sunt dispersate n mai multe meniuri, solutia este oferita de
meniurile contextuale. Comenzile dorite se vor adauga meniurilor contextuale built-in. n Microsoft Access se
pot crea si meniuri contextuale proprii asociate unor obiecte din aplicatie.
9tili*area controalelor e1t Bo1. List Bo1 si 'om$o Bo1
Desi este posibil sa 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 situatii pentru afisarea sau returnarea unei proprietati.
Aceeasi utilitate o poate avea un control de tip lista sau combo. Neajunsul principal este acela ca selectarea
unei intrari dintr-o lista nchide meniul (utilizatorul trebuie sa redeschida meniul pentru a revedea alegerea
etc.).
Daca se doreste adaugarea controalelor de tipurile enumerate (built-in sau proprii) se vor utiliza tehnici
descrise n sectiuni ale acestui capitol.
Mo!ificarile sistemului !e meniuri Dn timpul proiectarii (!esign<time)
Modificarile descrise aici sunt cele efectuate nainte ca aplicatia sa se execute. Sunt incluse adaugarea,
stergerea, mutarea, restaurarea componentelor din meniuri, ca si fixarea proprietatilor acestora.
A!augarea unei $are !e meniu proprii
n Microsoft Access exista posibilitatea adaugarii unei bare proprii de meniu att n Visual Basic, ct si prin
dialogul 'ustomi*e. n Microsoft Excel, Word si PowerPoint adaugarea se poate efectua doar prin Visual
Basic.
Dialogul 'ustomi*e (!oar Microsoft Access)
Deschiderea dialogului 'ustomi*e.
Fisa ool$ars, click /e4
n boxa ool$ar name se tasteaza numele noii bare si click O@.
Click Properties pentru afisarea dialogului ool$ar Properties.
n zona &pe se alege Menu Bar.
Noua bara de meniu este adaugata listei din caseta ool$ars a fisei ool$ars (caseta 'ustomi*e).
250
Visual Basic
Prin metoda A!! a colectiei 'omman!Bars se creeaza o noua bara de meniu; argumentul 5enu'ar al
metodei A!! determina cnd obiectul 'omman!Bar creat poate fi afisat ca o bara de meniu. Exemplul
urmator realizeaza aceasta operatiune:
Set cstm = CommandBars.Add(Name:="Custom Menu Bar", Position:=msoBarTop, _
MenuBar:=True, Temporary:=False)
A!augarea meniurilor
Se poate adauga un meniu la orice bara de meniu built-in sau proprie. Deoarece o aplicatie Office poate afisa
diferite bare de meniu built-in n contexte diferite, este necesar uneori ca adaugarea sa aiba loc la mai multe
bare de meniu, pentru ca utilizatorul sa aiba acces la meniul adaugat indiferent de contextul curent al
aplicatiei.
La adaugarea unui meniu se poate specifica o cheie de acces, litera care apare subliniata la afisarea meniului.
O$ser"atie.Desi o aplicatie Microsoft Office poate sa listeze barele de unelte cu meniurile contextuale din fisa
ool$ars a dialogului 'ustomi*e, utilizatorul nu poate nici adauga meniuri contextuale, nici sa stearga
meniuri contextuale. Se pot doar adauga noi intrari, modifica intrarile existente sau elimina unele intrari din
meniurile contextuale. Anumite operatiuni suplimentare sunt posibile totusi n Access si Excel, actiuni descrise
ulterior.
Dialogul 'ustomi*e
Afisarea dialogului 'ustomi*e.
Vizualizarea barei de meniu dorite prin selectarea n lista ool$ars.
n fisa 'omman!s click /e4 Menu n lista 'ategories.
Se trage itemul /e4 Menu din cutia 'omman!s la pozitia dorita de pe bara de meniu.
Click dreapta pe noul menu si completarea numelui n zona /ame. Un ampersand (&) situat naintea
unui caracter din nume l transforma n cheie de acces la meniu.
Adaugarea comenzilor este descrisa ulterior n acest capitol.
Dialogul 'ustomi*e ofera si posibilitatea de adaugare a unui meniu built-in la o bara de meniu proprie sau
built-in. Comenzile adaugate pot fi personalizate fara ca originalul sa fie afectat.
Afisarea dialogului 'ustomi*e.
Vizualizarea barei de meniu dorite prin selectarea n lista ool$ars.
n fisa 'omman!s click Built<in Menus n boxa 'ategories.
Se trage un meniu built-in din boxa 'omman!s n pozitia dorita.
Visual Basic
Pentru adaugarea unui meniu se utilizeaza metoda A!! a colectiei 'omman!Bar'ontrols. Prin aceasta se
adauga un meniu la bara reprezentata de obiectul 'omman!Bar implicat. Argumentul /ype al metodei A!!
trebuie dat drept mso'ontrolPopup pentru a indica afisarea unui meniu activarea controlului adaugat.
Controalele care afiseaza meniuri sunt cunoscute drept controale pop-up. Argumentul 'efore indica pozitia
noului meniu ntre cele deja existente.Proprietatea 'aption a obiectului 'omman!BarPopup returnat de
metoda A!! este utilizata pentru stabilirea numelui si cheii de acces la noul meniu. Exemplul urmator adauga
un nou meniu la bara meniu a unui caiet Excel:
251
Set cstmAccounting = CommandBars ("Worksheet Menu Bar").Controls _
.Add(Type:=msoControlPopup, Before:=9)
cstmAccounting.Caption = "&Accounting")
Dupa specificarea tastei de acces (prin &), numele poate fi specificat pentru referinta fie cu sau fara caracterul
ampersand.
A!augarea su$meniurilor
Un meniu (child menu) este un meniu atasat de o latura a altui meniu (parent menu), adiacent unei intrari din
meniul parinte (titlul submeniului submenu caption), afisat la selectarea titlului. Se pot adauga submeniuri la
meniuri, alte submeniuri sau la meniurile contextuale. Similar cu definirea unui meniu, mai nti se defineste un
submeniu vid la care se adauga apoi intrarile dorite.
Dialogul 'ustomi*e
Se afiseaza dialogul 'ustomi*e
Daca bara de meniu care contine meniul la care se face atasarea nu este vizibila se activeaza prin
ool$ars.
n fisa 'omman!s click /e4 Menu n boxa 'ategories.
Se trage /e4 Menu din boxa 'omman!s n pozitia de pe meniu unde se ataseaza. Daca atasarea
este pe un nivel inferior, se trage mai nti pe meniu si pe urma din titlu n titlu pna se deschide nivelul
unde are loc atasarea.
Click dreapta pe noul submeniu pentru a-i fixa numele n zona /ame. Se va utiliza caracterul & pentru
stabilirea cheii de acces.
Adaugarea intrarilor se discuta n continuarea capitolului.
Visual Basic
Adaugarea programatica este similara adaugarii unui meniu la o bara de meniu, difera doar nivelul din ierarhia
de obiecte:
Set cstmAcctProduct = CommandBars("Worksheet Menu Bar").Controls("Accounting") _
.Controls.Add(Type:=msoControlPopup)
cstmAcctProduct.Caption = "&Product"
adaugarea are loc la meniul Accounting creat n exemplul de la meniuri. Cheia directa este litera "P". Se
observa ca valoarea argumentului Type este tot msoControlPopup, argumentul Before, neutilizat n exemplu,
permite fixarea pozitiei noului submeniu ntre intrarile meniului parinte. Este de remarcat ca titlul submeniului
se insereaza o data cu submeniul si nu exista anterior.
Dupa definirea titlului submeniului acesta poate fi utilizat la obtinerea unei referinte att cu ampersand. ct si
fara.
A!augarea si gruparea comen*ilor
Se poat adauga comenzi la orice meniu propriu sau built-in, modifica aspectul lor si separa vizual n grupuri
logice.
Desi se pot adauga boxe text, boxe liste sau boxe combo la meniuri/submeniuri, ele nu sunt recomandate.
Locul lor este de regula pe barele de unelte. Daca totusi se doreste o asemenea adaugare se va utiliza reteta
data la discutarea barelor de unelte.
252
Dialogul 'ustomi*e
Pentru adaugarea unei comenzi built-in:
Se afiseaza dialogul 'ustomi*e%
Daca bara de meniu care contine meniul la care se face atasarea nu este vizibila se activeaza prin
ool$ars.
n fisa 'omman!s se selecteaza o categorie de comenzi din boxa 'ategories. Comenzile din
categoria selectata sunt listate n boxa 'omman!s.
Se trage comanda dorita din boxa 'omman!s n pozitia adecvata din meniu. Navigarea n cazul unei
ierarhii de meniuri se realizeaza prin dragare pe meniu, apoi pe titlul submeniului etc.
Se poate realiza copierea unei comenzi built-in prin afisarea meniului care o contine si tragerea comenzii
simultan cu apasarea tastei CTRL.
Dialogul 'ustomi*e ofera si posibilitatea de adaugare a unei comenzi proprii la o bara de meniu proprie sau
biult-in. Cum fiecare aplicatie din Microsoft Office prezinta tehnici diferite pentru realizarea acestei operatiuni,
n continuare se discuta separat fiecare aplicatie.
Microsoft ccess
Adaugarea la un meniu a unei intrari care executa un macro se realizeaza dupa aceeasi procedura ca la
adaugarea unei comenzi built-in la un meniu. n boxa 'ategories click All Macros. Se trage macro-ul dorit n
pozitia sa din meniu.
Pentru adaugarea unei intrari care executa o procedura functie se urmeaza de asemenea aceeasi pasi ca la
adaugarea unei comenzi built-in: n 'ategories se alege orice categorie si se trage o comanda oarecare pe
meniul dorit. Dupa aceea, prin click dreapta si selectare 'ontrol Properties se deschide dialogul sinonim. n
zona 'aption se trece noul nume al comenzii iar n On Action se tasteaza o expresie care executa procedura
Visual Basic de forma: =functionname"#.
Microsoft Excel
Se urmeaza aceeasi pasi ca n procedura pentru adaugarea unei comenzi built-in la un meniu:; n caseta
'ategories click Macros si se trage 'ustom Menu Item din caseta 'omman!s la pozitia dorita pe meniu.
Click dreapta pe noua intrare si apoi click pe Assign Macro. n Macro /ame din dialogul Assign Macro se
precizeaza numele macroului atasat intrarii.
Microsoft !ord
Se urmeaza aceeasi pasi ca n procedura pentru adaugarea unei comenzi built-in la un meniu:; n caseta
'ategories click Macros, n caseta 'omman!s apare lista procedurilor atasate si se trage macroul dorit n
pozitia adecvata din meniu.
O$ser"atie. Daca n Word se scrie o procedura al carui nume coincide cu numele unei comenzi built-in (sau
daca o procedura cu numele "MAN" exista ntr-un modul cu nume identic comenzii), procedura va nlocui
functionalitatea predefinita a comenzii built-in de fiecare data cnd modulul de cod este disponibil. Orice copie
a intrarii de meniu (care activa comanda built-in), de pe orice meniu, va executa procedura nlocuitoare.
Microsoft "o#er"oint
Se procedeaza la fel ca n Microsoft Word.
253
Modificarea aspectului unei comen$i
Pentru orice comanda de pe un meniu se poate afisa o imagine alaturata numelui comenzii. Controlul
aspectului este obtinut prin meniul contextual afisat n timp ce dialogul 'ustomi*e este activ. Stilul intrarii de
meniu poate fi doar text sau text si imagine. Actiunile uzuale sunt
o Utilizarea unui buton predefinit: click dreapta pe comanda, '3ange Button Image si selectarea
imaginii dorite din caseta afisata.
o Copierea imaginii unui alt buton: click dreapta pe butonul a carui imagine se copie, 'op&
Button Image, click dreapta pe butonul unde se copie imaginea si Paste Button Image.
o Copierea unei imagini dintr-un program de grafica: n programul de grafica se deschide
imaginea dorita, selectarea si copierea imaginii (preferabil de marime 1616 pixeli), comutarea
la aplicatia Office, click dreapta pe comanda si click Paste Button Image.
o Editarea imaginii curente a unui buton: click dreapta pe comanda, E!it Button Image, se
editeaza imaginea n dialogul afisat si O@.
o Restabilirea imaginii originale (sau nimic daca nu exista imagine implicita): click dreapta si
ResetButton Image.
%ruparea comen$ilor
Comenzile asociate dupa functionalitate se pot grupa prin separarea ntre linii. Liniile nsasi nu sunt intrari
separate de meniu, aparitia lor fiind un atribut al comenzii care ncepe un nou grup. Pentru a ncepe un grup
(prima intrare cu o linie deasupra):
o Se afiseaza dialogul 'ustomi*e.
o Se afiseaza bara de meniu pe care se afla meniul dorit.
o Click dreapta pe intrarea de meniu care ncepe grupul si click pe Begin Group. La deschiderea
ulterioara a meniului contextual comanda Begin Group apare cu marcajul de selectare si un
nou click anuleaza linia de nceput de grup.
Visual Basic
Se utilizeaza metoda A!! a colectiei 'omman!Bar'ontrols pentru adaugarea unei noi intrari la obiectul
'omman!Bar care reprezinta un meniu sau un submeniu particular. Pentru adaugarea unei comenzi built-in
se va specifica numarul D al comenzii n argumentul (d al metodei A!!.
Urmatorul exemplu adauga comanda )pelling la meniul numit "Quick Tools" de pe bara de meniu "Custom
Menu Bar".
Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _
.Controls.Add(d:=2)
nformatii suplimentare se gasesc n sectiunea "dentificarea intrarilor si controalelor din meniuri si bare de
unelte".
Pentru adaugarea unei comenzi proprii, se adauga o intrare noua n meniu si se fixeaza proprietatea
OnAction la procedura initiata de respectiva intrare. Argumentul /ype al metodei A!! va avea valoarea
mso'ontrolButton indicnd o comanda.
Exemplul urmator, pentru Microsoft Excel, adauga un meniu Open Database la meniul 5ile. Comanda
adaugata executa procedura OpenDatabaseProc.
Set databasetem = CommandBars("Worksheet Menu Bar").Controls("File") _
254
.Controls.Add(Type:=msoControlButton, Before:=3)
With databasetem
.Caption = "Open Database"
.OnAction = "OpenDatabaseProc"
End With
Exista multe proprietati ale obiectelor reprezentnd comenzile din meniuri, proprietati care pot fi fixate n
Visual Basic. Pentru mai multe informatii se va studia obiectul 'omman!BarButton din Help.
Textul descriptiv afisat la punctarea controlului poate fi dat n proprietatea ooltipe1t% n Descriptione1t se
poate da un text afisat n bara de stare a aplicatiei etc.
Proprietatea )t&le stabileste tipul butonului, cu imagine atasata sau nu, constantele predefinite sunt
(MsoButton)t&le): msoButtonAutomatic, msoButtoncon, msoButtonCaption sau msoButtonconandCaption.
Pentru a ncepe un grup se va fixa proprietatea BeginGroup a unui obiect 'omman!BarButton.
'omman!BarPopup. sau 'omman!Bar'om$oBo1 la True. Atribuirea valorii False va elimina linia
despartitoare de grupul precedent. Astfel
databasetem.BeginGroup = True
adauga o linie naintea intrarii definite n exemplul precedent.
Se utilizeaza 'ontrol(index). unde index este titlul sau indexul unei intrari, pentru a returna obiectul care
reprezinta intrarea.
Dintre metode mentionam doar metoda )et5ocus prin care se stabileste focalizarea pe respectiva comanda
(actionarea tastaturii are efect direct asupra controlului) si metoda E1ecute prin care se executa procedura
atasata controlului.
A!augarea si mo!ificarea meniurilor conte1tuale
Meniuri contextuale definite de utilizator pot fi create doar n Microsoft Access sau Excel. Aplicatiile Word si
PowerPoint nu dispun de aceasta posibilitate.
Crearea meniurilor contextuale se poate efectua prin dialogul 'ustomi*e (n Access) sau prin Visual Basic (n
Access si Excel). n Access, meniurile contextuale pot fi asociate rapoartelor, formelor si controalelor dintr-o
forma, un meniu contextual fiind afisat la click dreapta pe obiectul atasat. n Excel exista evenimentul
BeforeRightClick la care se poate raspunde prin modificarea unui meniu contextual existent sau prin afisarea
unui meniu contextual propriu.
Modificarea meniurilor contextuale predefinite de aplicatii se poate efectua n mod uzual n toate aplicatiile din
Microsoft Office.
Dialogul 'ustomi*e
Pentru Microsoft Access se poate utiliza dialogul 'ustomi*e pentru adaugarea unui meniu contextual:
o Se afiseaza dialogul 'ustomi*e.
o n fisa ool$ars click /e4.
o n boxa ool$ar name se introduce numele noului menu contextual si O@. Este afisat un meniu
flotant, vid, cu numele dat.
o Click Properties pentru afisarea dialogului ool$ar Properties.
255
o n &pe se selecteaza )3ortcut Menu.
Pentru afisarea noului menu contextual din dialogul 'ustomi*e se va selecta checkboxul de la Shortcut
Menus din fisa ool$ars. Meniul creat este listat ultimul n bara afisata.
Visual Basic
Prin metoda A!! a colectiei 'omman!Bars se creeaza un nou meniu contextual daca se fixeaza valoarea
msoBarPopup pentru argumentul &osition al metodei, dupa modelul
Set cstm = CommandBars.Add(Name:="Shortcuts1", Position:=msoBarPopup, _
MenuBar:=False, Temporary:=False
Completarea cu comenzi, modificarea unui meniu contextual se efectueaza prin procedeele descrise la
editarea meniurilor/submeniurilor. Prin 'omman!Bars(name), unde name este numele meniului contextual,
se returneaza obiectul 'omman!Bar reprezentnd meniul contextual. Opernd cu elementele colectiei
'ontrols disponibila din obiectul 'omman!Bar se poate personaliza meniul contextual.
)tergerea componentelor meniu
Se poate elimina, cu exceptia meniurilor contextuale si a barelor de meniu built-in, orice componenta de
meniu: intrari proprii sau built-in, meniuri proprii sau built-in, bare de meniu proprii.
Prin eliminarea componentelor built-in se poate adapta aplicatia proiectata n Visual Basic la necesitatile
utilizatorului att prin simplificarea interfetei (mai ales pentru utilizatori lipsiti de experienta) ct si prin
introducerea accesului direct la fuctionalitatea proiectului.
Este de notat ca se pot restaura componentele built-in eliminate, dar nu si componentele proprii. Acestea
trebuiesc create din nou.
Dialogul 'ustomi*e
Cu dialogul 'ustomi*e deschis se poate elimina orice componenta de meniu prin
o Se deschide dialogul 'ustomi*e
o Se afiseaza bara de meniu unde se afla componenta dorita.
o Click dreapta pe componenta respectiva si click pe Delete n meniul contextual afisat.
Pentru stergerea unei ntregi bare de meniu proprie, se deschide dialogul 'ustomi*e, fisa ool$ars, click pe
numele barei si click pe butonul Delete. n acest mod nu se poate elimina o bara de meniu predefinita.
Visual Basic
Se utilizeaza metoda Delete pentru a sterge o bara de meniu proprie, un meniu/submeniu drop-down propriu
sau nu, sau o intrare proprie sau built-in. Nu se poate elimina o bara de meniu built-in sau un meniu
contextual.
Urmatorul exemplu Excel elimina meniul E!it din bara de meniu pentru diagrame.
CommandBars("Chart Menu Bar").Controls("Edit").Delete
Urmatorul exemplu sterge o bara de meniu proprie
256
CommandBars("Custom Menu Bar").Delete
Restaurarea componentelor !e meniu $uilt<in
Dialogul 'ustomi*e
Utilizarea acestui dialog pentru restaurarea componentelor meniu/submeniu la configuratia originala se face
prin:
o Afisarea dialogului 'ustomi*e.
o Vizualizarea barei de meniu necesare.
o Click dreapta pe meniul/submeniul care se restaureaza si click pe Restore n meniul
contextual.
Pentru a restaura n totalitate o bara de meniu built-in, se deschide dialogul 'ustomi*e, click pe numele barei
de meniu n lista ool$ars din fisa sinonima si click pe butonul Restore% Prin restaurarea barei de meniu,
toate meniurile si submeniurile continute sunt de asemenea restaurate.
Visual Basic
Metoda Reset aplicata obiectului reprezentnd o componenta buit-in produce restaurarea componentei, dupa
modelul
CommandBars("Chart Menu Bar").Controls("Edit").Reset
aplicabila n Excel sau
CommandBars("Menu Bar").Reset
care restaureaza, n Word, bara de meniuri sistem.
Mo!ificarile sistemului !e meniuri Dn e1ecutie (run<time)
Sistemul de meniuri create n timpul proiectarii poate fi programat astfel nct sa raspunda dinamic la
modificarea conditiilor din timpul executiei. Se poate nlocui bara de meniu implicita cu o bara proprie. Daca o
anumita intrare nu este adecvata ntr-un context dat, atunci ea poate fi inhibata sau eliminata. O intrare care
reprezinta o optiune cu doua stari, se poate reprezenta imaginea ei ca un buton apasat sau nu. Se poate, de
asemenea, redenumi o comanda dupa actiunea posibila asupra unei entitati (de genul Hide Show).
Este de nteles ca toate aceste modificari pot fi efectuate n timpul executiei prin cod Visual Basic.
Afisarea unei $are !e meniu
Pentru afisarea unei bare proprii de meniu n locul bare de meniu active, se fixeaza proprietatea Visi$le a
obiectului 'omman!Bar corespunzator la valoarea True. Noua bara de meniu vizualizata nlocuieste n mod
automat bara activa. Prin fixarea proprietatii Visi$le la False, se reface bara de meniu implicita, operatiune
recomandata naintea parasirii proiectului Visual Basic.
La pornirea aplicatiei Microsoft Office este afisata bara de meniu implicita. n Word se poate totusi nlocui bara
implicita a aplicatiei la pornire deoarece ultima bara de meniu afisata la oprirea aplicatiei Word poate fi salvata
n template-ul Normal si restaurata n mod automat. n celelalte aplicatii, ca si n Word, se utilizeaza
evenimentul Open pentru fixarea pe True a proprietatii Visi$le pentru bara de meniu proprie, sau se utilizeaza
un macro activat de utilizator sau prin program.
257
Afisarea !inamica a componentelor !e meniu
Daca o componenta de meniu se aplica doar unui document particular, este recomandabil ca aceasta
componenta sa apara doar atunci cnd documentul este activ; acest mod de operare reduce aglomerarea
inutila a interfetei. Se poate limita viata unei componente de meniu doar la perioada n care este deschis sau
activ documentul caruia i se aplica.
O alternativa este ca asocierea document componenta de meniu sa se gestioneze prin stabilirea proprietatii
Visi$le la True sau False dupa cum este necesara, sau nu, componenta respectiva. Procedeul poate fi utilizat
inclusiv pentru o bara de meniu si este, uneori, de preferat procedeului prin care se adauga/sterge o
componenta.
Pentru a afisa n mod dinamic componentele de menu, se scriu procedurile de raspuns la evenimente prin
care se afiseaza sau se ascund, se creeaza sau se sterg componentele respective. Daca, nsa, aplicatia
gazda nu suporta evenimente, atunci nu se pot personaliza componentele n mod dinamic. O alternativa este,
pentru aceste aplicatii, asignarea procedurilor la proprietatea OnAction a altor elemente de meniu. Daca
aplicatia permite controale ActiveX, atunci se poate modifica interfata aplicatiei container ca raspuns la un
eveniment suportat de un control ActiveX.
O$ser"atie. Deoarece Word memoreaza personalizarile n documente sau sabloane, componentele proprii
sunt vizibile atunci cnd documentul sau sablonul este disponibil n contextul curent si ascunse atunci cnd
documentul sau template-ul nu este disponibil. Prin contrast, deoarece Microsoft Excel memoreaza
personalizarile la nivel de spatiu de lucru, modificarea dinamica a interfetei se realizeaza prin schimbarea
proprietatii Visi$le n proceduri eveniment.
Permiterea si in3i$area componentelor !e meniu
Daca se doreste oprirea utilizatorului de la selectarea unei intrari de meniu, comanda respectiva poate fi
inhibata. O comanda inhibata apare pe meniu ntr-o culoare stearsa si nu poate fi activata. Acest atribut este
stabilit de proprietatea Ena$le! care la True permite accesul la comanda iar la False interzice accesul.
Proprietatea nu se poate fixa pentru intrari built-in de meniu si nici pentru un submeniu ca obiect (pot fi
inhibate nsa toate intrarile submeniului).
Urmatorul exemplu Excel adauga comanda Open Database la meniul 5ile a barei de meniu pentru foaia de
calcul si apoi inhiba comanda adaugata:
CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls.Add("Open Database").Enabled = False
Daca proprietatea este stabilita la nibvelul unui meniu, ca n exemplul urmator, toate comenzile meniului sunt
interzise:
CommandBars("Worksheet Menu Bar").Controls("File").Enabled = False
In!icarea starii unei intrari !e meniu
Daca o intrare a unui meniu reprezinta o optiune cu doua stari, este posibil sa se modifice aspectul imaginii
comenzii nct sa arate ca un buton apasat sau ridicat, potrivit starii optiunii. Aceasta se realizeaza prin
stabilirea proprietatii )tate a intrarii. Proprietatea poate avea una dintre valorile (constantele
MsoButton)tate): msoButtonUp, msoButtonDown sau msoButtonMixed.
Exemplul urmator (n Excel) comuta ntre cele doua stari ale unei comenzi proprii inserate n meniul Vie4:
258
Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
f .State = msoButtonUp Then
.State = msoButtonDown
' comutare la viziunea database
Else
.State = msoButtonUp
' comutare la viziunea worksheet
End f
End With
End Sub
n timpul executiei se poate schimba imaginea butonului prin lucrul cu proprietatea 5aceI! pentru a schimba
imaginea n momentul schimbarii starii comenzii. Pentru a specifica imaginea de buton care sa fie afisata
alaturi de comanda, trebuie sa se gaseasca comanda built-in cu imaginea dorita, sa se determine D sau si sa
se atribuie aceasta valoare proprietatii 5aceI! (schimbarea proprietatii 5aceI! nu modifica functionalitatea
comenzii). Urmatorul exemplu Excel amplifica exemplul precedent prin schimbarea imaginii n functie de stare.
Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
f .State = msoButtonUp Then
.Faced = 987
.State = msoButtonDown
' comutare la viziunea database
Else
.Faced = 1
.State = msoButtonUp
' comutare la viziunea worksheet
End f
End With
End Sub
Re!enumirea unei intrari !e meniu
Proprietatea 'aption contine denumirea intrarii. Modificnd valoarea proprietatii se poate prezenta
utilizatorului o comanda adecvata contextului curent. Exemplul urmator arata cum se poate utiliza acest fapt.
Se ncepe prin inserarea unei comenzi Open Database, moment n care comanda se nlocuieste cu comanda
Close Database, adecvata contextului:
CommandBars("MyMenuBar").Controls("File").Controls("Open Database") _
.Caption = "Close &Database"
La redenumirea intrarii trebuie avut grija ca alte proceduri care se refera la comanda sa utilizeze n referinte
noul nume.
Se poate utiliza, evident, o variabila care se refera la intrarea de meniu, ceea ce nlatura problemele
suplimentare care apar la redenumire:
Set openDatabase = CommandBars(("MyMenuBar"). _
Controls("File").Controls("Open Database")
Schimbarea titlului se efectueaza prin
openDatabase.Caption = "Close &Database"
259
Bare !e unelte
Fiecare aplicatie Microsoft Office ofera un sistem de bare de unelte (toolbar) continnd controale pe care
utilizatorul le actioneaza pentru a avea acces la comenzile frecvente. Fiecare toolbar poate sa apara depozitat
(docked) la una dintre laturile ferestrei aplicatiei sau ca o fereastra flotanta pozitionata oriunde n spatiul de
lucru. Fiecare control de pu un toolbar este control grafic prin care utilizatorul poate schimba informatii cu
aplicatia Visual Basic.
Afisarea unei bare de unelte ntr-o aplicatie Office se realizeaza prin meniul Vie4, comanda ool$ars si click
pe numele barei dorite. maginea atasata barei respective devine selectata. Un nou click ascunde bara de
unelte. Bare de unelte aditionale pot fi vazute n dialogul 'ustomi*e, n lista din 'ategories.
Exista mai multe tipuri de controale care apar pe o bara de unelte, discutate n continuare.
Cel mai comun tip de unealta este un $uton !e control simplu, cu o imagine. Grafica, denumita imaginea
butonului, este o reprezentare vizuala a comenzii sau optiunii activate de respectivul control. Utilizatorul poate
sa actioneze un buton pentru a executa o actiune (de exemplu butonul /e4 creeaza un nou document) sau sa
comute ntre doua stari posibile (cum ar fi butonul Bol!).
Alt tip de control este un $uton !e control care contine o imagine si o paleta !erula$ila atasata.
Utilizatorul actioneaza sageata n jos a controlului penbtru a afisa paleta de unde selecteaza optiunea dorita.
Actionarea butonului (nu a sagetii) aplica optiunea selectata (indicata prin grafica). Un exemplu de acest gen
este controlul 5ont 'olor.
Un control poate fi de tip te1t $o1, list $o1 sau com$o $o1. Utilizatorul poate fie tasta text n zona de text, fie
actiona sageata n jos si selecta un element al listei. De exemplu, controlul 5ont )i*e de pe bara de unelte
Word 5ormatting permite nscrierea direct a marimii fontului sau selectarea dintr-o lista disponibila de marimi.
Ultimul tip de unealta este controlul pop<up. care afiseaza un meniu cu alte controale. n esenta un
asemenea control este similar cu un meniu, exemplul fiind butonul Dra4 care produce la activare afisarea
barei de unelte Dra4ing.
O$ser"atie. Desi sunt identice ca aparenta si comportare, controalele de pe barele de unelte nu sunt aceleasi
cu controalele ActiveX. Nu se pot adauga controale ActiveX la bare de unelte si nu se pot adauga controale de
toolbar la documente sau forme.
Principii !e a!aptare a $arelor !e unelte
Aplicatiile Microsoft Office ofera o mare varietate de modalitati pentru modificarea barelor de unelte: se pot
crea noi bare de unelte, se pot adauga noi butoane la barele existente, se poate modifica imaginea de pe un
buton, se pot asigna macro-uri, texte ToolTip de ajutor, text asociat afisat n bara de stare a aplicatiei.
Daca se modifica o bara built-in sau se creeaza o bara de unelte proprie depinde de numarul de modificari
intentionate sau de dorinta proiectantului. Este recomandabil ca adaugarea sau modificarea unui numar mic
de butoane sa se efectueze pe o bara de unelte predefinita, n timp ce proiectele mari sa dispuna de bare de
unelte proprii. ndiferent de calea aleasa, configuratia standard poate fi restaurata oricnd.
Modificarile pot fi efectuate n timpul proiectarii (design-time) sau n timpul executiei (run-time) prin proceduri
Visual Basic. Este preferabil ca modificarile principale sa se efectueze n timpul proiectarii si doar eventualele
modificari dinamice, functie de actiunile utilizatorului, sa se efectueze n run-time. O schimbare frecventa a
sistemului de meniuri poate ngreuna actiunile utilizatorului.
9tili*area meniurilor
260
La orice bara de unelte, built-in sau proprie, se pot adauga controale pop-up, aceleasi ca la crearea
meniurilor/submeniurilor. Aceasta actiune este un compromis acceptabil ntre modificarea unei bare de meniu
si introducerea unui mare numar de butoane unelte. Reamintim butonul Dra4. sau Auto)3apes. de pe bara
de unelte Dra4ing care deschide un meniu.
Adaugarea meniurilor, submeniurilor si intrarilor la o bara de unelte se realizeaza n modul descris n sectiunile
precedente care se refera la personalizarea meniurilor.
9tili*area controalelor e1t $o1. List $o1 si 'om$o $o1
Controale de tip text box, list box si combo box se pot adauga att la barele de unelte built-in ct si la barele
proprii. Aceste controale pot fi utile pentru obtinerea repetata a unor informatii de la utilizator sau pentru
executarea unei proceduri dependente de valoarea controlului.
Dialogul 'ustomi*e suporta adaugarea unor controale predefinite (built-in) la orice bara de unelte. Pentru
adaugarea unor controale proprii se va utiliza Visual Basic prin care se pot proiecta si adauga controale de
tipurile discutate aici. Daca dialogul 'ustomi*e este deschis, se poate modifica latimea oricarui control (built-
in sau propriu) text box, list box sau combo box.
Mo!ificarile $arelor !e unelte Dn timpul proiectarii (!esign<time)
n aceasta sectiune se prezinta crearea unei noi bare de unelte, adaugarea de controale noi (built-in sau
proprii), eliminarea controalelor dintr-o bara de unelte, gruparea controalelor si schimbarea dimensiunilor
controalelor text box, list box si combo box. Se poate de asemenea modifica sau edita imaginea de pe un
control.
A!augarea unei $are !e unelte
Daca se doreste ca uneltele proprii sa fie continute ntr-o bara de unelte separata, procesul se desfasoara n
doua etape: crearea barei si adaugarea controalelor (similar lucrului cu barele de meniu). Se poate utiliza
dialogul 'ustomi*e sau Visual Basic.
Dialogul 'ustomi*e
Se afiseaza dialogul 'ustomi*e
n fisa ool$ars click /e4.
n ool$ar name se introduce numele noii bare de unelte si O@. Se afiseaza o bara de unelte flotanta,
cu numele introdus. La aceasta se pot adauga controale.
Noul toolbar este adaugat la lista ool$ars de pe fisa ool$ars a dialogului 'ustomi*e.
Visual Basic
Se utilizeaza A!! a colectiei 'omman!Bars pentru a crea o noua bara de unelte. Prin fixarea argumentului
&osition la msoBarLeft. msoBarop. msoBarRig3t. msoBarBottom sau msoBar5loating se stabileste
daca obiectul 'omman!Bar creat este flotant sau aliniat la o latura (docked).
Urmatorul exemplu creeaza si afiseaza o bara de unelte noua numita "Custom Tools".
Set cstm = CommandBars.Add(Name:="Custom Tools", Position:=msoBarFloating, _
MenuBar:=False, Temporary:=False)
cstm.Visible = True
261
A!augarea si gruparea controalelor
Pe lnga adaugarea controalelor la orice bara de unelte, acestea pot fi separate prin linii dupa functionalitate.
Dialogul 'ustomi*e
Prin dialogul 'ustomi*e se pot adauga controale built-in n modul urmator:
Se afiseaza dialogul 'ustomi*e
Prin fisa ool$ars se vizualizeaza bara de unelte care se modifica.
n fisa 'omman!s se alege categoria necesara de comenzi. Comenzile categoriei sunt afisate n
caseta 'omman!s%
Se trage controlul care se adauga din lista 'omman!s n pozitia sa de pe bara de unelte.
Pentru adaugarea controalelor proprii fiecare aplicatie Office are particularitatile ei, prezentate n continuare.
Microsoft ccess
Pentru adaugarea unui control care executa un macro se urmeaza pasii descrisi anterior dar n 'ategories
(fisa 'omman!s) se selecteaza All Macros. Se trage apoi macroul dorit din lista 'omman!s pe bara de
unelte.
Pentru un control care executa o procedura de tip 5unction se procedeaza similar n primii pasi dar pe bara
se trage orice control (din orice categorie). Dupa pozitionarea pe bara de unelte, click dreapta pe control si
deschiderea dialogului 'ontrol Properties n care se fixeaza numele n 'aption si actiunea de executare a
procedurii Visual Basic n On Action. Expresia trebuie sa aiba sintaxa: =functionname"#.
Microsoft Excel
Se urmeaza aceiasi pasi descrisi anterior, dar n 'ategories se alege Macros, se trage controlul 'ustom
Button din lista 'omman!s n pozitia stabilita pe bara de unelte. Click dreapta pe noul control si Assign
Macro in meniul contextual. n dialogul Assign Macro se selecteaza macroul executat de buton.
Microsoft !ord
Similar procedurii de la Excel, n 'ategories se alege Macros si se trage din lista 'omman!s denumirea
procedurii dorite pe bara de unelte care se modifica. Utiliznd meniul contextual afisat pentru noul control se
stabilesc atributele sale.
Este de revazut si observatia facuta la subiectul similar de la meniuri privind procedurile proprii care au acelasi
nume cu controalele built-in.
Microsoft "o#er"oint
Se procedeaza la fel ca n Word.
Modificarea aparentei unei unelte
Aspectul unui buton de pe o bara 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
'ustomi*e.
Stilurile posibile pentru un buton sunt descrise n tabelul urmator.
262
)tilul Aspectul $utonului
Default Style Numai imaginea
butonului
Text Only (n meniuri) Numai imaginea
butonului
Text Only (n rest) Numai numele
mage And Text maginea si numele
Atunci cnd dialogul 'ustomi*e este activ, se poate schimba imaginea de pe buton ntr-unul din modurile
descrise la procedura similara de la intrarile unui meniu.
%ruparea controalelor
ntr-un mod similar celui de la gruparea comenzilor de pe un meniu, pentru a ncepe un grup cu un control se
activeaza dialogul 'ustomi*e si n meniul contextual al controlului se alege Begin Group% O noua activare a
acestei comenzi elimina linia separatoare de grup.
Visual Basic
Se utilizeaza metoda A!! a colectiei 'omman!Bars'ontrols pentru adaugarea unui nou control la obiectul
'omman!Bar care reprezinta toolbarul care se modifica. Adaugarea unui control built-in se efectueaza
specificnd numarul D al controlului n argumentul (d al metodei A!!% Urmatorul exemplu adauga controlul
built-in )pelling la bara numita "Quick Tools".
Set mySpell = CommandBars("Quick Tools").Controls.Add(d:=2)
Pentru adaugarea unui control propriu se adauga un nou control si apoi se fixeaza proprietatea OnAction pe
procedura Visual Basic executata la clickarea controlului. n argumentul Type se da valoarea
mso'ontrolButton pentru a arata ca este bvorba de un buton. Se poate stabili proprietatea 5aceI! la D-ul
unui control built-in pentru a-i da o imagine definita.
Urmatorul exemplu (n Excel) adauga un buton pe bara de unelte )tan!ar!, naintea butonului )a"e. Butonul
reprezinta procedura OpenDatabaseProc. Exemplul stabileste imaginea butonului la o grila (D 987).
Set databasetem = CommandBars("Standard").Controls. _
Add(Type:=msoControlButton, Before:=3)
With databasetem
.OnActiona = "OpenDatabaseProc"
.Faced = 987
End With
Pentru a ncepe un nou grup se fixeaza pe True proprietatea BeginGroup a obiectului 'omman!BarButton.
'omman!BarPopup sau 'omman!Bar'om$oBo1 reprezentnd controlul.
Se utilizeaza 'ontrols(index), unde index este titlul sau indicele controlului, pentru a returna obiectul
reprezentnd controlul.
A!augarea si initiali*area controalelor te1t $o1. list $o1 si com$o $o1
263
Daca un control de acest tip este built-in, adaugarea lui se poate efectua prin dialogul 'ustomi*e n mod
similar adaugarii altor controale built-in.
Pentru adaugarea si initializarea continutului unui control propriu de tip text box, list box sau combo box se
poate utiliza doar Visual Basic. Prin metoda A!! a colectiei 'omman!Bar'ontrols se poate crea un
asemenea control specificnd drept tip al controlului (n argumentul /ype) una dintre valorile
'ontrolul Argumentul &ype
Text box mso'ontrolE!it
List box mso'ontrolDropDo4n
Combo
box
mso'ontrol'om$oBo1
Se poate folosi proprietatea )t&le a unui control text box, list box sau combo box pentru a indica daca titlul
(textul) apare n stnga boxei respective.
Urmatorul exemplu adauga un control combo box cu eticheta "Quarter" la o bara de unelte proprie si atribuie
controlului macro-ul cu numele "ScrollToQuarter".
Set newCombo = CommandBars("Custom1").Controls. _
Add(Type:=msoControlComboBox)
With newCombo
.Addtem "Q1"
.Addtem "Q2"
.Addtem "Q3"
.Addtem "Q4"
.Style = msoComboNormal
.OnAction = "ScrollToQuarter"
End With
La executarea aplicatiei Visual Basic, procedura atribuita controlului n proprietatea OnAction este apelata de
fiecare data cnd se modifica controlul. n procedura se poate utiliza proprietatea Action'ontrol a obiectului
'omman!Bars pentru a gasi care control a fost schimbat si a returna valoarea modificata. Proprietatea
ListIn!e1 returneaza intrarea introdusa n combo box.
Eliminarea unui control !intr<o $ara !e unelte
Eliminarea controalelor poate fi necesara att pentru ca unele actiuni sunt executate prin interfata proprie
proiectata, ct si pentru simplificarea interfetei cu un utilizator mai putin experimentat.
Restaurarea configuratiilor standard este posibila pentru barele de unelte built-in. Barele de unelte si
controalele proprii trebuiesc create din nou n vederea restaurarii unei configuratii initiale.
Dialogul 'ustomi*e
Pentru a sterge un control:
o Se deschide dialogul 'ustomi*e.
o Se afiseaza bara de unelte care se modifica prin fisa ool$ars.
264
o Click dreapta pe controlul care se elimina si comanda Delete din meniul contextual.
Pentru a elimina o ntreaga bara de unelte proprie se deschide dialogul 'ustomi*e, click pe numele barei n
lista ool$ars a fisei sinonime si click pe butonul Delete. Nu se pot elimina barele built-in (acestea se afiseaza
sau nu prin Vie4 8 ool$ars etc.).
Visual Basic
Se utilizeaza metoda Delete pentru a elimina din colectia corespunzatoare un obiect de control sau bara de
unelte proprie. Nu se poate elimina o bara de unelte built-in.
Urmatorul exemplu Excel elimina controlul Print din bara de unelte )tan!ar!.
CommandBars("Standard").Controls("Print").Delete
iar pentru a sterge o bara proprie de unelte
CommandBars("Custom Bar").Delete
Restaurarea $arelor !e unelte $uilt<in
Din dialogul 'ustomi*e
o Se afiseaza dialogul 'ustomi*e.
o n fisa ool$ars se selecteaza bara de unelte care se restaureaza.
o Click Restore.
n Visual Basic se utilizeaza metoda Reset:
CommandBars("Standard").Reset
Barele de unelte proprii nu se restaureaza n mod automat; ele se creeaza din nou.
Mo!ificarile $arelor !e unelte Dn timpul e1ecutiei (run<time)
Barele de unelte pot fi programate astfel nct sa raspunda dinamic la schimbarile de conditii din timpul
executiei. Actiunile posibile uzuale sunt interzicerea accesului la un buton si comutarea imaginii apasat/ridicat.
Afisarea sau ascun!erea controalelor si $arelor !e unelte
Pentru marirea spatiului de lucru sau pentru simplificarea interfetei cu utilizatorul, o bara de unelte poate fi
afisata doar atunci cnd este necesara. Vizibilitatea unei bare este dependenta de valoarea proprietatii
Visi$le, cu valorile True si False. Fixarea valorii True este echivalenta cu selectarea barei n lista ool$ars
din dialogul 'ustomi*e si click pe O@.
Urmatoarea procedura Excel, atribuita intrarii de meniu View MyToolbar din meniul Vie4, comuta starile intrarii
din meniu si proprietatea Visi$le a barei de unelte de fiecare data cnd utilizatorul face click pe intrarea din
meniu.
Sub ViewMyAppToolbar()
With CommandBars("Worksheet Menu Bar").Controls("View"). _
Controls("View MyToolbar")
f .State = msoButtonUp Then
265
.State = msoButtonDown
CommandBars("MyAppTools").Visible = True
Else
.State = msoButtonUp
CommandBars("MyAppTools").Visible = False
End f
End With
End Sub
Atunci cnd o bara de unelte este vizibila, utilizatorul poate actiona orice control de pe ea. Prin fixarea
proprietatii Visi$le drept True sau False se poate efectiv adauga sau elimina un control din spatiul de lucru al
utilizatorului fara a sterge efectiv controlul.
O$ser"atie. Deoarece Microsoft Word salveaza personalizarile la nivel de documente sau sabloane, barele
de unelte proprii si controalele proprii sunt vizibile doar daca documentul sau template-ul este disponibil.
Microsoft Excel salveaza personalizarile la nivel de spatiu de lucru si se va utiliza proprietatea Visible n coduri
activate de evenimente pentru a modifica dinamic interfata cu utilizatorul.
Mutarea si re!imensionarea $arelor !e unelte
Adaptarea proeminentei pe ecran a unei bare de unelte la contextul curent a aplicatiei se poate efectua si prin
schimbarea locului pe ecran, a dimensiunilor.
Proprietatile Eeig3t. 2i!t3. Left. op si Position permit manevrari de pozitie si dimensiune pentru un obiect
'omman!Bar%
Restaurarea $arelor !e unelte $uilt<in
Metoda Reset realizeaza restaurarea unui obiect predefinit. Urmatorul exemplu realizeaza refacerea tuturor
barelor de unelte built-in si eliminarea tuturor barelor proprii. Pentru aceasta se foloseste proprietatea BuiltIn
care returneaza True pentru un obiect predefinit.
For Each cb n CommandBars
f cb.Builtn Then
cb.Reset
Else
cb.Delete
End f
Next
O$ser"atie. Prin restaurarea barelor built-in se elimina si toate controalele proprii inserate n acele bare. Se
poate pierde astfel accesul la o procedura din aplicatia Visual Basic. Pentru a ocoli aceasta capcana se
recomanda ca eliminarea controalelor proprii de pe o bara de unelte built-in sa se efectueze individual, n
functie de contextul curent si nu prin restaurare globala.
Permiterea si inter*icerea accesului la controale
Ca alternativa la afisarea si ascunderea controalelor se poate permite sau interzice accesul prin manevrarea
proprietatii Ena$le!. Proprietatea poate fi utilizata si pentru aflarea starii curente a controlului.
Urmatorul exemplu inhiba butonul al treilea de pe bara )tan!ar!.
CommandBars("Standard").Controls(3).Enabled = False
266
Un control interzis produce un beep la actionare si nu lanseaza procedura asociata.
In!icarea starii acti"Ainacti" a unui $uton
Pentru butoanele care comuta ntre doua stari, proprietatea )tate, cu valorile msoButtonDo4n si
msoButton9p, poate fi utilizata, similar exemplelor de la meniuri, pentru reprezentarea grafica a celor doua
optiuni posibile.
Mo!ificarea controalelor e1t $o1. List $o1 si 'om$o $o1
Daca se utilizeaza controale proprii de tip text box, list box sau combo box, n timpul executiei se poate
modifica textul afisat n zona text a controlului sau adauga/elimina intrari n listele controalelor.
Proprietatea e1t reflecta textul afisat n zona text a controlului si poate fi fixata pe o valoare reflectnd
modificari din aplicatie.
Metodele A!!Item si Remo"eItem permit procesarea listelor din controale.
Alte proprietati si metode se vor studia din Help. De exemplu exista posibilitatea declararii unui antet de lista
(intrari separate de celelalte printr-o linie).
ID<uri !e controale si intrari !e meniu
Fiecare aplicatie Office contine un set unic de bare de meniuri si de unelte si un set unic de intrari de meniuri
si de controale, doar o mica parte dintre acestea apar efectiv n aplicatie. De asemenea, dupa cum s-a
explicat la nceputul capitolului, fiecare aplicatie are un mod unic de memorare a meniurilor si barelor de
unelte.
n timp ce functionalitatea asociata cu fiecare intrare built-in de meniu si cu fiecare unealta apartine unei
aplicatii Office specifice, titlul, imaginea de pe buton, latimea si alte proprietati implicite sunt memorate ntr-o
resursa partajata de toate aplicatiile. Referintele la componentele continute n aceasta unica resursa se fac
prin numerele D specifice intrarilor de meniu si uneltelor.
Aceeasi resursa comuna contine de asemenea proprietatile implicite ale controalelor pop-up care afiseaza
meniurile built-in. Totusi, aceste controale pop-up nu contin si intrarile meniurilor built-in, cu alte cuvinte
controalele pop-up sunt vide.
Referirea la D-uri poate fi ocolita prin utilizarea dialogului 'ustomi*e. Sunt nsa situatii cnd referinta este
necesara:
o Se doreste atribuirea unui intrari la un meniu/bara de unelte predefinita sau proprie iar intrarea
respectiva nu este disponibila din dialogul 'ustomi*e n design-time.
o Se adauga o intrare built-in la un meniu sau la o bara de unelte n run-time.
o Se doreste copierea unei imagini de buton la alt buton n run-time.
Se poate atribui D-ul unui element built-in la argumentul (d al metodei A!! pentru colectia
'omman!Bars'ontrols, sau se poate atribui D-ul unui element la proprietatea 5aceI! a oricarui control
propriu sau built-in.
O$ser"atie. Chiar daca resursa partajata contine informatie despre orice element de interfata din toate
aplicatiile Office, nu se pot adauga ntr-o aplicatie intrari si controale a caror functionalitate este continuta n
alta aplicatie. Se poate totusi copia, si n cazul functionalitatilor distincte, imaginea butoanelor de la o aplicatie
la alta.
267
Pentru determinarea D-urile elementelor de interfata dintr-o aplicatie Office, se poate urma una din caile:
o ntr-un modul se scrie cod pentru atribuirea unui element de meniu sau control dintr-o bara de
unelte la o variabila obiect. Se utilizeaza apoi mijloacele de debug pentru a vedea valoarea
proprietatii I! a obiectului. Numarul obtinut se memoreaza si poate fi ulterior utilizat.
o Se executa urmatoarea procedura ntr-o aplicatie Office pentru a crea un document text care
contine lista D-urilor si titlurilor tuturor comenzilor built-in din aplicatie.
Public Sub outputDs()
Const maxd = 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 maxd
On Error Resume Next
cbr.Controls.Add D:=i
Next
On Error GoTo 0
' scrierea D si titlu pentru fiecare control
For Each btn n cbr.Controls
Write #1, btn.D, btn.Caption
Next
' eliminarea barei de comanda si nchiderea fiserului de iesire
cbr.Delete
Close #1
End Sub
o Executarea procedurii urmatoare ntr-o aplicatie Office pentru a crea un set de bare de unelte
proprii care contin attea butoane cte valori valide de proprietate 5aceI! exista n Office;
fiecare imagine de buton si textul ToolTip este fixata la o asemenea valoare. Se poate referi
ncrucisat D-ul unei comenzi built-in la proprietatea 5aceI! a unui buton de pe aceste bare si
reciproc.
Sub MakeAllFaceds()
' Make fourteen bars with 300 faces each.
' Note that maxd is greater than last valid D, so
' error will occur when first invalid D is used
Const maxd = 3900
On Error GoTo realMax
For bars = 0 To 13
firstd = bars*300
lastd = firstd + 299
Set tb = CommandBars.Add
For i = firstd To lastd
Set btn = tb.Controls.Add
btn.Faced = i
btn.ToolTipText = "Faced = " & i
Next
tb.Name = ("Faces " & CStr(firstd) & " to " & CStr(lastd))
tb.Width = 591
tb.Visible = True
Next
' Delete the button that caused the error and set toolbar name
realMax:
268
btn.Delete
tb.Name = ("Faces " & CStr(firstd) & " to " & CStr(i1))
tb.Width = 591
tb.Visible = True
End Sub
/ota. D-urile controalelor pop-up pentru meniurile built-in sunt n domeniul 30002 30426. Reamintim ca
aceste D-uri returneaza copii vide ale meniurilor predefinite.
269
5orme grafice (s'apes) si stratul !e !esen
O$iectele )3ape. )3apeRange si )3apes
Returnarea colectiei Shapes
Returnarea obiectului Shape
Returnarea colectiei ShapeRange
Desenarea unei forme grafice
E!itarea unei forme grafice
Determinarea proprietatilor/metodelor adecvate
Lucrul cu o$iecte OLE
Lucrul cu mai multe forme
Construirea unui obiect ShapeRange
Lucrul cu colectia ShapeRange
Visual Basic dispune de un model de obiecte, reprezentnd stratul de desen, comun aplicatiilor Microsoft
Word, Microsoft Excel si Microsoft PowerPoint. Obiectul cel mai sus n ierarhia acestui model este colectia
)3apes, care contine toate obiectele grafice AutoShapes, forme libere, obiecte OLE, imagini care pot fi
incluse n stratul de desen al documentului. Este de notat ca formele grafice incluse n stratul de text din Word
nu sunt incluse n colectia )3apes.
Pentru o discutie mai ampla privind controalele ActiveX, care sunt o categorie speciala de forme grafice, se va
vedea capitolul 2ialoguri si controale !ctive<.
O$ser"atie. Pentru simplificarea exprimarii se utilizeaza termenul "forma" pentru shape, desi "forma grafica"
ar fi mai potrivit n contextul subiectului.
O$iectele )3ape. )3apeRange si )3apes
Exista trei obiecte diferite care reprezinta formele: colectia )3apes, reprezentnd toate formele din stratul de
desen dintr-un document Microsoft Excel, Word sau PowerPoint, colectia )3apeRange, care reprezinta o
submultime de forme din stratul de desen si obiectul )3ape, care reprezinta o forma grafica individuala. n
general, se utilizeaza colectia )3apes atunci cnd se adauga forme pe stratul de desen sau se parcurg toate
formele; se utilizeaza obiectul )3ape cnd se doreste formatarea sau procesarea unei anumite forme grafice
si se utilizeaza colectia )3apeRange cnd se doreste procesarea/formatarea unui grup de forme grafice.
O colectie )3apeRange poate contine oricte elemente. Daca include un singur obiect, este similara unui
obiect )3ape. Se poate utiliza o colectie )3apeRange care contine toate elementele din )3apes pentru a
formata toate formele n acelasi timp. Proprietatile si metodele care se aplica obiectului )3ape se pot aplica
de asemenea si colectiei )3apeRange.
Returnarea colectiei )3apes
O referinta la colectia )3apes se obtine prin proprietatea sinonima aplicata unui obiect document. Exemplul
urmator selecteaza toate formele din stratul de desen:
myDocument.Shapes.SelectAll
Returnarea o$iectului )3ape
Un obiect )3ape poate fi obtinut prin intermediul colectiei )3apes, n modul general de obtinere a unui
element dintr-o colectie, dupa unul dintre exemplele urmatoare:
270
myDocument.Shapes(3).Duplicate
myDocument.Shapes("Red Square").Duplicate
Fecare forma are un nume atribuit n mod implicit, cum ar fi "Rectangle 3", obtinut la adaugarea formei la
colectia )3apes. Prin proprietatea /ame se poate atribui un nume sugestiv. Acest lucru se poate realiza
concomitent cu adaugarea/crearea formei:
myDocument.Shapes,AddShape(msoShapeRectangle, 144, 144, 72, 72) _
.Name = "Red Square"
Aceasta metoda, care utilizeaza obiectul returnat de metoda A!!)3ape, poate fi utilizata si cu alte proprietati
sau metode ale obiectului )3ape.
Returnarea colectiei )3apeRange
Prin referinte de tipul )3apes%Ranges(index), unde index este fie numele, fie indicele, fie un tablou de
denumiri sau de indici, se returneaza o colectie )3apeRange care reprezinta un subset a colectiei )3apes.
Exemplul urmator umple formele 1 si 3 din myDocument:
myDocument.Shapes.Range(Array(1, 3)).Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientLateSunset
Se utilizeaza )election%)3apeRange pentru a returna o colectie )3apeRange care reprezinta toate formele
din selectie. Prin )election%)3apeRange(index), unde index este un indice sau un nume de forma, se obtine
accesul la un obiect )3ape din selectie:
ActiveWindow.Selection.ShapeRange(1).Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientLateSunset
O$ser"atie. Macro recorderul genereaza cod bazat pe selectie. Atunci cnd se scrie cod direct, sau se
editeaza codul generat de macro recorder, se poate crea un cod mai eficient prin returnarea formelor direct din
colectia )3apes%
Desenarea unei forme pe un Document. 2or:s3eet sau )li!e
Adaugarea unei forme pe stratul de desen se efectueaza printr-una dintre metodele colectiei )3apes dedicate
acestui scop. Fiecare tip de forma se obtine printr-o metoda specifica si acestea sunt enumerate n tabelul
urmator.
ipul !e forma grafica Meto!a Parametri
Callout A!!'allout (Type, Left, Top, Width, Height,
Anchor)
Note atasabile (doar
PowerPoint)
A!!'omment (Left, Top, Width, Height)
Linie sau curba care
conecteaza doua forme
diferite
A!!'onnector (Type, BeginX, BeginY, EndX,
EndY)
Curba Bzier A!!'ur"e (SafeArrayOfPoints)
271
Control nativ de formular
Excel (doar Microsoft
Excel)
A!!5orm'ontrol (Type, Left, Top, Width, Height)
Eticheta A!!La$el (Orientation, Left, Top, Width,
Height)
Linie A!!Line (BeginX, Beginy, EndX, EndY)
Sound sau movie (doar
PowerPoint)
A!!Me!iaO$(ect (FileName, Left, Top, Width,
Height)
Control ActiveX (doar
Word; pentru Excel si
PowerPoint se utilizeaza
A!!OLEO$(ect)
A!!OLE'ontrol (ClassType, Left, Top, Width,
Height, Anchor)
Obiect OLE scufundat
sau legat
A!!OLEO$(ect (ClassType, FileName,
LinkToFile, DisplayAscon,
conFileName, conndex,
conLabel, Left, Top, Width,
Height, Anchor)
magine A!!Picture (FileName, LinkToFile,
SaveWithDocument, Left, Top,
Width, Height, Anchor)
Rezervare de loc pentru
text sau pentru un obiect
grafic (doar PowerPoint)
A!!Place3ol!er (Type, Left, Top, Width, Height)
Linie poligonala nchisa
sau deschisa
A!!Pol&line (SafeArrayOfPoints)
AutoShape
(forma predefinita)
A!!)3ape (Type, Left, Top, Width, Height)
TextBox A!!e1t$o1 (Orientation, Left, Top, Width,
Height)
WordArt A!!e1tEffect (PresetTextEffect, Text,
FontName, FontSize, FontBold,
Fonttalic, Left, Top, Anchor)
Titlu de diapozitiv (doar
PowerPoint)
A!!itle
Forma libera Buil!5reeform
'on"erto)3ape
(EditingType, X1, Y1)

272
ntre parametri se remarca Left si Top care specifica pozitia formei, Width si Height care fixeaza dimensiunile
obiectului grafic. Pentru explicatii suplimentare asupra parametrilor care nu sunt suficient de expliciti se vor
studia intrarile respective din Help.
E!itarea unei forme
Prin intermediul proprietatilor si metodelor obiectelor )3apes si )3apeRange se pot modifica formele grafice
reprezentate. Acestea pot fi repozitionate n document, redimensionate, eliminate; se poate schimba aspectul
lor si li se poate adauga text.
Determinarea proprietatilor si meto!elor a!ec"ate
Proprietatile si metodele care controleaza atributele si comportarea comune tuturor tipurilor de forme se aplica
direct obiectelor )3apes si )3apeRange% Proprietatile si metodele care se aplica doar unor categorii de forme
sunt ncapsulate n obiecte secundare care se acceseaza prin obiectul )3ape.
Proprietati si meto!e comune
n aceasta categorie sunt incluse proprietatile care controleaza dimensiunea si pozitia formei (Left. op.
Eeig3t. 2i!t3) si metode care controleaza comportari generice de editare (cum ar fi Duplicate si Zor!er). Un
exemplu uzual este
With myDocument.Shapes(1)
.Height = 50
.Width = 100
End With
Proprietati si meto!e specifice
Atributele specifice unui anumit tip de forma sunt grupate sub obiecte secundare, cum ar fi 5ill5ormat,
continnd proprietatile care se aplica formelor cu culori de umplere, sau 'allout5ormat, continnd toate
proprietatile baloanelor (callouts). Pentru a lucra cu acest tip de atribute trebuie sa se returneze mai nti
obiectele care le contin. De exemplu, se utilizeaza proprietatea 5ill pentru a returna obiectul 5ill5ormat si se
poate aplica apoi proprietatea 5ore'olor#
myDocument.Shapes(1).Fill.FillColor.RGB = RGB(255,0,0)
n tabelul urmator sunt prezentate obiectele accesibile din obiectul )3ape si care contin proprietatile si
metodele specifice. Se remarca faptul ca nu toate denumirile proprietatilor contin cuvntul "Format" existent n
obiectul returnat (precum 5ill care returneaza 5ill5ormat).
Proprietatea o$iectului )3ape O$iectul returnat Aplica$il la
'allout 'allout5ormat Baloane de dialog
'onnector5ormat
(Excel si PowerPoint)
'onnector5ormat Conectori de forme
'ontrol5ormat (Excel) 'ontrol5ormat Controale de formular
native
273
5ill 5ill5ormat Forme cu culori de
umplere (toate cu exceptia
liniilor)
Line Line5ormat Toate formele
(Line5ormat reprezinta
linia sau chenarul)
Lin:5ormat Lin:5ormat Obiecte OLE legate,
imagini legate (doar Word),
cmpuri legate (doar
Word)
OLE5ormat OLE5ormat Obiecte OLE
Picture5ormat Picture5ormat magini si obiecte OLE
)3a!o4 )3a!o45ormat Toate formele
e1tEffect e1tEffect5ormat Obiecte WordArt
3reeD 3reeD5ormat Forme care pot fi reliefate
2rap5ormat (doar Word) 2rap5ormat Forme care pot fi
nconjurate de text
ncercarea de a returna obiecte secundare (cum ar fi 'allout5ormat. 'onnector5ormat. OLE5ormat.
Picture5ormat sau e1tEffect5ormat) dintr-un tip inadecvat de forma produce eroare. Pentru alte obiecte
(5ill5ormat. Line5ormat. )3a!o45ormat sau 3reeD5ormat) nu se produce eroare chiar daca forma
container nu suporta obiectul returnat.
Pentru a nu avea probleme se va utiliza proprietatea &pe si, cnd este aplicabila, proprietatea
Auto)3ape&pe, nainte de aplicarea unei metode sau proprietati specifice si se va introduce o secventa de
tratare a erorii.
For Each sh n myDocument.Shapes
f sh.Type = msoLinkedOLEObject Then
sh.LinkFormat.Update
End f
Next
'ulorile !e umplere ale formelor
Prin culorile de umplere se ntelege nu numai culoarea efectiva utilizata pentru colorarea suprafetei formei ci si
efectele utilizate la colorare, precum si posibilitatea de a utiliza o imagine drept fundal etc. Obiectul 5ill5ormat
reprezinta ntreaga umplere a formei, proprietatile si metodele sale permit stabilirea culorii, tipului,
transparentei. Deoarece atributele legate de culori si tipuri de umplere sunt interdependente, stabilirea unui
atribut produce, de regula, modificari ale altor atribute, astfel nct sa se obtina o multime consistenta de
atribute. Din acelasi motiv multe atribute sunt read-only, valorile lor fiind atribuite n functie de metodele
utilizate.
Tipul de umplere se stabileste printr-una dintre metodele Bac:groun! (doar PowerPoint),
One'olorGra!ient. Patterne!. PresetGra!ient. Presete1ture!. )oli!. 4o'olorGra!ient. 9serPicture
274
sau 9sere1ture!, corespunznd optiunilor disponibile n interfata utilizator a aplicatiilor. Prin proprietatile
read/write Bac:'olor. 5ore'olor. ransparenc& si Visi$le se poate controla aspectul umplerii.
Deoarece sunt foarte multe valori predefinite pentru proprietati sau argumentele metodelor, valorile respective
se vor lua din intrarile Help corespunzatoare obiectelor implicate.
Urmatorul exemplu adauga o forma dreptunghiulara la document, fixeaza cele doua culori si 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
A!augarea !e um$re si efecte Q<D
Proprietatea )3a!o4 a obiectului )3ape returneaza un obiect )3a!o45ormat prin care se controleaza
umbririle formei. Urmatorul exemplu produce adaugarea 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 3reeD a obiectului )3ape returneaza un obiect 3reeD5ormat care controleaza reliefarea
formei. Urmatorul exemplu adauga efectul de extrudare si precizeaza o adncime de 50 de puncte, purpurie,
perpendiculara si luminata de sus
With sh.ThreeD
.Visible = msoTrue
.Depth = 50
.ExtrusionColor.RGB = RGB(255, 0, 255)
.Perspective = msoFalse
.PresetLightingDirection = msoLightingTop
End With
Este normal ca acest efect sa nu fie suportat de anumite forme.
A!augarea !e te1t la o forma
Zona din interiorul unei forme care poate contine text este numita cadru cu text, text frame, si este
reprezentata de un obiect e1t5rame% Acest obiect, returnat de proprietatea e1t5rame, contine textul
propriu-zis, precum si proprietatile si metodele care controleaza alinierea si ancorarea cadrului cu textul.
275
Doar formele built-in de tip AutoShapes bidimensionale au asociate cadre cu text. naintea referirii obiectului
e1t5rame se verifica disponibilitatea acestuia prin proprietatea Ease1t5rame (valabila n PowerPoint) sau
prin verificarea proprietatii &pe. Se poate utiliza si tratarea erorilor n cazul n care proprietatea e1t5rame
poate fi aplicata unui obiect care nu o suporta.
n Microsoft Word se utilizeaza proprietatea e1tRange a obiectului e1t5rame pentru a returna un obiect
Range care reprezinta textul din cadrul respectiv:
ActiveDocument.Shapes(1).TextFrame.TextRange.Text = " . "
n Microsoft Excel se utilizeaza proprietatea '3aracters a obiectului e1t5rame pentru a returna un obiect
'3aracters care reprezinta textul din interiorul cadrului:
ActiveWorksheet.Shapes(1).TextFrame.Characters.Text = " . "
n PowerPoint, se utilizeaza proprietatea e1tRange a obiectului e1t5rame pentru a returna un obiect
e1tRange care reprezinta domeniul textului din cadrul respectiv:
ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text = " . "
Lucrul cu o$iecte OLE
Proprietatile si metodele obiectului OLE5ormat, cum ar fi Acti"ate si DoVer$, controleaza obiectul OLE
continut ntr-o forma. Obiectul OLE5ormat este returnat de proprietatea OLE5ormat a obiectului )3ape:
With myDocument.Shapes(3)
f .Type = msoEmbeddedOLEObject Or _
.Type = msoLinkedOLEObject Then
.OLEFormat.DoVerb
End f
End With
Utilizarea proprietatii O$(ect a obiectului OLE5ormat returneaza obiectul OLE continut n forma desenata
specificata (n Excel trebuie sa se utilizeze de doua ori proprietatea O$(ect ntr-o linie, separate de operatorul
punct, pentru a returna obiectul OLE).
Urmatorul exemplu, executat din Word sau PowerPoint, adauga text la celula A1 a primei foi de calcul dintr-un
caiet Excel continut n forma a treia din myDocument.
With myDocument.Shapes(3)
.OLEFormat.Activate
.OLEFormat.Object.Worksheets(1).Range("A1").Value = " noul text "
End With
Proprietatea Application a obiectului OLE, returnat de proprietatea sinonima, da acces la obiectul din vrful
ierarhiei modelului de obiecte al aplicatiei care a creat obiectul OLE. Urmatorul exemplu, executat din
Microsoft Excel (se va remarca dubla utilizare a proprietatii O$(ect), afiseaza numele aplicatiei n care a fost
creat fiecare obiect OLE scufundat n foaia activa:
For Each s n ActiveSheet.Shapes
f s.Type = msoEmbeddedOLEObject Then
s.OLEFormat.Activate
MsgBox s.OLEFormat.Object.Object.Application.Name
End f
276
End With
Lucrul cu mai multe forme
Pentru a lucra cu mai multe forme se poate parcurge o colectie )3apes sau )3apeRange si lucra cu fiecare
element al colectiei sau se poate construi o colectie )3apeRange cu toate formele grafice care se prelucreaza
si se aplica metode sau proprietati ntregii colectii )3apeRange.
Exista si posibilitatea, disponibila n interfata utilizator, de a grupa mai multe forme grafice, precum si
posibilitatea de aliniere a formelor.
Daca operatiunea dorita se poate executa n interfata utilizator pe o selectie multipla de forme grafice, atunci
construirea unei colectii )3apeRange este recomandata.
Daca operatiunea nu se poate efectua n interfata utilizator pe o selectie multipla, atunci parcurgerea unei
colectii, )3apes sau )3apeRange, este calea adecvata. Parcurgerea poate fi efectuata printr-o structura
uzuala For Each . Next:
For Each sh n myDoc.Shapes
f sh.Type = msoAutoShape Then
sh.TextFrame.TextRange.nsertAfter " (version 1)"
End f
Next
'onstruirea unui )3apeRange
Daca este necesara obtinerea unui domeniu de forme care sa contina doar forme de anumite tipuri, se va
utiliza o instructiune conditionala de testare a atributelor si se va adauga denumirea sau indicele formei
selectate la un tablou dinamic. Se va construi apoi un obiect )3apeRange utiliznd acest tablou.
Urmatorul exemplu construieste un domeniu de forme cu toate formele de tip AutoShapes din document si
apoi le grupeaza.
With myDocument.Shapes
numShapes = .Count
f numShapes > 1 Then
numAutoShapes = 0
ReDim autoShpArray(1 To numShapes)
For i = 1 To numShapes
f .tem(i).Type = msoAutoShape Then
numAutoShapes = numAutoShapes + 1
autoShpArray(numAutoShapes) = .tem(i).Name
End f
Next
f numAutoShapes > 1 Then
ReDim Preserve autoShpArray(1 To numAutoShapes)
Set asRange = .Range(autoShpArray)
asRange.Group
End f
End f
End With
277
Lucrul cu colectia )3apeRange
Atunci cnd se aplica proprietati sau metode colectiei )3apeRange, se va tine seama de urmatoarele
principii:
Aplicarea unei metode colectiei este echivalenta cu aplicarea acelei metode la fiecare obiect )3ape
din colectie.
Stabilirea unei proprietati a colectiei este echivalent cu stabilirea acelei proprietati fiecarui obiect
)3ape din colectie.
proprietate a colectiei care returneaza o constanta, returneaza valoarea comuna daca toate obiectele
componente au o aceeasi valoare, sau constanta "mixed" (de exemplu msoLineDas3)t&leMi1e!
pentru stilul de punctare a liniei).
proprietate a colectiei care returneaza un tip de data simplu, cum ar fi Long. )ingle sau )tring,
returneaza valoarea proprietatii pentru a forma daca toate formele au aceeasi valoare a proprietatii.
Valoarea anumitor proprietati poate fi returnata sau stabilita numai daca exista exact o forma n
colectie. Daca exista mai multe forme n colectie, atunci apare o eroare. Acest fapt apare atunci cnd
se utilizeaza o proprietate sau metoda care se poate aplica doar pentru un obiect.
Aceste principii actioneaza si atunci cnd se lucreaza cu proprietati sau metode ale formelor, grupate n
obiecte secundare ale colectiei )3apeRange (cum ar fi 5ill5ormat).
Urmatorul exemplu construieste un obiect )3apeRange din doua forme numite si aplica ambelor o umplere de
tip gradient.
Set myRange = myDoc.Shapes.Range(Array("Big Star", "Little" Star"))
myRange.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass
Metodele Align si Distri$ute sunt utilizate pentru alinierea sau distribuirea uniforma a formelor dintr-o colectie
)3apeRange. Prin metoda Zor!er se poate modifica ordinea pe Z care determina ordinea de suprapunere a
formelor.
Metoda Group realizeaza gruparea tuturor formelor dintr-o colectie )3apeRange. Prin 9ngroup. Regroup se
realizeaza operatiunile sinonime din interfata utilizator.
Daca se doreste lucrul cu o forma individuala dintr-un grup, dar fara a renunta la grupare n prealabil, se
utilizeaza proprietatea GroupItems a obiectului )3ape care reprezinta grupul. Proprietatea returneaza un
obiect Group)3apes si metoda Item a acestui obiect returneaza o forma individuala din grupul de forme:
With myDocument.Shapes
.AddShape(msoShapesoscelesTriangle, 10, 10, 100, 100).Name = "shpOne"
. AddShape(msoShapesoscelesTriangle, 150, 10, 100, 100).Name = "shpTwo"
. AddShape(msoShapesoscelesTriangle, 300, 10, 100, 100).Name =
With .Range(Array("shpOne", "shpTwo", "shpThree")).Group
.Fill.PresetTextured msoTextureBlueTissuePaper
.Grouptems(2).Fill.PresetTextured msoTextureGreenMarble
End With
End With
278

S-ar putea să vă placă și