Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La...

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. Proprietãti. 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 Modificãri î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 Instructiunile VBA Operatiuni de intrare-iesire Visual Basic Editor Modele de obiecte Obiecte Microsoft Word (I) Obiecte Microsoft Word (II) Obiecte Microsoft Word (III) Controale ActiveX si Dialoguri 1

Transcript of Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La...

Page 1: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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. Proprietãti. 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 Modificãri î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 • Instructiunile VBA • Operatiuni de intrare-iesire • Visual Basic Editor • Modele de obiecte • Obiecte Microsoft Word (I) • Obiecte Microsoft Word (II) • Obiecte Microsoft Word (III) • Controale ActiveX si Dialoguri

1

Page 2: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• Obiecte Microsoft Excel • Obiecte Microsoft Access • DAO (Data Access Objects) (I) • DAO (Data Access Objects) (II) • Obiecte Microsoft PowerPoint • Meniuri si bare de unelte • Forme grafice • Conventiile Reddick

2

Page 3: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

BAZELE PROGRAMARII Visual Basic for Application (VBA)

Tipuri de date

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, încât declararea explicita poate fi utilizata atunci când se doreste economisirea memoriei (tipul Variant aloca mai multa memorie), viteza în executie sau atunci când se scriu date într-un fisier în acces direct.

Boolean

Domeniu de valori: True sau False (valorile logice)

Memorie: 2 bytes

Declarator de tip:

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

Byte

Domeniu de valori: 0–255 (numere întregi, fara semn)

Memorie: 1 byte

Declarator de tip:

Observatii.

Currency

Domeniu de valori: -922 337 203 685 477.5808 — 922 337 203 685 477.5807

Memorie: 8 bytes

Declarator de tip: @

Observatii. 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 de valori: 1 ianuarie 100 — 31 decembrie 9999, 0:00:00 — 23:59:59

Memorie: 8 bytes

Declarator de tip:

3

Page 4: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Observatii. Informatiile de tip data calendaristica si/sau timp orar sunt memorate drept numere flotante, partea întreaga reprezentând data calendaristica, partea fractionara reprezentând 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 de valori: (vezi observatiile)

Memorie: 12 bytes

Declarator de tip:

Observatii. Valorile de tip Decimal sunt memorate ca întregi fara semn însotiti de un factor de scala, între 0 si 28, specificând 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.).

Double

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

Memorie: 8 bytes

Declarator de tip: #

Observatii.

Integer

Domeniu de valori: -32 768 — 32 767.

Memorie: 2 bytes

Declarator de tip: %

Observatii.

Long

4

Page 5: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Domeniu de valori: -2 147 483 648 — 2 147 483 647.

Memorie: 4 bytes

Declarator de tip: &

Observatii.

Object

Domeniu de valori: (vezi observatiile)

Memorie: 4 bytes

Declarator de tip:

Observatii. 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 târzie (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.

Single

Domeniu de valori: numere negative de la -3.402823E38 pâna la -1.401298E-45; numere pozitive de la 1.401298E-45 pâna la 3.402823E38.

Memorie: 4 bytes

Declarator de tip: !

Observatii.

String

Domeniu de valori: sir de lungime variabila: pâna la 2^31 caractere; sir de lungime fixa: pâna la 2^16 caractere.

Memorie: 2 bytes

Declarator de tip: $

Observatii. Un sir de lungime fixa declarat Public nu poate fi utilizat într-un modul de clasa.

Variant (default)

Domeniu de valori: 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

Page 6: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Memorie: în functie de subtipul valorii: valorile numerice ocupa 16 bytes, valorile de tip String necesita 22 bytes plus câte un byte pentru fiecare caracter.

Declarator de tip:

Observatii. 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 Integer si atribuita unui Variant va fi memorata ca un întreg pâna când, ridicând-o de exemplu la o putere, valoarea ei excede domeniul tipului Integer. În acest caz are loc promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). 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 decât 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.

Tipuri definite de utilizator

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.

[Private | Public] Type varname

elementname [([subscripts])] As type

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

. . .

End Type

6

Page 7: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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, variabilelor si tablourilor

Nume

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 când 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.

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

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

Private — cuvânt cheie, 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, Integer, 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 Is) 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

Page 8: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Exemple

Const NrLinii = 15

Public Const MesajInitial = "Tastati numarul de linii"

Private Const NrLinii as Integer = 15

Public Const NrLinii = 15, Pondere as Single = 1.21

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

Declararea variabilelor

Variabilele, simple sau tablou, se definesc prin 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 Explicit

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 [WithEvents] varname[([subscripts])] [As [New] type]

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

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

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

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

varname — numele variabilei (obligatoriu).

subscripts — dimensiunile tabloului de date (daca se declara o variabila tablou). Pot exista pâna la 60 de indici, separati prin virgule, declararea dimensiunilor pentru un indice fiind de forma

[lower To] upper

Limita inferioara este, implicit, 0, dar poate fi controlata prin instructiunea Option Base.

8

Page 9: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Daca nu se indica limitele indicilor (dar parantezele sunt prezente), se defineste o variabila tablou dinamica (nu si prin Static) ale carei dimensiuni pot fi precizate/redefinite prin instructiunea ReDim.

New — permite crearea implicita a unui obiect (atunci când 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, Integer, 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 atât la nivel de modul cât 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, atât timp cât 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 utilizând 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).

Exemple

Dim x As Double, ColtStanga As Integer

Private I, J As Long

Static Venit As Currency, NumPren As String

Dim Retineri(5) As Currency

Public indicatori(10) As Byte

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

Public fntScris As Font

Dim appWD As Word.Application

9

Page 10: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proceduri

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.

Observatie. Orice instructiune executabila trebuie sa apartina unei proceduri. Declaratiile pot sa apara si în afara procedurilor, la nivel de modul.

Proceduri Sub

Organizarea generala a unei proceduri de tip Sub este

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

[instructiuni]

[Exit Sub]

[instructiuni]

End Sub

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 decât prin linia finala.

Argumentele se definesc dupa sintaxa:

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

Optional — arata ca parametrul nu este obligatoriu. Parametrii optionali trebuie sa fie grupati la sfârsitul 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 efectuându-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

Page 11: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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, Integer, 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 proceduri Sub

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:=valoare_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.

Proceduri Function

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).

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

[statements]

[name = expression]

[Exit Function]

[statements]

[name = expression]

End Function

11

Page 12: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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).

Exemple de proceduri

Public Function AriaCilindru (raza, inaltime) As Double

Const Pi = 3.14159

cilBaza = Pi*raza^2

cilLaterala = 2*Pi*raza*inaltime

AriaCilindru = 2*cilBaza + cilLaterala

End Function

Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, _

ByRef cilAria As Double)

Const Pi As Single = 3.14159

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

Organizarea generala a unui proiect VBA

12

Page 13: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectele si prelucrarile necesare realizarii unei aplicatii VBA (presupunând 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 întrucât 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. Utilizând 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 variabile, constante sau proceduri

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.

Nota. 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.

Nivelul procedura

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.

Nivel de modul, privat

13

Page 14: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Nota. 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.

Nivel de modul, public

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

Viata unei variabile

Prin viata unei variabile se întelege timpul cât 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) (având codul ASCII 0)

Variabila Variant Empty

Variabile de tip utilizator fiecare element este initializat separat, potrivit tipului primar

Variabila Object Nothing (pâna 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 pâna 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 pâna la terminarea executiei codului (inclusiv de la un apel la altul). Includerea 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

Page 15: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Variabilele declarate la nivel de modul standard îsi pastreaza valoarea pe tot timpul executiei. Variabilele declarate la nivel de modul clasa îsi pastreaza valoarea atât timp cât exista o instanta a clasei. Diferenta fata de variabilele Static este aceea ca memoria este utilizata permanent (nu se elibereaza la parasirea domeniului).

Variabile Object

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

Dim myDoc As Object

sau specificând exact numele de 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 târzie (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.

Instructiunea Set are sintaxa:

Set objectvar = {[New] objectexpression | Nothing}

unde

o objectvar este numele variabilei (sau proprietatii) o New permite crearea unei noi instante a clasei o Objectexpression este o expresie constând î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, eliberând resursele sistem si de

memorie utilizate.

În general, atunci când 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. Utilizând clauza New se va crea efectiv o copie (instanta) a obiectului.

Exemple

Prin urmatoarele doua instructiuni se defineste variabila objWord care este legata târziu 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

Page 16: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Este de remarcat ca instructiunea Set apeleaza o functie care creeaza si returneaza o referinta la un obiect ActiveX.

Constante predefinite (built–in)

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 întrucât 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

Page 17: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

INSTRUCTIUNILE 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).

Continuarea 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 lânga 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 ":".

Etichetarea 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.

Identificatorii de linii pot fi utilizati în instructiuni de control, desi codul astfel construit nu respecta regulile programarii structurate..

Comentarii

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 cuvântul Rem urmat de un spatiu.

Comentariul de pe aceeasi linie cu o instructiune se introduce printr-un apostrof urmat de comentariu.

17

Page 18: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Semnificatie Observatii

^ 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, Integer, 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, Integer sau Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), 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), Integer, Variant (Integer), 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, Integer, 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

Page 19: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

- 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, Integer, 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 de comparare

Relatiile care exista între diferite tipuri de entitati se pot evidentia prin comparatii având una dintre formele urmatoare:

result = expression1 comparisonoperator expression2

result = object1 Is object2

result = string Like 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 Like 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 când 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

Page 20: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• 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

* oricâte caractere (chiar nici unul)

# o cifra oarecare (0–9).

[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 de 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 Semnificatie Observatii

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, pozitionând cifrele binare ale rezultatului dupa regulile de calcul ale echivalentei logice: 0 Eqv 0 este 1 etc.

20

Page 21: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Imp implicatia logica True Imp Null este Null, False Imp * este True, Null Imp True este True, Null Imp False (sau Null) este Null. Operatorul Imp realizeaza si compararea bit cu bit a doua expresii numerice, pozitionând cifrele binare ale rezultatului dupa regulile de calcul ale implicatiei logice: 1 Imp 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, pozitionându-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 pozitionând 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 de atribuire

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 = expression

unde varname este nume de variabila sau de proprietate.

Este de remarcat forma posibila (si de fapt general utilizata) fara cuvântul Let.

Observatii. 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 decât 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

Page 22: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Nu se poate utiliza Let (cu sau fara cuvântul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza în aceasta situatie instructiunea Set.

Instructiunea LSet

Copie, cu aliniere la stânga, 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

LSet stringvar = string

LSet varname1 = 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 stânga) în zona de memorie a primei variabile.

Caracterele care ramân neocupate se completeaza cu spatii, iar daca zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate).

Instructiunea LSet

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

RSet stringvar = string

Caracterele ramase neocupate în variabila sunt completate ccu spatii. Instructiunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator.

Instructiuni executabile

Executia unui program are loc, în lipsa oricarui control, instructiune cu instructiune, de la stânga 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 de transfer (GoSub…Return, GoTo, OnError, On…GoSub, On…GoTo)

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

Page 23: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

GoSub…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

GoSub 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.

GoTo

Realizeaza tranferul controlului executiei la o linie din aceeasi procedura.

GoTo 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.

Observatie. Este prezentata în sectiunea dedicata controlului erorilor.

On…GoSub, On…GoTo

Permit o ramificare multipla, dupa valoarea unei expresii. Se recomanda, pentru claritatea codului, utilizarea structurii Select Case în locul acestor structuri.

On expression GoSub destinationlist

On expression GoTo destinationlist

unde

expression este o expresie numerica având 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 decât 255 se produce o eroare.23

Page 24: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 decât 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.

DoEvents

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

DoEvents( )

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.

Observatie. Pentru alte observatii se va studia documentatia comenzii DoEvents.

End

Termina executia unei proceduri (sub forma prezentata aici) sau indica sfârsitul codului unei structuri de tip bloc (cum ar fi End Function, End If etc., prezentate la structurile respective).

Sintaxa, în ipostaza opririi executiei, este:

End

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 sfârsitului 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.

Exit

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

Exit Do

Exit For

24

Page 25: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Exit Function

Exit Property

Exit Sub

si efectele sunt prezentate la structurile respective. Nu trebuie confundata cu instructiunea End.

Stop

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.

Stop

Instructiunea 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 sfârsitul 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 [{While | Until} condition]

[statements]

[Exit Do]

[statements]

Loop

sau

Do

[statements]

[Exit Do]

25

Page 26: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

[statements]

