Вы находитесь на странице: 1из 278

Office Automation Programa cursului

Visual Basic for Applications (VBA) - Notiuni de baza; o Mediul de programare VBA; o Fundamentele limbajului: structuri de control, tipuri de date, constante, variabile. Obiecte. Proprietti. Metode. Colectii. Principalele obiecte Excel o Obiectul Application; o Obiectul Workbook; o Obiectul Range; o Evenimente. Principalele obiecte Word o Obiectul Application; o Obiectul Document; o Obiectul Range; o Obiectul Selection; o Obiectul Find, Replacement; o Evenimente. Principalele obiecte Access o Obiectul Application; o Obiectul Form; o Obiectul Report. Meniuri si bare de unelte o Modificri n proiectare; o Modificarea programatic; o Colectia CommandBars. Ajutor prin Office Assistant. Data Access Objects (DAO) o Obiecte DAO; o Utilizare DAO cu Microsoft Jet;; o Date ODBC; o Utilizare DAO cu ODBCDirect; o Utilizare ODBCDirect. Controale ActiveX. Dialoguri. Controlarea erorilor. o Dialoguri personalizate; o Controale n Word, Excel, PowerPoint; o Utilizarea programatic a controalelor; o Controlarea erorilor; o Testarea programelor.

Documentatie

VBA - Bazele programarii 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

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

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, nct declararea explicita poate fi utilizata atunci cnd se doreste economisirea memoriei (tipul Variant aloca mai multa memorie), viteza n executie sau atunci cnd se scriu date ntr-un fisier n acces direct. Boolean Domeniu 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: 0255 (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:

Observatii. Informatiile de tip data calendaristica si/sau timp orar sunt memorate drept numere flotante, partea ntreaga reprezentnd data calendaristica, partea fractionara reprezentnd timpul. La convertiri, miezul noptii este 0, miezul zilei este .5, numerele negative reprezinta date nainte de 30 decembrie 1899. Poate fi atribuit ca valoare de tip date orice literal care reprezinta o data calendaristica recunoscuta ca atare, literalul trebuind sa fie cuprins ntre simboluri #, de exemplu #1 Jan 99#. Decimal Domeniu 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, specificnd numarul de zecimale. Pentru scala=0 (fara parte zecimala), cea mai mare valoare posibila este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/-7.9228162514264337593543950335 iar cea mai mica valoare nenula este +/-0.0000000000000000000000000001. Nota: Deocamdata, tipul Decimal poate fi utilizat doar ca subtip n Variant, adica nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin functia Cdec (functia forteaza o expresie sa fie de un tip specificat, din aceeasi categorie de functii fiind si CBool, CByte etc.). Double Domeniu de valori: numere negative de la -1.79769313486232E308 pna -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pna 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 la la

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 trzie (la timpul executiei run-time binding). Pentru o atasare timpurie (la timpul compilarii compile-time binding) se va utiliza o variabila declarata cu numele clasei respective. Single Domeniu de valori: numere negative de la -3.402823E38 pna la -1.401298E-45; numere pozitive de la 1.401298E-45 pna la 3.402823E38. Memorie: 4 bytes Declarator de tip: ! Observatii. String Domeniu de valori: sir de lungime variabila: pna la 2^31 caractere; sir de lungime fixa: pna 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.

Memorie: n functie de subtipul valorii: valorile numerice ocupa 16 bytes, valorile de tip String necesita 22 bytes plus cte un byte pentru fiecare caracter. Declarator 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 pna cnd, ridicnd-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 dect accesul la valorile definite prin tipuri explicite. Valorile speciale au semnificatia:
o o 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. Null este valoarea unui Variant care, n mod programatic, nu contine date. 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. 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

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 cnd este definita de utilizator si o variabila Left. Nota. Visual Basic nu este case-sensitive, deci denumirea unei entitati nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA pastreaza capitalizarea din instructiunea unde este definit un nume. Declararea constantelor Definirea unei constante se realizeaza prin instructiunea Const, n care se poate specifica tipul, domeniul si valoarea constantei. Valoarea unei constante nu se poate schimba programatic. [Public | Private] Const constname [As type] = expression Public cuvnt cheie, optional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din toate modulele. Nu este permis n proceduri. Private cuvnt cheie, optional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din modulul n care apare declaratia. Nu este permis n proceduri. constname numele constantei (obligatoriu). type tipul constantei: Byte, Boolean, 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.

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

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 cnd se declara o variabila de tip obiect). O noua instanta a obiectului este creata la prima referinta a variabilei definite. Clauza nu poate sa apara la declararea variabilelor de tipuri intrinseci si nici la declararea instantelor obiectelor dependente. type tipul variabilei definite: Byte, Boolean, 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 att la nivel de modul ct si la nivel de procedura. Variabilele definite la nivel de modul sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedura sunt vizibile doar n procedura respectiva. Private este utilizata la nivel de modul pentru a declara variabile accesibile doar n procedurile acelui modul. Public este utilizata pentru a declara variabile accesibile n toate procedurile din toate modulele si din toate aplicatiile. Prin includerea instructiunii Option Private Module este posibil ca variabilele publice sa fie vizibile doar n proiectul n care sunt definite. Static este utilizata la nivel de procedura nestatica pentru a declara variabile care si pastreaza valoarea de la o executie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit. Variabilele definite prin Static sunt vizibile doar n procedura respectiva. Este de remarcat ca se poate defini o ntreaga procedura utiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice. ReDim este utilizata la nivel de procedura pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni si pastreaza valorile deja existente. (Pentru detalii vezi si VBA Help).

Exemple Dim x As Double, ColtStanga As Integer Private I, J As Long Static Venit As Currency, NumPren As String Dim Retineri(5) As Currency Public indicatori(10) As Byte Dim matrice(1 To 3, 100 To 200) As String Public fntScris As Font Dim appWD As Word.Application

Proceduri Printr-o 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 dect 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 sfrsitul listei (aparitia clauzei Optional cere ca toti parametrii care urmeaza sa aiba aceeasi clauza). ByVal arata ca apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regasita dupa parasirea procedurii, calculele efectundu-se pe o copie a parametrului). ByRef arata ca apelul paramatrului se face prin referinta (orice modificare a valorii transmise este regasita dupa parasirea procedurii). Acesta este modul implicit de transmitere a parametrilor.

10

ParamArray folosit doar ca ultim argument n lista, denota un tablou Optional de elemente de tip Variant. Clauza ParamArray permite definirea unui numar arbitrar de parametri. ParamArray nu poate fi utilizat mpreuna cu ByVal, ByRef, sau Optional. varname numele argumentului. Daca este tablou se vor indica parantezele. type tipul parametrului transmis: Byte, Boolean, 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

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

Obiectele si prelucrarile necesare realizarii unei aplicatii VBA (presupunnd ca se doreste atingerea unui ansamblu coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un anumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor. Deoarece prelucrarile proiectate n VBA sunt atasate documentelor (actiunilor) unor aplicatii particulare (Word, Excel etc.), proiectele sunt salvate o data cu documentele pe care le nsotesc. Acest fapt nu reduce aria de probleme abordabile ntruct prelucrarile propriu-zise nu sunt limitate la documentul nsotit (se poate deschide astfel un document Word alb si sa se efectueze orice prelucrare dorita, fara a avea obligatia de a scrie ceva n documentul deschis). ntr-un proiect VBA sunt identificabile urmatoarele componente:

Module standard (denumite initial module de cod). Contin declaratii si proceduri generale. Exista de asemenea si module care contin tratarea evenimentelor specifice documentului de care este atasat proiectul. Module de clasa. Contin definirea obiectelor create de utilizator. Forme. Contin definitiile dialogurilor din interfata proiectata de utilizator ca si codul program necesar controlarii dialogurilor. Referinte. ntr-un proiect este mentinuta lista altor proiecte, care sunt referite n proiectul curent.

Un modul de cod poate ncepe cu o sectiune de declaratii. Prin declaratii ntelegem instructiuni neexecutabile prin care se definesc constante, variabile si proceduri externe. Utiliznd Public, Static, Private se precizeaza si domeniul de vizibilitate a entitatilor definite. Gestionarea (crearea, editarea, stergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat ntr-o sectiune separata. Domeniul unei 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 o o

la nivel de procedura; la nivel de modul, privat; 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

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 ct variabila are o valoare. Este evident ca valoarea unei variabile se poate modifica pe durata vietii sale, dar definitoriu este faptul ca variabila are o anumita valoare pe ntreaga durata a vietii sale. La parasirea domeniului, variabila "moare" si nu mai are atasata o valoare. La nceputul executiei unei proceduri, toate variabilele sunt initializate: Variabila numerica Sir de lungime variabila Sir de lungime fixa 0 (zero) "" (sir de lungime zero) Completat cu caracterul Chr(0) (avnd codul ASCII 0) Empty fiecare element este initializat separat, potrivit tipului primar Nothing (pna la asignarea unei referinte prin Set)

Variabila Variant Variabile de tip utilizator

Variabila Object

Variabilele care nu sunt modificate si pastreaza valoarea initiala. Variabilele declarate prin Dim la nivel de procedura au valoare pna la terminarea executiei procedurii (chiar daca se trece prin apel n alte proceduri). Variabilele declarate prin Static, la nivel de procedura, au aceeasi viata ca si variabilele declarate la nivel de modul si si pastreaza valoarea pna la terminarea executiei codului (inclusiv de la un apel la altul). 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

Variabilele declarate la nivel de modul standard si pastreaza valoarea pe tot timpul executiei. Variabilele declarate la nivel de modul clasa si pastreaza valoarea att timp ct exista o instanta a clasei. Diferenta fata de variabilele Static este aceea ca memoria este utilizata permanent (nu se elibereaza la parasirea domeniului). Variabile Object Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object Dim myDoc As Object sau specificnd exact numele de clasa dintr-o biblioteca de obiecte referita Dim myDoc As Word.Document n primul mod de definire (ca Object) nu se poate efectua la momentul compilarii existenta obiectului, nu se poate verifica utilizarea corecta a proprietatilor si metodelor obiectului si nu se poate lega aceasta informatie de variabila obiect definita. Atasarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul executiei si se efectueaza prin instructiunea Set. Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapida, se face la momentul compilarii si poate nlatura mai rapid erori posibile n utilizarea metodelor si proprietatilor obiectului. Instructiunea Set are sintaxa: Set objectvar = {[New] objectexpression | Nothing} unde
o o o o

objectvar este numele variabilei (sau proprietatii) New permite crearea unei noi instante a clasei Objectexpression este o expresie constnd n numele unui obiect, alta variabila declarata de acelasi tip obiect, sau functie ori metoda care returneaza un obiect de acelasi tip obiect Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem si de memorie utilizate.

n general, atunci cnd se utilizeaza Set pentru a asigna o referinta de obiect la o variabila, nu se creeaza o copie a obiectului pentru acea variabila. Este creata doar o referinta la obiect. Astfel, mai multe variabile de tip obiect pot sa se refere la acelasi obiect: orice schimbare a obiectului se va reflecta n toate variabilele care refera obiectul. Utiliznd clauza New se va crea efectiv o copie (instanta) a obiectului. Exemple Prin urmatoarele doua instructiuni se defineste variabila objWord care este legata trziu de o aplicatie Word: Dim objWord As Object Set obhWord = CreateObject("Word.Application") Legarea timpurie se poate efectua prin Dim objWord As Word.Application

15

Este de remarcat ca instructiunea Set apeleaza o functie care creeaza si returneaza o referinta la un obiect ActiveX. Constante predefinite (builtin) Bibliotecile de obiecte din fiecare aplicatie Office furnizeaza o multime de constante predefinite, care pot fi utilizate pentru a stabili proprietati sau pentru a transmite argumente catre proprietati sau metode. Constantele sunt, de regula, grupate n tipuri enumerate care reprezinta valorile posibile pentru o proprietate specifica. Desi este posibila sa se utilizeze valoarea numerica a constantei este recomandat sa se utilizeze constanta numita ntruct dezvoltari ulterioare ale mediului Microsoft Office (ca si ale aplicatiilor din Visual Studio) tind sa pastreze compatibilitatea ntre denumirile constantelor si nu ntre valorile efective. De exemplu se prefera Application.DisplayAlerts = wdAlertAll n loc de Application.DisplayAlerts = -1 pentru a fixa ca Word sa afiseze toate mesajele de alerta la executia unei proceduri. Codul scris astfel este si mai explicit.

16

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 lnga continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adaugare a unui nou tabel la colectia de tabele a documentului. Doua instructiuni pot fi scrise pe o aceeasi linie daca sunt separate cu caracterul ":". 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 cuvntul Rem urmat de un spatiu. Comentariul de pe aceeasi linie cu o instructiune se introduce printr-un apostrof urmat de comentariu.

17

Operatori n formarea expresiilor de diverse tipuri, operatorii sunt cei utilizati aproape general n limbajele de programare de nivel nalt. Pentru fixarea termenilor si notatiilor sunt totusi prezentati, pe categorii, nsotiti, acolo unde este cazul de scurte explicatii. Operatori aritmetici Operator ^ Semnificatie Ridicarea putere nmultirea Observatii la rezultatul este Double sau Variant(Double) cu exceptia: daca un operand este Null, rezultatul este tot Null 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). 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). 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. 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. 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).

mpartirea

mpartirea ntreaga

Mod

Restul mpartirii

Adunarea numerica sau concatenarea sirurilor

18

Scaderea sau operanzii pot fi doar numerici. Rezultatul inversarea este de tipul cel "mai precis" al operanzilor, semnului 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 avnd 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 cnd un operand este Null, rezultatul este tot Null. Comportarea operatorului Like depinde de instructiunea Option Compare, care poate fi:

Option Compare Binary, ordinea este cea a reprezentarii interne binare, determinata n Windows de codul de pagina.

19

Option Compare Text, compararea este insenzitiva la capitalizarea textului, ordinea este determinata de setarile locale ale sistemului.

Constructia sablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere: ? un caracter oarecare * oricte caractere (chiar nici unul) # o cifra oarecare (09). [charlist] oricare dintre caracterele enumerate n lista, un domeniu de litere poate fi dat prin utilizarea cratimei. [!charlist] orice caracter care nu este n lista Observatie. Pentru a utiliza n sablon caracterele speciale cu valoare de wildcard se vor utiliza constructii de tip lista: [[], [?] etc. Paranteza dreapta va fi indicata singura: ]. Pentru alte observatii utile se va studia Help Like operator. Operatori 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 And Semnificatie conjunctia logica Observatii 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. Daca o expresie este Null, rezultatul este Null. Eqv realizeaza si compararea bit cu bit a doua expresii numerice, pozitionnd cifrele binare ale rezultatului dupa regulile de calcul ale echivalentei logice: 0 Eqv 0 este 1 etc.

Eqv

echivalenta logica

20

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, pozitionnd cifrele binare ale rezultatului dupa regulile de calcul ale implicatiei logice: 1 Imp 0 este 0, n rest rezultatul este 1. Not Null este Null. Prin operatorul Not se poate inversa bit cu bit valorile unei variabile, pozitionndu-se corespunzator un rezultat numeric. Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaza si o comparatie bit cu bit a doua expresii numerice pozitionnd bitii corespunzatori ai rezultatului dupa regulile lui Or logic. 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)].

Not

negatia logica

Or

disjunctia logica

Xor

disjunctia exclusiva

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 cuvntul 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 dect daca valoarea expresiei Variant poate fi interpretata compatibila cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip String (cu exceptia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric. La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei. Atribuirea valorilor de tip utilizator poate fi efectuata doar daca ambii termeni au acelasi tip definit. Pentru alte situatii se va utiliza instructiunea Lset.

21

Nu se poate utiliza Let (cu sau fara cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n aceasta situatie instructiunea Set. Instructiunea LSet Copie, cu aliniere la stnga, un sir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Deoarece copierea este binara, poate fi utilizata pentru atribuiri ntre tipuri utilizator diferite (rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este 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 stnga) n zona de memorie a primei variabile. Caracterele care ramn neocupate se completeaza cu spatii, iar daca zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate). Instructiunea 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 stnga la dreapta si de sus n jos. Acest sens poate fi modificat, ntr-o oarecare masura, prin ordinea de precedenta a operatiilor n evaluarea expresiilor. Este evident ca o asemenea structura simpla nu poate cuprinde toate aspectele programarii si din acest motiv necesitatea structurilor de control a fluxului executiei. Unele instructiuni au fost pastrate doar din motive de compatibilitate cu versiunile initiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare. Instructiuni de transfer OnGoSub, OnGoTo) (GoSubReturn, GoTo, OnError,

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

GoSubReturn 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 GoSubReturn 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. OnGoSub, OnGoTo 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 avnd valoare ntreaga (dupa o eventuala rotunjire) ntre 0 si 255 inclusiv. destinationlist este o lista de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele categorii), din aceeasi procedura cu instructiunea. Daca valoarea expresiei este negativa sau mai mare dect 255 se produce o eroare.

23

Daca valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfera controlul la linia identificata de al k-lea element al listei. Daca valoarea expresiei este 0 sau mai mare dect numarul de elemente din lista, transferul se efectueaza la linia care urmeaza instructiunea On...GoSub sau On...GoTo. Instructiuni de terminare (DoEvents, End, Exit, Stop) sau oprire a programului

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 sfrsitul 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 sfrsitului de program (Unload, Terminate etc.). Fisierele deschise prin Open sunt nchise si toate variabilele sunt eliberate. Obiectele create din modulele clasa sunt distruse, iar referintele din alte aplicatii la asemenea obiecte sunt invalidate. Memoria este eliberata. 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

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 While...Wend, With) (Do...Loop, For...Next, For Each...Next,

Prin intermediul constructiilor de tip bloc prezentate n aceasta sectiune se poate repeta, n mod controlat, un grup de instructiuni. n cazul unui numar nedefinit de repetitii, conditia de oprire poate fi testata la nceputul sau la sfrsitul unui ciclu, prin alegerea structurii adecvate. DoLoop Se vor utiliza structuri DoLoop pentru a executa un grup de instructiuni de un numar de ori nedefinit aprioric. Daca se cunoaste numarul de cicluri, se va utiliza structura ForNext. nainte de continuare se va testa o conditie (despre care se presupune ca poate fi modificata n instructiunile executate). Diferitele variante posibile pentru DoLoop difera dupa momentul evaluarii conditiei si decizia luata. Do [{While | Until} condition] [statements] [Exit Do] [statements] Loop sau Do [statements] [Exit Do]

25

[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 atta timp (while) sau pna cnd (until) conditia devine True. Daca decizia este de a nu continua ciclarea, atunci se va executa prima instructiune care urmeaza ntregii structuri (deci de dupa linia care ncepe cu Loop). Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceasta sintaxa). Daca apare o comanda Exit Do se poate omite chiar si conditia din enunt ntruct executia se va termina prin aceasta decizie. Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metoda) a unei bucle transfera controlul la nivelul Do imediat superior. Executia structurilor este explicata n tabelul urmator Do WhileLoop Testeaza conditia la nceputul buclei, executa bucla numai daca rezultatul este True si continua astfel pna cnd o noua evaluare produce False. Testeaza conditia la nceputul buclei, executa bucla numai daca rezultatul este False si continua astfel pna cnd o noua evaluare produce True. Se executa ntotdeauna bucla o data, se testeaza conditia la sfrsitul buclei si se repeta bucla att timp ct conditia este True. Oprirea este pe conditie falsa. Se executa ntotdeauna bucla o data, se testeaza conditia la sfrsitul buclei si se repeta bucla att timp ct conditia este False. Oprirea este pe conditie adevarata.

Do UntilLoop

DoLoop While

DoLoop Until

ForNext Atunci cnd se cunoaste numarul de repetari ale unui bloc de instructiuni, se va folosi structura ForNext. Structura utilizeaza o variabila contor, a carei valoare se modifica la fiecare ciclu, oprirea fiind atunci cnd se atinge o valoare specificata. Sintaxa este: For counter = start To end [Step step] [statements]

26

[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 o

counter <= end pentru step >= 0 sau 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 ForNext este terminata si se executa prima instructiune de dupa linia Next. Specificarea numelui contorului n linia Next poate clarifica textul sursa, mai ales n cazul cnd exista structuri ForNext mbricate. Corpul unei bucle ForNext poate include (complet) o alta structura ForNext. 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 EachNext Similara structurii ForNext, structura For EachNext repeta un grup de instructiuni pentru fiecare element dintr-o colectie de obiecte sau dintr-un tablou (cu exceptia celor de un tip utilizator). Este utila atunci cnd nu se cunoaste numarul de elemente sau daca se modifica, n timpul executiei, continutul colectiei. Sintaxa este: For Each element In group [statements]

27

[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 EachNext este

1. Se defineste element ca numind primul element din grup (daca nu exista nici un element, se transfera
controlul la prima instructiune de dupa Next se paraseste bucla fara executarea instructiunilor). 2. Se executa instructiunile din corpul buclei For. 3. Se testeaza daca element este ultimul element din grup. Daca raspunsul este afirmatif, se paraseste bucla. 4. Se defineste element ca numind urmatorul element din grup. 5. Se repeta pasii 2 pna la 4. Instructiunile Exit For sunt explicate la ForNext. 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 ForNext si nu For EachNext. Se va utiliza ca numar de obiecte colectie.Count. WhileWend Executa un grup de instructiuni att timp ct este adevarata o conditie. Sintaxa While condition [statements] Wend Este recomandat sa se utilizeze o structura DoLoop n locul acestei structuri. With Programarea orientata pe obiecte produce, datorita calificarilor succesive, constructii foarte complexe atunci cnd se numesc proprietatile unui obiect. n cazul modificarilor succesive ale mai multor proprietati ale aceluiasi obiect, repetarea zonei de calificare poate produce erori de scriere si conduce la un text greu de citit. Codul este simplificat prin utilizarea structurii WithEnd With. O asemenea structura executa o serie de instructiuni pentru un obiect sau pentru o variabila de tip utilizator. Sintaxa este:

28

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. Permitnd omiterea recalificarilor din referintele la obiectul precizat, orice constructie de tipul ".nume" este interpretata n instructiunile structurii drept "object.nume". ntr-un bloc With nu se poate schimba obiectul procesat. La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificarile eventuale la acest obiect vor fi efectuate. Nu se recomanda saltul n si dintr-un bloc With. Structuri de decizie (IfThenElse, Select Case) Ramificarea firului executiei dupa rezultatul verificarii unei conditii este o necesitate frecventa n orice implementare. Pe lnga structurile prezentate, se pot utiliza trei functii care realizeaza alegeri n mod liniarizat (pe o linie de cod): Choose(), Iif(), Switch(). IfThenElse O asemenea structura, ntlnita de altfel n toate limbajele de programare, executa un grup de instructiuni ca raspuns la ndeplinirea unei conditii (compusa sau nu din mai multe conditii testate secvential). Sintaxa permite o mare varietate de forme: If condition Then [statements] [Else elsestatements] sau If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]]

29

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 cnd conditiile corespunzatoare sunt True. La utilizarea primei forme, fara clauza Else, este posibil sa se scrie mai multe instructiuni, separate de ":", pe aceeasi linie. Verificarea conditiilor implica evaluarea tuturor subexpresiilor, chiar daca prin jocul operanzilor si operatorilor rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True). Select Case Instructiunea Select Case se poate utiliza n locul unor instructiuni ElseIf multiple (dintr-o structura IfThen ElseIf) atunci cnd 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 IfThenElseIf. 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. Cuvntul To introduce un interval de valori, valoarea minima fiind prima specificata. Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptnd 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

elsestatements reprezinta una sau mai multe instructiuni care se vor executa daca testexpression nu este egala cu nici un element din listele liniilor Case. Daca testexpression se potriveste cu un element dintr-o lista Case, se vor executa instructiunile care urmeaza aceasta clauza Case pna la urmatoarea clauza Case, sau pna la End Select. Control executiei trece apoi la instructiunea care urmeaza liniei finale End Select. Rezulta ca daca testexpression se regaseste n mai multe liste, doar prima potrivire este considerata. Clauza Case Else are semnificatia uzuala "altfel, n rest, n caz contrar etc.", adica introduce instructiunile care se executa atunci cnd expresia de test nu se potriveste nici unui element din listele clauzelor Else. Daca aceasta este situatia si nu este specificata o clauza Case Else, atunci executia urmeaza cu prima instructiune de dupa End Select. 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) reprezentnd 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 VbHide VbNormalFocus VbMinimizedFocus VbMaximizedFocus VbNormalNoFocus Valoarea 0 1 2 3 4 Semnificatia Fereastra este ascunsa iar focus-ul este pe fereastra ascunsa. Fereastra are focus-ul si este dimensionata si pozitionata normal. Fereastra este afisata ca o icoana (minimizata) dar are focus-ul. Fereastra maximizata, cu focus. Fereastra este normala (restaurata

31

la marimea si pozitia cea mai recenta) dar nu are focus-ul. Fereastra activa curenta si pastreaza focus-ul. VbMinimizedNoFocus 6 Fereastra minimizata, fara focus. Fereastra activa curenta si pastreaza focus-ul.

Daca functia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se executa asincron, deci nu exista certitudinea ca acest program se termina nainte de executia instructiunilor care urmeaza liniei Shell.

32

Operatiuni 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, continnd textul afisat initial n zona text rezervata utilizatorului. Textul este, n lipsa modificarii lui, retransmis ca raspuns (actionnd butonul OK). xpos este expresia numerica specificnd pozitia orizontala a dialogului (n twips, de la latura stnga a ecranului). n lipsa argumentului, boxa de dialog este centrata orizontal. ypos este expresia numerica specificnd pozitia verticala a dialogului (n twips, de la latura de sus a ecranului). n lipsa argumentului, boxa de dialog este pozitionata la aproximativ o treime de ecran. helpfile este expresia de tip String care identifica fisierul Help utilizat.Daca este indicat helpfile, trebuie sa fie precizat si context. Textul de ajutor poate fi vazut prin tasta F1, anumite aplicatii afiseaza si un buton Help. context Expresie numerica cu numarul de context Help al intrarii corespunzatoare dialogului afisat. Apare obligatoriu mpreuna cu helpfile. Daca valoarea functiei nu este atribuita (sau utilizata ntr-o alta expresie), este evident ca se pierde, fara semnalarea vreunei erori.

33

Functia MsgBox Un dialog mai simplu dect 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 indicnd 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 VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 Valoare 0 1 2 3 4 5 16 32 48 64 0 256 512 768 Descriere Numai butonul OK OK si Cancel Abort, Retry si Ignore Yes, No si Cancel Yes si No Retry si Cancel Icoana de Critical Message Icoana de Warning Query Icoana Warning Message Icoana de Information Message Primul buton este (echivalent cu Enter) cel implicit

Al doilea buton este cel implicit Al treilea buton este cel implicit Al patrulea buton este cel implicit

34

VbApplicationModal

Application modal: aplicatia curenta este oprita pna cnd raspunde utilizatorul System modal: toate aplicatiile sunt oprite pna cnd utilizatorul raspunde la dialog

VbSystemModal

4096

Valorile 0-5 descriu butoanele, 16,32,48 si 64 descriu stilul icoanei afisate, 0, 256 si 512 determina butonul implicit, iar ultimul grup (0 si 4096) determina modalitatea boxei de dialog. La formarea argumentului Buttons se va aduna doar cte un numar din fiecare grup. Pentru a utiliza valoarea returnata de functie, aceasta trebuie inclusa ntr-o expresie (eventual atribuita unei variabile ntregi). Valorile returnate de functie si care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorita de utilizator sunt Constanta VbOK VbCancel VbAbort VbRetry VbIgnore VbYes VbNo Valoare 1 2 3 4 5 6 7 Descriere OK Cancel Abort Retry Ignore Yes 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 nct 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 nti deschis (instructiunea Open), operatiunea producnd si crearea fisierului n cazul unui

35

fisier inexistent (nou). Dupa utilizare fisierul trebuie sa fie nchis (operatiune efectuata, la terminarea normala a programului, n mod automat). Un fisier are atasat un numar de identificare, unic pentru un proces. Identificare fisierului se poate efectua, n program, prin numele sau sau prin numarul atasat. Numarul poate fi n domeniul 1255 pentru fisierele proprii aplicatiei si n domeniul 256511 pentru fisiere accesibile din alte aplicatii. Un numar neutilizat (liber) poate fi furnizat de apelul la functia FreeFile(). Exista trei moduri de acces la nregistrarile unui fisier, acces definit la deschiderea acestuia.

acces secvential (modurile Input, Output si Append), utilizat de regula pentru scrierea fisierelor text (rapoarte, jurnale etc.); acces raandom (aleator) (modul Random), n cazul cnd este necesar sa se scrie si sa se citeasca nregistrarile ntr-o ordine nedefinita, operatiunile de intrare/iesire fiind amalgamate ntre ele; acces binar (modul Binary), utilizat la citirea/scrierea fisierelor byte cu byte (de exemplu fisiere bitmap).

Un fisier deschis cu un mod de acces trebuie exploatat n acest mod pna cnd este nchis si deschis n alt mod (daca structura lui permite asa ceva). Instructiunile tipice pentru accesul la informatiile dintr-un fisier sunt Modul acces Secvential Random Binar de Scriere Print #, Write # Put Put Citire Input # Get 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 Citire Controlul iesirilor Copierea unui fisier Creare, acces Fixarea atributelor Instructiuni Get, Input, Input #, Line Input # Format, Print, Print #, Spc, Tab, Width # FileCopy Open FileAttr, GetAttr, SetAttr

Fixarea pozitiei active de Seek citire/scriere Inchidere Close, Reset

36

Informatii despre un fisier Lungimea unui fisier Operatii asupra fisierelor Scriere

EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek FileLen Dir, Kill, Lock, Unlock, Name 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 cuvnt 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 specificnd operatiunile I/O permise pentru fisier: Read, Write sau Read Write; lock clauza optionala specificnd operatiile asupra fisierului permise altor procese care se executa (cnd 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) exprimnd, 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 nti nchis si abia apoi deschis ntr-un asemenea mod). FreeFile Functia returneaza un ntreg reprezentnd urmatorul numar de fisier disponibil. FreeFile[(rangenumber)]

37