Loop [{While | Until} 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 atâta timp (while) sau pâna când (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 întrucât 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 pâna când o noua evaluare produce False.

Do Until…Loop Testeaza conditia la începutul buclei, executa bucla numai daca rezultatul este False si continua astfel pâna când o noua evaluare produce True.

Do…Loop While Se executa întotdeauna bucla o data, se testeaza conditia la sfârsitul buclei si se repeta bucla atât timp cât conditia este True. Oprirea este pe conditie falsa.

Do…Loop Until Se executa întotdeauna bucla o data, se testeaza conditia la sfârsitul buclei si se repeta bucla atât timp cât conditia este False. Oprirea este pe conditie adevarata.

For…Next

Atunci când 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 când se atinge o valoare specificata. Sintaxa este:

For counter = start To end [Step step]

[statements]

26

Page 27: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

[Exit For]

[statements]

Next [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.

Instructiunile 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 când 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.

Instructiunile 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.

For Each…Next

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 când nu se cunoaste numarul de elemente sau daca se modifica, în timpul executiei, continutul colectiei.

Sintaxa este:

For Each element In group

[statements]

27

Page 28: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

[Exit For]

[statements]

Next [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 pâna la 4.

Instructiunile Exit For sunt explicate la For…Next.

Buclele ForEach...Next pot fi îmbricate cu conditia ca elementele utilizate la iterare sa fie diferite.

Observatie. 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.

While…Wend

Executa un grup de instructiuni atât timp cât este adevarata o conditie. Sintaxa

While condition

[statements]

Wend

Este recomandat sa se utilizeze o structura Do…Loop în locul acestei structuri.

With

Programarea orientata pe obiecte produce, datorita calificarilor succesive, constructii foarte complexe atunci când 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

Page 29: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

With object

[statements]

End With

unde

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

statements sunt instructiunile care se executa pentru entitatea precizata.

Permitând 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.

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

Ramificarea firului executiei dupa rezultatul verificarii unei conditii este o necesitate frecventa în orice implementare.

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

If…Then…Else

O asemenea structura, întâlnita 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 Then [statements] [Else elsestatements]

sau

If condition Then

[statements]

[ElseIf condition-n Then

[elseifstatements] ...

[Else

[elsestatements]]

29

Page 30: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

End 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 TypeOf objectname Is objecttype, evaluata True daca objectname este de tipul obiect specificat în objecttype.

statements, elsestatements, elseifstatements sunt blocurile de instructiuni executate atunci când 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).

Select Case

Instructiunea Select Case se poate utiliza în locul unor instructiuni ElseIf multiple (dintr-o structura If…Then…ElseIf) atunci când se compara aceeasi expresie cu mai multe valori, diferite între ele. Instructiunea Select Case furnizeaza, prin urmare, un sistem de luare a deciziilor similar instructiunii If…Then…ElseIf. Totusi, Select Case produce un un cod mai eficient si mai inteligibil. Sintaxa este:

Select Case testexpression

[Case expressionlist-n

[statements-n]] ...

[Case Else

[elsestatements]]

End Select

unde

testexpression este o expresie numerica sau sir.

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

• expression. • expression To expression. Cuvântul To introduce un interval de valori, valoarea minima fiind prima

specificata. • Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptând Is si Like)

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

Page 31: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 pâna la urmatoarea clauza Case, sau pâna 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 când 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.

Instructiunile 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.

Functia Shell()

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

Shell(pathname[,windowstyle])

unde

pathname este Variant (String). Contine numele programului care se executa, argumentele necesare si poate da calea completa (daca este nevoie).

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

Valorile posibile pentru argumentul windowstyle sunt

Constanta numita Valoarea Semnificatia

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

Page 32: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

Page 33: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Operatiuni de intrare-iesire

În categoria operatiunilor de I/O se pot deosebi

• schimbul de informatii cu utilizatorul: acesta se poate desfasura prin intermediul unor formulare (forms) predefinite (InputBox, 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 standard cu utilizatorul

Î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. Informatia înscrisa este transferata programului ca valoare a functiei care initiaza dialogul grafic.

Functia InputBox

Apelul functiei InputBox 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

InputBox(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, continând textul afisat initial în zona text rezervata utilizatorului. Textul este, în lipsa modificarii lui, retransmis ca raspuns (actionând butonul OK).

xpos este expresia numerica specificând pozitia orizontala a dialogului (în twips, de la latura stânga a ecranului). În lipsa argumentului, boxa de dialog este centrata orizontal.

ypos este expresia numerica specificând 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

Page 34: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Functia MsgBox

Un dialog mai simplu decât InputBox 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 indicând care buton a fost actionat. Sintaxa este

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

unde

prompt este textul mesajului (Vezi InputBox)

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 InputBox.

Constantele recomandate pentru formarea argumentului buttons sunt

Constanta Valoare Descriere

VbOKOnly 0 Numai butonul OK

VbOKCancel 1 OK si Cancel

VbAbortRetryIgnore 2 Abort, Retry si Ignore

VbYesNoCancel 3 Yes, No si Cancel

VbYesNo 4 Yes si No

VbRetryCancel 5 Retry si Cancel

VbCritical 16 Icoana de Critical Message

VbQuestion 32 Icoana de Warning Query

VbExclamation 48 Icoana Warning Message

VbInformation 64 Icoana de Information Message

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

VbDefaultButton2 256 Al doilea buton este cel implicit

VbDefaultButton3 512 Al treilea buton este cel implicit

VbDefaultButton4 768 Al patrulea buton este cel implicit

34

Page 35: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

VbApplicationModal 0 Application modal: aplicatia curenta este oprita pâna când raspunde utilizatorul

VbSystemModal 4096 System modal: toate aplicatiile sunt oprite pâna când 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 câte 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

Constanta Valoare Descriere

VbOK 1 OK

VbCancel 2 Cancel

VbAbort 3 Abort

VbRetry 4 Retry

VbIgnore 5 Ignore

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.

Utilizarea 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).

Accesarea 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. Prelucrarea 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 întâi deschis (instructiunea Open), operatiunea producând si crearea fisierului în cazul unui

35

Page 36: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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. Identificare fisierului se poate efectua, în program, prin numele sau sau prin numarul atasat. Numarul poate fi în domeniul 1–255 pentru fisierele proprii aplicatiei si în domeniul 256–511 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 Input, Output si Append), utilizat de regula pentru scrierea fisierelor text (rapoarte, jurnale etc.);

• acces raandom (aleator) (modul Random), în cazul când 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 pâna când este închis si deschis în alt mod (daca structura lui permite asa ceva).

Instructiunile tipice pentru accesul la informatiile dintr-un fisier sunt

Modul de acces

Scriere Citire

Secvential Print #, Write # Input #

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 #, Spc, Tab, Width #

Copierea unui fisier FileCopy

Creare, acces Open

Fixarea atributelor FileAttr, GetAttr, SetAttr

Fixarea pozitiei active de citire/scriere

Seek

Inchidere Close, Reset

36

Page 37: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Informatii despre un fisier EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek

Lungimea unui fisier FileLen

Operatii asupra fisierelor Dir, Kill, Lock, Unlock, Name

Scriere Print #, Put, Write #

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 I/O pe un fisier daca acesta nu este deschis în prealabil. Sintaxa:

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

unde

pathname expresie String care specifica numele fisierului (poate include întreaga cale unitate, directoare etc., dupa regulile uzuale);

mode cuvânt cheie care specifica modul de acces la fisier: Append, Binary, Input, Output sau Random; daca nu se specifica nimic se va considera acces Random;

access clauza optionala specificând operatiunile I/O permise pentru fisier: Read, Write sau Read Write;

lock clauza optionala specificând operatiile asupra fisierului permise altor procese care se executa (când fisierul este deschis): Shared, Lock Read, Lock Write si Lock Read Write.

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) exprimând, în octeti, lungimea înregistrarii (la aceesul Random) 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, Input si Random permit acest lucru, Append, Output nu permit (fisierul trebuie mai întâi închis si abia apoi deschis într-un asemenea mod).

FreeFile

Functia returneaza un întreg reprezentând urmatorul numar de fisier disponibil.

FreeFile[(rangenumber)]

37

Page 38: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

rangenumber este un Variant care specifica domeniul din care se solicita un numar liber de fisier: 0 (valoarea implicita) returneaza un numar în 1–255 (pentru fisiere proprii, 1 returneaza un numar în 256–511 (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 Random) 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 când 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 Random) 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 când se opereaza, în special, cu tipurile Variant si cu tablouri.

Input #

Citeste date dintr-un fisier secvential si le transfera în variabilele specificate.

38

Page 39: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Instructiunea se va utiliza doar cu fisierele deschise în modul Input sau Binary, datele citite cu Input # 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 sfârsitului de fisier când operatiunea de citire nu este încheiata, provoaca eroare.

Întrucât 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 Input #.

Functia Input()

Citeste si returneaza un sir de caractere citite dintr-un fisier deschis în mod Input sau Binary. Datele citite prin aceasta functie sunt scrise, de regula, prin Print # sau Put.

Input(number, [#]filenumber)

unde

number orice expresie numerica specificând numarul de caractere care se citesc.

filenumber numar de fisier (deschis).

39

Page 40: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Spre deosebire de instructiunea Input #, functia Input 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 Input pâna când EOF returneaza True genereaza eroare (procedeul este valid pentru citirea din fisiere binare cu Get). Se vor utiliza functiile LOF and Loc pentru detectarea sfârsitului de fisier.

Observatie. Pentru date pe octeti din fisiere text se va utiliza functia InputB, 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 întâlnirea 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 Input # sunt, de regula, scrise cu Print #.

Write #

Scrie o înregistrare într-un fisier secvential. Datele scrise prin Write # sunt citite, de regula, cu Input #. Utilizarea scrierii cu Write # asigura o delimitare corecta a fiecarui câmp scris, ceea ce permite regasirea corecta (fara alte artificii) a informatiilor la citirea cu Input #. În acelasi timp, informatiile sunt regasite corect indiferent de configurarile locale.

Sintaxa este

Write #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

Page 41: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• 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#.

Instructiunea 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 încât urmatoarea scriere va fi pe un rând 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 Input # sau cu Input.

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

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

unde

Spc(n) insereaza n spatii în iesire

Tab(n) pozitioneaza punctul de insertie (începutul zonei de scriere) la o coloana indicata absolut de n. Utilizând 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 rândul urmator.

charpos Locul punctului de insertie

; Imediat dupa ultimul caracter tiparit

Tab(n) Coloana cu numarul n

Tab Începutul urmatoarei zone de tiparire

41

Page 42: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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).

Informatiile 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 Immediate a mediului VBA, se va vedea si metoda Print (vezi Help – Print Method).

Close

Închide unul sau mai multe fisiere deschise prin Open pentru instructiuni de I/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 I/O (pâna la o noua deschidere).

Sintaxa este

Close [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.

Seek

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

Seek [#]filenumber, position

unde

filenumber numarul atasat fisierului.

position numar între 1 si 2,147,483,647, inclusiv, care indica locul urmatoareioperatii I/O.

42

Page 43: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 sfârsitul fisierului, urmatoarea operatiune de scriere (fara repozitionare) extinde fisierul.

Pozitia indicata nu poate fi zero sau negativa.

Functia Seek

Returneaza, ca un întreg Long, pozitia curenta I/O dintr-un fisier specificat. Fisierul trebuie sa fie în prealabil deschis.

Seek(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.

Modul de acces Valoarea returnata

Random Numarul urmatoarei înregistrari (care va fi citita sau scrisa)

Binary, Output,Append, Input

Pozitia octetului (numerotat de la 1) la care va avea loc urmatoarea operatiune I/O

EOF

Returneaza un întreg cu valoarea logica True (-1) atunci când se atinge sfârsitul unui fisier deschis pentru citire (Random, Binary sau Input). Pentru fisierele dschise în iesire functia genereaza mereu True.

EOF(filenumber)

filenumber este un întreg continând numarul fisierului testat.

Utilizarea uzuala este

Do While Not EOF(filenum)

… (instructiuni, inclusiv citire din fisierul filenum)

Loop

Pentru acces secvential (Input) se întoarce False pâna când se atinge sfârsitul de fisier, pentru fisierele Random sau Binary se returneaza False pâna când ultima instructiune Get executata nu a putut citi o înregistrare întreaga.

43

Page 44: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Citirea cu Input dintr-un fisier deschis Binary produce eroare la utilizarea mecanismului general (pâna când EOF () este true): se va utiliza citirea cu Get sau citirea cu Input î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

Mod 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 sfârsitului de fisier la citiri Binary (schema generala este data la LOF).

LOF

Returneaza un Long care reprezinta, în octeti, marimea unui fisier deschis prin Open. Pentru fisierele nedeschise se poate utiliza, în acelasi scop, functia FileLen().

LOF(filenumber)

filenumber este numarul atasat fisierului.

Utilizarea acestei functii, împreuna cu functia Loc, pentru determinarea sfârsitului de fisier (similar cu EOF) accesat Binary este dupa schema generala:

Open filename For Binary As filenum

Do While CurrentLocation < LOF(filenumber)

… (citire din fisierul filenum )

CurrentLocation = Loc(filenumber)

Loop

44

Page 45: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Visual Basic Editor

În aceasta sectiune se prezinta mediul de dezvoltare Visual Basic for Applications integrat în Microsoft Office 97. Informatiile 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 Editor. Atunci când vor fi necesare, se vor da explicatii suplimentare pentru Access 97.

Utilizând 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, având î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 deschizând, 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 încât 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 întâi 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.

Interfata grafica VBE este suficient de complexa, asemanatoare mediilor de programare din Visual Studio. Pe lânga 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; • Immediate Window care permite executarea imediata a unei linii de cod; • Watch Window unde se afiseaza valorile unor expresii specificate (utile în depanarea programelor).

Properties Window

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

Page 46: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 (când nu este vizibila), prin comanda Properties Window din meniul View.

Project Explorer

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 stânga). 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.

Code Window

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 întâi 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 Full Module View în fisa Editor din Options (meniul Tools) (în caz contrar se va vedea doar câte 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

Page 47: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o forma utilizator. Selectarea unei proceduri produce o defilare a textului astfel încât 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 utilizând bara de divizare etc.

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

Locals Window

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 când se trece din modul Run în modul Break sau atunci când se navigheaza în stiva de apeluri.

Pentru o descriere a ferestrei se va vedea sectiunea dedicata depanarii programelor.

Immediate Window

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 Immediate este executata în contextul procedurii afisate în Procedure Box.

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

Watch Window

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.

Scrierea procedurilor

Instructiunile 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 atât 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 View - Toolbars si selectarea barei dorite). • Pe bara Visual Basic se actioneaza butonul Record Macro. • În dialogul Record Macro se înlocuieste numele dat implicit în boxa Macro Name si apoi OK.

47

Page 48: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

• Se executa actiunile menite sa fie înregistrate/traduse în VB, în succesiunea dorita. • Pe bara Stop Recording (aparuta la initierea procesului de înregistrare) se apasa butonul Stop

Recording.

Pentru a vedea liniile de cod generate, se deschide în aplicatia de baza meniul Tools, comanda Macro, apoi Macros, se selecteaza dupa denumire si se apasa butonul Edit.

Codul sursa poate fi vazut si prin navigarea în VBE prin Project Explorer, 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 (Tools - Macro - Macros) sunt macro-uri.

Scrierea unei proceduri

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 Project Explorer în proiectul unde se adauga modulul nou creat si se da comanda Module din meniul Insert.

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

Pentru a adauga o procedura la un modul, se selecteaza modulul în Project Explorer, se deschide meniul Insert 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.

Scrierea unei proceduri de eveniment (event procedure)

Daca se doreste scrierea de cod sursa care sa se execute automat atunci când 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 când 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

Page 49: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Observatie. 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).

Unelte 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 încât VB poate recunoaste un cuvânt, atunci prin CTRL+SPACE, sau click pe butonul Complete Word de pe bara de unelte Edit, completeaza cuvântul.

Î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 Info; • 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 Indent; • fixarea latimii între pozitiile tabulatorului, 1 la 32 de spatii (implicit fiind 4) —Tab Width.

Pe bara de unelte Edit exista câteva 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 când 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 Info — ofera, ca ajutor, sintaxa pentru o variabila, functie etc. prin analiza locului punctului de insertie pe linia curenta.

• Parameter Info — 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 cuvântul tastat. • Comment Block — care transforma în comentarii liniile selectate.

49

Page 50: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• Uncomment Block — înlatura semnul de comentarii la liniile selectate.

Executarea unei proceduri Sub

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 Sub/UserForm de

pe bara de unelte Standard sau Debug; • ca un macro, Run din dialogul Macros (Tools - Macro) al aplicatiei de baza; • apelata din alta procedura.

La apelul unei proceduri din alta procedura se va tine seama de interactiunea declaratiilor Public, Private, ca si de referintele la alte proiecte (meniul Tools - References).

50

Page 51: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Modele de obiecte

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 câte un capitol pentru Word, Excel etc., în care se vor prezenta particularitatile de operare si obiectele specifice aplicatiei.

Privire generala

Orice aplicatie poate fi gândita 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 având 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 când obiectul Application exista (deci când aplicatia se executa). De exemplu, obiectul Application Excel contine obiecte Workbook, 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 rândul 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, atât obiectului însusi, cât si tuturor obiectelor descendente din ierarhie. Cu cât obiectul este situat mai sus în ierarhie, cu atât este mai vast domeniul continutului si functionalitatii sale. Locul unui obiect în model este gândit astfel încât continutul si functionalitatea lui sunt adecvate domeniului sau. Se poate gândi 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 Selection este continut în obiectul Windows etc.

Proprietati si metode

51

Page 52: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 când 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 dintre modelul obiectelor si interfata utilizator

Exista doua cai prin care utilizatorul poate interactiona cu obiectele aplicatiei:

o manual (utilizând interfata utilizator a aplicatiei); o programatic (utilizând 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 pâna la el. Întregul traseu (cu exceptia nivelului Application, care este uneori subînteles) trebuie specificat ca în exemplul aratat.

Colectii de obiecte

52

Page 53: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

O colectie este un obiect care include obiecte similare (dar nu neaparat), astfel încât 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: Workbooks este colectia de obiecte Workbook, Documents este colectia de obiecte Document etc.

Elementele (membrii) colectiei se pot identifica prin numarul de ordine (începând cu 1) sau prin nume (rezulta ca ansamblul elementelor este ordonat). Astfel instructiunea

Presentations.Item("Perspective").Close

utilizata în PowerPoint produce activarea prezentarii cu numele Perspective si apoi o închide. Exemplul utilizeaza metoda Item 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 Count, se pot adauga noi elemente prin metoda Add 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 In Documents

If doc.Words.Count > 1 Then

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

End If

Next

End Sub

care, într-o aplicatie Word, afiseaza numele tuturor documentelor deschise cu mai mult de un cuvânt scris.

Automatizarea actiunilor prin folosirea obiectelor

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

Page 54: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obtinerea unei referinte la un obiect

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, utilizând proprietati si/sau metode, sa se navigheze în sus sau în jos prin ierarhia de obiecte pâna când 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.

Câteva 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 vârful ierarhiei pâna la un obiect, se vor parcurge obiectele de pe toate nivelele, utilizând 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 vârful ierarhiei. Asemenea accesori sunt Documents, Workbooks, Presentations care dau acces imediat la colectia de documente din Word, Excel si PowerPoint. Exista si alte proprietati cu rol de accesori directi: ActiveWindow, ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urmatoarea instructiune închide documentul Word activ:

ActiveDocument.Close

Observatie. Se poate utiliza drept shortcut orice accesor care apare în zona Members of din Object Browser atunci când este selectat <globals> în zona Classes; adica nu trebuie sa se returneze obiectul caruia i se aplica proprietatea sau metoda înaintea utilizarii proprietatii sau metodei, întrucât 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.Item("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

Page 55: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Document.Parent

o returneaza obiectul Application si nu Documents. o Prin functia TypeName (executata eventual în Immediate Window) se poate gasi ce tip de

obiect întoarce proprietatea Parent (functia nu este limitata la aceasta proprietate, vezi VB Help).

Aplicarea proprietatilor si metodelor

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 stânga a ferestrei active utilizând proprietatea Left a obiectului Window, referinta la acest obiect fiind returnata de accesorul direct ActiveWindow.

ActiveDocument.Close

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

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 vârful 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 Words a obiectului Document returneaza o referinta la colectia Words. o Metoda Item a colectiei Words returneaza o referinta la un singur obiect Range. o Proprietatea Text a obiectului Range stabileste textul itemului referit.

Astfel, urmatorul exemplu completeaza primul cuvânt din document

Application.Documents.Item(1).Words.Item(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

Page 56: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Ajutor în 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.

Utilizarea Macro Recorder

Înregistrarea unui macro ofera un ajutor important atunci când 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. Idei î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, utilizând Clipboard, în fereastra de cod.

Object Browser

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 Tools) al proiectului curent.

În boxa Classes se afiseaza numele tuturor obiectelor si tipurilor enumerate (constantele predefinite) în bibliotecile referite.

Nota. 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

Page 57: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

În boxa Members of se afiseaza toate proprietatile, metodele si evenimentele proprii (asociate) clasei selectate în boxa Classes.

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 Count a clasei AddIns, proprietatea returnând o valoare de tip Long. Textul din zona Detail poate fi copiat (prin Clipboard) sau dus prin drag-and-drop într-o fereastra cod.

Legarea timpurie si uneltele de construire a instructiunilor

Atunci când 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 târzie) sau în timpul compilarii (legare timpurie). Codul legat târziu este mai încet decât 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 întâi 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 Worksheets returneaza un tip Object si nu Worksheet (chiar daca se refera la o foaie de calcul).

Programarea obiectelor 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

Page 58: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Identifiers". 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 sfârsitul lucrului cu cealalta aplicatie, se va utiliza metoda Quit pentru a o închide, dupa modelul

appWD.Quit

58

Page 59: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiecte Microsoft Word (I)

Obiectul Application Proprietati (obiectul Application) DisplayScrollBars DisplayStatusBar Height Width WindowState ActiveDocument ActivePrinter ActiveWindow Documents Selection Windows Metode (obiectul Application) QuitObiectul Document Referirea unui Document Deschiderea documentelor Crearea/salvarea documentelor Activarea unui document Tiparirea unui document Închiderea documentelor Accesarea obiectelor din DocumentObiectul 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 Bookmark reprezinta un bookmark (semn de carte, punct de referinta) într-un document etc. Orice element din Word — documente, tabele, paragrafe, câmpuri etc. — poate fi reprezentat printr-un obiect din Visual Basic. Pentru automatizarea lucrului în Word se 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 Custom si sa se selecteze Online Help for Visual Basic.

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

Din editorul VB se ajunge la continutul si indexul VB Help for Word prin succesiunea Help – Contents and Index – Microsoft Word Visual Basic Reference (din fisa Contents) – Shortcut to Microsoft Word Visual Basic Reference.

59

Page 60: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Î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.

Obiectul 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 câteva în continuare.

DisplayScrolllBars

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 = TrueApplication.DisplayScrollBars = False

Pentru barele orizontale sau verticale, individual, se utilizeaza proprietatile DisplayHorizontalScrollBar si DisplayVerticalScrollBar pentru o fereastra sppecificata.

DisplayStatusBar

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.

Height

Read/write. Long.

Înaltimea ferestrei aplicatiei Word. Pentru a vedea dimensiunea maxima admisa se va utiliza proprietatea UsableHeight.

Width

Read/write. Long.

60

Page 61: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Returneaza sau fixeaza latimea obiectului, în puncte.

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

WindowState

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 Activate î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 Tools, se gasesc la obiectul Options.

Utilizând 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 = wdPointsEnd 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.

ActiveDocument

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.

ActivePrinter

Read/write. String.

Returneaza sau stabileste numele imprimantei active. Exemplul urmator alege imprimanta activa:

61

Page 62: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ActivePrinter = "HP LaserJet 4 local on LPT1:"

Se observa utilizarea denumirii din mediul Windows.

ActiveWindow

Read-only.

Returneaza un obiect Window care reprezinta fereastra activa. Daca nu exista nici o fereastra deschisa, apare o eroare.

MsgBox Application.ActiveWindowActiveWindow = "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 (Name).

Documents

Read-only.

Întoarce colectia Documents a tuturor documentelor deschise.

Selection

Read-only.

Întoarce obiectul Selection, 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 Selection.

Windows

Read-only.

Returneaza colectia Windows a tuturor ferestrelor document. Colectia corespunde ferestrelor cu denumirile (si numerele de ordine) listate la meniul Window din Word.

MsgBox Windows.Count

afiseaza numarul ferestrelor deschise în Word (atasate unor documente).

Metode (Application)

Dintre metodele obiectului Application enumeram doar Quit, celelalte sunt sau mai rar utilizate, sau se mai aplica si altor obiecte si vor fi prezentate ulterior.

Quit

62

Page 63: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Apelul procedurii duce la închiderea aplicatiei Word si, optional, salveaza sau ruteaza documentele deschise. Sintaxa:

expression.Quit(SaveChanges, Format, RouteDocument)

unde

expression este o expresie care returneaza un obiect Application.

SaveChanges 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.

OriginalFormat 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.

RouteDocument 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 RoutingSlip).

Î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).

Obiectul 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 (decât acolo unde este absolut necesar).

Returnarea unui obiect 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

Page 64: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

If Documents.Count >= 1 Then MsgBox ActiveDocument.NameElse MsgBox "Nici un document nu este deschis"End If

Deschiderea documentelor

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.

FileName 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.

ConfirmConversions este de tip Variant, optional. Are valoarea True pentru a afisa dialogul Convert File daca fisierul nu este în format Word.

ReadOnly este de tip Variant, optional. Are valoarea True daca documentul se deschide ca read-only.

AddToRecentFiles este de tip Variant, optional. Are valoarea True daca numele fisierului se adauga listei fisierelor recent utilizate (de la baza meniului File).

PasswordDocument este de tip Variant, optional si reprezinta parola necesara la deschiderea documentului.

PasswordTemplate este de tip Variant, optional si reprezinta parola necesara la deschiderea sablonului (template).

Revert este de tip Variant, optional. Controleaza ce se întâmpla daca FileName este numele unui fisier deja deschis: True pentru a neglija orice schimbari nesalvate si redeschiderea documentului; False pentru a activa documentul deschis.

WritePasswordDocument este de tip Variant, optional. Este parola necesara pentru salvarea schimbarilor aduse documentului.

WritePasswordTemplate este de tip Variant, optional. Este parola necesara pentru salvarea modificarilor aduse sablonilui.

Format este de tip Variant, optional. Indica tipul de conversie utilizat la deschiderea documentului. Poate fi o constanta (din tipul enumerat wdOpenFormat) dintre:

wdOpenFormatAuto, wdOpenFormatDocument WdOpenFormatRTF,

64

Page 65: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

,

wdOpenFormatTemplate, wdOpenFormatText, WdOpenFormatUnicodeText.

Valoarea implicita este wdOpenFormatAuto.

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

Î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 PathSeparator (a obiectului Application), care returneaza caracterul separator utilizat de sistemul de fisiere, diferit în DOS/Windows si Macintosh si DefaultFilePath (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" .LookIn = defaultDir .Execute If .FoundFiles.Count = 1 Then Documents.Open FileName:=defaultDir & _ Application.PathSeparator & "test.doc" Else MsgBox "Fisierul test.doc nu este gasit" End IfEnd 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 File) iar metoda Show afiseaza si executa actiunile executate în boxa de dialog Open.

Utilizarea metodei Display (în locul metodei Show) produce doar afisarea dialogului fara nici o alta actiune. Daca utilizatorul apasa butonul OK al boxei, atunci este returnata valoarea -1 si se poate sti numele fisierului selectat în boxa dupa modelul urmator:

65

Page 66: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Set dlg = Dialogs(wdDialogFileOpen)aButton = dlg.DisplayfSelected = dlg.NameIf aButton = -1 Then Documents.Open FileName:=fSelectedEnd If

Observatie. 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 = TrueFor Each aDoc In Documents If InStr(1,aDoc.Name,"cautat.doc",1) Then aDoc.Activate Exit For Else docFound = False End IfNext aDocIf docFound = False Then Documents.Open FileName:="cautat.doc"

Pentru a determina câte documente sunt deschise se utilizeaza proprietatea Count a colectiei Documents:

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

Crearea si salvarea documentelor

Pentru a crea un nou document se utilizeaza metoda Add aplicata colectiei Documents. Metoda returneaza documentul creat ca un obiect Document, astfel încât valoarea returnata poate fi atribuita unei variabile de tip obiect pentru a putea referi direct noul document în program:

Dim myDoc As DocumentSet myDoc = Documents.AddmyDoc.PageSetup.TopMargin = InchesToPoints(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 SaveAs 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

Page 67: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Exemplul urmator construieste o expresie mai complicata, exploatând 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 Save a colectiei Documents:

Documents("vanzari.doc").Save

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

Pentru salvarea tuturor fisierelor deschise se va utiliza metoda Save aplicata colectiei Documents.

Metoda Save are sintaxa dependenta de obiectul caruia i se aplica:

expression.Save

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

expression.Save(NoPrompt, OriginalFormat)

este aplicabila colectiei Documents. Argumentele sunt

expression este orice expresie care returneaza un obiect Documents.

NoPrompt 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.

Activarea unui document

Pentru activarea unui alt document se aplica metoda Activate obiectului Document respectiv. Reamintim ca la crearea unui nou document, acesta ramâne activ. Documentul activat trebuie sa fie deschis (inclus în colectia Documents):

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

daca variabila Doc1 a primit ca valoare un document deschis.

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

expression.Activate

67

Page 68: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

unde expression este orice expresie care returneaza un obiect caruia i se poate aplica metoda.

Tiparirea unui document

Întrucât 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 Tools – Options – 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: PrintComments, PrintHiddenText, PrintDrawingObjects, PrintFieldCodes 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 File din mediul Word). Sintaxa, cu specificarea si explicarea principalelor argumente, este

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

unde

expression este orice expresie care returneaza un obiect Application, Document sau Window. Background este de tip Variant, optional. Are valoarea True daca tiparirea are loc în fundal (macro-ul continua în timpul tiparirii documentului).

Append este de tip Variant, optional. Are valoarea True atunci când, la tiparirea în fisier, documentul este adaugat fisierului specificat în argumentul OutputFileName; are valoarea False pentru rescrierea fisierului OutputFileName.

Range 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.

OutputFileName este de tip Variant, optional. Daca PrintToFile este True, atunci argumentul da numele (eventual cu cale) pentru fisierul unde are loc tiparirea.

From este de tip Variant, optional. Specifica numarul paginii de unde începe tiparirea, daca Range este wdPrintFromTo.

To este de tip Variant, optional. Specifica numarul paginii pâna unde se tipareste, daca Range este wdPrintFromTo.

Item este de tip Variant, optional. Specifica elementul care se tipareste. Poate fi o constanta (de tipul enumerat WdPrintOutItem): wdPrintAutoTextEntries, wdPrintComments, wdPrintDocumentContent, wdPrintKeyAssignments, wdPrintProperties sau wdPrintStyles.

Copies este de tip Variant, optional. Specifica numarul de copii tiparite.

Pages 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

Page 69: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

PageType este de tip Variant, optional. Specifica tipul de pagini tiparite. Poate fi o constanta (de tipul WdPrintOutPages): wdPrintAllPages, wdPrintEvenPagesOnly sau wdPrintOddPagesOnly.

PrintToFile este de tip Variant, optional. Are valoarea True pentru a trimite comenzile de tiparire catre un fisier. Numele fisierului este dat în argumentul OutputFileName.

Collate 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).

FileName este de tip Variant, optional. Numele fisierului (inclusiv calea, daca este în alt folder decât 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 = TrueActiveDocument.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 PageSetup care controleaza atributele paginii pentru document, sectiune etc.

Închiderea documentelor

Pentru închidere se aplica metoda Close 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 aplicând metoda Close pentru întreaga colectie:

Documents.Close

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

expression.Close(SaveChanges, OriginalFormat, RouteDocument)

unde

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

SaveChanges este de tip Variant, optional. Specifica tipul de actiune privind salvarea documentului înainte de închidere. Poate fi o constanta (de tip WdSaveOptions): wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges, cu interpretari evidente.

69

Page 70: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

OriginalFormat este de tip Variant, optional. Specifica formatul documentului la salvare (poate fi o constanta (de tip WdOriginalFormat): wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.

RouteDocument 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 RoutingSlip).

Urmatorul exemplu închide, fara salvare, toate documentele:

Documents.Close SaveChanges:=wdDoNotSaveChanges

Accesarea obiectelor dintr-un document

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): Bookmarks, Characters, CommandBars, Comments, DocumentProperties, Endnotes, Fields, Footnotes, FormFields, Frames, HyperLinks, Indexes, Lists, ListTemplates, PageSetup, Paragraphs, Range, Revisions, Sections, Sentences, Shapes, StoryRanges, Styles, Subdocuments, Tables, TablesOfContents, TablesOfFigures, Template, Variables, Windows, Words.

De exemplu, prin

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

afiseaza un mesaj cu numarul tabelelor existente în documentul activ.

Este evident ca utilizând proprietatile si metodele obiectelor astfel returnate se pot modifica programatic obiectele referite: se pot adauga si formata tabele, câmpuri, 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.

Obiectul 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 sfârsit. Utilizat pentru identificarea unor portiuni din document, obiectul Range este similar obiectului Bookmark, diferenta fiind totusi importanta: un obiect Range exista doar atât timp cât se executa procedura care l-a definit.

Atunci când pozitia de început este identica cu pozitia de sfârsit, 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, corespunzând urmatoarelor constante (din WdStoryType):

70

Page 71: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

WdEndnotesStory wdEvenPagesFooterStory wdEvenPagesHeaderStory

WdFirstPageFooterStory wdFirstPageHeaderStory wdFootnotesStory

WdMainTextStory wdPrimaryFooterStory wdPrimaryHeaderStory

WdTextFrameStory

Tipul episodului pentru un obiect de gen domeniu (Range), selectie (Selection) sau semn de carte (Bookmark) este returnat de proprietatea StoryType. 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 StoryType.

Proprietatile Start, End si StoryType identifica un obiect Range în mod unic. Start si End specifica sau returneaza pozitiile de început si, respectiv, de sfârsit 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 Start si End 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 Start si End se poate modifica dimensiunea domeniului referit.

Obiect Range vs. obiect Selection

În general, este de preferat sa se opereze cu obiecte Range în loc de obiecte Selection, deoarece:

• se pot defini si utiliza mai multe obiecte Range (doar un obiect Selection pe fereastra); • procesarea obiectelor Range nu modifica textul selectat; • procesarea obiectelor Range este mai rapida decât a selectiei.

La înregistrarea unui macro creeaza, de obicei, referinte la obiectul Selection. 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 = TruemyRange.InsertParagraphAfter

Este interesant de comparat acest cod cu secventa obtinuta la înregistrarea unui macro care efectueaza aceeasi sarcina.

Returnarea unui obiect Range prin metoda 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

Page 72: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Start este de tip Long, optional. Specifica punctul de început (în pozitii de caracter).

End este de tip Long, optional. Specifica punctul de sfârsit (î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 sfârsit, se considera, implicit, începutul si sfârsitul 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 Set prin care se atribuie obiectul returnat unei variabile obiect:

Dim myRange As RangeSet myRange = ActiveDocument.RangemyRange.InsertAfter 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 cuvântului "Final" dupa ultimul caracter din document.

În exemplul urmator se observa utilizarea unui obiect Range doar ca punct de referinta în document (asemenea unui Bookmark):

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

Pozitiile de start si end pot fi specificate direct sau prin intermediul proprietatilor Start si End ale altor obiecte cum ar fi Selection, Bookmark 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 Select 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 obiect Range prin proprietatea Range

Proprietatea Range este disponibila pentru multiple obiecte — de exemplu Paragraph, Bookmark, Endnote, Cell — 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

Page 73: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ActiveDocument.Tables(1).Rows(1).RangeActiveDocument.Bookmarks(1).Range

Nu trebuie uitata structura With…End With pentru procesari multiple ale aceluiasi obiect Range.

Modificarea unei portiuni a unui document

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:

expresiaobiect returnat

Words(index) Range

Characters(index) Range

Sentences(index) Range

Paragraphs(index) Paragraph

Sections(index) Section

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).RangeSections(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 cuvânt din document în majuscule. De remarcat ca proprietatea Case este aplicata obiectului Range returnat de ActiveDocument.Words(1).

În formarea obiectelor Range sunt importante proprietatile Start si End care dau începutul si sfârsitul.

Proprietatile elementelor documentului, specificate în tabelul anterior în prima coloana, sunt admise pentru obiectele Document, Selection si Range.

Lucrul cu textul dintr-un obiect Range

Accesul la continutul unui obiect Range este realizat prin proprietatea Text. Proprietatea Text returneaza textul neformatat (plain text) al domeniului referit. Atunci când se seteaza aceasta proprietate, textul domeniului referit este înlocuit de valoarea atribuita proprietatii.

73

Page 74: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

returneaza sau modifica primul cuvânt 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 Selection sau Range.

Text 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.

Inserarea 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 sfârsitul de domeniu (Range sau Selection) 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 = ActiveDocumentSet myRange = Doc.Range( _ Start:=Doc.Paragraphs(1).Range.End - 1, _ End:=Doc.Paragraphs(1).Range.End - 1)myRange.InsertAfter " sfarsit de paragraf."

Un domeniu poate fi redus la punctul de început sau de sfârsit (proprietatile Start si End devin egale cu pozitia de caracter respectiva) prin metoda Collapse. Sintaxa este

expression.Collapse(Direction)

unde

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

Direction este de tip Variant, optional si indica directia în care are loc implozia domeniului. Poate fi o constanta (de tip WdCollapseDirection) dintre: wdCollapseEnd sau wdCollapseStart. Valoarea implicita este wdCollapseStart.

Utilizarea metodei cu wdCollapseEnd, atunci când 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

Page 75: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• proprietatea Font pentru formatarea caracterelor • proprietatea ParagraphFormat pentru formatarea paragrafelor.

Proprietatea Font returneaza un obiect Font care dispune de toate metodele si proprietatile necesare pentru aplicarea formatarilor admise pentru caractere în Word.

Proprietatea ParagraphFormat returneaza un obiect ParagraphFormat care permite efectuarea tuturor formatarilor admise pentru un paragraf în Word.

Deoarece ambele obiecte, Font si ParagraphFormat 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 = TrueEnd WithWith ActiveDocument.Paragraphs(1).Range.ParagraphFormat .LeftIndent = InchesToPoints(0.5) .Space1End 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 stânga cu 1.5" si spatierea la un rând.

Redefinirea unui obiect Range

Pentru modificarea limitelor unui obiect Range se pot utiliza, în mod uzual, proprietatile Start si End:

myRange.End = myRange.End + 10

Metodele MoveStart si MoveEnd 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 Start sau End, sau 0 daca operatiunea nu s-a putut realiza. Sintaxa este

expression.MoveStart(Unit, Count)

expression.MoveEnd(Unit, Count)

unde

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

Unit 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 Selection poate fi si wdLine. Valoarea implicita este wdCharacter.

Count 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 când operatiunea produce inversarea fizica a pozitiilor de Start si End, cele doua pozitii devin egale (Range sufera un colaps). Valoarea implicita este 1.

75

Page 76: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

În exemplul urmator

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

se extinde domeniul încât sa cuprinda si urmatorul paragraf.

Observatie. Exista si metode mai fine cum ar fi MoveUntil, MoveWhile, MoveStartUntil, MoveEndWhile etc. Se va vedea intrarea respectiva din Word VB - Help.

Metoda SetRange 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 Selection.

Start este de tip Long, pozitia noua de start.

End este de tip Long, pozitia noua de sfârsit (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 Next. 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.

Atribuirea obiectelor Range

O prima procedura este cea, exemplificata mai sus, în care se utilizeaza instructiunea Set 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

Page 77: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

Page 78: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiecte Microsoft Word (II)

Obiectul Selection Deplasarea si extinderea selectiei

Metoda GoToMetodele GoToNext, GoToPrevious

Obiecte accesibile din Selection Selection – proprietati si metode uzuale

Proprietatea TextFormatarea textului selectatReturnarea obiectului RangeProprietatea InformationDeterminarea tipului de selectie

Obiectele Find si Replacement Find

ClearFormattingExecuteSelection.FindRange.Find

ReplacementObiectele Table, Column, Row si Cell Colectia Tables

Obiectul Table Colectia Columns

Obiectul Column Colectia Rows, obiectul Row Colectia Cells

Obiectul Cell Exemple cu obiectele Table, Column, Row si Cell

Obiectul Selection

Atunci când 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 când se doreste ca, programatic, sa se raspunda unei selectii efectuate de utilizator, sau sa se modifice selectia etc., se poate opera cu obiectul Selection.

Exista un singur obiect Selection pe ochi de fereastra si doar un obiect este activ la un moment dat (corespunzând 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 Selection este returnat de proprietatea Selection a obiectelor Application, Window sau Pane. Utilizata cu Application, proprietatea returneaza obiectul Selection care se refera la selectia activa. Prin urmare

Selection.InsertAfter Text:=" Text adaugat dupa selectie"

utilizeaza proprietatea Selection 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

Page 79: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Windows("Document2").Selection.Paragraphs(1).SpaceBefore = InchesToPoints(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.InsertAfter Text:="Capitolul I"

End With

În general, metodele si proprietatile uzuale ale obiectului Selection 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 extinderea selectiei

Deoarece nu exista decât o selectie pe ochi de fereastra, selectarea unei noi zone muta implicit si obiectul Selection. Aceasta selectare se efectueaza aplicând metoda Select unui element din document:

ActiveDocument.Words(1).Select

permite mutarea selectiei la primul cuvânt, astfel încât 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 Selection).

Move(Unit, Count) – reduce selectia la punctul de sfârsit (Count > 0) sau de început (Count < 0) si deplaseaza apoi punctul de insertie astfel obtinut Count unitati (in sensul pozitiv sau negativ).

MoveEnd, MoveStart – similare descrierilor de la obiectul Range

MoveLeft(Unit,Count,Extend) – unde Unit poate fi wdCell, wdCharacter, wdWord sau wdSentence, Count este numarul de unitati, Extend arata tipul actiunii: wdMove pentru colaps la stânga si mutarea selectiei, wdExtend pentru extensie spre stânga.

MoveRight(Unit,Count,Extend) – este similara metodei MoveLeft, dar actiunea este spre dreapta.

MoveDown(Unit,Count,Extend), MoveUp(Unit,Count,Extend) – cu actiune similara metodelor precedente, dar directia de actiune este sus-jos. Unit poate fi wdLine, wdParagraph, wdWindow sau wdScreen. Extend 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

Page 80: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

extinde selectia prin mutarea pozitiei finale la sfârsitul paragrafului.

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

extinde selectia activa cu un cuvânt spre dreapta.

Utilizarea metodelor GoToNext, GoToPrevious sau GoTo permite mutarea selectiei prin alegerea tipului de element tinta din document, a directiei etc.

Metoda GoTo

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.GoTo(What, Which, Count, Name)

unde

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

What este de tip Variant, optional si precizeaza tipul elementului unde se muta punctul de insertie (selectia). Poate fi una dintre constantele (de tipul enumerat WdGoToItem):

wdGoToBookmark wdGoToComment wdGoToEndnote

wdGoToEquation wdGoToField wdGoToFootnote

wdGoToGrammaticalError wdGoToGraphic wdGoToHeading

wdGoToLine wdGoToObject wdGoToPage

wdGoToPercent wdGoToProofreadingError wdGoToSection

wdGoToSpellingError wdGoToTable

Which este de tip Variant, optiomal si specifica modul de mutare a selectiei. Poate fi una dintre constantele (de tip WdGoToDirection): wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious sau wdGoToRelative.

Count este de tip Variant, optional si indica numarul utilizat la determinarea elementului (în functie de tipul de actiune dat de Which). Este doar pozitiv si pentru gasirea unui element anterior se va utiliza wdGoToPrevious cu un Count > 0.

Name este Variant, optional si da numele elementului tinta, daca What este wdGoToBookmark, wdGoToComment, wdGoToField sau wdGoToObject.

Exemple:

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

80

Page 81: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

Metodele GoToNext, GoToPrevious

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

GoToNext(What)

GoToPrevious(What)

unde

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

Metodele returneaza un obiect Range (vezi discutia de la GoTo).

Obiecte accesibile din Selection

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, InlineShapes, 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.LeftIndent = InchesToPoints(0.5)Selection.Words(1).Italic = TrueMsgBox Selection.Footnotes(1).Range.Text

Pentru parcurgerea tuturor obiectelor dintr-o colectie returnata se va folosi structuraFor Each…Next:

For Each aBook In Selection.BookmarksMsgBox aBook.Name

Next aBook

Proprietati si metode uzuale ale obiectului Selection

Proprietatea Text

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

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

Se va utiliza metoda InsertBefore sau InsertAfter pentru inserarea unui text înainte sau dupa selectie (cu extinderea corespunzatoare a selectiei).

81

Page 82: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Formatarea textului 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 = 14End WithSelection.ParagraphFormat.LeftIndent = InchesToPoints(0.5)

Returnarea obiectului 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 când 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 Selection.

Type este de tip Long si precizeaza tipul informatiei care se returneaza. Poate fi una dintre cele 35 de constante de tip WdInformation, dintre care mentionam (doar pentru a exemplifica tipuri de informatii obtinute):

o wdActiveEndAdjustedPageNumber – numarul paginii care contine sfârsitul 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 sfârsitul 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 stânga a selectiei la latura stânga 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 wdInHeaderFooter – întoarce True daca selectia/domeniul este în ochiul de fereastra antet sau footer, sau în header sau footer (în page layout view).

o wdWithInTable – î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

Page 83: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Exemplul urmator afiseaza, daca selectia este într-un tabel, numarul de coloane si de linii ale tabelului:

If Selection.Information(wdWithInTable) = True ThenMsgBox "Coloane = " & Selection.Information(wdMaximumNumberOfColumns) _

& vbCR & "Linii = " & Selection.Information(wdMaximumNumberOfRows)End If

Determinarea tipului de selectie (text sau punct de insertie)

Prin proprietatea Type se poate obtine informatia privind tipul selectiei. Valoarea returnata, Long, este una dintre constantele tipului enumerat WdSelectionType:

wdNoSelection, wdSelectionBlock, wdSelectionColumn,

wdSelectionFrame, wdSelectionInlineShape, wdSelectionIP,

wdSelectionNormal, wdSelectionRow, wdSelectionShape

Dintre aceste constante, wdSelectionNormal reprezinta selectia uzuala a unei portiuni de text, wdSelectionBlock reprezinta selectia sub forma de bloc dreptunghiular, wdSelectionIP este selectia redusa la punctul de insertie.

Exemplul urmator selecteaza paragraful care contine punctul de insertie, daca selectia este redusa la punctul de insertie:

If Selection.Type = wdSelectionIP Then Selection.Paragraphs(1).Range.SelectEnd If

Obiectele Find 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 Find (pentru gasirea textului specificat) si Replacement (pentru înlocuire).

Obiectul Find este permis fie din Selection, 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 Find si permite toate actiunile disponibile în boxa de dialog Find and Replace (meniul Edit din Word).

Schema generala pentru realizarea unei cautari urmata, sau nu, de o înlocuire este

o stabilirea parametrilor cautarii/înlocuirii, prin proprietatile obiectului Find/ Replacement. In proprietatea Text se precizeaza textul cautat sau înlocuitor.

o executarea cautarii/înlocuirii prin aplicarea metodei Execute.

Find

Dintre proprietatile obiectului Find mentionam

• Font, returneaza un obiect Font pentru care se pot stabili atributele cautate. • Format, este setat pe True daca în cautare se considera formatul textului. Read-write, Boolean.

83

Page 84: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• Forward, directia cautarii: True pentru înainte, False pentru înapoi. Read/wtite, Boolean. • Found este True daca s-a gasit o potrivire. Read, Boolean. • MatchCase este True pentru o cautare care diferentiaza majusculele de minuscule. Read-write,

Boolean. • MatchWildcards este True daca textul cautat contine caractere sablon de cautare. Read/write,

Boolean. • ParagraphFormat, returneaza un obiect ParagraphFormat prin care se pot stabili atribute de paragraf

cautate. • Style permite stabilirea stilului cautat (predefinit sau utilizator). Pentru lista constantelor ce denumesc

stilurile predefinite se va vedea Word VB Help – Style Property. • Text, contine textul cautat. Read-write, String. • Wrap precizeaza modul de continuare în cazul atingerii sfârsitului (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 Find are doua metode:

o ClearFormatting pentru înlaturarea oricarei formatari a textului cautat, necesara pentru a initia o noua cautare de formate;

o Execute pentru a efectua cautarea pe baza atributelor fixate.

ClearFormatting

Anuleaza orice formatare specificata pentru o operatiune de cautare sau înlocuire. Corespunde butonului No Formatting din dialogul Find and Replace (meniul Edit).

expression.ClearFormatting

unde

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

Execute

Executa operatiunea Find 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 Find.

expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace)

unde

expression este o expresie care returneaza un obiect Find.

FindText 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.

MatchCase este de tip Variant, optional. True sau False dupa cum în cautare are importanta capitalizarea caracterelor.

MatchWholeWord este de tip Variant, optional. Este True daca în cautare se vor potrivi doar cuvinte întregi.

84

Page 85: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

MatchWildcards este de tip Variant, optional. True daca textul cautat utilizeaza sabloane de cautare (wildcards).

MatchSoundsLike este de tip Variant, optional. True daca operatiunea de cautare accepta si cuvinte care "suna" la fel cu textul cautat.

MatchAllWordForms este de tip Variant, optional. True daca operatiunea de cautare accepta ca succes toate formele textului cautat.

Forward este de tip Variant, optional. True pentru o cautare înainte (spre sfârsitul documentului).

Wrap este de tip Variant, optional. Controleaza continuarea operatiunii la epuizarea domeniului cercetat. Valorile posibile sunt date la proprietatea Wrap: wdFindContinue, wdFindStop sau wdFindAsk.

Format este de tip Variant, optional. True daca în cautare este specificata o formatare (de caracter sau paragraf).

ReplaceWith 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.

Replace este de tip Variant, optional. Specifica numarul de înlocuiri. Poate fi o constanta (de tip WdReplace): wdReplaceAll, wdReplaceNone sau wdReplaceOne.

Selection.Find

Returnarea unui obiect Find din obiectul Selection produce schimbarea selectiei la îndeplinirea criteriilor de cautare. Textul care corespunde proprietatilor cautarii devine noua selectie. Urmatorul exemplu selecteaza urmatoarea aparitie a cuvântului "Hello", cautarea oprindu-se la atingerea sfârsitului documentului:

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

End With

Acelasi efect se putea obtine folosind argumentele metodei Execute:

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

Range.Find

Utilizarea proprietatii Find 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 If .Found = True Then .Parent.Bold = TrueEnd With

85

Page 86: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

De remarcat ca proprietatea Content returneaza obiectul Range care contine episodul principal al documentului (textul principal). Codul din exemplu executa o cautare a primei aparitii a cuvântului "blue" în documentul activ. Daca operatiunea se termina cu succes, atunci obiectul Range este redefinit la cuvântul gasit, astfel încât prin .Parent se face referinta la obiectul Range redefinit si cuvântul "blue" este trecut în stilul bold. Acelasi efect se obtinea prin

Set myRange = ActiveDocument.ContentmyRange.Find.Execute FindText:="blue", Forward:=TrueIf myRamge.Find.Found = True Then myRange.Bold = True

atributele cautarii fiind definite prin argumentele metodei Execute.

Obiectul Replacement

Referinta la obiectul Replacement se obtine prin proprietatea Replacement a obiectului Find:

expression.Find.Replacement

Obiectul Replacement reprezinta atributele textului nou (înlocuitor) într-o operatiune de cautare cu înlocuire.

Dintre proprietatile obiectului Replacement amintim:

• Font, returneaza un obiect Font prin care se pot stabili atributele caracterelor noului text. • ParagraphFormat, returneaza un obiect ParagraphFormat prin care se pot stabili atribute de paragraf

pentru noul text. • Style permite stabilirea stilului pentru textul nou (predefinit sau utilizator). Pentru lista constantelor ce

denumesc stilurile predefinite se va vedea Word VB Help – Style Property. • Text, contine textul înlocuitor (nou). Read-write, String.

Obiectul Replacement are doar metoda ClearFormatting, 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 Find.

Executarea unei operatiuni de înlocuire necesita, de obicei, precizarea argumentului Replace al metodei Execute (pentru Find):

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

executa o cautare a cuvântului "hi", neformatat, si înlocuirea tuturor aparitiilor cu cuvântul "hello", de asemenea neformatat. Cautarea si înlocuirea are loc în tot documentul, indiferent de unde se începe. Selectia se modifica la fiecare întâlnire a cuvântului "hi", deoarece se pleaca din obiectul Selection.

With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False

86

Page 87: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

End With .Execute FindText:="", ReplaceWith:="", Format:=True, Replace:=wdReplaceAllEnd With

În acest exemplu se utilizeaza atât pentru cautare, cât 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 FindText, ReplaceWith, Format. Selectia nu se modifica, deoarece s-a plecat din obiectul Range (returnat de proprietatea Content).

Obiectele Table, Column, Row si Cell

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

• Table, care refera un tabel din document, • Column, care refera o coloana dintr-un tabel, • Row, care refera o linie dintr-un tabel si • Cell, 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.

Colectia Tables

Reprezinta multimea tuturor tabelelor dintr-o selectie, domeniu sau document. Serveste pentru returnarea unui tabel:

expression.Tables(index)

sau pentru adaugarea, programatica, a unui nou tabel la colectie utilizând metoda Add:

expression.Add(Range, NumRows, NumColumns)

unde

expression este o expresie care returneaza un obiect Tables.

Range 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.

NumRows, de tip Long, este numarul initial de linii ale tabelului.

NumColumns, de tip Long, este numarul initial de coloane ale tabelului.

Obiectul Table

Este returnat prin numarul de ordine dintr-o colectie Tables.

87

Page 88: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proprietatile obiectului se refera la formatarea globala a tabelului sau la obiectele componente ale unui tabel. Din prima categorie fac parte:

o AutoFormatType, 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 când wdTableFormatProfessional arata selectarea formatului automat Professional. Vezi si metoda AutoFormat.

o Shading returneaza un obiect Shading prin care se stabilesc atributele de umbrire. o Uniform, 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 Borders, colectia de chenare a tabelului, o Columns, colectia de coloane, o Rows, colectia de linii.

Metodele obiectului Table permit atât operatiuni asupra întregului tabel (autoformat, stergere, selectare, sortare, divizare etc.), cât si accesul la celulele tabelului. Mentionam:

o Cell(Row,Column) returneaza un obiect Cell 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 Select realizeaza selectarea tabelului, astfel încât se poate opera apoi cu proprietatea

Selection. o Sort(ExcludeHeader, FieldNumber, SortFieldType, SortOrder, FieldNumber2, SortFieldType2,

SortOrder2, FieldNumber3, SortFieldType3, SortOrder3, CaseSensitive, LanguageID) produce sortarea tabelului. Datorita sintaxei complexe, argumentele vor fi studiate în Word VB Help.

o Split(BeforeRow) duce la divizarea tabelului înainte de linia indicata în BeforeRow (de tip Variant, poate fi un numar de linie sau un obiect Row).

Colectia Columns

Reprezinta colectia coloanelor unui tabel si este returnata prin proprietatea Columns a unui obiect Table.

Dintre proprietati enumeram

o Borders, returneaza colectia de chenare, o Shading, returneaza un obiect Shading prin care se stabilesc atributele de umbrire, o Width returneaza sau stabileste latimea coloanelor, în puncte. Read/write, de tip Long. o First 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 Add(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 AutoFit care ajusteaza latimea coloanei, daca este posibil, pentru a cuprinde textul interior. o DistributeWidth care produce o redistribuire a latimilor încât toate coloanele sa fie egale. o SetWidth(ColumnWidth, RulerStyle) care stabileste latimea coloanelor: ColumnWidth, de tip

Single, este latimea în puncte; RulerStyle, de tip Long, controleaza modul în care este ajustata latimea. RulerStyle poate fi una dintre constantele WdRulerStyle: wdAdjustFirstColumn –

88

Page 89: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 (aplicând metoda obiectelor respective si nu colectiei).

Obiectul Column

Reprezinta o singura coloana dintr-un tabel. Este referita ca element al colectiei Columns:

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

Dintre proprietatile obiectului mentionam:

o Borders, Shading, Width sunt similare celor enumerate la colectia Columns. o Cells returneaza colectia de celule din coloana referita. o Index, read only, Long, returneaza numarul de ordine al coloanei în colectia Columns. o IsFirst, IsLast sunt True daca este referita prima, respectiv ultima coloana din colectie. o Next, Previous returneaza urmatorul element, respectiv precedentul element din colectia

Columns.

Metodele obiectului Column sunt

o AutoFit, Delete, Select, SetWidth cu explicatii evidente sau similare metodelor sinonime prezentate anterior.

o Sort(ExcludeHeader, SortFieldType, SortOrder, CaseSensitive, LanguageID) care ordoneaza celulele coloanei. Argumentele sunt

o ExcludeHeader, optionala, este True daca se omite din ordonare prima linie. o SortFieldType, optional, Variant, arata tipul de sortare – poate fi una dintre constantele

WdSortFieldType: wdSortFieldAlphanumeric (valoarea implicita), wdSortFieldDate sau wdSortFieldNumeric.

o SortOrder, optional, Variant, specifica ordinea. Poate fi o constanta de tip WdSortOrder: wdSortOrderAscending (implicita) sau wdSortOrderDescending.

o CaseSensitive, optional, Variant, este True daca se ia în considerare capitalizarea literelor. Implicit este False.

o LanguageID, optional, Variant, specifica limbajul de sortare. Poate fi una dintre constantele WdLanguageID (vezi WdLanguageID Property în Word VB Help).

Colectia Rows, Obiectul Row

Reprezinta colectia liniilor dintr-un tabel si, respectiv, o linie a tabelului. Utilizarea acestor obiecte este similara operarii cu obiectele Columns si Column. Exista o serie de proprietati specifice, linie antet, împartirea între pagini etc, dar corespund direct atributelor din Word si au semnificatii evidente.

Colectia Cells

Reprezinta celulele dintr-o coloana, linie, selectie sau domeniu.

Pe lânga proprietatile similare celor prezentate la coloane (Borders, Shading, Width, Height etc.) este utila proprietatea

89

Page 90: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o VerticalAlignment care returneaza sau stabileste alinierea verticala a textului în celule. Poate fi o constanta de tip WdVerticalAlignment: wdAlignVerticalBottom, wdAlignVerticalCenter, wdAlignVerticalJustify sau wdAlignVerticalTop. Read/write Long.

Metodele mai des întrebuintate sunt

o Add(BeforeCell) care adauga o noua celula înaintea celulei referite de BeforeCell (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 Split(NumRows, NumColumns, MergeBeforeSplit) care produce divizarea celuleor din colectie potrivit valorilor argumentelor:

o NumRows, NumColumns reprezinta numarul liniilor, coloanelor dupa divizare. Optionale, de tip Variant.

o MergeBeforeSplit este de tip Variant, optional si are valoarea True daca se doreste fuzionarea celulelor înainte de divizare.

o SetHeight(RowHeight, HeightRule) stabileste înaltimea pentru toata linia unei celule implicate. o RowHeight este Single si da înaltimea în puncte. o HeightRule 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 SetWidth(ColumnWidth, RulerStyle), cu explicatia de la Columns. o DistributeHeight, DistributeWidth care distribuie înaltimea, respectiv latimea, în mod egal.

Obiectul Cell

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 Column, ColumnIndex returneaza ca obiect sau ca index coloana celulei. o Row, RowIndex returneaza ca obiect sau ca index linia celulei.

Proprietati navigare în colectia Cells sunt

o Next, Previous cu semnificatia imediata.

Proprietatile de aspect si dimensiuni sunt cele prezentate la Columns/Column.

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 AutoSum insereaza un câmp formula care calculeaza suma valorilor din tabel situate deasupra sau la stânga celulei.

o Delete(ShiftCells) elimina celula referita, ShiftCells arata cum are loc actiunea. ShiftCells 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

Page 91: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o Formula(Formula, NumFormat) insereaza în celula o formula specificata si formateaza rezultatul. Argumentele

o Formula este sirul care contine o formula admisa în Word De exemplu "=SUM(ABOVE)". Daca mai sus sau la stânga celulei sunt valori numerice, formula este optionala si se completeaza potrivit alegerilor implicite Word.

o NumFormat 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 Select produce selectarea celulei, deci se poate apela apoi proprietatea globala Selection. o SetHeight, SetWidth stabilesc înaltimea si latimea celulei potrivit descrierii de la Cells. o Split(NumRows, NumColumns) divizeaza celula în numarul indicat de linii si coloane. Valorile

neprecizate sunt considerate 1.

Exemple cu obiecte Table, Column, Row, Cell

Subiectul este foarte amplu si pentru mai multe exemple se vor studia subiectele corespunzatoare din Word Visual Basic Help.

If Selection.Tables.Count >=1 Then Selection.Tables(1).ConvertToText Separator:=wdSeparateByTabsEnd If

converteste în text primul tabel din selectie, daca selectia contine tabele, separând 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 = 1For Each celula In ActiveDocument.Tables(1).Range.Cells celula.Range.InsertBefore Text:="Celula " & i i = i+1Next 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

Page 92: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiecte Microsoft Word (III)

Utilizarea obiectului HeaderFooterColectia Styles Obiectul StyleColectia CommandBarsColectia DialogsCâmpuri – adaugare, editareVerificarea unui obiectModificarea comenzilor WordLucrul cu evenimente Evenimente pentru Document Evenimente pentru Application Evenimente pentru ActiveXAuto MacroAutomatizarea 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 (decât 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.

Utilizarea Obiectului HeaderFooter

Obiectul HeaderFooter poate sa reprezinte fie un antet, fie un picior de pagina. Obiectul HeaderFooter este un membru al colectiei HeaderFooters, care este accesibila din obiectul Section. 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 Headers(index) sau Footers(index), ale obiectului Section, pentru a returna un obiect individual HeaderFooter, unde index este o constanta din tipul enumerat WdHeaderFooterIndex: wdHeaderFooterEvenPages, wdHeaderFooterFirstPage sau wdHeaderFooterPrimary. Este însa evident, dupa denumiri, ca Headers se refera la anteturi iar Footers 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" .InsertAfter Text:=vbTab .InsertAfter Text:=vbTab .Collapse Direction:=wdCollapseStart .Fields.Add Range:=oRange, Type:=wdFieldAuthorEnd With

Se observa definirea unui Range pentru a referi continutul piciorului de pagina, stergerea vechiului continut, adaugarea unui câmp cu numele fisierului (în Text 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 câmp cu numele autorului (din informatia adiacenta documentului).

92

Page 93: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Un obiect HeaderFooter poate fi returnat si prin proprietatea HeaderFooter a obiectului Selection, cu mentiunea ca selectia trebuie sa fie într-un antet sau picior de pagina. Aceasta conditie se realizeaza, de exemplu, prin utilizarea proprietatii View, aplicata ferestrei active, care returneaza un obiect View.

Proprietatea Type a obiectului View permite returnarea/stabilirea tipului de viziune (constante WdViewType, read/write, Long): wdMasterView, wdNormalView, wdOnlineView, wdOutlineView, wdPageView sau wdPrintPreview. În modul page layout (wdPageView), proprietatea SeekView returneaza sau stabileste care element din document este afisat (constante WdSeekView, 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 = wdSeekCurrentPageFooterEnd WithSelection.HeaderFooter.PageNumbers.Add _ PageNumberAlignment:=wdAlignPageNumberCenter

Exemplul mai arata si modul de inserare a numerelor de pagina: prin proprietatea PageNumbers se returneaza colectia câmpurilor cu numerele de pagina incluse în respectivul antet sau picior de pagina. Proprietatea Add a colectiei adauga un nou câmp numar de pagina (în mod uzual singurul element al colectiei), referit printr-un obiect PageNumber pentru care se pot stabili o serie de atribute, dupa cum altele (reînceperea numerotarii, tipul de numerotare) se stabilesc la nivel de colectie.

În sfârsit, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi si picioare de pagina existente, se stabilesc din proprietatile obiectului PageSetup, care reprezinta comanda uzuala Page Setup (Word – meniul File).

Se utilizeaza proprietatea DifferentFirstPageHeaderFooter a obiectului PageSetup pentru a specifica o prima pagina diferita, proprietatea OddAndEvenPagesHeaderFooter pentru anteturi/picioare de pagina diferite pentru pagini pare/impare. Daca proprietatea OddAndEvenPagesHeaderFooter este True, atunci se returneaza antetul/piciorul paginii impare prin wdHeaderFooterPrimary si antetul/piciorul paginii pare prin wdHeaderFooterEvenPages.

Colectia Styles

Accesibila din obiectul Document, prin proprietatea Styles, colectia Styles reprezinta toate stilurile din documentul respectiv. Identificarea unui stil particular se efectueaza uzual prin

expression.Styles(index)

unde

expression returneaza un obiect Document

index este nume de stil (definit de utilizator), constanta WdBuiltinStyle (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 Add, având sintaxa

93

Page 94: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

expression.Add(Name, Type)

unde

expression este o expresie care returneaza un obiect Styles.

Name este String si reprezinta numele noului stil.

Type este Variant, optional si stabileste tipul stilului. Poate fi una dintre constantele WdStyleType: wdStyleTypeParagraph sau wdStyleTypeCharacter.

Obiectul Style

Reprezinta un singur stil predefinit sau definit de utilizator. Obiectul Style include atributele stilului ca proprietati, dintre care enumeram:

o Font da acces la obiectul Font care permite formatarea caracterelor o ParagraphFormat da acces catre formatarea paragrafului o NextParagraphStyle 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.OpenAsDocumentWith aDoc .Styles(wdStyleHeading1).Font.Name = "Arial" .Close SaveChanges:=wdSaveChangesEnd 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 Font a stilului "Heading 1", dupa care se închide template-ul.

Colectia CommandBars

Ansamblul meniurilor si barelor de unelte sunt reprezentate de colectia CommandBars. 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 CustomizationContext 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 Double Underline la bara de unelte Formatting:

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

94

Page 95: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru o discutie mai ampla se va citi capitolul dedicat meniurilor si barelor de unelte.

Colectia Dialogs

Dialogurile mediului Word (cum ar fi Open, Save 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 WdWordDialog, 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 WdWordDialog, 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 Type, proprietatea care returneaza tipul boxei built-in. Poate fi una dintre constantele WdWordDialog. Read-only, Long.

o DefaultTab, proprietatea care returneaza sau stabileste fisa activa la afisarea dialogului. Poate fi o constanta de tip WdWordDialogTab. Read/write, Long.

o Display, metoda care afiseaza dialogul, fara a transmite actiunile efectuate de utilizator asupra dialogului.

o Show, metoda care afiseaza dialogul, actiunile utilizator fiind transmise sau executate. o Execute, metoda care aplica configurarea curenta a optiunilor dintr-un dialog.

Adaugarea si editarea câmpurilor dintr-un document

Se pot adauga câmpuri la un document prin aplicarea metodei Add colectiei Fields.

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

unde

expression este o expresie care returneaza un obiect Fields.

Range este o expresie care returneaza un Range. Este domeniul unde se adauga câmpul. Daca domeniul nu este redus la punctul de insertie, câmpul înlocuieste domeniul.

Type este de tip Variant, optional. Stabileste câmpul care se insereaza. Poate fi o constanta de tip WdFieldType (vezi Help).

Text este de tip Variant, optional. Text aditional necesar specificarii câmpului (de exemplu informatii de gen switch).

PreserveFormatting este de tip Variant, optional. Are valoarea True pentru a pastra formatarea câmpului si la actualizari.

95

Page 96: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Dintre proprietatile obiectului Field, membru al colectiei Fields, mentionam

o Result, care returneaza un obiect Range reprezentând rezultatul câmpului. o Code, care returneaza un obiect Range reprezentând codul câmpului. o Next, care returneaza urmatorul câmp în colectie. o Previous, care returneaza câmpul precedent din colectie.

Dintre metode amintim

o DoClick, echivalent cu actionarea câmpului de catre mouse. o Update, care produce actualizarea rezultatului (recalcularea).

Exemplul urmator schimba codul primului câmp din selectie, actualizeaza câmpul si afiseaza rezultatul:

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

Observatie. Pentru alte obiecte, cum ar fi Shapes, care reprezinta obiectele dintr-un strat de desen (drawing layer), se vor vedea capitolele dedicate obiectelor comune tuturor aplicatiilor Office.

Verificarea daca un obiect este valid

În aceasta sectiune se discuta câteva 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 TypeName pentru a determina un tip de obiect. Sintaxa este

TypeName(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 Selection.NextField returneaza un obiect Field (informatie utila în prelucrarea formularelor):

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

O forma echivalenta este

Set myField = Selection.NextFieldIf TypeName(myField) = "Field" Then StatusBar = "Mai exista un câmp"

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

If Not (myField Is Nothing) Then myField.Update

96

Page 97: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Este disponibila proprietatea globala IsObjectValid 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.IsObjectValid(Object)

unde

expression este o expresie care returneaza un obiect Application, optionala.

Object este de tip Object, 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 Integeri = 1Do While IsObjectValid(ActiveDocument.Paragraphs(i).Next) i = i + 1LoopMsgBox Str(i) & " paragrafe = (?) " & Str(ActiveDocument.Paragraphs.Count)

Modificarea comenzilor Word

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 Tools o Macro o selecteaza Word commands în lista Macro in o în boxa Macro name se afiseaza toate comenzile, denumirile având ca prima aprte numele

meniului utilizat implicit pentru comanda (de genul FileOpen).

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 FileSave, aceasta este executata de catre Word atunci când se da comanda Save (meniul File), sau se click-eaza butonul Save (de pe bara Standard) sau se tasteaza combinatia directa asociata cu FileSave.

Pentru scrierea unei proceduri de acest gen se poate urma

o Tools => Macro => Macros => Word commands în Macro in o selectarea comenzii care se înlocuieste o selectarea locului de memorare în boxa Macro in. De exemplu Normal.dot pentru valabilitate

generala (obtinerea unui macro global). o Create

Editorul Visual Basic deschide un modul care contine un sablon al noii proceduri, cum ar fi

Sub FileSaveHtml()'' FileSaveHtml Macro

97

Page 98: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

' 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 având acelasi nume cu comanda (de exemplu FileSave) si care contine o procedura denumita "Main".

Lucrul cu evenimente

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 atât ca rezultat al actiunii utilizatorului sau prin program, cât 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.

Evenimente ale obiectului Document

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

o Close se produce atunci când se închide documentul. Daca procedura de raspuns este memorata într-un template, se executa atât la închiderea oricarui document bazat pe sablon, cât si la închiderea sablonului daca este deschis pentru editare.

o New 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 New, memorata în document, nu se va executa niciodata.

o Open se produce la deschiderea documentului. Vezi si observatia legata de sablon de la Close.

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 când documentul este deschis:

Private Sub Document_Open() Application.WindowState = wdWindowStateMaximizeEnd Sub

98

Page 99: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 amândoua.

Evenimente ale obiectului Application

Evenimentele aplicatiei apar atunci când utilizatorul paraseste aplicatia sau atunci când 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 Class Module din meniul Insert al mediului VBE.

Observatie. 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 Object a modulului clasa si se pot scrie procedurile eveniment pentru noul obiect (selectabile din lista Procedure).

Î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 utilizând, 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 InitializeApp() Set apl.App = ApplicationEnd Sub

Dupa executarea procedurii InitializeApp, 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 DocumentChange, care se produce la crearea unui nou document, la deschiderea unui document, sau la activarea unui alt document (mutarea focalizarii).

o Quit, 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 (încât urmatoarea activare a aplicatiei le afiseaza):

99

Page 100: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Private Sub App_Quit () CommandBars("Standard").Visible = True CommandBars("Formatting").Visible = TrueEnd Sub

Evenimentele controalelor ActiveX

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 Control Toolbox

sau

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

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 Exit Design Mode din Control Toolbox.

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

o LostFocus, care apare atunci când focalizarea este mutata de la control la alt obiect, o GotFocus, care apare atunci când 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".

Utilizarea 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:

AutoExec care se executa la pornirea aplicatiei Word sau se încarca un template global.

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

AutoOpen care se executa la deschiderea unui document existent.

AutoClose care se executa la închiderea unui document.

AutoExit 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

Page 101: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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: document…attached template…Normal template.

Observatie. 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 pâna când se afiseaza noul document).

Într-o procedura care poate declansa un macro automat, prevenirea executiei se ia prin instructiunea

WordBasic.DisableAutoMacros

Automatizarea 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 obiecte de automatizare.

Automatizarea aplicatiei Word din 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 (Word type library):

o Tools (din Visual Basic Editor) o References o selectarea boxei de control Microsoft Word 8.0 Object Library.

B. Se declara o variabila obiect care va referi un obiect Application Word, dupa exemplul

Dim appWD As Word.Application.8

C. Se apeleaza functia CreateObject (pentru crearea unui obiect de automatizare) sau GetObject (pentru regasirea unui obiect de automatizare existent) cu Word OLE Programmatic Identifier (Word.Application.8 sau Word.Document.8), ca în exemplul urmator. Pentru a vedea sesiunea Word se utilizeaza proprietatea Visible:

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

Functia CreateObject returneaza un obiect Application Word si-l asigneaza variabilei appWD. Utilizând 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

Page 102: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

D. Functia CreateObject porneste o sesiune Word pe care automatizarea nu o închide atunci când expira variabila obiect care se refera la obiectul Application Word. Nici stabilirea referintei obiectului la Nothing nu produce închiderea aplicatiei Word. Pentru aceasta se va utiliza metoda Quit 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.ApplicationErr.Number = 0On Error GoTo notloaded''obtinerea unui obiect Word Application, daca este pornita o sesiune Word'Set appWd = GetObject(, "Word.Application.8")notloaded:If Err.Number = 429 Then ' ' se initiaza o sesiune Word (nu este alta sesiune deschisa) ' Set appWD = CreateObject("Word.Application.8") theError = Err.NumberEnd If'se vizualizeaza sesiunea WordappWD.Visible = TrueWith 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 In Worksheets ("Sheet1").Range("A1:B10") .InsertAfter Text:=c.Value Count = Count +1 If Count Mod 2 = 0 Then .InsertAfter Text:=vbCr Else .InsertAfter Text:=vbTab End If 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

Page 103: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

'' închiderea sesiunii Word, daca sesiunea este deschisa de acest cod'If theError = 429 Then appWD.Quit'' eliberarea variabilei appWD'Set appWD = Nothing

Automatizarea altei aplicatii din Word

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.8If Tasks.Exists("Microsoft Excel") = True Then Set xlObj = GetObject(, "Excel.Application.8")Else Set xlObj = CreateObject(, "Excel.Application.8")End Ifxl.Obj.Visible = TrueIf xlObj.Workbooks.Count = 0 Then xlObj.Workbooks.AddxlObj.Worksheets("Sheet1").Range("A1").Value = Selection.TextSet 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.8If Tasks.Exists("Microsoft PowerPoint") = True Then Set pptObj = GetObject(, "PowerPoint.Application.8")Else Set pptObj = CreateObject(, "PowerPoint.Application.8")End Ifppt.Obj.Visible = TrueSet pptPres = pptObj.Presentations.AddSet aSlide =pptPres.Slides.Add(ndex:=1, Layout:=ppLayoutText)aSlide.Shapes(1).TextFrame.TextRange.Text = ActiveDocument.NameaSlide.Shapes(2). TextFrame.TextRange.Text = _ActiveDocument.Paragraphs(1).Range.TextSet pptObj = Nothing

Comunicarea cu obiectele Word scufundate

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

Page 104: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Urmatorul exemplu, executat din Excel, necesita ca Shapes(1) din foaia activa sa fie un document Word scufundat (obtinut prin Insert…Object…). Prin exemplu se modifica documentul Word.

Dim appWD As Word.ApplicationSet embeddedDoc = ActiveSheet.Shapes(1)Set appWd = embeddedDoc.OLEFormat.Object.Object.ApplicationappWD.ActiveDocument.Range(Start:=0, End:=0).InsertBefore 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.ApplicationSet embeddedDoc = Presentations(1).Slides(1).Shapes(1)embeddedDoc.OLEFormat.ActivateSet appWD = embeddedDoc.OLEFormat.Object.ApplicationMsgBox appWd.ActiveDocument.Content.Text

104

Page 105: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Controale ActiveX si Dialoguri

Proiectarea casetelor de dialog utilizator Crearea unui nou dialog Scrierea procedurilor de raspuns la evenimenteControale Label TextBox ListBox ComboBox CheckBox OptionButton ToggleButton CommandButton TabStrip MultiPage Frame ImageUtilizarea dialogurilor utilizator Afisarea unui dialog Obtinerea/editarea proprietatilor în executieUtilizarea controalelor în documente Word, Excel, PowerPoint 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 gândit 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. Inserarea 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 încât prezentarea care urmeaza este valabila pentru toate proiectele VBA (din Word, Excel, PowerPoint si, cu unele exceptii, pentru Access).

Proiectarea boxelor de dialog utilizator

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 atât de mare încât sa trebuiasca o denumire speciala) necesita parcurgerea mai multor etape:

105

Page 106: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 când se proiecteaza un dialog, în Visual Basic Editor, suntem în modul de 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 modul de executie (run mode). Controalele raspund evenimentelor în modul executie.

Crearea unui nou dialog

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 UserForm.

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 (Behaviour); o font (Font); o Diverse (Misc); o imagine (Picture); o pozitie (Position); o defilare (Scrolling).

dupa cum se vizualizeaza alegând 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 (Cycle) sau accesul utilizatorului la obiect (Enabled).

Prin Font 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 Scrolling se fixeaza vizibilitatea si pozitia barelor de defilare.

106

Page 107: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Format sau butoanele de pe bara de unelte UserForm din VBE pentru a ajusta alinierea si spatierea controalelor. Se utilizeaza dialogul Tab Order (din meniul View) pentru a modifica ordinea de parcurgere a controalelor la tastari succesive de Tab (în executie – run time).

VBE stabileste proprietatea TabIndex 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 TabStop la False. Pentru aceasta, se actioneaza butonul drept al mouse-ului pe control si selectarea comenzii Properties din meniul contextual.

Scrierea procedurilor de raspuns la evenimente

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 Click declansat de actionarea cu mouse-ul, iar forma recunoaste evenimentul Initialize care apare atunci când 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 Procedure 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 oricând î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.

Controale

În aceasta sectiune se explica, pe scurt, principalele controale disponibile în proiectarea dialogurilor.

Label Control

Un control Label 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 Caption, reprezentând textul afisat.

Evenimentul implicit este Click, declansat la actionarea butonului stâng mouse pe control.

107

Page 108: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

TextBox Control

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 câmp dintr-o tabel). Informatia afisata poate fi formatata doar unitar (acelasi font, acelasi stil).

Proprietatea implicita este Value, reprezentând continutul boxei.

Evenimentul implicit este Change, declansat la modificarea proprietatii Value.

ListBox Control

Afiseaza o lista de valori si permite selectarea unei sau mai multor intrari din lista.

Într-o ListBox cu o singura coloana se poate adauga o intrare prin metoda AddItem.

Daca ListBox este legata de o sursa de date, atunci este memorata valoarea selectata în sursa.

Controlul ListBox poate sa apara ca o lista ori ca un grup de controale OptionButton sau CheckBox. Pentru aceasta din ultima optiune se va stabili proprietatea ListStyle la Option; proprietatea MultiSelect va determina atunci intrarile: Single – butoane radio, Multi sau Extended – boxe de control.

Proprietatea implicita este Value, reprezentând valoarea selectata curent (din coloana data de proprietatea BoundColumn).

Evenimentul implicit este Click.

ComboBox Control

Combina posibilitatile de la ListBox si TextBox: utilizatorul poate introduce o valoare noua (ca la TextBox), sau poate selecta o valoare dintr-o lista (ca la ListBox). Grafic, un control ComboBox 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 BoundColumn determina unde se afiseaza sursa de date.

Proprietatea implicita este Value, reprezentând valoarea selectata.

Evenimentul implicit este Change.

CheckBox Control

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 TripleState, controlul poate sa aiba si valoarea Null.

108

Page 109: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Control

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 TripleState, controlul poate avea si valoarea Null.

ToggleButton Control

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 Click.

CommandButton Control

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 Click. Pe un CommandButton se poate afisa text (proprietatea Caption), imagine (proprietatea Picture) sau ambele.

Proprietatea implicita este Value, întotdeauna False. Stabilind proprietatea Value drept True (într-o procedura), initiaza evenimentul Click al butonului de comanda.

Evenimentul implicit este Click.

TabStrip Control

109

Page 110: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Este utilizat, de obicei, pentru prezentarea unor seturi de informatii (ca valori ale unor controale grafice), fiecare grup de informatii apartinând 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 TabStrip zona de afisare (client region) este comuna tuturor fiselor (doar informatia se modifica), pe când 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 TabStrip, un tab definind purtatorul informatiilor. Daca informatia este structurata în categorii, atunci se poate utiliza controlul MultiPage, fiecare categorie având propria zona client.

Observatie. TabStrip este implementat ca un container a unei colectii Tabs de obiecte Tab.

Proprietatea implicita pentru TabStrip este SelectedItem, care returneaza obiectul Tab selectat si este folosit la controlarea programatica a obiectului.

Evenimentul implicit este Change, declansat la selectarea altui Tab.

MultiPage Control

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, pastrând în acelasi timp unitatea întregii înregistrarii.

Observatie. 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 Change, declansat la schimbarea paginii.

Frame Control

Reprezentat grafic ca un chenar cu o denumire, controlul serveste la gruparea unor controale. Grupul poate fi unit doar prin categoria de informatii, permitând 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 Frame care include butoane radio: acestea sunt mutual exclusive. Exemplul de la ToggleButton arata un Frame similar, dar butoanele pot fi actionate în orice configuratie.

Evenimentul implicit este Click.

Image Control

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, cât de mare etc.).

110

Page 111: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Click.

Utilizarea dialogurilor utilizator

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 dialog

Afisarea unui dialog pentru testare, deci în Design Mode, se realizeaza prin comanda Run Sub/UserForm (meniul Run din VBE). Afisarea dialogului în mod programatic se realizeaza utilizând metoda Show dupa modelul

[object.]Show

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 pâna când dialogul nu este ascuns sau închis (descarcat – unloaded). Este posibil totusi sa se lucreze în alte aplicatii.

Obtinerea si stabilirea proprietatilor în executie

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 când 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 Initialize a dialogului. Afisarea formei declanseaza evenimentul Initialize 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, încât orice aratare a formei se realizeaza în aceeasi configuratie:

111

Page 112: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Private Sub UserForm_Initialize() With frmPhoneOrders .txtCustomerName.Text = "Mamma S.R.L." 'se initializeaza TextBox .chkSendExpress.Value = True 'se initializeaza CheckBox With .lstRegions .AddItem "Iasi" 'se initializeaza ListBox .AddItem "Suceava" .AddItem "Botosani" .ListIndex = 2 'se selecteaza ultima intrare End With End WithEnd 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 ListIndex = 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.AddItem "North" .lstRegions.AddItem "South" .lstRegions.AddItem "East" .lstRegions.AddItem "West" .txtSalesPersonID.Text = "0000" .Show End WithEnd 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 Enabled. Daca proprietatea este setata pe False, atunci utilizatorul nu poate accesa controlul: cum ar fi interzicerea accesului la butonul OK pâna când o anumita informatie nu este completata în dialog.

Exemplul urmator arata cum accesul la un grup de butoane radio nu este permis decât daca o CheckBox este marcata:

Private Sub CheckBox1_Change() With Me ' Me se refera la forma curenta If .CheckBox1.Value = True Then .OptionButton1.Enabled = False .OptionButton2.Enabled = False .OptionButton3.Enabled = False Else .OptionButton1.Enabled = True .OptionButton2.Enabled = True .OptionButton3.Enabled = True End If End WithEnd Sub

112

Page 113: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Prin intermediul metodei SetFocus se controleaza focalizarea. Un control care are focusul este cel care raspunde la intrarile din tastatura. De exemplu

Private Sub Image1_Click () Me.CheckBox1.SetFocusEnd Sub

realizeaza trecerea focusului la CheckBox1 atunci când imaginea din controlul Image1 (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 când se modifica portiunea afisata a formei, vizualizând (deci dând acces) controale suplimentare, sau ascunzându-le (nu mai pot fi accesate, desi nu sunt inhibate). În acest scop se opereaza cu proprietatea Height.

Presupunem ca o forma, cu un buton radio, este dimensionata în proiectare cu Height = 120 si se adauga un control, de exemplu un CheckBox, la baza formei, controlul fiind pozitionat prin proprietatea Top setata la mai mult de 120 (deci în afara zonei afisate din forma). Se adauga urmatoarele proceduri eveniment:

Private Sub UserForm_Initialize () Me.Height = 120 'Orice afisare a formei readuce înaltimea la 120End Sub

Private Sub OptionButton1_Click () With Me .Height = 300 – .Height 'Modificarea butonului radio basculeaza între cele doua dimensiuni ale formei End WithEnd 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 Index As Long) If Index = 0 Then Me.TextBox1.Text = "7710 Park Lane" ElseIf Index = 1 Then Me.TextBox1.Text = "5520 5th Avenue" End IfEnd 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 când controlul pierde focusul sau când întregul dialog este închis. Evenimentele Enter si Exit pot fi utilizate în acest scop.

113

Page 114: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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

Private Sub object_Enter( )

Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean)

unde

object este un nume valid de control care recunoaste evenimentul

Cancel este starea evenimentului: False arata procesarea evenimentului de catre control (optiunea implicita); True arata ca evenimentul este tratat de aplicatie si focusul ramâne 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 Exit nu trebuie uitata atribuirea valorii True argumentului pentru ca focusul sa ramâna pe controlul curent.

De studiat si metoda SetFocus 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) If Not IsNumeric(txtCustAge.Text) Then MsgBox "Vârsta trebuie sa fie numerica" Cancel = True End IfEnd 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 () If Not IsNumeric (txtCustAge.Text) Then MsgBox "Vârsta trebuie sa fie numerica" txtCustAge.SetFocus 'Controlul reprimeste focusul Exit Sub 'Se paraseste procedura End If custAge = txtCustAge.Text 'Se salveaza valoarea controlului Unload Me 'Se descarca formaEnd Sub

Este de mentionat ca pentru trecerea valorii în alt modul de cod, variabila custAge trebuie calificata, de exemplu ThisDocument.custAge.

114

Page 115: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Integer

de exemplu.

Cutiile de dialog utilizator sunt afisate întotdeauna drept modale. Prin urmare utilizatorul trebuie sa închida dialogul înainte de a se întoarce în aplicatia principala.

Închiderea (descarcarea) formei se realizeaza prin instructiunea Unload. Î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.InsertAfter txtUserName.Text Unload UserForm1End 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 UserForm din Project Explorer, click Export File. • Se alege un nume si Save. Se obtine un fisier nume.frm. • În VBE unde se doreste reutilizarea formei, right-click pe proiectul respectiv din Project Explorer, click

pe Import File. • Selectarea numelui formei si Open.

Utilizarea controalelor în documente Word, foi de calcul Excel sau diapozitive PowerPoint

Î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 Control Toolbox (si nu Toolbox ca în VBE). Afisarea acestei cutii se realizeaza din View - Toolbars - Control Toolbox.

o bascularea între Design mode si Run mode se efectueaza în Word sau Excel prin actionarea butoanelor Exit Design Mode si Design Mode de pe bara Visual Basic. În PowerPoint se

115

Page 116: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

trece în Slide Show pentru a fi în Run Mode si se revine într-o viziune de editare pentru Design Mode.

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.

Controale ActiveX în documente Word

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 SHIFT si click-ul pe controlul din Control Toolbox. Î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 Control Toolbox fara a actiona si tasta SHIFT. În acest caz, controlul este similar unui obiect Picture din documentul Word.

• Un control adaugat pe stratul text este un obiect InlineShapes la care se obtine acces programatic prin colectia InlineShapes. Un control adaugat pe stratul de desen este un obiect Shape la care se ajunge programatic prin colectia Shapes.

• 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 Control Toolbox 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). Inserarea 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 Mode, controalele ActiveX sunt vizibile doar în viziunile Page Layout sau Online Layout. • Controalele ActiveX din stratul de desen sunt întotdeauna în Run Mode în viziunile Page Layout sau

Online Layout. • 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 Form de pe bara de unelte Forms.

• Daca, la crearea unui formular online, se doreste adaugarea de câmpuri de formular în locul controalelor ActiveX, se va utiliza bara de unelte Forms.

Controale ActiveX în foi de calcul Excel

Se pot adauga controale, la caiete sau foi de calcul, lânga datele pe care le controleaza, astfel încât operarea în foaia de calcul sa se efectueze cât 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 pâna când controlul CommandButton1 ajunge în coltul din stânga sus:

Set t = Sheet1.CommandButton1.TopLeftCellWith ActiveWindow .ScrollRow = t.Row .ScrollColumn = t.Column

116

Page 117: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

End With

• Anumite metode si proprietati din Microsoft Excel Visual Basic sunt inhibate atunci când un control ActiveX este activat. De exemplu, metoda Sort nu poate fi utilizata când 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.ActivateEnd 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.

• Cuvântul 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.

Controale ActiveX în diapozitive PowerPoint

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. • Cuvântul 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 când 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 WithEnd Sub

• Se pot dota diapozitivele cu unelte de navigatie. Daca acestea sunt pozitionate din Master, vor fi disponibile pe toate diapozitivele. De exemplu, adaugând la Slide Master doua butoane denumite, respectiv, cmdBack si cmdForward, si scriind procedurile de eveniment urmatoare, demonstratia poate fi condusa actionând respectivele butoane.

Private Sub cmdBack_Click () Me.Parent.SlideShowWindow.View.PreviousEnd SubSub cmdForward_Click ()

117

Page 118: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Me.Parent.SlideShowWindow.View.NextEnd Sub

• Pentru a lucra cu toate controalele ActiveX de pe un slide anume fara a afecta celelalte forme desenate (Shapes) 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 If numShapes > 1 Then numControls = 0 ReDim ctrlArray(1 To numShapes) For i = 1 To numShapes If .Item(i).Type = msoOLEControlObject Then numControls = numControls + 1 ctrlArray(numControls) = .Item(i).Name End If Next If numControls > 1 Then ReDim Preserve ctrlArray(1 To numControls) Set ctrlRange = .Range(ctrlArray) ctrlRange.Distribute msoDistributeVertically, True ctrlRange.Align msoAlignLefts, True End If End IfEnd With

Lucrul, prin program, cu controale din documentele 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 (Name) î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 Shapes, OLEObjects sau InlineShapes, dupa caz.

o Controalele adaugate la stratul de desen al unui document, foaie sau slide sunt continute în obiectele Shape si pot fi gestionate programatic prin intermediul colectiei Shapes.

o În Excel, controalele ActiveX sunt continute de asemenea în obiectele OLEObject si pot fi programate prin colectia OLEObjects.

118

Page 119: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o În Word, controalele ActiveX adaugate în stratul text sunt continute în obiectele InlineShape si pot fi controlate prin colectia InlineShapes.

Pentru accesul prin intermediul colectiilor, se utilizeaza numele obiectului Shape 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 (Name). Pentru a schimba numele unui obiect Shape, OLEObject sau altui obiect care contine un control se va schimba valoarea proprietatii Name.

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 Instructiunea 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.InlineShapes.AddOLEControl ClassType:="Forms.CheckBox.1"

o Stabilirea unor atribute ale controalelor dintr-un document Word:

ActiveDocument.InlineShapes(1).Width = 200ActiveDocument.InlineShapes(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 = 100ActiveDocument.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 = 100ActivePresentation.Slides(1).Shapes("CommandButton1") _ .OLEFormat.Object.Caption = "Run"

119

Page 120: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectele Microsoft Excel

Obiectul ApplicationObiectul Workbook Deschiderea unui Workbook Metoda GetOpenFilename Crearea/salvarea unui Workbook Metoda Add (colectia Workbooks) Metoda SaveAs Metoda Save Metoda GetSaveAsFilename Închiderea unui Workbook Metoda CloseObiectul 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 AddressEvenimentele din Excel 97 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 Editor — Help — Contents and Index — (Contents tab) — Microsoft Excel Visual Basic Reference — Shortcut to Microsoft Excel Visual Basic Reference. Fisierele sunt disponibile daca la instalarea aplicatiei s-a marcat boxa Online Help 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

Page 121: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectul 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 DisplayFormulaBar este True daca bara de formule este vizibila, iar valoarea proprietatii ScreenUpdating 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 Windows da acces la colectia Windows (reprezentând toate ferestrele deschise în aplicatie), proprietatea Workbooks da colectia Workbooks a tutror caietelor deschise etc. Din aceasta categorie enumeram:

o Charts, colectia tuturor foilor de tip chart, o Dialogs, colectia tuturor dialogurilor predefinite în mediul Excel, o Names, colectia tutror numelor create în caietul activ, o RecentFiles, colectia fisierelor utilizate recent (dupa lista din meniul File), o Sheets, colectia tutror foilor deschise în caietul activ, o Windows, o Workbooks, o Worksheets, 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: ActiveCell, Cells, Rows, Columns, Selection (daca este selectat un domeniu de celule).

Proprietatile ActiveWorkbook, ActiveSheet, ActiveChart si ActiveWindow 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 Calculate aplicata la nivelul Application produce recalcularea tuturor foilor, din toate caietele, pe când utilizata la nivel de Workbook sau de Worksheet produce recalcularea doar a foilor locale.

Obiectul Workbook

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. In Visual Basic, metodele utilizate la lucrul cu fisiere sunt metode ale obiectului Workbook sau ale colectiei Workbooks.

Deschiderea unui Workbook

Pentru a deschide un caiet se utilizeaza metoda Open. Metoda este aplicata întotdeauna colectiei Workbooks, 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").ValueEnd Sub

121

Page 122: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Este de remarcat ca obiectul Workbook returnat de metoda se refera la caietul deschis, care ramâne 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 Path si LibraryPath ale obiectului Application). Astfel

EXEPath = Application.Path & Application.PathSeparatorLibPath = 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 încât codul este independent de platforma Windows sau Macintosh). Instructiunile

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 GetOpenFilename 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

Metoda GetOpenFilename

Afiseaza dialogul Open si returneaza numele de fisier selectat fara a deschide efectiv fisierul.

expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

unde

expression este o expresie care returneaza un obiect Application.

FileFilter este de tip Variant, optional. Este un sir specificând 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-In Files (*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se considera "All Files (*.*),*.*".

FilterIndex este de tip Variant, optional. Specifica indexul criteriului de filtrare implicit. de la 1 la numarul de filtre specificat în FileFilter. Implicit se considera 1.

122

Page 123: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Title este de tip Variant, optional. Specifica titlul boxei de dialog. Implicit este "Open".

ButtonText este specific pentru Macintosh.

MultiSelect este de tip Variant, optional. Este True atunci când se pot selecta mai multe nume de fisiere, False daca este permisa selectarea unui singur fisier. Implicit 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 când utilizatorul anuleaza boxa (prin Cancel), se returneaza False. Metoda poate schimba atât folderul curent cât si unitatea.

Crearea si salvarea unui Workbook

Se creeaza un nou caiet prin aplicarea metodei Add la colectia Workbooks. Valoarea returnata se va atribui (prin Set) unei variabile obiect pentru a putea referi noul caiet în program. Noul workbook devine activ.

Metoda Add (colectia Workbooks)

Returneaza un obiect Workbook. Sintaxa

expression.Add(Template)

unde

expression este o expresie care returneaza un obiect Workbooks. (Metoda se poate aplica, cu parametri specifici, tuturor colectiilor.)

Template 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, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet sau xlWBATWorksheet. Daca argumentul este omis, atunci se creeaza un caiet cu un numar de foi egal cu proprietatea SheetsInNewWorkbook a obiectului Application).

Salvarea unui caiet se efectueaza prin metoda SaveAs (la prima salvare) sau prin metoda Save. Exista, similar metodei GetOpenFilename, metoda GetSaveAsFilename (pentru Application).

Metoda SaveAs

are sintaxa

expression.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout)

unde

expression returneaza un obiect Workbook.

Filename, optional, Variant. Contine numele noului fisier, poate include o cale.

FileFormat, 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 FileFormat.

123

Page 124: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Password, optional, Variant. Un sir unde capitalizarea este considerata (cel mult 15 caractere) care contine parola de protejare a fissierului.

WriteResPassword, 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.

ReadOnlyRecommended, 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.

AccessMode, 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 ExclusiveAccess.

ConflictResolution, optional, Variant. Specifica modul de rezolvare a conflictelor de schimbare în cazul când fisierul este shared. Poate fi una dintre constantele (de tip XlSaveConflictResolution): xlUserResolution (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.

AddToMru, optional, Variant. Este True daca se adauga numele fisierului la lista fisierelor utilizate recent. Implicit este False.

TextCodePage, TextVisualLayout, optionale, Variant. Neutilizate în versiunea U.S. English.

Metoda Save

Salveaza modificarile caietului specificat.

expression.Save

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 Saved.

Metoda GetSaveAsFilename

Similar metodei GetOpenFilename, aceasta metoda afiseaza dialogul standard Save As, returneaza un nume de fisier, dar nu salveaza nici un fisier.

expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

unde

expression este o expresie care returneaza un obiect Application.

InitialFilename, optional, Variant. Specifica numele de fisier propus. Daca acest nume este omis, atunci se va utiliza numele caietului activ.

124

Page 125: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

FileFilter, optional, Variant. Sirul care specifica criteriul de filtrare. Pentru structura sirului se va revedea metoda GetOpenFilename de la deschiderea documentelor.

FilterIndex, optional, Variant. Este indicele criteriului de filtrare, de la 1 la numarul de filtre dat la FileFilter. Implicit este 1.

Title, optional, Variant. Titlul boxei de dialog.

ButtonText 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 GetSaveAsFilename:

Sub CreateAndSave() Set newBook = Workbooks.Add Do fName = Application.GetSaveAsFilename Loop Until fName <> False newBook.SaveAs Filename:=fNameEnd Sub

Închiderea unui Workbook

Pentru a închide un workbook, se va aplica metoda Close a obiectului Workbook. Închiderea poate avea loc cu sau fara salvarea modificarilor.

Metoda Close

Produce închiderea obiectului. Aplicata colectiei Workbooks are sintaxa

expression.Close

unde

expression returneaza un obiect Workbooks. Daca exista modificari ale caietelor, se va afisa dialogul de interogare asupra eventualei salvari.

Aplicata obiectelor Window si Workbook metoda are sintaxa

expression.Close(SaveChanges, FileName, RouteWorkbook)

unde

expression este o expresie care returneaza un obiect Workbook sau Window.

SaveChanges 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

Page 126: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

FileName este optional, Variant. Salveaza modificarile sub acest nume.

RouteWorkbook este optional, Variant. Daca nu este indicata nici o rutare (nu exista nici un RoutingSlip 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_Close 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:=FalseEnd Sub

Obiectul 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 atât o singura celula cât si o multime de celule. Nu exista un obiect colectie pentru Range, asa ca un obiect Range poate fi gândit 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

Page 127: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Referinte de tip A1 sau nume de domeniu

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 = "=5–10*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 Worksheet caruia i se aplica Range. Exemplul urmator

Sub SortRange() Worksheets("Sheet1").Range("A1:B10").Sort _ Key1:=Range("A1"), Order1:=xlDescendingEnd Sub

nu va functiona corect decât 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")

Utilizarea indicilor de linii si coloane

O celula specifica poate fi returnata utilizând indicii numerici de linie si coloana pentru celula referita.

127

Page 128: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• 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 = "=5–10*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 decât 0.01:

Sub RoundToZero() For rwIndex = 1 to 10 For colIndex = 1 to 4 If Worksheets("Sheet1").Cells(rwIndex,colIndex) < 0.01 Then Worksheets("Sheet1").Cells(rwIndex,colIndex).Value = 0 End If Next colIndez Next rwIndexEnd 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 I = 1 For Each nm in ActiveWorkbook.Names NewSheet.Cells(i,1).Value = nm.Name NewSheet.Cells(i,2).Value = "' " & nm.RefersTo Next nm NewSheet.Columns("A:B").AutoFitEnd Sub

Utilizarea proprietatii Offset

Atunci când 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 RowOffset si ColumnOffset arata deplasarea fata de obiectul Range curent. Este returnat un nou obiect Range.

Exemplul urmator determina câteva 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 In Worksheets("Sheet1").Range("A1:A10").Cells If Application.IsText(c.Value) Then c.Offset(0,1).Value = "Text" ElseIf Application.IsNumber (c.Value) Then c.Offset(0,1).Value = "Number" ElseIf Application.IsLogical (c.Value) Then

128

Page 129: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

c.Offset(0,1).Value = "Boolean" ElseIf Application.IsError (c.Value) Then c.Offset(0,1).Value = "Error" ElseIf c.Value = "" Then c.Offset(0,1).Value = "(blank cell)" End If Next cEnd Sub

Utilizarea proprietatilor CurrentRegion si UsedRange

Aceste doua proprietati, explicate în continuare, sunt utile atunci când nu se stie de la început cât 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 CurrentRegion 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, reflectând extensia, în sensul prezentat mai sus, al obiectului Range caruia i se aplica proprietatea.

Domeniul utilizat este determinat de celule nevide situate cel mai la stânga 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 pâna la completarea unui domeniu dreptunghiular si este unic pe o foaie de calcul. Este natural ca proprietatea UsedRange sa se aplice obiectului Worksheet 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 UsedRange.

Sub ConvertDates () Set myRange = ActiveSheet.UsedRange myRange.Columns("C").Insert Set dateCol = myRange.Columns("C") For Each c In dateCol.Cells If c.Offset(0,-1).Value <>"" Then c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)" End If Next c dateCol.NumberFormat = "mmm-dd-yyyy hh:mm" dateCol.Copy dateCol.PasteSpecial Paste:=xlValues myRange.Columns("A:B").Delete

129

Page 130: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

dateCol.AutoFitEnd Sub

Exista si alte proprietati si metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range. Printre acestea enumeram: Areas, Cells, Columns, EntireColumn, EntireRow, Range si Rows.

Parcurgerea unui domeniu de celule

Dintre multiplele moduri de parcurgere a celulelor dintr-un domeniu, se prezinta parcurgerile prin instructiunile For Each … Next si Do … Loop, unele fiind deja utilizate în exemplele anterioare.

Utilizarea instructiunii For Each … Next

Acesta este modul recomandat de parcurgere a elementelor unei colectii.

Un exemplu anterior devine

Sub RoundToZero () For Each r In Worksheets(Sheets1").Range("A1:D10").Cells If Abs(r.Value) < 0.01 Then r.Value = 0 End If Next rEnd Sub

Pentru ca operatiunea anterioara sa aiba loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox, specificându-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.InputBox( _ Prompt:="Select a range of cells", _ Type:=8) On Error GoTo 0 For Each c In r.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 End If Next c Exit Sub

PressedCancel: ResumeEnd Sub

Daca nu se doreste selectarea de catre utilizator a domeniului procesat, se poate utiliza proprietatea CurrentRegion sau proprietatea UsedRegion 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

Page 131: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Urmatoarele doua exemple arata cum se poate ascunde fiecare a doua coloana din domeniul utilizat în Sheet1. Primul exemplu, utilizând For Each…Next

Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange For Each col In r.Columns If col.Column Mod 2 = 0 Then col.Hidden = True End If Next colEnd Sub

Al doilea exemplu, utilizând For…Next:

Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True End If Next iEnd Sub

Utilizarea instructiunii Do…Loop

Atunci când 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 IsEmpty(currentCell) Set nextCell = currentCell.Offset(1,0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell LoopEnd Sub

Este de notat ca structura repetitiva poate fi înlocuita prin

Do While currentCell.Value <> "" ' instructiunile de eliminare a liniilor cheilor duplicateLoop

Utilizarea proprietatii Address

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

Page 132: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange MsgBox r.Address ' doar pentru depanare For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True MsgBox r.Columns(i).Address ' doar pentru depanare End If Next iEnd Sub

Acelasi efect se poate obtine prin stabilirea unor expresii de urmarire (watch expressions) de forma r.Address si r.Columns(i).Address, valorile respective pot fi examinate în fereastra Immediate. Pentru o discutie mai pe larg se va studia capitolul dedicat depanarii si manevrarii erorilor.

Evenimentele din Excel 97

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 utilizând cuvântul cheie WithEvents într-un modul clasa. (vezi discutia din sectiunea dedicata subiectului în acest capitol).

Permiterea si inhibarea evenimentelor

Î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 când 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 = FalseActiveWorkbook.SaveApplication.EnableEvents = True

Utilizarea evenimentelor

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

Page 133: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o click dreapta pe cotorul foii (pe bara de jos, unde se vad cotoarele tuturor foilor din caietul activ), comanda View Code din meniul contextual, alegerea numelui evenimentului în lista derulanta Procedure, sau

o meniul Tools, comanda Macro si selectarea optiunii Visual Basic Editor. Se selecteaza foaia dorita în Project Explorer, butonul View Code si se alege numele evenimentului din lista Procedure.

Evenimentele obiectului Worksheet

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaza foaia. Acest eveniment se va utiliza în locul proprietatii OnSheetActivate

BeforeDoubleClick Apare atunci când utilizatorul executa un dublu click într-o celula a foii. Se va utiliza în locul proprietatii OnDoubleClick.

BeforeRightClick Apare atunci când utilizatorul executa un click dreapta într-o celula a foii.

Calculate Apare când utilizatorul recalculeaza foaia. Acest eveniment se va utiliza în locul proprietatii OnCalculate.

Change Apare atunci când utilizatorul schimba o formula dintr-o celula. Se va utiliza în locul proprietatii OnEntry.

Deactivate Apare atunci când foaia este activa si utilizatorul activeaza o alta foaie. Nu apare atunci când utilizatorul muta focusul de la o fereastra la alta fereastra a aceleeasi foi. Acest eveniment se va utiliza în locul proprietatii OnSheetDeactivate.

SelectionChange Apare atunci când utilizatorul selecteaza o celula din foaie.

O prezentare completa si exemple se gasesc în intrarile respective din Help.

Exemplu

În codul care urmeaza, se reajusteaza dimensiunea coloanelor la fiecare recalculare:

Private Sub Worksheet_Calculate () Columns("A:F").AutoFitEnd Sub

Este de remarcat ca modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea evenimentelor".

133

Page 134: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Evenimentele obiectului Chart

Declansate atunci când utilizatorul activeaza sau modifica o diagrama, evenimentele recunoscute de obiectul Chart sunt prezentate în tabelul urmator.

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaza foaia diagrama (nu apare la diagramele scufundate). Acest eveniment se va utiliza în locul proprietatii OnSheetActivate

BeforeDoubleClick Apare atunci când utilizatorul executa un dublu click pe diagrama. Se va utiliza în locul proprietatii OnDoubleClick.

BeforeRightClick Apare atunci când utilizatorul executa un click dreapta pe diagrama.

Calculate Apare când utilizatorul reprezinta în diagrama date noi sau modificate.

Deactivate Apare atunci când foaia este activa si utilizatorul activeaza o alta foaie. Nu apare atunci când utilizatorul muta focusul de la o fereastra la alta fereastra a aceleeasi foi. Acest eveniment se va utiliza în locul proprietatii OnSheetDeactivate.

DragOver Apare atunci când utilizatorul dragheaza date peste diagrama.

DragPlot Apare atunci când utilizatorul dragheaza un domeniu de celule peste diagrama.

MouseDown Apare atunci când utilizatorul executa un click cu un buton al mouse-ului în timp ce pointerul acestuia este pozitionat pe diagrama.

MouseMove Apare la miscarea pointerului mouse-ului peste diagrama.

MouseUp Apare atunci când utilizatorul elibereaza un buton al mouse-ului în timp ce pointerul acestuia este pozitionat pe diagrama.

Resize Apare la redimensionarea diagramei.

Select Apare la selectarea unui element al diagramei.

SeriesChanges Apare atunci când utilizatorul modifica valoarea unei punct de pe diagrama.

134

Page 135: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 utilizând WithEvents într-un modul de clasa.

Exemplu

Se schimba culoarea chenarului unui punct atunci când utilizatorul schimba valoarea punctului:

Private Sub Chart_SeriesChange (ByVal SeriesIndex As Long, _ ByVal PointIndex As Long) Set p = ActiveChart.SeriesCollection(SeriesIndex).Points(PointIndex) p.Border.ColorIndex = 3End Sub

Evenimentele obiectului Workbook

Aceste evenimente se declanseaza atunci când utilizatorul schimba un caiet sau orice foaie din caietul respectiv.

Eveniment Descriere

Activate Apare atunci când utilizatorul activeaza caietul.

AddInInstall Apare atunci când utilizatorul instaleaza caietul ca un add-in. Se va utiliza în locul macro-ului Auto_Add.

AddInUninstall Apare atunci când utilizatorul dezinstaleaza caietul ca un add-in. Se va utiliza în locul macro-ului Auto_Remove.

BeforeClose Apare înaintea închiderii caietului. Se va utiliza în locul macro-ului Auto_Close.

BeforePrint Apare înaintea tiparirii caietului.

BeforeSave Apare înainte ca utilizatorul sa salveze foaia. Acest eveniment se va utiliza în locul proprietatii OnSave.

Deactivate Apare atunci când caietul este activ si utilizatorul activeaza un alt caiet.

NewSheet Apare dupa ce utilizatorul creeaza o noua foaie.

Open Apare la deschiderea caietului. Evenimentul se va utiliza în locul macroului Auto_Open.

SheetActivate Apare la activarea unei foi din caiet. Se va utiliza în locul proprietatii OnSheetActivate.

SheetBeforeDoubleClick Apare la dublu click pe o celula (nu este

135

Page 136: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

utilizat cu foile diagrama). Se va utiliza în locul proprietatii OnDoubleClick.

SheetBeforeRightClick Apare la click dreapta pe o celula a unei foi din caiet (nu este utilizat cu foile diagrama).

SheetCalculate Apare la recalcularea unei foi (nu este utilizata cu foile diagrama). Se utilizeaza în locul proprietatii OnCalculate.

SheetChange Apare la modificarea formulei dintr-o celula (nu este utilizata cu foile diagrama). Se utilizeaza în locul proprietatii OnEntry.

SheetDeactivate Apare la activarea altei foi din caiet. Se utilizeaza în locul proprietatii OnSheetDeactivate.

SheetSelectionChange Apare la modificarea selectiei dintr-o foaie de calcul (nu functioneaza cu foile diagrama).

WindowActivate Apare atunci când utilizatorul muta focusul pe orice fereastra a caietului. Se utilizeaza în locul proprietatii OnWindow.

WindowDeactivate Apare atunci când utilizatorul muta focusul în afara oricarei fereastre a caietului. Se utilizeaza în locul proprietatii OnWindow.

WindowResize Apare atunci când utilizatorul deschide, redimensioneaza, maximizeaza sau minimizeaza orice fereastra a caietului.

Pentru explicatii se vor studia intrarile corespunzatoare din Help.

Exemplu

Deschiderea caietului maximizeaza fereastra aplicatiei Excel:

Sub Workbook_Open () Application.WindowState = xlMaximizedEnd Sub

Evenimentele obiectului Application

Aceste evenimente se declanseaza la crearea/deschiderea unui caiet sau atunci când este modificata orice foaie din orice caiet deschis.

Eveniment (pentru Application)

Descriere

136

Page 137: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

NewWorkbook Apare la crearea unui nou caiet.

SheetActivate Apare atunci când utilizatorul activeaza o foaie dintr-un caiet deschis. Se va utiliza în locul proprietatii OnSheetActivate.

SheetBeforeDoubleClick Apare la dublu click pe o celula dintr-un caiet deschis (nu este utilizat cu foile diagrama). Se va utiliza în locul proprietatii OnDoubleClick.

SheetBeforeRightClick Apare la click dreapta pe o celula a unei foi dintr-un caiet deschis (nu este utilizat cu foile diagrama).

SheetCalculate Apare la recalcularea unei foi (nu este utilizata cu foile diagrama). Se utilizeaza în locul proprietatii OnCalculate.

SheetChange Apare la modificarea formulei dintr-o celula (nu este utilizata cu foile diagrama). Se utilizeaza în locul proprietatii OnEntry.

SheetDeactivate Apare la activarea altei foi dintr-un caiet. Se utilizeaza în locul proprietatii OnSheetDeactivate.

SheetSelectionChange Apare la modificarea selectiei dintr-o foaie de calcul (nu functioneaza cu foile diagrama).

WindowActivate Apare atunci când utilizatorul muta focusul pe orice fereastra deschisa în aplicatie. Se utilizeaza în locul proprietatii OnWindow.

WindowDeactivate Apare atunci când utilizatorul muta focusul în afara oricarei fereastre a aplicatiei. Se utilizeaza în locul proprietatii OnWindow.

WindowResize Apare atunci când utilizatorul redimensioneaza, maximizeaza sau minimizeaza orice fereastra deschisa în aplicatie.

WorkbookActivate Apare atunci când se muta focusul pe un caiet deschis

WorkbookAddInInstall Apare la instalarea unui workbook ca un add-in.

WorkbookAddInUninstall Apare la dezinstalarea unui workbook ca un add-in.

WorkbookBeforeClose Apare înainte ca un caiet deschis sa fie închis.

137

Page 138: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

WorkbookBeforePrint Apare înainte ca un caiet deschis sa fie tiparit.

WorkbookBeforeSave Apare înainte ca un caiet deschis sa fie salvat.

WorkbookDeactivate Apare atunci când utilizatorul muta focusul în afara unui caiet deschis.

WorkbookNewSheet Apare la adaugarea unei noi foi la un caiet deschis.

WorkbookOpen Apare atunci când utilizatorul deschide un caiet.

Utilizarea modulelor clasa cu evenimente

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 Chart sau Application cu evenimente. Pentru crearea modulului clasa se da comanda Class Module din meniul Insert.

• Pentru permiterea evenimentelor obiectului Application se adauga declaratia

Public WithEvents App As Application

• Obiectul nou creat apare în boxa Object 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 InitializeApp () Set X.App = ApplicationEnd 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

Page 139: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

în etapa 2 si codul urmator

Dim C1 As New EventClassDim C2 As New EventClassSub InitializeCharts () Set C1.cht = Worksheets (1).ChartObjects(1).Chart Set C2.cht = Worksheets (1).ChartObjects(2).ChartEnd Sub

pentru initializare.

Aceeasi tehnica se poate utiliza si pentru obiectele Worksheet si Workbook pentru a utiliza evenimentele noii clase cu mai multe foi de calcul, în plus fata de evenimentele implicite.

139

Page 140: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectele Microsoft Access

Obiectele accesibile în Microsoft AccessObiectele Microsoft AccessObiectul Application Utilizarea obiectului Application în automatizareColectia Forms 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 executieiColectia Reports Referirea obiectelor Report Module asociate rapoartelor Crearea rapoartelor în timpul executiei Functiile CreateForm, CreateReport Functiile CreateControl, CreateReportControl Exemplu de creare a unui raportColectia Controls 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 ControlsColectia Modules 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 clasaColectia References Referirea obiectelor Reference Proprietatile obiectului Reference Metodele colectiei References Stabilirea unei referinte în Visual BasicObiectul DoCmd Metoda OpenForm Metoda RunCommandObiectul Screen Proprietatile obiectului Screen

140

Page 141: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Obiectele accesibile în 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 efectuându-se în mod uzual prin marcarea bibliotecii în lista afisata la comanda References din meniul Tools.

Access face referinta, în mod automat, la bibliotecile de obiecte:

o Microsoft Access 8.0. Aici sunt obiectele prezentate în acest capitol (Form, Module, Application etc.).

o Microsoft DAO 3.5. Aici sunt 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: Debug, Err si Collection.

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 CommandBar, FileSearch 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.

Obiectele 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.

Obiectul sau colectia Descriere

Application Reprezinta aplicatia Microsoft Access (obiect)

Form Reprezinta o forma deschisa (obiect)

Forms Contine toate formele deschise. (colectie)

Report Reprezinta un raport deschis (obiect)

Reports Contine toate rapoartele curente deschise (colectie)

Control Reprezinta un control pe o forma, raport sau sectiune sau din alt control (obiect)

141

Page 142: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Controls Contine toate controalele de pe o forma sau raport (colectie)

Module Reprezinta un modul standard sau un modul clasa (obiect)

Modules 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)

DoCmd Reprezinta o actiune macro din Visual Basic (obiect)

Screen 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 Object Browser din meniul View (sau F2).

Obiectul Application

Obiectul Application reprezinta aplicatia Microsoft Access si este obiectul de nivel cel mai înalt din ierarhia de obiecte Access, continând toate celelalte obiecte si colectii.

Obiectul Application este obiectul implicit din ierarhia de obiecte. Drept urmare, atunci când se lucreaza din interiorul aplicatiei Access, nu este necesara referirea lui explicita când se utilizeaza una dintre proprietatile sau metodele sale, sau când se scrie o referinta la un obiect sau o colectie inclusa. Referirea explicita nu produce, totusi, erori.

Specificare obiectului Application este necesara doar atunci când, prin procedeul de automatizare, se lucreaza cu obiecte din ierarhia Access în interiorul altei aplicatii.

Utilizarea obiectului Application în automatizare

Atunci când 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

Page 143: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

În Visual Basic Editor, aceste etape se realizeaza prin:

o deschiderea unui modul, comanda References din Tools, selectarea Microsoft Access 8.0 Object Library în lista Available 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 CreateObject (daca Microsoft Access nu este lansat) sau GetObject (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 New 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 pâna când 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 WithEnd 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

Page 144: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Colectia Forms

Obiectul Form reprezinta o forma Access deschisa într-unul din modurile de vizualizare Design, Form sau Datasheet. Obiectele Form sunt grupate în colectia Forms, care contine doar formele deschise curent în baza de date.

În tabelul urmator sunt rezumate relatiile obiectelor Form si ale colectiei Forms:

Obiectul sau colectia

Este continut(a) în Contine

Form (obiect) Forms Colectia Controls

Colectia Properties

Obiectul Module

Forms (colectie) Application Obiecte Form

Referirea la un obiect Form

Pentru a lucra cu o forma în Visual Basic, trebuie sa se returneze o referinta la obiectul Form corespunzator, referinta obtinându-se prin intermediul colectiei Forms. O forma poate fi referita doar daca este deschisa iar deschiderea unei forme se realizeaza prin metoda OpenForm a obiectului DoCmd.

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 FormSet 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 = DateEnd Function

Referinta prin indice este de genul Forms(1), indexarea colectiei Forms începând 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

Page 145: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Cum colectia Forms 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 obiectului Form

Dintre proprietatile obiectului Form sunt prezentate doar câteva, considerate mai importante. Pentru celelalte se va studia intrarea corespunzatoare din Help (Form Object).

Proprietatea Me (Form Object)

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 Form 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 formeiPrivate Sub Form_Load () ' Initializarea 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 când se lucreaza cu o forma Access din alta aplicatie, prin automatizare, nu se poate utiliza Me pentru a referi forma din aplicatia gazda.

Proprietatea Section (Form Object)

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

Index Nume Semnificatie

0 acDetail Form detail

1 acHeader Form header

2 acFooter Form footer

3 acPageHeader Form page header

4 acPageFooter Form page footer

145

Page 146: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Un numar de proprietati se aplica mai degraba unei sectiuni dintr-o forma decât obiectului Form. De exemplu, proprietatea BackColor se aplica unei sectiuni si nu unei forme (a se vedea exemplul precedent). O sectiune are de asemenea o proprietatea Controls, care returneaza o referinta la colectia Controls 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 In frm.Section(acDetail).Controls Debug.Print ctl.Name Next ctlEnd Sub

Proprietatea Properties (Form Object)

Returneaza o referinta la colectia Properties a obiectului Form. Colectia Properties contine toate proprietatile formei si pot fi enumerate prin instructiunea For Each…Next.

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 In frm.Properties Debug.Print prp.Name, prp.Value Next prpEnd Sub

Proprietatea Module (Form Object)

Aplicata unui obiect Form, proprietatea Module returneaza o referinta la obiectul Module asociat formei. Referinta poate fi asignata unei variabile de tip Module.

Modulul asociat cu o forma nu exista în mod automat din momentul creerii formei. Proprietatea HasModule determina daca o forma are un modul asociat. Daca proprietatea Module este referita în modul proiectare, Access creeaza modulul asociat si stabileste valoarea True pentru HasModule. Referirea la proprietatea Module a unei forme în executie (run-time) pentru care HasModule este False produce eroare.

Proprietatea RecordSource (Form Object)

Prin proprietatea aceasta se leaga o tabela sau o interogare (query) 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.

Module atasate formelor

146

Page 147: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 când 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, creând mai întâi 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.

Crearea formelor în timpul executiei

Pentru generarea unei forme în timpul executiei (run-time) se poate utiliza functia CreateForm. Functiile asociate sunt CreateControl si DeleteControl 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 Module. De exemplu, metoda CreateEventProc 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 InsertText, AddFromFile, AddFromString 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.InsertLines 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

Page 148: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Resume Exit_CreateFormWithCodeEnd Function

O discutie ceva mai ampla se gaseste la sectiunea dedicata colectiei Modules.

Colectia 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:

Obiectul sau colectia

Este continut(a) în Contine

Report (obiect) Reports Colectia Controls

Colectia Properties

Obiectul Module

Reports (colectie) Application Obiecte Report

Obiectele Report au caracteristici similare cu obiectele Form.

Referirea obiectelor Report

Pentru a referi un raport trebuie ca acesta sa fie deschis, operatiune realizata prin metoda OpenReport a obiectului DoCmd.

Referintele se returneaza în mod uzual, dupa unul dintre modelele:

Dim rpt As Report ' defineste variabila obiect rpt de tip ReportSet rpt = Reports!Invoice ' referinta prin nume cunoscutSet rpt = Reports("Invoice") ' referinta prin sirul care contine numeleSet rpt = Reports(0) ' referinta prin indicele din colectie (bazat pe zero)

Module 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 pâna când nu este referit:

o click Code de pe meniul View când 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, creând mai întâi modulul daca el nu exista.

Crearea rapoartelor în timpul executiei (run time)

148

Page 149: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru crearea programatica a rapoartelor se utilizeaza functie CreateReport. Controalele se pot adauga sau elimina, în run time, prin functiile CreateReportControl sau DeleteReportControl.

Functiile CreateForm, CreateReport

Sintaxa apelurilor este

CreateForm([database[, formtemplate]])

CreateReport([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 CurrentDb). 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 Forms/Reports din dialogul Options deschis de comanda Options din meniul Tools.

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.

Functiile CreateControl, CreateReportControl

Ambele functii creeaza un control cu atributele specificate pe o forma, respectiv pe un raport. Atât forma cât si raportul trebuie sa fie deschise. Sintaxa este

CreateControl(formname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])

CreateReportControl(reportname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]])

unde

formname, reportname 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, acImage, acCommandButton, acOptionButton, acCheckBox, acOptionGroup, acBoundObjectFrame, acTextBox, acListBox, acComboBox, acSubform, acObjectFrame, acPage, acPageBreak, acCustomControl, acToggleButton, acTabCtl.

section este o constanta identificând sectiunea. Poate fi o constanta dintre

Constanta Semnificatia

acDetail (Default) Detail section

acHeader Form or report header

149

Page 150: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 începând 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 câmpului 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 stânga sus, în twips.

width, height sunt expresii numerice indicând latimea si înaltimea controlului, în twips.

Functiile CreateControl si CreateReportControl pot fi utilizate doar în modul de vizualizare Design (vezi si efectul functiilor CreateForm, CreateReport). Î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 câmp 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 câmp daca nu sunt continute într-un grup de optiuni (option group).

La legarea unui câmp, proprietatile controlului sunt modificate automat pentru a se conforma proprietatilor corespunzatoare ale câmpului.

Pentru a înlatura un control se vor utiliza instructiunile DeleteControl si DeleteReportControl cu sintaxa

DeleteControl formname, controlname

DeleteReportControl reportname, controlname

Semnificatia argumentelor este evidenta.

Exemplu de creare a unui raport

150

Page 151: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 ISAM (Msexcl35.dll). Daca nu este instalat, se va executa Setup pentru a-l instala. Driver-ul Microsoft Excel ISAM permite fisierelor Excel 97 sa lucreze cu motorul de baze de date Microsoft Jet.

' se introduce în sectiunea Declarations a modululuiDim appAccess As New Access.Application Sub PrintReport () Dim rpt As Access.Report, ctl As Access.TextBox Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field Dim strDB As String, intLeft As Integer ' se 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 ISAM 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 câmp din tabela For Each fld In tdf.Fields Set ctl = appAccess.CreateReportControl (rpt.Name, acTextBox, , , _ fld.Name, intLeft) intLeft = intLeft + ctl.Width Next fld ' deschiderea raportului în Print Preview appAccess.DoCmd.OpenReport rpt.Name, acViewPreview ' restaurarea raportului app.Access.DoCmd.Restore ' afisarea Access-ului ca aplicatia activa AppActivate "Microsoft Access"End Sub

151

Page 152: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Colectia Controls

Un obiect Control reprezinta un control de pe o forma sau dintr-un raport Access. Obiectele Control sunt grupate în colectia Controls. Legaturile în ierarhia de obiecte Access sunt date în tabelul urmator.

Obiectul sau colectia

Este continut(a) în Contine

Control (obiect) Controls Colectia Controls când controlul este un grup de optiuni (option group) sau un control tab.

Colectia Properties

Obiect Hyperlink

Obiecte Control

Controls (colectie) Obiecte Form

Obiecte Reports

Obiecte Control, doar pentru obiectele: option group, tab control, text box, option button, toggle button, check box, combo box, list box, command button, bound object frame, unbound object frame.

Obiecte Control

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 OLE sau custom controls).

Controale 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.

Controlul Descriere

BoundObjectFrame Afiseaza o imagine, diagrama sau obiect OLE memorat într-o tabela Access.

CheckBox Indica selectarea unei optiuni

152

Page 153: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ComboBox Combina lista ascunsa si o caseta text.

CommandButton Un buton cu rol de pornire a unei operatiuni atunci când se efectueaza click pe el.

Image Afiseaza o imagine.

Label Afiseaza un text explicativ.

Line Afiseaza o linie orizontala, verticala sau diagonala

ListBox Afiseaza o lista de valori.

ObjectFrame Afiseaza o imagine, diagrama sau obiect OLE care nu este memorat într-o tabela.

OptionButton Indica daca o optiune este selectata (buton radio).

OptionGroup Afiseaza un set de optiuni.

Page Afiseaza controale pe o pagina a unui control tab.

PageBreak Marcheaza începutul unui nou ecran sau a unei pagini tiparite.

Rectangle Afiseaza un dreptunghi.

SubForm/SubReport Afiseaza o forma în interiorul altei forme sau un raport în interiorul altui raport.

TabControl Afiseaza pagini multiple, fiecare continând o multime de controale.

TextBox Afiseaza date de tip text.

ToggleButton Indica daca o optiune este selectata sau nu (on/off) prin imaginea unui buton apasat sau nu.

Controale ActiveX

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. Instalarea controlului se cere la instalarea Microsoft Access.

153

Page 154: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Internet Explorer).

Referirea obiectelor Control

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 Control 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 EmployeesSet txt = Me!LastName ' similar exemplului precedent, dar referinta este ' în forma care se executa curentSet txt = Me![Last Name] 'daca numele contine spatiiSet ctl = Me.Controls(0) ' prin indice, bazat pe zeroSet ctl = Me.Controls("LastName")

Proprietatile obiectului Control

Datorita marii varietati de controale, proprietatile sunt foarte numeroase (de exemplu Text Box Control are peste 50 de proprietati) încât aici se discuta doar doua care merita o atentie speciala.

Proprietatea Hyperlink (Control Object)

Prin aplicarea proprietatii este returnata o referinta la un obiect Hyperlink, 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 Hyperlink sunt combo box, command button, image, label si text box. Fiecare poate afisa o hiperlegatura pe care utilizatorul o poate clicka pentru navigare. Atunci când se dispune de o referinta la un obiect Hyperlink dintr-un control, utilizarea metodei Follow (a obiectului Hyperlink) 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 Integer = 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

Page 155: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Exit Function Error_ FollowControlHyperlink: If Err = conNoHyperlink Then FollowControlHyperlink = False End If Resume Exit_ FollowControlHyperlinkEnd Function

Proprietatea ControlType (Control Object)

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 acImage

acCommandButton acOptionButton AcCheckBox acOptionGroup

acBoundObjectFrame acTextBox AcListBox acComboBox

acSubform acObjectFrame AcPage acPageBreak

acCustomControl acToggleButton AcTabCtl

cu interpretari imediate.

Urmatorul exemplu verifica proprietatea ControlType pentru fiecare control de pe o forma si stabileste proprietatea Locked 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 In frm.Controls ' se prelucreaza doar controalele Text Box si Combo Box If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then ctl.Locked = True End If Next ctl ' returneaza True pentru succes LockTextControls = True Exit_LockTextControls: Exit Function Error_LockTextControls: MsgBox Err & ": " & Err.Description LockTextControls = False Resume Exit_ LockTextControlsEnd Function

155

Page 156: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Controale legate de date (Data-Bound Controls)

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 ControlSource prin care se fixeaza numele câmpului 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 RecordSource a formei/raportului pentru a specifica tabela, interogarea sau instructiunea SQL care furnizeaza date formei/raportului.

Exemplul urmator stabileste proprietatea RecordSource a unei forme si proprietatea ControlSource 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

Controale care au o colectie Controls

Tab control si Option group control au, la rândul lor, o colectie Controls care poate contine mai multe controale.

Colectie Controls apartinând unui grup de optiuni contine controale de tip options button, check box, toggle button sau label.

Controlul Tab contine o colectie Pages reprezentând paginile controlului (vezi figura urmatoare). Colectia Pages contine obiecte Page care sunt controale (au ControlType = acPage).

Fiecare obiect Page are colectia Controls 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 Controls cu cel mult un element: label reprezentând eticheta atasata controlului.

Colectia Modules

Un obiect Module reprezinta un modul din Microsoft Access. Toate obiectele Module sunt incluse în colectia Modules, membru al obiectului Application. S-a vazut ca un obiect Form sau Report poate sa contina de asemenea un singur obiect Module.

Multimea tuturor modulelor dintr-o baza de date Microsoft Access constituie proiectul Visual Basic al bazei de date. Colectia Modules contine doar modulele deschise curent în proiect. Modulele care nu sunt deschise pentru editare nu sunt incluse în colectia Modules.

Pentru a deschide un modul în Visual Basic se utilizeaza metoda OpenModule a obiectului DoCmd.

Relatiile stabilite de ierarhia de obbiecte sunt

156

Page 157: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectul sau colectia

Este continut(a) în Contine

Module (obiect) Colectia Modules

Obiecte Form

Obiecte Report

(Nimic)

Modules (colectie) Obiectul Application Obiecte Module

Referirea la obiecte Module

Accesul la un modul se obtine prin intermediul colectiei, în mod uzual. Astfel

Dim mdl As ModuleSet 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.

Module standard si module clasa

Reamintim câteva 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 Modules 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 Sub si Function definite într-un modul de clasa devin metode ale obiectului definit iar price procedura de tip Property Let, Property Get si Property Set 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 oricâte proceduri utilizate doar în modulul clasa respectiv.

Proprietatile obiectului Module

O descriere sumara a proprietatilor este continuta în tabelul urmator. Explicatii detaliate se obtin din Help.

157

Page 158: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proprietatea Descriere Observatii

Application Returneaza o referinta la obiectul Application.

Permite obtinerea accesului la ierarhia de obiecte Access.

CountOfDeclarationLines Returneaza numarul de linii de cod din sectiunea Declarations a modulului.

Long, numaratoarea începe cu 1

CountOfLines 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)

Name Da numele modulului

Parent Returneaza o referinta la obiectul sau colectia care contine modulul

ProcBodyLine Returneaza numarul liniei la care începe definirea procedurii

object.ProcBodyLine( _ procname, prockind)

ProcCountLines Returneaza numarul de linii dintr-o procedura

object.ProcCountLines( _ procname, prockind)

ProcOfLine Returneaza numele procedurii care contine o linie specificata

object.ProcOfLine( _

line, pprockind)

ProcStartLine Returneaza numarul liniei la care începe o procedura

object.ProcStartLine( _

procname, prockind)

Type Indica tipul modulului AcStandardModule sau

0, acClassModule sau 1.

Determinarea numarului de linii dintr-un modul

Liniile unui modul sunt numarate începând cu 1. Numarul ultimei linii dintr-un modul este egal cu valoarea proprietatii CountOfLines. Numarul ultimei linii din sectiunea Declarations a unui modul este egal cu valoarea proprietatii CountOfDeclarationLines.

Numerele de linii nu apar efectiv în modul, ele sunt utilizate doar pentru referinte.

Lucrul cu procedurile

158

Page 159: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proprietatile Lines, ProcBodyLine, ProcCountLines, ProcOfLine si ProcStartLine sunt utilizate pentru a obtine informatii despre procedurile unui modul. Procedurile pot fi de tip Sub, Function, Property Get, Property Let sau Property Set. Primele doua tipuri sunt considerate de acelasi tip, ultimele trei privesc crearea de proprietati într-un modul clasa.

Proprietatea ProcBodyLine returneaza numarul liniei la care începe definirea procedurii, adica linia care include o instructiune Sub, Function sau Property Get/Let/Set.

Proprietatea ProcLineStart returneaza numarul liniei care urmeaza dupa separatorul de proceduri, daca sunt selectate optiunile Full Module View si Procedure Separator în fisa Module din dialogul Option (meniul Tools). Acest numar poate fi diferit de cel returnat de ProcBodyLine, deoarece sunt considerate si liniile comentariu, vide etc din fata liniei de definire. ProcStartLine 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 ProcLineInfo(strModuleName As String, _ strProcName As String) As Boolean Dim mdl As Module Dim lngStartLine As Long, lngBodyLine As Long Dim lngCount As Long, lngEndProc As Long On Error GoTo Error_ProcLineInfo ' Se deschide modulul specificat DoCmd.OpenModule strModuleName ' 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_ProcLineInfo: Exit Function Error_ProcLineInfo: MsgBox Err & " :" & Err.Description

159

Page 160: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ProcLineInfo = False Resume Exit_ProcLineInfoEnd Function

Procedura poate fi apelata, de exemplu, din baza de date exemplificatoare Northwind prin

Sub GetProcInfo() ProcLineInfo "Utility Functions", "IsLoaded"End Sub

Metodele obiectului Module

Tabelul urmator contine o sinteza a metodelor obiectului Module.

Metoda Descriere

AddFromFile Adauga la modul continutul unui fisier text.

AddFromString Adauga modulului continutul unui sir de caractere.

CreateEventProc Creeaza o procedura eveniment într-un modul clasa.

DeleteLines Elimina din modul liniile specificate.

Find Gaseste, într-un modul, textul specificat.

InsertLines Insereaza o linie sau un grup de linii de cod la o pozitie specificata din modul.

ReplaceLines Inlocuieste o linie dintr-un modul cu textul specificat.

Adaugare de text la un modul

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 InsertLines 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 RunCommand a obiectului Application (comanda Module 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

Page 161: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Function AddFromTextFile(strFileName) As Boolean Dim strModuleName As String, intPosition As Integer Dim intLength As Integer Dim mdl As Module ' memorarea numelui de fisier într-o variabila strModuleName = strFileName

' eliminarea caii din numele fisierului Do ' gasirea caracterului \ intPosition = InStr(strModuleName, "\") If intPosition = 0 Then Exit Do Else intLength = Len(strModuleName) ' eliminare cale din sir strModuleName = Right (strModuleName, Abs(intLength – intPosition)) End If Loop ' eliminarea extensiei intPosition = InStr(strModuleName, ".") If intPosition > 0 Then intLength = Len(strModuleName) strModuleName = Left(strModuleName, intPosition –1) End If ' Crearea modulului nou RunCommand acCmdNewObjectModule ' salvarea modulului DoCmd.Save , strModuleName ' returnarea referintei la obiectul Module Set mdl = Modules(strModuleName) ' adaugarea fisierului text mdl.AddFromFile strFileName ' salvarea modulului modificat DoCmd.SaveEnd Function

Observatie. 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.

Evenimentele unui modul clasa

Modulele de clasa, care nu sunt asociate cu o forma sau un raport, au doua evenimente: Initialize si Terminate.

Evenimentul Initialize se declanseaza la crearea unei noi instante a obiectului.

Terminate apare atunci când se elimina un obiect utilizator din memorie.

161

Page 162: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru a crea procedurile de raspuns la evenimente, se deschide modulul clasa, se selecteaza Class în boxa Object si se alege Initialize sau Terminate în lista Procedure.

Evenimentele pot fi utilizate, de exemplu, pentru a initializa o variabila la nivel de modul o data cu crearea obiectului.

Colectia 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 corespunzând unei referinte selectate în dialogul References (meniul Tools).

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.

Obiectul sau colectia

Este continut(a) în Contine

Reference (obiect) References (nimic)

References (colectie)

Application Obiecte Reference

Referirea obiectelor 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 ReferenceSet ref = References!VBASet ref = References("VBA")Set ref = References(1) ' de remarcat ca numerotarea ' colectiei References începe cu 1

Proprietatile obiectului Reference

Tabelul urmator prezinta pe scurt proprietatile obiectului Reference.

Proprietatea Descriere

BuiltIn Indica daca referinta este implicita, necesara bunei functionari a aplicatiei Microsoft Access.

Collection Returneaza o referinta la colectia References.

FullPath Returneaza calea si numele de fisier al proiectului referit sau al bibliotecii de obiecte.

162

Page 163: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

GUID Returneaza identificatorul global unic (GUID – Globally Unique Identifier) al proiectului referit sau al bibliotecii de obiecte. Un GUID este memorat în registry-ul Windows.

IsBroken Indica daca referinta puncteaza catre o referinta valida.

Kind Indica daca obiectul Reference puncteaza la un proiect Visual Basic (valoarea Project sau 1) sau la o biblioteca (TypeLib sau 0).

Major Returneaza valoarea din stânga punctului zecimal din numarul de versiune al fisierului referit.

Minor Returneaza valoarea din dreapta punctului zecimal din numarul de versiune al fisierului referit.

Name Returneaza numele proiectului sau al bibliotecii de obiecte catre care duce referinta.

Metodele colectiei References

Obiectul Reference nu are asociate metode. Metodele colectiei References sunt

Metoda Descriere

AddFromFile Creeaza o referinta la un fisier care contine un proiect sau o biblioteca de obiecte.

References.AddFromFile(filename)

AddFromGUID Creeaza o referinta la un proiect sau biblioteca de obiecte pornind de GUID-ul fisierului, memorat în registry.

Object.AddFromGUID(guid)

Item Returneaza un element particular al colectiei References.

Remove Elimina un obiecte Reference din colectia References.

Stabilirea unei referinte în Visual Basic

163

Page 164: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Primele doua metode enumerate în tabelul precedent, AddFromFile si AddFromGUID, 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 = 32813On 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: If Err <> conReferenceExists Then MsgBox Err & ": " & Err.Description End If AddReference = False Resume Exit_AddReferenceEnd FunctionApelul acestei functii poate fi efectuat dupa modelul Sub SetSolutionsReferences () Const strRefPath As String = "C:\Program Files\Microsoft Office" _ & "\Office\Samples\Solutions.mdb" If AddReference (strRefPath) = True Then MsgBox "Reference set successfully." Else MsgBox "Reference not set successfully." End IfEnd Sub

Obiectul DoCmd

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 neavând proprietati si evenimente.

Sintaxa este

[application.]DoCmd.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

Page 165: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• AddMenu. • MsgBox. Se utilizeaza functia MsgBox. • RunApp. Se utilizeaza functia Shell pentru a executa alta aplicatie. • RunCode. Se executa functia direct în Visual Basic (instructiunea Call). • SendKeys. Se utilizeaza instructiunea SendKeys. • SetValue. Se stabileste valoarea direct în Visual Basic (instructiunea Let). • StopAllMacros. Se utilizeaza instructiunile Stop sau End. • StopMacro. Se utilizeaza instructiunile Exit Sub sau Exit Function.

Important! Pentru o lista completa a actiunilor, care coincide, excepând cele enumerate, cu lista metodelor obiectului, se va urma: Help – DoCmd Object – Action Constants (lista alfabetica a actiunilor) sau actions, reference topics (actiuni grupate pe categorii). Pentru explicatii complementare se va urmari atât subiectul privind metoda cât si subiectul privind actiunea sinonima.

Pentru exemplificare prezentam doua metode ale obiectului DoCmd.

Metoda OpenForm

Se executa din Visual Basic actiunea OpenForm. Sintaxa este

DoCmd.OpenForm 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 întâi în baza de date biblioteca si apoi în baza curenta.

view este modul de vizualizare Access si poate avea una din valorile: acDesign, acFormDS, acNormal (default), acPreview. 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 cuvântul WHERE.

datamode este una dintre constantele: acFormAdd, acFormEdit, acFormPropertySettings (default), acFormReadOnly. Argumentul fixeaza modul de acces la date (adaugare, editare etc.). Argumentele acopera proprietatile AllowEdits, AllowDeletions, AllowAdditions si DataEntry ale formei, proprietatile sunt considerate în modul implicit (acFormPropertySettings).

windowmode stabileste modul de afisare a ferestrei formei. Poate fi o constanta: acDialog (proprietatile Modal si PopUp ale formei sunt Yes), acHidden (forma este ascunsa), acIcon (forma este minimizata), acWindowNormal (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).

Metoda RunCommand

Prin aceasta metoda, aplicabila obiectului Application sau DoCmd, se executa o comanda dintr-un meniu predefinit sau dintr-o bara de unelte. Sintaxa este

[object.]RunCommand command

165

Page 166: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

unde

object este Application sau DoCmd, optional.

command este o constanta intrinseca specificând 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 RunCommand.

Obiectul Screen

Obiectul Screen 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 ActiveForm pentru a returna o referinta la forma din fereastra activa, fara a sti numele formei.

Obiectul Screen nu poate fi utilizat pentru activarea formei, raportului sau controlului. Acest efect se obtine prin metoda SelectObject a obiectului DoCmd.

Referirea la Screen atunci când nu exista nici o forma activa, raport sau control, produce o eroare de executie.

Proprietatile obiectului Screen

Tabelul urmator contine proprietatile obiectului Screen.

Proprietatea Descriere

ActiveControl Returneaza o referinta la controlul care are focusul.

ActiveDatasheet Returneaza o referinta la foaia de date care are focusul.

ActiveForm Returneaza o referinta la forma care are focusul.

ActiveReport 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 Screen.

PreviousControl Returneaza o referinta la controlul care a avut anterior focusul.

Tipul de pointer poate fi:

166

Page 167: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Valoare Explicatie

0 (Default) Forma pointerului este determinatade Microsoft Access

1 Normal Select (Arrow)

3 Text Select (I-Beam)

7 Vertical Resize (Size N, S)

9 Horizontal Resize (Size E, W)

11 Busy (Hourglass)

Potrivit celor spuse anterior, utilizarea obiectului Screen trebuie sa implementeze si tratarea erorilor deoarece daca obiectul asteptat nu are focusul, atunci se produce o eroare. Este de preferat sa se utilizeze mai întâi metoda SetFocus pentru a focaliza obiectul dorit si apoi sa se utilizeze Screen. Metoda SetFocus este cea asociata formei, raportului, controlului tinta. Este interzisa utilizarea obiectului Screen cu metoda OutputTo (care produce iesirea unor date pe o forma, raport etc.) a obiectului DoCmd.

Este de notat ca proprietatea ActiveForm si proprietatea Me nu produc în mod necesar aceeasi referinta. Me reprezinta forma în care se executa curent codul, pe când ActiveForm 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 ActiveForm se refera la forma activa pe ecran când 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.TimerInterval = 30000End Sub Private Sub Form_Timer () Const conFormNotActive As Integer = 2475 Const conFormInDesignView As Integer = 2478 On Error GoTo Error_Timer ' reconsulta sursa de date pentru forma activa Screen.ActiveForm.Requery Exit_Timer: Exit Sub Error_Timer: If Err = conFormNotActive Or Err = conFormInDesignView Then Resume Exit_Timer Else MsgBox Err & ": " & Err.Description End IfEnd Sub

167

Page 168: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Observatie. Intervalul de timp, din proprietatea TimerInterval este în milisecunde, instructiunea Me.TimerInterval = 30000 stabileste prin urmare declansarea evenimentului la fiecare 30 de secunde. Stabilirea intervalului se efectueaza în procedura evenimentului Load.

168

Page 169: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

DAO (Data Access Objects) (I)

Lucrul cu obiectele 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 ODBCUtilizare Dao cu Microsoft Jet Obiectul DBEngine Colectia Workspaces Metoda CreateWorkspace Colectia Errors Colectia Databases Colectia TableDefs Colectia Fields Colectia Indexes 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 obiectele 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.

Observatie. 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.

Obiect Descriere

Connection Conectarea prin retea la o baza de date Open Database Connectivity (ODBC).

Container Informatii de securitate pentru diferite tipuri de obiecte

169

Page 170: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ale bazei de date.

Database Baza de date deschisa.

DBEngine Obiectul cel mai de sus al ierarhiei.

Document Informatia de securitate pentru obiecte individuale din baza de date.

Error Informatii de eroare privind accesul la date.

Field Câmp în obiecte TableDef, QueryDef, Recordset, Index, Relation.

Group Contul grupului în baza curenta.

Index Indexul tabelei.

Parameter Parametru de interogare.

Property Proprietate a unui obiect.

QueryDef Definitia unei interogari salvate în baza de date.

Recordset Multime de înregistrari definite de o tabela sau de o interogare.

Relation Legatura (relatia) dintre doua câmpuri de tabel sau interogari.

TableDef Definitia unei tabele salvate în baza de date

User Contul utilizatorului în grupul de lucru curent.

Workspace Sesiunea DAO activa.

Proiectarea bazelor de date în 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 Când 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

Page 171: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 CurrentDb 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 încât sa se utilizeze metoda OpenDatabase a obiectului Workspace.

o Microsoft Access creeaza proprietati suplimentare ale obiectelor DAO. Atunci când 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.

Stabilirea unei referinte la biblioteca de obiecte DAO

Referinta se poate realiza în mod automat, de exemplu de catre Microsoft Access, sau manual prin succesiunea uzuala: Visual Basic Editor – meniul Tools – References – selectare Microsoft DAO 3.5 Object Library. Dupa stabilirea referintei se pot vedea obiectele DAO în Object Browser selectând DAO în lista Project/Library.

Pentru anumite probleme de compatibilitate, pentru proiectele mai vechi, se poate referi Microsoft DAO 2.5/3.5 compatibility library. Proba 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 obiectelor DAO în 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 Name a obiectului respectiv sau • prin numarul de ordine din colectie. Obiectele DAO sunt indexate plecând cu 0.

Exemple:

Databases("Salariati")Databases(0)

Referirea unui obiect Database în cod se realizeaza si prin pozitionarea în ierarhie:

Dim dbs As DatabaseSet dbs = DBEngine.Workspaces(0).Databases(0)

prin care se obtine o referinta la prima baza de date (indicele 0 din colectia Databases) din prima zona de lucru (indicele 0 din colectia Workspaces), 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 OpenDatabase mai înainte de a rula codul precedent.

Pentru aplicatiile diferite de Access, calificarea obiectelor poate produce mai multa claritate, plus certitudinea referii corecte:

171

Page 172: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Dim dbs As DAO.Database

Adaugarea de noi obiecte 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 când este nevoie de ele.

Crearea unui nou obiect DAO care trebuie salvat cu baza de date se va completa cu utilizarea metodei Append a colectiei asociate de obiecte salvate.

Exemplul urmator da o imagine despre acest proces. Exmplul creeaza un nou obiect TableDef (care reprezinta o noua tabela) cu un nou obiect Field (care reprezinta un câmp din noua tabela). Obiectul Field creat se adauga la colectia Fields a noii tabele iar noul obiect TableDef este adaugat la colectia TableDefs a obiectului Database 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("ArchivedInvoices") Set fld = tdf.CreateField("OrderId", 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_AddTableEnd Function

Observatie. În Access se va utiliza CurrentDb pentru a returna o referinta la baza de date curenta deschisa.

Lucrul cu date externe

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, incluzând cele create în Microsoft Access, Microsoft Visual Basic, Microsoft Visual C++ si Microsoft Excel.

172

Page 173: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

A doua categorie este caracterizata de formatul ISAM instalabil. Un driver ISAM 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.

Utilizare DAO cu surse de date ODBC

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 ISAM, 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 când sunt necesare avantajele Jet: abilitatea de a crea sau modifica obiecte, unirea datelor din mai multe formate de baze de date.

Se poate utiliza ODBCDirect atunci când se executa interogari sau proceduri memorate pe un server back_end cum ar fi Microsoft SQL Server, sau când 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

Page 174: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Utilizare DAO cu Microsoft Jet

Spatiile de lucru Microsoft Jet includ obiecte pentru definirea structurii bazei de date, cum ar fi TableDef, QueryDef, Field, Index, Parameter si Relation. Alte obiecte, cum ar fi Recordset, sunt utile pentru procesarea datelor din baza. O a treia categorie de obiecte, cum ar fi User, Group, Container 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".

In 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.

Obiectul DBEngine

Obiectul DBEngine, de nivel maxim în ierarhia de obiecte DAO, este obiectul implicit al modelului, astfel încât mentionarea lui explicita poate fi omisa în multe situatii.

Pe nivelul imediat inferior al ierarhiei se gasesc doua colectii: Workspaces – spatiile de lucru, Errors – erorile aparute în timpul unei operatiuni DAO. Colectia Workspaces este implicita si referinta la ea poate fi omisa.

O referinta la primul obiect Workspace din colectia Workspaces 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

DefaultType Long, determina tipul spatiului de lucru:

dbUseJet –Microsoft Jet database engine

dbUseODBC – ODBC data source

DefaultUser,

DefaultPassword

Siruri, numele utilizatorului si parola

IniPath Sir, informatia despre cheia din Windows Registry care contine valorile pentru Microsoft Jet database engine (numai spatiile de lucru Microsoft Jet).

174

Page 175: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

LoginTimeout Întreg, timpul cât se asteapta intrarea unu utilizator.

SystemDB Sir, calea pentru localizarea curenta a fisierului cu informatia despre grupurile de lucru, workgroup (doar spatii Microsoft Jet).

Version Sir, informatii despre versiunea DAO.

Daca nu se creeaza un obiect Workspace specific, un asemenea obiect este creat în mod automat de DAO atunci când este necesar. Atributele implicite ale acestui spatiul sunt DefaultUser egal cu Admin iar DefaultPassword egal cu sirul vid "".

În mod implicit, proprietatea DefaultType 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

Metoda Descriere

BeginTrans,CommitTrans,Rollback

Metodele care controleaza efectuarea tranzactiilor.

CompactDatabase,RepairDatabase

Compactarea bazei de date, refacerea unei baze deteriorate.

CreateDatabase,CreateWorkspace

Crearea unei baze de date sau a unui spatiu de lucru.

Idle Suspenda procesarea datelor din baza

OpenConnection,OpenDatabase

Deschide si returneaza o referinta la un obiect Connection, respectiv Database.

RegisterDatabase Completeaza în Windows Registry informatia ODBC.

SetOption Î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.

Colectia Workspaces

Obiectul DAO Workspace defineste o sesiune pentru un utilizator, bazata pe permisiunile (drepturile) utilizatorului. Se utilizeaza obiectul Workspace pentru a gestiona sesiunea curenta. Workspace contine bazele de date deschise si ofera mecanismul necesar tranzactiilor si securitatii aplicatiei. Colectia Workspaces contine toate obiectele active Workspace din DBEngine, care au fost adaugate colectiei.

175

Page 176: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 WorkspaceSet wrk = Workspaces (0)

adica se refera primul obiect din colectie.

Spatiile de lucru DAO pot fi partajate sau ascunse. Un spatiu este ascuns pâna când utilizatorul îl marcheaza drept partajat prin adaugarea obiectului Workspace la colectia Workspaces. Dupa adaugare, spatiul este accesat prin intermediul colectiei. Un obiect Workspace necesar doar pentru o procedura particulara se poate crea dar fara adaugarea la colectia Workspaces.

Dupa cum s-a mai spus, exista doua tipuri de obiecte Workspace: 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 ISAM 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.

Crearea unui spatiu Microsoft Jet

Se utilizeaza metoda CreateWorkspace a obiectului DBEngine. Exemplul urmator utilizeaza constanta de tip dbUseJet. Daca proprietatea DefaultType este fixata pe dbUseJet, atunci argumentul de tip nu este necesar si se creeaza în mod automat un spatiu Microsoft Jet.

Dim wrk As WorkspaceSet 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 Workspaces, pentru aceasta se va utiliza metoda Append a colectiei. Acest lucru este necesar atunci când spatiul nou definit este utilizat si în afara procedurii unde a fost creat.

Metoda CreateWorkspace (obiectul DBEngine)

Sintaxa

Set workspace = CreateWorkspace(name, user, password, type)

unde

workspace este o variabila obiect care reprezinta obiectul Workspace 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 Workspace.

password contine parola pentru noul obiect Workspace, un sir pâna la 14 caractere cu exceptia lui null.

type este optional si stabileste tipul spatiului (dbUseJet, dbUseODBC)

176

Page 177: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Dupa utilizarea metodei este creat obiectul Workspace, începe o noua sesiune si obiectul poate fi referit în cod. Obiectele Workspace nu sunt permanente, nu se pot salva iar proprietatea Name nu mai poate fi modificata dupa trecerea obiectului în colectia Workspaces.

Daca tipul este stabilit la dbUseODBC 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 Connection.

Pentru a elimina un obiect Workspace din colectia Workspaces, se închid toate bazele de date si conexiunile si apoi se utilizeaza metoda Close a obiectului Workspace.

Colectia Errors (obiectul 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 formând colectie Errors. Atunci când 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 Count, care da numarul elementelor din colectie • metoda Refresh, care actualizeaza colectia potrivit situatiei curente.

Obiectul Error nu are decât proprietatile (nu contine metode sau colectii)

• Description, sirul care contine descrierea erorii • HelpContext, este un Long cu identificatorul de context din fisierul Help asociat • HelpFile, contine calea completa catre fisierul Help • Number, numarul (Long) al erorii. Pentru o lista completa se va vedea intrarea Trappable Microsoft Jet

and DAO Errors din Help. • Source, un sir continând numele obiectului sau aplicatiei care a generat eroarea.

Colectia Databases

Obiectul Database reprezinta o baza de date deschisa. Aceasta poate fi o baza Jet sau o sursa externa de date. Colectia Databases contine toate bazele de date deschise curent.

Situarea în ierarhie este

Obiectul sau colectia

Este continut în Contine

Database (obiect) Colectia Databases

Colectia Containers

Colectia QueryDefs

Colectia Properties

Colectia Recordsets

177

Page 178: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Colectia Relations

Colectia TableDefs

Databases (colectie)

Obiectul Workspace

Obiecte Database

Deschiderea unei baze de date

Metoda OpenDatabase, a obiectului DBEngine sau a obiectului Workspace, 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_RetriveRecordsetEnd Function

În Microsoft Access, se utilizeaza functia CurrentDb pentru a returna o referinta la baza de date curenta. Metoda OpenDatabase se utilizeaza pentru deschiderea altei baze de date decât cea curent deschisa sau pentru a deschide baze în spatiul de lucru ODBCDirect.

Dim dbs As DatabaseSet dbs = CurrentDbDebug.Print dbs.Name

Crearea cu DAO a duplicatelor unei baze de date (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 când un utilizator modifica date dintr-o

178

Page 179: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

baza duplicata, utilizatorii celorlalte replici pot sa-si sincronizeze replicile, astfel încât 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 Replicable sau proprietatea ReplicableBool a obiectului Database corespunzator. Aceste proprietati nu exista pentru obiectul Database pâna când nu sunt create prin metoda CreateProperty si adaugate la colectia Properties. Dupa permiterea replicarilor, crearea unei baze duplicat se realizeaza prin metoda MakeReplica.

Diferenta dintre proprietatile Replicable si ReplicableBool 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 Integer = 3270 On Error GoTo Err_ReplicateDatabase If InStr(strDBName, ".mdb") > 0 Then strBackup = Left(strDBName, Len(strDBName) - 4) Else strBackup = strDBName End If strReplica =strBackup & "Replica" & ".mdb" If MsgBox("Make backup copy of file?", vbOKCancel) = vbOK Then strBackup = strBackup & ".bak" FileCopy strDBName, strBackup MsgBox "Copied file to " & "strBackup" End If Set dbs = OpenDatabase (strDBName, True) dbs.Properties("ReplicaBool") = True dbs.MakeReplica strReplica, "Replica of " & strDBName MsgBox "Created replica '" & strReplica & "'." dbs.Close ReplicateDatabase = True Exit_ReplicateDatabase: Exit Function Err_ ReplicateDatabase: If Err = conPropNotFound Then Set prp = dbs.CreateProperty("ReplicableBool", dbBoolean, True) dbs.Properties.Append prp Resume Next Else MsgBox "Error " & ": " & Err.Description End If

179

Page 180: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ReplicateDatabase = False Resume Exit_ReplicateDatabaseEnd Function

Colectia TableDefs

Un obiect TableDef reprezinta definitia memorata a unei tabele din baza sau a unei tabele legate din spatiul de lucru Microsoft Jet. Toate obiectele TableDef memorate într-o baza de date formeaza colectia TableDefs. Relatiile din ierarhie sunt

Obiectul sau colectia

Este continut în Contine

TableDef (obiect) Colectia TableDefs Colectia Fields

Colectia Indexes

Colectia Properties

TableDefs (colectie)

Obiectul Database Obiecte TableDef

Crearea prin cod a unei tabele

Metoda de creare este CreateTableDef a obiectului Database. Dupa crearea unui nou obiect TableDef, dar înainte de adaugarea la baza, trebuie sa se defineasca unul sau mai multe câmpuri pentru tabela definita. Sintaxa metodei CreateTableDef este

Set tabledef = database.CreateTableDef (name, attributes, source, connect)

unde

tabledef este o variabila obiect reprezentând obiectul TableDef care se creeaza.

database este o variabila obiect reprezentând obiectul Database unde se doreste crearea noului obiect.

name este un sir optional, care contine denumirea tabelei.

attributes este o constanta sau o combinatie de constante indicând caracteristici ale tabelei. Lista este în Help - TableDef object - Attributes Property.

source este un Variant (subtip String), optional. Contine numele tabelei în baza de date externa care este sursa datelor. Sirul devine proprietatea SourceTableName 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 Connect 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

Page 181: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Index Dim rst As Recordset, intCode As Integer, strErr As String Const conAppObjErr = "Application-defined or object-defined error" ' creeaza tabela Errors cu câmpurile 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 câmpuri Set fld = tdf.CreateField("ErrorCode", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("ErrorString", dbMemo) tdf.Fields.Append fld ' creare index Set idx = tdf.CreateIndex("ErrorCodeIndex") Set fld = idx.CreateField("ErrorCode") With idx .Primary = True .Unique = True .Required = True End With idx.Fields.Append fld tdf.Indexes.Append idx ' deschidere recordset în tabela Errors Set rst = dbs.OpenRecordset("Errors") ' stabilirea indexului pentru recordset rst.Index = "ErrorCodeIndex") ' 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" If Err.Description <> conAppObjErr Then strErr = Err.Description ' se utilizeaza metoda AccessError pentru returnarea sirului descriptiv ' pentru erorile DAO si Access.

181

Page 182: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ElseIf AccessError(intCode)<>conAppObjErr Then strErr = AccessError(intCode) End If ' daca numarul de eroare are un sir descriptiv, se adauga la tabela definita If 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 If 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_CreateErrorsTableEnd Function

Legarea unei tabele la o baza de date

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 decât 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 CreateTableDef pentru a crea o noua tabela. Dupa aceea se specifica valorile pentru proprietatile Connect si SourceTableName ale noului obiect creat. Se poate stabili de asemenea proprietatea Attributes. În final se adauga tabela la colectia TableDefs.

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 ISAM (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 errNoISAM As Integer = 3170 Const conPath As String = _

182

Page 183: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

"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: If Err = errNoISAM Then Dim strErr As String strErr = Err & ": " & Err.Description strErr = strErr _ & " You may not have the ISAM driver installed properly …" MsgBox strErr, vbOKOnly, "Error!" Else MsgBox "Error " & Err & ": " & Err.Description End IfEnd Function

Colectia Fields

În spatiul de lucru Microsoft Jet, obiectul Field reprezinta un câmp dintr-o tabela, interogare, index, relatie sau recordset. Colectie Fields contine toate obiectele Field asociate, respectiv, obiectele TableDef, QueryDef, Index, Relation sau Recordset.

Localizarea în ierarhia de obiecte este

Obiectul sau colectia

Este continut în Contine

Field (obiect) Colectia Fields Colectia Properties

Fields (colectie) Obiectul TableDef

Obiectul Index

Obiectul QueryDef

Obiectul Recordset

Obiectul Relation

Obiecte Field

183

Page 184: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Colectia Fields este colectia implicita a unui obiect TableDef, QueryDef, Index, Relation sau Recordset, ceea ce înseamna ca nu trebuie facuta o referinta la colectie în mod explicit. De exemplu, urmatoarele instructiuni returneaza o referinta la câmpul LastName din tabela Employees din baza de date de test Northwind.

Dim dbs As Database, tdf As TableDef, fld As FieldConst conPath As String = _ "C:\Program Files\ … \Northwind.mdb"Set dbs = OpenDatabase(conPath)Set tdf = dbs.TableDefs("Employees")Set fld = tdf!LastName

În colectia Fields a unui obiect TableDef, QueryDef, Index sau Relation, obiectul Field este o unitate structurala. El reprezinta o coloana dintr-o tabela, având un tip particular de date. Daca se creeaza o baza de date în Microsoft Access, se pot crea câmpuri 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 Recordset, un obiect Field 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 câmpurile obiectului Recordset; trebuie sase faca apel la DAO.

Colectia Fields a obiectului TableDef contine toate câmpurile definite. Pentru un obiect QueryDef, colectia contine toate câmpurile incluse în interogare din una sau mai multe tabele. Colectia Fields a obiectului Index include câmpurile pentru care este definit indexul.

Pentru un obiect Relation, colectia contine câmpurile implicate în relatie. Tipic, exista doua câmpuri în colectia Fields: unul care este cheia primara, specificat de proprietatea Table a obiectului Relation; al doilea este câmpul extern corespunzator, din tabela specificata de proprietatea ForeignTable a obiectului Relation.

Colectia Fields a obiectului Recordset contine câmpurile specificate în argumentul source a metodei OpenRecordset. Argumentul source specifica sursa înregistrarilor pentru noul obiect Recordset si poate fi un nume de tabela, nume de interogare sau o instructiune SQL care returneaza înregistrari.

Proprietatea Value a obiectului Field se aplica doar unui obiect din colectia Fields a unui obiect Recordset. Proprietatea returneaza valoare datei memorate în acel câmp în înregistrarea curenta. Deoarece Value este proprietatea implicita a obiectului Field iar Fields este colectia implicita a obiectului Recordset, se poate returna valoarea unui câmp fara a specifica explicit fie Fields, fie Value. Exemplul urmator este sugestiv în acest sens:

Dim dbs As Database, rst As RecordsetConst conPath As String = _ "C:\Program Files\ … \Northwind.mdb"Set dbs = OpenDatabase(conPath)Set rst = dbs.OpenRecordset("Employees")' referinta explicita la colectie si valoareDebug.Print rst.Fields("LastName").Value' referinta explicita la valoareDebug.Print rst!FirstName.Value' referinte impliciteDebug.Print rst!Title

Colectia Indexes

184

Page 185: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Un obiect Index reprezinta un index dintr-o tabela a bazei de date, în spatiul de lucru Microsoft Jet. Colectia Indexes contine toate obiectele Index definite pentru o tabela particulara.

Pozitia în ierarhia de obiecte este urmatoarea:

Obiectul sau colectia

Este continut în Contine

Index (obiect) Colectia Indexes Colectia Fields

Colectia Properties

Indexes (colectie) Obiectul TableDef Obiecte Index

Un index mareste viteza de cautare si sortare a tabelei. Se poate îmbunatati performanta interogarii bazei de date prin indexarea câmpurilor pe ambele parti ale jonctiunilor, câmpuri care sunt sortate, sau câmpuri care sunt utilizate drept criterii de interogare. Totusi, indexurile pot sa mareasca dimensiunea bazei si sa încetineasca performanta când se actualizeaza câmpuri indexate, când 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 Recordset de tip tabela.

Pentru a crea un index cu DAO, operatiune posibila pentru unul sau mai multe câmpuri, trebuie

o metoda CreateIndex pentru obiectul TableDef. o metoda CreateField pentru obiectul Index cu scopul creerii unui obiect Field pentru fiecare

câmp (coloana) care se include în obiectul Index. o Stabilirea proprietatilor obiectului Index. o Metoda Append pentru fiecare obiect Field care se adauga la colectia Fields. o Metoda Append pentru adaugarea noului obiect Index la colectia Indexes.

Urmatorul exemplu este ilustrativ.

Sub SeekRecord () Const conPath As String = _ "C:\Program Files\ … \Northwind.mdb" Dim dbs As Database, tdf As TableDef, idx As Index Dim fld As Field, fldLast As Field, fldFirst As Field Dim rst As Recordset ' returnarea unei 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 câmpurile LastName si FirstName Set idx = tdf.CreateIndex("FirstLastName") ' crearea câmpurilor din index Set fldLast = idx.CreateField("LastName", dbText) Set fldFirst = idx.CreateField("FirstName", dbText) ' adaugarea obiectelor Field

185

Page 186: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

idx.Fields.Append fldLast idx.Fields.Append fldFirst ' fixarea proprietatii Required idx.Required = True ' adaugarea noului obiect index tdf.Indexes.Append idx ' deschiderea recordset-ului de tip tabela Set rst = dbs.OpenRecordset("Employees") ' fixarea proprietatii Index a obiectului Recordset rst.Index = idx.Name ' efectuarea operatiunii de cautare rst.Seek "=", "King", "Robert" ' tiparirea valorilor tuturor câmpurilor cu exceptia câmpului Photo For Each fld In rst.Fields If fld.Type <> dbLongBinary Then Debug.Print fld End If Next fldEnd Sub

Observatie. În mediul Microsoft Access se poate lucra cu multimea indexurilor în meniul View, comanda Indexes.

Colectia QueryDefs

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 QueryDef reprezinta o interogare în DAO. Obiectele QueryDef 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

Obiectul sau colectia

Este continut în Contine

QueryDef (obiect) Colectia QueryDefs Colectia Fields

Colectia Parameters

Colectia Properties

QueryDefs (colectie) Obiectul Database Obiecte QueryDef

Obiectele QueryDef ofera:

• folosirea proprietatii SQL pentru a fixa sau returna definitia interogarii; • folosirea colectiei Parameters pentru a fixa sau returna parametrii interogarii; • utilizarea proprietatii Type pentru a determina daca interogarea selecteaza înregistrarile dintr-o tabela

existenta, creeaza o noua tabela etc.; • utilizarea proprietatii MaxRecords pentru a limita numarul de înregistrari returnate de o înregistrare; • folosirea proprietatii ODBCTimeout pentru a indica timpul de asteptare a rezultatului unei interogari.

186

Page 187: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

În spatiul de lucru Microsoft Jet mai sunt posibile:

• utilizarea proprietatii ReturnRecords pentru a indica, la interogari prin SQL, returnarea de înregistrari; • utilizarea proprietatii Connect 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 API la executarea interogarii;

• utilizarea proprietatii CacheSize pentru depozitarea (cache) înregistrarilor returnate de interogare.

Obiectele QueryDef temporare nu sunt salvate pe disc si nu sunt adaugate la colectia QueryDefs. În general, interogarile temporare sunt utile atunci când frazele SQL sunt create, repetat, în timpul executiei.

Un obiect QueryDef permanent din spatiul Jet poate fi gândit ca o instructiune SQL compilata. Astfel, interogarea este mai rapida decât o instructiune SQL executata prin metoda OpenRecordset.

Pentru a crea un obiect QueryDef se utilizeaza metoda CreateQueryDef.

În spatiul Jet, daca se precizeaza numele noului obiect se creeaza un obiect QueryDef permanent si care este adaugat automat la colectia QueryDefs si salvata în disc. Daca se da implicit sau explicit un nume vid, "", atunci rezultatul este un obiect QueryDef temporar.

În spatiul ODBCDirect o interogare este întotdeauna temporara.

Colectia QueryDef contine toate obiectele QueryDef deschise. Când o interogare este închisa, ea este înlaturata automat din colectia QueryDef.

Referinta la un obiect permanent QueryDef este uzuala, prin intermediul colectiei:

QueryDefs(0)QueryDefs("name")QueryDefs![name]

Referinta la obiectele temporare QueryDef se poate obtine doar prin variabilele obiect la care s-au asignat interogarile.

Crearea interogarilor permanente

Interogarile 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 RecordsetDim 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

Page 188: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Set rst = qdf.OpenRecordset

Obiectul QueryDef nou creat nu trebuie adaugat la colectia QueryDefs, 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 QueryDef sunt întotdeauna temporare).

Colectia Parameters (QueryDef Object)

Un obiect Parameter reprezinta o valoare transmisa unei interogari. Colectia Parameters contine toate obiectele Parameter definite de un obiect QueryDef. Localizarea în ierarhia de obiecte DAO este precizata în tabelul alaturat.

Obiectul sau colectia

Este continut în Contine

Parameter (obiect) Colectia Parameters

Colectia Properties

Parameters (colectie)

Obiectul QueryDef 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] DATETIME,[ Ending OrderDate] DATETIME;

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 QueryDef 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] DATETIME, " _ & "[Ending OrderDate] DATETIME; SELECT * FROM Orders " & _

188

Page 189: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

"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 If dteStart > dteEnd Then MsgBox "Start date is later than end date." Exit Function End If qdf.Parameters("Beginning OrderDate") = dteStart qdf.Parameters("Ending OrderDate") = dteEnd ' deschiderea recordset-ului din interogare Set rst = qdf.OpenRecordset rst.MoveLast MsgBox "Query returned " & rst.RecordCount & " records." NewParameterQuery = True Exit_NewParameterQuery: rst.Close Set dbs = Nothing Exit Function Err_NewParameterQuery: MsgBox "Error " & Err & ": " & Err.Description NewParameterQuery = False Resume Exit_NewparameterQueryEnd Function

Functia poate fi apelata din fereastra Debug prin

? NewParameterQuery(#6-30-95#, #6-30-96#)

Observatie. În Microsoft Access se pot defini parametrii unei interogari în Query Design View.

Colectia Relations (obiectul Database)

Un obiect Relation reprezinta o relatie între câmpuri 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

Obiectul sau colectia

Este continut în Contine

Relation (obiect) Colectia Relations Colectia Fields

Colectia Properties

189

Page 190: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Relations (colectie) Obiectul Database Obiecte Relation

Relatii între tabele

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 câmpuri (denumite câmpuri cheie, de regula cu acelasi nume) din doua tabele. În acest mod înregistrarile celor doua tabele pot fi coordonate încât înregistrarile curente sa contina informatii corelate dupa câmpurile asociate.

Relatia lucreaza prin potrivirea valorilor câmpurilor cheie. În cele mai multe cazuri, câmpurile 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 câmpuri 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 câmpuri sau izolarea unei parti a tabelei.

Modul de relatie creat de Microsoft Access depinde de definirea câmpurilor care sunt puse în relatie (chei primare, indexuri unice etc.).

Obiectul 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, când sa se forteze integritatea referentiala (integritatea referentiala – Referential 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 când 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

Page 191: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Adaugarea unui obiect Relation la colectia Relations, se va crea obiectul prin metoda CreateRelation si se adauga la colectie prin metoda Append. Astfel, obiectul Relation este salvat o data cu obiectul Database. 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 câmpuri 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 Name pentru a referi relatia dintre câmpurile 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 Attributes pentru a determina daca relatia dintre câmpuri este one-to-one si cum sa se impuna integritatea referentiala. De asemenea, tot prin Attributes, se poate determina daca motorul Microsoft Jet poate efectua actualizarea în cascada si stergerea în cascada în tabelele legate prin relatii.

• Utilizarea proprietatii Attributes pentru a determina daca relatia este asociere stânga (left join, include toate înregistrarile din prima tabela – din stânga – 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 stânga relatiei).

• Utilizarea proprietatii Name a obiectelor Field din colectia Fields a obiectului Relation pentru a stabili sau returna numele câmpurilor din cheia primara a tabelei referite, sau setarile proprietatii ForeignName a obiectelor Field pentru a stabili sau returna denumirile câmpurilor din cheia externa a tabelei care face referinta.

Un obiect Relation are o colectie Fields care contine doua câmpuri, câte unul în fiecare tabela a relatiei.Câmpurile relatiei trebuie sa aiba acelasi tip de data si trebuie sa aiba valori comune. Se vor utiliza proprietatile Table si ForeignTable 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 câmpul din legatura este cheia primara. Prin urmare proprietatea Table trebuie sa fie numele acestei tabele. Tabela de pe partea "side" a relatiei este tabela în care câmpul legat este cheie externa iar numele tabelei se va da proprietatii ForeignTable.

Urmatorul exemplu creeaza o relatie între tabelele Employees si Orders din baza de date de test Northwind. Cele doua tabele sunt unite prin câmpul EmployeeID care este cheie primara în baza Employees – toate valorile acestui câmp 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

Page 192: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

' gasirea unei relatii EmployeesOrders deja existente For Each rel In dbs.Relations If rel.Table = "Employees" And rel.ForeignTable = "Orders" Then ' mesaj de stergere a relatiei existente If MsgBox(rel.Name & " already exists. " & vbCrLf _ & "This relation will be deleted and re-created.", vbOK) = vbOK Then dbs.Relations.Delete rel.Name Else ' daca utilizatorul raspunde cu Cancel Exit Function End If End If 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 câmp în colectia Fields a obiectului Relation, la creare se fixeaza Name Set fld = rel.CreateField("EmployeeID") ' numele pentru câmpul extern fld.ForeignName = "EmployeeID" ' 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_NewRelationEnd Function

Observatie. În Microsoft Access se lucreaza cu relatiile prin meniul Tools – Relationships.

192

Page 193: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

DAO (Data Access Objects) (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 PropertiesAccesarea datelor ODBC Utilizarea Microsoft Jet pentru date ODBC Utilizarea ODBCDirect pentru date ODBC Înregistrarea unei surse de date ODBC Utilizarea DAO cu ODBCDirect Obiectul DBEngine 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

Colectia Recordsets

Obiectul Recordset reprezinta o multime de înregistrtari din baza de date. Colectia Recordsets contine toate obiectele Recordset deschise. Situarea în ierarhia de obiecte este

Obiectul sau colectia

Este continut în Contine

Recordset (obiect) Colectia Recordsets

Colectia Fields

Colectia Properties

193

Page 194: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Recordsets (colectie)

Obiectul Database Obiecte Recordset

Obiectele Recordset 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 Recordset se obtine din metoda OpenRecordset cu sintaxa:

Set recordset = object.OpenRecordset (source, type, options, lockedits)

Descrierea parametrilor se va vedea în Help – OpenRecordset method.

DAO ofera cinci tipuri de obiecte Recordset:

• table (doar în spatii de lucru Jet), • dynaset, • snapshot, • forward-only, • dynamic (doar în spatii ODBCDirect).

Observatie. Un obiect Recordset trebuie întotdeauna închis dupa terminarea lucrului cu el si înainte de a închide obiectul Database în care a fost creat. Pentru aceasta se utilizeaza metoda Close a obiectului Recordset.

Obiecte Recordset de tip tabela

Un obiect Recordset de tip tabela reprezinta o tabela de baza (base table) din baza de date. Toate câmpurile si înregistrarile din tabela sunt incluse într-un obiect Recordset 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 Recordset 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 Recordset cu bazele de date instalabile ISAM (FoxPro, dBase sau Paradox) pentru a deschide aceste tabele în mod direct mai degraba decât sa se lege acestea la baza de date curenta.

Informatii complete despre un obiect table-type Recordset se obtin din DAO Help – "Table-Type Recordset Object Summary", de unde sunt legaturi catre toate proprietatile si metodele obiectului. Intrarea poate fi atinsa eventual prin Database Object –> Summary –> Database Object, Databases Collection Summary, de unde este o legatura catre Recordsets.

Proprietatea RecordCount a unui obiect Recordset de tip tabela returneaza numarul de înregistrari din tabela.

Obiectul Recordset de tip tabela poate utiliza indexurile definite pentru tabela de baza. La crearea obiectului se poate preciza în proprietatea Index numele unui index definit pentru tabela. Metoda Seek va cauta în ordinea data de index.

Pentru a crea un obiect Recordset de tip tabela se va specifica valoarea dbOpenTable pentru argumentul type a metodei OpenRecordset a obiectului Database.

Observatie. Pentru o tabela legata dintr-o sursa de date externa se va utiliza mai întâi metoda OpenDatabase pentru deschiderea bazei si apoi se deschide un obiect Recordset de tip tabela.

194

Page 195: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Exemplul urmator creeaza un obiect Recordset de tip tabela, foloseste metoda Seek pentru localizarea unei înregistrari si fixeaza înregistrarea gasita drept înregistrare curenta.

Function ReturnEmployeesRecord(strKey As String) As BooleanDim dbs As Database, rst As RecordsetConst conPath As String = _

"C:\Program Files\ … \Northwind.mdb"On Error GoTo Err_ReturnEmployeesRecord' returnarea referintei la baza de dateSet dbs = OpenDatabase(conPath)' deschidere recordset pentru tabela EmployeesSet rst = dbs.OpenRecordset("Employees", dbOpenTable)' fixarea indexuluirst.Index = "LastName"' operatiunea de cautarerst.Seek "=", strKey ' valoarea cautata este argument al functiei' verificarea gasiriiIf rst.NoMatch = False Then

' tiparirea unor câmpuri din înregistrarea gasitaDebug.Print rst!EmployeeID, rst!FirstName & " " & rst!LastName, rst!TitleReturnEmployeesRecord = True

ElseReturnEmployeesRecord = False

End If Exit_ReturnEmployeesRecord:

' închidere recordset si bazarst.Closedbs.CloseExit Function

Err_ReturnEmployeesRecord:

MsgBox "Error " & Err & ": " & Err.DescriptionReturnEmployeesRecord = FalseResume Exit_ReturnEmployeesRecord

End Function

Obiecte Recordset de tip dynaset

Un obiect Recordset 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 Recordset de tip dynaset se pot extrage si actualiza date într-o uniune multipla de tabele, incluzând tabele legate din mai multe baze de date. Obiecte Recordset de tip dynaset se pot crea atât în spatii de lucru Microsoft Jet, cât si în spatii de lucru ODBCDirect. Daca obiectul implica o sursa de date la distanta, el consta într-o serie de bookmark-uri, fiecare identificând unic o înregistrare din recordset. Date efective nu sunt returnate decât la referirea lor explicita.

Pentru a determina numarul de înregistrari din recordset se aplica mai întâi metoda MoveLast astfel regasindu-se toate înregistrarile din multime.

Obiectul Recordset de tip dynaset poate fi actualizat, dar nu toate câmpurile suporta operatia. Proprietatea DataUpdatable a obiectului Field respectiv arata daca se poate modifica valoarea câmpului. Obiectul nu se poate actualiza daca

195

Page 196: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• 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 câmp este read-only • obiectul Recordset a fost creat din mai multe tabele fara instructiunea JOIN • obiectul include câmpuri dintr-o sursa de date ODBC, sau tabele Paradox, si nu exista un index unic pe

acele tabele.

Crearea unui obiect dynaset-type Recordset se indica utilizând constanta dbOpenDynaset pentru argumentul type al metodei OpenRecordset, dupa modelul

Sub PrintHireDates ()Dim dbs As Database, rst As RecordsetDim strSQL As StringConst conPath As String = _

"C:\Program Files\ … \Northwind.mdb"

' deschiderea bazei de date, referirea eiSet dbs = DBEngine.Workspaces(0).OpenDatabase(conPath)' initializarea sirului SQLstrSQL = "SELECT FirstName, LastName, HireDate FROM Employees " & _

"WHERE HireDate <= #1-1-93# ORDER BY HireDate;"' deschiderea recordsetului de tip dynasetSet rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)' tiparirea înregistrarilor din recordsetDo Until rst.EOF

Debug.Print rst!FirstName, rst!LastName, rst!HireDateRst.MoveNext

Loop' închiderea recordsetului si a bazeirst.Closedbs.Close

End Sub

Obiecte Recordset de tip snapshot

Un obiect Recordset de tip snapshot este o multime statica de înregistrari care reprezinta rezultatul unei interogari. Un snapshot include toate valorile pentru toate câmpurile cerute în interogare, fie ca exista în cod referinte la ele sau nu. Obiectul Recordset de tip snapshot necesita mai putine resurse decât cel de tip dynaset, dar datele nu pot fi actualizate în obiectul Recorset de tip snapshot.

Initial, 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 Recordset se specifica valoarea dbOpenSnapshot pentru argumentul type al metodei OpenRecordset.

Obiecte Recordset de tip forward-only

Un obiect Recordset de tip forward-only este identic cu unul de tip snapshot cu exceptia faptului ca înregistrarile pot fi defilate doar înainte (nu se poate efectua decât o singura trecere prin înregistrari).

196

Page 197: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Î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 MoveLast, MoveFirst, MovePrevious.

Obiectele de acest tip, utile atunci când înregistrarile sunt parcurse doar o data, ofera cea mai mare viteza de acces.

Crearea unui obiect forward-only-type Recordset este produsa de constanta dbOpenForwardOnly atribuita argumentului type al metodei OpenRecordset.

Metodele obiectelor Recordset

În tabelul urmator este o prezentare a metodelor permise pentru diferite tipuri de obiecte Recordset. 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

Method Table Dynaset Snapshot Forward-Only

Dynamic

AddNew Jet Jet/ODBC ODBC * ODBC ODBC

Cancel ODBC ODBC ODBC ODBC

CancelUpdate Jet Jet/ODBC ODBC * ODBC ODBC

Clone Jet Jet Jet

Close Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC

CopyQueryDef Jet Jet Jet

Delete Jet Jet/ODBC ODBC * ODBC ODBC

Edit Jet Jet/ODBC ODBC * ODBC ODBC

FillCache Jet

FindFirst Jet Jet

FindLast Jet Jet

FindNext Jet Jet

FindPrevious Jet Jet

GetRows Jet Jet/ODBC Jet/ODBC Jet/ODBC ODBC

Move Jet Jet/ODBC Jet/ODBC Doar înainte, fara offset

ODBC

197

Page 198: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

MoveFirst Jet Jet/ODBC Jet/ODBC ODBC

MoveLast Jet Jet/ODBC Jet/ODBC ODBC

MoveNext Jet Jet/ODBC Jet/ODBC ODBC

MovePrevious Jet Jet/ODBC Jet/ODBC ODBC

NextRecordset ODBC ODBC ODBC ODBC

OpenRecordset Jet Jet Jet

Requery Jet/ODBC Jet/ODBC Jet/ODBC ODBC

Seek Jet

Update Jet Jet/ODBC ODBC * ODBC ODBC

* În spatiul ODBCDirect anumite operatiuni depind de driver (daca acesta suporta sau nu operatiunea respectiva)

Pentru proprietatile diferitelor tipuri de obiecte Recordset se vor studia intrarile respective din Help.

Securitatea datelor

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 User, Container, Document si Workspace.

Obiectul Group reprezinta un grup de conturi iar obiectul User reprezinta un cont individual. Utilizatorii pot fi membri ai grupurilor. Atunci când se stabileste securitatea bazei, aceasta se efectueaza pentru un obiect particular sau multime de obiecte specificând 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. Invers, daca un utilizator are drepturi asupra unui obiect, grupul la care apartine utilizatorul are aceleasi drepturi. Grupurile pot fi create prin metoda CreateGroup a obiectului Workspace sau User.

Obiectul Container 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 Container; fiecare baza de date contine cel putin aceste obiecte având denumirile: Databases – bazele de date salvate –, Tables – tabelele si interogarile salvate –, Relationships – relatiile salvate. O aplicatie poate sa defineasca si obiecte Container proprii; Microsoft Access defineste obiectele Container cu denumirile Forms – formele salvate –, Modules – modulele salvate–, Reports – rapoartele salvate –, Scripts – macrourile salvate. Pentru stabilirea drepturilor se stabileste proprietatea UserName a containerului respectiv si apoi proprietatea Permissions adecvata.

Fiecare obiect Container contine o colectie Documents, fiecare element Document reprezentând un document din baza. Atât DAO cât si aplicatia ofera diferite tipuri de obiecte Document, de exemplu Database

198

Page 199: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

(DAO), Form (Access) etc. Pentru stabilirea drepturilor se stabileste proprietatea UserName a documentului respectiv si apoi proprietatea Permissions.

Pentru informatii detaliate se vor studia intrarile din Help pentru obiectele mentionate si legaturile propuse.

Colectia Properties

Cele mai multe obiecte DAO contin o colectie Properties. Fiecare obiect Property 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 reprezentând baza de date curenta.

Sub DisplayProperties()Dim dbs As Database, prp As Property

Const conPath As String = _

"C:\Program Files\ … \Northwind.mdb"

' deschide bazaSet dbs = OpenDatabase(conPath)Debug.Print "Current Database Properties"' enumerarea colectieiFor Each prp In dbs.Properties

Debug.Print prp.NameNext prpdbs.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 Property 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 când se cheama procedura apare o eroare deoarece nu exista proprietatea ceruta. În handler-ul erorii se creeaza noul obiect Property 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 Integer, varSetting As Variant) As Boolean

Dim prp As Property

Const conPropNotFound As Integer = 3270

On Error GoTo Error_SetProperty' referirea explicita la colectia Propertiesobj.Properties(strName) = varSettingSetProperty = True

Exit_SetProperty:

Exit Function Error_SetProperty:

If Err = conPropNotFound Then

199

Page 200: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

' creare proprietate, tip, valoare initialaSet prp obj.CreateProperty(strName, intType, varSetting)' adaugarea la colectia Propertiesobj.Properties.Append prpobj.Properties.RefreshSetProperty = TrueResume Exit_SetProperty

ElseMsgBox Err & ": " & vbCrLf & Err.DescriptionSetProeprty = FalseResume Exit_SetProperty

End IfEnd Function

De exemplu, pentru a fixa proprietatea ReplicableBool a obiectului Database, se poate utiliza functia precedenta prin

Sub ReplicateDatabase()Dim dbs As DatabaseConst conPath As String = _

"C:\Program Files\ … \Northwind.mdb"

Set dbs = OpenDatabase(conPath, True)If SetProperty(dbs, "ReplicableBool", dbBoolean, True) Then

Debug.Print "Database replicated successfully."Else

Debug.Print "Database not replicated."End If

End Sub

De fiecare data când 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 TableDef, QueryDef, Field si Document.

Accesarea datelor ODBC

Atunci când 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.

Utilizarea Microsoft Jet pentru date ODBC

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

Page 201: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o Legaturi actualizabile – se pot actualiza date din obiecte Recordset bazate pe legaturi multiple de tabele

o Suport pentru tabele 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, incluzând informatii despre câmpuri si indexuri, în baza locala. Acest fapt mareste viteza de conectare la accesarile ulterioare ale sursei de date.

o Suport pentru metode Find – se pot utiliza metodele FindFirst, FindNext, FindPrevious si FindLast cu obiectele Recordset.

o Esecuri (failures) partiale ale actualizarii interogarilor – daca esueaza o interogare de mari dimensiuni, interogarea se opreste, da controlul utilizatorului pentru a decide sau nu daca se pastreaza modificarile efectuate pâna în momentul esecului.

o Proprietati definite de utilizator – se pot personaliza obiectele DAO prin adaugarea unor proprietati persistente. De exemplu o proprietate Description care samemoreze un text descriptiv al obiectului.

o Interogari încrucisate – se poate utilzia propozitia SQL TRANSFORM pentru a crea rezumate încrucisate (crosstab) ale datelor interogate.

o Acces la date eterogene – se poate lucra cu date de pe server, baze de date Microsoft Jet native (fisiere .mdb) si date ISAM instalabile (FoxPro, Paradox, dBASE). Se pot efectua uniri de tabele din surse diferite.

o Utilizare 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 de 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.

Utilizare ODBCDirect pentru date ODBC

Cu ODBCDirect se pot accesa date de pe server utilizând modelul de obiecte DAO existent direct în topul interfetei de programare ODBC. ODBCDirect implementeaza un strat de cod peste ODBC API, care stabileste conexiunile, creeaza cursoare si executa proceduri utilizând 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 direct – 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 decât ale statiei de lucru).

o Reducerea necesarului de resurse – netrecând 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 Imbunatatirea accesului la functionalitatea specifica serverului – 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 Actualizare optimista în loturi – modificarile locale se pot stoca în Recordset si trimite apoi serverului într-un singur lot.

o Executarea procedurilor 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 de date ODBC

201

Page 202: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru a putea fi utilizata, atât în spatiul de lucru Microsoft Jet, cât 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 atât din managerul de ODBC (disponibil în mediul Windows), cât si din Visual Basic.

Pasii necesari înregistrarii difera dupa sursa de date ODBC, driverele respective necesitând informatii specifice. În continuare se da, ca exemplu, înregistrarea sursei de date SQL Server utilizând managerul de ODBC:

1. Windows Control Panel => dublu click pe 32bit ODBC 2. Click Add si apoi dublu click pe SQL Server. 3. În caseta Data Souce Name 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 Server 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 Database Name.

Exemplul urmator contine codul necesar înregistrarii programatice a unei surse de date. Pentru aceasta se utilizeaza metoda RegisterDatabase a obiectului DBEngine.

Function RegisterDB() As BooleanDim str As String

On Error GoTo Err_RegisterDB' construirea sirului de cuvinte cheiestr = " Description=SQL Server on Server Publishers" & _

vbCR & "OemToAnsi=No" & _vbCR & "Network=(Default)" & _vbCR & "Address=(Default)" & _vbCR & Server=Publishers" & _vbCR & "Database=Pubs"

' înregistrarea bazei de dateDBEngine.RegisterDatabase "Pubs", "SQL Server", True, strRegisterDB = True

Exit_RegisterDB:

Exit Function Err_RegisterDB:

MsgBox "Error " & Err &": " & Err.DescriptionRegisterDB = FalseResume Exit_RegisterDB

End Function

Metoda RegisterDatabase completeaza informatia de conectare necesara la deschiderea sursei de date ODBC. Sintaxa metodei este

DBEngine.RegisterDatabase dbname, driver, silent, attributes

unde

dbname este numele bazei de date,

202

Page 203: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Utilizarea DAO cu ODBCDirect

Modelul de obiecte pentru spatiul ODBCDirect include un subset de obiecte din spatiul Microsoft Jet la care se adauga un obiect nou, Connection si clasa corespunzatoare. Diagrama urmatoare arata ierarhia de obiecte a spatiului de lucru ODBCDirect.

Obiectul DBEngine

DBEngine contine atât spatiile de lucru Jet, cât si spatiile de lucru ODBCDirect. Proprietatea DefaultType a obiectului determina tipul spatiului creat în mod implicit la utilizarea metodei CreateWorkspace. Dupa cum s-a mai precizat, la spatiile Microsoft Jet, valoarea dbUseODBC caracterizeaza spatiile ODBCDirect. Argumentul implicit poate fi acoperit prin specificarea explicita a argumentului type la aplicarea metodei CreateWorkspace.

Observatie. Daca programarea este efectuata in Microsoft Access, atunci nu se va specifica Proprietatea DefaultType la valoarea dbUseODBC deoarece poate produce rezultate neasteptate (Access utilizeaza DAO si Jet pentru multiple operatiuni).

Instructiunile urmatoare creeaza un spatiu ODBCDirect:

Dim wrkODBC As WorkspaceSet wrkODBC = DBEngine.CreateWorkspace _

("NewODBCwrk", "Admin", "", dbUseODBC)

Tipul spatiului de lucru poate fi identificat prin proprietatea Type a obiectului Workspace. Este returnata una dintre valorile dbUseJet sau dbUseODBC, proprietatea fiind read-only, adicanu se poate modifica tipul spatiului de lucru odata creat.

Colectia Workspaces

203

Page 204: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

În acest model, fara a specifica de fiecare data, un obiect Workspace reprezinta un spatiu de lucru ODBCDirect, iar colectia Workspaces contine multimea tuturor spatiilor ODBC active. Situarea în ierarhie este data în tabelul urmator.

Obiectul sau colectia

Continut în Contine

Workspace (obiect) Colectia Workspaces

Colectia Connections

Colectia Databases

Colectia Properties

Workspaces (colectie)

Obiectul DBEngine Obiecte Workspace

Un spatiu de lucru ODBCDirect ruteaza, în cazul utilizarii ODBC, apelurile direct la ODBC API spre deosebire de spatiul Microsoft Jet, care ruteaza mai întâi apelurile la motorul de baze de date Jet si pe urma la ODBC API.

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

• Name, UserName si Type (proprietati) pentru stabilirea/aflarea proprietatilor unei sesiuni. • Metoda Close pentru terminarea sesiunii. • Metoda OpenDatabase pentru a deschide o baza de date. • Metodele BeginTrans, CommitTrans si Rollback pentru conducerea tranzactiilor.

Alte proprietati sunt prezentate în continuare.

Colectia Connections

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 OpenDatabase, prezentata ulterior) sau prin deschiderea unui nou obiect Connection.

Un obiect Connection reprezinta o conectare la o baza de date ODBC din spatiul ODBCDirect. Colectia Connections contine toate obiectele Connection deschise curent. La deschiderea unui nou obiect Connection, acesta este adaugat în mod automat la colectie. Analog, închiderea unui obiect prin metoda Close elimina din colectie obiectul Connection închis.

Avantajele utilizarii obiectului Connection sunt

204

Page 205: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o Conectare 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 QueryDef. Se pot defini obiecte QueryDef care reprezinta interogarile din sursa de

date ODBC.

Pentru a crea un obiect Connection se utilizeaza metoda OpenConnection, cu sintaxa

Set connection = workspace.OpenConnection (name, options, readonly, connect)

unde

connection este numele noului obiect,

workspace este numele unui obiect Workspace de tip ODBCDirect din care se efectueaza conectarea,

name este numele unei surse de date înregistrate. Obiectul Connection creat poate fi referit prin numele sursei (DSN) sau prin indexul din colectie,

options determina daca si când 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 ID-ul utilizatorului, parola si DSN, dupa modelul:

ODBC;UID=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.

Observatie. La conectarea la o baza de date Microsoft SQL Server care utilizeaza securitatea integrata se vor omite parametrii UID si PWD deoarece se utilizeaza numele utilizator si parola din Windows NT. De exemplu, sirul de conectare poate fi

ODBC;UID=;PWD=;DATABASE=Pubs;DSN=Pubs

Exemplul urmator ilustreaza utilizarea metodei OpenConection pentru a deschide un nou obiect Connection.

Function OpenPubsConnection() As BooleanDim wrk As Workspace, cnn As Connection, rst As Recordset, fld As FieldDim strConnect As String, strSQL As String On Error GoTo Err_OpenPubsConnection' Crearea sirului de conectarestrConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"' Crearea sirului SQL

205

Page 206: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

strSQL = SELECT * FROM Authors WHERE State = 'MD';"' Crearea spatiului de lucru ODBCSet wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)' Deschiderea conexiuniiSet cnn = wrk.OpenConnection("Pubs", dbDriverNoPrompt, False, strConnect)' Deschiderea recordsetului din conexiuneSet rst = cnn.OpenRecordset(strSQL,dbOpenDynaset)' Tiparirea valorilor din recordsetDo Until rst.EOF For Each fld In rst.Fields Debug.Print fld.Name, fld.Value Next fld Debug.Print rst.MoveNextLoopOpenPubsConnection = True Exit_OpenPubsConnection: rst.Close cnn.CloseExit Function Err_ OpenPubsConnection: MsgBox "Error " & Err & ": " & Err.Description OpenPubsConnection = False Resume Err_ OpenPubsConnection End Function

Dupa crearea obiectului Connection, se pot deschide obiecte Recordset si executa interogari pe obiectul Connection.

La deschiderea unui obiect Connection, este creat un obiect Database corespunzator si adaugat colectiei Databases din spatiul de lucru. Reciproc, la deschiderea unei baze de date în spatiul ODBCDirect este creat un obiect Connection si adaugat colectiei Connections. Închiderea oricarui obiect din perechea Connection, Database produce si închiderea celuilalt obiect.

Observatie. Ca si la Database, se vor închide mai întâi toate obiectele Recordset deschise.

Deschiderea conectarilor asincrone

Acest tip de conectare, necesar mai ales când conectarea dureaza mai mult, timp în care se pot efectua alte operatiuni, este specificata prin constanta dbRunAsync data argumentului options al metodei OpenConnection.

Dim wrk As Workspace, cnn As Connection, strConnect As StringSet wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC)strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"Set cnn = wrk.OpenConnection("",dbDriverNoPrompt + dbRunAsync, False, strConnect)

Proprietatea StillExecuting a obiectului Connection poate fi testata pentru a determina stabilirea conexiunii. Pentru a anula o conectare care ia prea mult timp se utilizeaza metoda Cancel a obiectului.

Colectia Databases

206

Page 207: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Se poate utiliza metoda OpenDatabase a obiectului Workspace pentru a deschide o baza de date si conectarea astfel la o sursade date ODBC. Totusi, obiectul Database nu suporta în spatiul de lucru ODBCDirect toate functiunile pe care le ofera obiectul Connection. În special, nu se poate efectua conectarea asincrona, executa interogari asincrone sau defini obiecte QueryDef reprezentând interogari ale sursei de date.

Pentru conectarea la o sursa ODBC prin OpenDatabase 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 DatabaseDim strConnect As String strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs"Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) Set dbs = wrk.OpenDatabase("Pubs", dbDriverNoPrompt, False, strConnect)

Pentru argumentele metodei se va studia Help - OpenDatabase method (DAO).

Dintre metodele si proprietatile obiectului Database, mentionam doar câteva.

• metoda Execute pentru a efectua o interogare de tip actiune (action query – 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 Connect stabileste o conectare la o sursa de date ODBC. • Proprietatea QueryTimeout pentru limitarea duratei de timp în care se executa o interogare. • Proprietatea RecordsAffected pentru a determina numarul înregistrarilor modificate într-o interogare

actiune. • Metoda OpenRecordset pentru executarea unei interogari de tip selectare si crearea unui obiect

Recordset. • Proprietatea Version permite determinarea versiunii motorului de baze de date care a creat baza.

Comutarea între obiectele Connection si Database

Pentru a utiliza avantajele fiecarui tip de conectare la o sursa ODBC, se poate trece de la un obiect la altul prin proprietatea Connection a obiectului Database sau prin proprietatea Database a obiectului Connection. Aceste proprietati pot fi folosite pentru a crea obiecte Connection din obiecte Database si, reciproc, obiecte Database din obiecte Connection. Se pot astfel adauga capacitati ODBCDirect la aplicatii care utilizeaza doar obiecte Database.

De exemplu, se poate utiliza un obiect Database pentru operatiunile uzuale, dar daca este nevoie de o interogare asincrona, atunci se poate crea un obiect Connection din obiectul Database si executa apoi interogarea din Connection. 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;UID=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

Page 208: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

' interogarea se executa sincron. Err = 0 On Error Resume Next Set cnn = dbs.Connection If Err = 0 Then cnn.Execute "DELETE FROM Authors", dbRunAsync Else dbs.Execute "DELETE FROM Authors" End IfEnd Sub

Colectia QueryDefs

Un obiect QueryDef reprezinta o definitie temporara a unei interogari din spatiul ODBCDirect. Colectia QueryDefs contine toate interogarile existente curent în spatiul de lucru. Situarea în ierarhia de obiecte este data în tabelul urmator.

Obiectul sau colectia

Continut în Contine

QueryDef (obiect) Colectia QueryDefs Colectia Parameters

Colectia Properties

QueryDefs (colectie)

Obiectul Connection

Obiecte QueryDef

Obiectele QueryDef 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.

Executarea interogarilor asincrone

Crearea si executarea interogarilor în spatiile ODBCDirect sunt similare cu crearea si executarea din spatiile de lucru Microsoft Jet. Interogarea se creeaza prin metoda CreateQueryDef a obiectului Connection si utilizarea metodelor Execute sau OpenRecordset pentru interogarea rezultata.

Se pot utiliza interogari asincrone încât 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

Page 209: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

strConnect = ""ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs" ' deschiderea conexiunii Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' stergerea unei interogari anterioare For Each qdf In cnn.QueryDefs If qdf.Name = "DeleteLargeSales" Then cnn.QueryDefs.Delete "DeleteLargeSales" End If Next qdf ' creare QueryDef Set qdf = cnn.CreateQueryDef("DeleteLargeSales") strSQL = "DELETE FROM sales WHERE qty = 100" qdf.SQL = strSQL ' executarea asincron a interogarii qdf.Execute dbRunAsync While qdf.StillExecuting ' cod care se va executa pâna când 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 In Errors Debug.Print errObj.Number, errObj.Description Next errObj DeleteLargeSales = False Resume Exit_DeleteLargeSalesEnd Function

Exemplul urmator utilizeaza metoda Execute direct pe obiectul Connection (si nu obiectul QueryDef ca în exemplul anterior).

Dim cnn As Connection, strConnect As String strConnect = "ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs"Set cnn = OpenConnection("", dbDriveNotPrompt, False, strConnect)cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsynccnn.Close

La executarea unei interogari asincrone aceasta se poate anula prin testarea metodei StillExecuting. 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

Page 210: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

On Error GoTo Err_CancelAsyncQuery Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC) strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' Pornirea unei 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 If cnn.StillExecuting Then cnn.Cancel wrk.Rollback ' daca interogarea s-a terminat, încheierea tranzactiei Else wrk.CommitTrans End If CancelAsyncQuery = True Exit_CancelAsyncQuery: cnn.Close wrk.Close Exit Function Err_CancelAsyncQuery: For Each errObj In Errors Debug.Print errObj.Number, errObj.Description Next errObj CancelAsyncQuery = False Resume Exit_CancelAsyncQueryEnd Function

Proprietatea StillExecuting si metoda Cancel pot fi utilizate împreuna cu obiectele QueryDef, Connection si Recordset.

Un obiect Connection 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 Connection separate si se va executa fiecare interogare asincrona pe un obiect Connection diferit.

Daca se foloseste tehnica tranzactiilor simultan cu interogarile asincrone, aplicarea metodei CommitTrans poate opri executia pâna când se termina interogarea. Din acest motiv se va verifica StillExecuting periodic si se va termina tranzactia doar dupa ce inteorgarea s-a încheiat (StillExecuting 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 pâna în momentul activarii metodei Cancel si operatiunea nu poate fi refacuta prin Rollback. Pentru a nu permite operatiuni partiale de acest tip, metoda Cancel 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 CacheSize a obiectului QueryDef specifica numarul de înregistrari stocate. În mod implicit se stocheaza 100 de înregistrari.

210

Page 211: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Sub SetCacheSize() Dim wrk As Workspace, qdf As QueryDef, rst As Recordset Dim cnn As Connection, strConnect As String Set wrk = CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC) Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set qdf = cnn.CreateQueryDef("temporary") qdf.SQL = "SELECT * FROM roysched" qdf.CacheSize = 200 Set rst = qdf.OpenRecordset() ' executarea operatiunilor necesare pe recordset rst.Close cnn.CloseEnd Sub

Colectia 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 Type (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).

Colectia Recordsets

Un obiect Recordset reprezinta înregistrarile care rezulta din executarea unei interogari pe un obiect Connection sau un obiect Database, într-un spatiu de lucru ODBCDirect. Colectia Recordsets contine toate obiectele Recordset deschise curent. Situarea în ierarhia de obiecte este prezentata în tabelul urmator

Obiectul sau colectia

Continut în Contine

Recordset (obiect) Colectia Recordsets

Colectia Fields

Colectia Properties

Recordsets (colectie)

Obiectul Connection

Obiect Database

Obiecte Recordset

Obiectele Recordset suportate în spatiul de lucru ODBCDirect sunt de tipurile: dynaset, snapshot, forward-only si dinamic. Cu exceptia ultimului tip, toate celelalte tipuri de obiecte Recordset au fost prezentate la spatiul de lucru Microsoft Jet.

Obiecte Recordset de tip dinamic

Un obiect Recordset de tip dinamic este similar unui obiect de tip dynaset, dar este actualizat în mod dinamic, pe masura ce alti utilizatori executa modificari în tabela de baza.

211

Page 212: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru a crea un obiect Recordset de tip dinamic se va specifica valoarea dbOpenDynamic pentru argumentul type al metodei OpenRecordset.

Recordseturile de tip dinamic sunt disponibile doar pentru acele drivere ODBC care ofera propriile cursoare. Înainte de deschiderea unui Recordset 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 Recordset de tip snapshot sau forward-only.

Avantajul utilizarii obiectelor Recordset 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.

Deschiderea asincrona a obiectelor Recordset

Pentru a deschide un Recordset în mod asincron, similar interogarilor din spatiile ODBCDirect, se utilizeaza constanta dbRunAsync ca valoare a argumentului options pentru metoda OpenRecordset. Se pot astfel utiliza metoda Cancel si proprietatea StillExecuting direct pe obiectul Recordset. De exemplu, la deschiderea unui Recordset 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 Cancel) a unei metode OpenRecordset, obiectul Recordset devine nevalabil si trebuie redeschis pentru a regasi un obiect Recordset corect.

Pentru cazul obiectelor Recordset cu multe înregistrari este utila aplicarea metodei MoveLast în mod asincron. Acest fapt se realizeaza utilizând argumentul dbRunAsync cu metoda, sub forma

recordset.MoveLast dbRunAsync

în continuare se poate testa proprietatea StillExecuting (a obiectului Recordset) si aplica metoda Cancel.

Colectia Fields

În spatiul de lucru ODBCDirect, un obiect Field reprezinta un câmp dintr-un obiect QueryDef sau obiect Recordset. Anumite procesari sunt enumerate în continuare.

• Proprietatea OrdinalPosition este utilizata pentru determinarea ordinii obiectului Field în colectia Fields.

• Proprietatea Value fixeaza sau returneaza data memorata în câmp. • Metodele AppendChunk, GetChunk si proprietatea FieldSize returneaza sau fixeaza o valoare dintr-

un obiect OLE sau câmp memo a unui obiect Recordset. • Proprietatile Type, Size si Attributes determina tipul datelorcare pot fi memorate într-un câmp. • Proprietatile SourceField si SourceTable determina sursa originala a datelor. • Proprietatile Value, VisibleValue si OriginalValue sunt utilizate pentru verificarea completarii cu

succes a unei actualizari în loturi (problema este discutata si în continuare).

Utilizarea ODBCDirect

În aceasta sectiune sunt prezentate câteva operatiuni uzuale într-un spatiul de lucru ODBCDirect: actualizarea optimista în loturi, lucrul cu cursoare, lucrul cu proceduri memorate.

212

Page 213: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Utilizarea actualizarii optimiste în loturi

În multe aplicatii client-server, actualizarile optimiste apar pe principiul "înregistrare cu înregistrare". Aceasta se întâmpla î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 DefaultCursorDriver, a spatiului de lucru, la valoare

dbUseClientBatchCursor. o Deschiderea unui obiect Connection sau Database din spatiul ODBCDirect. o Utilizarea metodei OpenRecordset pentru obiectul deschis în pasul precedent cu scopul de a

deschide un Recordset si specificarea constantei dbOptimisticBatch ca valoarea a argumentului lockedits.

o Efectuarea editarilor necesare în obiectul Recordset. Toate editarile sunt memorate local. o La terminare, actualizarea sursei de date se efectueaza prin metoda Update a obiectului

Recordset, cu specificarea valorii dbUpdateBatch pentru argumentul type.

Observatie. Daca se lanseaza (programatic) o actualizare în lot în timp ce o înregistrare din obiectul Recordset 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 RunInBatch() 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;UID=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

Page 214: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Wend ' actualizarea înregistrarilor în sursa de date rst.Update dbUpdateBatchEnd 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 Update si specifica dbUpdateCurrentRecord 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 daterst.MoveFirstrst.Editrst!qty = rst!qty + 2rst.Update dbUpdateCurrentRecord ' actualizarea restului de înregistrari rst.Update dbUpdateBatch

Tratarea coliziunilor

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, producând astfel o coliziune.

Pentru tratarea coliziunilor se va examina proprietatea BatchCollisions a obiectului Recordset. Proprietatea BatchCollisions returneaza un tablou care memoreaza bookmark-uri punctând catre înregistrarile din obiectul Recordset pentru care au aparut coliziuni. De fiecare data când 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 Field al înregistrarii curente.

Proprietatea Descriere

Value Valoarea curenta a câmpului din Recordset. Aceasta corespunde valorii câmpului dupa apelul metodei Update.

OriginalValue Valoarea câmpului din obiectul Recordset înainte de apelul metodei Update.

VisibleValue Valoarea câmpului 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 Recordset, suprascriind valoarea originala a câmpului. Pentru aceasta se apeleaza metoda Update si specifica True pentru argumentul force.

o Se poate schimba valoarea curenta din obiectul propriu Recordset la valoarea originala si forta schimbarea în baza de date.

214

Page 215: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Observatie. Apelul metodei Update cu dbUpdateBatch ca argument type si True 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 Update fara fortare si rezolvarea ulterioara a coliziunilor prin folosirea tabloului returnat de proprietatea BatchCollisions împreuna cu Value, OriginalValue si VisibleValue.

Urmatorul exemplu arata utilizarea tabloului returnat de proprietatea BatchCollision în fortarea în baza de date a modificarilor din obiectul Recordset 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 jEnd Function

Exemplul urmator poate fi modificat astfel încât actualizarea înregistrarilor cu coliziuni sa nu se desfasoare una câte una, desi metoda de fortare globala nu este tocmai indicata.

' deschidere recordsetSet rst = _cnn.OpenRecordset(("SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch)' modificare înregistrarilorWhile Not rst.EOF rst.Edit rst!qty = rst!qty + 1 rst.Update rst.MoveNextWendrst.Update dbUpdateBatch, True

Utilizarea cursoarelor în spatiile ODBCDirect

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

Page 216: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Cu un cursor se lucreaza prin intermediul unui obiect DAO Recordset. La deschiderea unui obiect Recordset prin DAO, ODBCDirect creeaza cursorul corespunzator. Fiecare tip de obiect Recordset, cu exceptia celui de tip tabela, corespunde unui tip diferit de cursor.

Caracteristicile 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 câmp o Sa fie complet navigabile sau doar înainte o Sa existe fie la client, fie pe server.

Cursoare pe partea client sau pe partea server

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 reprezentând 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 de cursor

La deschiderea unui obiect Recordset pe o sursa de date care nu este ODBC, constanta utilizata pentru argumentul type al metodei OpenRecordset determina tipul de recordset deschis. La deschiderea unui Recordset pe o sursa ODBC, acelasi argument, type, specifica tipul de cursor pe care îl reprezinta obiectul Recordset. Fiecare tip de cursor corespunde unui tip de recordset. Urmatorul tabel arata efectul valorilor argumentului type atât pentru surse de date ODBC, cât si pentru surse non-ODBC.

Constanta (argumentul type)

Recordset type (surse non-ODBC)

Cursor type (surse de date ODBC)

dbOpenDinamic Dynamic type Dynamic

dbOpenDynaset Dynaset type Keyset

dbOpenSnapshot Snapshot type Static

dbOpenForwardOnly Forward-only type

Forward-only scrolling (valoarea implicita)

Observatie. Cum obiecte Recordset de tip tabela nu exista în spatiile de lucru ODBCDirect, nu exista cursor corespunzator acestui tip de recordset.

216

Page 217: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proprietatea DefaultCursorDriver a obiectului Workspace specifica unde este creat cursorul – la client sau pe server. Valorile posibile pentru proprietate sunt date în tabelul alaturat.

Constanta (proprietatea DefaultCursorDriver)

Descriere

dbUseODBCCursor Utilizare cursoare la client. Rezultate bune pentru multimi mici de înregistrari rezultate.

dbUserServerCursor 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.

dbUseDefaultCursor Utilizare cursoare pe server, daca este posibil; cursoare client în caz contrar.

dbUseClientBatchCursor Utilizarea cursoarelor lor la client. Cerut la actualizarile în loturi.

dbUseNoCursor Deschidere obiect Recordset ca forward-only, read-only, cu rowset = 1.

Blocarea înregistrarilor (Record Locking)

La deschiderea unui obiect Recordset se poate specifica si tipul de blocaj al înregistrarilor intentionat în cazul actualizarilor. Pentru aceasta se utilizeaza argumentul lockedits al metodei OpenRecordset. Urmatorul tabel contine explicatii pentru tipurile posibile de blocaj si valorile corespunzatoare ale argumentului lockedits.

Constanta (argumentul lockedits)

Descrierea tipului de blocaj al cursorului ODBC

dbOptimistic Pagina continând înregistrarea este blocata doar atât timp cât înregistrarea este actualizata prin metoda Update.

dbPessimistic Pagina cu înregistrarea este blocata cât mai devreme, de la utilizarea metodei Edit.

dbOptimisticValue Utilizarea concurentei optimiste bazata pe valorile înregistrarilor.

dbOptimisticBatch Utilizarea actualizarii optimiste în lot.

dbReadOnly Implicita pentru spatiile ODBCDirect, interzice modificari în datele obiectului Recordset.

217

Page 218: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Anumite combinatii de tipuri de cursoare si de blocaj nu functioneaza împreuna. De exemplu, cu cursoarele Microsoft SQL Server 6.0, specificarea dbOpenSnapshot pentru argumentul type cere specificarea dbReadOnly 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 Recordset implicit este read-only, forward-only si nu poate fi actualizat. Editarea înregistrarilor necesita specificarea explicita a unui tip de blocaj diferit de dbReadOnly la aplicarea metodei OpenRecordset.

Deoarece nu se pot deschide recordseturi de tip tabela în spatiul ODBCDirect, nu se pot utiliza proprietatea Index si metoda Seek de regasire a datelor. De asemenea nu se pot utiliza metodele Find: FindFirst, FindNext, FindPrevious sau FindLast. Î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 de rezultate

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 câte 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 Recordset. Cursoarele server-side returneaza multiple multimi de rezultate doar la deschiderea unui Recordset de tip forward-only.

Pentru obtinerea mai multor multimi de rezultate

1. Stabilirea proprietatii DefaultCursorDriver la valoarea dbUseServerCursor pentru specificarea cursoarelor server-side

2. Crearea unui obiect QueryDef si stabilirea proprietatii SQL la un sir valid SQL care returneaza multiple obiecte Recordset.

3. Stabilirea proprietatii CacheSize a obiectului QueryDef 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 Recordset pe obiectul QueryDef creat. Se da valoarea dbOpenForwardOnly pentru argumentul type al metodei OpenRecordset.

5. Utilizarea metodei NextRecordset pentru a accesa urmatorul obiect Recordset din grupul de obiecte Recordset returnat de server. Aceasta ignoreaza obiectul Recordset curent si îl înlocuieste cu urmatorul obiect. Daca nu mai exista obiecte Recordset atunci metoda NextRecordset returneaza valoarea False iar obiectul curent Recordset va fi gol (empty).

Exemplul urmator tipareste valorile pentru fiecare câmp 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

Page 219: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

' creare spatiu ODBCDirect Set wrk = DBEngine.CreateWorkspace(""ODBCDirect", "Admin", "", dbUseODBC) ' creare sir de conectare strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UID=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 câmpurilor While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value Next fld rst.MoveNext Wend FDone = Not rst.NextRecordset() Loop rst.Close cnn.Close wrk.CloseEnd Function

Lucrul cu proceduri memorate

Se pot utiliza obiecte ODBCDirect QueryDef 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 utilizând metoda Execute a obiectului Connection. Pentru a regasi valoarea returnata se creeaza un obiect QueryDef si deschidem un recordset pe el.

Set qdf = cnn.CreateQueryDef("qry", "{ call GetEmps() }")Set rst = qdf.OpenRecordset

219

Page 220: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 serverstrSQL = "CREATE PROCEDURE UpdateEmps (@invar int) AS RETURN @invar;"cnn.Execute strSQL ' crearea QueryDef pentru a executa procedura memorataSet qdf = cnn.CreateQueryDef("qry", "{ ? = call UpdateEmps(?) }") ' tratarea parametrilorqdf.Parameters(0).Direction = dbParamReturnValueqdf.Parameters(1) = 10qdf.Execute ' obtinerea valorii returnatevar = qdf.Parameters(0).Value

220

Page 221: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Modelul de obiecte PowerPoint

Obiectul Application Returnarea unui obiect Application Controlul aspectului ferestrei aplicatiei Controlarea atributelor si comportarii globale Accesarea principalelor obiecte Accesarea obiectelor partajate de Ms OfficeObiectul Presentation Returnarea obiectului Presentation Deschiderea unei prezentari Crearea unei prezentari Importul 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 prezentariiObiectele Slides, Slide si SlideRange 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 notelorObiectul Selection Crearea unei selectii Returnarea unei selectii Returnarea unui obiect din selectieObiectele View si SlideShowView Prezentari, ferestre, viziuni Returnarea obeictelor View si SlideShowView Navigarea printre diapozitive Alipirea la un obiect View Controlul viziunii din fereastra documentului Returnarea diapozitivului curentControlul obiectelor în slide show 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 Help for Visual Basic. Pentru a vedea continutul si

221

Page 222: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

indexul acestui sistem de fisiere Help, click pe Contents and Index în meniul Help din Visual Basic Editor (VBE), iar în fisa Contents din dialogul Help Topics dublu click pe "Microsoft PowerPoint Visual Basic Reference".

Obiectul 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: ActivePresentation, ActiveWindow, AddIns, Assistant, CommandBars, Presentations, SlideShowWindows si Windows. 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 obiect Application

Din cod executate în PowerPoint, obiectul Application este referit prin cuvântul 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.ApplicationSet appPPT = Application

Se poate utiliza de asemenea proprietatea Application a oricarui obiect PowerPoint pentru a returna obiectul Application PowerPoint. Aceasta metoda este utila atunci când 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 utilizând primul shape (care trebuie sa fie o prezentare PowerPoint) din foaia de calcul.

Dim appPPT As PowerPoint.ApplicationSet embeddedPres = Worksheets(1).Shapes(1)embeddedPres.OLEFormat.ActivateSet 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 = Trueppt.Presentations.Open "…numele prezentarii, eventual cu cale"

Controlul aspectului ferestrei aplicatiei

Un rezumat al proprietatilor si metodelor care controleaza aspectul ferestrei în care se executa PowerPoint este prezentat în tabelul urmator.

222

Page 223: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Actiunea Proprietatea sau metoda utila

Activarea ferestrei aplicatiei PowerPoint Metoda Activate

Verificarea faptului ca fereastra aplicatiei PowerPoint este activa

Proprietatea Active

Stabilirea sau returnarea textului care apare în bara de titlu a aplicatiei PowerPoint

Proprietatea Caption

Stabilirea sau returnarea marimii si pozitiei ferestrei PowerPoint pe ecran

Proprietatile Height, Left, Top si Width

Stabilirea sau returnarea vizibilitatii ferestrei aplicatiei. Trebuie data valoarea True la crearea obiectului Application PowerPoint în alta aplicatie pentru a vedea PowerPoint pe ecran.

Proprietatea Visible

Stabilirea sau returnarea starii ferestrei aplicatiei: maximizata, minimizata sau flotanta.

Proprietatea WindowsState

Multe dintre aceste proprietati si metode se aplica, de asemenea, obiectului DocumentWindow pentru controlarea aspectului ferestrei documentului.

Controlarea atributelor si comportarii globale a aplicatiei

Atributele sau actiunile caracteristice pentru întreaga aplicatie PowerPoint sunt controlate prin proprietatile si metodele prezentate în tabelul urmator.

Actiunea Proprietatea sau metoda utila

Numele imprimantei active Proprietatea ActivePrinter

Returnarea numarului de constructie PowerPoint

Proprietatea Build

Afisarea unui subiect de Help Metoda Help

Returnarea numelui sistemului de operare

Proprietatea OperatingSystem

Returnarea caii catre aplicatia PowerPoint

Proprietatea Path

Parasirea (închiderea) aplicatiei PowerPoint

Metoda Quit

Executarea unei proceduri Visual Metoda Run

223

Page 224: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Basic

Returnarea numarului de versiune Proprietatea Version

Accesarea principalelor obiecte 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.

Obiectul returnat Proprietatea utilizata

Presentations (colectie) Proprietatea Presentations

Prezentarea activa Proprietatea ActivePresentation

DocumentWindows (colectie) Proprietatea Windows

Fereastra documentului activ Proprietatea ActiveWindow

AddIns (colectie) Proprietatea AddIns

SlideShowWindows (colectie) Proprietatea SlideShowWindows

Accesarea obiectelor partajate de 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 utilizata

Office Assistant Proprietatea Assistant

Meniuri si bare de unelte PowerPoint Proprietatea CommandBars

Cautarea fisierelor Proprietatea FileSearch

Editorul Visual Basic Proprietatea VBE

Obiectul Presentation

Se creeaza un obiect Presentation de fiecare data când 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 File. 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 obiectului Presentation

224

Page 225: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Se va utiliza proprietatea ActivePresentation 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 DocumentWindow si SlideShowWindow 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 reprezentând o prezentare scufundata, se utilizeaza proprietatea Object a obiectului OLEFormat pentru forma (shape) care contine prezentarea scufundata, dupa modelul

Dim embeddedPres As PresentationSet 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.

Deschiderea unei prezentari existente

Metoda Open a colectiei Presentations (returnata de proprietatea sinonima a obiectului Application) realizeaza deschiderea unei prezentari, dupa modelul

Dim myPres As PresentationSet myPres = Presentations.Open _ (FileName:= " … nume fisier + cale (daca este necesara)…")myPres.Window(1).ViewType = ppViewSlideSorter

unde prezentarea deschisa este vizualizata în modul Slide Sorter.

Crearea unei prezentari noi

În acest scop se utilizeaza metoda Add 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 PresentationSet myPres = Presentations.AddmyPres.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 SaveAs. Este de remarcat ca proprietatea Name a obiectului Presentation este read-only si prin urmare nu

225

Page 226: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 prezentari dintr-o schita (outline) Word

Crearea unei prezentari dintr-un outline scris în Word se realizeaza din Microsoft Word prin metoda PresentIt a obiectului Document reprezentând outline-ul. Exemplul urmator este ilustrativ:

Documents.Open("C:\Presentation Outline.doc").PresentIt

Activarea unei prezentari

Nu exista o metoda Activate pentru obiectul Presentation. Activarea prezentarii are loc o data cu activarea uneia dintre ferestrele de document ale prezentarii:

Presentations("Sales Report").Windows(1).Activate

Controlul numerotarii si dimensiunii diapozitivelor

Proprietatea PageSetup a obiectului Presentation returneaza un obiect PageSetup. Acest obiect contine valorile pentru orientarea pagini de note si a diapozitivelor, dimensiuni si numerotare. Proprietatile obiectului PageSetup sunt similare dialogului PageSetup din meniul File, astfel încât anumite atribuiri produc în mod automat efecte asupra altor parametri (de exemplu o latime mai mare decât înaltimea produce o orientare landscape). Proprietatile sunt:

FirstSlideNumber - returneaza sau stabileste numerotarea primului diapozitiv.

NotesOrientation, SlideOrientation - returneaza sau stabilesc orientarea pe ecran si imprimanta a notelor si diapozitivelor. Pot fi una dintre valorile (MsoOrientation): msoOrientationHorizontal, msoOrientationMixed sau msoOrientationVertical.

SlideHeight, SlideWidth - returneaza sau stabilesc dimensiunile unui diapozitiv, în puncte.

SlideSize - tipul de dimensiune a unui diapozitiv. Poate fi una dintre constantele predefinite (PpSlideSizeType): ppSlideSize35MM, ppSlideSizeA4Paper, ppSlideSizeCustom, ppSlideSizeLetterPaper, ppSlideSizeOnScreen sau ppSlideSizeOverhead.

Exemplul 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 SlideSize la valoarea ppSlideSizeCustom si a proprietatii SlideOrientation la msoOrientationHorizontal.

Stabilirea unui aspect unitar al prezentarii

226

Page 227: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Se poate lucra programatic cu sabloane si cu elementele master ale unei prezentari.

Aplicarea unui sablon se efectueaza prin metoda ApplyTemplate a obiectului Presentation, dupa modelul

ActivePresentation.ApplyTemplate " … template-ul, eventual cu cale …"

Proprietatile HandoutMaster, NotesMaster, SlideMaster sau TitleMaster 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 câteva în continuare, fiecare necesitând însa o cautare în Help deoarece returneaza colectii de obiecte complexe.

Background - returneaza un obiect ShapeRange reprezentând background-ul diapozitivului.

ColorScheme - returneaza sau stabileste obiectul ColorScheme reprezentând schema de culori a masterului.

HeadersFooters - returneaza colectia HeadersFooters care reprezinta antetul, subsolul, data si numarul de pagina al diapozitivului.

Height, Width - returneaza dimensiunile, în puncte. Sunt read-only pentru un master.

Shapes - returneaza colectia Shapes reprezentând toate elementele care au foest plasate sau inserate în master. Colectia poate contine desene, forme (shapes), obiecte OLE, imagini etc.

TextStyles - returneaza colectia TextStyles reprezentând 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 TextStyle (din colectia returnata de proprietatea TextStyles) contine un obiect TextFrame care descrie cum este plasat textul în boxa de text si un obiect Ruler care contine tab stopurile si informatia de indentare. Proprietatea Levels a obiectului TextStyle returneaza colectia TextStyleLevels care contine informatia de formatare pentru 5 nivele de lista ierarhizata (pentru titlu si corp se va utiliza întotdeauna nivelul întâi). Exemplul urmator utilizeaza aceste proprietati pentru o formatare:

With ActivePresentation.SlideMaster.TextStyles(ppBodyStyle).Levels(1)With .Font

.Name = "Arial"

.Size = 36End With

227

Page 228: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

With .ParagraphFormatLineRuleAfter = False.SpaceAfter = 6

End WithEnd With

Observatie. 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.

Tiparirea unei prezentari

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:

OutputType care returneaza sau stabileste care elemente ale presentarii se tiparesc. Poate fi o constanta de tip PpPrintOutputType:

ppPrintOutputBuildSlides ppPrintOutputNotesPages

ppPrintOutputOutline ppPrintOutputSixSlideHandouts

ppPrintOutputSlides (implicita) ppPrintOutputThreeSlideHandouts

ppPrintOutputTwoSlideHandouts

NumberOfCopies care returneaza sau stabileste numarul de copii tiparite.

FitToPage care este True daca la tiparire se va scala diapozitivul încât sa se potriveasca foii de hârtie.

Ranges care returneaza obiectul PrintRanges reprezentând domeniile de dipozitive care se tiparesc.

Collate care este True (si implicit) daca o copie a prezentarii este tiparita complet înaintea copiei urmatoare.

Exemplul urmator utilizeaza câteva 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.

Salvarea unei prezentari

Prima salvare a prezentarii, în care i se daun nume, se efectueaza prin metoda SaveAs:

228

Page 229: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

With Presentations.Add.Slides.Add 1, ppLayoutTitle.SaveAs "Sample"

End With

Urmatoarele salvari se obtin prin metoda Save:

ActivePresentation.Save

Închiderea unei prezentari

Pentru a închide o prezentare se aplica obiectului Presentation metoda Close:

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 întâi proprietatea Saved la True:

With Application.Presentations("Sample").Saved = True.Close

End With

Configurarea si executarea unei prezentari

Se va utiliza proprietatea SlideShowSettings a obiectului Presentation pentru a returna obiectul sinonim SlideShowSettings care reprezinta executia unei prezentari de diapozitive.

Obiectul SlideShowSettings are o singura metoda, Run, care executa prezentarea potrivit parametrilor stabiliti de proprietatile obiectului SlideShowSettings.

Dintre proprietati enumeram câteva în continuare.

AdvanceMode returneaza sau stabileste valoarea care controleaza modul de trecere la urmatorul diapozitiv. Poate fi o constanta de tip PpSlideShowAdvanceMode: ppSlideShowManualAdvance, ppSlideShowRehearseNewTimings sau ppSlideShowUseSlideTimings.

StartingSlide, EndingSlide stabilesc sau returneaza diapozitivul cu care se începe executia prezentarii si cel unde se termina vizionarea.

LoopUntilStopped care este True daca prezentarea se executa ciclic pâna la apasarea tastei ESC.

RangeType returneaza sau fixeaza tipul de prezentare executata. Poate fi una dintre constantele de tip PpSlideShowRangeType: ppShowAll, ppShowNamedSlideShow sau ppShowSlideRange.

Urmatorul exemplu ilustreaza câteva proprietati:

With ActivePresentation.SlideShowSettings.StartingSlide = 2.EndingSlide = 4.RangeType = ppShowSlideRange.AdvanceMode = ppSlideShowUseSlideTimings

229

Page 230: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

.LoopUntilStopped = True

.RunEnd With

unde se remarca faptul ca ultima instructiune apeleaza metoda Run, dupa ce s-au fixat atributele executiei.

Accesul la diapozitivele prezentarii

Prin metoda Slides a obiectului Presentation se obtine accesul la diapozitivele prezentarii si, de aici, la textul si grafica unui diapozitiv. Obiectul Slide este prezentat în sectiunea urmatoare.

Obiectele Slides, Slide si SlideRange

Exista trei obiecte diferite în modelul de obiecte PowerPoint care reprezinta diapozitive: colectia Slides a tuturor diapozitivelor dintr-o prezentare, colectia SlideRange a diapozitivelor dintr-o submultime de diapozitive si obiectul Slide care reprezinta un diapozitiv individual. În general, se va utiliza colectia Slides pentru adaugarea unui diapozitiv si când se parcurg toate diapozitivele prezentarii; se va utiliza obiectul Slide daca se lucreaza cu un anumit diapozitiv; se va utiliza colectia SlideRange pentru a formata sau lucra cu mai multe diapozitive.

Returnarea colectiei Slides

Întreaga multime de diapozitive a unei prezentari este referita prin proprietatea Slides a obiectului Presentation. Urmatorul exemplu insereaza slide-urile din Clipboard la sfârsitul prezentarii (pentru ca nu s-a specificat locul lipirii prin .Paste(index)):

Activepresentation.Slides.Paste

Returnarea obiectului Slide

O referinta la un slide anumit se obtine prin intermediul colectiei Slides î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 când î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 SlideID a unui slide returneaza numarul de identificare, proprietatea fiind read-only. Proprietatea FindBySlideID permite specificarea unui slide prin ID-ul sau. Exemplul urmator utilizeaza aceste proprietati:

Dim newSlideID As LongnewSlideID = ActivePresentation.Slides.Add(1,ppLayoutTitleOnly).SlideIDActivePresentation.Slides.FindBySlideID(newSlideID).Copy

Pentru a obtine o referinta la diapozitivul afisat curent într-o fereastra document sau de slide show, se utilizeaza proprietatea Slide a obiectului View al ferestrei, dupa modelul

Windows(2).View.Slide.Copy

230

Page 231: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru a returna un slide dintr-o selectie, se foloseste Selection.SlideRange(index), unde index este numele sau numarul de ordine din colectie:

ActiveWindow.Selection.SlideRange(1).Layout = ppLayoutTitle

Returnarea unui obiect SlideRange

Prin Slides.Range(index), unde index este numele, indexul sau un tablou de asemenea elemente (nume sau indici), se returneaza un obiect SlideRange din colectia Slides. 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

Adaugarea unui diapozitiv

La colectia Slides se aplica metoda Add. 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 Slide. Sintaxa:

expression.Add(Index, Layout)

unde

expression returneaza o colectie Slides.

Index specifica rangul noului slide în colectia Slides (locul efectiv ocupat). Nu poate depasi Slides.Count + 1.

Layout specifica formatul noului diapozitiv. Poate fi una dintre constantele PpSlideLayout:

ppLayoutBlank ppLayoutChart ppLayoutChartAndText

ppLayoutClipartAndText ppLayoutClipArtAndVerticalText ppLayoutFourObject

sppLayoutLargeObject ppLayoutMediaClipAndText ppLayoutObject

ppLayoutObjectAndText ppLayoutObjectOverText ppLayoutOrgchart

ppLayoutTable ppLayoutText ppLayoutTextAndChart

ppLayoutTextAndClipart ppLayoutTextAndMediaClip ppLayoutTextAndObject

ppLayoutTextAndTwoObjects ppLayoutTextOverObject ppLayoutTitle

ppLayoutTitleOnly ppLayoutTwoColumnText ppLayoutTwoObjectsAndText

ppLayoutTwoObjectsOverText ppLayoutVerticalText ppLayoutVerticalTitleAndText

ppLayoutVerticalTitleAndTextOverChart

Exemplul urmator adauga un slide titlu la începutul prezentarii active.

231

Page 232: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

ActivePresentation.Slides.Add 1, ppLayoutTitleOnly

Inserarea de diapozitive bazate pe un outline Word se realizeaza prin metoda InsertFromFile, dupa modelul

ActivePresentation.Slides.InsertFromFile _FileName:=" … numele fisierului Word …", Index:=3

Metoda are un domeniu mai larg de aplicabilitate, sintaxa este

expression.InsertFromFile(FileName, Index, SlideStart, SlideEnd)

unde

expression returneaza o colectie Slides.

FileName este numele fisierului, eventual cu cale.

Index rangul diapozitivului din colectia Slides specificata dupa care se insereaza noile diapozitive.

SlideStart, SlideEnd specifica prin indicii de inceput si de sfârsit domeniul diapozitivelor din fisier care se insereaza în colectia Slides. Indicele omis este luat implicit drept indicele minim, respectiv maxim.

Stabilirea fundalului si a schemei de 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 Background sau ColorScheme a obiectului Slide sau SlideRange.

Proprietatea Background returneaza un obiect ShapeRange, se aplica proprietatea Fill pentru returnarea obiectului FillFormat 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 FollowMasterBackground trebuie fixata pe False.

Datorita complexitatii obiectului, FillFormat 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, msoGradientDaybreakEnd With

metoda PresetGradient aplica un efect vizual caracterizat de trei parametri, Style, Variant si PresetGradientType, corespunzând dialogului Fill 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 ColorScheme a unui obiect Slide sau SlideRange returneaza obiectul ColorScheme care reprezinta schema de culori. Se poate schimba apoi schema sau se poate utiliza metoda Colors pentru a edita culori. Numerotarea schemelor de culori este cea din dialogul Color Scheme din PowerPoint. Exemplele urmatoare ilustreaza mecanismul modificarilor.

232

Page 233: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 PpColorSchemeIndex: 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 layout

La adaugarea unui diapozitiv s-a vazut ca se stabileste si layout-ul acestuia prin argumentul Layout. Returnarea sau modificarea layout-ului se realizeaza prin proprietatea Layout:

ActivePresentation.Slides(1).Layout = ppLayoutTextAndChart

La modificarea layout-ului sunt totusi pastrate si rezervarile care contin text sau obiecte.

Adaugarea de obiecte la un diapozitiv

Se pot adauga obiecte (cum ar fi AutoShapes, obiecte OLE, imagini) la un diapozitiv utilizând una dintre metodele colectiei Shapes. O referinta la aceasta colectie se obtine prin proprietatea Shapes a obiectului Slide, colectia reprezentând întregul layer de desen de pe un diapozitiv. Operarea cu aceste obiecte este descrisa într-un capitol separat, dedicat obiectelor desenate.

Schimbarea ordinii diapozitivelor

Pentru a schimba locul unui diapozitiv într-o prezentare se utilizeaza metodele Cut si Paste prin care se ia un diapozitiv din locul vechi si se insereaza în noua pozitie:

With ActivePresentation.Slides.Item(4).Cut.Paste 6

End With

care muta diapozitivul diapozitivul 4 pe locul 6 din prezentare.

Stabilirea efectelor tranzitiei diapozitivelor

Atributele tranzitiei unui diapozitiv sunt pastrate în proprietatile obiectului SlideShowTransition, returnat de proprietatea sinonima SlideShowTransition a obiectului Slide sau SlideRange. Proprietatile privind tranzitia corespund optiunilor disponibile prin dialogul specializat din PowerPoint: AdvanceOnClick, AdvanceOnTime, AdvanceTime, EntryEffect, SoundEffect, Speed.

Primele doua proprietati, AvanceOnClick si AvanceOnTime, sunt True daca trecerea la urmatorul slide are loc la click sau dupa un timp fixat de AdvanceTime. Pot fi stabilite ambele tipuri de avans la True.

233

Page 234: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

EntryEffect stabileste modul de aparitie a noului diapozitiv. Poate avea una dintre valorile tipului enumerat PpEntryEffect, de forma ppEffectAppear, ppEffectBlindsHorizontal, ppEffectBlindsVertical, ppEffectBoxIn si înca alte vreo 60 de constante, descriind efectele selectabile prin dialogurile PowerPoint.

SoundEffect returneaza obiectul sinonim care controleaza ce se va cânta când are loc tarnzitia. Metoda utila (nu sunt multe altele) este ImportFromFile prin care se specifica un fisier de tip sound.

Speed precizeaza ritmul efectuarii tranzitiei. Returneaza sau stabileste acest ritm ca o constanta de tip PpTransitionSpeed: ppTransitionSpeedFast, ppTransitionSpeedMedium, ppTransitionSpeedMixed sau ppTransitionSpeedSlow.

Exemplul urmator ilustreaza câteva dintre aceste proprietati.

With ActivePresentation.Slides(1).SlideShowTransition.Speed = ppTransitionSpeedFast.EntryEffect = ppEffectStripsDownLeft.SoundEffect.ImportFromFile "c:\…\bass.wav".AdvanceOnTime = True.AdvanceTime = 5

End WithActivePresentation.SlideShowSettings.AdvanceMode = _

ppSlideShowUseSlideTimings

În exemplu se remarca faptul ca proprietatea AdvanceMode ia valoarea ppSlideShowUseSlideTimings, pentru considerarea timpului fixat la tranzitia diapozitivului.

Referirea notitelor vorbitorului (Speaker's notes)

Proprietatea NotesPages returneaza un obiect SlideRange 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 SlideRange care reprezinta un domeniu de slide-uri.

Pentru a modifica toate diapozitivele simultan se va utiliza proprietatea NotesMaster a obiectului Presentation, proprietatea care returneaza un obiect Slide reprezentând masterul notitelor.

ActivePresentation.Slides(1).NotesPage.Shapes.Placeholders(2) _.TextFrame.TextRange.InsertAfter " …textul care se adauga… "

Obiectul Selection

În PowerPoint, obiectul Selection reprezinta selectia efectuata într-o fereastra de document. Se pot utiliza metodele obiectului Selection pentru a taia, copia, sterge sau deselecta portiunea selectata. Proprietatea Type a obiectului Selection identifica tipul selectiei (diapozitive, shape, text sau nimic). Pentru returnarea unui anumit tip de selectie se vor utiliza proprietatile ShapeRange, SlideRange si TextRange.

Observatie. 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 cât posibil, independent de selectie.

Crearea unei selectii

234

Page 235: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Se poate obtine o selectie fie în mod manual, fie aplicând metoda Select unuia dintre obiectele Shape, ShapeRange, Slide, SlideRange sau TextRange. 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 Selection a obiectului DocumentWindow pentru a returna selectia din fereastra respectiva:

ActiveWindow.Selection.Cut

Returnarea unui obiect din selectie

Prin proprietatea ShapesRange a obiectului Selection se returneaza colectia ShapeRange 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 TextRange se poate accesa textul dintr-o selectie sau textul dintr-o forma desenata. În continuare se prezinta principalele operatiuni realizate prin intermediul obiectului TextRange.

Returnarea domeniului de text dintr-o selectie.

ActiveWindow.Selection.TextRange.Copy

Prin intermediul metodelor Characters, Lines, Paragraphs, Runs, Sentences sau Words se poate obtine o portiune anumita de text din textul continut în TextRange.

Returnarea domeniului de text dintr-o forma desenata (shape) se realizeaza prin proprietatea TaxtRange a obiectului TextFrame.

ActiveWindow.Selection.ShapeRange(3).TextFrame.TextRange _.Characters(1,3).Font.Bold = True

Se utilizeaza proprietatea HasTextFrame pentru a vedea daca o forma are atasat un cadru cu text si se utilizeaza proprietatea HasText pentru a determina daca exista text în cadrul de text.

Inserarea de text, data si timp sau numar de slide se realizeaza prin intermediul metodelor InsertAfter, InsertBefore, InsertDateTime, InsertSlideNumber sau InsertSymbol.

Prin proprietatea SlideRange a obiectului Selection se returneaza colectia SlideRange care include toate diapozitivele selectate. Exemplul urmator taie diapozitivele selectate în fereastra activa.

ActiveWindow.Selection.SlideRange.Cut

235

Page 236: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Obiectele View si SlideShowView

La deschiderea unui fisier în PowerPoint, se creeaza simultan un obiect Presentation, care reprezinta continutul fisierului, un obiect DocumentWindow, care reprezinta interfata dintre utilizator si fisier în modul design, un obiect View, care reprezinta un container pentru continutul fisierului în modul design.

La pornirea unui slide show, se creeaza un obiect SlideShowWindow, care reprezinta interfata între utilizator si fisier în modul run, si un obiect SlideShowView, care reprezinta un container pentru continutul fisierului în modul run (de executie).

Întelegerea prezentarilor, ferestrelor si a viziunilor

Modificarile entitatilor care se vad pe ecranul aplicatiei se realizeaza prin modificarea unuia dintre obiectele Presentation, DocumentWindow sau View. 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 DocumentWindow sau SlideShowWindow. 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, cât de mari apar pe ecran elementele – sunt modificari ale viziunii si sunt controlate de proprietatile si metodei obiectelor View si SlideShowView. Aceste modificari nu afecteaza continutul fisierului si nu sunt retinute la comutarea viziunilor.

Returnarea obiectelor View si SlideShowView

Obiectul View reprezinta modul în care informatia este afisata în fereastra documentului. Se utilizeaza proprietatea View a obiectului DocumentWindow pentru a returna un obiect View. Urmatorul exemplu fixeaza fereastra documentului sa se ajusteze automat la dimensiunile ferestrei aplicatiei.

Windows(1).View.ZoomToFit = True

Obiectul SlideShowView reprezinta modul în care informatia este afisata în fereastra de slide show. Se utilizeaza proprietatea View a obiectului SlideShowWindow pentru a returna obiectul SlideShowView. Urmatorul exemplu executa un slide show a prezentarii active cu inhibarea shortcut-urilor (metoda Run a obiectului SlideShowSettings returneaza un obiect SlideShowWindow)

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

Page 237: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

.PointerType = ppSlideShowPointerPenEnd With

Navigarea printre diapozitive

Prin metoda GoToSlide a obiectului View sau SlideShowView 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 First, la ultimul diapozitiv prin Last, sau se poate trece la un slide show denumit prin metoda GoToNamedShow. Prin ultima metoda se trece la alta prezentare de diapozitive în timpul unei alte prezentari. Când prezentarea avanseaza, urmatorul diapozitiv aratat este urmatorul din prezentarea unde s-a facut transferul si nu urmatorul din prezentarea curenta. Sintaxa este

expression.GotoNamedShow(SlideShowName)

unde

expression este obligatorie, returneaza un obiect SlideShowView.

SlideShowName este obligatoriu, numele slide show-ului unde se trece controlul.

SlideShowWindows(1).View.GotoNamedShow "…slide show-ul unde se trece …"

Alipirea continutului Clipboard-ului la un obiect View

Prin metoda Paste a obiectului View 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.CopyWindows(2).View.Paste

Operatiunea de alipire depinde de viziunea ferestrei. Situatiile posibile de copiere a continutului din Clipboard sunt prezentate în tabelul urmator.

Viziunea Se poate alipi

Slide view sau notes page view

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

Page 238: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

un obiect scufundat.

Outline view 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 view.

Slide sorter view 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 view.

Din tabel rezulta importanta alegerii unei viziuni corecte pentru prezentare înainte de a efectua o operatiune de taiere+alipire.

Stabilirea sau verificarea tipului de viziune din fereastra documentului

Prin proprietatea Type a obiectului View se obtine ce fel de viziune are documentul activ iar proprietatea ViewType a obiectului DocumentWindow 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.CopyWith Windows(2)

.ViewType = ppViewSlide

.View.PasteEnd With

Alte constante pentru viziuni sunt grupate în PpViewType:

ppViewHandout, ppViewHandoutMaster, ppViewNotesMaster,

ppViewNotesPage, ppViewOutline, ppViewSlide,

ppViewSlideMaster, ppViewSlideShow, ppViewSlideSorter

ppViewTitleMaster

Interpretarile sunt imediate.

Returnarea diapozitivului curent

Proprietatea Slide returneaza obiectul Slide care reprezinta diapozitivul afisat în acel moment într-o fereastra de slide show sau într-o fereastra document.

SlideShowWindows(1).View.Slide.Copy

238

Page 239: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Daca slide-ul afisat curent este dintr-o prezentare scufundata, se poate utiliza proprietatea Parent a obiectului Slide returnat de proprietatea sinonima pentru a returna prezentarea scufundata (proprietatea Presentation a obiectului SlideShowWindow sau DocumentWindow returneaza prezentarea în care fereastra a fost creata si nu prezentarea scufundata).

Controlarea comportarii obiectelor în timpul unui slide show

Întregul strat de desen de pe un diapozitiv este reprezentat de colectia Shapes 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 Shape. Utilizând proprietatile si metodele colectiei Shapes se pot adauga obiecte la diapozitive si se obtine acces la obiectele individuale de pe un diapozitiv. Prin proprietatile si metodele unui obiect Shape 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.

Controlul animatiei

Obiectul AnimationSettings contine proprietatile si metodele care controleaza cum si când 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 AnimationSettings este important sa se înteleaga interactiunea dintre proprietatile obiectului între ele si cu proprietatea AdvanceMode a obiectului SlideShowSettings.

Efectele valorilor stabilite pentru proprietatile obiectului AnimationSettings nu devin vizibile decât daca forma respectiva este animata, adica proprietatea Animate este fixata pe True.

În animarea textului proprietatea TextUnitEffect stabileste unitatea de animatie (cuvânt, paragraf etc) prin ppAnimateByCharacter, ppAnimateByParagraph, ppAnimateByWord sau ppAnimateUnitMixed. Proprietatea TextLevelEffect (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 AdvanceMode la ppAdvanceOnTime si se va indica un numar de secunde în AdvanceTime. Totodata, proprietatea AdvanceMode a obiectului SlideShowSettings trebuie sa fie ppSlideShowUseSlideTimings.

239

Page 240: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Proprietatea AfterEffect controleaza ce se întâmpla 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 DimColor nu este vizibil decât daca AfterEffect este stabilit la ppAfterEffectDim.

Ordinea de animare a formelor de pe un slide este stabilita prin proprietatea AnimationOrder, proprietatea EntryEffect stabileste modul de aparitie a formei iar ChartUnitEffect controleaza modul de animare al elementelor unei diagrame.

Controlul raspunsului la actiunea mouse-ului

Efectul actiunilor mouse-ului (click sau trecere peste forma) este controlat de colectia ActionSettings. Colectia contine doua obiecte identificate prin indexul ppMouseClick sau ppMouseOver reprezentând, 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 PpActionType:

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 când 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 = TrueEnd With

Daca se stabileste o proprietate a obiectului ActionSettings dar fara efectul scontat, se va verifica valoarea atribuita proprietatii Action. Tabelul care urmeaza ofera câteva precizari.

240

Page 241: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Daca se utilizeaza proprietatea

Pentru a efectua Valoarea necesara pentru proprietatea Action

Hyperlink Stabilirea proprietatilor pentru hiperlegatura care este urmarita ca raspuns la actiunea mouse-ului.

ppActionHyperlink

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

ActionVerb Stabilirea verbului OLE care va fi invocat ca raspuns la actiunea mouse-ului.

ppActionOLEVerb

SlideShowName Stabilirea numelui slide show-ului propriu care se va executa ca raspuns la o actiune a mouse-ului.

ppActionNamedSlideShow

Urmatorul exemplu utilizeaza proprietatea Hyperlink:

With ActivePresentation.Slides(1).Shapes(1).ActionSettings(ppMouseClick).Action = ppActionHyperlink.Hyperlink.Address = "http://www.infoiasi.ro"

End With

Controlul unui clip

Obiectul PlaySettings, returnat prin proprietatea PlaySettings a obiectului AnimationSettings, contine proprietati si metode care controleaza cum si când 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 când 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 (utilizând comanda Object din meniul Insert sau utilizând metoda AddMediaObject) sau ca un obiect media nativ (utilizând meniul Movies and Sounds sau

241

Page 242: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

metoda AddMediaObject), se pot aplica diferite proprietati obiectului PlaySettings. Se regasesc astfel optiunile disponibile în fisa Play Settings din dialogul Custom Animation (deschis din meniul SlideShow).

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 PlaySettings se aplica numai clipurilor media native. Proprietatea ActionVerb, care corespunde optiunilor listate în boxa Object din fisa PlaySettings a dialogului Custom Animation, este singura care nu se aplica clipurilor media native.

Utilizând proprietatea Type a obiectului Shape se poate determina daca un clip este nativ (valoarea returnata msoMedia) sau nu. Proprietatea MediaType a obiectului Shape 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 pâna sunt oprite manual.

Dim so As ShapeFor Each so In ActivePresentation.Slides(1).Shapes

If so.Type = msoMedia ThenIf so.MediaType = ppMediaTypeSound Then

so.AnimationSettings.PlaySettings.LoopUntilStopped = TrueEnd If

End IfNext

242

Page 243: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Meniuri si bare de unelte

Modificarea interfetei cu utilizatorul Dialogul Customize Visual BasicDomeniul schimbarilor asupra interfetei utilizator Microsoft Access Microsoft Excel Mutarea unui element din spatiul de lucru în caiet Eliminarea unui meniu/toolbar salvat în caiet Microsoft Word Microsoft PowerPointComponente ale interfetei utilizatorSistemul de 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 Indicarea starii unei intrari de meniu Redenumirea unei intrariBare de 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 Indicarea starii activ/inactiv a unui buton Modificarea controalelor Text box, List box si Combo boxID-uri de controale si intrari de meniu

243

Page 244: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Interfata 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 atât actiunile permise de mediu (prin dialogul Customize – comun aplicatiilor Word, Excel, PowerPoint, Access) asupra meniurilor si barelor de unelte afisate, cât si actiunile programatice, din Visual Basic, asupra obiectelor respective.

Modificarea interfetei cu utilizatorul

Interfata 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 Customize 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 Customize

Prin intermediul casetei de dialog Customize 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 Customize se urmeaza succesiunea: meniul View — Toolbars — Customize. Acelasi efect se obtine prin punctarea unei bare de unelte si click dreapta. Din meniul contextual se alege apoi Customize. 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 Toolbars contine un buton Properties care afiseaza dialogul Toolbar Properties prin care se fixeaza proprietatile barelor de meniu sau de unelte,

o în Excel, fisa Toolbars contine un buton Attach care afiseaza dialogul Attach Toolbars prin care se pot copia (atasa) la caietul activ bare de unelte/meniu din spatiul de lucru al aplicatiei,

244

Page 245: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o în Word, fisa Commands contine o lista derulanta Save in în care se alege contextul modificarilor din design-time (template, document etc.) si un buton Keyboard care initiaza un dialog de stabilire a cheilor directe. Dialogul NewToolbar, care apare la click pe New (fisa Toolbars), contine de asemenea optiunea Make toolbar available to pentru fixarea domeniului de vizibilitate.

Dupa deschiderea dialogului Customize se urmeaza aceeasi procedura pentru modificarea oricarui meniu sau toolbar, indiferent daca este predefinit sau construit de utilizator. Pasii uzuali sunt

o în lista Toolbars din fisa Toolbars 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 Customiza 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 Customize 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 utilizând portiunea reprezentând barele de comanda din modelul de obiecte, comuna tuturor aplicatiilor din Microsoft Office. Nivelul cel mai înalt este colectia CommandBars, returnata de proprietatea CommandBars în toate aplicatiile din Office. Fiecare bara de meniu, meniu contextual sau bara de unelte este reprezentata printr-un obiect CommandBar în aceasta colectie. Un obiect CommandBar contine o colectie CommandBarControls reprezentând elementele de control ale barei respective.

Ierarhia 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 Customize. 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 Customize pentru crearea unei bare noi de meniu, aceasta se va crea prin program si dupa aceea se poate configura prin dialogul Customize.

o Daca aplicatia gazda nu ofera posibilitatea de afisare simultana a dialogului Customize 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

Page 246: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Domeniul schimbarilor asupra interfetei utilizator

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 Startup.

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 Toolbars (din meniul View) pentru a o afisa; bara respectiva va apare de fiecare data când se porneste aplicatia.

o Daca aplicatia are bare diferite pentru forme sau rapoarte, se va specifica bara necesara în proprietatea Toolbar 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 Visible a obiectului CommandBar în Visual Basic sau actiunea ShowToolbar în macro-uri.

o Daca se doreste ca aplicatia sa afiseze doar barele proprii, se pot ascunde barele de unelte built-in prin comanda Startup (meniul Tools) si se deselecteaza boxa de control Allow Built-in Toolbars.

Microsoft Excel

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 Username8.xlb (unde Username 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, încât barele de unelte sa fie memorate în acelasi fisier cu aplicatia.

Mutarea unui meniu sau bara de unelte din spatiul de lucru în caiet

• Daca dialogul Customize nu este deschis, se va afisa prin View - Toolbars - Customize. • În fisa Toolbars a dialogului, click pe Attach. Ca urmare a actiunii se afiseaza dialogul Attach

Toolbars.

246

Page 247: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

• În caseta din stânga Custom toolbars se selecteaza numele meniului sau barei de unelte care se copie în caietul activ.

• Click Copy. Numele obiectului copiat apare în lista din dreapta Toolbars in workbook.

Obiectul original, de la nivelul spatiu de lucru, poate fi eliminat în mod uzual actionând butonul Delete din dialogul Customize, fisa Toolbars.

Daca versiunea de la nivelul saptiului de lucru (workspace) 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 meniu/bara de unelte salvat în caiet

Versiunea salvata în caiet poate fi eliminata prin:

• Daca dialogul Customize nu este deschis, se va deschide dupa procedura uzuala. • În fisa Toolbars click pe Attach. Se afiseaza dialogul Attach Toolbars. • În zona Toolbars in workbook click pe numele obiectului care se elimina. • Click Delete.

Observatie. 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 întâi 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, încât 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 ramân 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 Word

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 Tools, comanda Templates and Add-ins).

247

Page 248: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Customize 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 CommandBars se aplica doar obiectului Application, contextul trebuie fixat înainte de efectuarea modificarilor. Similar utilizarii zonei Store in din fisa Commands, dialogul Customize, în Visual Basic se va stabili valoarea proprietatii CustomizationContext pentru a specifica un obiect Document sau Template, reprezentând locul unde se executa modificari. Proprietatea CustomizationContext se fixeaza înaintea utilizarii proprietatii CommandBars ceea ce asigura returnarea unei referinte la colectia corecta (din document sau din template).

Microsoft PowerPoint

Obiectele personale sunt memorate întotdeauna în spatiul de lucru. La parasirea aplicatiei PowerPoint, barele de unelte din spatiul de lucru sunt salvate în fisierul Username.pcb (unde Username 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 Customize, 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.

Componente ale interfetei utilizator

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 decât barele de unelte (nu toate comenzile sunt afisate permanent).

Barele de 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 ramân 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 de dialog. Daca se doreste plasarea unei unelte mai aproape de datele asociate, cea mai buna solutie poate fi plasarea unui control direct în document.

248

Page 249: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Mai multe informatii pot fi gasite în capitolul Controale ActiveX si dialoguri.

Sistemul de meniuri

În fiecare aplicatie Microsoft Office, sistemul de meniuri este compus dintr-o multime de meniuri si câte 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 punctând spre dreapta. Submeniurile se pot adauga si la meniurile contextuale. Un submeniu este afisat atunci când 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 când utilizatorul executa un click dreapta pe un obiect care are atasat un asemenea meniu.

Actiuni de adaptare a sistemului de 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).

Adaugarea de componente personale sau modificarea componentelor built-in

Fiecare aplicatie din Office are un meniu sistem propriu. Componentele acestuia pot fi modificate sau se pot crea si modifica componente personale.

249

Page 250: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Se alege modificarea unui meniu predefinit atunci când 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.

Utilizarea submeniurilor

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.).

Utilizarea meniurilor contextuale

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.

Utilizarea controalelor Text Box, List Box si Combo Box

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.

Modificarile sistemului de meniuri în timpul proiectarii (design-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.

Adaugarea unei bare de meniu proprii

În Microsoft Access exista posibilitatea adaugarii unei bare proprii de meniu atât în Visual Basic, cât si prin dialogul Customize. În Microsoft Excel, Word si PowerPoint adaugarea se poate efectua doar prin Visual Basic.

Dialogul Customize (doar Microsoft Access)

• Deschiderea dialogului Customize, • Fisa Toolbars, click New • În boxa Toolbar name se tasteaza numele noii bare si click OK. • Click Properties pentru afisarea dialogului Toolbar Properties. • În zona Type se alege Menu Bar.

Noua bara de meniu este adaugata listei din caseta Toolbars a fisei Toolbars (caseta Customize).

250

Page 251: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Visual Basic

Prin metoda Add a colectiei CommandBars se creeaza o noua bara de meniu; argumentul MenuBar al metodei Add determina când obiectul CommandBar 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)

Adaugarea 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.

Observatie.Desi o aplicatie Microsoft Office poate sa listeze barele de unelte cu meniurile contextuale din fisa Toolbars a dialogului Customize, 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 Customize

• Afisarea dialogului Customize. • Vizualizarea barei de meniu dorite prin selectarea în lista Toolbars. • În fisa Commands click New Menu în lista Categories. • Se trage itemul New Menu din cutia Commands la pozitia dorita de pe bara de meniu. • Click dreapta pe noul menu si completarea numelui în zona Name. 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 Customize 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 Customize. • Vizualizarea barei de meniu dorite prin selectarea în lista Toolbars. • În fisa Commands click Built-in Menus în boxa Categories. • Se trage un meniu built-in din boxa Commands în pozitia dorita.

Visual Basic

Pentru adaugarea unui meniu se utilizeaza metoda Add a colectiei CommandBarControls. Prin aceasta se adauga un meniu la bara reprezentata de obiectul CommandBar implicat. Argumentul Type al metodei Add trebuie dat drept msoControlPopup pentru a indica afisarea unui meniu activarea controlului adaugat. Controalele care afiseaza meniuri sunt cunoscute drept controale pop-up. Argumentul Before indica pozitia noului meniu între cele deja existente.Proprietatea Caption a obiectului CommandBarPopup returnat de metoda Add 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

Page 252: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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.

Adaugarea submeniurilor

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 întâi se defineste un submeniu vid la care se adauga apoi intrarile dorite.

Dialogul Customize

• Se afiseaza dialogul Customize • Daca bara de meniu care contine meniul la care se face atasarea nu este vizibila se activeaza prin

Toolbars. • În fisa Commands click New Menu în boxa Categories. • Se trage New Menu din boxa Commands în pozitia de pe meniu unde se ataseaza. Daca atasarea

este pe un nivel inferior, se trage mai întâi pe meniu si pe urma din titlu în titlu pâna se deschide nivelul unde are loc atasarea.

• Click dreapta pe noul submeniu pentru a-i fixa numele în zona Name. 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 atât cu ampersand. cât si fara.

Adaugarea si gruparea comenzilor

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

Page 253: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Dialogul Customize

Pentru adaugarea unei comenzi built-in:

• Se afiseaza dialogul Customize. • Daca bara de meniu care contine meniul la care se face atasarea nu este vizibila se activeaza prin

Toolbars. • În fisa Commands se selecteaza o categorie de comenzi din boxa Categories. Comenzile din

categoria selectata sunt listate în boxa Commands. • Se trage comanda dorita din boxa Commands î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 Customize 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 Access

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 Categories 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 Categories se alege orice categorie si se trage o comanda oarecare pe meniul dorit. Dupa aceea, prin click dreapta si selectare Control Properties se deschide dialogul sinonim. În zona Caption 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 Categories click Macros si se trage Custom Menu Item din caseta Commands la pozitia dorita pe meniu. Click dreapta pe noua intrare si apoi click pe Assign Macro. În Macro Name din dialogul Assign Macro se precizeaza numele macroului atasat intrarii.

Microsoft Word

Se urmeaza aceeasi pasi ca în procedura pentru adaugarea unei comenzi built-in la un meniu:; în caseta Categories click Macros, în caseta Commands apare lista procedurilor atasate si se trage macroul dorit în pozitia adecvata din meniu.

Observatie. Daca în Word se scrie o procedura al carui nume coincide cu numele unei comenzi built-in (sau daca o procedura cu numele "MAIN" exista într-un modul cu nume identic comenzii), procedura va înlocui functionalitatea predefinita a comenzii built-in de fiecare data când 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 PowerPoint

Se procedeaza la fel ca în Microsoft Word.

253

Page 254: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Modificarea aspectului unei comenzi

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 Customize 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, Change Button Image si selectarea imaginii dorite din caseta afisata.

o Copierea imaginii unui alt buton: click dreapta pe butonul a carui imagine se copie, Copy 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 16×16 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, Edit Button Image, se editeaza imaginea în dialogul afisat si OK.

o Restabilirea imaginii originale (sau nimic daca nu exista imagine implicita): click dreapta si ResetButton Image.

Gruparea comenzilor

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 Customize. 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 Add a colectiei CommandBarControls pentru adaugarea unei noi intrari la obiectul CommandBar care reprezinta un meniu sau un submeniu particular. Pentru adaugarea unei comenzi built-in se va specifica numarul ID al comenzii în argumentul Id al metodei Add.

Urmatorul exemplu adauga comanda Spelling la meniul numit "Quick Tools" de pe bara de meniu "Custom Menu Bar".

Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _.Controls.Add(Id:=2)

Informatii suplimentare se gasesc în sectiunea "Identificarea 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 Type al metodei Add va avea valoarea msoControlButton indicând o comanda.

Exemplul urmator, pentru Microsoft Excel, adauga un meniu Open Database la meniul File. Comanda adaugata executa procedura OpenDatabaseProc.

Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _

254

Page 255: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

.Controls.Add(Type:=msoControlButton, Before:=3)With databaseItem

.Caption = "Open Database"

.OnAction = "OpenDatabaseProc"End With

Exista multe proprietati ale obiectelor reprezentând comenzile din meniuri, proprietati care pot fi fixate în Visual Basic. Pentru mai multe informatii se va studia obiectul CommandBarButton din Help.

Textul descriptiv afisat la punctarea controlului poate fi dat în proprietatea TooltipText. În DescriptionText se poate da un text afisat în bara de stare a aplicatiei etc.

Proprietatea Style stabileste tipul butonului, cu imagine atasata sau nu, constantele predefinite sunt (MsoButtonStyle): msoButtonAutomatic, msoButtonIcon, msoButtonCaption sau msoButtonIconandCaption.

Pentru a începe un grup se va fixa proprietatea BeginGroup a unui obiect CommandBarButton, CommandBarPopup, sau CommandBarComboBox la True. Atribuirea valorii False va elimina linia despartitoare de grupul precedent. Astfel

databaseItem.BeginGroup = True

adauga o linie înaintea intrarii definite în exemplul precedent.

Se utilizeaza Control(index), unde index este titlul sau indexul unei intrari, pentru a returna obiectul care reprezinta intrarea.

Dintre metode mentionam doar metoda SetFocus prin care se stabileste focalizarea pe respectiva comanda (actionarea tastaturii are efect direct asupra controlului) si metoda Execute prin care se executa procedura atasata controlului.

Adaugarea si modificarea meniurilor contextuale

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 Customize (î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 Customize

Pentru Microsoft Access se poate utiliza dialogul Customize pentru adaugarea unui meniu contextual:

o Se afiseaza dialogul Customize. o În fisa Toolbars click New. o În boxa Toolbar name se introduce numele noului menu contextual si OK. Este afisat un meniu

flotant, vid, cu numele dat. o Click Properties pentru afisarea dialogului Toolbar Properties.

255

Page 256: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

o În Type se selecteaza Shortcut Menu.

Pentru afisarea noului menu contextual din dialogul Customize se va selecta checkboxul de la Shortcut Menus din fisa Toolbars. Meniul creat este listat ultimul în bara afisata.

Visual Basic

Prin metoda Add a colectiei CommandBars se creeaza un nou meniu contextual daca se fixeaza valoarea msoBarPopup pentru argumentul Position 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 CommandBars(name), unde name este numele meniului contextual, se returneaza obiectul CommandBar reprezentând meniul contextual. Operând cu elementele colectiei Controls disponibila din obiectul CommandBar se poate personaliza meniul contextual.

Stergerea 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 atât prin simplificarea interfetei (mai ales pentru utilizatori lipsiti de experienta) cât 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 Customize

Cu dialogul Customize deschis se poate elimina orice componenta de meniu prin

o Se deschide dialogul Customize 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 Customize, fisa Toolbars, 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 Edit din bara de meniu pentru diagrame.

CommandBars("Chart Menu Bar").Controls("Edit").Delete

Urmatorul exemplu sterge o bara de meniu proprie

256

Page 257: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

CommandBars("Custom Menu Bar").Delete

Restaurarea componentelor de meniu built-in

Dialogul Customize

Utilizarea acestui dialog pentru restaurarea componentelor meniu/submeniu la configuratia originala se face prin:

o Afisarea dialogului Customize. 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 Customize, click pe numele barei de meniu în lista Toolbars 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 reprezentând 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.

Modificarile sistemului de meniuri în executie (run-time)

Sistemul de meniuri create în timpul proiectarii poate fi programat astfel încât 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 bare de meniu

Pentru afisarea unei bare proprii de meniu în locul bare de meniu active, se fixeaza proprietatea Visible a obiectului CommandBar corespunzator la valoarea True. Noua bara de meniu vizualizata înlocuieste în mod automat bara activa. Prin fixarea proprietatii Visible 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 Visible pentru bara de meniu proprie, sau se utilizeaza un macro activat de utilizator sau prin program.

257

Page 258: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Afisarea dinamica a componentelor de meniu

Daca o componenta de meniu se aplica doar unui document particular, este recomandabil ca aceasta componenta sa apara doar atunci când 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 Visible 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.

Observatie. Deoarece Word memoreaza personalizarile în documente sau sabloane, componentele proprii sunt vizibile atunci când documentul sau sablonul este disponibil în contextul curent si ascunse atunci când 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 Visible în proceduri eveniment.

Permiterea si inhibarea componentelor de 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 Enabled 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 File 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

Indicarea starii unei intrari de meniu

Daca o intrare a unui meniu reprezinta o optiune cu doua stari, este posibil sa se modifice aspectul imaginii comenzii încât sa arate ca un buton apasat sau ridicat, potrivit starii optiunii. Aceasta se realizeaza prin stabilirea proprietatii State a intrarii. Proprietatea poate avea una dintre valorile (constantele MsoButtonState): msoButtonUp, msoButtonDown sau msoButtonMixed.

Exemplul urmator (în Excel) comuta între cele doua stari ale unei comenzi proprii inserate în meniul View:

258

Page 259: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Sub DatabaseView()With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")

If .State = msoButtonUp Then.State = msoButtonDown' comutare la viziunea database

Else.State = msoButtonUp' comutare la viziunea worksheet

End IfEnd With

End Sub

În timpul executiei se poate schimba imaginea butonului prin lucrul cu proprietatea FaceId 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 ID sau si sa se atribuie aceasta valoare proprietatii FaceId (schimbarea proprietatii FaceId 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")

If .State = msoButtonUp Then.FaceId = 987.State = msoButtonDown' comutare la viziunea database

Else.FaceId = 1.State = msoButtonUp' comutare la viziunea worksheet

End IfEnd With

End Sub

Redenumirea unei intrari de meniu

Proprietatea Caption contine denumirea intrarii. Modificând 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

Page 260: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Bare de unelte

Fiecare aplicatie Microsoft Office ofera un sistem de bare de unelte (toolbar) continând 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 View, comanda Toolbars si click pe numele barei dorite. Imaginea atasata barei respective devine selectata. Un nou click ascunde bara de unelte. Bare de unelte aditionale pot fi vazute în dialogul Customize, în lista din Categories.

Exista mai multe tipuri de controale care apar pe o bara de unelte, discutate în continuare.

Cel mai comun tip de unealta este un buton de 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 New creeaza un nou document) sau sa comute între doua stari posibile (cum ar fi butonul Bold).

Alt tip de control este un buton de control care contine o imagine si o paleta derulabila 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 Font Color.

Un control poate fi de tip text box, list box sau combo box. Utilizatorul poate fie tasta text în zona de text, fie actiona sageata în jos si selecta un element al listei. De exemplu, controlul Font Size de pe bara de unelte Word Formatting 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 Draw care produce la activare afisarea barei de unelte Drawing.

Observatie. 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 de adaptare a barelor de 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. Indiferent de calea aleasa, configuratia standard poate fi restaurata oricând.

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.

Utilizarea meniurilor

260

Page 261: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Draw, sau AutoShapes, de pe bara de unelte Drawing 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.

Utilizarea controalelor Text box, List box si Combo box

Controale de tip text box, list box si combo box se pot adauga atât la barele de unelte built-in cât 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 Customize 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 Customize este deschis, se poate modifica latimea oricarui control (built-in sau propriu) text box, list box sau combo box.

Modificarile barelor de unelte în timpul proiectarii (design-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.

Adaugarea unei bare de 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 Customize sau Visual Basic.

Dialogul Customize

• Se afiseaza dialogul Customize • În fisa Toolbars click New. • În Toolbar name se introduce numele noii bare de unelte si OK. Se afiseaza o bara de unelte flotanta,

cu numele introdus. La aceasta se pot adauga controale.

Noul toolbar este adaugat la lista Toolbars de pe fisa Toolbars a dialogului Customize.

Visual Basic

Se utilizeaza Add a colectiei CommandBars pentru a crea o noua bara de unelte. Prin fixarea argumentului Position la msoBarLeft, msoBarTop, msoBarRight, msoBarBottom sau msoBarFloating se stabileste daca obiectul CommandBar 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

Page 262: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Adaugarea si gruparea controalelor

Pe lânga adaugarea controalelor la orice bara de unelte, acestea pot fi separate prin linii dupa functionalitate.

Dialogul Customize

Prin dialogul Customize se pot adauga controale built-in în modul urmator:

• Se afiseaza dialogul Customize • Prin fisa Toolbars se vizualizeaza bara de unelte care se modifica. • În fisa Commands se alege categoria necesara de comenzi. Comenzile categoriei sunt afisate în

caseta Commands. • Se trage controlul care se adauga din lista Commands în pozitia sa de pe bara de unelte.

Pentru adaugarea controalelor proprii fiecare aplicatie Office are particularitatile ei, prezentate în continuare.

Microsoft Access

Pentru adaugarea unui control care executa un macro se urmeaza pasii descrisi anterior dar în Categories (fisa Commands) se selecteaza All Macros. Se trage apoi macroul dorit din lista Commands pe bara de unelte.

Pentru un control care executa o procedura de tip Function 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 Control Properties în care se fixeaza numele în Caption 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 Categories se alege Macros, se trage controlul Custom Button din lista Commands î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 Word

Similar procedurii de la Excel, în Categories se alege Macros si se trage din lista Commands denumirea procedurii dorite pe bara de unelte care se modifica. Utilizând 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 PowerPoint

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 Customize.

Stilurile posibile pentru un buton sunt descrise în tabelul urmator.

262

Page 263: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Stilul Aspectul butonului

Default Style Numai imaginea butonului

Text Only (în meniuri) Numai imaginea butonului

Text Only (în rest) Numai numele

Image And Text Imaginea si numele

Atunci când dialogul Customize este activ, se poate schimba imaginea de pe buton într-unul din modurile descrise la procedura similara de la intrarile unui meniu.

Gruparea controalelor

Într-un mod similar celui de la gruparea comenzilor de pe un meniu, pentru a începe un grup cu un control se activeaza dialogul Customize 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 Add a colectiei CommandBarsControls pentru adaugarea unui nou control la obiectul CommandBar care reprezinta toolbarul care se modifica. Adaugarea unui control built-in se efectueaza specificând numarul ID al controlului în argumentul Id al metodei Add. Urmatorul exemplu adauga controlul built-in Spelling la bara numita "Quick Tools".

Set mySpell = CommandBars("Quick Tools").Controls.Add(Id:=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 msoControlButton pentru a arata ca este bvorba de un buton. Se poate stabili proprietatea FaceId la ID-ul unui control built-in pentru a-i da o imagine definita.

Urmatorul exemplu (în Excel) adauga un buton pe bara de unelte Standard, înaintea butonului Save. Butonul reprezinta procedura OpenDatabaseProc. Exemplul stabileste imaginea butonului la o grila (ID 987).

Set databaseItem = CommandBars("Standard").Controls. _Add(Type:=msoControlButton, Before:=3)

With databaseItem.OnActiona = "OpenDatabaseProc".FaceId = 987

End With

Pentru a începe un nou grup se fixeaza pe True proprietatea BeginGroup a obiectului CommandBarButton, CommandBarPopup sau CommandBarComboBox reprezentând controlul.

Se utilizeaza Controls(index), unde index este titlul sau indicele controlului, pentru a returna obiectul reprezentând controlul.

Adaugarea si initializarea controalelor text box, list box si combo box

263

Page 264: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Daca un control de acest tip este built-in, adaugarea lui se poate efectua prin dialogul Customize î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 Add a colectiei CommandBarControls se poate crea un asemenea control specificând drept tip al controlului (în argumentul Type) una dintre valorile

Controlul Argumentul Type

Text box msoControlEdit

List box msoControlDropDown

Combo box

msoControlComboBox

Se poate folosi proprietatea Style a unui control text box, list box sau combo box pentru a indica daca titlul (textul) apare în stânga 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.AddItem "Q1".AddItem "Q2".AddItem "Q3".AddItem "Q4".Style = msoComboNormal.OnAction = "ScrollToQuarter"

End With

La executarea aplicatiei Visual Basic, procedura atribuita controlului în proprietatea OnAction este apelata de fiecare data când se modifica controlul. În procedura se poate utiliza proprietatea ActionControl a obiectului CommandBars pentru a gasi care control a fost schimbat si a returna valoarea modificata. Proprietatea ListIndex returneaza intrarea introdusa în combo box.

Eliminarea unui control dintr-o bara de unelte

Eliminarea controalelor poate fi necesara atât pentru ca unele actiuni sunt executate prin interfata proprie proiectata, cât 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 Customize

Pentru a sterge un control:

o Se deschide dialogul Customize. o Se afiseaza bara de unelte care se modifica prin fisa Toolbars.

264

Page 265: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

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 Customize, click pe numele barei în lista Toolbars a fisei sinonime si click pe butonul Delete. Nu se pot elimina barele built-in (acestea se afiseaza sau nu prin View – Toolbars 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 Standard.

CommandBars("Standard").Controls("Print").Delete

iar pentru a sterge o bara proprie de unelte

CommandBars("Custom Bar").Delete

Restaurarea barelor de unelte built-in

Din dialogul Customize

o Se afiseaza dialogul Customize. o În fisa Toolbars 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.

Modificarile barelor de unelte în timpul executiei (run-time)

Barele de unelte pot fi programate astfel încât 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 ascunderea controalelor si barelor de unelte

Pentru marirea spatiului de lucru sau pentru simplificarea interfetei cu utilizatorul, o bara de unelte poate fi afisata doar atunci când este necesara. Vizibilitatea unei bare este dependenta de valoarea proprietatii Visible, cu valorile True si False. Fixarea valorii True este echivalenta cu selectarea barei în lista Toolbars din dialogul Customize si click pe OK.

Urmatoarea procedura Excel, atribuita intrarii de meniu View MyToolbar din meniul View, comuta starile intrarii din meniu si proprietatea Visible a barei de unelte de fiecare data când utilizatorul face click pe intrarea din meniu.

Sub ViewMyAppToolbar()With CommandBars("Worksheet Menu Bar").Controls("View"). _

Controls("View MyToolbar")If .State = msoButtonUp Then

265

Page 266: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

.State = msoButtonDownCommandBars("MyAppTools").Visible = True

Else.State = msoButtonUpCommandBars("MyAppTools").Visible = False

End IfEnd With

End Sub

Atunci când o bara de unelte este vizibila, utilizatorul poate actiona orice control de pe ea. Prin fixarea proprietatii Visible drept True sau False se poate efectiv adauga sau elimina un control din spatiul de lucru al utilizatorului fara a sterge efectiv controlul.

Observatie. 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 redimensionarea barelor de 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 Height, Width, Left, Top si Position permit manevrari de pozitie si dimensiune pentru un obiect CommandBar.

Restaurarea barelor de unelte built-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 In CommandBarsIf cb.BuiltIn Then

cb.ResetElse

cb.DeleteEnd If

Next

Observatie. 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 interzicerea accesului la controale

Ca alternativa la afisarea si ascunderea controalelor se poate permite sau interzice accesul prin manevrarea proprietatii Enabled. Proprietatea poate fi utilizata si pentru aflarea starii curente a controlului.

Urmatorul exemplu inhiba butonul al treilea de pe bara Standard.

CommandBars("Standard").Controls(3).Enabled = False

266

Page 267: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Un control interzis produce un beep la actionare si nu lanseaza procedura asociata.

Indicarea starii activ/inactiv a unui buton

Pentru butoanele care comuta între doua stari, proprietatea State, cu valorile msoButtonDown si msoButtonUp, poate fi utilizata, similar exemplelor de la meniuri, pentru reprezentarea grafica a celor doua optiuni posibile.

Modificarea controalelor Text box, List box si Combo box

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 Text reflecta textul afisat în zona text a controlului si poate fi fixata pe o valoare reflectând modificari din aplicatie.

Metodele AddItem si RemoveItem 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 de controale si intrari de 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 ID 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 ID-uri poate fi ocolita prin utilizarea dialogului Customize. Sunt însa situatii când 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 Customize î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 ID-ul unui element built-in la argumentul Id al metodei Add pentru colectia CommandBarsControls, sau se poate atribui ID-ul unui element la proprietatea FaceId a oricarui control propriu sau built-in.

Observatie. 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

Page 268: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Pentru determinarea ID-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 Id 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 ID-urilor si titlurilor tuturor comenzilor built-in din aplicatie.

Public Sub outputIDs()Const maxId = 4000Open "c:\ids.txt" For Output As #1' crearea unei bare temporare cu toate elementele disponibile asignateSet cbr = CommandBars.Add("Temporary", msoBarTop, False, True)For i = 1 To maxId

On Error Resume Nextcbr.Controls.Add ID:=i

NextOn Error GoTo 0' scrierea ID si titlu pentru fiecare controlFor Each btn In cbr.Controls

Write #1, btn.ID, btn.CaptionNext' eliminarea barei de comanda si închiderea fiserului de iesirecbr.DeleteClose #1

End Sub

o Executarea procedurii urmatoare într-o aplicatie Office pentru a crea un set de bare de unelte proprii care contin atâtea butoane câte valori valide de proprietate FaceId exista în Office; fiecare imagine de buton si textul ToolTip este fixata la o asemenea valoare. Se poate referi încrucisat ID-ul unei comenzi built-in la proprietatea FaceId a unui buton de pe aceste bare si reciproc.

Sub MakeAllFaceIds()' Make fourteen bars with 300 faces each.' Note that maxId is greater than last valid ID, so' error will occur when first invalid ID is usedConst maxId = 3900On Error GoTo realMaxFor bars = 0 To 13

firstId = bars*300lastId = firstId + 299Set tb = CommandBars.AddFor i = firstId To lastId

Set btn = tb.Controls.Addbtn.FaceId = ibtn.ToolTipText = "FaceId = " & i

Nexttb.Name = ("Faces " & CStr(firstId) & " to " & CStr(lastId))tb.Width = 591tb.Visible = True

Next' Delete the button that caused the error and set toolbar namerealMax:

268

Page 269: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

btn.Deletetb.Name = ("Faces " & CStr(firstId) & " to " & CStr(i–1))tb.Width = 591tb.Visible = True

End Sub

Nota. ID-urile controalelor pop-up pentru meniurile built-in sunt în domeniul 30002 – 30426. Reamintim ca aceste ID-uri returneaza copii vide ale meniurilor predefinite.

269

Page 270: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Forme grafice (shapes) si stratul de desen

Obiectele Shape, ShapeRange si Shapes Returnarea colectiei Shapes Returnarea obiectului Shape Returnarea colectiei ShapeRangeDesenarea unei forme graficeEditarea unei forme grafice Determinarea proprietatilor/metodelor adecvateLucrul cu obiecte OLELucrul cu mai multe forme Construirea unui obiect ShapeRange Lucrul cu colectia ShapeRange

Visual Basic dispune de un model de obiecte, reprezentând stratul de desen, comun aplicatiilor Microsoft Word, Microsoft Excel si Microsoft PowerPoint. Obiectul cel mai sus în ierarhia acestui model este colectia Shapes, 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 Shapes.

Pentru o discutie mai ampla privind controalele ActiveX, care sunt o categorie speciala de forme grafice, se va vedea capitolul Dialoguri si controale ActiveX.

Observatie. Pentru simplificarea exprimarii se utilizeaza termenul "forma" pentru shape, desi "forma grafica" ar fi mai potrivit în contextul subiectului.

Obiectele Shape, ShapeRange si Shapes

Exista trei obiecte diferite care reprezinta formele: colectia Shapes, reprezentând toate formele din stratul de desen dintr-un document Microsoft Excel, Word sau PowerPoint, colectia ShapeRange, care reprezinta o submultime de forme din stratul de desen si obiectul Shape, care reprezinta o forma grafica individuala. În general, se utilizeaza colectia Shapes atunci când se adauga forme pe stratul de desen sau se parcurg toate formele; se utilizeaza obiectul Shape când se doreste formatarea sau procesarea unei anumite forme grafice si se utilizeaza colectia ShapeRange când se doreste procesarea/formatarea unui grup de forme grafice.

O colectie ShapeRange poate contine oricâte elemente. Daca include un singur obiect, este similara unui obiect Shape. Se poate utiliza o colectie ShapeRange care contine toate elementele din Shapes pentru a formata toate formele în acelasi timp. Proprietatile si metodele care se aplica obiectului Shape se pot aplica de asemenea si colectiei ShapeRange.

Returnarea colectiei Shapes

O referinta la colectia Shapes se obtine prin proprietatea sinonima aplicata unui obiect document. Exemplul urmator selecteaza toate formele din stratul de desen:

myDocument.Shapes.SelectAll

Returnarea obiectului Shape

Un obiect Shape poate fi obtinut prin intermediul colectiei Shapes, în modul general de obtinere a unui element dintr-o colectie, dupa unul dintre exemplele urmatoare:

270

Page 271: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

myDocument.Shapes(3).DuplicatemyDocument.Shapes("Red Square").Duplicate

Fecare forma are un nume atribuit în mod implicit, cum ar fi "Rectangle 3", obtinut la adaugarea formei la colectia Shapes. Prin proprietatea Name 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 AddShape, poate fi utilizata si cu alte proprietati sau metode ale obiectului Shape.

Returnarea colectiei ShapeRange

Prin referinte de tipul Shapes.Ranges(index), unde index este fie numele, fie indicele, fie un tablou de denumiri sau de indici, se returneaza o colectie ShapeRange care reprezinta un subset a colectiei Shapes. Exemplul urmator umple formele 1 si 3 din myDocument:

myDocument.Shapes.Range(Array(1, 3)).Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientLateSunset

Se utilizeaza Selection.ShapeRange pentru a returna o colectie ShapeRange care reprezinta toate formele din selectie. Prin Selection.ShapeRange(index), unde index este un indice sau un nume de forma, se obtine accesul la un obiect Shape din selectie:

ActiveWindow.Selection.ShapeRange(1).Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientLateSunset

Observatie. Macro recorderul genereaza cod bazat pe selectie. Atunci când 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 Shapes.

Desenarea unei forme pe un Document, Worksheet sau Slide

Adaugarea unei forme pe stratul de desen se efectueaza printr-una dintre metodele colectiei Shapes dedicate acestui scop. Fiecare tip de forma se obtine printr-o metoda specifica si acestea sunt enumerate în tabelul urmator.

Tipul de forma grafica Metoda Parametri

Callout AddCallout (Type, Left, Top, Width, Height, Anchor)

Note atasabile (doar PowerPoint)

AddComment (Left, Top, Width, Height)

Linie sau curba care conecteaza doua forme diferite

AddConnector (Type, BeginX, BeginY, EndX, EndY)

Curba Bézier AddCurve (SafeArrayOfPoints)

271

Page 272: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Control nativ de formular Excel (doar Microsoft Excel)

AddFormControl (Type, Left, Top, Width, Height)

Eticheta AddLabel (Orientation, Left, Top, Width, Height)

Linie AddLine (BeginX, Beginy, EndX, EndY)

Sound sau movie (doar PowerPoint)

AddMediaObject (FileName, Left, Top, Width, Height)

Control ActiveX (doar Word; pentru Excel si PowerPoint se utilizeaza AddOLEObject)

AddOLEControl (ClassType, Left, Top, Width, Height, Anchor)

Obiect OLE scufundat sau legat

AddOLEObject (ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height, Anchor)

Imagine AddPicture (FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height, Anchor)

Rezervare de loc pentru text sau pentru un obiect grafic (doar PowerPoint)

AddPlaceholder (Type, Left, Top, Width, Height)

Linie poligonala închisa sau deschisa

AddPolyline (SafeArrayOfPoints)

AutoShape

(forma predefinita)

AddShape (Type, Left, Top, Width, Height)

TextBox AddTextbox (Orientation, Left, Top, Width, Height)

WordArt AddTextEffect (PresetTextEffect, Text, FontName, FontSize, FontBold, FontItalic, Left, Top, Anchor)

Titlu de diapozitiv (doar PowerPoint)

AddTitle –

Forma libera BuildFreeform

ConvertToShape

(EditingType, X1, Y1)

272

Page 273: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Î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.

Editarea unei forme

Prin intermediul proprietatilor si metodelor obiectelor Shapes si ShapeRange 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 metodelor adecvate

Proprietatile si metodele care controleaza atributele si comportarea comune tuturor tipurilor de forme se aplica direct obiectelor Shapes si ShapeRange. Proprietatile si metodele care se aplica doar unor categorii de forme sunt încapsulate în obiecte secundare care se acceseaza prin obiectul Shape.

Proprietati si metode comune

În aceasta categorie sunt incluse proprietatile care controleaza dimensiunea si pozitia formei (Left, Top, Height, Width) si metode care controleaza comportari generice de editare (cum ar fi Duplicate si Zorder). Un exemplu uzual este

With myDocument.Shapes(1) .Height = 50 .Width = 100End With

Proprietati si metode specifice

Atributele specifice unui anumit tip de forma sunt grupate sub obiecte secundare, cum ar fi FillFormat, continând proprietatile care se aplica formelor cu culori de umplere, sau CalloutFormat, continând toate proprietatile baloanelor (callouts). Pentru a lucra cu acest tip de atribute trebuie sa se returneze mai întâi obiectele care le contin. De exemplu, se utilizeaza proprietatea Fill pentru a returna obiectul FillFormat si se poate aplica apoi proprietatea ForeColor:

myDocument.Shapes(1).Fill.FillColor.RGB = RGB(255,0,0)

În tabelul urmator sunt prezentate obiectele accesibile din obiectul Shape si care contin proprietatile si metodele specifice. Se remarca faptul ca nu toate denumirile proprietatilor contin cuvântul "Format" existent în obiectul returnat (precum Fill care returneaza FillFormat).

Proprietatea obiectului Shape Obiectul returnat Aplicabil la

Callout CalloutFormat Baloane de dialog

ConnectorFormat

(Excel si PowerPoint)

ConnectorFormat Conectori de forme

ControlFormat (Excel) ControlFormat Controale de formular native

273

Page 274: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Fill FillFormat Forme cu culori de umplere (toate cu exceptia liniilor)

Line LineFormat Toate formele (LineFormat reprezinta linia sau chenarul)

LinkFormat LinkFormat Obiecte OLE legate, imagini legate (doar Word), câmpuri legate (doar Word)

OLEFormat OLEFormat Obiecte OLE

PictureFormat PictureFormat Imagini si obiecte OLE

Shadow ShadowFormat Toate formele

TextEffect TextEffectFormat Obiecte WordArt

ThreeD ThreeDFormat Forme care pot fi reliefate

WrapFormat (doar Word) WrapFormat Forme care pot fi înconjurate de text

Încercarea de a returna obiecte secundare (cum ar fi CalloutFormat, ConnectorFormat, OLEFormat, PictureFormat sau TextEffectFormat) dintr-un tip inadecvat de forma produce eroare. Pentru alte obiecte (FillFormat, LineFormat, ShadowFormat sau ThreeDFormat) nu se produce eroare chiar daca forma container nu suporta obiectul returnat.

Pentru a nu avea probleme se va utiliza proprietatea Type si, când este aplicabila, proprietatea AutoShapeType, înainte de aplicarea unei metode sau proprietati specifice si se va introduce o secventa de tratare a erorii.

For Each sh In myDocument.Shapes If sh.Type = msoLinkedOLEObject Then sh.LinkFormat.Update End IfNext

Culorile de 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 FillFormat 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 încât 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 Background (doar PowerPoint), OneColorGradient, Patterned, PresetGradient, PresetTextured, Solid, TwoColorGradient, UserPicture

274

Page 275: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

sau UserTextured, corespunzând optiunilor disponibile în interfata utilizator a aplicatiilor. Prin proprietatile read/write BackColor, ForeColor, Transparency si Visible 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 ShapeSet sh = ThisDocument.Shapes.AddShape(msoShapeRectangle, 90, 90, 90, 50)sh.WrapFormat.Type = wdWrapTightWith sh.Fill .ForeColor.RGB = RGB(200, 0, 0) .BackColor.RGB = RGB(0, 200, 170) .TwoColorGradient msoGradientHorizontal, 1 .Visible = msoTrueEnd WithEnd Sub

Adaugarea de umbre si efecte 3-D

Proprietatea Shadow a obiectului Shape returneaza un obiect ShadowFormat 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 = 4End With

Proprietatea ThreeD a obiectului Shape returneaza un obiect ThreeDFormat care controleaza reliefarea formei. Urmatorul exemplu adauga efectul de extrudare si precizeaza o adâncime 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 = msoLightingTopEnd With

Este normal ca acest efect sa nu fie suportat de anumite forme.

Adaugarea de text 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 TextFrame. Acest obiect, returnat de proprietatea TextFrame, contine textul propriu-zis, precum si proprietatile si metodele care controleaza alinierea si ancorarea cadrului cu textul.

275

Page 276: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Doar formele built-in de tip AutoShapes bidimensionale au asociate cadre cu text. Înaintea referirii obiectului TextFrame se verifica disponibilitatea acestuia prin proprietatea HasTextFrame (valabila în PowerPoint) sau prin verificarea proprietatii Type. Se poate utiliza si tratarea erorilor în cazul în care proprietatea TextFrame poate fi aplicata unui obiect care nu o suporta.

În Microsoft Word se utilizeaza proprietatea TextRange a obiectului TextFrame pentru a returna un obiect Range care reprezinta textul din cadrul respectiv:

ActiveDocument.Shapes(1).TextFrame.TextRange.Text = " … "

În Microsoft Excel se utilizeaza proprietatea Characters a obiectului TextFrame pentru a returna un obiect Characters care reprezinta textul din interiorul cadrului:

ActiveWorksheet.Shapes(1).TextFrame.Characters.Text = " … "

În PowerPoint, se utilizeaza proprietatea TextRange a obiectului TextFrame pentru a returna un obiect TextRange care reprezinta domeniul textului din cadrul respectiv:

ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text = " … "

Lucrul cu obiecte OLE

Proprietatile si metodele obiectului OLEFormat, cum ar fi Activate si DoVerb, controleaza obiectul OLE continut într-o forma. Obiectul OLEFormat este returnat de proprietatea OLEFormat a obiectului Shape:

With myDocument.Shapes(3) If .Type = msoEmbeddedOLEObject Or _ .Type = msoLinkedOLEObject Then .OLEFormat.DoVerb End IfEnd With

Utilizarea proprietatii Object a obiectului OLEFormat returneaza obiectul OLE continut în forma desenata specificata (în Excel trebuie sa se utilizeze de doua ori proprietatea Object î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 vârful ierarhiei modelului de obiecte al aplicatiei care a creat obiectul OLE. Urmatorul exemplu, executat din Microsoft Excel (se va remarca dubla utilizare a proprietatii Object), afiseaza numele aplicatiei în care a fost creat fiecare obiect OLE scufundat în foaia activa:

For Each s In ActiveSheet.Shapes If s.Type = msoEmbeddedOLEObject Then s.OLEFormat.Activate MsgBox s.OLEFormat.Object.Object.Application.Name End If

276

Page 277: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

End With

Lucrul cu mai multe forme

Pentru a lucra cu mai multe forme se poate parcurge o colectie Shapes sau ShapeRange si lucra cu fiecare element al colectiei sau se poate construi o colectie ShapeRange cu toate formele grafice care se prelucreaza si se aplica metode sau proprietati întregii colectii ShapeRange.

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 ShapeRange este recomandata.

Daca operatiunea nu se poate efectua în interfata utilizator pe o selectie multipla, atunci parcurgerea unei colectii, Shapes sau ShapeRange, este calea adecvata. Parcurgerea poate fi efectuata printr-o structura uzuala For Each … Next:

For Each sh In myDoc.Shapes If sh.Type = msoAutoShape Then sh.TextFrame.TextRange.InsertAfter " (version 1)" End IfNext

Construirea unui ShapeRange

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 ShapeRange utilizând 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 If numShapes > 1 Then numAutoShapes = 0 ReDim autoShpArray(1 To numShapes) For i = 1 To numShapes If .Item(i).Type = msoAutoShape Then numAutoShapes = numAutoShapes + 1 autoShpArray(numAutoShapes) = .Item(i).Name End If Next If numAutoShapes > 1 Then ReDim Preserve autoShpArray(1 To numAutoShapes) Set asRange = .Range(autoShpArray) asRange.Group End If End IfEnd With

277

Page 278: Office Automation Programa cursuluidocshare01.docshare.tips/files/22717/227179765.pdf · La convertiri, miezul noptii este 0, ... biblioteca asociata. De exemplu, VBA.Left este apelul

Lucrul cu colectia ShapeRange

Atunci când se aplica proprietati sau metode colectiei ShapeRange, se va tine seama de urmatoarele principii:

• Aplicarea unei metode colectiei este echivalenta cu aplicarea acelei metode la fiecare obiect Shape din colectie.

• Stabilirea unei proprietati a colectiei este echivalent cu stabilirea acelei proprietati fiecarui obiect Shape 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 msoLineDashStyleMixed pentru stilul de punctare a liniei).

• proprietate a colectiei care returneaza un tip de data simplu, cum ar fi Long, Single sau String, 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 când se utilizeaza o proprietate sau metoda care se poate aplica doar pentru un obiect.

Aceste principii actioneaza si atunci când se lucreaza cu proprietati sau metode ale formelor, grupate în obiecte secundare ale colectiei ShapeRange (cum ar fi FillFormat).

Urmatorul exemplu construieste un obiect ShapeRange 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 Distribute sunt utilizate pentru alinierea sau distribuirea uniforma a formelor dintr-o colectie ShapeRange. Prin metoda Zorder se poate modifica ordinea pe Z care determina ordinea de suprapunere a formelor.

Metoda Group realizeaza gruparea tuturor formelor dintr-o colectie ShapeRange. Prin Ungroup, 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 Shape care reprezinta grupul. Proprietatea returneaza un obiect GroupShapes si metoda Item a acestui obiect returneaza o forma individuala din grupul de forme:

With myDocument.Shapes .AddShape(msoShapeIsoscelesTriangle, 10, 10, 100, 100).Name = "shpOne" . AddShape(msoShapeIsoscelesTriangle, 150, 10, 100, 100).Name = "shpTwo" . AddShape(msoShapeIsoscelesTriangle, 300, 10, 100, 100).Name = With .Range(Array("shpOne", "shpTwo", "shpThree")).Group .Fill.PresetTextured msoTextureBlueTissuePaper .GroupItems(2).Fill.PresetTextured msoTextureGreenMarble End WithEnd With

278