rangenumber este un Variant care specifica domeniul din care se solicita un numar liber de fisier: 0 (valoarea implicita) returneaza un numar n 1255 (pentru fisiere proprii, 1 returneaza un numar n 256511 (pentru fisiere accesate din alte aplicatii). Get Citeste date dintr-un fisier deschis si le transfera ntr-o variabila. Datele citite cu Get sunt, n general, scrise n fisier cu comanda Put. Get [#]filenumber, [recnumber], varname unde filenumber este numarul fisierului de unde se citesc date (fisierul trebuie sa fie deschis) recnumber numar optional n format Variant (Long), reprezinta numarul nregistrarii (modul 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 cnd se opereaza, n special, cu tipurile Variant si cu tablouri. Put Scrie valoarea unei variabile date ntr-un fisier deschis n prealabil. Datele scrise cu Put sunt, n general, citite din fisier cu Get. Put [#]filenumber, [recnumber], varname unde filenumber este numarul fisierului unde se scriu datele (fisierul trebuie sa fie deschis); recnumber numar optional n format Variant (Long), reprezinta numarul nregistrarii (modul 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 cnd se opereaza, n special, cu tipurile Variant si cu tablouri. Input # Citeste date dintr-un fisier secvential si le transfera n variabilele specificate.

38

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 Virgula sau linie goala #NULL# #TRUE# sau #FALSE# #yyyy-mm-dd hh:mm:ss# #ERROR errornumber# Valoarea asignata Empty Null True sau False Data si/sau timpul reprezentat de expresie errornumber (variabila este un Variant considerat drept eroare)

Ghilimelele duble (" ") sunt ignorate n sirul de intrare. Pentru o citire corecta, datele din fisier trebuie sa apara n aceeasi ordine si de acelasi tip cu variabilele din lista. O variabila numerica primeste valoarea 0 daca intrarea corespunzatoare nu este numerica. Atingerea sfrsitului de fisier cnd operatiunea de citire nu este ncheiata, provoaca eroare. ntruct utilizarea fisierelor este, n mod uzual, aceea de memorare controlata a unor informatii (si nu aceea de a descifra informatii scrise ntr-o structura necunoscuta), se recomanda scrierea cu Write # n cazul utilizarii ulterioare a comenzii 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 specificnd numarul de caractere care se citesc. filenumber numar de fisier (deschis).

39

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 pna cnd EOF returneaza True genereaza eroare (procedeul este valid pentru citirea din fisiere binare cu Get). Se vor utiliza functiile LOF and Loc pentru detectarea sfrsitului de fisier. 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 ntlnirea caracterului CR (Chr(13)) sau a combinatiei CR+LF (Chr(13)&Chr(10)). Caracterele CR si/sau LF nu sunt adaugate sirului asignat (se poate considera ca secventa lor a fost sarita). Line Input #filenumber, varname unde filenumber numarul atasat fisierului (deschis), varname nume de variabila String sau Variant. Datele citite cu Line 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 cmp 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

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 nct urmatoarea scriere va fi pe un rnd nou. Print # Scrie ntr-un fisier secvential date formatate ca pe ecran (display-formatted). Prin urmare, cu exceptiile specificate n continuare, setarile locale sunt respectate. Datele scrise cu Print # sunt, de regula, citite cu Line 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. Utiliznd doar Tab se trece la urmatoarea zona de iesire. expression expresia a carei valoare se tipareste (numerica sau String). charpos Specifica pozitia punctului de insertie pentru urmatorul caracter care va fi tiparit, potrivit tabelului care urmeaza. Daca nu se specifica, urmatoarea tiparire va fi pe rndul urmator. charpos ; Tab(n) Tab Locul punctului de insertie Imediat tiparit dupa ultimul caracter

Coloana cu numarul n nceputul urmatoarei zone de tiparire

41

Daca se omite outputlist dar se include un separator dupa filenumber, se va insera o linie goala n fisier. Datele logice sunt scrise drept True, False (fara traduceri locale). Datele calendaristice sunt scrise potrivit setarii locale pentru format scurt. Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fara traduceri locale). 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 (pna 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 operatii I/O. ntre 1 si 2,147,483,647, inclusiv, care indica locul urmatoarei

42

Numerele nregistrarilor specificate n instructiunile Get si Put au priorirtate n raport cu pozitia fixata prin Seek (are loc o repozitionare). Daca operatiunea Seek indica o pozitie dupa sfrsitul fisierului, urmatoarea operatiune de scriere (fara repozitionare) extinde fisierul. Pozitia indicata nu poate fi zero sau negativa. 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 Random Binary, Append, Input Valoarea returnata Numarul urmatoarei nregistrari (care va fi citita sau scrisa) Output, 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 cnd se atinge sfrsitul unui fisier deschis pentru citire (Random, Binary sau Input). Pentru fisierele dschise n iesire functia genereaza mereu True. EOF(filenumber) filenumber este un ntreg continnd numarul fisierului testat. Utilizarea uzuala este Do While Not EOF(filenum) (instructiuni, inclusiv citire din fisierul filenum) Loop Pentru acces secvential (Input) se ntoarce False pna cnd se atinge sfrsitul de fisier, pentru fisierele Random sau Binary se returneaza False pna cnd ultima instructiune Get executata nu a putut citi o nregistrare ntreaga.

43

Citirea cu Input dintr-un fisier deschis Binary produce eroare la utilizarea mecanismului general (pna cnd EOF () este true): se va utiliza citirea cu Get sau citirea cu 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 Random Sequential Valoarea returnata Numarul ultimei nregistrari scrise sau citite Pozitia curenta mpartita la 128. (Se spune ca aceasta informatie nu este niciodata utila sau utilizata) Pozitia ultimului octet citit sau scris.

Binary

Functia Loc este utilizata, mpreuna cu functia LOF, la testarea sfrsitului 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 sfrsitului 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

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 cnd vor fi necesare, se vor da explicatii suplimentare pentru Access 97. Utiliznd Visual Basic Editor, numit n continuare VBE, se poate crea, edita, depana si executa cod program asociat cu documente Microsoft Office. Proiectele dezvoltate n VBE, desi sunt asociate aplicatiilor din Office, nu pot fi reduse, ca problematica, la procesarea de texte (Word), calcul tabelar (Excel), prezentari electronice (PowerPoint) sau baze de date (Access). Este corect sa se considere aceste proiecte drept aplicatii similare celor dezvoltate n alte medii de programare, avnd nsa la dispozitie componentele aplicatiilor din Office. Cu alte cuvinte, nu este vorba de o limitare a posibilitatilor de prelucrare, ci o potentare a acestora prin apelul posibil la obiectele din Office. O obiectie la utilizarea VBA este aceea ca proiectul se poate executa doar dintr-o aplicatie Office (deci deschiznd, chiar formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente disponibile n dezvoltarea proiectului compenseaza acest neajuns. n plus nu trebuie uitat ca orice aplicatie necesita o interfata utilizator (puternica n Microsoft Office) si ca aplicatiile de baza sunt ntretinute si completate de Microsoft, astfel nct proiectele noastre se vor actualiza si ele o data cu componentele Office. Un ultim argument este acela ca mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio (Visual Basic, C++ etc.) astfel ca practica n VBA poate fi considerata introductiva catre alte aplicatii RAD. Interfata grafica VBE Pentru a deschide editorul VB, mai nti se va porni o aplicatie din Microsoft Office, apoi se poate actiona

combinatia Alt+F11 (daca nu a fost atribuita altei operatiuni), sau butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizata ntr-o aplicatie Office, sau Meniul Tools, Macro, Visual Basic Editor.

n Access se va activa fisa Modules a proiectului. Interfata grafica VBE este suficient de complexa, asemanatoare mediilor de programare din Visual Studio. Pe lnga obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite categorii de obiecte:

Properties Window pentru vizualizarea si fixarea proprietatilor n momentul proiectarii (design-time); Project Explorer care permite navigarea, vizualizarea si modificarea proiectelor deschise la un moment dat; Code Window unde este se scrie si este vizibil codul sursa al proiectului activ; Locals Window care permite vizualizarea variabilelor locale cu valorile lor; 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

Fereastra Properties poate fi utilizata, n momentul proiectarii, pentru a vizualiza toate proprietatile obiectului activ si a modifica valorile dorite. n partea superioara este cutia de obiecte n care se poate selecta un obiect (sau mai multe) dintre cele vizibile. n fisa Alphabetic se listeaza proprietatile modificabile ale obiectului selectat, n ordine alfabetica. Se poate modifica valoarea unui atribut prin selectarea numelui proprietatii si tastarea sau selectarea noii valori. n fisa Categorized sunt listate proprietatile dupa categorii, ntr-un control de tip Explorer, in care ramurile pot fi expandate sau. Fereastra Properties poate fi aratata (cnd nu este vizibila), prin comanda Properties 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 stnga). Pentru a vedea interfata utilizator pentru un obiect sau forma se selecteaza si se apasa butonul View Object (cel din mijloc). Pentru a vedea organizarea n foldere a elementelor listate n Project Explorer se va apasa butonul Toggle Folders. Fiecare element este nsotit, n arborele de structura, de icoana specifica elementului: proiect, folder, referinta, obiect etc. 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 nti se va selecta, din Project Explorer, modulul sau forma vizata si apoi se va apasa butonul View Code. Pentru a vedea mai mult de o procedura n fereastra de cod, se va selecta boxa de control Default to Full Module View n fisa Editor din Options (meniul Tools) (n caz contrar se va vedea doar cte o procedura). n partea de sus a ferestrei se gasesc doua boxe:

Object Box unde se poate selecta obiectul pentru care se afiseaza procedurile asociate; Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaza/editeaza codul. Procedurile pot fi de tip eveniment, daca obiectul selectat este

46

o forma utilizator. Selectarea unei proceduri produce o defilare a textului astfel nct pointerul sa fie la prima linie a procedurii. Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat ntre ferestre, ferestrele se pot diviza utiliznd bara de divizare etc. Actionarea butonului Procedure View Icon (primul din stnga, 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 cnd se trece din modul Run n modul Break sau atunci cnd se navigheaza n stiva de apeluri. Pentru o descriere a ferestrei se va vedea sectiunea dedicata depanarii programelor. 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 att prin aceea ca operatiuni simple pot fi traduse usor n instructiuni VBA, procedurile pot fi editate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cautare/nlocuire sau formatari de obiecte grafice) codul generat automat ofera un bun model de utilizare a obiectelor, proprietatilor si metodelor aplicatiei. Pentru a nregistra un macro:

Se afiseaza bara de unelte Visual Basic (meniul 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

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 cnd are loc un anumit eveniment (cum ar fi deschiderea unui document, actionarea unui buton etc.), trebuie sa se scrie o procedura asociata evenimentului respectiv. O asemenea procedura se va numi procedura evenimentului. Anumite obiecte din aplicatiile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declansate de catre sistem sau de catre utilizator. Evenimentele specifice fiecarui obiect trebuie sa fie studiate separat (se va studia sectiunea din Help pentru fiecare aplicatie), doa principalele obiecte, cu proprietatile, metodele si evenimentele lor, sunt prezentate si n acest curs, n capitole separate. Modul cum aplicatia raspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de eveniment. O asemenea procedura se va scrie n fereastra Code asociata obiectului. De fiecare data cnd apare evenimentul se executa procedura evenimentului respectiv. De exemplu, daca se scrie o procedura asociata cu evenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere a acelui documentului. O procedura de eveniment este memorata n documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc. unde poate fi declansat evenimentul. Pentru a vedea codul sursa al procedurii, se va selecta obiectul n Project Explorer si click pe butonul View Code pentru a deschide fereastra de cod asociata. Dintr-o fereastra de cod deschisa, asociata, se va selecta obiectul vizat, din boxa de obiecte, si n boxa de proceduri vor fi

48

listate atunci toate procedurile evenimentelor, chiar daca ele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (daca nu exista) liniile obligatorii ale procedurii si va fixa cursorul de editare n procedura respectiva. Numele unei proceduri de eveniment este format din numele obiectului, care recunoaste evenimentul, urmat de caracterul "_" si de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care se executa la deschiderea unui document. Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dupa ce s-au scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte (Document, Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite. 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 nct VB poate recunoaste un cuvnt, atunci prin CTRL+SPACE, sau click pe butonul Complete Word de pe bara de unelte Edit, completeaza cuvntul. n dialogul Options (meniul Tools) se pot activa urmatoarele actiuni, executate automat la completarea unei linii de cod:

verificarea automata a sintaxei Auto Syntax Check; obligativitatea declararii tuturor variabilelor, adaugarea automata a instructiunii Option Explicit la orice nou modul Require Variable Declaration; afisarea unei liste cu informatii utile (logice la pozitia curenta a cursorului) la completarea instructiunii Auto List Member; afisarea informatiei despre proceduri si parametrii lor Auto Quick 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 cteva butoane, care ajuta la completarea cuvintelor si expresiilor n timpul scrierii instructiunilor:

List Properties/Methods deschide o cutie n fereastra Code cu proprietatile si metodele permise pentru obiectul care precede caracterul punct ("."), utila atunci cnd se opereaza cu obiecte. List Constants deschide n fereastra de cod, la punctul de insertie, o cutie cu constantele permise pentru proprietatea care precede semnul egal ("=") n instructiunea curenta. Quick 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 cuvntul tastat. Comment Block care transforma n comentarii liniile selectate.

49

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

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 cte un capitol pentru Word, Excel etc., n care se vor prezenta particularitatile de operare si obiectele specifice aplicatiei. Privire generala Orice aplicatie poate fi gndita ca ansamblul a doua lucruri: continut si functionalitate. Continutul se refera la documentele pe care le contine aplicatia, la elementele care compun documentele, la informatiile privind atributele elementelor. Functionalitatea se refera la modurile, caile n care se poate lucra cu continutul aplicatiei, de exemplu: deschiderea, nchiderea documentelor, adaugarea, copierea, formatarea elementelor etc. Continutul si functionalitatea unei aplicatii sunt divizate n unitati discrete de continut si functionalitate specifica, numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, sectiuni ale unui document Word etc., fiecare avnd evident un continut si o functionalitate specifica, cele doua componente fiind unitar legate ntre ele. Obiectele unei aplicatii sunt ierarhizate n structuri, modelul de obiecte al aplicatiei.. Obiectul de nivel maxim al unei aplicatii este, uzual, obiectul Application, care este aplicatia nsasi. Obiectul Application contine alte obiecte care pot fi accesate numai cnd obiectul Application exista (deci cnd aplicatia se executa). De exemplu, obiectul Application Excel contine obiecte 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 rndul sau, alte obiecte copii. De asemenea, este posibil ca un copil sa aiba mai multi parinti. Modul n care obiectele, care alcatuiesc o aplicatie, sunt aranjate relativ unele fata de altele, mpreuna cu modul n care continutul si functionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte. Fiecare aplicatie are un model de obiecte propriu, reprezentarea grafica a ierarhiei de obiecte pentru aplicatie poate fi vazuta n Visual Basic Help din aplicatie. Fiecare obiect din ierarhie are un continut si o functionalitate care se aplica, ambele, att obiectului nsusi, ct si tuturor obiectelor descendente din ierarhie. Cu ct obiectul este situat mai sus n ierarhie, cu att este mai vast domeniul continutului si functionalitatii sale. Locul unui obiect n model este gndit astfel nct continutul si functionalitatea lui sunt adecvate domeniului sau. Se poate gndi si faptul ca, daca aplicatia este divizata n obiecte, fiecare obiect ofera acces la arii specifice de continut si functionalitate. Afirmatiile care implica obiecte utilizeaza si termenii de "continut n" pentru copil si "contine" pentru parinte. Astfel, obiectul Application Word contine obiecte Document, dar obiectul Selection este continut n obiectul Windows etc. Proprietati si metode

51

Pentru a avea acces la continutul si functionalitatea unui obiect, pentru nceput trebuie sa se identifice obiectul (subiect discutat n continuare). Dupa identificare, obiectul este accesibil prin intermediul proprietatilor si metodelor sale. n general, prin proprietate se ntelege un atribut numit al obiectului. Valoarea atributului (proprietatii) poate fi modificata (de cele mai multe ori) sau poate fi obtinuta (stiuta) programatic. Prin metoda se ntelege o procedura care actioneaza asupra unui obiect. Pentru a distinge o metoda de o procedura obisnuita (care poate de asemenea sa actioneze asupra unui obiect, n general vorbind), trebuie precizat ca metodele implementeaza functionalitatea obiectului, sunt specifice obiectului caruia i se aplica si sunt definite o data cu obiectul (deci la proiectarea aplicatiei de baza, n cazul obiectelor Office). Orice procedura utilizator actioneaza asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect. n general, se utilizeaza proprietatile pentru a accesa continutul si se apeleaza metodele pentru a realiza functionalitatea obiectului. Totusi, aceasta distinctie este relativa: exista proprietati care se apropie de metode si metode care seamana a fi proprietati. Atunci cnd vom discuta despre obiecte definite de utilizator se va vedea ca este usor sa se treaca granita dintre metode si proprietati n proiectarea obiectelor. Legatura dintre modelul obiectelor si interfata utilizator Exista doua cai prin care utilizatorul poate interactiona cu obiectele aplicatiei:
o o

manual (utiliznd interfata utilizator a aplicatiei); programatic (utiliznd un limbaj de programare).

n accesul manual se utilizeaza tastatura, mouse-ul sau cheile directe pentru a naviga catre acea parte si functie a aplicatiei care executa ceea ce se doreste (formatarea unui paragraf, stergerea unor formule dintr-o celula, modificarea unui slide etc.). n accesul programatic, de exemplu n instructiuni Visual Basic, se navigheaza n ierarhia de obiecte pentru a identifica obiectul vizat si apoi se utilizeaza proprietatea sau metoda care produce efectul urmarit. De exemplu, prin linia urmatoare, scrisa ntr-o procedura, Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100 se navigheaza n caietul Activitate la foaia Vanzari si se nscrie valoarea 100 n celula A5. Este evident ca nscrierea are loc efectiv doar n momentul executiei procedurii. Deoarece ambele moduri de acces, interfata utilizator a aplicatiei de baza si Visual Basic, ajung la acelasi continut si functionalitate, multe dintre obiectele, proprietatile si metodele existente n modelele de obiecte Office au aceleasi denumiri cu elementele din interfata utilizator (denumiri de meniuri, comenzi, actiuni etc.). Se poate observa, explicabil din punctul de vedere al evolutiei catre modelele obiectuale, o asemanare globala a modelului de obiecte cu interfata utilizator. Aceasta asemanare este ntarita si de faptul ca pentru orice actiune posibila prin interfata utilizator exista posibilitatea de a scrie cod Visual Basic echivalent (vezi si discutia cu nregistrarea macro-urilor). Din exemplul prezentat la accesul din VB, este de retinut importanta cunoasterii locului ocupat de obiectul procesat n ierarhia de obiecte: pentru a utiliza proprietatile sau metodele lui trebuie identificat corect prin navigarea (calificarea) de la nivelul cel mai de sus pna la el. ntregul traseu (cu exceptia nivelului Application, care este uneori subnteles) trebuie specificat ca n exemplul aratat. Colectii de obiecte

52

O colectie este un obiect care include obiecte similare (dar nu neaparat), astfel nct se poate opera cu ansamblul lor. Acest lucru nu nseamna ca metodele sau proprietatile obiectelor (daca sunt toate de acelasi tip) se aplica tuturor elementelor colectiei. Ca obiect separat, o colectie are proprietati si metode specifice (numarul de elemente, adaugarea unui nou element etc.). De regula, colectiile definite n Office (exista posibilitatea de a defini noi colectii) se remarca prin aceea ca au forma de plural a denumirii elementelor lor: Workbooks este colectia de obiecte Workbook, Documents este colectia de obiecte Document etc. Elementele (membrii) colectiei se pot identifica prin numarul de ordine (ncepnd cu 1) sau prin nume (rezulta ca ansamblul elementelor este ordonat). Astfel instructiunea Presentations.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 EachNext sau ForNext: 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 cuvnt 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

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, utiliznd proprietati si/sau metode, sa se navigheze n sus sau n jos prin ierarhia de obiecte pna cnd ajungem la obiectul dorit. Proprietatile si metodele utilizate pentru a returna punctul de start si pentru a parcurge ierarhia de obiecte se numesc accesori de obiecte (object accessors) sau accesori. Cteva idei utile pentru construirea expresiei care returneaza referinta la un obiect sunt urmatoarele:
o

un loc obisnuit pentru a accesa modelul de obiecte este obiectul cu nivelul cel mai nalt, uzual obiectul Application. Se va utiliza proprietatea Application pentru a returna o referinta la obiectul Application. Urmatoarea expresie returneaza o referinta la obiectul Application (pentru orice biblioteca de obiecte care contine un obiect Application). Application

pentru a ajunge din vrful ierarhiei pna la un obiect, se vor parcurge obiectele de pe toate nivelele, utiliznd accesori care returneaza un obiect din altul. De exemplu, proprietatea Documents a obiectului Word Application returneaza obiectul colectie Documents, care reprezinta toate documentele deschise. Prin urmare urmatoarea expresie ntoarce o referinta la obiectul colectie Documents: Application.Documents

Exista accesori directi (shortcut accessors) care dau acces direct la obiecte din model fara sa fie necesar un acces prin vrful ierarhiei. Asemenea accesori sunt Documents, 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 cnd 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, ntruct Visual Basic poate sa determine din contextul n care se executa codul carui obiect i se aplica proprietatea sau metoda respectiva.
o

Pentru a returna un singur element al unei colectii se va utiliza proprietatea sau metoda Item cu numele sau numarul de ordine al elementului. Pentru cele mai multe colectii, Item este implicit, deci poate lipsi Workbooks.Item("Vanzari") Workbooks("Vanzari")

Pentru a "urca" n ierarhia de obiecte, se utilizeaza, de obicei, proprietatea Parent a obiectului curent. De notat ca proprietatea Parent poate returna uneori, n special daca obiectul este membru al unei colectii, "bunicul" obiectului n locul parintelui (adica parintele colectiei n locul colectiei). De exemplu

54

Document.Parent
o o

returneaza obiectul Application si nu Documents. 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 stnga a ferestrei active utiliznd proprietatea Left a obiectului Window, referinta la acest obiect fiind returnata de accesorul direct ActiveWindow. ActiveDocument.Close nchide documentul activ (n Word) utiliznd 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 vrful ierarhiei de obiecte:
o o o o o o

Proprietatea Application returneaza o referinta la obiectul Application. Proprietatea Documents a obiectului Application returneaza o referinta la colectia Documents. Metoda Item a colectiei Documents returneaza o referinta la un songur obiect Document. Proprietatea Words a obiectului Document returneaza o referinta la colectia Words. Metoda Item a colectiei Words returneaza o referinta la un singur obiect Range. Proprietatea Text a obiectului Range stabileste textul itemului referit.

Astfel, urmatorul exemplu completeaza primul cuvnt 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

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 cnd se cunoaste realizarea unei actiuni n interfata utilizator a aplicatiei de baza si se doreste cunoasterea obiectelor, proprietatilor si metodelor care pot sa realizeze acea actiune (sau ceva asemanator). n general, codul generat de nregistrarea macro nu este foarte eficient si robust, deoarece nregistrarea pleaca de la obiectul selectat n momentul startului si realizeaza doar navigarea n restul modelului de obiecte. Orice utilizare ulterioara va necesita o selectare sau activare similara pentru a ndeplini actiunea asteptata. Trebuie sa se considere codul nregistrat doar o prima schita a procedurii, modificari ulterioare trebuind sa produca o varianta mai clara si mai robusta. Codul generat este mai robust si mai flexibil daca va contine expresii care navigheaza prin ierarhia de obiecte fara sa nceapa cu un obiect selectat sau activat. 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, utiliznd 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

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 returnnd o valoare de tip Long. Textul din zona Detail poate fi copiat (prin Clipboard) sau dus prin drag-and-drop ntr-o fereastra cod. Legarea timpurie si uneltele de construire a instructiunilor Atunci cnd se creeaza ntr-o aplicatie o variabila obiect care se refera la un obiect furnizat de alta aplicatie, Visual Basic trebuie sa verifice ca obiectul exista si ca proprietatile si metodele utilizate pentru obiect sunt specificate corect. Acest proces de verificare se numeste legare (binding). Legarea poate sa apara n timpul executiei proiectului (legare trzie) sau n timpul compilarii (legare timpurie). Codul legat trziu este mai ncet dect codul legat timpuriu. n plus, uneltele de ajutor n scrierea codului pot sa lucreze corect doar n cazul legarii timpurii. Pentru a lega timpuriu codul se vor parcurge etapele:

Se stabileste o referinta la biblioteca de tipuri care contine obiectele referite (Tools - References). Se declara variabila obiect de un tip specific (de exemplu As Document si nu As Object). Daca se scrie cod care utilizeaza obiecte din mai multe biblioteci, se va specifica numele aplicatiei unde sunt declarate obiectele, mai ales daca obiecte cu acelasi nume exista n mai multe biblioteci. (de exemplu As Excel.Window).

Daca o proprietate sau o metoda utilizata returneaza un tip generic Object si nu un tip specific, atunci pentru legarea timpurie se va declara mai nti o variabila de tipul specific si apoi se va atribui rezultatul generic returnat acestei variabile, dupa modelul Dim testWs As Worksheet Set testWs = Workbooks(1).Worksheets(1) necesar deoarece metoda Item a obiectului 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

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 sfrsitul lucrului cu cealalta aplicatie, se va utiliza metoda Quit pentru a o nchide, dupa modelul appWD.Quit

58

Obiecte Microsoft Word (I) Obiectul Application Proprietati (obiectul Application) DisplayScrollBars DisplayStatusBar Height Width WindowState ActiveDocument ActivePrinter ActiveWindow Documents Selection Windows Metode (obiectul Application) Quit Obiectul Document Referirea unui Document Deschiderea documentelor Crearea/salvarea documentelor Activarea unui document Tiparirea unui document nchiderea documentelor Accesarea obiectelor din Document Obiectul 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, cmpuri etc. poate fi reprezentat printr-un obiect din Visual Basic. Pentru automatizarea lucrului n Word se utilizeaza metodele si proprietatile acestor obiecte. Modelul de obiecte din Word 97 cuprinde aproximativ 180 de obiecte. O reprezentare grafica a structurii ierarhice se poate vedea n Help "Microsoft Word Objects". O descriere detaliata a unui obiect se obtine prin dublu click pe numele obiectului (n diagrama) sau, uzual, prin indexul din Help. La instalarea aplicatiei trebuie sa se mearga pe 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

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 cteva 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 = True Application.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

Returneaza sau fixeaza latimea obiectului, n puncte. With Application .Height = 450 .Width = 600 End 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. Utiliznd proprietatea Options a obiectului Applications, se returneaza un obiect Options care poate fi apoi configurat, dupa exemplul With Application.Options .AllowDragAndDrop = True .ConfirmConversions = False .MeasurementUnit = wdPoints End With Pentru informatii complete se va studia obiectul Options. *** Dintre proprietatile obiectului Application care ofera acces la obiecte situate mai jos n ierarhie (accesori) sunt enumerate cele mai des utilizate. 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

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.ActiveWindow ActiveWindow = "Fereastra activa" Primul exemplu afiseaza numele ferestrei active, al doilea atribuie un nou nume ferestrei active. Este de remarcat ca numele ferestrei nu este obligatoriu identic cu numele documentului si ca exemplele functioneaza corect pentru ca proprietatea implicita a obiectului returnat este numele (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

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 (dect 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

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.Name Else 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 ntmpla daca FileName este numele unui fisier deja deschis: True pentru a neglija orice schimbari nesalvate si redeschiderea documentului; False pentru a activa documentul deschis. 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

, 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 If End With Se va observa utilizarea structurii WithEnd 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

Set dlg = Dialogs(wdDialogFileOpen) aButton = dlg.Display fSelected = dlg.Name If aButton = -1 Then Documents.Open FileName:=fSelected End 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 = True For Each aDoc In Documents If InStr(1,aDoc.Name,"cautat.doc",1) Then aDoc.Activate Exit For Else docFound = False End If Next aDoc If docFound = False Then Documents.Open FileName:="cautat.doc" Pentru a determina cte 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 nct valoarea returnata poate fi atribuita unei variabile de tip obiect pentru a putea referi direct noul document n program: Dim myDoc As Document Set myDoc = Documents.Add myDoc.PageSetup.TopMargin = 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

Exemplul urmator construieste o expresie mai complicata, exploatnd cele spuse mai sus: se creeaza un nou document care este salvat imediat cu un nume si apoi se insereaza n document un tabel cu doua linii si trei coloane. Documents.Add.SaveAs FileName:="vanzari.doc" Documents("vanzari.doc").Tables.Add _ Range:=Selection.Range, NumRows:=2, NumColumns:=3 Pentru salvarea modificarilor efectuate ntr-un document, se utilizeaza metoda 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 ramne activ. Documentul activat trebuie sa fie deschis (inclus n colectia Documents): Documents("raport.doc").Activate Doc1.Activate daca variabila Doc1 a primit ca valoare un document deschis. Metoda Activate, aplicabila mai multor obiecte (vezi Word VB Help Activate Method), are sintaxa expression.Activate

67

unde expression este orice expresie care returneaza un obiect caruia i se poate aplica metoda. Tiparirea unui document ntruct tiparirea unui document este gestionata de mai multe comenzi si parametri, din dialoguri diferite n mediul Word, controlul tiparirii din Visual Basic necesita eventuale interventii asupra obiectului Options (pentru a fixa parametrii accesati uzual prin 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 cnd, 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 pna 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

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 dect cel curent) care contine documentul care se tipareste. Daca argumentul este omis, atunci se tipareste documentul activ. Argumentul este admis doar pentru obiectul Application. Exemplul urmator fixeaza pentru documentul activ tiparirea textului ascuns si tipareste primele trei pagini: Options.PrintHiddenText = True ActiveDocument.PrintOut Range:=wdPrintFromTo, From:=" 1", To:=" 3" Daca tiparirea se efectueaza cu valorile curente (implicite) ale parametrilor, atunci este suficienta comanda: ActiveDocument.PrintOut Se observa ca operatiunea de tiparire necesita, pentru o procesare mai fina, specificarea documentului, specificarea paginilor, a tipului de tiparire (toate, pagini pare sau impare), specificarea destinatiei (imprimanta sau fisier). Se va vedea si proprietatea 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 aplicnd 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

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 utiliznd proprietatile si metodele obiectelor astfel returnate se pot modifica programatic obiectele referite: se pot adauga si formata tabele, cmpuri, paragrafe, cuvinte etc. ActiveDocument.Footnotes.Add Range:=myRange, Text:="Textul notei de subsol adaugate" adauga o nota de subsol la locul din document specificat de variabila myRange. 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 sfrsit. Utilizat pentru identificarea unor portiuni din document, obiectul Range este similar obiectului Bookmark, diferenta fiind totusi importanta: un obiect Range exista doar att timp ct se executa procedura care l-a definit. Atunci cnd pozitia de nceput este identica cu pozitia de sfrsit, obiectul Range identifica punctul de insertie. Nu exista limitari asupra ntinderii unui obiect Range. Obiectele Range sunt independente de selectia din document: se poate defini si modifica un domeniu fara sa se schimbe selectia. Se pot defini, de asemenea, domenii multiple ntr-un document, n timp ce selectia este unica ntr-un ochi de fereastra.. Pentru a ntelege toate proprietatile obiectului Range (si ale altor obiecte, de altfel), trebuie stiut ca zonele unui document se presupun structurate n episoade (stories). Un episod (story) este o zona de text diferita de celelalte zone din acel document. Astfel, daca un document contine text principal (body text), note de subsol si anteturi, atunci documentul contine un episod cu textul principal, un episod cu note de subsol si un episod cu anteturi. Exista 11 tipuri diferite de episoade posibile ntr-un document, corespunznd urmatoarelor constante (din WdStoryType):

70

WdEndnotesStory

wdEvenPagesFooterStory wdEvenPagesHeaderStory wdFootnotesStory wdPrimaryHeaderStory

WdFirstPageFooterStory wdFirstPageHeaderStory WdMainTextStory WdTextFrameStory wdPrimaryFooterStory

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 sfrsit ale obiectului Range. Pozitia de caracter de la nceputul fiecarui episod este 0, pozitia de dupa primul caracter este 1 s.a.m.d. Proprietatile 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 dect 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 = True myRange.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

Start este de tip Long, optional. Specifica punctul de nceput (n pozitii de caracter). End este de tip Long, optional. Specifica punctul de sfrsit (n pozitii de caracter). Pozitiile de caracter ncep cu 0 la nceputul documentului. Sunt numarate toate caracterele, inclusiv caracterele netiparibile. Caracterele ascunse se numara chiar daca nu sunt afisate. Daca nu se specifica pozitiile de nceput si/sau sfrsit, se considera, implicit, nceputul si sfrsitul documentului. Exemplul urmator scrie n bold primele 10 caractere ale documentului: ActiveDocument.Range(Start:=0, End:=10).Bold = True Daca este necesar ca obiectul Range returnat sa fie referit de mai multe ori, se va utiliza instructiunea Set prin care se atribuie obiectul returnat unei variabile obiect: Dim myRange As Range Set myRange = ActiveDocument.Range myRange.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 cuvntului "Final" dupa ultimul caracter din document. n exemplul urmator se observa utilizarea unui obiect Range doar ca punct de referinta n document (asemenea unui 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

ActiveDocument.Tables(1).Rows(1).Range ActiveDocument.Bookmarks(1).Range Nu trebuie uitata structura WithEnd 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: obiect returnat Range Range Range Paragraph Section

expresia Words(index) Characters(index) Sentences(index) Paragraphs(index) Sections(index)

Pentru ultimele doua colectii din tabel este de notat ca pentru a junge la obiectul Range corespunzator se va apela la proprietatea Range. Prin urmare Paragraphs(index).Range Sections(index).Range dau acces la obiectele Range respective. Pentru modificarea unui domeniu de text din document, se poate crea un obiect Range cu acele elemente (caractere, propozitii, paragrafe etc.). Aplicarea proprietatilor si metodelor obiectului Range astfel creat va produce modificarea textului referit de obiect: ActiveDocument.Words(1).Case = wdUpperCase trece primul cuvnt din document n majuscule. De remarcat ca proprietatea Case este aplicata obiectului Range returnat de ActiveDocument.Words(1). n formarea obiectelor Range sunt importante proprietatile Start si End care dau nceputul si sfrsitul. 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 cnd se seteaza aceasta proprietate, textul domeniului referit este nlocuit de valoarea atribuita proprietatii.

73

primCuvant = ActiveDocument.Words(1).Text ActiveDocument.Words(1).Text = "Capitol" returneaza sau modifica primul cuvnt din documentul activ. Pentru inserarea unui text naintea sau dupa un obiect Range se utilizeaza, respectiv, metodele InsertBefore sau InsertAfter. Dupa inserarea unui text, domeniul este extins automat pentru a include si textul inserat (nainte sau dupa). Sintaxa metodelor este expression.InsertBefore(Text) expression.InsertAfter(Text) unde expression este o expresie care returneaza un obiect 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 sfrsitul 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 = ActiveDocument Set 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 sfrsit (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 cnd domeniul se refera la un ntreg paragraf, produce un domeniu situat dupa marca de paragraf. Pentru formatarea textului dintr-un obiect Range, se utilizeaza

74

proprietatea 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 = True End With With ActiveDocument.Paragraphs(1).Range.ParagraphFormat .LeftIndent = InchesToPoints(0.5) .Space1 End With Textul sursa precedent realizeaza pentru primul paragraf din documentul activ setarea fontului ca "Times New Roman", de marime 14 si scris cu majuscule. n formatarea paragrafului se realizeaza indentarea din stnga cu 1.5" si spatierea la un rnd. 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 cnd operatiunea produce inversarea fizica a pozitiilor de Start si End, cele doua pozitii devin egale (Range sufera un colaps). Valoarea implicita este 1.

75

n exemplul urmator myRange.MoveEnd Unit:=wdParagraph, Count:=1 se extinde domeniul nct sa cuprinda si urmatorul paragraf. 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 sfrsit (end). De exemplu: myRange.SetRange Start:=myRange.Start, End:=myRange.End+10 care extinde domeniul cu 10 caractere. Pentru deplasarea obiectului Range cu un numar de unitati se va studia metoda 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 EachNext. 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

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

Obiecte Microsoft Word (II) Obiectul Selection Deplasarea si extinderea selectiei Metoda GoTo Metodele GoToNext, GoToPrevious Obiecte accesibile din Selection Selection proprietati si metode uzuale Proprietatea Text Formatarea textului selectat Returnarea obiectului Range Proprietatea Information Determinarea tipului de selectie Obiectele Find si Replacement Find ClearFormatting Execute Selection.Find Range.Find Replacement Obiectele 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 cnd se proceseaza un document n Microsoft Word, este uzual sa se selecteze o portiune de text si sa se formateze/modifice/etc. portiunea selectata. n Visual Basic, operatiunea de selectare prealabila nu este necesara, obiectul Range permite toate actiunile pentru domenii determinate ale documentului. Totusi, atunci cnd se doreste ca, programatic, sa se raspunda unei selectii efectuate de utilizator, sau sa se modifice selectia etc., se poate opera cu obiectul Selection. Exista un singur obiect Selection pe ochi de fereastra si doar un obiect este activ la un moment dat (corespunznd locului unde este puctul de insertie, cu toata zona selectata adiacenta). Este evident, din lucrul n Word, ca o selectie poate sa se refere la un ntreg domeniu sau poate fi redusa la punctul de insertie. Obiectul 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

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 dect o selectie pe ochi de fereastra, selectarea unei noi zone muta implicit si obiectul Selection. Aceasta selectare se efectueaza aplicnd metoda Select unui element din document: ActiveDocument.Words(1).Select permite mutarea selectiei la primul cuvnt, astfel nct se poate utiliza dupa aceea metoda Selection: Selection.Text = "Primul" pentru modificarea textului selectat. Exista un numar de metode care deplaseaza selectia n document (prin modificarea corespunzatoare a obiectului Selection). Move(Unit, Count) reduce selectia la punctul de sfrsit (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 stnga si mutarea selectiei, wdExtend pentru extensie spre stnga. 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

Selection.MoveEnd Unit:=wdParagraph, Count:=1 extinde selectia prin mutarea pozitiei finale la sfrsitul paragrafului. Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend extinde selectia activa cu un cuvnt spre dreapta. Utilizarea metodelor 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 wdGoToEquation wdGoToComment wdGoToField wdGoToEndnote wdGoToFootnote wdGoToHeading wdGoToPage

wdGoToGrammaticalError wdGoToGraphic wdGoToLine wdGoToPercent wdGoToSpellingError wdGoToObject

wdGoToProofreadingError wdGoToSection 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

Selection.GoTo What:=wdGoToHeading, Which:=wdGoToAbsolute, Count:=1 Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=4 Selection.GoTo What:=wdGoToLine, Which:=wdGoToPrevious, Count:=2 Selection.GoTo What:=wdGoToField, Name:="Date" Metodele GoToNext, GoToPrevious Pentru 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 = True MsgBox Selection.Footnotes(1).Range.Text Pentru parcurgerea tuturor obiectelor dintr-o colectie returnata se va folosi structuraFor EachNext: For Each aBook In Selection.Bookmarks MsgBox 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.Text Selection.Text = "Hello World" Se va utiliza metoda InsertBefore sau InsertAfter pentru inserarea unui text nainte sau dupa selectie (cu extinderea corespunzatoare a selectiei).

81

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 = 14 End With Selection.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 cnd anumite metode sau proprietati se pot aplica doar unui obiect Range: Selection.Range.CheckSpelling Proprietatea Information Returnarea informatiilor despre selectie, cum ar fi numarul paginii curente, numarul total de pagini, faptul ca selectia este n antet sau picior de pagina etc. Sintaxa este expression.Information(Type) unde expression este o expresie care returneaza un obiect Range sau 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

o o o

wdActiveEndAdjustedPageNumber numarul paginii care contine sfrsitul activ al selectiei sau domeniului. Numarul este ajustat pentru a considera personalizarile efectuate de utilizator (numar de nceput etc.). wdActiveEndPageNumber numarul paginii care contine sfrsitul activ al selectiei sau domeniului. Numarul este dat relativ la nceputul documnetului, si nu este modificat de personalizarile efectuate de utilizator (numar de nceput etc.). wdHorizontalPositionRelativeToPage pozitia orizontala a selectiei sau domeniului; distanta de la marginea stnga a selectiei la latura stnga a paginii. Distanta este data n twips (20 twips = 1 point, 72 points = 1 inch). Daca selectia sau domeniul nu este n zona ecran, atunci se ntoarce 1. wdInHeaderFooter ntoarce True daca selectia/domeniul este n ochiul de fereastra antet sau footer, sau n header sau footer (n page layout view). wdWithInTable ntoarce True daca selectia este ntr-un tabel. wdZoomPercentage ntoarce procentajul curent de marire a documentului, dupa cum este fixat de proprietatea Percentage.

82

Exemplul urmator afiseaza, daca selectia este ntr-un tabel, numarul de coloane si de linii ale tabelului: If Selection.Information(wdWithInTable) = True Then MsgBox "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, wdSelectionFrame, wdSelectionBlock, wdSelectionInlineShape, wdSelectionColumn, wdSelectionIP, wdSelectionShape

wdSelectionNormal, wdSelectionRow,

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.Select End 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 o

stabilirea parametrilor cautarii/nlocuirii, prin proprietatile obiectului Find/ Replacement. In proprietatea Text se precizeaza textul cautat sau nlocuitor. 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

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 sfrsitului (sau nceputului) fisierului sau negasirii textului n domeniul cautat. Poate fi o constanta (de tip WdFindWrap): wdFindAsk consultarea utilizatorului, wdFindContinue continuarea n restul documentului, wdFindStop oprirea la epuizarea domeniului de cautare. Read/write, Long.

Obiectul Find are doua metode:


o o

ClearFormatting pentru nlaturarea oricarei formatari a textului cautat, necesara pentru a initia o noua cautare de formate; 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, 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. MatchWildcards, MatchSoundsLike,

84

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 sfrsitul 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 cuvntului "Hello", cautarea oprindu-se la atingerea sfrsitului documentului: With Selection.Find .Forward = True .Wrap = wdFindStop .Text = "Hello" .Execute End With Acelasi efect se putea obtine folosind argumentele metodei 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 = True End With

85

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 cuvntului "blue" n documentul activ. Daca operatiunea se termina cu succes, atunci obiectul Range este redefinit la cuvntul gasit, astfel nct prin .Parent se face referinta la obiectul Range redefinit si cuvntul "blue" este trecut n stilul bold. Acelasi efect se obtinea prin Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="blue", Forward:=True If 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:=wdFindContinue End With executa o cautare a cuvntului "hi", neformatat, si nlocuirea tuturor aparitiilor cu cuvntul "hello", de asemenea neformatat. Cautarea si nlocuirea are loc n tot documentul, indiferent de unde se ncepe. Selectia se modifica la fiecare ntlnire a cuvntului "hi", deoarece se pleaca din obiectul Selection. With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False

86

End With .Execute FindText:="", ReplaceWith:="", Format:=True, Replace:=wdReplaceAll End With n acest exemplu se utilizeaza att pentru cautare, ct si pentru nlocuire textul vid, ceea ce produce doar o nlocuire a formatului bold cu formatul normal. Este de remarcat, pentru nlocuirea formatelor, combinatia de valori ale argumentelor 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 utiliznd 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

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

o 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 cnd wdTableFormatProfessional arata selectarea formatului automat Professional. Vezi si metoda AutoFormat. Shading returneaza un obiect Shading prin care se stabilesc atributele de umbrire. 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 o o

Borders, colectia de chenare a tabelului, Columns, colectia de coloane, Rows, colectia de linii.

Metodele obiectului Table permit att operatiuni asupra ntregului tabel (autoformat, stergere, selectare, sortare, divizare etc.), ct si accesul la celulele tabelului. Mentionam:
o

o o 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. Delete produce eliminarea obiectului, deci stergerea din document a tabelului. Select realizeaza selectarea tabelului, astfel nct se poate opera apoi cu proprietatea Selection. 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. 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 o o o o

Borders, returneaza colectia de chenare, Shading, returneaza un obiect Shading prin care se stabilesc atributele de umbrire, Width returneaza sau stabileste latimea coloanelor, n puncte. Read/write, de tip Long. First returneaza prima coloana din colectie. Read only. Last returneaza ultima coloana din colectie. Read only.

Metodele permit operatiuni specifice tuturor colectiilor (Count, Add) sau specifice obiectului coloane de tabel:
o o o 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). AutoFit care ajusteaza latimea coloanei, daca este posibil, pentru a cuprinde textul interior. DistributeWidth care produce o redistribuire a latimilor nct toate coloanele sa fie egale. 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

modifica doar prima coloana, wdAdjustNone nu modifica celelalte coloane, wdAdjustProportional ajusteaza toate coloanele din dreapta, wdAdjustSameWidth aceeasi latime tuturor coloanelor specificate. Ultimul argument este mai important pentru stabilirea latimii unor celule sau unei singure coloane (aplicnd metoda obiectelor respective si nu colectiei). 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 o o o o

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

Metodele obiectului Column sunt


o o o o

o o o

AutoFit, Delete, Select, SetWidth cu explicatii evidente sau similare metodelor sinonime prezentate anterior. Sort(ExcludeHeader, SortFieldType, SortOrder, CaseSensitive, LanguageID) care ordoneaza celulele coloanei. Argumentele sunt ExcludeHeader, optionala, este True daca se omite din ordonare prima linie. SortFieldType, optional, Variant, arata tipul de sortare poate fi una dintre constantele WdSortFieldType: wdSortFieldAlphanumeric (valoarea implicita), wdSortFieldDate sau wdSortFieldNumeric. SortOrder, optional, Variant, specifica ordinea. Poate fi o constanta de tip WdSortOrder: wdSortOrderAscending (implicita) sau wdSortOrderDescending. CaseSensitive, optional, Variant, este True daca se ia n considerare capitalizarea literelor. Implicit este False. 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 lnga proprietatile similare celor prezentate la coloane (Borders, Shading, Width, Height etc.) este utila proprietatea

89

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

o o

Add(BeforeCell) care adauga o noua celula naintea celulei referite de BeforeCell (de tip Variant, optionala, returneaza un obiect Cell). Merge care produce fuzionarea tuturor celulelor din colectie. Rezultatul este o singura celula n tabel. Split(NumRows, NumColumns, MergeBeforeSplit) care produce divizarea celuleor din colectie potrivit valorilor argumentelor: NumRows, NumColumns reprezinta numarul liniilor, coloanelor dupa divizare. Optionale, de tip Variant. MergeBeforeSplit este de tip Variant, optional si are valoarea True daca se doreste fuzionarea celulelor nainte de divizare. SetHeight(RowHeight, HeightRule) stabileste naltimea pentru toata linia unei celule implicate. RowHeight este Single si da naltimea n puncte. 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. SetWidth(ColumnWidth, RulerStyle), cu explicatia de la Columns. 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 o

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

AutoSum insereaza un cmp formula care calculeaza suma valorilor din tabel situate deasupra sau la stnga celulei. 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

o o

o o o o o

Formula(Formula, NumFormat) insereaza n celula o formula specificata si formateaza rezultatul. Argumentele Formula este sirul care contine o formula admisa n Word De exemplu "=SUM(ABOVE)". Daca mai sus sau la stnga celulei sunt valori numerice, formula este optionala si se completeaza potrivit alegerilor implicite Word. NumFormat este de tip Variant, optional si specifica formatul pentru rezultat ntr-o forma admisa (vezi Word VB Help Numeric Picture (\#) field switch). Merge(MergeTo) produce unirea celulei curente cu celula referita, ca obiect, de MergeTo. Select produce selectarea celulei, deci se poate apela apoi proprietatea globala Selection. SetHeight, SetWidth stabilesc naltimea si latimea celulei potrivit descrierii de la Cells. 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:=wdSeparateByTabs End If converteste n text primul tabel din selectie, daca selectia contine tabele, separnd continutul celulelor de pe o linie prin caractere tab. Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=1) Set myCell = ActiveDocument.Tables(1).Columns(1).Cells(1) stabilesc referinte la celula din prima linie si prima coloana a primului tabel din documentul activ. Ambele linii se refera la aceeasi celula. i=1 For Each celula In ActiveDocument.Tables(1).Range.Cells celula.Range.InsertBefore Text:="Celula " & i i = i+1 Next celula produce numerotarea celulelor din primul tabel al documentului. Este de remarcat utilizarea 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

Obiecte Microsoft Word (III) Utilizarea obiectului HeaderFooter Colectia Styles Obiectul Style Colectia CommandBars Colectia Dialogs Cmpuri adaugare, editare Verificarea unui obiect Modificarea comenzilor Word Lucrul cu evenimente Evenimente pentru Document Evenimente pentru Application Evenimente pentru ActiveX Auto Macro Automatizarea aplicatiilor Automatizarea Word din alta aplicatie Automatizarea altei aplicatii din Word Comunicarea cu obiectele scufundate n continuare sunt prezentate doar unele aspecte, considerate mai des utilizate, ale operarii cu alte obiecte (dect cele prezentate n precedentele doua fisiere) din modelul de obiecte al aplicatiei Microsoft Word. Pentru informatii mai ample se va studia Word VB Help sau alte materiale bibliografice. 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:=wdFieldAuthor End With Se observa definirea unui Range pentru a referi continutul piciorului de pagina, stergerea vechiului continut, adaugarea unui cmp cu numele fisierului (n 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 cmp cu numele autorului (din informatia adiacenta documentului).

92

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 = wdSeekCurrentPageFooter End With Selection.HeaderFooter.PageNumbers.Add _ PageNumberAlignment:=wdAlignPageNumberCenter Exemplul mai arata si modul de inserare a numerelor de pagina: prin proprietatea PageNumbers se returneaza colectia cmpurilor cu numerele de pagina incluse n respectivul antet sau picior de pagina. Proprietatea Add a colectiei adauga un nou cmp 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 (renceperea numerotarii, tipul de numerotare) se stabilesc la nivel de colectie. n sfrsit, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi si picioare de pagina existente, se stabilesc din proprietatile obiectului 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, avnd sintaxa

93

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

Font da acces la obiectul Font care permite formatarea caracterelor ParagraphFormat da acces catre formatarea paragrafului NextParagraphStyle stabileste stilul pentru urmatorul paragraf BuiltIn care este True daca stilul este un stil predefinit (built-in).

De exemplu, prin Set aDoc = ActiveDocument.AttachedTemplate.OpenAsDocument With aDoc .Styles(wdStyleHeading1).Font.Name = "Arial" .Close SaveChanges:=wdSaveChanges End With se deschide sablonul atasat documentului activ ca un document Word (singurul mod n care se pot schimba stiluri ntr-un template) si se modifica proprietatea Font a stilului "Heading 1", dupa care se nchide templateul. 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 = NormalTemplate CommandBars ("Formatting").Controls.Add Type:=msoControlButton, ID:=60, Before:=7

94

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

Type, proprietatea care returneaza tipul boxei built-in. Poate fi una dintre constantele WdWordDialog. Read-only, Long. DefaultTab, proprietatea care returneaza sau stabileste fisa activa la afisarea dialogului. Poate fi o constanta de tip WdWordDialogTab. Read/write, Long. Display, metoda care afiseaza dialogul, fara a transmite actiunile efectuate de utilizator asupra dialogului. Show, metoda care afiseaza dialogul, actiunile utilizator fiind transmise sau executate. Execute, metoda care aplica configurarea curenta a optiunilor dintr-un dialog.

Adaugarea si editarea cmpurilor dintr-un document Se pot adauga cmpuri 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 cmpul. Daca domeniul nu este redus la punctul de insertie, cmpul nlocuieste domeniul. Type este de tip Variant, optional. Stabileste cmpul care se insereaza. Poate fi o constanta de tip WdFieldType (vezi Help). Text este de tip Variant, optional. Text aditional necesar specificarii cmpului (de exemplu informatii de gen switch). PreserveFormatting este de tip Variant, optional. Are valoarea True pentru a pastra formatarea cmpului si la actualizari.

95

Dintre proprietatile obiectului Field, membru al colectiei Fields, mentionam


o o o o

Result, care returneaza un obiect Range reprezentnd rezultatul cmpului. Code, care returneaza un obiect Range reprezentnd codul cmpului. Next, care returneaza urmatorul cmp n colectie. Previous, care returneaza cmpul precedent din colectie.

Dintre metode amintim


o o

DoClick, echivalent cu actionarea cmpului de catre mouse. Update, care produce actualizarea rezultatului (recalcularea).

Exemplul urmator schimba codul primului cmp din selectie, actualizeaza cmpul si afiseaza rezultatul: If Selection.Fields.Count >=1 Then With Selection.Fields(1) .Code.Text = "CREATEDATE \*MERGEFORMAT" .Update MsgBox .Result.Text End With End 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 cteva tehnici pentru verificarea validitatii unei valori returnate de o expresie sau care este memorata ntr-o variabila. Aceste verificari pot elimina erori n executia codului proiectat. Se poate utiliza functia 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 cmp" O forma echivalenta este Set myField = Selection.NextField If TypeName(myField) = "Field" Then StatusBar = "Mai exista un cmp" n cazul cnd nu s-ar fi returnat un obiect, valoarea functiei era Nothing: If Not (myField Is Nothing) Then myField.Update

96

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 Integer i=1 Do While IsObjectValid(ActiveDocument.Paragraphs(i).Next) i=i+1 Loop MsgBox Str(i) & " paragrafe = (?) " & Str(ActiveDocument.Paragraphs.Count) Modificarea comenzilor Word Majoritatea comenzilor Word pot fi modificate prin transformarea lor n macro-uri. Pentru afisarea listei cu toate comenzile Word disponibile, se urmeaza secventa de comenzi, initiata din Word:
o o o o

Tools Macro selecteaza Word commands n lista Macro in n boxa Macro name se afiseaza toate comenzile, denumirile avnd 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 cnd 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 o o o

Tools => Macro => Macros => Word commands n Macro in selectarea comenzii care se nlocuieste selectarea locului de memorare n boxa Macro in. De exemplu Normal.dot pentru valabilitate generala (obtinerea unui macro global). Create

Editorul Visual Basic deschide un modul care contine un sablon al noii proceduri, cum ar fi Sub FileSaveHtml() ' ' FileSaveHtml Macro

97

' Save file as HTML document ' WordBasic.FileSaveHtml End Sub n care se pot completa/sterge orice instructiuni. Pentru a reveni la comanda Word initiala este suficient sa se elimine sau sa se redenumeasca procedura cu numele comenzii. Se poate nlocui, de asemenea, o comanda Word daca se creeaza un modul de cod avnd acelasi nume cu comanda (de exemplu 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 att ca rezultat al actiunii utilizatorului sau prin program, ct si prin declansarea de catre sistem. n Microsoft Word sunt recunoscute mai multe categorii de evenimente: asociate unui document, asociate aplicatiei si asociate controalelor ActiveX. Evenimente ale obiectului Document Trei evenimente sunt recunoscute de obiectul Document: Close, New si Open.
o

Close se produce atunci cnd se nchide documentul. Daca procedura de raspuns este memorata ntr-un template, se executa att la nchiderea oricarui document bazat pe sablon, ct si la nchiderea sablonului daca este deschis pentru editare. 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. 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 cnd documentul este deschis: Private Sub Document_Open() Application.WindowState = wdWindowStateMaximize End Sub

98

Domeniul de valabilitate (vizibilitate) a unei proceduri eveniment depinde de locul memorarii (de revazut completarile date la enumerarea evenimentelor). Procedurile eveniment din template-ul Normal nu au un domeniu global. Ele se vor executa doar daca sablonul Normal este si sablonul atasat documnetului. Procedurile care exista si n document si n template-ul atasat se vor executa amndoua. Evenimente ale obiectului Application Evenimentele aplicatiei apar atunci cnd utilizatorul paraseste aplicatia sau atunci cnd focalizarea este mutata pe alt document. Totusi, diferit fata de obiectul Document sau de controalele ActiveX, obiectul Application nu recunoaste evenimentele n mod implicit (nu raspunde n mod standard la producerea lor). Din acest motiv, nainte de a utiliza evenimentele obiectului Application, se va crea un modul clasa nou si se declara un obiect de tip Application cu evenimente. Se utilizeaza, n acest scop, comanda 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 utiliznd, de exemplu, declaratia Public apl As New EventClass unde EventClass este numele modulului clasa creat. Dupa crearea variabilei obiect apl (o instanta a clasei EventClass), se poate stabili egalitatea ntre obiectul App al clasei EventClass si obiectul Application Word prin Sub InitializeApp() Set apl.App = Application End 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 o

DocumentChange, care se produce la crearea unui nou document, la deschiderea unui document, sau la activarea unui alt document (mutarea focalizarii). 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 (nct urmatoarea activare a aplicatiei le afiseaza):

99

Private Sub App_Quit () CommandBars("Standard").Visible = True CommandBars("Formatting").Visible = True End 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 o

actionare buton dreapta mouse pe o bara de unelte 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 o

LostFocus, care apare atunci cnd focalizarea este mutata de la control la alt obiect, GotFocus, care apare atunci cnd focalizarea este mutata pe controlul ActiveX scufundat.

Fiecare control ActiveX recunoaste, totusi, evenimente aditionale, explicate la obiectele respective. n acest curs mai multe explicatii si exemple sunt date n capitolul "Controale ActiveX si dialoguri". 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 o

Modulul este bnumit cu numele macro-ului si contine o procedura denumita "Main." O procedura, n orice modul, are o denumire rezervata.

100

Macrourile automate pot fi memorate oriunde, template-ul Normal, alt sablon sau n document, cu exceptia procedurii AutoExec care nu se executa daca nu este memorata n Normal template sau un template global memorat n folderul Startup. n cazuri de conflict de denumiri, se executa macro-ul automat memorat n contextul cel mai apropiat, adica n ordinea: documentattached templateNormal 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 pna cnd 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 o o

Tools (din Visual Basic Editor) References 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.8 Set appWD = CreateObject("Word.Application.8") appWD.Visible = True Functia CreateObject returneaza un obiect Application Word si-l asigneaza variabilei appWD. Utiliznd obiectele, proprietatile si metodele obiectului Application Word se poate controla aplicatia Word prin intermediul variabilei appWD. De exemplu, crearea unui nou document appWD.Documents.Add

101

D. Functia CreateObject porneste o sesiune Word pe care automatizarea nu o nchide atunci cnd expira variabila obiect care se refera la obiectul Application Word. Nici stabilirea referintei obiectului la 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.Application Err.Number = 0 On Error GoTo notloaded ' 'obtinerea unui obiect Word Application, daca este pornita o sesiune Word ' Set appWd = GetObject(, "Word.Application.8") notloaded: If Err.Number = 429 Then ' ' se initiaza o sesiune Word (nu este alta sesiune deschisa) ' Set appWD = CreateObject("Word.Application.8") theError = Err.Number End If 'se vizualizeaza sesiunea Word appWD.Visible = True With appWD 'crearea unui nou document Set myDoc = .Documents.Add With .Selection ' ' transferul datelor din foaia Excel n documentul Word, ' pe doua coloane separate prin TAB ' For Each c 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

' ' 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.8 If Tasks.Exists("Microsoft Excel") = True Then Set xlObj = GetObject(, "Excel.Application.8") Else Set xlObj = CreateObject(, "Excel.Application.8") End If xl.Obj.Visible = True If xlObj.Workbooks.Count = 0 Then xlObj.Workbooks.Add xlObj.Worksheets("Sheet1").Range("A1").Value = Selection.Text Set xlObj = Nothing Exemplul urmator creeaza o nuoa prezentare PowerPoint, completeaza prima boxa text cu numele documentului Word activ si a doua boxa text cu primul paragraf al documentului. La terminare se elibereaza variabila obiect aplicatie. Dim pptObj As PowerPoint.Application.8 If Tasks.Exists("Microsoft PowerPoint") = True Then Set pptObj = GetObject(, "PowerPoint.Application.8") Else Set pptObj = CreateObject(, "PowerPoint.Application.8") End If ppt.Obj.Visible = True Set pptPres = pptObj.Presentations.Add Set aSlide =pptPres.Slides.Add(ndex:=1, Layout:=ppLayoutText) aSlide.Shapes(1).TextFrame.TextRange.Text = ActiveDocument.Name aSlide.Shapes(2). TextFrame.TextRange.Text = _ ActiveDocument.Paragraphs(1).Range.Text Set pptObj = Nothing Comunicarea cu obiectele Word scufundate Se poate utiliza proprietatea Application a oricarui obiect Word pentru a returna obiectul Word Application. Acest lucru este util pentru returnarea obiectului Word Application dintr-un document Word scufundat n alta aplicatie.

103

Urmatorul exemplu, executat din Excel, necesita ca Shapes(1) din foaia activa sa fie un document Word scufundat (obtinut prin InsertObject). Prin exemplu se modifica documentul Word. Dim appWD As Word.Application Set embeddedDoc = ActiveSheet.Shapes(1) Set appWd = embeddedDoc.OLEFormat.Object.Object.Application appWD.ActiveDocument.Range(Start:=0, End:=0).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.Application Set embeddedDoc = Presentations(1).Slides(1).Shapes(1) embeddedDoc.OLEFormat.Activate Set appWD = embeddedDoc.OLEFormat.Object.Application MsgBox appWd.ActiveDocument.Content.Text

104

Controale ActiveX si Dialoguri Proiectarea casetelor de dialog utilizator Crearea unui nou dialog Scrierea procedurilor de raspuns la evenimente Controale Label TextBox ListBox ComboBox CheckBox OptionButton ToggleButton CommandButton TabStrip MultiPage Frame Image Utilizarea dialogurilor utilizator Afisarea unui dialog Obtinerea/editarea proprietatilor n executie Utilizarea controalelor n documente Word, Excel, PowerPoint Controale ActiveX n documente Word Controale ActiveX n foi de calcul Excel Controale ActiveX n diapozitive PowerPoint Controlarea programatica a controalelor din documentele aplicatiilor Proiectele create n Visual Basic for Applications pot fi completate cu o interfata utilizator evoluata, sub forma unor cutii de dialog la nivelul celor existente deja n Microsoft Office. Performantele si aspectul dialogurilor utilizator sunt mbunatatite prin posibilitatea de plasare a unor controale ActiveX (numite anterior controale OLE). Un control ActiveX trebuie gndit ca un obiect caruia i se pot stabili atribute (prin proprietati) si care recunoaste evenimente (este "viu"). Aceste controale, cu proprietati ajustabile, recunosc multiple evenimente. Astfel, prin scrierea procedurilor eveniment, interfata cu utilizatorul proiectului poate fi personalizata si diferentiata corespunzator. Controalele ActiveX pot fi plasate si direct n documentele aplicatiilor: documente Word, foi de calcul Excel, diapozitive PowerPoint. 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 nct 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 att de mare nct sa trebuiasca o denumire speciala) necesita parcurgerea mai multor etape:

105

o o o o

crearea unei forme (form sau UserForm), care constituie suportul pe care sunt adaugate controalele; plasarea controalelor pe forma; stabilirea proprietatilor pentru controale; scrierea procedurilor de raspuns la evenimentele formei si controalelor plasate pe ea.

Atunci cnd 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 o o o o o o

aparenta (Appearence); comportare (Behaviour); font (Font); Diverse (Misc); imagine (Picture); pozitie (Position); defilare (Scrolling).

dupa cum se vizualizeaza alegnd fisa Categorized din fereastra Properties. Proprietatile de aparenta se refera la culorile utilizate, la efectele vizuale de umplere etc. Proprietatile de comportare descriu modul de continuare a actiunilor la parasirea ultimului control de pe forma (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

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 cnd este initializata. Pentru a scrie o procedura eveniment, se deschide fereastra Code prin dublu click pe UserForm sau pe controlul respectiv, selectarea numelui evenimentului n boxa 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 oricnd n dezvoltarea proiectului, procedurile eveniment atasate nu se redenumesc n mod automat. Se recomanda astfel ca denumirile sa fie acordate nainte de scrierea procedurilor respective, n caz contrar orice modificare a numelor trebuie sa fie nsotita de modificarile denumirilor procedurilor. 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, reprezentnd textul afisat. Evenimentul implicit este Click, declansat la actionarea butonului stng mouse pe control.

107

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 cmp dintr-o tabel). Informatia afisata poate fi formatata doar unitar (acelasi font, acelasi stil). Proprietatea implicita este Value, reprezentnd 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, reprezentnd 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, reprezentnd 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

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

Este utilizat, de obicei, pentru prezentarea unor seturi de informatii (ca valori ale unor controale grafice), fiecare grup de informatii apartinnd altei entitati. Prin urmare structura informatiei afisate este ntotdeauna aceeasi, dar se refera la entitati diferite (persoane, fapte etc.). Din punct de vedere grafic, se poate confunda acest control cu MultiPage, diferenta fiind aceea ca la TabStrip zona de afisare (client region) este comuna tuturor fiselor (doar informatia se modifica), pe cnd la MultiPage fiecare fisa (pagina) are o zona proprie, cu controale proprii. Se poate spune ca daca se pastreaza structura informatiei, atunci se va utiliza un control TabStrip, un tab definind purtatorul informatiilor. Daca informatia este structurata n categorii, atunci se poate utiliza controlul MultiPage, fiecare categorie avnd 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, pastrnd 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, permitnd utilizatorului o identificare rapida a controalelor, dar, pentru anumite controale cum ar fi OptionButton, gruparea are efect si n comportarea controalelor din grup. Exemplul de la OptionButton arata un 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, ct de mare etc.).

110

Controlul permite taierea (retezarea) imaginii, dimensionare, mariri, dar nu permite editarea propriu-zisa (care va fi efectuata printr-un program de grafica). Daca se da controlului o dimensiune egala cu cea a formei, atunci Image poate furniza un fundal pe care se pot pozitiona alte controale. Sunt suportate formatele .bmp, .cur, .gif, .ico, .jpg, .wmf de fisiere grafice. Evenimentul implicit este Click. Utilizarea dialogurilor utilizator Pentru a schimba informatii cu utilizatorul proiectului printr-o cutie de dialog utilizator, trebuie ca
o o o

dialogul sa fie afisat, sa se accepte actiunile utilizatorului asupra controalelor din dialog si, la nchiderea dialogului, 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 utiliznd 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 pna cnd 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 cnd pentru un control se dau valori implicite (default), deci valori cu care dialogul sa se afiseze indiferent de actiunile de la alte afisari anterioare. n acest caz, se va adauga codul corespunzator n procedura de eveniment 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 o o

un control TextBox, denumit txtCustomerName, un control ListBox, denumit lstRegions, un control CheckBox, denumit chkSendExpress.

Codul urmator realizeaza initializarea valorilor de pe forma, nct orice aratare a formei se realizeaza n aceeasi configuratie:

111

Private Sub UserForm_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 With End Sub Este de remarcat ca desi n modelele de obiecte Word, Excel si PowerPoint colectiile sunt indexate de la 1, n tablourile si colectiile asociate formelor se foloseste indexarea de la 0. De aici selectarea ultimei intrari (cu numarul de ordine 3) din lista prin instructiunea 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 With End Sub Prin setarea proprietatilor unui control si aplicarea metodelor n timpul executiei, se pot efectua modificari ntrun 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 pna cnd o anumita informatie nu este completata n dialog. Exemplul urmator arata cum accesul la un grup de butoane radio nu este permis dect daca o CheckBox este marcata: Private Sub CheckBox1_Change() With Me ' Me se refera la forma curenta If .CheckBox1.Value = True Then .OptionButton1.Enabled = False .OptionButton2.Enabled = False .OptionButton3.Enabled = False Else .OptionButton1.Enabled = True .OptionButton2.Enabled = True .OptionButton3.Enabled = True End If End With End Sub

112

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.SetFocus End Sub realizeaza trecerea focusului la CheckBox1 atunci cnd 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 cnd se modifica portiunea afisata a formei, vizualiznd (deci dnd acces) controale suplimentare, sau ascunzndu-le (nu mai pot fi accesate, desi nu sunt inhibate). n acest scop se opereaza cu proprietatea 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 120 End Sub

Private Sub OptionButton1_Click () With Me .Height = 300 .Height 'Modificarea butonului radio basculeaza ntre cele doua dimensiuni ale formei End With End Sub Pentru ca exemplul sa functioneze corect se presupune ca forma extinsa la 180 afiseaza si boxa de control. n exemplul urmator se arata cum putem parcurge informatii printr-un obiect TabStrip. Valoarea afisata ntr-o boxa text este modificata dupa indexul tab-ului selectat: Private Sub TabStrip1_Click (ByVal Index As Long) If Index = 0 Then Me.TextBox1.Text = "7710 Park Lane" ElseIf Index = 1 Then Me.TextBox1.Text = "5520 5th Avenue" End If End Sub De amintit ca numerotarea ncepe de la 0 ntr-o colectie de pe o forma. Validarea informatiilor introduse de un utilizator este un alt subiect important n procesarea unui dialog. Pentru efectuarea verificarilor ca utilizatorul a introdus tipul corect de informatii printr-un control, se va testa valoarea atunci cnd controlul pierde focusul sau cnd ntregul dialog este nchis. Evenimentele Enter si Exit pot fi utilizate n acest scop.

113

Enter apare imediat nainte ca un control sa primeasca efectiv focusul de la alt control de pe aceeasi forma. Exit apare imediat nainte ca un control sa piarda focusul n favoarea altui control de pe aceeasi forma. Sintaxa procedurilor eveniment respective este 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 ramne pe controlul curent. Deoarece evenimentul Enter se declanseaza nainte ca focusul sa fie dat unui control, poate fi utilizat pentru afisarea unui text explicativ, de procesare a respectivului obiect. n scrierea procedurii pentru Exit nu trebuie uitata atribuirea valorii True argumentului pentru ca focusul sa ramna 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 "Vrsta trebuie sa fie numerica" Cancel = True End If End Sub Pentru verificarea datelor nainte de nchiderea dialogului, se include codul corespunzator (prin care se pot verifica valorile mai multor controale de pe forma) n aceeasi procedura care descarca (nchide) dialogul. Daca exista erori de completare se va parasi procedura, prin Exit Sub, nainte de executarea instructiunii Unload si se va da focusul primului control eronat. Exemplul urmator se executa la actionarea butonului de comanda, denumit cmdOK, si previne parasirea dialogului prin actionarea acestui buton daca boxa text txtCustAge nu este numerica: Private Sub cmdOK_Click () If Not IsNumeric (txtCustAge.Text) Then MsgBox "Vrsta 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 forma End Sub Este de mentionat ca pentru trecerea valorii n alt modul de cod, variabila custAge trebuie calificata, de exemplu ThisDocument.custAge.

114

La nchiderea unui dialog, toate datele introduse de utilizator se pierd. Returnarea valorilor controalelor dintr-o forma dupa ce forma a fost descarcata conduce la valorile implicite n locul celor introduse/selectate de utilizator. Din acest motiv, informatia necesara trebuie sa fie salvata n variabile de la nivelul modul, naintea descarcarii formei. Exemplul precedent utilizeaza n acest scop variabila custAge, care trebuie sa fie declarata la nivel de modul prin Public custAge As 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 UserForm1 End Sub Pentru a utiliza aceeasi boxa de dialog n mai multe aplicatii (Word, Excel, PowerPoint accepta aceleasi dialoguri). Daca dialogul contine totusi referiri la obiecte specifice unei aplicatii, atunci utilizarea n alta aplicatie nu este lipsita de erori. Pentru reutilizarea dialogurilor proiectate se exporta ca un fisier .frm care poate fi importat n alte aplicatii:

n VBE unde s-a proiectat forma, right-click pe 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. controalelor foi de calcul n Excel sau

Utilizarea documente Word, 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. 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

trece n Slide Show pentru a fi n Run Mode si se revine ntr-o viziune de editare pentru Design Mode. 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 cmpuri 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, lnga datele pe care le controleaza, astfel nct operarea n foaia de calcul sa se efectueze ct mai cursiv si mai pe nteles. Urmatoarele afirmatii puncteaza principalele aspecte ale plasarii controalelor ActiveX pe o foaie de calcul Excel.

n plus fata de proprietatile standard ale controalelor, se pot utiliza pentru controalele dintr-o foaie Excel proprietatile: BottomRightCell, LinkedCell, ListFillRange, Placement, PrintObject, TopLeftCell si ZOrder. La aceste proprietati se ajunge n mod uzual. Urmatorul exemplu arata cum se poate realiza, prin program, o defilare a ferestrei active pna cnd controlul CommandButton1 ajunge n coltul din stnga sus:

Set t = Sheet1.CommandButton1.TopLeftCell With ActiveWindow .ScrollRow = t.Row .ScrollColumn = t.Column

116

End With

Anumite metode si proprietati din Microsoft Excel Visual Basic sunt inhibate atunci cnd un control ActiveX este activat. De exemplu, metoda Sort nu poate fi utilizata cnd un control este activ. n acest caz se va activa n prealabil un alt element de pe foaie, dupa modelul:

Private Sub CommandButton1_Click Range("a1").Activate Range("a1:a10").Sort Key1:=Range("a1") CommandButton1.Activate End Sub Se observa revenirea la activarea butonului de comanda dupa ce s-a efectuat sortarea.

Controalele dintr-un workbook Excel scufundat ntr-un document al altei aplicatii nu vor functiona daca utilizatorul va utiliza dublu click pentru editarea caietului. Controalele vor functiona daca utilizatorul va deschide caietul prin right-click si Open din meniul direct. La salvarea unui workbook Excel 97 n format Microsoft Excel 5.0/95, toata informatia asociata cu controalele ActiveX se pierde. Cuvntul cheie Me dintr-o procedura eveniment a unui control ActiveX de pe o foaie de calcul se refera la foaia de calcul si nu la control.

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. Cuvntul cheie Me dintr-o procedura eveniment a unui control dintr-un slide, se refera la slide. Daca evenimentul este a unui control de pe master, atunci Me se refera la master si nu la slide-ul afisat n momentul cnd s-a declansat evenimentul. Scrierea codului eveniment pentru slide-uri este similara scrierii de cod pentru controalele de pe o forma. Exemplul urmator stabileste culoarea de fundal a diapozitivului pe care se gaseste butonul de comanda:

Private Sub cmdChangeColor_Click() With Me .FollowMasterBackground = Not .FollowMasterBackground .Background.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass End With End Sub

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

Private Sub cmdBack_Click () Me.Parent.SlideShowWindow.View.Previous End Sub Sub cmdForward_Click ()

117

Me.Parent.SlideShowWindow.View.Next End Sub

Pentru a lucra cu toate controalele ActiveX de pe un slide anume fara a afecta celelalte forme desenate (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 If End 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 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. n Excel, controalele ActiveX sunt continute de asemenea n obiectele OLEObject si pot fi programate prin colectia OLEObjects.

118

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 = 200 ActiveDocument.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 = 100 ActiveDocument.Shapes("Control 1").OLEFormat.Object.Text = "Reed"


o

Adaugarea si modificarea unui buton de comanda la un diapozitiv:

ActivePresentation.Slides(1).Shapes.AddOLEObject Left:=100, Top:=100, _ Width:=150, Height:=50, ClassName:="Forms.CommandButton.1" ActivePresentation.Slides(1).Shapes("CommandButton1").Left = 100 ActivePresentation.Slides(1).Shapes("CommandButton1") _ .OLEFormat.Object.Caption = "Run"

119

Obiectele Microsoft Excel Obiectul Application Obiectul Workbook Deschiderea unui Workbook Metoda GetOpenFilename Crearea/salvarea unui Workbook Metoda Add (colectia Workbooks) Metoda SaveAs Metoda Save Metoda GetSaveAsFilename nchiderea unui Workbook Metoda Close Obiectul 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 EachNext Utilizarea instructiunii DoLoop Utilizarea proprietatii Address Evenimentele 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

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 (reprezentnd toate ferestrele deschise n aplicatie), proprietatea Workbooks da colectia Workbooks a tutror caietelor deschise etc. Din aceasta categorie enumeram:
o o o o o o o o

Charts, colectia tuturor foilor de tip chart, Dialogs, colectia tuturor dialogurilor predefinite n mediul Excel, Names, colectia tutror numelor create n caietul activ, RecentFiles, colectia fisierelor utilizate recent (dupa lista din meniul File), Sheets, colectia tutror foilor deschise n caietul activ, Windows, Workbooks, 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 cnd 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").Value End Sub

121

Este de remarcat ca obiectul Workbook returnat de metoda se refera la caietul deschis, care ramne activ. Asupra utilizarii utilizarii sau nu a caii pe care se gaseste fisierul se vor reciti cele spuse la deschiderea documentelor Word. Exista doua foldere remarcabile pentru care se poate obtine n mod automat calea: folderul cu fisierele Excel executabile si folderul Library (creat automat la instalarea aplicatiei). Obtinerea acestor cai se realizeaza prin proprietatile Path si LibraryPath ale obiectului Application). Astfel EXEPath = Application.Path & Application.PathSeparator LibPath = Application.LibraryPath & Application.PathSeparator returneaza, respectiv, calea catre fisierele executabile Excel si calea catre fisierele de biblioteca. O cale returnata se termina cu separatorul adecvat sistemului pe care se executa aplicatia, astfel nct codul este independent de platforma Windows sau Macintosh). 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 specificnd criteriile de filtrare a fisierelor listate n dialog. Sirul consta n perechi formate din sirul de filtrare si din specificarea filtrului n format MS-DOS, toate elementele fiind separate prin virgule. n partea rezervata, doua filtre MS-DOS sunt separate prin ";". Exemple: "Text Files (*.txt),*.txt,Add-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

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 cnd 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 cnd utilizatorul anuleaza boxa (prin Cancel), se returneaza False. Metoda poate schimba att folderul curent ct 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

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

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:=fName End Sub nchiderea unui Workbook Pentru a nchide un workbook, se va aplica metoda Close a obiectului Workbook. nchiderea poate avea loc cu sau 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

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:=False End 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 att o singura celula ct si o multime de celule. Nu exista un obiect colectie pentru Range, asa ca un obiect Range poate fi gndit fie ca un obiect, fie ca o colectie, dupa situatie. Exista foarte multe proprietati si metode care returneaza un obiect Range: ActiveCell BottomRightCell Cells ChangingCells DirectDependents RowFields DirectPrecedents EntireColumn EntireRow RowRange Rows Selection TableRange1 TableRange2 TopLeftCell UsedRange VisibleRange

CircularReference Next Columns CurrentArray CurrentRegion Dependents Offset PageRange Precedents Range

Pentru specificarea exacta a acestor proprietati si metode se vor cauta subiectele respective n Help. n continuare sunt mentionate, mai mult prin exemple, moduri de lucru cu obiecte Range.

126

Referinte 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 = "=510*RAND()"

inserarea aceleeasi valori ntr-un ntreg domeniu de celule:

Range("C1:E3").Value = 6

stergerea continutului unor celule:

Range("A1","E3").ClearContents

Stabilirea stilului bold pentru un domeniu numit (la nivel de workbook):

Range("myRange").Font.Bold = True

Atribuirea aceleeasi valori fiecarei celule dintr-un domeniu numit (la nivel de foaie):

Range("Sheet1!yourRange").Value = 3

Setarea unei variabile obiect la un domeniu:

Set objRange = Range("myRange") Este de mentionat ca expresiile care nu sunt calificate se refera la foaia curenta, deci multe din exemplele de mai sus nu ar opera daca foaia curenta este o foaie de tip chart. O cauza frecventa de erori este utilizarea proprietatii Range ca argument al altei metode fara calificarea completa a obiectului Worksheet caruia i se aplica Range. Exemplul urmator Sub SortRange() Worksheets("Sheet1").Range("A1:B10").Sort _ Key1:=Range("A1"), Order1:=xlDescending End Sub nu va functiona corect dect daca Sheet1 este foaia activa, altminteri calificarea argumentului Key1 nu este completa. Pentru o executie independenta de context ar trebui folosit Key1:=Worksheets("Sheet1").Range("A1") Utilizarea indicilor de linii si coloane O celula specifica poate fi returnata utiliznd indicii numerici de linie si coloana pentru celula referita.

127

Pentru a da o valoare celulei A1 se poate utiliza:

Worksheets("Sheet1").Cells(1,1).Value = 3

Pentru a insera o formula n celula B1 din foaia activa:

Cells(1,2).Formula = "=510*RAND()"

Pentru a fixa o variabila obiect la domeniul format din celula A1

Set objRange = Worksheets("Sheet1").Cells(1,1) Referintele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instructiuni de ciclare. Exemplul urmator anuleaza toate celulele din domeniul A1:D10, cu o valoare mai mica dect 0.01: Sub RoundToZero() For rwIndex = 1 to 10 For colIndex = 1 to 4 If Worksheets("Sheet1").Cells(rwIndex,colIndex) < 0.01 Then Worksheets("Sheet1").Cells(rwIndex,colIndex).Value = 0 End If Next colIndez Next rwIndex End Sub n exemplul 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").AutoFit End Sub Utilizarea proprietatii Offset Atunci cnd este necesara referirea la un domeniu prin deplasari relative la alt domeniu de celule, se poate utiliza proprietatea Offset, a obiectului Range, care n argumentele RowOffset si ColumnOffset arata deplasarea fata de obiectul Range curent. Este returnat un nou obiect Range. Exemplul urmator determina cteva tipuri de date din celulele domeniului A1:A10, tipurile determinate fiind nscrise, ca text, n celula corespunzatoare din dreapta, B1:B10. Sub ScanColumn () For Each c 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

c.Offset(0,1).Value = "Boolean" ElseIf Application.IsError (c.Value) Then c.Offset(0,1).Value = "Error" ElseIf c.Value = "" Then c.Offset(0,1).Value = "(blank cell)" End If Next c End Sub Utilizarea proprietatilor CurrentRegion si UsedRange Aceste doua proprietati, explicate n continuare, sunt utile atunci cnd nu se stie de la nceput ct de mare este domeniul pe care se opereaza. Prin regiunea curenta se ntelege un domeniu dreptunghiular de celule, limitat de linii si coloane goale, eventual de marginile foii de calcul si de linii si coloane goale. Proprietatea 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, reflectnd 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 stnga sus si cel mai la dreapta jos ntr-o foaie de calcul. Un asemenea domeniu contine toate celule nevide din foaie, ca si celule vide interpuse pna la completarea unui domeniu dreptunghiular si este unic pe o foaie de calcul. Este natural ca proprietatea 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

dateCol.AutoFit End Sub Exista si alte proprietati si metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range. Printre acestea enumeram: Areas, 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 r End Sub Pentru ca operatiunea anterioara sa aiba loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox, specificndu-i utilizatorului sa selecteze un domeniu de celule. Metoda returneaza un obiect Range care reprezinta selectia. Codul este completat cu instructiuni de tratare a erorilor uzuale. Sub RoundToZero () Worksheets("Sheet1").Activate On Error GoTo PressedCancel Set r = Application.InputBox( _ Prompt:="Select a range of cells", _ Type:=8) On Error GoTo 0 For Each c In r.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 End If Next c Exit Sub PressedCancel: Resume End Sub 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

Urmatoarele doua exemple arata cum se poate ascunde fiecare a doua coloana din domeniul utilizat n Sheet1. Primul exemplu, utiliznd For EachNext Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange For Each col In r.Columns If col.Column Mod 2 = 0 Then col.Hidden = True End If Next col End Sub Al doilea exemplu, utiliznd ForNext: Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True End If Next i End Sub Utilizarea instructiunii DoLoop Atunci cnd procesarea unui domeniu modifica domeniul (de exemplu prin stergerea unor linii/coloane), utilizarea instructiunii For EachNext nu produce cele mai bune rezultate. Solutia este atunci utilizarea instructiunii DoLoop. 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 Loop End Sub Este de notat ca structura repetitiva poate fi nlocuita prin Do While currentCell.Value <> "" ' instructiunile de eliminare a liniilor cheilor duplicate Loop 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

Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange MsgBox r.Address ' doar pentru depanare For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True MsgBox r.Columns(i).Address ' doar pentru depanare End If Next i End Sub 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 utiliznd cuvntul 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 cnd nu se doreste executarea procedurii de raspuns, acest lucru este controlat prin inhibarea evenimentului, cu efectul nerecunoasterii evenimentului de catre sistem si, drept urmare, neexecutarea procedurii asociate. Proprietatea EnableEvents, a obiectului Application, poate primi valoarea True sau False dupa cum evenimentele sunt permise sau inhibate. Urmatorul exemplu executa salvarea caietului fara producerea evenimentului BeforeSave: Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True 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

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 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 Activate Descriere Apare atunci cnd utilizatorul activeaza foaia. Acest eveniment se va utiliza n locul proprietatii OnSheetActivate Apare atunci cnd utilizatorul executa un dublu click ntr-o celula a foii. Se va utiliza n locul proprietatii OnDoubleClick. Apare atunci cnd utilizatorul executa un click dreapta ntr-o celula a foii. Apare cnd utilizatorul recalculeaza foaia. Acest eveniment se va utiliza n locul proprietatii OnCalculate. Apare atunci cnd utilizatorul schimba o formula dintr-o celula. Se va utiliza n locul proprietatii OnEntry. Apare atunci cnd foaia este activa si utilizatorul activeaza o alta foaie. Nu apare atunci cnd utilizatorul muta focusul de la o fereastra la alta fereastra a aceleeasi foi. Acest eveniment se va utiliza n locul proprietatii OnSheetDeactivate. Apare atunci cnd utilizatorul selecteaza o celula din foaie.

BeforeDoubleClick

BeforeRightClick Calculate

Change

Deactivate

SelectionChange

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").AutoFit End Sub Este de remarcat ca modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea evenimentelor".

133

Evenimentele obiectului Chart Declansate atunci cnd utilizatorul activeaza sau modifica o diagrama, evenimentele recunoscute de obiectul Chart sunt prezentate n tabelul urmator. Eveniment Activate Descriere Apare atunci cnd utilizatorul activeaza foaia diagrama (nu apare la diagramele scufundate). Acest eveniment se va utiliza n locul proprietatii OnSheetActivate Apare atunci cnd utilizatorul executa un dublu click pe diagrama. Se va utiliza n locul proprietatii OnDoubleClick. Apare atunci cnd utilizatorul executa un click dreapta pe diagrama. Apare cnd utilizatorul reprezinta n diagrama date noi sau modificate. Apare atunci cnd foaia este activa si utilizatorul activeaza o alta foaie. Nu apare atunci cnd utilizatorul muta focusul de la o fereastra la alta fereastra a aceleeasi foi. Acest eveniment se va utiliza n locul proprietatii OnSheetDeactivate. Apare atunci cnd utilizatorul dragheaza date peste diagrama. Apare atunci cnd utilizatorul dragheaza un domeniu de celule peste diagrama. Apare atunci cnd utilizatorul executa un click cu un buton al mouse-ului n timp ce pointerul acestuia este pozitionat pe diagrama. Apare la miscarea pointerului mouse-ului peste diagrama. Apare atunci cnd utilizatorul elibereaza un buton al mouse-ului n timp ce pointerul acestuia este pozitionat pe diagrama. Apare la redimensionarea diagramei. Apare la selectarea unui element al diagramei. Apare atunci cnd utilizatorul modifica valoarea unei punct de pe diagrama.

BeforeDoubleClick

BeforeRightClick Calculate Deactivate

DragOver DragPlot MouseDown

MouseMove MouseUp

Resize Select SeriesChanges

134

Evenimentele foilor de diagrame sunt permise n mod implicit. Pentru a scrie proceduri de eveniment pentru diagramele scufundate, trebuie sa se creeze un nou obiect utiliznd WithEvents ntr-un modul de clasa. Exemplu Se schimba culoarea chenarului unui punct atunci cnd 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 = 3 End Sub Evenimentele obiectului Workbook Aceste evenimente se declanseaza atunci cnd utilizatorul schimba un caiet sau orice foaie din caietul respectiv. Eveniment Activate AddInInstall Descriere Apare atunci caietul. cnd utilizatorul activeaza

Apare atunci cnd utilizatorul instaleaza caietul ca un add-in. Se va utiliza n locul macro-ului Auto_Add. Apare atunci cnd utilizatorul dezinstaleaza caietul ca un add-in. Se va utiliza n locul macro-ului Auto_Remove. Apare naintea nchiderii caietului. Se va utiliza n locul macro-ului Auto_Close. Apare naintea tiparirii caietului. Apare nainte ca utilizatorul sa salveze foaia. Acest eveniment se va utiliza n locul proprietatii OnSave. Apare atunci cnd caietul este activ si utilizatorul activeaza un alt caiet. Apare dupa ce utilizatorul creeaza o noua foaie. Apare la deschiderea caietului. Evenimentul se va utiliza n locul macroului Auto_Open. Apare la activarea unei foi din caiet. Se va utiliza n locul proprietatii OnSheetActivate. Apare la dublu click pe o celula (nu este

AddInUninstall

BeforeClose BeforePrint BeforeSave

Deactivate NewSheet Open SheetActivate SheetBeforeDoubleClick

135

utilizat cu foile diagrama). Se va utiliza n locul proprietatii OnDoubleClick. SheetBeforeRightClick SheetCalculate Apare la click dreapta pe o celula a unei foi din caiet (nu este utilizat cu foile diagrama). Apare la recalcularea unei foi (nu este utilizata cu foile diagrama). Se utilizeaza n locul proprietatii OnCalculate. Apare la modificarea formulei dintr-o celula (nu este utilizata cu foile diagrama). Se utilizeaza n locul proprietatii OnEntry. Apare la activarea altei foi din caiet. Se utilizeaza n locul proprietatii OnSheetDeactivate. Apare la modificarea selectiei dintr-o foaie de calcul (nu functioneaza cu foile diagrama). Apare atunci cnd utilizatorul muta focusul pe orice fereastra a caietului. Se utilizeaza n locul proprietatii OnWindow. Apare atunci cnd utilizatorul muta focusul n afara oricarei fereastre a caietului. Se utilizeaza n locul proprietatii OnWindow. Apare atunci cnd utilizatorul deschide, redimensioneaza, maximizeaza sau minimizeaza orice fereastra a caietului.

SheetChange

SheetDeactivate

SheetSelectionChange WindowActivate

WindowDeactivate

WindowResize

Pentru explicatii se vor studia intrarile corespunzatoare din Help. Exemplu Deschiderea caietului maximizeaza fereastra aplicatiei Excel: Sub Workbook_Open () Application.WindowState = xlMaximized End Sub Evenimentele obiectului Application Aceste evenimente se declanseaza la crearea/deschiderea unui caiet sau atunci cnd este modificata orice foaie din orice caiet deschis. Eveniment (pentru Application) Descriere

136

NewWorkbook SheetActivate

Apare la crearea unui nou caiet. Apare atunci cnd utilizatorul activeaza o foaie dintr-un caiet deschis. Se va utiliza n locul proprietatii OnSheetActivate. Apare la dublu click pe o celula dintr-un caiet deschis (nu este utilizat cu foile diagrama). Se va utiliza n locul proprietatii OnDoubleClick. Apare la click dreapta pe o celula a unei foi dintr-un caiet deschis (nu este utilizat cu foile diagrama). Apare la recalcularea unei foi (nu este utilizata cu foile diagrama). Se utilizeaza n locul proprietatii OnCalculate. Apare la modificarea formulei dintr-o celula (nu este utilizata cu foile diagrama). Se utilizeaza n locul proprietatii OnEntry. Apare la activarea altei foi dintr-un caiet. Se utilizeaza n locul proprietatii OnSheetDeactivate. Apare la modificarea selectiei dintr-o foaie de calcul (nu functioneaza cu foile diagrama). Apare atunci cnd utilizatorul muta focusul pe orice fereastra deschisa n aplicatie. Se utilizeaza n locul proprietatii OnWindow. Apare atunci cnd utilizatorul muta focusul n afara oricarei fereastre a aplicatiei. Se utilizeaza n locul proprietatii OnWindow. Apare atunci redimensioneaza, minimizeaza orice aplicatie. cnd utilizatorul maximizeaza sau fereastra deschisa n

SheetBeforeDoubleClick

SheetBeforeRightClick

SheetCalculate

SheetChange

SheetDeactivate

SheetSelectionChange WindowActivate

WindowDeactivate

WindowResize

WorkbookActivate WorkbookAddInInstall WorkbookAddInUninstall WorkbookBeforeClose

Apare atunci cnd se muta focusul pe un caiet deschis Apare la instalarea unui workbook ca un addin. Apare la dezinstalarea unui workbook ca un add-in. Apare nainte ca un caiet deschis sa fie nchis.

137

WorkbookBeforePrint WorkbookBeforeSave WorkbookDeactivate WorkbookNewSheet WorkbookOpen

Apare nainte ca un caiet deschis sa fie tiparit. Apare nainte ca un caiet deschis sa fie salvat. Apare atunci cnd utilizatorul muta focusul n afara unui caiet deschis. Apare la adaugarea unei noi foi la un caiet deschis. Apare atunci cnd 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 = Application End Sub

Dupa executarea procedurii de initializare, obiectul App din modulul EventClass puncteaza catre obiectul Application Microsoft Excel si procedurile eveniment din modulul clasa vor fi executate la declansarea evenimentelor.

Desi procedura poate parea laborioasa, ideea poate fi utilizata pentru ca aceleasi proceduri eveniment sa fie asociate mai multor obiecte. Sa presupunem ca am efectuat etapele precedente pentru un obiect diagrama. S-a utilizat astfel declaratia Public WithEvents cht As Chart

138

n etapa 2 si codul urmator Dim C1 As New EventClass Dim C2 As New EventClass Sub InitializeCharts () Set C1.cht = Worksheets (1).ChartObjects(1).Chart Set C2.cht = Worksheets (1).ChartObjects(2).Chart End Sub pentru initializare. Aceeasi tehnica se poate utiliza si pentru obiectele Worksheet si Workbook pentru a utiliza evenimentele noii clase cu mai multe foi de calcul, n plus fata de evenimentele implicite.

139

Obiectele Microsoft Access Obiectele accesibile n Microsoft Access Obiectele Microsoft Access Obiectul Application Utilizarea obiectului Application n automatizare Colectia 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 executiei Colectia Reports Referirea obiectelor Report Module asociate rapoartelor Crearea rapoartelor n timpul executiei Functiile CreateForm, CreateReport Functiile CreateControl, CreateReportControl Exemplu de creare a unui raport Colectia 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 Controls Colectia 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 clasa Colectia References Referirea obiectelor Reference Proprietatile obiectului Reference Metodele colectiei References Stabilirea unei referinte n Visual Basic Obiectul DoCmd Metoda OpenForm Metoda RunCommand Obiectul Screen Proprietatile obiectului Screen

140

O baza de date Microsoft Access este alcatuita din diferite tipuri de obiecte. Unel sunt utilizate pentru a afisa date din baza, altele pentru memorarea si gestionarea datelor iar altele ca ajutor n programare. Unele obiecte sunt furnizate de Access, altele sunt oferite de diferite componente. n continuare se discuta doar obiectele din Access: forme, rapoarte, controale si module. 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 efectundu-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 o

Microsoft Access 8.0. Aici sunt obiectele prezentate n acest capitol (Form, Module, Application etc.). 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. 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 Application Form Forms Report Reports Control Descriere Reprezinta (obiect) aplicatia Microsoft Access

Reprezinta o forma deschisa (obiect) Contine toate formele deschise. (colectie) Reprezinta un raport deschis (obiect) Contine toate rapoartele curente deschise (colectie) Reprezinta un control pe o forma, raport sau sectiune sau din alt control (obiect)

141

Controls Module Modules Reference References DoCmd Screen

Contine toate controalele de pe o forma sau raport (colectie) Reprezinta un modul standard sau un modul clasa (obiect) Contine toate modulele deschise curent (colectie) Reprezinta o referinta la o biblioteca de obiecte (obiect) Reprezinta toate referintele stabilite n mod curent (colectie) Reprezinta o actiune macro din Visual Basic (obiect) 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, continnd toate celelalte obiecte si colectii. Obiectul Application este obiectul implicit din ierarhia de obiecte. Drept urmare, atunci cnd se lucreaza din interiorul aplicatiei Access, nu este necesara referirea lui explicita cnd se utilizeaza una dintre proprietatile sau metodele sale, sau cnd se scrie o referinta la un obiect sau o colectie inclusa. Referirea explicita nu produce, totusi, erori. Specificare obiectului Application este necesara doar atunci cnd, prin procedeul de automatizare, se lucreaza cu obiecte din ierarhia Access n interiorul altei aplicatii. Utilizarea obiectului Application n automatizare Atunci cnd se lucreaza cu obiectele Access din alte aplicatii, cum ar fi Excel sau Visual Basic, trebuie sa se introduca o referinta la biblioteca de obiecte si orice referire la un obiect Access trebuie sa nceapa cu Application, care permite intrarea n ierarhie. Automatizarea trebuie sa nceapa cu etapele:
o o o

stabilirea, aplicatia gazda, a unei referinte la biblioteca de obiecte Microsoft Access declararea unei variabile obiect care sa reprezinte obiectul Application Microsoft Access returnarea unei referinte la obiectul Application su asignarea acestei referinte la variabila obiect.

142

n Visual Basic Editor, aceste etape se realizeaza prin:


o

deschiderea unui modul, comanda References din 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. 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 o

unde numarul versiunii poate lipsi daca exista o singura versiune instalata de Access. 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 pna cnd nu se lucreaza programatic cu variabila obiect, de exemplu

appAccess.NewCurrentDatabase "NewDb.mdb" Dupa parcurgerea etapelor descrise, se poate utiliza variabila obiect creata pentru accesul la ierarhia de obiecte Access. Urmatorul exemplu, care lucreaza din Excel pe baza de date standard (furnizata de Microsoft Office si utilizata frecvent pentru exemplificari) Northwind, deschide o forma si lucreaza cu ea. Pentru a vedea functionarea exemplului se va deschide Excel, se va trece codul ntr-un modul si apoi se va executa.

Sub OpenNorthwindEmployees () Dim appAccess As New Access.Application Const conPath As String = "C:\Program Files\Microsoft Office\Office" _ & "\Samples\Northwind.mdb" With appAccess ' Deschide baza de date .OpenCurrentDatabase conPath ' Deschide forma Employees .DoCmd.OpenForm "Employees" ' Stabileste captarea formei .Forms!Employees.Caption = "Northwind Employees" End With End Sub Prin automatizare se poate lucra cu DAO prin stabilirea prealabila a unei referinte la biblioteca de obiecte Microsoft DAO 3.5 si utilizarea apoi a proprietatii DBEngine a obiectului Application Microsoft Access pentru returnarea unei referinte la obiectul DBEngine DAO. Prin acest din urma obiect se obtine acces la toata ierahia de obiect DAO.

143

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 colectia Form (obiect) sau Este continut(a) n Forms Contine Colectia Controls Colectia Properties Obiectul Module Forms (colectie) 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 obtinndu-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 Form Set frm = Forms!Employees sau prin notatia cu paranteze, n cazul n care numele este cunoscut doar la momentul executiei, ca n exemplul urmator: Function SetFormCaption (strFormName As String) Dim frm As Form ' Se deschide forma DoCmd.OpenForm strFormName ' Se returneaza o referinta la obiectul Form Set frm = Forms(strFormName) ' Se schimba captarea formei frm.Caption = Date End Function Referinta prin indice este de genul Forms(1), indexarea colectiei Forms ncepnd cu 0 (zero). n acest mod de referire trebuie sa se lucreze cu grija deoarece numerotarea se reface la orice nchidere a unei forme, prin urmare o forma anumita poate avea indici diferiti n momente diferite de executie. Application Obiecte Form

144

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 cteva, 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 formei Private 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 cnd se lucreaza cu o forma Access din alta aplicatie, prin automatizare, nu se poate utiliza Me pentru a referi forma din aplicatia gazda. Proprietatea 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 0 1 2 3 4 Nume acDetail acHeader acFooter acPageHeader acPageFooter Semnificatie Form detail Form header Form footer Form page header Form page footer

145

Un numar de proprietati se aplica mai degraba unei sectiuni dintr-o forma dect 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 ctl End 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 EachNext. 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 prp End 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

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

click Code de pe meniul View cnd forma este n modul de vizualizare Design. Modulul este creat si salvat mpreuna cu forma chiar daca nu contine code. 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. Referirea la proprietatea Module a formei din Visual Basic. Proprietatea returneaza o referinta la obiectul Module asociat formei, crend mai nti modulul daca el nu exista.

n lucrul cu module asociate, trebuie retinut ca o forma fara modul asociat se deschide mai repede. Prin urmare nu se vor crea module daca nu exista necesitatea scrierii de cod pentru forma. Eliminarea modulelor inutile reduce si dimensiunea bazelor de date. Un modul de forma contine toate procedurile eveniment definite pentru forma, ca si alte proceduri specifice formei. De notat ca o procedura care se acceseaza din multiple locuri ale bazei de date trebuie plasata ntr-un modul standard. 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

Resume Exit_CreateFormWithCode End 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 colectia Report (obiect) sau Este continut(a) n Reports Contine 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 Report Set rpt = Reports!Invoice ' referinta prin nume cunoscut Set rpt = Reports("Invoice") ' referinta prin sirul care contine numele Set 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 pna cnd nu este referit:
o o

click Code de pe meniul View cnd raportul este n modul de vizualizare Design. Modulul este creat si salvat cu raportul chiar daca nu contine code. 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. Referirea, din Visual Basic, la proprietatea Module a raportului. Proprietatea returneaza o referinta la obiectul Module asociat raportului, crend mai nti modulul daca el nu exista.

Crearea rapoartelor n timpul executiei (run time)

148

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. Att forma ct 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 identificnd sectiunea. Poate fi o constanta dintre Constanta acDetail acHeader Semnificatia (Default) Detail section Form or report header

149

acFooter acPageHeader acPageFooter acGroupLevel1Header acGroupLevel1Footer acGroupLevel2Header acGroupLevel2Footer

Form or report footer Page header Page footer Group-level 1 header (reports only) Group-level 1 footer (reports only) Group-level 2 header (reports only) Group-level 2 footer (reports only)

Pentru grupuri suplimentare ntr-un raport, perechile header/footer sunt numerotate consecutiv ncepnd cu 9 parent este un sir care identifica controlul parinte. Pentru controalele care nu sunt copii se utilizeaza sirul vid sau se omite argumentul. columnname numele cmpului unde este legat controlul, daca este un control legat de date. Daca nu este cazul, se utilizeaza sirul vid. left, top sunt expresii numerice ale coordonatelor relative la coltul din stnga sus, n twips. width, height sunt expresii numerice indicnd 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 cmp de date sunt text box, list box, combo box, option group si bound object frame. n plus, controalele toggle button, option button si check box pot fi legate de un cmp daca nu sunt continute ntr-un grup de optiuni (option group). La legarea unui cmp, proprietatile controlului sunt modificate automat pentru a se conforma proprietatilor corespunzatoare ale cmpului. Pentru a nlatura un control se vor utiliza instructiunile DeleteControl si DeleteReportControl cu sintaxa DeleteControl formname, controlname DeleteReportControl reportname, controlname Semnificatia argumentelor este evidenta. Exemplu de creare a unui raport

150

Folosind automatizarea din Excel, exemplul creeaza o tabela legata ntr-o baza de date Access si realizeaza un raport pe baza datelor din tabele legata. Pentru utilizarea exemplului trebuie sa se creeze un caiet Excel cu numele Revenue.xls, sa se completeze datele ntr-o foaie a caietului si sa se denumeasca un domeniu DataRange care include datele. Dupa aceea, se va trece codul urmator ntr-un modul din caiet. n proiectul Excel se vor stabili referinte la bibliotecile de obiecte Microsoft Access 8.0 si DAO 3.5. Este esential ca, naintea executiei codului, sa fie instalat n sistem driver-ul Microsoft Excel 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 modulului Dim appAccess As New Access.Application Sub PrintReport () Dim rpt As Access.Report, ctl As Access.TextBox Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field Dim strDB As String, intLeft As Integer ' se 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 cmp 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

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 colectia sau Este continut(a) n Controls Contine Colectia Controls cnd 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. Exista doua tipuri de controale:
o o

Control (obiect)

Obiecte Control

preconstruite, n biblioteca de obiecte Microsoft Access 8.0, accesibile printr-o cutie de unelte, 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 BoundObjectFrame CheckBox Descriere Afiseaza o imagine, diagrama sau obiect OLE memorat ntr-o tabela Access. Indica selectarea unei optiuni

152

ComboBox CommandButton Image Label Line ListBox ObjectFrame OptionButton OptionGroup Page PageBreak Rectangle SubForm/SubReport TabControl TextBox ToggleButton

Combina lista ascunsa si o caseta text. Un buton cu rol de pornire a unei operatiuni atunci cnd se efectueaza click pe el. Afiseaza o imagine. Afiseaza un text explicativ. Afiseaza o diagonala linie orizontala, verticala sau

Afiseaza o lista de valori. Afiseaza o imagine, diagrama sau obiect OLE care nu este memorat ntr-o tabela. Indica daca o optiune este selectata (buton radio). Afiseaza un set de optiuni. Afiseaza controale pe o pagina a unui control tab. Marcheaza nceputul unui nou ecran sau a unei pagini tiparite. Afiseaza un dreptunghi. Afiseaza o forma n interiorul altei forme sau un raport n interiorul altui raport. Afiseaza pagini multiple, fiecare continnd o multime de controale. Afiseaza date de tip text. 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

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 Employees Set txt = Me!LastName ' similar exemplului precedent, dar referinta este ' n forma care se executa curent Set txt = Me![Last Name] 'daca numele contine spatii Set ctl = Me.Controls(0) ' prin indice, bazat pe zero Set ctl = Me.Controls("LastName") Proprietatile obiectului Control Datorita marii varietati de controale, proprietatile sunt foarte numeroase (de exemplu Text Box Control are peste 50 de proprietati) nct aici se discuta doar doua care merita o atentie speciala. Proprietatea 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 cnd 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

Exit Function Error_ FollowControlHyperlink: If Err = conNoHyperlink Then FollowControlHyperlink = False End If Resume Exit_ FollowControlHyperlink End 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 acCommandButton acBoundObjectFrame acSubform acCustomControl acRectangle acOptionButton acTextBox acObjectFrame acToggleButton AcLine AcCheckBox AcListBox AcPage AcTabCtl acImage acOptionGroup acComboBox acPageBreak

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_ LockTextControls End Function

155

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 cmpului tabelei, interogarii sau instructiunii SQL din care se iau datele afisate de control. Este de notat ca mai nainte de stabilirea acestei proprietati trebuie sa se fixeze proprietatea 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 rndul lor, o colectie Controls care poate contine mai multe controale. Colectie Controls apartinnd unui grup de optiuni contine controale de tip options button, check box, toggle button sau label. Controlul Tab contine o colectie Pages reprezentnd 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 reprezentnd 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

Obiectul colectia Module (obiect)

sau Este continut(a) n Colectia Modules Obiecte Form Obiecte Report

Contine (Nimic)

Modules (colectie) Referirea la obiecte Module

Obiectul Application

Obiecte Module

Accesul la un modul se obtine prin intermediul colectiei, n mod uzual. Astfel Dim mdl As Module Set mdl = Modules![ Utility Functions] ' returneaza o referinta 'la modulul cu numele dat Set mdl = Modules(" Utility Functions") ' - idemSet 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 cteva notiuni prezentate n capitolele introductive. Microsoft Access contine doua tipuri de module: module standard (standard modules) si module de clasa (class modules). Ambele tipuri sunt disponibile n tab-ul 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 oricte 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

Proprietatea Application

Descriere

Observatii

Returneaza o referinta la Permite obtinerea accesului obiectul Application. la ierarhia de obiecte Access. Returneaza numarul de Long, numaratoarea ncepe linii de cod din sectiunea cu 1 Declarations a modulului. Returneaza numarul de Long, numaratoarea ncepe linii de cod din modul cu 1 Returneaza textul object.Lines(line, numlines) continut n liniile de cod specificate Da numele modulului Returneaza o referinta la obiectul sau colectia care contine modulul Returneaza numarul liniei object.ProcBodyLine( _ la care ncepe definirea procname, prockind) procedurii Returneaza numarul de object.ProcCountLines( _ linii dintr-o procedura procname, prockind) Returneaza numele object.ProcOfLine( _ procedurii care contine o linie specificata line, pprockind) Returneaza numarul liniei object.ProcStartLine( _ la care ncepe o procedura procname, prockind) Indica tipul modulului AcStandardModule sau 0, acClassModule sau 1.

CountOfDeclarationLines

CountOfLines Lines

Name Parent

ProcBodyLine

ProcCountLines ProcOfLine

ProcStartLine

Type

Determinarea numarului de linii dintr-un modul Liniile unui modul sunt numarate ncepnd 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

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

ProcLineInfo = False Resume Exit_ProcLineInfo End 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 AddFromFile AddFromString CreateEventProc DeleteLines Find InsertLines ReplaceLines Descriere Adauga la modul continutul unui fisier text. Adauga modulului continutul unui sir de caractere. Creeaza o procedura eveniment ntr-un modul clasa. Elimina din modul liniile specificate. Gaseste, ntr-un modul, textul specificat. Insereaza o linie sau un grup de linii de cod la o pozitie specificata din modul. 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

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.Save End 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 cnd se elimina un obiect utilizator din memorie.

161

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 corespunznd 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 colectia sau Este continut(a) n References Application Contine (nimic) Obiecte Reference

Reference (obiect) References (colectie) 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 Reference Set ref = References!VBA Set 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 BuiltIn Descriere Indica daca referinta este implicita, necesara bunei functionari a aplicatiei Microsoft Access. Returneaza o References. referinta la colectia

Collection FullPath

Returneaza calea si numele de fisier al proiectului referit sau al bibliotecii de obiecte.

162

GUID

Returneaza identificatorul global unic (GUID Globally Unique Identifier) al proiectului referit sau al bibliotecii de obiecte. Un GUID este memorat n registryul Windows. Indica daca referinta puncteaza catre o referinta valida. Indica daca obiectul Reference puncteaza la un proiect Visual Basic (valoarea Project sau 1) sau la o biblioteca (TypeLib sau 0). Returneaza valoarea din stnga punctului zecimal din numarul de versiune al fisierului referit. Returneaza valoarea din dreapta punctului zecimal din numarul de versiune al fisierului referit. Returneaza numele proiectului sau al bibliotecii de obiecte catre care duce referinta.

IsBroken Kind

Major

Minor

Name

Metodele colectiei References Obiectul Reference nu are asociate metode. Metodele colectiei References sunt Metoda AddFromFile Descriere 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 Remove Returneaza un element colectiei References. particular al

Elimina un obiecte Reference din colectia References.

Stabilirea unei referinte n Visual Basic

163

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 = 32813 On Error GoTo Error_AddReference ' Adauga o referinta la un proiect sau biblioteca de obiecte Set ref = References.AddFromFile(strFilePath) AddReference = True Exit_AddReference: Exit Function Error_AddReference: If Err <> conReferenceExists Then MsgBox Err & ": " & Err.Description End If AddReference = False Resume Exit_AddReference End Function Apelul acestei functii poate fi efectuat dupa modelul Sub SetSolutionsReferences () Const strRefPath As String = "C:\Program Files\Microsoft Office" _ & "\Office\Samples\Solutions.mdb" If AddReference (strRefPath) = True Then MsgBox "Reference set successfully." Else MsgBox "Reference not set successfully." End If End Sub Obiectul DoCmd Metodele obiectului DoCmd sunt utilizate pentru a executa actiuni (macro-uri) Microsoft Access din Visual Basic. De altfel, aceasta este singura utilitate a obiectului DoCmd, acesta neavnd proprietati si evenimente. Sintaxa este [application.]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

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, excepnd 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 att subiectul privind metoda ct 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[, [, windowmode][, openargs] unde formname este un sir cu numele valid al unei forme din baza de date curenta. Daca se executa codul nre-o biblioteca, forma se va cauta mai nti n baza de date biblioteca si apoi n baza curenta. 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 cuvntul 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 view][, filtername][, wherecondition][, datamode]

165

unde object este Application sau DoCmd, optional. command este o constanta intrinseca specificnd comanda care se executa. Lista tuturor constantelor admise ca argument de comanda se poate vedea n Help (intrarea RunCommand Method Constants) sau n Object Browser (Access n lista Project/Library, AcCommand n lista Classes). Meniurile si barele de unelte construite de utilizator nu pot fi accesate prin metoda 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 cnd nu exista nici o forma activa, raport sau control, produce o eroare de executie. Proprietatile obiectului Screen Tabelul urmator contine proprietatile obiectului Screen. Proprietatea ActiveControl ActiveDatasheet ActiveForm ActiveReport Application MousePointer Parent PreviousControl Descriere Returneaza o referinta la controlul care are focusul. Returneaza o referinta la foaia de date care are focusul. Returneaza o referinta la forma care are focusul. Returneaza o referinta la raportul care are focusul Returneaza o referinta la obiectul Application. Stabileste sau ntoarce valoarea tipului de pointer al mouse-ului. Returneaza o referinta la obiectul care contine obiectul Screen. Returneaza o referinta la controlul care a avut anterior focusul.

Tipul de pointer poate fi:

166

Valoare 0 1 3 7 9 11

Explicatie (Default) Forma pointerului este determinata de Microsoft Access Normal Select (Arrow) Text Select (I-Beam) Vertical Resize (Size N, S) Horizontal Resize (Size E, W) 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 nti 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 cnd 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 cnd se produce evenimentul Timer. Urmatorul exemplu utilizeaza evenimentul Timer pentru a interoga forma activa la intervale regulate de timp. Forma n care se declanseaza evenimentul poate fi sau nu forma activa. Private Sub Form_Load () Me.TimerInterval = 30000 End 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 If End Sub

167

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

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 ODBC Utilizare 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 Connection Container Descriere Conectarea prin retea la o baza de date Open Database Connectivity (ODBC). Informatii de securitate pentru diferite tipuri de obiecte

169

ale bazei de date. Database DBEngine Document Error Field Group Index Parameter Property QueryDef Recordset Relation TableDef User Workspace Baza de date deschisa. Obiectul cel mai de sus al ierarhiei. Informatia de securitate pentru obiecte individuale din baza de date. Informatii de eroare privind accesul la date. Cmp n obiecte TableDef, QueryDef, Recordset, Index, Relation. Contul grupului n baza curenta. Indexul tabelei. Parametru de interogare. Proprietate a unui obiect. Definitia unei interogari salvate n baza de date. Multime de nregistrari definite de o tabela sau de o interogare. Legatura (relatia) dintre doua cmpuri de tabel sau interogari. Definitia unei tabele salvate n baza de date Contul utilizatorului n grupul de lucru curent. 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

Cnd se deschide un fisier .mdb creat n Access din alta aplicatie, nu se poate lucra cu forme, rapoarte, macro-uri sau module Access. Formele si rapoartele trebuiesc proiectate, deasemenea si codul VB, n aplicatia unde se lucreaza.

170

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). 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 nct sa se utilizeze metoda OpenDatabase a obiectului Workspace. Microsoft Access creeaza proprietati suplimentare ale obiectelor DAO. Atunci cnd se formeaza o baza cu DAO n Visual Basic si aceasta baza este deschisa ulterior n microsoft Access, se pot observa si alte proprietati adaugate obiectelor. Aceste proprietati sunt si ele enumerate n colectia Properties a obiectului DAO.

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 selectnd 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 plecnd cu 0.

Exemple: Databases("Salariati") Databases(0) Referirea unui obiect Database n cod se realizeaza si prin pozitionarea n ierarhie: Dim dbs As Database Set dbs = DBEngine.Workspaces(0).Databases(0) prin care se obtine o referinta la prima baza de date (indicele 0 din colectia 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

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 cnd 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 cmp 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_AddTable End 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, incluznd cele create n Microsoft Access, Microsoft Visual Basic, Microsoft Visual C+ + si Microsoft Excel.

172

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 cnd sunt necesare avantajele Jet: abilitatea de a crea sau modifica obiecte, unirea datelor din mai multe formate de baze de date. Se poate utiliza ODBCDirect atunci cnd se executa interogari sau proceduri memorate pe un server back_end cum ar fi Microsoft SQL Server, sau cnd aplicatia client unde se lucreaza necesita capacitatile specifice ODBC cum ar fi actualizari n loturi sau interogari asincrone. ODBC poate efectua anumite operatiuni client/server mult mai repede. Deoarece nu toate posibilitatile DAO sunt accesibile cu ODBCDirect, Microsoft DAO mai suporta nca ODBC prin Microsoft Jet. Se poate astfel utiliza ODBC prin Microsoft Jet, prin ODBCDirect, sau prin ambele cu o singura sursa de date ODBC. Metoda care este utilizata n accesarea unei surse ODBC este determinata de tipul spatiului de lucru n care se lucreaza. Un spatiu de lucru, reprezentat printr-un obiect Workspace, este o sesiune deschisa pentru un cont utilizator particular. O sesiune marcheaza o succesiune de operatii efectuate de motorul de baze de date, ncepe cu intrarea (log on) utilizatorului si se termina la iesirea utilizatorului (log off). Operatiunile pe care un utilizator le poate executa n timpul unei sesiuni sunt determinate de drepturile conferite acelui utilizator. Daca nu se specifica tipul spatiului de lucru, DAO creeaza un spatiu n mod implicit. Cu DAO 3.5 se poate crea oricare dintre cele doua spatii de lucru pentru operatii ODBC. n spatiul Microsoft Jet se utilizeaza accesul prin Jet, n spatiul ODBCDirect se va utiliza cealalta posibilitate. Fiecare spatiu de lucru are propriul model de obiecte si vor fi prezentate n continuarea capitolului.

173

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 nct 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 DefaultType Descriere Long, determina tipul spatiului de lucru: dbUseJet Microsoft Jet database engine dbUseODBC ODBC data source DefaultUser, DefaultPassword IniPath Sir, informatia despre cheia din Windows Registry care contine valorile pentru Microsoft Jet database engine (numai spatiile de lucru Microsoft Jet). Siruri, numele utilizatorului si parola

174

LoginTimeout SystemDB

ntreg, timpul ct se asteapta intrarea unu utilizator. Sir, calea pentru localizarea curenta a fisierului cu informatia despre grupurile de lucru, workgroup (doar spatii Microsoft Jet). Sir, informatii despre versiunea DAO.

Version

Daca nu se creeaza un obiect Workspace specific, un asemenea obiect este creat n mod automat de DAO atunci cnd 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 BeginTrans, CommitTrans, Rollback CompactDatabase, RepairDatabase CreateDatabase, CreateWorkspace Idle OpenConnection, OpenDatabase RegisterDatabase SetOption Descriere Metodele care controleaza efectuarea tranzactiilor.

Compactarea bazei de date, refacerea unei baze deteriorate. Crearea unei baze de date sau a unui spatiu de lucru. Suspenda procesarea datelor din baza Deschide si returneaza o referinta la un obiect Connection, respectiv Database. Completeaza n Windows Registry informatia ODBC. 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

La nceputul lucrului cu obiecte DAO din Visual Basic, DAO creeaza n mod automat un spatiu implicit. Referirea la acesta se realizeaza prin Dim wrk As Workspace Set wrk = Workspaces (0) adica se refera primul obiect din colectie. Spatiile de lucru DAO pot fi partajate sau ascunse. Un spatiu este ascuns pna cnd utilizatorul l marcheaza drept partajat prin adaugarea obiectului 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 Workspace Set wrk = CreateWorkspace("JetWorkSpace", "Admin", "", dbUseJet) noul spatiu fiind pentru utilizatorul Admin si fara parola. Noul spatiu de lucru nu este adaugat n mod automat la colectia Workspaces, pentru aceasta se va utiliza metoda Append a colectiei. Acest lucru este necesar atunci cnd 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 pna la 14 caractere cu exceptia lui null. type este optional si stabileste tipul spatiului (dbUseJet, dbUseODBC)

176

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 formnd colectie Errors. Atunci cnd o noua operatiune genereaza o eroare, colectie Errors este golita si completata cu noile erori. Operatiunile DAO care nu genereaza erori nu au efect asupra colectiei Errors. Erorile sunt indexate n colectie n ordinea crescatoare a nivelelor de eroare. Nivelul cel mai nalt (deci ultimul obiect din colectie) este eroare raportata de VBA, identica cu eroarea raportata de obiectul VBA Err. Colectia Errors are:

proprietatea Count, care da numarul elementelor din colectie metoda Refresh, care actualizeaza colectia potrivit situatiei curente.

Obiectul Error nu are dect 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 continnd 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 colectia sau Este continut n Colectia Databases Contine Colectia Containers Colectia QueryDefs Colectia Properties Colectia Recordsets

Database (obiect)

177

Colectia Relations Colectia TableDefs Databases (colectie) 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_RetriveRecordset End 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 dect cea curent deschisa sau pentru a deschide baze n spatiul de lucru ODBCDirect. Dim dbs As Database Set dbs = CurrentDb Debug.Print dbs.Name 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 cnd un utilizator modifica date dintr-o Obiectul Workspace Obiecte Database

178

baza duplicata, utilizatorii celorlalte replici pot sa-si sincronizeze replicile, astfel nct aceleasi date sa fie n toate copiile. Se poate utiliza DAO pentru a face o baza replicabila, pentru a crea replici, le sincroniza si gestiona multimea replicilor. Se pot crea, de asemenea, replici partiale care contin doar o submultime de nregistrari dintr-o replica totala. Utilizarea replicilor partiale permite sincronizarea unei replici doar cu datele necesare si nu cu ntreaga baza de date. Pentru ca o baza de date sa admita replici trebuie sa se fixeze proprietatea Replicable sau proprietatea ReplicableBool a obiectului Database corespunzator. Aceste proprietati nu exista pentru obiectul Database pna cnd 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

ReplicateDatabase = False Resume Exit_ReplicateDatabase End 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 colectia sau Este continut n Colectia TableDefs Contine Colectia Fields Colectia Indexes Colectia Properties TableDefs (colectie) 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 cmpuri pentru tabela definita. Sintaxa metodei CreateTableDef este Set tabledef = database.CreateTableDef (name, attributes, source, connect) unde tabledef este o variabila obiect reprezentnd obiectul TableDef care se creeaza. Obiectul Database Obiecte TableDef

TableDef (obiect)

database este o variabila obiect reprezentnd 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 indicnd 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

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 cmpurile ErrorCode si ErrorString Set dbs = CurrentDb On Error Resume Next ' stergerea unei tabele Errors existente dbs.TableDefs.Delete "Errors" On Error GoTo Error_CreateErrorsTable ' crearea tabelei Set tdf = dbs.CreateTableDef("Errors") ' creare cmpuri Set fld = tdf.CreateField("ErrorCode", 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

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_CreateErrorsTable End 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 dect sa se deschida baza de date externa direct, mai ales daca tabela vine dintr-o sursa de date ODBC. Pentru a lega o tabela la o baza de date, se utilizeaza metoda 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

"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 If End Function Colectia Fields n spatiul de lucru Microsoft Jet, obiectul Field reprezinta un cmp 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 colectia Field (obiect) Fields (colectie) sau Este continut n Colectia Fields Obiectul TableDef Obiectul Index Obiectul QueryDef Obiectul Recordset Obiectul Relation Contine Colectia Properties Obiecte Field

183

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 cmpul LastName din tabela Employees din baza de date de test Northwind. Dim dbs As Database, tdf As TableDef, fld As Field Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Set dbs = OpenDatabase(conPath) Set tdf = dbs.TableDefs("Employees") Set fld = tdf!LastName n colectia Fields a unui obiect TableDef, QueryDef, Index sau Relation, obiectul Field este o unitate structurala. El reprezinta o coloana dintr-o tabela, avnd un tip particular de date. Daca se creeaza o baza de date n Microsoft Access, se pot crea cmpuri pentru toate aceste obiecte si sa se fixeze proprietatile lor n mediul Access si nu este necesara utilizarea programarii n acest scop. ntr-un obiect 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 cmpurile obiectului Recordset; trebuie sase faca apel la DAO. Colectia Fields a obiectului TableDef contine toate cmpurile definite. Pentru un obiect QueryDef, colectia contine toate cmpurile incluse n interogare din una sau mai multe tabele. Colectia Fields a obiectului Index include cmpurile pentru care este definit indexul. Pentru un obiect Relation, colectia contine cmpurile implicate n relatie. Tipic, exista doua cmpuri n colectia Fields: unul care este cheia primara, specificat de proprietatea Table a obiectului Relation; al doilea este cmpul extern corespunzator, din tabela specificata de proprietatea ForeignTable a obiectului Relation. Colectia Fields a obiectului Recordset contine cmpurile 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 cmp n nregistrarea curenta. Deoarece Value este proprietatea implicita a obiectului Field iar Fields este colectia implicita a obiectului Recordset, se poate returna valoarea unui cmp fara a specifica explicit fie Fields, fie Value. Exemplul urmator este sugestiv n acest sens: Dim dbs As Database, rst As Recordset Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Set dbs = OpenDatabase(conPath) Set rst = dbs.OpenRecordset("Employees") ' referinta explicita la colectie si valoare Debug.Print rst.Fields("LastName").Value ' referinta explicita la valoare Debug.Print rst!FirstName.Value ' referinte implicite Debug.Print rst!Title Colectia Indexes

184

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 colectia Index (obiect) sau Este continut n Colectia Indexes Contine 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 cmpurilor pe ambele parti ale jonctiunilor, cmpuri care sunt sortate, sau cmpuri care sunt utilizate drept criterii de interogare. Totusi, indexurile pot sa mareasca dimensiunea bazei si sa ncetineasca performanta cnd se actualizeaza cmpuri indexate, cnd se adauga sau se elimina date. Performanta poate fi redusa si n cazul aplicatiilor multiuser. Din aceste motive utilizarea indexurilor va fi facuta cu atentie. Un index specifica ordinea n care nregistrarile sunt accesate din tabelele bazei de date ntr-un obiect Recordset de tip tabela. Pentru a crea un index cu DAO, operatiune posibila pentru unul sau mai multe cmpuri, trebuie
o o o o o

metoda CreateIndex pentru obiectul TableDef. metoda CreateField pentru obiectul Index cu scopul creerii unui obiect Field pentru fiecare cmp (coloana) care se include n obiectul Index. Stabilirea proprietatilor obiectului Index. Metoda Append pentru fiecare obiect Field care se adauga la colectia Fields. 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 cmpurile LastName si FirstName Set idx = tdf.CreateIndex("FirstLastName") ' crearea cmpurilor din index Set fldLast = idx.CreateField("LastName", dbText) Set fldFirst = idx.CreateField("FirstName", dbText) ' adaugarea obiectelor Field

185

idx.Fields.Append fldLast idx.Fields.Append fldFirst ' fixarea proprietatii Required idx.Required = True ' adaugarea noului obiect index tdf.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 cmpurilor cu exceptia cmpului Photo For Each fld In rst.Fields If fld.Type <> dbLongBinary Then Debug.Print fld End If Next fld End 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 colectia sau Este continut n Colectia QueryDefs Contine Colectia Fields Colectia Parameters Colectia Properties QueryDefs (colectie) Obiectele QueryDef ofera:

QueryDef (obiect)

Obiectul Database

Obiecte QueryDef

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

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 cnd frazele SQL sunt create, repetat, n timpul executiei. Un obiect QueryDef permanent din spatiul Jet poate fi gndit ca o instructiune SQL compilata. Astfel, interogarea este mai rapida dect 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. Cnd 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 Recordset Dim strSQL As String strSQL = "SELECT FirstName, LastName, LastName, HireDate FROM Employees " _ & "WHERE Title = 'Sales Representative' ORDER BY HireDate;" Set dbs = OpenDatabase(conPath) Set qdf = dbs.CreateQueryDef("Sales Representatives", strSQL)

187

Set rst = qdf.OpenRecordset Obiectul 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 colectia sau Este continut n Colectia Parameters Obiectul QueryDef Contine Colectia Properties Obiecte Parameter

Parameter (obiect) Parameters (colectie)

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

"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_NewparameterQuery End 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 cmpuri din tabele sau nterogari. Colectia Relations contine toate obiectele Relation ale unei baze de date. Localizarea n ierarhia de obiecte DAO a spatiului de lucru Microsoft Jet este Obiectul colectia Relation (obiect) sau Este continut n Colectia Relations Contine Colectia Fields Colectia Properties

189

Relations (colectie) Relatii ntre tabele

Obiectul Database

Obiecte Relation

Separarea informatiilor ntre mai multe tabele ale unei baze de date, dupa criterii care tin de subiect, categorie, administrare etc., ridica problema reunirii informatiilor pentru necesitati de raportare a lor. Pentru rezolvarea acestei probleme o prima operatiune este aceea de a stabili relatii ntre tabele. Prin relatie se ntelege, n problematica bazelor de date, o asociere stabilita ntre doua cmpuri (denumite cmpuri cheie, de regula cu acelasi nume) din doua tabele. n acest mod nregistrarile celor doua tabele pot fi coordonate nct nregistrarile curente sa contina informatii corelate dupa cmpurile asociate. Relatia lucreaza prin potrivirea valorilor cmpurilor cheie. n cele mai multe cazuri, cmpurile cheie sunt cheia primara dintr-o tabela (s-o numim tabela A), care constituie un identificator unic pentru fiecare nregistrare, si o cheie externa din alta tabela (s-o numim tabela B). Exista trei tipuri de relatii: one-to-one, one-to-many, many-to-many dupa numarul nregistrarilor din cele doua tabele, care ndeplinesc conditia de matching. O relatie one-to-many, cea mai frecventa, o nregistrare din tabela A poate sa se potriveasca cu mai multe nregistrari din tabela B; invers, o nregistrare din tabela B are doar o nregistrare din A cu care se potriveste. ntr-o relatie many-to-many, o nregistrare din tabela A poate sa se potriveasca cu mai multe nregistrari din tabela B, iar o nregistrare din tabela B poate sa se corespunda cu mai multe nregistrari din tabela A. Acest tip de relatie este posibil prin definirea unei a treia tabele (tabela de jonctiune junction table) ale carei cmpuri chei primare sunt n relatie cu cheile externe din tabelele A si B. Astfel, o relatie many-to-many este formata din doua relatii one-to-many care implica o a treia tabela. Relatia one-to-one presupune ca nregistrarile din tabelele A si B sunt n corespondenta una la una, fiecare nregistrare din A se poate potrivi doar cu o nregistrare din B si reciproc. Desi nu este o situatie uzuala, prin aceea ca legatura foarte puternica ar presupune ca informatia trebuia grupata ntr-o singura tabela, relatia one-to-one poate fi utilizata pentru divizarea unei tabele cu prea multe cmpuri sau izolarea unei parti a tabelei. Modul de relatie creat de Microsoft Access depinde de definirea cmpurilor care sunt puse n relatie (chei primare, indexuri unice etc.). 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, cnd 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 cnd sa se execute actualizarile si stergerile n cascada (actualizari n cascada cascading update pentru relatiile care impun integritatea referentiala, o optiune care, n cazul modificarii unei chei primare din nregistrarile tabelei primare, conduce la actualizarea automata a cheilor externe n toate nregistrarile legate din tabelele externe; stergeri n cascada cascading delete similar, dar pentru stergeri de nregistrari: stergerea unei inregistrari din tabela primara produce stergerea nregistrarilor legate din tabelele externe). Toate aceste notiuni sunt prezentate, pe scurt, n continuare.

190

Adaugarea unui obiect Relation la colectia Relations, se va crea obiectul prin metoda 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 cmpuri din tabele de baza (o tabela de baza este o tabela a unei baze de date Microsoft Jet) dar nu relatii care implica tabele si interogari legate (o tabela legata este o baza externa, legata de o baza de date Jet). Stabilirea unei relatii neimpuse ntre orice tip de tabela sau interogare nativa sau legata. Utilizarea proprietatii Name pentru a referi relatia dintre cmpurile din tabela primara (prin tabela primara se ntelege partea "one" dintr-o relatie one-to-many) referita si tabela externa (tabela de pe partea "many" a relatiei one-to-many) care face referirea. Utilizarea proprietatii Attributes pentru a determina daca relatia dintre cmpuri 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 stnga (left join, include toate nregistrarile din prima tabela din stnga chiar daca nu exista nici o potrivire cu nregistrari din a doua tabela din dreapta) sau asociere dreapta (right join, include toate nregistrarile din a doua tabela din dreapta chiar daca nu exista potriviri cu nregistrari din prima tabela din stnga relatiei). Utilizarea proprietatii Name a obiectelor Field din colectia Fields a obiectului Relation pentru a stabili sau returna numele cmpurilor din cheia primara a tabelei referite, sau setarile proprietatii ForeignName a obiectelor Field pentru a stabili sau returna denumirile cmpurilor din cheia externa a tabelei care face referinta.

Un obiect Relation are o colectie Fields care contine doua cmpuri, cte unul n fiecare tabela a relatiei.Cmpurile relatiei trebuie sa aiba acelasi tip de data si trebuie sa aiba valori comune. Se vor utiliza proprietatile 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 cmpul 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 cmpul 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 cmpul EmployeeID care este cheie primara n baza Employees toate valorile acestui cmp sunt unice si cheie externa pentru Orders aceeasi valoare poate sa apara n mai multe nregistrari. Function NewRelation() As Boolean Dim dbs As Database Dim fld As Field, rel As Relation ' calea catre baza de date Northwind Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" On Error GoTo Err_NewRelation ' returneaza o referinta la baza curenta Set dbs = OpenDatabase(conPath)

191

' gasirea unei relatii EmployeesOrders deja existente For Each rel 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 cmp n colectia Fields a obiectului Relation, la creare se fixeaza Name Set fld = rel.CreateField("EmployeeID") ' numele pentru cmpul 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_NewRelation End Function Observatie. n Microsoft Access se lucreaza cu relatiile prin meniul Tools Relationships.

192

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 Properties Accesarea datelor ODBC Utilizarea Microsoft Jet pentru date ODBC Utilizarea ODBCDirect pentru date ODBC nregistrarea unei surse de date ODBC Utilizarea DAO cu ODBCDirect Obiectul DBEngine 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 Recordset (obiect) Este continut n Colectia Recordsets Contine Colectia Fields Colectia Properties

193

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 cmpurile 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 dect 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 nti metoda OpenDatabase pentru deschiderea bazei si apoi se deschide un obiect Recordset de tip tabela.

194

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 Boolean Dim dbs As Database, rst As Recordset Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" On Error GoTo Err_ReturnEmployeesRecord ' returnarea referintei la baza de date Set dbs = OpenDatabase(conPath) ' deschidere recordset pentru tabela Employees Set rst = dbs.OpenRecordset("Employees", dbOpenTable) ' fixarea indexului rst.Index = "LastName" ' operatiunea de cautare rst.Seek "=", strKey ' valoarea cautata este argument al functiei ' verificarea gasirii If rst.NoMatch = False Then ' tiparirea unor cmpuri din nregistrarea gasita Debug.Print rst!EmployeeID, rst!FirstName & " " & rst!LastName, rst!Title ReturnEmployeesRecord = True Else ReturnEmployeesRecord = False End If Exit_ReturnEmployeesRecord: ' nchidere recordset si baza rst.Close dbs.Close Exit Function Err_ReturnEmployeesRecord: MsgBox "Error " & Err & ": " & Err.Description ReturnEmployeesRecord = False Resume Exit_ReturnEmployeesRecord End Function 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, incluznd tabele legate din mai multe baze de date. Obiecte Recordset de tip dynaset se pot crea att n spatii de lucru Microsoft Jet, ct si n spatii de lucru ODBCDirect. Daca obiectul implica o sursa de date la distanta, el consta ntr-o serie de bookmark-uri, fiecare identificnd unic o nregistrare din recordset. Date efective nu sunt returnate dect la referirea lor explicita. Pentru a determina numarul de nregistrari din recordset se aplica mai nti metoda MoveLast astfel regasindu-se toate nregistrarile din multime. Obiectul Recordset de tip dynaset poate fi actualizat, dar nu toate cmpurile suporta operatia. Proprietatea DataUpdatable a obiectului Field respectiv arata daca se poate modifica valoarea cmpului. Obiectul nu se poate actualiza daca

195

pagina de date necesara este blocata de alt utilizator nregistrarea a fost deja modificata de la ultima citire utilizatorul nu are drepturile necesare cel putin o tabela sau un cmp este read-only obiectul Recordset a fost creat din mai multe tabele fara instructiunea JOIN obiectul include cmpuri dintr-o sursa de date ODBC, sau tabele Paradox, si nu exista un index unic pe acele tabele.

Crearea unui obiect dynaset-type Recordset se indica utiliznd constanta dbOpenDynaset pentru argumentul type al metodei OpenRecordset, dupa modelul Sub PrintHireDates () Dim dbs As Database, rst As Recordset Dim strSQL As String Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" ' deschiderea bazei de date, referirea ei Set dbs = DBEngine.Workspaces(0).OpenDatabase(conPath) ' initializarea sirului SQL strSQL = "SELECT FirstName, LastName, HireDate FROM Employees " & _ "WHERE HireDate <= #1-1-93# ORDER BY HireDate;" ' deschiderea recordsetului de tip dynaset Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset) ' tiparirea nregistrarilor din recordset Do Until rst.EOF Debug.Print rst!FirstName, rst!LastName, rst!HireDate Rst.MoveNext Loop ' nchiderea recordsetului si a bazei rst.Close dbs.Close End Sub 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 cmpurile cerute n interogare, fie ca exista n cod referinte la ele sau nu. Obiectul Recordset de tip snapshot necesita mai putine resurse dect 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 dect o singura trecere prin nregistrari).

196

ntr-un obiect recordset de acest tip exista doar o singura nregistrare la un moment dat. Rezulta ca nu se pot utiliza metode cum ar fi MoveLast, MoveFirst, MovePrevious. Obiectele de acest tip, utile atunci cnd nregistrarile sunt parcurse doar o data, ofera cea mai mare viteza de acces. Crearea unui obiect forward-only-type 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 AddNew Cancel CancelUpdate Clone Close CopyQueryDef Delete Edit FillCache FindFirst FindLast FindNext FindPrevious GetRows Move Jet Jet Jet Jet Jet Jet Jet Table Jet Dynaset Jet/ODBC ODBC Jet/ODBC Jet Jet/ODBC Jet Jet/ODBC Jet/ODBC Jet Jet Jet Jet Jet Jet/ODBC Jet/ODBC Jet Jet Jet Jet Jet/ODBC Jet/ODBC Jet/ODBC Doar nainte, fara offset ODBC ODBC Snapshot ODBC * ODBC ODBC * Jet Jet/ODBC Jet ODBC * ODBC * Jet/ODBC Jet ODBC ODBC ODBC ODBC ODBC ForwardOnly ODBC ODBC ODBC Dynamic ODBC ODBC ODBC

197

MoveFirst MoveLast MoveNext MovePrevious NextRecordset OpenRecordset Requery Seek Update

Jet Jet Jet Jet

Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC ODBC

Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC ODBC Jet Jet/ODBC Jet/ODBC ODBC

ODBC ODBC ODBC ODBC ODBC

Jet

Jet Jet/ODBC

ODBC

Jet 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 cnd se stabileste securitatea bazei, aceasta se efectueaza pentru un obiect particular sau multime de obiecte specificnd tipul de drepturi pe care utilizatorul sau grupul l are asupra obiectelor respective. Daca un grup are o anumita permisiune pentru un obiect, toti utilizatorii grupului au aceeasi permisiune. 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 avnd 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 reprezentnd un document din baza. Att DAO ct si aplicatia ofera diferite tipuri de obiecte Document, de exemplu Database

198

(DAO), Form (Access) etc. Pentru stabilirea drepturilor se stabileste proprietatea 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 reprezentnd baza de date curenta. Sub DisplayProperties() Dim dbs As Database, prp As Property Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" ' deschide baza Set dbs = OpenDatabase(conPath) Debug.Print "Current Database Properties" ' enumerarea colectiei For Each prp In dbs.Properties Debug.Print prp.Name Next prp dbs.Close End Sub Anumite proprietati ale obiectelor DAO nu exista n mod automat n colectia Properties a obiectului respectiv. nainte de utilizarea unei asemenea proprietati, trebuie sa se creeze un obiect 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 cnd 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 Properties obj.Properties(strName) = varSetting SetProperty = True Exit_SetProperty: Exit Function Error_SetProperty: If Err = conPropNotFound Then

199

' creare proprietate, tip, valoare initiala Set prp obj.CreateProperty(strName, intType, varSetting) ' adaugarea la colectia Properties obj.Properties.Append prp obj.Properties.Refresh SetProperty = True Resume Exit_SetProperty Else MsgBox Err & ": " & vbCrLf & Err.Description SetProeprty = False Resume Exit_SetProperty End If End Function De exemplu, pentru a fixa proprietatea ReplicableBool a obiectului Database, se poate utiliza functia precedenta prin Sub ReplicateDatabase() Dim dbs As Database Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Set dbs = OpenDatabase(conPath, True) 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 cnd se fixeaza sau se citeste o proprietate care nu exista n mod automat n colectia Properties a unui obiect, referinta la colectia Properties trebuie sa fie explicita. De exemplu, Debug.Print dbs.Properties("ReplicableBool") Functia aratata n exemplul anterior poate fi utilizata pentru definirea unor proprietati proprii (introduse de utilizator) pentru obiectele DAO. De exemplu, se poate defini o proprietate care sa memoreze numele utilizatorului care a modificat ultima data o tabela. Si referintele la proprietatile definite de utilizator se vor efectua n mod explicit. Anumite aplicatii, cum ar fi Access, definesc proprietati proprii pentru obiectele DAO. De exemplu Microsoft Access defineste proprietati pentru obiectele TableDef, QueryDef, Field si Document. Accesarea datelor ODBC Atunci cnd este nevoie sa se lucreza cu surse de date ODBC, trebuie sa se decida daca se va utiliza DAO cu Microsoft Jet, ODBCDirect sau ambele. n continuare se discuta pentru nceput avantajele fiecarui tip de acces si alte probleme conexe domeniului. Alegerea modului de lucru este functie de posibilitatile de lucru oferite n cele doua spatii. 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

o o

o o

o o

o o

Legaturi actualizabile se pot actualiza date din obiecte Recordset bazate pe legaturi multiple de tabele 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, incluznd informatii despre cmpuri si indexuri, n baza locala. Acest fapt mareste viteza de conectare la accesarile ulterioare ale sursei de date. Suport pentru metode Find se pot utiliza metodele FindFirst, FindNext, FindPrevious si FindLast cu obiectele Recordset. 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 pna n momentul esecului. 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. Interogari ncrucisate se poate utilzia propozitia SQL TRANSFORM pentru a crea rezumate ncrucisate (crosstab) ale datelor interogate. 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. Utilizare programatica pentru Data Definition Language (DDL) se poate folosi DAO pentru operatiuni care modifica structura bazei de date (adaugare de tabel, modificare etc.). 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 utiliznd 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 utiliznd resurse minime de pe statia de lucru, fara a trece prin Microsoft Jet. Avantajele utilizarii spatiului de lucru ODBCDirect sunt enumerate n continuare.
o

o 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 dect ale statiei de lucru). Reducerea necesarului de resurse netrecnd prin Microsoft Jet, aplicatia cere mai putine resurse locale. Daca se utilizeaza ODBCDirect din Access se va tine seama ca Microsoft Access ncarca ntotdeauna Microsoft Jet (chiar daca operatiunile ODBCDirect nu trec pe acolo). 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. 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. Actualizare optimista n loturi modificarile locale se pot stoca n Recordset si trimite apoi serverului ntr-un singur lot. 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

Pentru a putea fi utilizata, att n spatiul de lucru Microsoft Jet, ct si n spatiul ODBCDirect, o sursa de date ODBC trebuie sa fie nregistrata. Acest proces memoreaza informatia despre sursa de date n Windows Registry si ofera aceasta informatie aplicatiilor. nregistrarea se poate efectua att din managerul de ODBC (disponibil n mediul Windows), ct si din Visual Basic. Pasii necesari nregistrarii difera dupa sursa de date ODBC, driverele respective necesitnd informatii specifice. n continuare se da, ca exemplu, nregistrarea sursei de date SQL Server utiliznd managerul de ODBC: 1. Windows Control Panel => dublu click pe 32bit ODBC 2. Click 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 Boolean Dim str As String On Error GoTo Err_RegisterDB ' construirea sirului de cuvinte cheie str = " Description=SQL Server on Server Publishers" & _ vbCR & "OemToAnsi=No" & _ vbCR & "Network=(Default)" & _ vbCR & "Address=(Default)" & _ vbCR & Server=Publishers" & _ vbCR & "Database=Pubs" ' nregistrarea bazei de date DBEngine.RegisterDatabase "Pubs", "SQL Server", True, str RegisterDB = True Exit_RegisterDB: Exit Function Err_RegisterDB: MsgBox "Error " & Err &": " & Err.Description RegisterDB = False Resume Exit_RegisterDB End Function Metoda 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

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 att spatiile de lucru Jet, ct 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 Workspace Set 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

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 Workspace (obiect) Continut n Colectia Workspaces Contine 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 nti 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

o o o

Conectare asincrona. Operatiunea de conectare se desfasoara n paralel cu alte operatiuni si poate fi verificata daca s-a efectuat. Interogare asincrona. Similar celor anterior spuse, dar pentru interogari. 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 cnd sa fie ntrebat utilizatorul la stabilirea conexiunii si daca aceasta este asincrona; valorile se vor studia din Help - OpenConnection method, readonly permite controlul actualizarii datelor: True pentru a interzice modificarea datelor. connect este un sir de conectare valid care contine parametrii necesari driverului ODBC. Argumentul poate contine numele utilizatorului, parola etc. Sirul de conectare trebuie sa nceapa cu "ODBC;" si sa contina o serie de valori necesare driverului pentru a accesa datele sursei. Componentele sirului difera dupa sursa de date. n mod uzual cerintele minime sunt IDul 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 Boolean Dim wrk As Workspace, cnn As Connection, rst As Recordset, fld As Field Dim strConnect As String, strSQL As String On Error GoTo Err_OpenPubsConnection ' Crearea sirului de conectare strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" ' Crearea sirului SQL

205

strSQL = SELECT * FROM Authors WHERE State = 'MD';" ' Crearea spatiului de lucru ODBC Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) ' Deschiderea conexiunii Set cnn = wrk.OpenConnection("Pubs", dbDriverNoPrompt, False, strConnect) ' Deschiderea recordsetului din conexiune Set rst = cnn.OpenRecordset(strSQL,dbOpenDynaset) ' Tiparirea valorilor din recordset Do Until rst.EOF For Each fld In rst.Fields Debug.Print fld.Name, fld.Value Next fld Debug.Print rst.MoveNext Loop OpenPubsConnection = True Exit_OpenPubsConnection: rst.Close cnn.Close Exit Function 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 nti toate obiectele Recordset deschise. Deschiderea conectarilor asincrone Acest tip de conectare, necesar mai ales cnd conectarea dureaza mai mult, timp n care se pot efectua alte operatiuni, este specificata prin constanta dbRunAsync data argumentului options al metodei OpenConnection. Dim wrk As Workspace, cnn As Connection, strConnect As String Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set cnn = wrk.OpenConnection("",dbDriverNoPrompt + dbRunAsync, False, strConnect) Proprietatea StillExecuting a obiectului Connection poate fi 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

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 reprezentnd 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 Database Dim strConnect As String strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) Set dbs = wrk.OpenDatabase("Pubs", dbDriverNoPrompt, False, strConnect) Pentru argumentele metodei se va studia Help - OpenDatabase method (DAO). Dintre metodele si proprietatile obiectului Database, mentionam doar cteva.

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

' 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 If End 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 QueryDef (obiect) Continut n Contine

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 nct utilizatorii sa continue aplicatia n timp ce se executa interogarea si se poate da utilizatorilor posibilitatea de a anula o interogare asincrona n cazul n care dureaza prea mult. Exemplul urmator poate constitui un model. Function DeleteLargeSales () As Boolean Dim wrk As Workspace, rst As Recordset Dim cnn As Connection, qdf As QueryDef Dim strConnect As String, strSQL As String Dim errObj As Error On Error GoTo Err_DeleteLargeSales ' crearea spatiului de lucru Set wrk = DBEngine.CreateWorkspace("ODBC","sa", "", dbUseODBC) ' crearea sirului de conectare

208

strConnect = ""ODBC;DSN=Publishers;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 pna cnd se termina interogarea ' Se verifica proprietatea StillExecuting pentru a detecta terminarea Wend DeleteLargeSales = True Exit_DeleteLargeSales: cnn.Close wrk.Close Exit Function Err_DeleteLargeSales: For Each errObj In Errors Debug.Print errObj.Number, errObj.Description Next errObj DeleteLargeSales = False Resume Exit_DeleteLargeSales End 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", dbRunAsync cnn.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

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_CancelAsyncQuery End 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 pna cnd 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 pna 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

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.Close End 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 Recordset (obiect) Continut n Colectia Recordsets Obiectul Connection Obiect Database Obiectele Recordset suportate n spatiul de lucru ODBCDirect sunt de tipurile: dynaset, snapshot, forwardonly 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. Contine Colectia Fields Colectia Properties Recordsets (colectie) Obiecte Recordset

211

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 utiliznd 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 cmp 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 cmp. Metodele AppendChunk, GetChunk si proprietatea FieldSize returneaza sau fixeaza o valoare dintrun obiect OLE sau cmp memo a unui obiect Recordset. Proprietatile Type, Size si Attributes determina tipul datelorcare pot fi memorate ntr-un cmp. 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 cteva operatiuni uzuale ntr-un spatiul de lucru ODBCDirect: actualizarea optimista n loturi, lucrul cu cursoare, lucrul cu proceduri memorate.

212

Utilizarea actualizarii optimiste n loturi n multe aplicatii client-server, actualizarile optimiste apar pe principiul "nregistrare cu nregistrare". Aceasta se ntmpla n mod uzual n modul
o o o o

Un utilizator editeaza o nregistrare. Utilizatorul vrea sa salveze nregistrarea. Serverul ncearca sa blocheze aceasta nregistrare; daca reuseste, nregistrarea este actualizata, n caz contrar o violare a blocarii este tratata de catre aplicatie. 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 o o o

o o

Crearea unui spatiu ODBCDirect Stabilirea proprietatii DefaultCursorDriver, a spatiului de lucru, la valoare dbUseClientBatchCursor. Deschiderea unui obiect Connection sau Database din spatiul ODBCDirect. 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. Efectuarea editarilor necesare n obiectul Recordset. Toate editarile sunt memorate local. 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

Wend ' actualizarea nregistrarilor n sursa de date rst.Update dbUpdateBatch End Function Daca mai multe nregistrari au fost editate local si se doreste ca nregistrarea curenta sa fie actualizata naintea actualizarii n lot, se poate apela metoda 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 date rst.MoveFirst rst.Edit rst!qty = rst!qty + 2 rst.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, producnd astfel o coliziune. Pentru tratarea coliziunilor se va examina proprietatea BatchCollisions a obiectului Recordset. Proprietatea BatchCollisions returneaza un tablou care memoreaza bookmark-uri punctnd catre nregistrarile din obiectul Recordset pentru care au aparut coliziuni. De fiecare data cnd apare o coliziune n timpul actualizarii n lot, este adaugat la tablou un pointer catre registrarea pentru care apare coliziunea. Se poate parcurge fiecare asemenea bookmark si examina urmatoarele proprietatii ale obiectului Field al nregistrarii curente. Proprietatea Value Descriere Valoarea curenta a cmpului din Recordset. Aceasta corespunde valorii cmpului dupa apelul metodei Update. Valoarea cmpului din obiectul Recordset nainte de apelul metodei Update. Valoarea cmpului dupa cum este memorata n baza de date.

OriginalValue VisibleValue

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 cmpului. Pentru aceasta se apeleaza metoda Update si specifica True pentru argumentul force. Se poate schimba valoarea curenta din obiectul propriu Recordset la valoarea originala si forta schimbarea n baza de date.

214

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 j End Function Exemplul urmator poate fi modificat astfel nct actualizarea nregistrarilor cu coliziuni sa nu se desfasoare una cte una, desi metoda de fortare globala nu este tocmai indicata. ' deschidere recordset Set rst = _ cnn.OpenRecordset(("SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch) ' modificare nregistrarilor While Not rst.EOF rst.Edit rst!qty = rst!qty + 1 rst.Update rst.MoveNext Wend rst.Update dbUpdateBatch, True 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

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

Sa reprezinte anumite nregistrari sau toate nregistrarile unei tabele Sa reprezinte anumite nregistrari sau toate nregistrarile unei uniuni de tabele Sa nu reprezinte nici o nregistrare Sa fie read-only sau actualizabile fie la cursor sau la nivel de cmp Sa fie complet navigabile sau doar nainte 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 reprezentnd cursorul prin retea catre client, ca si datele cerute de cursor. Clientul gestioneaza resursele temporare necesare. Anumite motoare de baze de date, cum ar fi Microsoft SQL Server 6.0, suporta si cursoare de tip server-side. Cu acest tip de cursor, serverul gestioneaza multimea de nregistrari rezultate cu resurse de pe server. Serverul returneaza prin retea doar datele cerute de client. Utilizarea acestui tip de cursor poate creste performanta aplicatiei, mai ales atunci traficul de retea este mare, dar apare conditia ca serverul sa poata oferi resursele necesare tuturor cursoarelor cerute de clienti. Alegerea tipului 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 att pentru surse de date ODBC, ct si pentru surse non-ODBC. Constanta (argumentul type) dbOpenDinamic dbOpenDynaset dbOpenSnapshot dbOpenForwardOnly Recordset type (surse nonODBC) Dynamic type Dynaset type Snapshot type Forward-only type Cursor type (surse de date ODBC) Dynamic Keyset Static 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

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) dbUseODBCCursor Descriere

Utilizare cursoare la client. Rezultate bune pentru multimi mici de nregistrari rezultate. 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. Utilizare cursoare pe server, daca este posibil; cursoare client n caz contrar. Utilizarea cursoarelor lor la client. Cerut la actualizarile n loturi. Deschidere obiect Recordset ca forward-only, read-only, cu rowset = 1.

dbUserServerCursor

dbUseDefaultCursor dbUseClientBatchCursor dbUseNoCursor

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) dbOptimistic Descrierea tipului de blocaj al cursorului ODBC Pagina continnd nregistrarea este blocata doar att timp ct nregistrarea este actualizata prin metoda Update. Pagina cu nregistrarea este blocata ct mai devreme, de la utilizarea metodei Edit. Utilizarea concurentei optimiste bazata pe valorile nregistrarilor. Utilizarea actualizarii optimiste n lot. Implicita pentru spatiile ODBCDirect, interzice modificari n datele obiectului Recordset.

dbPessimistic

dbOptimisticValue dbOptimisticBatch dbReadOnly

217

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 cte multimi de rezultate sunt generate de o procedura memorata, codul trebuie sa fie pregatit sa prelucreze un numar necunoscut de multimi. De notat ca n cazul returnarii de catre o procedura memorata a mai multor multimi de rezultate, nici una dintre acestea nu poate fi actualizata. Se pot utiliza fie cursoare client-side, fie cele server-side pentru regasirea unor multiple multimi de rezultate. Daca se utilizeaza cursoare client-side, multimile de rezultate sunt returnate de toate obiectele 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 cmp din fiecare nregistrare a fiecarei multimi de rezultate. Function GetMultipleResults() Dim wrk As Workspace, rst As Recordset, cnn As Connection, qdf As QueryDef Dim fld As Field, strSQL As String, strConnect As String, fDone As Boolean

218

' creare spatiu ODBCDirect Set wrk = DBEngine.CreateWorkspace(""ODBCDirect", "Admin", "", dbUseODBC) ' creare sir de conectare strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;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 cmpurilor While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value Next fld rst.MoveNext Wend FDone = Not rst.NextRecordset() Loop rst.Close cnn.Close wrk.Close End Function Lucrul cu proceduri memorate Se pot utiliza obiecte ODBCDirect QueryDef pentru a executa proceduri memorate, inclusiv proceduri memorate care necesita parametri de intrare si returneaza valori. Urmatorul exemplu creeaza procedura numita GetEmps, memorata pe server. strSQL = "CREATE PROCEDURE GetEmps AS" strSQL = strSQL & "SELECT * FROM EMPLOYEE;" cnn.Execute strSQL Daca exista desi o procedura cu acest nume, se poate utiliza instructiunea DROP pentru a sterge mai nainte versiunea veche: strSQL = "DROP PROCEDURE GetEmps;" cnn.Execute strSQL Se poate executa procedura memorata utiliznd metoda 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

Se utilizeaza obiectul Parameter pentru a lucra cu parametrii. Proprietatea Direction a obiectului Parameter comunica DAO cum functioneaza parametrul. Driverul ODBC ncearca sa determine directia parametrului (intrare sau iesire) dar proprietatea Direction este read/write asa ca directia poate fi schimbata. Urmatorul exemplu creeaza o procedura memorata cu un parametru de intrare si o valoare returnata. Procedura este executata si se regaseste valoarea returnata. ' crearea procedurii memorate pe server strSQL = "CREATE PROCEDURE UpdateEmps (@invar int) AS RETURN @invar;" cnn.Execute strSQL ' crearea QueryDef pentru a executa procedura memorata Set qdf = cnn.CreateQueryDef("qry", "{ ? = call UpdateEmps(?) }") ' tratarea parametrilor qdf.Parameters(0).Direction = dbParamReturnValue qdf.Parameters(1) = 10 qdf.Execute ' obtinerea valorii returnate var = qdf.Parameters(0).Value

220

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 Office Obiectul 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 prezentarii Obiectele 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 notelor Obiectul Selection Crearea unei selectii Returnarea unei selectii Returnarea unui obiect din selectie Obiectele 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 curent Controlul 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

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 cuvntul cheie Application, ca n exemplul anterior. Daca se atribuie unei variabile obiectul Application, variabila se va declara de tip PowerPoint.Application, dupa modelul Dim appPPT As PowerPoint.Application Set appPPT = Application Se poate utiliza de asemenea proprietatea Application a oricarui obiect PowerPoint pentru a returna obiectul Application PowerPoint. Aceasta metoda este utila atunci cnd este necesar sa se obtina referinta la obiectul Application dintr-o prezentare PowerPoint scufundata n documentul altei aplicatii. Urmatorul exemplu, executat din Excel, stabileste o variabila la obiectul aplicatie PowerPoint utiliznd primul shape (care trebuie sa fie o prezentare PowerPoint) din foaia de calcul. Dim appPPT As PowerPoint.Application Set embeddedPres = Worksheets(1).Shapes(1) embeddedPres.OLEFormat.Activate Set appPPT = embeddedPres.OleFormat.Object. Application Urmatorul exemplu creeaza un obiect Application PowerPoint din alta aplicatie, porneste PowerPoint si deschide o prezentare existenta: Set ppt = CreateObject("Powerpoint.Application.8") ppt.Visible = True ppt.Presentations.Open "numele prezentarii, eventual cu cale" 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

Actiunea Activarea ferestrei aplicatiei PowerPoint Verificarea faptului ca fereastra aplicatiei PowerPoint este activa Stabilirea sau returnarea textului care apare n bara de titlu a aplicatiei PowerPoint Stabilirea sau returnarea marimii si pozitiei ferestrei PowerPoint pe ecran Stabilirea sau returnarea vizibilitatii ferestrei aplicatiei. Trebuie data valoarea True la crearea obiectului Application PowerPoint n alta aplicatie pentru a vedea PowerPoint pe ecran. Stabilirea sau returnarea starii ferestrei aplicatiei: maximizata, minimizata sau flotanta.

Proprietatea sau metoda utila Metoda Activate Proprietatea Active Proprietatea Caption Proprietatile Height, Left, Top si Width Proprietatea Visible

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 Numele imprimantei active Returnarea numarului de constructie PowerPoint Afisarea unui subiect de Help Returnarea numelui sistemului de operare Returnarea caii catre aplicatia PowerPoint Parasirea (nchiderea) aplicatiei PowerPoint Executarea unei proceduri Visual Proprietatea sau metoda utila Proprietatea ActivePrinter Proprietatea Build Metoda Help Proprietatea OperatingSystem Proprietatea Path Metoda Quit Metoda Run

223

Basic Returnarea numarului de versiune 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 Presentations (colectie) Prezentarea activa DocumentWindows (colectie) Fereastra documentului activ AddIns (colectie) SlideShowWindows (colectie) Proprietatea utilizata Proprietatea Presentations Proprietatea ActivePresentation Proprietatea Windows Proprietatea ActiveWindow Proprietatea AddIns Proprietatea SlideShowWindows Proprietatea Version

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 Office Assistant Meniuri si bare de unelte PowerPoint Cautarea fisierelor Editorul Visual Basic Obiectul Presentation Se creeaza un obiect Presentation de fiecare data cnd se deschide sau se creeaza un fisier (o prezentare) n PowerPoint. Se va observa ca multe dintre proprietatile si metodele obiectului Presentation corespund intrarilor din meniul 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 Proprietatea utilizata Proprietatea Assistant Proprietatea CommandBars Proprietatea FileSearch Proprietatea VBE

224

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 reprezentnd o prezentare scufundata, se utilizeaza proprietatea Object a obiectului OLEFormat pentru forma (shape) care contine prezentarea scufundata, dupa modelul Dim embeddedPres As Presentation Set embeddedPres = ActivePresentation.Slides(1).Shapes(3).OLEFormat.Object prin care se atribuie variabilei embeddedPres prezentarea scufundata n al treilea shape de pe diapozitivul cu numarul 1. 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 Presentation Set myPres = Presentations.Open _ (FileName:= " nume fisier + cale (daca este necesara)") myPres.Window(1).ViewType = ppViewSlideSorter unde prezentarea deschisa este vizualizata n modul Slide Sorter. 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 Presentation Set myPres = Presentations.Add myPres.Slides.Add 1, ppLayoutTitle Atribuirea unui nume semnificativ are de asemenea rolul de a permite o referire usoara la o prezentare. n exemplul urmator se creeaza o noua prezentare care este salvata imediat cu un nume prin aplicarea metodei SaveAs. Este de remarcat ca proprietatea Name a obiectului Presentation este read-only si prin urmare nu

225

poate fi modificata; astfel o prezentare este identificata n mod unic prin numele sau ntr-un proiect. Numele poate fi utilizat n mod uzual pentru a obtine o referinta prin intermediul colectiei Presentations: Presentations.Add.SaveAs "Sales Report" Presentations("Sales Report").Slides.Add 1, ppLayoutTitle Importul unei 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 reprezentnd 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 nct anumite atribuiri produc n mod automat efecte asupra altor parametri (de exemplu o latime mai mare dect naltimea produce o orientare landscape). Proprietatile sunt: 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

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 cteva n continuare, fiecare necesitnd nsa o cautare n Help deoarece returneaza colectii de obiecte complexe. Background - returneaza un obiect ShapeRange reprezentnd background-ul diapozitivului. ColorScheme - returneaza sau stabileste obiectul ColorScheme reprezentnd 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 reprezentnd toate elementele care au foest plasate sau inserate n master. Colectia poate contine desene, forme (shapes), obiecte OLE, imagini etc. TextStyles - returneaza colectia TextStyles reprezentnd trei stiluri de text: title text (stilul titlului), body text (textul din interiorul diapozitivului) si default text (textul din forme grafice shapes). Urmatorul exemplu stabileste umplerea fundalului diapozitivului master: ActivePresentation.SlideMaster.Background.Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientBrass Daca se doreste ca o forma specifica, cum ar fi o imagine sau un control ActiveX, sa apara pe toate slide-urile unei prezentari, aceasta se va adauga la master. Un control ActiveX de pe master va raspunde la evenimente din prezentarea diapozitivelor la fiecare click pe control, pe orice slide s-ar afla. Modificarile uniforme ale textului se realizeaza prin intermediul stilurilor. Fiecare obiect 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 nti). Exemplul urmator utilizeaza aceste proprietati pentru o formatare: With ActivePresentation.SlideMaster.TextStyles(ppBodyStyle).Levels(1) With .Font .Name = "Arial" .Size = 36 End With

227

With .ParagraphFormat LineRuleAfter = False .SpaceAfter = 6 End With End With 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 ppPrintOutputOutline ppPrintOutputSlides (implicita) ppPrintOutputTwoSlideHandouts NumberOfCopies care returneaza sau stabileste numarul de copii tiparite. FitToPage care este True daca la tiparire se va scala diapozitivul nct sa se potriveasca foii de hrtie. Ranges care returneaza obiectul PrintRanges reprezentnd domeniile de dipozitive care se tiparesc. Collate care este True (si implicit) daca o copie a prezentarii este tiparita complet naintea copiei urmatoare. Exemplul urmator utilizeaza cteva asemenea proprietati: With ActivePresentation.PrintOptions .NumberOfCopies = 3 .Collate = True .Parent.PrintOut End With unde se remarca faptul ca proprietatea Parent returneaza obiectul Presentation caruia i se poate folosi proprietatea PrintOut. Salvarea unei prezentari Prima salvare a prezentarii, n care i se daun nume, se efectueaza prin metoda SaveAs: ppPrintOutputNotesPages ppPrintOutputSixSlideHandouts ppPrintOutputThreeSlideHandouts

228

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 nti 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 cteva 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 pna 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 cteva proprietati: With ActivePresentation.SlideShowSettings .StartingSlide = 2 .EndingSlide = 4 .RangeType = ppShowSlideRange .AdvanceMode = ppSlideShowUseSlideTimings

229

.LoopUntilStopped = True .Run End With unde se remarca faptul ca ultima instructiune apeleaza metoda Run, dupa ce s-au fixat atributele executiei. Accesul la 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 cnd 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 sfrsitul 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 cnd n proiectarea unei prezentari se insereaza noi diapozitive, se sterg diapozitive, se sorteaza etc., referirea prin indice nu returneaza ntotdeauna acelasi diapozitiv. Referirea prin numarul de identificare conduce mereu la acelasi diapozitiv. Proprietatea 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 Long newSlideID = ActivePresentation.Slides.Add(1,ppLayoutTitleOnly).SlideID ActivePresentation.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

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 ppLayoutClipartAndText sppLayoutLargeObject ppLayoutObjectAndText ppLayoutTable ppLayoutTextAndClipart ppLayoutTextAndTwoObjects ppLayoutTitleOnly ppLayoutTwoObjectsOverText ppLayoutVerticalTitleAndTextOverChart Exemplul urmator adauga un slide titlu la nceputul prezentarii active. ppLayoutChart ppLayoutChartAndText

ppLayoutClipArtAndVerticalText ppLayoutFourObject ppLayoutMediaClipAndText ppLayoutObjectOverText ppLayoutText ppLayoutTextAndMediaClip ppLayoutTextOverObject ppLayoutTwoColumnText ppLayoutVerticalText ppLayoutObject ppLayoutOrgchart ppLayoutTextAndChart ppLayoutTextAndObject ppLayoutTitle ppLayoutTwoObjectsAndText ppLayoutVerticalTitleAndText

231

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 sfrsit 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, msoGradientDaybreak End With metoda PresetGradient aplica un efect vizual caracterizat de trei parametri, Style, Variant si PresetGradientType, corespunznd 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

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 utiliznd una dintre metodele colectiei Shapes. O referinta la aceasta colectie se obtine prin proprietatea Shapes a obiectului Slide, colectia reprezentnd 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

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 cnta cnd 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 cteva dintre aceste proprietati. With ActivePresentation.Slides(1).SlideShowTransition .Speed = ppTransitionSpeedFast .EntryEffect = ppEffectStripsDownLeft .SoundEffect.ImportFromFile "c:\\bass.wav" .AdvanceOnTime = True .AdvanceTime = 5 End With ActivePresentation.SlideShowSettings.AdvanceMode = _ ppSlideShowUseSlideTimings n exemplu se 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 reprezentnd 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 ct posibil, independent de selectie. Crearea unei selectii

234

Se poate obtine o selectie fie n mod manual, fie aplicnd 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

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, ct 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

.PointerType = ppSlideShowPointerPen End 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. Cnd 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.Copy Windows(2).View.Paste Operatiunea de alipire depinde de viziunea ferestrei. Situatiile posibile de copiere a continutului din Clipboard sunt prezentate n tabelul urmator. Viziunea Slide view sau notes page view Se poate alipi Shapes, text sau diapozitive ntregi. Formele alipite sunt adaugate n top-ul ordinei pe z si nu nlocuiesc formele selectate. Daca este selectata o forma, textul alipit va fi adaugat la textul formei; daca este selectat text, textul alipit nlocuieste selectia; daca nu este selectat nimic, textul alipit este plasat ntr-un text frame propriu. Daca se alipeste un ntreg slide, o imagine a slide-ului este inserata pe diapozitiv, master sau pagina de note ca

237

un obiect scufundat. 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.Copy With Windows(2) .ViewType = ppViewSlide .View.Paste End With Alte constante pentru viziuni sunt grupate n PpViewType: ppViewHandout, ppViewNotesPage, ppViewHandoutMaster, ppViewNotesMaster, ppViewOutline, ppViewSlide, ppViewSlideSorter

ppViewSlideMaster, ppViewSlideShow, 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

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. Utiliznd 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 cnd apare un shape pe un anumit slide n timpul prezentarii. Urmatorul exemplu fixeaza forma a doua de pe primul slide sa devina animata n mod automat dupa cinci secunde. With ActivePresentation.Slides(1).Shapes(2).AnimationSettings .AdvanceMode = ppAdvanceOnTime .AdvanceTime = 5 .TextLevelEffect = ppAnimateByAllLevels .Animate = True End With La lucrul cu proprietatile obiectului 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 dect daca forma respectiva este animata, adica proprietatea Animate este fixata pe True. n animarea textului proprietatea TextUnitEffect stabileste unitatea de animatie (cuvnt, paragraf etc) prin ppAnimateByCharacter, ppAnimateByParagraph, ppAnimateByWord sau ppAnimateUnitMixed. Proprietatea TextLevelEffect (care interactioneaza cu precedenta la anumite valori) stabileste nivelul ierarhic al textului animat: ppAnimateByAllLevels ppAnimateByFourthLevel ppAnimateLevelMixed ppAnimateByFifthLevel ppAnimateBySecondLevel ppAnimateLevelNone. PpAnimateByFirstLevel PpAnimateByThirdLevel

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

Proprietatea AfterEffect controleaza ce se ntmpla dupa ce forma a devenit animata. Daca forma a fost animata si alta forma nu este animata dupa ea, atunci efectele ulterioare nu sunt vizibile. n plus, efectul proprietatii DimColor nu este vizibil dect 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 reprezentnd, respectiv, actiunile la click sau trecerea mouse-ului pe deasupra formei sau textului n timpul unui slide show. With ActivePresentation.Slides(1).Shapes(3).TextFrame. _ TextRange.ActionSettings(ppMouseClick) .Action = ppActionHyperLink .HyperLink.Address = "http://www.microsoft.com" End With Unde se remarca utilizarea indexului de identificare a actiunii la click pe forma si definirea unei actiuni prin proprietatea Action. Valorile posibile pentru Action sunt constantele PpActionType: ppActionEndShow ppActionLastSlide ppActionFirstSlide ppActionHyperlink

ppActionLastSlideViewed ppActionMixed ppActionNone ppActionRunMacro

ppActionNamedSlideShow ppActionNextSlide ppActionOLEVerb ppActionRunProgram. ppActionPreviousSlide

Este de notat ca anumite actiuni sunt proprii doar unor tipuri de forme si se vor alege acele actiuni care sunt disponibile n interfata utilizator din PowerPoint pentru forma procesata. n urmatorul exemplu se stabileste ca, n slide show, atunci cnd a treia forma de pe al doilea diapozitiv este click-ata, culoarea formei este momentan inversata, se aude fisierul sound "applause" si prezentarea revine la primul slide. With ActivePresentation.Slides(2).Shapes(3) _ .ActionSettings(ppMouseClick) .Action = ppActionFirstSlide .SoundEffect.Name = "applause" .AnimateAction = True End With Daca se stabileste o proprietate a obiectului ActionSettings dar fara efectul scontat, se va verifica valoarea atribuita proprietatii Action. Tabelul care urmeaza ofera cteva precizari.

240

Daca se utilizeaza proprietatea Hyperlink

Pentru a efectua

Valoarea necesara pentru proprietatea Action ppActionHyperlink

Stabilirea proprietatilor pentru hiperlegatura care este urmarita ca raspuns la actiunea mouse-ului. Returnarea/stabilirea numelui programului executat ca raspuns la actiunile mouseului. Returnarea/stabilirea numelui procedurii macro executate ca raspuns la actiunea mouse-ului. Stabilirea verbului OLE care va fi invocat ca raspuns la actiunea mouse-ului. Stabilirea numelui slide showului propriu care se va executa ca raspuns la o actiune a mouse-ului.

Run

ppActionRunProgram

Run

ppActionRunMacro

ActionVerb

ppActionOLEVerb

SlideShowName

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 cnd se deruleaza un clip media. Urmatorul exemplu insereaza un movie numit "Clock.avi" n primul slide din prezentarea activa, fixeaza executia automata dupa animatia sau tranzitia precedenta, specifica continuarea show-ului n timp ce se executa filmul si specifica faptul ca obiectul movie este ascuns n timpul slide show-ului cu exceptia timpului cnd se executa. Set clockMovie = ActivePresentation.Slides(1).Shapes.AddMediaObject _ (FileName:="c:\\clock.avi", Left:=20, Top:=20) With clockMovie.AnimationSettings.PlaySettings .PlayOnEntry = True .PauseAnimation = False .HideWhileNotPlaying = True End With n functie de modul cum se insereaza clipul ca un obiect OLE (utiliznd comanda Object din meniul Insert sau utiliznd metoda AddMediaObject) sau ca un obiect media nativ (utiliznd meniul Movies and Sounds sau

241

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. Utiliznd 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 pna sunt oprite manual. Dim so As Shape For Each so In ActivePresentation.Slides(1).Shapes If so.Type = msoMedia Then If so.MediaType = ppMediaTypeSound Then so.AnimationSettings.PlaySettings.LoopUntilStopped = True End If End If Next

242

Meniuri si bare de unelte Modificarea interfetei cu utilizatorul Dialogul Customize Visual Basic Domeniul 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 PowerPoint Componente ale interfetei utilizator Sistemul 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 intrari Bare 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 box ID-uri de controale si intrari de meniu

243

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 o

Personalizarea/modificarea interfetei aplicatiei de baza Dialogurile create de utilizator.

n acest capitol se discuta prima categorie de actiuni: tehnicile prin care se poate adapta, completa sau modifica interfata cu utilizatorul propusa n mod standard n aplicatiile Microsoft Office 97. Se prezinta att actiunile permise de mediu (prin dialogul Customize comun aplicatiilor Word, Excel, PowerPoint, Access) asupra meniurilor si barelor de unelte afisate, ct 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 designtime, 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 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, 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

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 o

o 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; 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; click dreapta pe obiectul selectat si utilizarea comenzilor din meniul contextual pentru transformarile dorite. 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 utiliznd portiunea reprezentnd 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 reprezentnd 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 designtime prin caseta Customize. Sunt si situatii n care este nevoie de o combinatie programare + personalizare pentru a realiza configurarea dorita a mediului aplicatiei:
o 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. 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. Daca aplicatia gazda nu ofera o interfata pentru adaugarea sau modificarea boxelor text, listelor derulante drop-down sau combo box, trebuie utilizat codul Visual Basic pentru adaugarea si proiectarea acestor controale.

Se poate scrie cod si pentru modificarea meniului sistem n timp ce aplicatia se executa (de exemplu inhibarea unor comenzi sau adaugarea unui meniu etc.). Aceste modificari sunt cunoscute drept modificari n run-time.

245

Domeniul 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. 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. 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 cnd se porneste aplicatia. 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. 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. 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, nct 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

n caseta din stnga 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 actionnd 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 nti daca exista deja un obiect cu aceeasi denumire n spatiul de lucru. Daca nu, este creata un nou meniu sau bara de unelte n spatiul de lucru si se copie n acest nou obiect bara de meniu sau de unelte din caiet. n acest mod se dispune de un obiect care poate fi modificat, ascuns etc., obiect care si salveaza modificarile n spatiul de lucru la parasirea aplicatiei Excel. Nu exista nici un mijloc prin care sa se redenumeasca un meniu sau toolbar, nct la redeschiderea caietului spatiul de lucru contine deja obiectul cu numele respectiv si Microsoft Excel utilizeaza copia creata anterior n locul obiectului din caiet. Procedurile atasate ramn totusi cele din caiet, adica aplicatia distribuita traieste n continuare prin intrarile de meniuri sau unelte pastrate n spatiul de lucru. Acest mod de operare are accentul pus pe actiunile utilizatorului, care are dreptul sa-si organizeze spatiul de lucru dupa voie. Pentru a restaura versiunea originala distribuita, utilizatorul trebuie sa elimine copia din spatiul de lucru prin procedura explicata anterior. Microsoft 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

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 ntrun 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, reprezentnd 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 dect 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 ramn mereu vizibile si acest fapt conduce la o parcurgere mai usoara pentru determinarea comenzii dorite. Dezavantajele includ necesitatea mouse-ului (controalele nu pot fi accesate din tastatura) si ocuparea spatiului de lucru n detrimentul documentului principal. Pentru prezentarea unui set complex de optiuni se va utiliza o caseta 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

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 cte o multime de intrari n fiecare meniu. Fiecare menu este fie un meniu, un submeniu sau un meniu contextual. n continuare termenul de componenta se refera n mod generic la un meniu sau o intrare ntr-un meniu. O bara de meniu este o bara asezata n partea superioara a ferestrei active si care afiseaza numele tuturor meniurilor care sunt permise n aplicatie la un moment dat. O aplicatie din Microsoft Office poate sa modifice bara de meniu afisata ca urmare a modificarii ferestrei active (de exemplu editarea unui obiect chart) sau ca raspuns la instructiuni Visual Basic.

Un meniu este o lista de intrari care apare (se deruleaza) la click pe numele meniului din bara de meniu. Un submeniu (child menu) este un meniu atasat de o latura a altui meniu (parent menu), adiacent unei captari particulare a submeniului, localizata n meniul parinte. Fiecare captare de submeniu este marcata cu o sageata punctnd spre dreapta. Submeniurile se pot adauga si la meniurile contextuale. Un submeniu este afisat atunci cnd se puncteaza captarea corespunzatoare din meniul parinte. Un meniu contextual este un meniu flotant n document si care contine un grup de comenzi adecvate pentru o anume actiune (de exemplu procesarea unui paragraf). Meniul contextual este afisat atunci cnd utilizatorul executa un click dreapta pe un obiect care are atasat un asemenea meniu. Actiuni de adaptare a sistemului de meniuri Sistemul de meniuri se poate modifica ntr-o aplicatie Microsoft Office n diferite moduri:
o o o o o

crearea de noi bare de meniu adaugarea de noi meniuri la barele preconstruite sau personale adaugarea de noi intrari (comenzi sau captari de submeniuri) la meniuri si submeniuri existente (built-in sau custom) adaugarea si modificarea meniurilor contextuale 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

Se alege modificarea unui meniu predefinit atunci cnd interventia este minima (de exemplu includerea unui meniu care este legat de o macro). Daca este necesara o interventie masiva, atunci se prefera crearea unei noi bare de meniu si adaugarea componentelor proprii pe aceasta bara. 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 att n Visual Basic, ct 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

Visual Basic Prin metoda Add a colectiei CommandBars se creeaza o noua bara de meniu; argumentul MenuBar al metodei Add determina cnd 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

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 nti 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 nti pe meniu si pe urma din titlu n titlu pna se deschide nivelul unde are loc atasarea. Click dreapta pe noul submeniu pentru a-i fixa numele n zona 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 att cu ampersand. ct 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

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 cnd modulul de cod este disponibil. Orice copie a intrarii de meniu (care activa comanda built-in), de pe orice meniu, va executa procedura nlocuitoare. Microsoft PowerPoint Se procedeaza la fel ca n Microsoft Word.

253

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

o o

Utilizarea unui buton predefinit: click dreapta pe comanda, Change Button Image si selectarea imaginii dorite din caseta afisata. 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. Copierea unei imagini dintr-un program de grafica: n programul de grafica se deschide imaginea dorita, selectarea si copierea imaginii (preferabil de marime 1616 pixeli), comutarea la aplicatia Office, click dreapta pe comanda si click Paste Button Image. Editarea imaginii curente a unui buton: click dreapta pe comanda, Edit Button Image, se editeaza imaginea n dialogul afisat si OK. 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 o o

Se afiseaza dialogul Customize. Se afiseaza bara de meniu pe care se afla meniul dorit. 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 indicnd 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

.Controls.Add(Type:=msoControlButton, Before:=3) With databaseItem .Caption = "Open Database" .OnAction = "OpenDatabaseProc" End With Exista multe proprietati ale obiectelor reprezentnd comenzile din meniuri, proprietati care pot fi fixate n Visual Basic. Pentru mai multe informatii se va studia obiectul 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 o o o

Se afiseaza dialogul Customize. n fisa Toolbars click New. n boxa Toolbar name se introduce numele noului menu contextual si OK. Este afisat un meniu flotant, vid, cu numele dat. Click Properties pentru afisarea dialogului Toolbar Properties.

255

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 reprezentnd meniul contextual. Opernd 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 att prin simplificarea interfetei (mai ales pentru utilizatori lipsiti de experienta) ct si prin introducerea accesului direct la fuctionalitatea proiectului. Este de notat ca se pot restaura componentele built-in eliminate, dar nu si componentele proprii. Acestea trebuiesc create din nou. Dialogul Customize Cu dialogul Customize deschis se poate elimina orice componenta de meniu prin
o o o

Se deschide dialogul Customize Se afiseaza bara de meniu unde se afla componenta dorita. 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

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

Afisarea dialogului Customize. Vizualizarea barei de meniu necesare. 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 reprezentnd o componenta buit-in produce restaurarea componentei, dupa modelul CommandBars("Chart Menu Bar").Controls("Edit").Reset aplicabila n Excel sau CommandBars("Menu Bar").Reset care restaureaza, n Word, bara de meniuri sistem. Modificarile sistemului de meniuri n executie (run-time) Sistemul de meniuri create n timpul proiectarii poate fi programat astfel nct sa raspunda dinamic la modificarea conditiilor din timpul executiei. Se poate nlocui bara de meniu implicita cu o bara proprie. Daca o anumita intrare nu este adecvata ntr-un context dat, atunci ea poate fi inhibata sau eliminata. O intrare care reprezinta o optiune cu doua stari, se poate reprezenta imaginea ei ca un buton apasat sau nu. Se poate, de asemenea, redenumi o comanda dupa actiunea posibila asupra unei entitati (de genul Hide Show). Este de nteles ca toate aceste modificari pot fi efectuate n timpul executiei prin cod Visual Basic. Afisarea unei 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

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 cnd documentul este activ; acest mod de operare reduce aglomerarea inutila a interfetei. Se poate limita viata unei componente de meniu doar la perioada n care este deschis sau activ documentul caruia i se aplica. O alternativa este ca asocierea document componenta de meniu sa se gestioneze prin stabilirea proprietatii 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 cnd documentul sau sablonul este disponibil n contextul curent si ascunse atunci cnd documentul sau template-ul nu este disponibil. Prin contrast, deoarece Microsoft Excel memoreaza personalizarile la nivel de spatiu de lucru, modificarea dinamica a interfetei se realizeaza prin schimbarea proprietatii 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 nct 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

Sub DatabaseView() With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database") If .State = msoButtonUp Then .State = msoButtonDown ' comutare la viziunea database Else .State = msoButtonUp ' comutare la viziunea worksheet End If End With End Sub n timpul 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 If End With End Sub Redenumirea unei intrari de meniu Proprietatea Caption contine denumirea intrarii. Modificnd valoarea proprietatii se poate prezenta utilizatorului o comanda adecvata contextului curent. Exemplul urmator arata cum se poate utiliza acest fapt. Se ncepe prin inserarea unei comenzi Open Database, moment n care comanda se nlocuieste cu comanda Close Database, adecvata contextului: CommandBars("MyMenuBar").Controls("File").Controls("Open Database") _ .Caption = "Close &Database" La redenumirea intrarii trebuie avut grija ca alte proceduri care se refera la comanda sa utilizeze n referinte noul nume. Se poate utiliza, evident, o variabila care se refera la intrarea de meniu, ceea ce nlatura problemele suplimentare care apar la redenumire: Set openDatabase = CommandBars(("MyMenuBar"). _ Controls("File").Controls("Open Database") Schimbarea titlului se efectueaza prin openDatabase.Caption = "Close &Database"

259

Bare de unelte Fiecare aplicatie Microsoft Office ofera un sistem de bare de unelte (toolbar) continnd controale pe care utilizatorul le actioneaza pentru a avea acces la comenzile frecvente. Fiecare toolbar poate sa apara depozitat (docked) la una dintre laturile ferestrei aplicatiei sau ca o fereastra flotanta pozitionata oriunde n spatiul de lucru. Fiecare control de pu un toolbar este control grafic prin care utilizatorul poate schimba informatii cu aplicatia Visual Basic. Afisarea unei bare de unelte ntr-o aplicatie Office se realizeaza prin meniul 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 oricnd. Modificarile pot fi efectuate n timpul proiectarii (design-time) sau n timpul executiei (run-time) prin proceduri Visual Basic. Este preferabil ca modificarile principale sa se efectueze n timpul proiectarii si doar eventualele modificari dinamice, functie de actiunile utilizatorului, sa se efectueze n run-time. O schimbare frecventa a sistemului de meniuri poate ngreuna actiunile utilizatorului. Utilizarea meniurilor

260

La orice bara de unelte, built-in sau proprie, se pot adauga controale pop-up, aceleasi ca la crearea meniurilor/submeniurilor. Aceasta actiune este un compromis acceptabil ntre modificarea unei bare de meniu si introducerea unui mare numar de butoane unelte. Reamintim butonul 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 att la barele de unelte built-in ct si la barele proprii. Aceste controale pot fi utile pentru obtinerea repetata a unor informatii de la utilizator sau pentru executarea unei proceduri dependente de valoarea controlului. Dialogul 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 (builtin 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

Adaugarea si gruparea controalelor Pe lnga 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. Utiliznd meniul contextual afisat pentru noul control se stabilesc atributele sale. Este de revazut si observatia facuta la subiectul similar de la meniuri privind procedurile proprii care au acelasi nume cu controalele built-in. Microsoft 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

Stilul Default Style Text Only (n meniuri) Text Only (n rest) Image And Text

Aspectul butonului Numai imaginea butonului Numai imaginea butonului Numai numele Imaginea si numele

Atunci cnd 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 specificnd 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 reprezentnd controlul. Se utilizeaza Controls(index), unde index este titlul sau indicele controlului, pentru a returna obiectul reprezentnd controlul. Adaugarea si initializarea controalelor text box, list box si combo box

263

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 specificnd drept tip al controlului (n argumentul Type) una dintre valorile Controlul Text box List box Combo box Argumentul Type msoControlEdit msoControlDropDown msoControlComboBox

Se poate folosi proprietatea Style a unui control text box, list box sau combo box pentru a indica daca titlul (textul) apare n stnga boxei respective. Urmatorul exemplu adauga un control combo box cu eticheta "Quarter" la o bara de unelte proprie si atribuie controlului macro-ul cu numele "ScrollToQuarter". Set newCombo = CommandBars("Custom1").Controls. _ Add(Type:=msoControlComboBox) With newCombo .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 cnd 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 att pentru ca unele actiuni sunt executate prin interfata proprie proiectata, ct si pentru simplificarea interfetei cu un utilizator mai putin experimentat. Restaurarea configuratiilor standard este posibila pentru barele de unelte built-in. Barele de unelte si controalele proprii trebuiesc create din nou n vederea restaurarii unei configuratii initiale. Dialogul Customize Pentru a sterge un control:
o o

Se deschide dialogul Customize. Se afiseaza bara de unelte care se modifica prin fisa Toolbars.

264

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

Se afiseaza dialogul Customize. n fisa Toolbars se selecteaza bara de unelte care se restaureaza. 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 nct sa raspunda dinamic la schimbarile de conditii din timpul executiei. Actiunile posibile uzuale sunt interzicerea accesului la un buton si comutarea imaginii apasat/ridicat. Afisarea sau 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 cnd 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 cnd utilizatorul face click pe intrarea din meniu. Sub ViewMyAppToolbar() With CommandBars("Worksheet Menu Bar").Controls("View"). _ Controls("View MyToolbar") If .State = msoButtonUp Then

265

.State = msoButtonDown CommandBars("MyAppTools").Visible = True Else .State = msoButtonUp CommandBars("MyAppTools").Visible = False End If End With End Sub Atunci cnd 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 CommandBars If cb.BuiltIn Then cb.Reset Else cb.Delete End 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

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 reflectnd 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 cnd referinta este necesara:
o o 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. Se adauga o intrare built-in la un meniu sau la o bara de unelte n run-time. 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

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. 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 = 4000 Open "c:\ids.txt" For Output As #1 ' crearea unei bare temporare cu toate elementele disponibile asignate Set cbr = CommandBars.Add("Temporary", msoBarTop, False, True) For i = 1 To maxId On Error Resume Next cbr.Controls.Add ID:=i Next On Error GoTo 0 ' scrierea ID si titlu pentru fiecare control For Each btn In cbr.Controls Write #1, btn.ID, btn.Caption Next ' eliminarea barei de comanda si nchiderea fiserului de iesire cbr.Delete Close #1 End Sub
o

Executarea procedurii urmatoare ntr-o aplicatie Office pentru a crea un set de bare de unelte proprii care contin attea butoane cte valori valide de proprietate 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 used Const maxId = 3900 On Error GoTo realMax For bars = 0 To 13 firstId = bars*300 lastId = firstId + 299 Set tb = CommandBars.Add For i = firstId To lastId Set btn = tb.Controls.Add btn.FaceId = i btn.ToolTipText = "FaceId = " & i Next tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(lastId)) tb.Width = 591 tb.Visible = True Next ' Delete the button that caused the error and set toolbar name realMax:

268

btn.Delete tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(i1)) tb.Width = 591 tb.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

Forme grafice (shapes) si stratul de desen Obiectele Shape, ShapeRange si Shapes Returnarea colectiei Shapes Returnarea obiectului Shape Returnarea colectiei ShapeRange Desenarea unei forme grafice Editarea unei forme grafice Determinarea proprietatilor/metodelor adecvate Lucrul cu obiecte OLE Lucrul cu mai multe forme Construirea unui obiect ShapeRange Lucrul cu colectia ShapeRange Visual Basic dispune de un model de obiecte, reprezentnd stratul de desen, comun aplicatiilor Microsoft Word, Microsoft Excel si Microsoft PowerPoint. Obiectul cel mai sus n ierarhia acestui model este colectia 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, reprezentnd 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 cnd se adauga forme pe stratul de desen sau se parcurg toate formele; se utilizeaza obiectul Shape cnd se doreste formatarea sau procesarea unei anumite forme grafice si se utilizeaza colectia ShapeRange cnd se doreste procesarea/formatarea unui grup de forme grafice. O colectie ShapeRange poate contine oricte 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

myDocument.Shapes(3).Duplicate myDocument.Shapes("Red Square").Duplicate Fecare forma are un nume atribuit n mod implicit, cum ar fi "Rectangle 3", obtinut la adaugarea formei la colectia 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 cnd se scrie cod direct, sau se editeaza codul generat de macro recorder, se poate crea un cod mai eficient prin returnarea formelor direct din colectia 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 Callout Note atasabile (doar PowerPoint) Linie sau curba care conecteaza doua forme diferite Curba Bzier Metoda AddCallout AddComment AddConnector Parametri (Type, Left, Top, Width, Height, Anchor) (Left, Top, Width, Height) (Type, BeginX, BeginY, EndX, EndY) (SafeArrayOfPoints)

AddCurve

271

Control nativ de formular Excel (doar Microsoft Excel) Eticheta Linie Sound sau movie (doar PowerPoint) Control ActiveX (doar Word; pentru Excel si PowerPoint se utilizeaza AddOLEObject) Obiect OLE scufundat sau legat

AddFormControl

(Type, Left, Top, Width, Height)

AddLabel AddLine AddMediaObject AddOLEControl

(Orientation, Left, Top, Width, Height) (BeginX, Beginy, EndX, EndY) (FileName, Left, Top, Width, Height) (ClassType, Left, Top, Width, Height, Anchor)

AddOLEObject

(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height, Anchor) (FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height, Anchor) (Type, Left, Top, Width, Height)

Imagine

AddPicture

Rezervare de loc pentru text sau pentru un obiect grafic (doar PowerPoint) Linie poligonala nchisa sau deschisa AutoShape (forma predefinita) TextBox WordArt

AddPlaceholder

AddPolyline AddShape

(SafeArrayOfPoints) (Type, Left, Top, Width, Height)

AddTextbox AddTextEffect

(Orientation, Left, Top, Width, Height) (PresetTextEffect, Text, FontName, FontSize, FontBold, FontItalic, Left, Top, Anchor) (EditingType, X1, Y1)

Titlu de diapozitiv (doar PowerPoint) Forma libera

AddTitle BuildFreeform ConvertToShape

272

ntre parametri se remarca Left si Top care specifica pozitia formei, Width si Height care fixeaza dimensiunile obiectului grafic. Pentru explicatii suplimentare asupra parametrilor care nu sunt suficient de expliciti se vor studia intrarile respective din Help. 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 = 100 End With Proprietati si metode specifice Atributele specifice unui anumit tip de forma sunt grupate sub obiecte secundare, cum ar fi FillFormat, continnd proprietatile care se aplica formelor cu culori de umplere, sau CalloutFormat, continnd toate proprietatile baloanelor (callouts). Pentru a lucra cu acest tip de atribute trebuie sa se returneze mai nti obiectele care le contin. De exemplu, se utilizeaza proprietatea 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 cuvntul "Format" existent n obiectul returnat (precum Fill care returneaza FillFormat). Proprietatea obiectului Shape Callout ConnectorFormat (Excel si PowerPoint) ControlFormat (Excel) ControlFormat Controale de formular native Obiectul returnat CalloutFormat ConnectorFormat Aplicabil la Baloane de dialog Conectori de forme

273

Fill

FillFormat

Forme cu culori de umplere (toate cu exceptia liniilor) Toate formele (LineFormat reprezinta linia sau chenarul) Obiecte OLE legate, imagini legate (doar Word), cmpuri legate (doar Word) Obiecte OLE Imagini si obiecte OLE Toate formele Obiecte WordArt Forme care pot fi reliefate Forme care pot fi nconjurate de text

Line

LineFormat

LinkFormat

LinkFormat

OLEFormat PictureFormat Shadow TextEffect ThreeD WrapFormat (doar Word)

OLEFormat PictureFormat ShadowFormat TextEffectFormat ThreeDFormat WrapFormat

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, cnd 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 If Next 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 nct sa se obtina o multime consistenta de atribute. Din acelasi motiv multe atribute sunt read-only, valorile lor fiind atribuite n functie de metodele utilizate. Tipul de umplere se stabileste printr-una dintre metodele Background (doar PowerPoint), OneColorGradient, Patterned, PresetGradient, PresetTextured, Solid, TwoColorGradient, UserPicture

274

sau UserTextured, corespunznd 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 Shape Set sh = ThisDocument.Shapes.AddShape(msoShapeRectangle, 90, 90, 90, 50) sh.WrapFormat.Type = wdWrapTight With sh.Fill .ForeColor.RGB = RGB(200, 0, 0) .BackColor.RGB = RGB(0, 200, 170) .TwoColorGradient msoGradientHorizontal, 1 .Visible = msoTrue End With End Sub 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 = 4 End With Proprietatea ThreeD a obiectului Shape returneaza un obiect ThreeDFormat care controleaza reliefarea formei. Urmatorul exemplu adauga efectul de extrudare si precizeaza o adncime de 50 de puncte, purpurie, perpendiculara si luminata de sus With sh.ThreeD .Visible = msoTrue .Depth = 50 .ExtrusionColor.RGB = RGB(255, 0, 255) .Perspective = msoFalse .PresetLightingDirection = msoLightingTop End With Este normal ca acest efect sa nu fie suportat de anumite forme. 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

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 If End 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 vrful ierarhiei modelului de obiecte al aplicatiei care a creat obiectul OLE. Urmatorul exemplu, executat din Microsoft Excel (se va remarca dubla utilizare a proprietatii 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

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 If Next 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 utiliznd acest tablou. Urmatorul exemplu construieste un domeniu de forme cu toate formele de tip AutoShapes din document si apoi le grupeaza. With myDocument.Shapes numShapes = .Count 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 If End With

277

Lucrul cu colectia ShapeRange Atunci cnd 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 cnd se utilizeaza o proprietate sau metoda care se poate aplica doar pentru un obiect.

Aceste principii actioneaza si atunci cnd se lucreaza cu proprietati sau metode ale formelor, grupate n obiecte secundare ale colectiei 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 With End With

278

Вам также может понравиться