Sunteți pe pagina 1din 291

CUPRINS VBA - Bazele programarii Instructiunile VBA Operatiuni de intrare-iesire Visual Basic Editor Modele de obiecte Obiecte Microsoft

rosoft Word Obiectul Application Propriet i (obiectul Application) DisplayScrollBars DisplayStatusBar Height Width WindowState ActiveDocument ActivePrinter ActiveWindow Documents Selection Windows Metode (obiectul Application) Quit Obiectul Document Referirea unui Document Deschiderea documentelor Crearea/salvarea documentelor Activarea unui document Tiprirea unui document nchiderea documentelor Accesarea obiectelor din Document Obiectul Range Obiect Range sau obiect Selection Referin a prin metoda Range Referin a prin proprietatea Range Modificarea unui document Lucrul cu textul din Range Redefinirea unui obiect Range Atribuirea obiectelor Range Obiectul Selection Deplasarea i extinderea selec iei Metoda GoTo Metodele GoToNext, GoToPrevious Obiecte accesibile din Selection Selection propriet i i metode uzuale Proprietatea Text Formatarea textului selectat Returnarea obiectului Range Proprietatea Information Determinarea tipului de selec ie Obiectele Find i Replacement Find ClearFormatting Execute Selection.Find Range.Find Replacement Obiectele Table, Column, Row i Cell Colec ia Tables Obiectul Table Colec ia Columns Obiectul Column Colec ia Rows, obiectul Row Colec ia Cells Obiectul Cell Exemple cu obiectele Table, Column, Row i Cell Utilizarea obiectului HeaderFooter Colec ia Styles Obiectul Style Colec ia CommandBars Colec ia Dialogs Cmpuri adugare, editare Verificarea unui obiect Modificarea comenzilor Word Lucrul cu evenimente Evenimente pentru Document Evenimente pentru Application Evenimente pentru ActiveX Auto Macro Automatizarea aplica iilor Automatizarea Word din alt aplica ie Automatizarea altei aplica ii din Word Comunicarea cu obiectele scufundate Controale ActiveX si Dialoguri Proiectarea casetelor de dialog utilizator Crearea unui nou dialog Scrierea procedurilor de rspuns la evenimente Controale Label TextBox ListBox ComboBox CheckBox OptionButton ToggleButton CommandButton TabStrip MultiPage Frame

Image Utilizarea dialogurilor utilizator Afiarea unui dialog Ob inerea/editarea propriet ilor n execu ie Utilizarea controalelor n documente Word, Excel, PowerPoint Controale ActiveX n documente Word Controale ActiveX n foi de calcul Excel Controale ActiveX n diapozitive PowerPoint Controlarea programatic a controalelor din documentele aplica iilor Obiecte Microsoft Excel Obiectul Application Obiectul Workbook Deschiderea unui Workbook Metoda GetOpenFilename Crearea/salvarea unui Workbook Metoda Add (colec ia Workbooks) Metoda SaveAs Metoda Save Metoda GetSaveAsFilename nchiderea unui Workbook Metoda Close Obiectul Range Referin e de tip A1 sau nume de domeniu Utilizarea indicilor de linii i coloane Utilizarea propriet ii Offset Utilizarea propriet ilor CurrentRegion i UsedRegion Parcurgerea unui domeniu de celule Utilizarea instruc iunii For EachNext Utilizarea instruc iunii DoLoop Utilizarea propriet ii Address Evenimentele din Excel 97 Permiterea i inhibarea evenimentelor Utilizarea evenimentelor Evenimentele obiectului Worksheet Exemplu Evenimentele obiectului Chart Exemplu Evenimentele obiectului Workbook Exemplu Evenimentele obiectului Application Utilizarea modulelor clas cu evenimente

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

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

nregistrarea unei surse de date ODBC Utilizarea DAO cu ODBCDirect Obiectul DBEngine Colec ia Workspace Colec ia Connections Deschiderea conectrilor asincrone Colec ia Databases Comutarea ntre Connection i Database Colec ia QueryDefs Executarea interogrilor asincrone Colec ia Parameters Colec ia Recordsets Obiecte Recordset de tip dinamic Deschiderea asincron a obiectelor Recordset Colec ia Fields Utilizare ODBCDirect Utilizarea actualizrii optimiste n lot Tratarea coliziunilor Utilizarea cursoarelor n spa iile ODBCDirect Caracteristicile cursoarelor Cursoare client-side sau server-side Alegerea tipului de cursor Blocarea nregistrrilor Limitri ale cursoarelor Regsirea mul imilor multiple de rezultate Lucrul cu proceduri memorate Obiecte Microsoft PowerPoint Obiectul Application Returnarea unui obiect Application Controlul aspectului ferestrei aplica iei Controlarea atributelor i comportrii globale Accesarea principalelor obiecte Accesarea obiectelor partajate de Ms Office Obiectul Presentation Returnarea obiectului Presentation Deschiderea unei prezentri Crearea unei prezentri Importul dintr-un outline Word Activarea unei prezentri

Numerotarea i dimensiunile slide-urilor Stabilirea unui aspect unitar Tiprirea unei prezentri Salvarea unei prezentri nchiderea unei prezentri Configurarea i executarea unei prezentri Accesul la diapozitivele prezentrii Obiectele Slides, Slide i SlideRange Returnarea colec iei Slides Returnarea unui obiect Slide Returnarea unui obiect SlideRange Adugarea unei diapozitiv Stabilirea fundalului i schemei de culori Alegerea unui layout Adugarea de obiecte Ordinea diapozitivelor Stabilirea efectelor tranzi iei Referirea notelor Obiectul Selection Crearea unei selec ii Returnarea unei selec ii Returnarea unui obiect din selec ie Obiectele View i SlideShowView Prezentri, ferestre, viziuni Returnarea obeictelor View i SlideShowView Navigarea printre diapozitive Alipirea la un obiect View Controlul viziunii din fereastra documentului Returnarea diapozitivului curent Controlul obiectelor n slide show Controlul anima iei Rspunsul la ac iunea mouseului Controlul unui clip Meniuri si bare de unelte Modificarea interfe ei cu utilizatorul Dialogul Customize Visual Basic Domeniul schimbrilor asupra interfe ei utilizator Microsoft Access Microsoft Excel

Mutarea unui element din spa iul de lucru n caiet Eliminarea unui meniu/toolbar salvat n caiet Microsoft Word Microsoft PowerPoint Componente ale interfe ei utilizator Sistemul de meniuri Adaptarea sistemului de meniuri Componente personale i componente built-in Utilizarea submeniurilro Utilizarea meniurilor contextuale Text box, List box, Combo box Modificarea n design-time Adugarea de bare de meniu proprii Adugarea meniurilor Adugarea submeniurilor Adugarea i gruparea comenzilor Adugarea i modificarea meniurilor contextuale tergerea componentelor de meniu Restaurarea componentelor built-in Modificarea n run-time Afiarea unei bare de meniu Afiarea dinamic a componentelor de meniu Permiterea i inhibarea componentelor de meniu Indicarea strii unei intrri de meniu Redenumirea unei intrri Bare de unelte Adaptarea barelor de unelte Utilizarea meniurilor Text box, List box, Combo box Modificarea barelor de unelte n design-time Adugarea unei bare de unelte Adugarea i gruparea controalelor Adaugarea i ini ializarea controalelor text box, list box, combo box Eliminarea unui control Restaurarea barelor de unelte built-in Modificarea barelor de unelte n run-time

Afiarea/ascunderea controalelor i barelor de unelte Mutarea i redimensionarea barelor de unelte Restaurarea barelor de unelte built-in Permiterea i interzicerea accesului la controale Indicarea strii activ/inactiv a unui buton Modificarea controalelor Text box, List box i Combo box ID-uri de controale i intrri de meniu Forme grafice Obiectele Shape, ShapeRange i Shapes Returnarea colec iei Shapes Returnarea obiectului Shape Returnarea colec iei ShapeRange Desenarea unei forme grafice Editarea unei forme grafice Determinarea propriet ilor/metodelor adecvate Lucrul cu obiecte OLE Lucrul cu mai multe forme Construirea unui obiect ShapeRange Lucrul cu colec ia ShapeRange Tratarea erorilor. Depanarea programelor Cum se gestioneaz erorile Proiectarea unei rutine de tratare a erorilor Stabilirea capcanei de erori Scrierea unei rutine de tratare a erorilor Ieirea din rutina de tratare a erorilor Diferen a dintre Resume i Resume Next Reluarea execu iei la o linie specificat Ierarhia de tratare a erorilor Cutarea n lista de apeluri Indica ii pentru o tratare complex a erorilor Testarea tratrii erorilor prin generarea de erori Definirea codurilor proprii de eroare Tratarea inline a erorilor Returnarea numerelor de eroare

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

Trucuri utile n fereastra Immediate Considera ii speciale Oprirea execu iei n procedurile evenimentelor MouseDown sau KeyDown Oprirea execu iei n procedurile evenimentelor GotFocus sau LostFocus Distribuirea solutiilor VBA pentru aplicatiile Microsoft Office Pregtirea solu iei pentru distribuire Alegerea modului de mpachetare a solu iei Controlul ncrcrii ncrcarea la start ncrcarea automat n Excel ncrcarea automat n PowerPoint ncrcarea add-in-urilor din sesiunea precedent ncrcarea programatic ncrcarea ca rspuns la un eveniment ncrcarea unui template prin linia de comand Descrcarea programatic ncrcarea la cerere Utilizarea referin elor explicite n Excel ncrcare unei biblioteci n Excel Adugarea meniurilor Excel fr add-in ncrcarea la cerere n PowerPoint

ncrcarea la cerere din Word Codul executat la ncrcare/descrcare Excel evenimentele AddinInstall i AddinUninstall PowerPoint procedurile Auto_Open i Auto_Close Word procedurile AutoExec i AutoExit Verificarea final a codului Referin e la ActiveWorkbook sau ActiveDocument Apelul procedurilor din alte proiecte Evitarea referin elor nerezolvate PowerPoint apelul unei rutine fr referin Referin e legate trziu Protejarea codului Salvarea solu iei ca un Add-in sau Global Template Crearea unui Add-in n Excel Crearea unui Add-in n PowerPoint Crearea unui template global n Word Depanarea unui Add-in sau Global Template Depanarea unui add-in n Excel Depanarea unui add-in n PowerPoint Depanarea unui template global n Word Distribuirea solu iilor prin Setup Wizard

1. BAZELE PROGRAMRII Visual Basic for Application (VBA) Tipuri de date Variabilele i constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre deosebire de alte limbaje de programare, exist un tip universal tipul Variant , care poate con ine aproape orice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct declararea explicit poate fi utilizat atunci cnd se dorete economisirea memoriei (tipul Variant aloc mai mult memorie), vitez n execu ie sau atunci cnd se scriu date ntr-un fiier n acces direct. Boolean Domeniu de valori: True sau False (valorile logice) Memorie: 2 bytes Declarator de tip: Observa ii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule produc True. Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1. Domeniu de valori: 0255 (numere ntregi, fr semn) Memorie: 1 byte Declarator de tip: Observa ii. Currency Domeniu de valori: -922 337 203 685 477.5808 922 337 203 685 477.5807 Memorie: 8 bytes Declarator de tip: @ Observa ii. Utilizate pentru calcule bneti (sau alte situa ii n care precizia este foarte important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a ob ine 15 cifre la partea ntreag i 4 cifre la partea zecimal (reprezentare n virgul fix). Domeniu de valori: 1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59 Memorie: 8 bytes Declarator de tip: Observa ii. Informa iile de tip dat calendaristic i/sau timp orar sunt memorate drept numere flotante, partea ntreag reprezentnd data calendaristic, partea frac ionar reprezentnd timpul. La convertiri, miezul nop ii este 0, miezul zilei este .5, numerele negative reprezint date nainte de 30 decembrie 1899. Poate fi atribuit ca valoare de tip date orice literal care reprezint o dat calendaristic recunoscut ca atare, literalul trebuind s fie cuprins ntre simboluri #, de exemplu #1 Jan 99#. Domeniu de valori: (vezi observa iile) Memorie: 12 bytes Declarator de tip: Observa ii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nso i i de un factor de scal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (fr parte zecimal), cea mai mare valoare posibil este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/7.9228162514264337593543950335 iar cea mai mic valoare nenul este +/0.0000000000000000000000000001. Not: Deocamdat, tipul Decimal poate fi utilizat doar ca subtip n Variant, adic nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin func ia Cdec (func ia for eaz o expresie s fie de un tip specificat, din aceeai categorie de func ii fiind i CBool, CByte etc.). Domeniu de valori: numere negative de la -1.79769313486232E308 pn la -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pn la 1.79769313486232E308 (numere flotante n dubl precizie). Memorie: 8 bytes

Byte

Date

Decimal

Double

Integer

Declarator de tip: # Observa ii. Domeniu de valori: -32 768 32 767. Memorie: 2 bytes Declarator de tip: % Observa ii. Domeniu de valori: -2 147 483 648 2 147 483 647. Memorie: 4 bytes Declarator de tip: & Observa ii. Domeniu de valori: (vezi observa iile) Memorie: 4 bytes Declarator de tip: Observa ii. Adrese pe 32 de bi i care se refer la obiecte. Prin instruc iunea Set se atribuie unei variabile declarate de tip Object referin a la obiectul dorit. Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataare trzie (la timpul execu iei run-time binding). Pentru o ataare timpurie (la timpul compilrii compile-time binding) se va utiliza o variabil declarat cu numele clasei respective. Domeniu de valori: numere negative de la -3.402823E38 pn la -1.401298E-45; numere pozitive de la 1.401298E-45 pn la 3.402823E38. Memorie: 4 bytes Declarator de tip: ! Observa ii.

Long

Object

Single

Domeniu de valori: ir de lungime variabil: pn la 2^31 caractere; ir de lungime fix: pn la 2^16 caractere. Memorie: 2 bytes Declarator de tip: $ Observa ii. Un ir de lungime fix declarat Public nu poate fi utilizat ntr-un modul de clas. Variant (default) Domeniu de valori: aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuri ale tipului Variant, cu men iunea c toate subtipurile numerice au domeniul de la Double. Memorie: n func ie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String necesit 22 bytes plus cte un byte pentru fiecare caracter. Declarator de tip: Observa ii. Este tipul specificat implicit (n lipsa unei declara ii explicite) pentru o constant, variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferen ele de tip ale argumentelor la apelul procedurilor). Cu excep ia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul Variant poate con ine orice alt tip de dat. n plus poate s con in valorile speciale Empty, Error, Nothing i Null. Tipul considerat pentru o dat con inut ntr-un Variant poate fi determinat cu func ia VarType sau TypeName. Valorile unei variabile Variant pot s-i converteasc valorile automat. n general, datele numerice sunt memorate n tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac rezultatul unei opera ii necesit acest fapt. De exemplu o valoare declarat ini ial drept Integer i atribuit unui Variant va fi memorat ca un ntreg pn 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). Dac depirea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare. Utilizarea tipului Variant permite o tratare mai diferen iat a irurilor de cifre: n opera ii numerice vor fi considerate numere iar n opera ii cu iruri vor fi considerate iruri. Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite.

String

Valorile speciale au semnifica ia: o o o Empty este valoarea unui Variant care nu a fost ini ializat. n calcule numerice este considerat 0 iar n opera ii cu iruri este irul de lungime zero. Null este valoarea unui Variant care, n mod programatic, nu con ine date. Error este valoarea utilizat pentru a arta ndeplinirea unei condi ii de eroare (prin convertirea unui real cu func ia CVErr). Procesarea se va efectua de ctre utilizator, tratarea automat a erorilor nu este activat la setarea acestor valori. Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv.

Tipuri definite de utilizator Un tip de dat definit de utilizator reprezint echivalentul unei nregistrri dintr-un fiier (baz de date), adic o grupare de entit i de tipuri diferite. Definirea are loc la nivel de modul, prin instruc iuni Type. Pentru clauzele care apar se va vedea discu ia de la domeniul variabilelor. [Private | Public] Type varname elementname [([subscripts])] As type [elementname [([subscripts])] As type] ... End Type unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utiliza i componente de tipuri utilizator deja definite. Componentele pot fi i tablouri, caz n care apar defini iile specifice (vezi declararea variabilelor). Declararea constantelor, variabilelor i tablourilor Nume La denumirea procedurilor, constantelor, variabilelor i argumentelor ntr-un modul Visual Basic se cere respectarea urmtoarelor reguli: primul caracter trebuie s fie o liter; nu se utilizeaz spa iu, punct (.), semnul exclamrii(!), sau caracterele @, &, $, # lungimea denumirii nu poate depi 255 de caractere; la acelai nivel de existen nu pot s existe denumiri identice. Pot s existe totui, n acelai modul, o variabil privat i o variabil la nivel de procedur care s poarte acelai nume.

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

Definirea unei constante se realizeaz prin instruc iunea Const, n care se poate specifica tipul, domeniul i valoarea constantei. Valoarea unei constante nu se poate schimba programatic. [Public | Private] Const constname [As type] = expression Public cuvnt cheie, op ional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din toate modulele. Nu este permis n proceduri. Private cuvnt cheie, op ional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile din modulul n care apare declara ia. Nu este permis n proceduri. constname numele constantei (obligatoriu). type tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nc nu este suportat), Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; n lipsa clauzei se va ataa automat tipul cel mai apropiat expresiei. expression combina ie de identificatori, constante, operatori (cu excep ia Is) care produce un sir, numr sau obiect. Nu se pot utiliza variabile, func ii utilizator sau func ii VBA predefinite. n mod implicit, constantele sunt private. La nivel de procedur, sau de modul clas, domeniul lor nu poate fi modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public. Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afara unei proceduri este definit n modulul respectiv. Mai multe declara ii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri de expresii. n acest caz, cuvintele Public sau Private care apar se aplic ntregii linii. Exemple Const NrLinii = 15 Public Const MesajInitial = "Tastati numarul de linii" Private Const NrLinii as Integer = 15 Public Const NrLinii = 15, Pondere as Single = 1.21 Este de remarcat c, n ultima linie, doar Pondere este de tip Single, n timp ce NrLinii este de tip Integer (n lipsa clauzei As type se atribuie tipul expresiei). Declararea variabilelor Variabilele, simple sau tablou, se definesc prin instruc iunile Dim, Private, Public, ReDim sau Static. Numele unei variabile trebuie s respecte regulile generale de formare a identificatorilor, tipul variabilei poate fi definit explicit (prin clauza As type) sau implicit (ca Variant). n cazul n care modulul con ine instruc iunea Option Explicit cu sintaxa Option Explicit

10

i care trebuie s apar naintea oricrei proceduri din modul, toate variabilele trebuie s fie declarate prin instruc iunile men ionate. Lipsa instruc iunii Option Explicit permite ca variabilele s fie definite acolo unde este nevoie de ele prin simpla men ionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim posibilitate poate produce erori greu detectabile. Sintaxa instruc iunilor de declarare a variabilelor este urmtoarea i se observ asemnarea clauzelor. Dim [WithEvents] varname[([subscripts])] [As [New] type] Private [WithEvents] varname[([subscripts])] [As [New] type] Public [WithEvents] varname[([subscripts])] [As [New] type] Static varname[([subscripts])] [As [New] type] ReDim [Preserve] varname(subscripts) [As type] varname numele variabilei (obligatoriu). subscripts dimensiunile tabloului de date (dac se declar o variabil tablou). Pot exista pn la 60 de indici, separa i prin virgule, declararea dimensiunilor pentru un indice fiind de forma [lower To] upper Limita inferioar este, implicit, 0, dar poate fi controlat prin instruc iunea Option Base. Dac nu se indic limitele indicilor (dar parantezele sunt prezente), se definete o variabil tablou dinamic (nu i prin Static) ale crei dimensiuni pot fi precizate/redefinite prin instruc iunea ReDim. New permite crearea implicit a unui obiect (atunci cnd se declar o variabil de tip obiect). O nou instan a obiectului este creat la prima referin a variabilei definite. Clauza nu poate s apar la declararea variabilelor de tipuri intrinseci i nici la declararea instan elor obiectelor dependente. type tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat nc), Date, String (pentru iruri cu lungime variabil), String * length (pentru iruri cu lungime fix), Object, Variant, tip utilizator sau tip de obiect. Dac se definesc mai multe variabile ntr-o instruc iune, defini iile se separ prin virgul iar clauza de tip nu este extins i la variabilele definite ulterior. Dei toate instruc iunile permit declararea unor variabile (simple sau tablou), fiecare instruc iune are un efect distinct n ceea ce privete vizibilitatea variabilelor i persisten a valorilor. Dim definete variabile att la nivel de modul ct i la nivel de procedur. Variabilele definite la nivel de modul sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedur sunt vizibile doar n procedura respectiv. Private este utilizat la nivel de modul pentru a declara variabile accesibile doar n procedurile acelui modul. Public este utilizat pentru a declara variabile accesibile n toate procedurile din toate modulele i din toate aplica iile. Prin includerea instruc iunii Option Private Module este posibil ca variabilele publice s fie vizibile doar n proiectul n care sunt definite. Static este utilizat la nivel de procedur nestatic pentru a declara variabile care i pstreaz valoarea de la o execu ie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit.

11

Variabilele definite prin Static sunt vizibile doar n procedura respectiv. Este de remarcat c se poate defini o ntreag procedur utiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice. ReDim este utilizat la nivel de procedur pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni i pstreaz valorile deja existente. (Pentru detalii vezi i VBA Help).

Exemple Dim x As Double, ColtStanga As Integer Private I, J As Long Static Venit As Currency, NumPren As String Dim Retineri(5) As Currency Public indicatori(10) As Byte Dim matrice(1 To 3, 100 To 200) As String Public fntScris As Font Dim appWD As Word.Application Proceduri Printr-o procedur se n elege, similar altor limbaje de programare, o mul ime de instruc iuni care este identificat printrun nume i care se execut unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o procedur s efectueze o prelucrare unitar identificabil n logica programului. Exist trei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unui obiect i va fi prezentat ulterior. O procedur de tip Sub poate primi i transmite informa ii prin intermediul unor variabile publice sau/i a unor parametri. Numele procedurii nu are ataat nici o valoare. O procedur de tip Function se deosebete prin aceea c numele procedurii are ataat o valoare (valoarea func iei) i poate fi utilizat ca orice alt variabil din proiect. Observa ie. Orice instruc iune executabil trebuie s apar in unei proceduri. Declara iile pot s apar i n afara procedurilor, la nivel de modul. Proceduri Sub Organizarea general a unei proceduri de tip Sub este [Private | Public] [Static] Sub name ([arglist]) [instruc iuni] [Exit Sub] [instruc iuni] End Sub

12

Public, Private, Static determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate modulele (n func ie de Option Private se definete vizibilitatea pentru alte proiecte). Private = vizibil doar pentru procedurile din modulul unde procedura este declarat. Static = arat c toate variabilele locale i pstreaz valorile ntre apeluri. name numele procedurii. arglist lista de argumente, separate prin virgule. Prin instruc iunea Exit Sub se poate iei din procedur i altminteri dect prin linia final. Argumentele se definesc dup sintaxa: [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue] Optional arat c parametrul nu este obligatoriu. Parametrii op ionali trebuie s fie grupa i la sfritul listei (apari ia clauzei Optional cere ca to i parametrii care urmeaz s aib aceeai clauz). ByVal arat c apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regsit dup prsirea procedurii, calculele efectundu-se pe o copie a parametrului). ByRef arat c apelul paramatrului se face prin referin (orice modificare a valorii transmise este regsit dup prsirea procedurii). Acesta este modul implicit de transmitere a parametrilor. ParamArray folosit doar ca ultim argument n list, denot un tablou Optional de elemente de tip Variant. Clauza ParamArray permite definirea unui numr arbitrar de parametri. ParamArray nu poate fi utilizat mpreun cu ByVal, ByRef, sau Optional. varname numele argumentului. Dac este tablou se vor indica parantezele. type tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String (doar lungime variabil), Object, Variant. Pentru parametrii obligatorii (fr Optional) poate fi i un tip definit sau de obiect. defaultvalue definete valoarea implicit pentru argumentele op ionale. Poate fi orice expresie, dar pentru tipul Object se admite doar Nothing. Apelul unei proceduri Sub Pentru a executa o procedur de tip Sub din alt procedur (vezi i discu ia privind vizibilitatea) se men ioneaz, pe o linie separat, numele procedurii urmat sau nu de parametri. Dac este necesar, datorit apelrii unui alt proiect sau modul, atunci apelul este dup modelul: Nume_proiect.Nume_modul.Nume_procedur list de argumente unde lista de argumente poate sau nu s fie inclus ntre paranteze. Argumentele efective sunt separate n list prin virgule i trebuie s respecte ordinea (i tipul) argumentelor din defini ia procedurii. n cazul procedurilor cu multe argumente, dintre care multe op ionale, transferul poate provoca erori de scriere a codului (un argument op ional necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situa ii (n special) se permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alctuind lista de argumente, la apelul procedurii, din intrri de forma nume_argument:=valoare_argument

13

separate prin virgule i la care nu mai conteaz ordinea ini ial a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adic valorile op ionale dorite i toate valorile neop ionale). Pentru apelul unei proceduri se va studia i instruc iunea Call. Proceduri Function O procedur de tip Function este similar, ca defini ie, unei proceduri Sub, dar are particularitatea c returneaz o valoare prin numele su (care se comport deci ca o variabil). [Public | Private] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function Este de remarcat c se poate ataa un tip numelui func iei (adic valorii func iei) i se va remarca existen a instruc iunilor prin care se atribuie func iei valorile calculate. Valoarea returnat de o func ie poate fi utilizat ntr-o alt expresie prin includerea numelui func iei urmat, ntre paranteze, de valorile efective ale parametrilor. Dac apelul se face prin intermediul instruc iunii Call, valoarea func iei nu poate fi utilizat. n asemenea situa ii se activeaz de fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate). Exemple de proceduri Public Function AriaCilindru (raza, inaltime) As Double Const Pi = 3.14159 cilBaza = Pi*raza^2 cilLaterala = 2*Pi*raza*inaltime AriaCilindru = 2*cilBaza + cilLaterala End Function Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, ByRef cilAria As Double) Const Pi As Single = 3.14159

14

Dim cilBaza As Single, cilLaterala As Single cilBaza = Pi*raza^2 cilLaterala = 2*Pi*raza*inaltime cilAria = 2*cilBaza + cilLaterala End Apelul func iei poate fi ntr-o instruc iune de genul CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar n timp ce apelul subrutinei poate fi AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa Organizarea general a unui proiect VBA Obiectele i prelucrrile necesare realizrii unei aplica ii VBA (presupunnd c se dorete 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 prelucrrile proiectate n VBA sunt ataate documentelor (ac iunilor) unor aplica ii particulare (Word, Excel etc.), proiectele sunt salvate o dat cu documentele pe care le nso esc. Acest fapt nu reduce aria de probleme abordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nso it (se poate deschide astfel un document Word alb i s se efectueze orice prelucrare dorit, fr a avea obliga ia de a scrie ceva n documentul deschis). ntr-un proiect VBA sunt identificabile urmtoarele componente: Module standard (denumite ini ial module de cod). Con in declara ii i proceduri generale. Exist de asemenea i module care con in tratarea evenimentelor specifice documentului de care este ataat proiectul. Module de clas. Con in definirea obiectelor create de utilizator. Forme. Con in defini iile dialogurilor din interfa a proiectat de utilizator ca i codul program necesar controlrii dialogurilor. Referin e. ntr-un proiect este men inut lista altor proiecte, care sunt referite n proiectul curent.

Un modul de cod poate ncepe cu o sec iune de declara ii. Prin declara ii n elegem instruc iuni neexecutabile prin care se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeaz i domeniul de vizibilitate a entit ilor definite. Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat ntr-o sec iune separat. Domeniul unei variabile, constante sau proceduri Domeniul unei entit i reprezint mul imea instruc iunilor unde poate fi referit acea entitate. Se poate vorbi astfel de vizibilitatea unei entit i. Domeniul este dependent de locul definirii entit ii, de clauzele care apar la definire i de parametrii globali ai proiectului.

15

Not. Este de remarcat c utilizarea unei denumiri n afara domeniului ini ial prefigurat produce, n lipsa instruc iunii Option Explicit, crearea unei noi entit i, fr nici o legtur cu cea precedent, surs de erori greu detectabile. Acesta este motivul pentru care se recomand declararea explicit a tuturor variabilelor. Exist trei tipuri de domenii: o o o la nivel de procedur; la nivel de modul, privat; la nivel de modul, public.

Nivelul procedur O variabil sau constant definit ntr-o procedur este vizibil doar n procedur respectiv. Dac o asemenea entitate trebuie referit i n alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmite procedurii prin intermediul argumentelor. Nivel de modul, privat Variabilele i constantele definite la nivel de modul (n sec iunea Declarations) sunt Private n mod implicit, adic sunt vizibile doar n modulul respectiv. Utilizarea clauzei Private nu este deci necesar, dar este recomandat. Not. Dac se utilizeaz instruc iunea Option Private Module (n sec iunea Declarations a modulului) atunci variabilele i procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declara ii, procedurile publice (din toate modulele standard sau clas) sunt vizibile n toate proiectele care se refer la proiectul curent. Procedurile, variabilele i constantele publice din alte module (cum ar fi modulele ataate formelor) sunt Private pentru proiectul de defini ie, deci ele nu sunt accesibile proiectelor care se refer la proiectul unde sunt declarate. Nivel de modul, public Variabilele declarate la nivel de modul drept Public sunt vizibile n toate procedurile din proiect. Procedurile sunt publice n mod implicit, cu excep ie procedurilor de tratare a evenimentelor, care sunt Private n mod implicit. A se vedea i nota anterioar. Viata unei variabile Prin via a unei variabile se n elege timpul ct variabila are o valoare. Este evident c valoarea unei variabile se poate modifica pe durata vie ii sale, dar definitoriu este faptul c variabila are o anumit valoare pe ntreaga durat a vie ii sale. La prsirea domeniului, variabila "moare" i nu mai are ataat o valoare. La nceputul execu iei unei proceduri, toate variabilele sunt ini ializate: Variabil numeric ir de lungime variabil ir de lungime fix Variabil Variant Variabile de tip utilizator Variabil Object 0 (zero) "" (ir de lungime zero) Completat cu caracterul Chr(0) (avnd codul ASCII 0) Empty fiecare element este ini ializat separat, potrivit tipului primar Nothing (pn la asignarea unei referin e prin Set)

16

Variabilele care nu sunt modificate i pstreaz valoarea ini ial. Variabilele declarate prin Dim la nivel de procedur au valoare pn la terminarea execu iei procedurii (chiar dac se trece prin apel n alte proceduri). Variabilele declarate prin Static, la nivel de procedur, au aceeai via ca i variabilele declarate la nivel de modul i i pstreaz valoarea pn la terminarea execu iei codului (inclusiv de la un apel la altul). Includerea clauzei Static n instruc iunea Sub sau Function are ca efect declararea tuturor variabilelor definite n procedura respectiv drept variabile statice (deci care i pstreaz valorile ntre apeluri). Variabilele declarate la nivel de modul standard i pstreaz valoarea pe tot timpul execu iei. Variabilele declarate la nivel de modul clas i pstreaz valoarea att timp ct exist o instan a clasei. Diferen a fa de variabilele Static este aceea c memoria este utilizat permanent (nu se elibereaz la prsirea 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 clas dintr-o bibliotec de obiecte referit Dim myDoc As Word.Document n primul mod de definire (ca Object) nu se poate efectua la momentul compilrii existen a obiectului, nu se poate verifica utilizarea corect a propriettilor i metodelor obiectului i nu se poate lega aceast informa ie de variabila obiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execu iei i se efectueaz prin instruc iunea Set. Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapid, se face la momentul compilrii i poate nltura mai rapid erori posibile n utilizarea metodelor i propriet ilor obiectului. Instruc iunea Set are sintaxa: Set objectvar = {[New] objectexpression | Nothing} unde o o o o

objectvar este numele variabilei (sau propriet ii) New permite crearea unei noi instan e a clasei Objectexpression este o expresie constnd n numele unui obiect, alt variabil declarat de acelai tip obiect, sau func ie ori metod care returneaz un obiect de acelai tip obiect Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem i de memorie utilizate.

n general, atunci cnd se utilizeaz Set pentru a asigna o referin de obiect la o variabil, nu se creeaz o copie a obiectului pentru acea variabil. Este creat doar o referin la obiect. Astfel, mai multe variabile de tip obiect pot s se refere la acelai obiect: orice schimbare a obiectului se va reflecta n toate variabilele care refer obiectul. Utiliznd clauza New se va crea efectiv o copie (instan ) a obiectului. Exemple Prin urmtoarele dou instruc iuni se definete variabila objWord care este legat trziu de o aplica ie Word:

17

Dim objWord As Object Set obhWord = CreateObject("Word.Application") Legarea timpurie se poate efectua prin Dim objWord As Word.Application Este de remarcat c instruc iunea Set apeleaz o func ie care creeaz i returneaz o referin la un obiect ActiveX. Constante predefinite (builtin) Bibliotecile de obiecte din fiecare aplica ie Office furnizeaz o mul ime de constante predefinite, care pot fi utilizate pentru a stabili proprietti sau pentru a transmite argumente ctre propriet i sau metode. Constantele sunt, de regul, grupate n tipuri enumerate care reprezint valorile posibile pentru o proprietate specific. Dei este posibil s se utilizeze valoarea numeric a constantei este recomandat s se utilizeze constanta numit ntruct dezvoltri ulterioare ale mediului Microsoft Office (ca i ale aplica iilor din Visual Studio) tind s pstreze compatibilitatea ntre denumirile constantelor i nu ntre valorile efective. De exemplu se prefer Application.DisplayAlerts = wdAlertAll n loc de Application.DisplayAlerts = -1 pentru a fixa ca Word s afieze toate mesajele de alert la execu ia unei proceduri. Codul scris astfel este i mai explicit. INSTRUC IUNILE VBA Generalit i Exist trei categorii de instruc iuni Visual Basic: instruc iuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru variabile, constante i proceduri; instruc iuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor; instruc iuni executabile (prezentate n continuare) care ini iaz ac iuni: execut metode sau proceduri, controleaz fluxul execu iei codului. n mediul de dezvoltare VBA, sintaxa instruc iunilor este verificat automat dup ce se trece la instruc iunea urmtoare (prin Enter). Continuarea instruc iunilor O instruc iune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de un spa iu. De exemplu, crearea prin program a unui tabel ntr-un document Word: ActiveDocument.Tables.Add Range:=Selection.Range, _ NumRows:=3, _

18

NumColumns:= 3 unde, pe lng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare a unui nou tabel la colec ia de tabele a documentului. Dou instruc iuni pot fi scrise pe o aceeai linie dac sunt separate cu caracterul ":". Etichetarea liniilor O linie poate fi identificat: printr-o etichet: orice nume, care respect regulile generale, care ncepe n prima coloan a liniei i se termin cu caracterul ":" printr-un numr: orice combina ie de cifre, care ncepe n prima coloan a liniei i este unic n modulul respectiv. Identificatorii de linii pot fi utiliza i n instruc iuni de control, desi codul astfel construit nu respect regulile programrii structurate.. Comentarii Textele explicative (necesare documentrii 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 spa iu. Comentariul de pe aceeai linie cu o instruc iune se introduce printr-un apostrof urmat de comentariu.

Operatori n formarea expresiilor de diverse tipuri, operatorii sunt cei utiliza i aproape general n limbajele de programare de nivel nalt. Pentru fixarea termenilor i nota iilor sunt totui prezenta i, pe categorii, nso i i, acolo unde este cazul de scurte explica ii. Operatori aritmetici Operator ^ * Semnifica ie Ridicarea la putere nmul irea Observa ii rezultatul este Double sau Variant(Double) cu excep ia: dac un operand este Null, rezultatul este tot Null rezultatul este dat de cel "mai precis" factor, ordinea cresctoare a "preciziei" fiind, pentru nmul ire, Byte, Integer, Long, Single, Currency, Double i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help *(operator). rezultatul este, n general, Double sau Variant(Double). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help /(operator). nainte de mpr ire, operanzii sunt rotunji i la Byte, Integer sau Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. operanzii sunt rotunji i la ntregi i se ob ine restul mpr irii. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este

mpr irea

mpr irea ntreag

Mod

Restul mpr irii

19

Null, rezultatul este Null. O expresie Empty este considerat ca 0. + Adunarea numeric sau concatenarea irurilor n general, operanzi numerici produc adunarea, iar operanzi iruri produc concatenarea. n cazul numeric, rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i scdere: Byte, Integer, Long, Single, Double, Currency i Decimal. Deoarece operanzii pot fi orice expresie, pentru o informare complet (de exemplu operanzi Variant) se va studia Help +(operator). operanzii pot fi doar numerici. Rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i scdere: Byte, Integer, Long, Single, Double, Currency i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excep ii se va studia Help -(operator).

Scderea sau inversarea semnului

Operatori de comparare Rela iile care exist ntre diferite tipuri de entit i se pot eviden ia prin compara ii avnd una dintre formele urmtoare: result = expression1 comparisonoperator expression2 result = object1 Is object2 result = string Like pattern unde result este o variabil numeric expression este o expresie oarecare comparisonoperator este un operator rela ional object este un nume de obiect string este o expresie ir oarecare pattern este o expresie String sau un domeniu de caractere. Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau egal), > (mai mare), >= (mai mare sau egal), = (egal), <> (diferit, neegal). Rezultatul este True (dac este adevrat rela ia), False (dac rela ia este neadevrat), Null (dac cel pu in un operand este Null). Operatorul Is produce True dac variabilele se refer la acelai obiect i False n caz contrar. Operatorul Like compar dou iruri cu observa ia c al doilea tremen este un ablon. Prin urmare rezultatul este True dac primul ir operand este format dup ablon, False n caz contrar. Atunci cnd un operand este Null, rezultatul este tot Null. Comportarea operatorului Like depinde de instruc iunea Option Compare, care poate fi:

20

Option Compare Binary, ordinea este cea a reprezentrii interne binare, determinat n Windows de codul de pagin. Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de setrile locale ale sistemului.

Construc ia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere: ? un caracter oarecare * oricte caractere (chiar nici unul) # o cifr oarecare (09). [charlist] oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea cratimei. [!charlist] orice caracter care nu este n list Observa ie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construc ii de tip list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ]. Pentru alte observa ii utile se va studia Help Like operator.

Operatori de concatenare Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +. n sintaxa expression1 & expression2 unde operanzii sunt expresii oarecare, rezultatul este de tip String, dac ambii operanzi sunt String de tip Variant(String) n celelalte cazuri Null, dac ambii operanzi sunt Null.

nainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Empty sunt tratate ca iruri de lungime zero (""). Operatori logici Pentru opera iile logice sunt utiliza i urmtorii operatori, uzuali n programare. Operator And Semnifica ie conjunc ia logic Observa ii Null cu False d False, Null cu True sau cu Null d Null. Operatorul And realizeaz i opera ia de conjunc ie bit cu bit pentru expresii numerice.

21

Eqv

echivalen a logic

Dac o expresie este Null, rezultatul este Null. Eqv realizeaz i compararea bit cu bit a dou expresii numerice, pozi ionnd cifrele binare ale rezultatului dup regulile de calcul ale echivalen ei logice: 0 Eqv 0 este 1 etc. True Imp Null este Null, False Imp * este True, Null Imp True este True, Null Imp False (sau Null) este Null. Operatorul Imp realizeaz i compararea bit cu bit a dou expresii numerice, pozi ionnd cifrele binare ale rezultatului dup regulile de calcul ale implica iei 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, pozi ionndu-se corespunztor un rezultat numeric. Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaz i o compara ie bit cu bit a dou expresii numerice pozi ionnd bi ii corespunztori ai rezultatului dup regulile lui Or logic. Dac un operand este Null, atunci rezultatul este Null. Se poate efectua opera ia de sau exclusiv i bit cu bit pentru dou expresii numerice [b1+b2(mod 2)].

Imp

implica ia logic

Not Or

nega ia logic disjunc ia logic

Xor

disjunc ia exclusiv

Instruc iuni de atribuire Atribuirea se poate efectua prin instruc iunea Let (pentru valori atribuite variabilelor i propriet ilor), Set (pentru atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite de utilizator). Instruc iunea Let Atribuie valoarea unei expresii la o variabil sau proprietate. [Let] varname = expression unde varname este nume de variabil sau de proprietate. Este de remarcat forma posibil (i de fapt general utilizat) fr cuvntul Let. Observa ii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu pot fi atribuite variabilelor de tip String i nici reciproc. Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dac valoarea expresiei Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip String (cu excep ia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric. La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei. Atribuirea valorilor de tip utilizator poate fi efectuat doar dac ambii termeni au acelai tip definit. Pentru alte situa ii se va utiliza instruc iunea Lset. Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n aceast situa ie instruc iunea Set.

22

Instruc iunea LSet Copie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Deoarece copierea este binar, poate fi utilizat pentru atribuiri ntre tipuri utilizator diferite (rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este LSet stringvar = string LSet varname1 = varname2 unde stringvar, string reprezint variabila de tip String i expresia de acelai tip implicate ntr-o atribuire de iruri. varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruc iunea Type) diferite. Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stnga) n zona de memorie a primei variabile. Caracterele care rmn neocupate se completeaz cu spa ii, iar dac zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate). Instruc iunea LSet Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Sintaxa este RSet stringvar = string Caracterele rmase neocupate n variabil sunt completate ccu spa ii. Instruc iunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator. Instruc iuni executabile Execu ia unui program are loc, n lipsa oricrui control, instruc iune cu instruc iune, de la stnga la dreapta i de sus n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a opera iilor n evaluarea expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele programrii i din acest motiv necesitatea structurilor de control a fluxului execu iei. Unele instruc iuni au fost pstrate doar din motive de compatibilitate cu versiunile ini iale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare. Instruc iuni de transfer (GoSubReturn, GoTo, OnError, OnGoSub, OnGoTo) Aceast categorie cuprinde instruc iunile prin care controlul execu iei este transferat la o alt instruc iune din procedur. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul programrii structurate) i prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de programare. GoSubReturn n cadrul unei proceduri un grup de instruc iuni poate fi organizat ca o subrutin (similar unei proceduri on-line, nenumite) identificat prin linia de nceput. Transferul controlului la acest grup de instruc iuni i revenirea la locul apelului se poate efectua prin GoSubReturn cu sintaxa GoSub line

23

... line ... Return unde line este o etichet de linie sau un numr de linie din aceeai procedur. Pot exista mai multe instruc iuni Return, prima executat produce saltul la instruc iunea care urmeaz celei mai recente instruc iuni GoSub executate. GoTo Realizeaz tranferul controlului execu iei la o linie din aceeai procedur. GoTo line unde line este o etichet de linie sau un numr de linie din aceeai procedur. On Error Permite controlul erorilor prin transferul controlului la rutine de tratare. Observa ie. Este prezentat n sec iunea dedicat controlului erorilor. OnGoSub, OnGoTo Permit o ramificare multipl, dup valoarea unei expresii. Se recomand, pentru claritatea codului, utilizarea structurii Select Case n locul acestor structuri. On expression GoSub destinationlist On expression GoTo destinationlist unde expression este o expresie numeric avnd valoare ntreag (dup o eventual rotunjire) ntre 0 i 255 inclusiv. destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele categorii), din aceeai procedur cu instruc iunea. Dac valoarea expresiei este negativ sau mai mare dect 255 se produce o eroare. Dac valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfer controlul la linia identificat de al klea element al listei. Dac valoarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueaz la linia care urmeaz instruc iunea On...GoSub sau On...GoTo.

24

Instruc iuni de terminare sau oprire a programului (DoEvents, End, Exit, Stop) Terminarea execu iei programului sau oprirea temporar (pauza) se pot realiza prin instruc iunile enumerate aici. DoEvents Dei nu este o instruc iune VBA ci este o func ie, includerea ei este natural prin aceea c permite cedarea controlului ctre sistemul de operare, care poate astfel s func ioneze n regim de multitasking. Ac iunea poate fi realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este DoEvents( ) Func ia returneaz, n general, valoarea 0. Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de evenimente, ca i procesarea tuturor caracterelor din coada SendKeys. Observa ie. Pentru alte observa ii se va studia documenta ia comenzii DoEvents. End Termin execu ia unei proceduri (sub forma prezentat aici) sau indic sfritul codului unei structuri de tip bloc (cum ar fi End Function, End If etc., prezentate la structurile respective). Sintaxa, n ipostaza opririi execu iei, este: End Prin aceast instruc iune, care poate fi plasat oriunde n program, execu ia este terminat imediat, fr a se mai executa eventualele instruc iuni scrise pentru tratarea unor evenimente specifice sfritului de program (Unload, Terminate etc.). Fiierele deschise prin Open sunt nchise i toate variabilele sunt eliberate. Obiectele create din modulele clas sunt distruse, iar referin ele din alte aplica ii la asemenea obiecte sunt invalidate. Memoria este eliberat. Exit Prin instruc iunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execu ie (cum ar fi o procedur, o structur iterativ etc.) pentru a se continua nivelul apelant. Sintaxa este Exit Do Exit For Exit Function Exit Property Exit Sub i efectele sunt prezentate la structurile respective. Nu trebuie confundat cu instruc iunea End.

25

Stop Efectul instruc iunii este dependent de modul de execu iei a programului. Dac se execut varianta compilat a programului (fiierul .exe) atunci instruc iunea este similar instruc iunii End (suspend execu ia i nchide fiierele deschise). Dac execu ia este din mediul VBA, atunci se suspend execu ia programului, dar nu se nchid fiierele deschise i nu se terge valoarea variabilelor. Execu ia poate fi reluat din punctul de suspendare. Stop Instruc iunea este similar introducerii unui punct de oprire (Breakpoint) n codul surs. Structuri iterative (Do...Loop, For...Next, For Each...Next, While...Wend, With) Prin intermediul construc iilor de tip bloc prezentate n aceast sec iune se poate repeta, n mod controlat, un grup de instruc iuni. n cazul unui numr nedefinit de repeti ii, condi ia de oprire poate fi testat la nceputul sau la sfritul unui ciclu, prin alegerea structurii adecvate. DoLoop Se vor utiliza structuri DoLoop pentru a executa un grup de instruc iuni de un numr de ori nedefinit aprioric. Dac se cunoate numrul de cicluri, se va utiliza structura ForNext. nainte de continuare se va testa o condi ie (despre care se presupune c poate fi modificat n instruc iunile executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condi iei i decizia luat. Do [{While | Until} condition] [statements] [Exit Do] [statements] Loop sau Do [statements] [Exit Do] [statements] Loop [{While | Until} condition] unde condition este o expresie care valoare de adevr True sau False. O condi ie care este Null se consider False.

26

statements sunt instruc iounile care se repet atta timp (while) sau pn cnd (until) condi ia devine True. Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruc iune care urmeaz ntregii structuri (deci de dup linia care ncepe cu Loop). Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax). Dac apare o comand Exit Do se poate omite chiar i condi ia din enun ntruct execu ia se va termina prin aceast decizie. Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfer controlul la nivelul Do imediat superior. Execu ia structurilor este explicat n tabelul urmtor Do WhileLoop Do UntilLoop DoLoop While DoLoop Until Testeaz condi ia la nceputul buclei, execut bucla numai dac rezultatul este True i continu astfel pn cnd o nou evaluare produce False. Testeaz condi ia la nceputul buclei, execut bucla numai dac rezultatul este False i continu astfel pn cnd o nou evaluare produce True. Se execut ntotdeauna bucla o dat, se testeaz condi ia la sfritul buclei i se repet bucla att timp ct condi ia este True. Oprirea este pe condi ie fals. Se execut ntotdeauna bucla o dat, se testeaz condi ia la sfritul buclei i se repet bucla att timp ct condi ia este False. Oprirea este pe condi ie adevrat.

ForNext Atunci cnd se cunoate numrul de repetri ale unui bloc de instruc iuni, se va folosi structura ForNext. Structura utilizeaz o variabil contor, a crei valoare se modific la fiecare ciclu, oprirea fiind atunci cnd se atinge o valoare specificat. Sintaxa este: For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter] unde counter este variabila contor (numr repetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou. start este valoarea ini ial a contorului. end este valoarea final a contorului. step este cantitatea care se adun la contor la fiecare pas. n cazul n care nu se specific este implicit 1. Poate fi i negativ.

27

statements sunt instruc iunile care se repet. Dac nu se specific, atunci singura ac iune este cea de modificare a contorului de un numr specificat de ori. Ac iunea este dictat de pasul de incrementare i rela ia dintre valoarea ini ial i cea final. Instruc iunile din corpul structurii se execut dac o o counter <= end pentru step >= 0 sau counter >= end pentru step < 0.

Dup ce toate instruc iunile s-au executat, valoarea step este adugat la valoarea contorului i instruc iunile se execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima instruc iune de dup linia Next. Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd exist structuri ForNext mbricate. Corpul unei bucle ForNext poate include (complet) o alt structur ForNext. n asemenea situa ii, structurile mbricate trebuie s aib variabile contor diferite. Instruc iunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul execu iei se transfer la prima instruc iune de dup linia Next. For EachNext Similar structurii ForNext, structura For EachNext repet un grup de instruc iuni pentru fiecare element dintr-o colec ie de obiecte sau dintr-un tablou (cu excep ia celor de un tip utilizator). Este util atunci cnd nu se cunoate numrul de elemente sau dac se modific, n timpul execu iei, con inutul colec iei. Sintaxa este: For Each element In group [statements] [Exit For] [statements] Next [element] unde element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colec ie de obiecte, atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect specific pentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, element poate fi doar o variabil de tip Variant. group este numele colec iei de obiecte sau al tabloului. statements este grupul de istruc iuni executate pentru fiecare element.

28

Execu ia unei structuri For EachNext este 1. Se definete element ca numind primul element din grup (dac nu exist nici un element, se transfer controlul la prima instruc iune de dup Next se prsete bucla fr executarea instruc iunilor). 2. Se execut instruc iunile din corpul buclei For. 3. Se testeaz dac element este ultimul element din grup. Dac rspunsul este afirmatif, se prsete bucla. 4. Se definete element ca numind urmtorul element din grup. 5. Se repet paii 2 pn la 4. Instruc iunile Exit For sunt explicate la ForNext. Buclele ForEach...Next pot fi mbricate cu condi ia ca elementele utilizate la iterare s fie diferite. Observa ie. Pentru tergerea tuturor obiectelor dintr-o colec ie se va utiliza ForNext i nu For EachNext. Se va utiliza ca numr de obiecte colec ie.Count. WhileWend Execut un grup de instruc iuni att timp ct este adevrat o condi ie. Sintaxa While condition [statements] Wend Este recomandat s se utilizeze o structur DoLoop n locul acestei structuri. With Programarea orientat pe obiecte produce, datorit calificrilor succesive, construc ii foarte complexe atunci cnd se numesc propriet ile unui obiect. n cazul modificrilor succesive ale mai multor propriet i ale aceluiai obiect, repetarea zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificat prin utilizarea structurii WithEnd With. O asemenea structur execut o serie de instruc iuni pentru un obiect sau pentru o variabil de tip utilizator. Sintaxa este: With object [statements] End With unde object este numele unui obiect sau a unui tip definit de utilizator statements sunt instruc iunile care se execut pentru entitatea precizat. Permi nd omiterea recalificrilor din referin ele la obiectul precizat, orice construc ie de tipul ".nume" este interpretat n instruc iunile structurii drept "object.nume".

29

ntr-un bloc With nu se poate schimba obiectul procesat. La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificrile eventuale la acest obiect vor fi efectuate. Nu se recomand saltul n i dintr-un bloc With. Structuri de decizie (IfThenElse, Select Case) Ramificarea firului execu iei dup rezultatul verificrii unei condi ii este o necesitate frecvent n orice implementare. Pe lng structurile prezentate, se pot utiliza trei func ii care realizeaz alegeri n mod liniarizat (pe o linie de cod): Choose(), Iif(), Switch(). IfThenElse O asemenea structur, ntlnit de altfel n toate limbajele de programare, execut un grup de instruc iuni ca rspuns la ndeplinirea unei condi ii (compus sau nu din mai multe condi ii testate secven ial). Sintaxa permite o mare varietate de forme: If condition Then [statements] [Else elsestatements] sau If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If unde condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat False); expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat n objecttype. statements, elsestatements, elseifstatements sunt blocurile de instruc iuni executate atunci cnd condi iile corespunztoare sunt True. La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruc iuni, separate de ":", pe aceeai linie.

30

Verificarea condi iilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True). Select Case Instruc iunea Select Case se poate utiliza n locul unor instruc iuni ElseIf multiple (dintr-o structur IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruc iunea Select Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruc iunii IfThenElseIf. Totui, Select Case produce un un cod mai eficient i mai inteligibil. Sintaxa este: Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else [elsestatements]] End Select unde testexpression este o expresie numeric sau ir. expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma: expression. expression To expression. Cuvntul To introduce un interval de valori, valoarea minim fiind prima specificat. Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptnd Is i Like) pentru a specifica un domeniu de valori.

statements-n reprezint una sau mai multe instruc iuni care se vor executa dac testexpression este egal cu un element din expressionlist-n. elsestatements reprezint una sau mai multe instruc iuni care se vor executa dac testexpression nu este egal cu nici un element din listele liniilor Case. Dac testexpression se potrivete cu un element dintr-o list Case, se vor executa instruc iunile care urmeaz aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execu iei trece apoi la instruc iunea care urmeaz liniei finale End Select. Rezult c dac testexpression se regsete n mai multe liste, doar prima potrivire este considerat. Clauza Case Else are semnifica ia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruc iunile care se execut atunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dac aceasta este situa ia i nu este specificat o clauz Case Else, atunci execu ia urmeaz cu prima instruc iune de dup End Select. Instruc iunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structur are End Select propriu, includerea este complet). Apeluri de proceduri i programe

31

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

Func ia Shell() Execut un program executabil i returneaz un Variant(Double) reprezentnd ID-ul de task al programului n caz de succes; n caz contrar returneaz zero. Sintaxa este Shell(pathname[,windowstyle]) unde pathname este Variant (String). Con ine numele programului care se execut, argumentele necesare i poate da calea complet (dac este nevoie). windowstyle este Variant (Integer) i precizeaz stilul ferestrei n care se va executa programul (implicit este minimizat, cu focus). Valorile posibile pentru argumentul windowstyle sunt Constanta numit VbHide VbNormalFocus VbMinimizedFocus VbMaximizedFocus VbNormalNoFocus VbMinimizedNoFocus Valoarea 0 1 2 3 4 6 Semnifica ia Fereastra este ascuns iar focus-ul este pe fereastra ascuns. Fereastra are focus-ul i este dimensionat i pozi ionat normal. Fereastra este afiat ca o icoan (minimizat) dar are focus-ul. Fereastr maximizat, cu focus. Fereastra este normal (restaurat la mrimea i pozi ia cea mai recent) dar nu are focus-ul. Fereastra activ curent i pstreaz focus-ul. Fereastr minimizat, fr focus. Fereastra activ curent i pstreaz focus-ul.

Dac func ia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut asincron, deci nu exist certitudinea c acest program se termin nainte de execu ia instruc iunilor care urmeaz liniei Shell. Opera iuni de intrare-ieire n categoria opera iunilor de I/O se pot deosebi schimbul de informa ii cu utilizatorul: acesta se poate desfura prin intermediul unor formulare (forms) predefinite (InputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului VBA. schimbul de informa ii cu fiiere i/sau baze de date: acesta se realizeaz prin intermediul unor instruc iuni dedicate acestor opera ii.

32

Dialogul standard cu utilizatorul n general, utilizatorul rspunde la apari ia unei boxe de dialog prin ac ionarea butonului adecvat rspunsului su i/sau prin nscrierea unei informa ii ntr-o zon dedicat acestui scop. Informa ia nscris este transferat programului ca valoare a func iei care ini iaz dialogul grafic. Func ia InputBox Apelul func iei InputBox afieaz o box de dialog care con ine un mesaj, dou butoane (OK i Cancel) i o zon text n care se poate tasta un rspuns (de tip String, chiar dac se transmite o valoare numeric). Se ateapt ca utilizatorul s introduc un text n zona rezervat sau s ac ioneze un buton. Textul introdus este transmis ca valoare a func iei la ac ionarea butonului OK (sau Enter), iar ac ionarea butonului Cancel (ca i nchiderea dialogului ca fereastr) transmite un ir de lungime zero (indiferent de valoarea zonei text. Sintaxa este InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) unde prompt este expresia String cu mesajul afiat n dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai multe linii prin combina ii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF. title este expresia de tip String cu titlul ferestrei dialogului. Dac este omis se va folosi titlul aplica iei. default este expresia de tip String, op ional, con innd textul afiat ini ial n zona text rezervat utilizatorului. Textul este, n lipsa modificrii lui, retransmis ca rspuns (ac ionnd butonul OK). xpos este expresia numeric specificnd pozi ia orizontal a dialogului (n twips, de la latura stnga a ecranului). n lipsa argumentului, boxa de dialog este centrat orizontal. ypos este expresia numeric specificnd pozi ia vertical a dialogului (n twips, de la latura de sus a ecranului). n lipsa argumentului, boxa de dialog este pozi ionat la aproximativ o treime de ecran. helpfile este expresia de tip String care identific fiierul Help utilizat.Dac este indicat helpfile, trebuie s fie precizat i context. Textul de ajutor poate fi vzut prin tasta F1, anumite aplica ii afieaz i un buton Help. context Expresie numeric cu numrul de context Help al intrrii corespunztoare dialogului afiat. Apare obligatoriu mpreun cu helpfile. Dac valoarea func iei nu este atribuit (sau utilizat ntr-o alt expresie), este evident c se pierde, fr semnalarea vreunei erori. Func ia MsgBox Un dialog mai simplu dect InputBox este realizat prin forma predefinit afiat de func ia MsgBox. Se afieaz un mesaj ntr-o box de dialog i se ateapt ca utilizatorul s ac ioneze unul dintre butoanele existente (numrul i tipul lor lor este fixat la proiectarea aplica iei). Func ia returneaz un ntreg indicnd care buton a fost ac ionat. Sintaxa este [intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context]) unde prompt este textul mesajului (Vezi InputBox)

33

buttons este o expresie numeric egalcu suma valorilor care specific numrul, tipul i atributele butoanelor. Aici se fixeaz i modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz). Valoarea implicit este 0. title,helpfile, context identice cu argumentele similare descrise la InputBox. Constantele recomandate pentru formarea argumentului buttons sunt

Constanta VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 VbApplicationModal VbSystemModal

Valoare 0 1 2 3 4 5 16 32 48 64 0 256 512 768 0 4096 Numai butonul OK OK i Cancel Abort, Retry i Ignore Yes, No i Cancel Yes i No Retry i Cancel Icoana de Critical Message Icoana de Warning Query Icoana Warning Message Icoana de Information Message

Descriere

Primul buton este cel implicit (echivalent cu Enter) Al doilea buton este cel implicit Al treilea buton este cel implicit Al patrulea buton este cel implicit Application modal: aplicatia curent este oprit pn cnd rspunde utilizatorul System modal: toate aplica iile sunt oprite pn cnd utilizatorul rspunde la dialog

Valorile 0-5 descriu butoanele, 16,32,48 i 64 descriu stilul icoanei afiate, 0, 256 i 512 determin butonul implicit, iar ultimul grup (0 i 4096) determin modalitatea boxei de dialog. La formarea argumentului Buttons se va adun doar cte un numr din fiecare grup. Pentru a utiliza valoarea returnat de func ie, aceasta trebuie inclus ntr-o expresie (eventual atribuit unei variabile ntregi). Valorile returnate de func ie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorit de utilizator sunt

34

Constanta VbOK VbCancel VbAbort VbRetry VbIgnore VbYes VbNo

Valoare 1 2 3 4 5 6 7

Descriere OK Cancel Abort Retry Ignore Yes No

Ac ionarea tastei Esc este echivalent cu ac ionarea butonului Cancel (dac acesta este prezent). Dac n dialog este prezent butonul Help, ac ionarea lui nu termin dialogul. Utilizarea fiierelor Procesrile tipice programate n VBA prelucreaz informa ii din dou mari categorii de fiiere: fiiere ale aplica iilor server (.doc n Word, .xls n Excel etc.) fiiere utilizator (create i/sau gestionate de proiect pentru date de intrare, temporare sau de ieire). Accesarea direct a fiierelor din prima categorie (fr apelul aplica iei server specifice) poate produce coruperea fiierului, astfel nct nu mai este recunoscut de aplica ia mam. Prelucrarea acestor fiiere trebuie s fie executat n aplica iile care le-au creat. Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va n elege, fr alte precizri, un fiier utilizator) acesta trebuie mai nti deschis (instruc iunea Open), opera iunea producnd i crearea fiierului n cazul unui fiier inexistent (nou). Dup utilizare fiierul trebuie s fie nchis (opera iune efectuat, la terminarea normal a programului, n mod automat). Un fiier are ataat un numr de identificare, unic pentru un proces. Identificare fiierului se poate efectua, n program, prin numele su sau prin numrul ataat. Numrul poate fi n domeniul 1255 pentru fiierele proprii aplica iei i n domeniul 256511 pentru fiiere accesibile din alte aplica ii. Un numr neutilizat (liber) poate fi furnizat de apelul la func ia FreeFile(). Exist trei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia. acces secven ial (modurile Input, Output i Append), utilizat de regul pentru scrierea fiierelor text (rapoarte, jurnale etc.); acces raandom (aleator) (modul Random), n cazul cnd este necesar s se scrie i s se citeasc nregistrrile ntr-o ordine nedefinit, opera iunile de intrare/ieire fiind amalgamate ntre ele; acces binar (modul Binary), utilizat la citirea/scrierea fiierelor byte cu byte (de exemplu fiiere bitmap).

Un fiier deschis cu un mod de acces trebuie exploatat n acest mod pn cnd este nchis i deschis n alt mod (dac structura lui permite aa ceva). Instruc iunile tipice pentru accesul la informa iile dintr-un fiier sunt

35

Modul de acces Secven ial Random Binar

Scriere Print #, Write # Put Put

Citire Input # Get Get

Deoarece gestionarea fiierelor nu se rezum doar la scriere/citire, n tabelul urmtor este un rezumat al principalelor opera iuni pe care le suport fiierele, cu instruc iunile care faciliteaz respectiva ac iune. Ac iune Citire Controlul ieirilor Copierea unui fiier Creare, acces Fixarea atributelor Fixarea pozi iei active de citire/scriere Inchidere Informa ii despre un fiier Lungimea unui fiier Opera ii asupra fiierelor Scriere Instruc iuni Get, Input, Input #, Line Input # Format, Print, Print #, Spc, Tab, Width # FileCopy Open FileAttr, GetAttr, SetAttr Seek Close, Reset EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek FileLen Dir, Kill, Lock, Unlock, Name Print #, Put, Write #

Doar instruc iunile i func iile des utilizate sunt prezentate n continuare, pentru celelalte se va studia intrarea corespunztoare din Help (n mediul VBA). Open Deschide un fiier n sensul c rezerv o zon tampon (buffer) pentru fiier i determin modul de acces utilizat. Nu se pot efectua instruc iuni de I/O pe un fiier dac acesta nu este deschis n prealabil. Sintaxa: Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] unde pathname expresie String care specific numele fiierului (poate include ntreaga cale unitate, directoare etc., dup regulile uzuale);

36

mode cuvnt cheie care specific modul de acces la fiier: Append, Binary, Input, Output sau Random; dac nu se specific nimic se va considera acces Random; access clauz op ional specificnd opera iunile I/O permise pentru fiier: Read, Write sau Read Write; lock clauz op ional specificnd opera iile asupra fiierului permise altor procese care se execut (cnd fiierul este deschis): Shared, Lock Read, Lock Write i Lock Read Write. filenumber numrul de fiier pentru fiierul deschis (ntre 1 i 511, vezi observa ia din partea introductiv); func ia FreeFile furnizeaz urmtorul numr disponibil; reclength numr (<=32,767) exprimnd, n octe i, lungimea nregistrrii (la aceesul Random) sau lungimea bufferului (la accesul secven ial); la accesul Binary, clauza este ignorat. Dac fiierul indicat nu exist, atunci este creat un fiier cu acest nume n cazurile care presupun o ieire n fiier: modurile Append, Binary, Output sau Random. Un fiier poate fi deschis n mai multe moduri simultan (prin instruc iuni Open distincte pentru fiecare mod, cu numere diferite) dac exist compatibilitate ntre moduri: Binary, Input i Random permit acest lucru, Append, Output nu permit (fiierul trebuie mai nti nchis i abia apoi deschis ntr-un asemenea mod). FreeFile Func ia returneaz un ntreg reprezentnd urmtorul numr de fiier disponibil. FreeFile[(rangenumber)] rangenumber este un Variant care specific domeniul din care se solicit un numr liber de fiier: 0 (valoarea implicit) returneaz un numr n 1255 (pentru fiiere proprii, 1 returneaz un numr n 256511 (pentru fiiere accesate din alte aplica ii). Get Citete date dintr-un fiier deschis i le transfer ntr-o variabil. Datele citite cu Get sunt, n general, scrise n fiier cu comanda Put. Get [#]filenumber, [recnumber], varname unde filenumber este numrul fiierului de unde se citesc date (fiierul trebuie s fie deschis) recnumber numr op ional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau numrul octetului (modul Binary) de unde ncepe citirea. Prima pozi ie este 1. varname numele variabilei unde se transfer informa ia. Dac nu se specific numrul nregistrrii se va citi din pozi ia activ de dup ultima instruc iune Get, Put sau Seek. Argumentul lips este indicat prin virgule: Get #4,,FileBuffer.

37

Pentru observa iile privind ac iunea instruc iunii Get, separat pentru modul Random i Binary, se va studia Help - Get. Observa iile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri. Put Scrie valoarea unei variabile date ntr-un fiier deschis n prealabil. Datele scrise cu Put sunt, n general, citite din fiier cu Get. Put [#]filenumber, [recnumber], varname unde filenumber este numrul fiierului unde se scriu datele (fiierul trebuie s fie deschis); recnumber numr op ional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau numrul octetului (modul Binary) unde ncepe scrierea. Prima pozi ie este 1. varname numele variabilei a crei valoare se scrie n fiier. Dac nu se specific numrul nregistrrii se va scrie n pozi ia activ de dup ultima instruc iune Get, Put sau Seek. Argumentul lips este indicat prin virgule: Put #4,,FileBuffer. Pentru observa iile privind ac iunea instruc iunii Put, separat pentru modul Random i Binary, se va studia Help - Put. Observa iile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri. Input # Citete date dintr-un fiier secven ial i le transfer n variabilele specificate. Instruc iunea se va utiliza doar cu fiierele deschise n modul Input sau Binary, datele citite cu Input # sunt scrise, de regul, cu Write #. Input #filenumber, varlist unde filenumber numrul fiierului (deschis n prealabil); varlist list de variabile, delimitate de virgule, pentru care se citesc valorile din fiier. Nu se pot include nume de tablouri sau variabile Object, dar se accept elemente de tablou i variabiel de tipuri utilizator. Pentru situa iile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz fr modificri. Pentru alte situa ii: Informa ia citit Virgul sau linie goal #NULL# #TRUE# sau #FALSE# Empty Null True sau False Valoarea asignat

38

#yyyy-mm-dd hh:mm:ss# #ERROR errornumber#

Data i/sau timpul reprezentat de expresie errornumber (variabila este un Variant considerat drept eroare)

Ghilimelele duble (" ") sunt ignorate n irul de intrare. Pentru o citire corect, datele din fiier trebuie s apar n aceeai ordine i de acelai tip cu variabilele din list. O variabil numeric primete valoarea 0 dac intrarea corespunztoare nu este numeric. Atingerea sfritului de fiier cnd opera iunea de citire nu este ncheiat, provoac eroare. ntruct utilizarea fiierelor este, n mod uzual, aceea de memorare controlat a unor informa ii (i nu aceea de a descifra informa ii scrise ntr-o structur necunoscut), se recomand scrierea cu Write # n cazul utilizrii ulterioare a comenzii Input #. Func ia Input() Citete i returneaz un ir de caractere citite dintr-un fiier deschis n mod Input sau Binary. Datele citite prin aceast func ie sunt scrise, de regul, prin Print # sau Put. Input(number, [#]filenumber) unde number orice expresie numeric specificnd numrul de caractere care se citesc. filenumber numr de fiier (deschis). Spre deosebire de instruc iunea Input #, func ia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF, ghilimele i spa ii de nceput). Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin func ia Input pn cnd EOF returneaz True genereaz eroare (procedeul este valid pentru citirea din fiiere binare cu Get). Se vor utiliza func iile LOF and Loc pentru detectarea sfritului de fiier. Observa ie. Pentru date pe octe i din fiiere text se va utiliza func ia InputB, cu o sintax similar, unde number specific numrul de octe i de returnat (n loc de numrul de caractere). A se vedea i Help Returning Strings from Functions. Line Input # Citete o singur linie dintr-un fiier secven ial (deschis) i asigneaz irul ob inut unei variabile de tip String. O linie este considerat terminat la ntlnirea caracterului CR (Chr(13)) sau a combina iei CR+LF (Chr(13)&Chr(10)). Caracterele CR i/sau LF nu sunt adugate irului asignat (se poate considera c secven a lor a fost srit). Line Input #filenumber, varname unde filenumber numrul ataat fiierului (deschis), varname nume de variabil String sau Variant.

39

Datele citite cu Line Input # sunt, de regul, scrise cu Print #. Write # Scrie o nregistrare ntr-un fiier secven ial. Datele scrise prin Write # sunt citite, de regul, cu Input #. Utilizarea scrierii cu Write # asigur o delimitare corect a fiecrui cmp scris, ceea ce permite regsirea corect (fr alte artificii) a informa iilor la citirea cu Input #. n acelai timp, informa iile sunt regsite corect indiferent de configurrile locale. Sintaxa este Write #filenumber, [outputlist] unde filenumber numrul ataat fiierului (deschis n prealabil), outputlist o list de expresii numerice sau ir, separate prin virgule, spa ii sau punct-virgul, ale cror valori se scriu n fiier. Specificarea unei virgule dup filenumber fr outputlist produce o linie goala n fiier. Sunt respectate urtmtoarele reguli de scriere: datele numerice sunt scrise cu punct ca separator zecimal (indiferent de setrile locale); datele Boolean sunt scrise ca #TRUE# sau #FALSE#, nefiind traduse dup setrile locale; datele calendaristice i timpul sunt scrise potrivit formatului de dat universal; dac o component este omis (sau este zero), se scrie doar partea indicat; Null se scrie drept #NULL#, iar Empty nu produce nimic n ieire; Date de tip Error apare #ERROR errorcode#.

Instruc iunea Write # insereaz ntre virgule ntre elementele scrise n fiier, ca i ghilimele n jurul irurilor de caractere (nu este prin urmare nevoie ca utilizatorul s introduc separatori pentru claritate). Dup ce toate valorile au fost scrise, se insereaz automat o combina ie CR+LF, astfel nct urmtoarea scriere va fi pe un rnd nou. Print # Scrie ntr-un fiier secven ial date formatate ca pe ecran (display-formatted). Prin urmare, cu excep iile specificate n continuare, setrile locale sunt respectate. Datele scrise cu Print # sunt, de regul, citite cu Line Input # sau cu Input. Sintaxa este Print #filenumber, [outputlist] unde filenumber numrul ataat fiierului (deschis n prealabil), outputlist list de expresii formatate ale cror valori sunt tiprite. Elementele se separ prin virgule, spa ii sau punct i virgul. Un element al listei de ieire este de forma

40

[{Spc(n) | Tab[(n)]}] [expression] [charpos] unde Spc(n) insereaz n spa ii n ieire Tab(n) pozi ioneaz punctul de inser ie (nceputul zonei de scriere) la o coloan indicat absolut de n. Utiliznd doar Tab se trece la urmtoarea zon de ieire. expression expresia a crei valoare se tiprete (numeric sau String). charpos Specific pozi ia punctului de inser ie pentru urmtorul caracter care va fi tiprit, potrivit tabelului care urmeaz. Dac nu se specific, urmtoarea tiprire va fi pe rndul urmtor. charpos ; Tab(n) Tab Locul punctului de inser ie Imediat dup ultimul caracter tiprit Coloana cu numrul n nceputul urmtoarei zone de tiprire

Dac se omite outputlist dar se include un separator dup filenumber, se va insera o linie goal n fiier. Datele logice sunt scrise drept True, False (fr traduceri locale). Datele calendaristice sunt scrise potrivit setrii locale pentru format scurt. Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fr traduceri locale). Informa iile numerice scrise sunt dup configurrile locale (separator zecimal). Pentru o interpretare corect, utilizatorul trebuie s separe valorile afiate prin formatri adecvate. Pentru afiari n fereastra Immediate a mediului VBA, se va vedea i metoda Print (vezi Help Print Method). Close nchide unul sau mai multe fisiere deschise prin Open pentru instruc iuni de I/O. Prin acest opera iune se rupe legtura ntre fiiere i numerele ataate i se elibereaz zonele tampon rezervate. Pentru un fiier nchis nu se mai pot executa opera iuni I/O (pn la o nou deschidere). Sintaxa este Close [filenumberlist] unde filenumberlist este lista de numere ataate fiierelor care se nchid, de forma [[#]filenumber] [, [#]filenumber] ; dac lista nu este prezent, atunci se vor nchide toate fiierele care sunt deschise.

41

nainte de nchidere, n fiierele deschise pentru Output sau Append se scriu zonele buffer nescrise nc. Reset nchide toate fiierele deschise prin instruc iuni Open. Sintaxa este Reset naine de nchidere se scriu n fiiere toate bufferele nescrise nc. Seek Stabilete pozi ia (nregistrrii sau octetului) ntr-un fiier unde se va efectua urmtoarea opera iune de intrare/ieire, fiierul fiind deschis prin Open (vezi i func ia Seek). Sintaxa Seek [#]filenumber, position unde filenumber numrul ataat fiierului. position numr ntre 1 i 2,147,483,647, inclusiv, care indic locul urmtoarei opera ii I/O. Numerele nregistrrilor specificate n instruc iunile Get i Put au priorirtate n raport cu pozi ia fixat prin Seek (are loc o repozi ionare). Dac opera iunea Seek indic o pozi ie dup sfritul fiierului, urmtoarea opera iune de scriere (fr repozi ionare) extinde fiierul. Pozi ia indicat nu poate fi zero sau negativ. Func ia Seek Returneaz, ca un ntreg Long, pozi ia curent I/O dintr-un fiier specificat. Fiierul trebuie s fie n prealabil deschis. Seek(filenumber) filenumber este un numr de fiier. Valoarea returnat este ntre 1 i 2,147,483,647 (echivalent cu 2^31 1), inclusiv (vezi i setarea pozi iei prin instruc iunea Seek) i are semnifica ia din urmtorul tabel. Modul de acces Random Binary, Output, Append, Input Valoarea returnat Numrul urmtoarei nregistrri (care va fi citit sau scris) Pozi ia octetului (numerotat de la 1) la care va avea loc urmtoarea opera iune I/O

42

EOF Returneaz un ntreg cu valoarea logic True (-1) atunci cnd se atinge sfritul unui fiier deschis pentru citire (Random, Binary sau Input). Pentru fiierele dschise n ieire func ia genereaz mereu True. EOF(filenumber) filenumber este un ntreg con innd numrul fiierului testat. Utilizarea uzual este Do While Not EOF(filenum) (instruc iuni, inclusiv citire din fiierul filenum) Loop Pentru acces secven ial (Input) se ntoarce False pn cnd se atinge sfritul de fiier, pentru fiierele Random sau Binary se returneaz False pn cnd ultima instruc iune Get executat nu a putut citi o nregistrare ntreag. Citirea cu Input dintr-un fiier deschis Binary produce eroare la utilizarea mecanismului general (pn cnd EOF () este true): se va utiliza citirea cu Get sau citirea cu Input mpreun cu func iile LOF sau Loc. Loc Returneaz, ca Long, pozi ia curent de citire/scriere ntr-un fiier deschis. Loc(filenumber) filenumber este numrul ataat fiierului. Valoarea func iei depinde de modul de acces Mod Random Sequential Binary Valoarea returnat Numrul ultimei nregistrri scrise sau citite Pozi ia curent mpr it la 128. (Se spune c aceast informa ie nu este niciodat util sau utilizat) Pozi ia ultimului octet citit sau scris.

Func ia Loc este utilizat, mpreun cu func ia LOF, la testarea sfritului de fiier la citiri Binary (schema general este dat la LOF). LOF Returneaz un Long care reprezint, n octe i, mrimea unui fiier deschis prin Open. Pentru fiierele nedeschise se poate utiliza, n acelai scop, func ia FileLen(). LOF(filenumber)

43

filenumber este numrul ataat fiierului. Utilizarea acestei func ii, mpreun cu func ia Loc, pentru determinarea sfritului de fiier (similar cu EOF) accesat Binary este dup schema general: Open filename For Binary As filenum Do While CurrentLocation < LOF(filenumber) (citire din fiierul filenum ) CurrentLocation = Loc(filenumber) Loop Visual Basic Editor n aceast sec iune se prezint mediul de dezvoltare Visual Basic for Applications integrat n Microsoft Office 97. Informa iile sunt, n general, valabile pentru Microsoft Excel 97, Word 97 i PowerPoint 97 care sunt prevzute cu un mediu complet de dezvoltare VBA, numit Visual Basic Editor. Atunci cnd vor fi necesare, se vor da explica ii suplimentare pentru Access 97. Utiliznd Visual Basic Editor, numit n continuare VBE, se poate crea, edita, depana i executa cod program asociat cu documente Microsoft Office. Proiectele dezvoltate n VBE, dei sunt asociate aplica iilor din Office, nu pot fi reduse, ca problematic, la procesarea de texte (Word), calcul tabelar (Excel), prezentri electronice (PowerPoint) sau baze de date (Access). Este corect s se considere aceste proiecte drept aplica ii similare celor dezvoltate n alte medii de programare, avnd ns la dispozi ie componentele aplica iilor din Office. Cu alte cuvinte, nu este vorba de o limitare a posibilit ilor de prelucrare, ci o poten are a acestora prin apelul posibil la obiectele din Office. O obiec ie la utilizarea VBA este aceea c proiectul se poate executa doar dintr-o aplica ie Office (deci deschiznd, chiar formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente disponibile n dezvoltarea proiectului compenseaz acest neajuns. n plus nu trebuie uitat c orice aplica ie necesit o interfa utilizator (puternic n Microsoft Office) i c aplica iile de baz sunt ntre inute i completate de Microsoft, astfel nct proiectele noastre se vor actualiza i ele o dat cu componentele Office. Un ultim argument este acela c mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio (Visual Basic, C++ etc.) astfel c practica n VBA poate fi considerat introductiv ctre alte aplica ii RAD. Interfa a grafic VBE Pentru a deschide editorul VB, mai nti se va porni o aplica ie din Microsoft Office, apoi se poate ac iona combina ia Alt+F11 (dac nu a fost atribuit altei opera iuni), sau butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizat ntr-o aplica ie Office, sau Meniul Tools, Macro, Visual Basic Editor.

n Access se va activa fia Modules a proiectului.

44

Interfa a grafic VBE este suficient de complex, asemntoare mediilor de programare din Visual Studio. Pe lng obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite categorii de obiecte: Properties Window pentru vizualizarea i fixarea propriet ilor n momentul proiectrii (design-time); Project Explorer care permite navigarea, vizualizarea i modificarea proiectelor deschise la un moment dat; Code Window unde este se scrie i este vizibil codul surs al proiectului activ; Locals Window care permite vizualizarea variabilelor locale cu valorile lor; Immediate Window care permite executarea imediat a unei linii de cod; Watch Window unde se afieaz valorile unor expresii specificate (utile n depanarea programelor).

Properties Window Prin proprietate a unui obiect se n elege o caracteristic a respectivului obiect (cum ar fi culoarea sau vizibilitatea etc.). Fixarea valorii propriet ii se reflect n aparen a obiectului sau n comportamentul lui (de exemplu, fixarea propriet ii ShowSpellingErrors la valoarea True arat n document erorile de scriere). Fereastra Properties poate fi utilizat, n momentul proiectrii, pentru a vizualiza toate propriet ile obiectului activ i a modifica valorile dorite. n partea superioar este cutia de obiecte n care se poate selecta un obiect (sau mai multe) dintre cele vizibile. n fia Alphabetic se listeaz propriet ile modificabile ale obiectului selectat, n ordine alfabetic. Se poate modifica valoarea unui atribut prin selectarea numelui propriet ii i tastarea sau selectarea noii valori. n fia Categorized sunt listate propriet ile dup categorii, ntr-un control de tip Explorer, in care ramurile pot fi expandate sau. Fereastra Properties poate fi artat (cnd nu este vizibil), prin comanda Properties Window din meniul View. Project Explorer Codul surs asociat cu un workbook, document, template sau prezentare este asociat ntr-un proiect, care este memorat i salvat n mod automat o dat cu caietul Excel, documentul Word, ablonul sau prezentarea respectiv. n fereastra Project Explorer se pot vedea, modifica i naviga printre toate proiectele asociate oricrui document, caiet, ablon sau prezentare deschise. Pentru un proiect se listeaz, ntr-un control de tip Explorer, obiectele care recunosc evenimente, formele, modulele, referin ele. Pentru a vedea codul dintr-un modul sau codul asociat unui obiect, se selecteaz respectivul modul sau obiect i se apas butonul View Code (primul din stnga). Pentru a vedea interfa a utilizator pentru un obiect sau form se selecteaz i se apas butonul View Object (cel din mijloc). Pentru a vedea organizarea n foldere a elementelor listate n Project Explorer se va apsa butonul Toggle Folders. Fiecare element este nso it, n arborele de structur, de icoana specific elementului: proiect, folder, referin , obiect etc.

45

Code Window Fereastra principal a Editorului Visual Basic este cea n care se poate scrie codul surs. Deoarece procedurile sunt asociate unor obiecte de interfa , sau apar in unui modul, mai nti se va selecta, din Project Explorer, modulul sau forma vizat i apoi se va apsa butonul View Code. Pentru a vedea mai mult de o procedur n fereastra de cod, se va selecta boxa de control Default to Full Module View n fia Editor din Options (meniul Tools) (n caz contrar se va vedea doar cte o procedur). n partea de sus a ferestrei se gsesc dou boxe: Object Box unde se poate selecta obiectul pentru care se afieaz procedurile asociate; Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaz/editeaz codul. Procedurile pot fi de tip eveniment, dac obiectul selectat este o form utilizator. Selectarea unei proceduri produce o defilare a textului astfel nct pointerul s fie la prima linie a procedurii.

Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat ntre ferestre, ferestrele se pot diviza utiliznd bara de divizare etc. Ac ionarea 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 Util n procesul de punere la punct a programului, fereastra Locals servete la afiarea automat a tuturor variabilelor declarate n procedura curent. Con inutul ferestrei este actualizat de fiecare dat cnd se trece din modul Run n modul Break sau atunci cnd se navigheaz n stiva de apeluri. Pentru o descriere a ferestrei se va vedea sec iunea dedicat depanrii programelor. Immediate Window Permite scrierea i execu ia imediat a unei linii de cod. Linia poate fi copiat n i dintr-o fereastr de cod. n modul de execu ie Break, instruc iunea din fereastra Immediate este executat n contextul procedurii afiate n Procedure Box. Pentru ac iunile posibile n fereastra Immediate, se va studia Help Immediate Window Keyboard Shortcuts. Watch Window Este fereastra unse sunt afiate automat valorile expresiilor urmrite n etapa de depanare a proiectului. Pentru o descriere a ferestrei Watch se va vedea sec iunea dedicat depanrii programelor. Scrierea procedurilor Instruc iunile unui proiect se pot nscrie, dup modul lor de creare, n dou mari categorii:

46

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

nregistrarea unui macro Ac iunea este util att prin aceea c opera iuni simple pot fi traduse uor n instruc iuni VBA, procedurile pot fi editate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cutare/nlocuire sau formatri de obiecte grafice) codul generat automat ofer un bun model de utilizare a obiectelor, propriet ilor i metodelor aplica iei. Pentru a nregistra un macro: Se afieaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite). Pe bara Visual Basic se ac ioneaz butonul Record Macro. n dialogul Record Macro se nlocuiete numele dat implicit n boxa Macro Name i apoi OK. Se poate utiliza boxa Store macro pentru a alege locul de memorare a codului. Se execut ac iunile menite s fie nregistrate/traduse n VB, n succesiunea dorit. Pe bara Stop Recording (aprut la ini ierea procesului de nregistrare) se apas butonul Stop Recording.

Pentru a vedea liniile de cod generate, se deschide n aplica ia de baz meniul Tools, comanda Macro, apoi Macros, se selecteaz dup denumire i se apas butonul Edit. Codul surs poate fi vzut i prin navigarea n VBE prin Project Explorer, ferestre de cod etc. Din punctul de vedere al programrii se poate spune c un macro este o procedur public fr argumente, deci poate fi scris i direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care pot fi executate din dialogul Macros (Tools - Macro - Macros) sunt macro-uri. Scrierea unei proceduri Dac se dorete scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific, se ca crea o procedur ntr-un modul standard. Pentru a crea un modul standard nou (gol), se merge n Project Explorer n proiectul unde se adaug modulul nou creat i se d comanda Module din meniul Insert. Pentru a deschide un modul standard existent, se va selecta modulul din Project Explorer i se apas butonul View Code (sau dublu click). Pentru a aduga o procedur la un modul, se selecteaz modulul n Project Explorer, se deschide meniul Insert i se d comanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta op iunile definitorii (subrutin sau func ie, public sau nu etc.) i se d OK. Dup aceasta se pot aduga liniile de cod ale procedurii. Scrierea unei proceduri de eveniment (event procedure) Dac se dorete scrierea de cod surs care s se execute automat atunci cnd are loc un anumit eveniment (cum ar fi deschiderea unui document, ac ionarea unui buton etc.), trebuie s se scrie o procedur asociat evenimentului respectiv. O asemenea procedur se va numi procedura evenimentului.

47

Anumite obiecte din aplica iile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declanate de ctre sistem sau de ctre utilizator. Evenimentele specifice fiecrui obiect trebuie s fie studiate separat (se va studia sec iunea din Help pentru fiecare aplica ie), doa principalele obiecte, cu propriet ile, metodele si evenimentele lor, sunt prezentate i n acest curs, n capitole separate. Modul cum aplica ia rspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de eveniment. O asemenea procedur se va scrie n fereastra Code asociat obiectului. De fiecare dat cnd apare evenimentul se execut procedura evenimentului respectiv. De exemplu, dac se scrie o procedur asociat cu evenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere a acelui documentului. O procedur de eveniment este memorat n documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc. unde poate fi declanat evenimentul. Pentru a vedea codul surs al procedurii, se va selecta obiectul n Project Explorer i click pe butonul View Code pentru a deschide fereastra de cod asociat. Dintr-o fereastr de cod deschis, asociat, se va selecta obiectul vizat, din boxa de obiecte, i n boxa de proceduri vor fi listate atunci toate procedurile evenimentelor, chiar dac ele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (dac nu exist) liniile obligatorii ale procedurii i va fixa cursorul de editare n procedura respectiv. Numele unei proceduri de eveniment este format din numele obiectului, care recunoate evenimentul, urmat de caracterul "_" i de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care se execut la deschiderea unui document. Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dup ce s-au scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte (Document, Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite. Observa ie. Dac se dorete ca o procedur s fie asociat cu un document specific, dar nu cu un eveniment specific, atunci procedura se va scrie n sec iunea (General) a documentului respectiv (de exemplu o rutin care s poat fi apelat din mai multe proceduri de eveniment). Unelte VBE pentru scrierea instruc iunilor Deoarece multe dintre denumirile obiectelor, propriet ilor sau metodelor care apar n codul VBA sunt complexe, mediul de dezvoltare ofer o serie de unelte pentru completarea automat a cuvintelor cheie, pentru oferirea de ajutor n reamintirea denumirilor etc. Dac s-au tastat suficient de multe caractere nct VB poate recunoate un cuvnt, atunci prin CTRL+SPACE, sau click pe butonul Complete Word de pe bara de unelte Edit, completeaz cuvntul. n dialogul Options (meniul Tools) se pot activa urmtoarele ac iuni, executate automat la completarea unei linii de cod: verificarea automat a sintaxei Auto Syntax Check; obligativitatea declarrii tuturor variabilelor, adugarea automat a instruc iunii Option Explicit la orice nou modul Require Variable Declaration; afiarea unei liste cu informa ii utile (logice la pozi ia curent a cursorului) la completarea instruc iunii Auto List Member; afiarea informa iei despre proceduri i parametrii lor Auto Quick Info; afieaz, doar n modul Break, valoarea unei variabile peste care este plasat cursorul Auto Data Tips; alinierea automat a liniilor noi la nceputul liniei precedente Auto Indent; fixarea l imii ntre pozi iile tabulatorului, 1 la 32 de spa ii (implicit fiind 4) Tab Width.

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

48

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

Executarea unei proceduri Sub O procedur poate s se execute: automat, ca rspuns la declanarea unui eveniment (procedura evenimentului); din VBE, dac punctul de inser ie este n procedur i se ac ioneaz butonul Run Sub/UserForm de pe bara de unelte Standard sau Debug; ca un macro, Run din dialogul Macros (Tools - Macro) al aplica iei de baz; apelat din alt procedur.

La apelul unei proceduri din alt procedur se va ine seama de interac iunea declara iilor Public, Private, ca i de referin ele la alte proiecte (meniul Tools - References). Modele de obiecte Aproape toate ac iunile programate n VB implic manevrarea programatic a unor obiecte. Toate aplica iile din Microsoft Office sunt alctuite din componente formate din obiecte sau care gestioneaz obiecte. n aceast sec iune se prezint principalele concepte din programarea orientat pe obiecte, ca i uneltele i tehnicile disponibile pentru a explora i utiliza obiectele specifice din Office 97. Deoarece fiecare aplica ie din Office are un model propriu de obiecte, va fi dedicat cte un capitol pentru Word, Excel etc., n care se vor prezenta particularit ile de operare i obiectele specifice aplica iei. Privire general Orice aplica ie poate fi gndit ca ansamblul a dou lucruri: con inut i func ionalitate. Con inutul se refer la documentele pe care le con ine aplica ia, la elementele care compun documentele, la informa iile privind atributele elementelor. Func ionalitatea se refer la modurile, cile n care se poate lucra cu con inutul aplica iei, de exemplu: deschiderea, nchiderea documentelor, adugarea, copierea, formatarea elementelor etc. Con inutul i func ionalitatea unei aplica ii sunt divizate n unit i discrete de con inut i func ionalitate specific, numite obiecte. Exemplele uzuale sunt date de foile de calcul Excel, celule ale unei foi de calcul, sec iuni ale unui document Word etc., fiecare avnd evident un con inut i o func ionalitate specific, cele dou componente fiind unitar legate ntre ele. Obiectele unei aplica ii sunt ierarhizate n structuri, modelul de obiecte al aplica iei.. Obiectul de nivel maxim al unei aplica ii este, uzual, obiectul Application, care este aplica ia nsi. Obiectul Application con ine alte obiecte care pot fi accesate numai cnd obiectul Application exist (deci cnd aplica ia se execut). De exemplu, obiectul Application Excel con ine obiecte Workbook, dup cum obiectul Application Word con ine obiecte

49

Document. Deoarece obiectul Document depinde de existen a obiectului Application Word, se spune c obiectul Document este copilul obiectului Application; invers, obiectul Application se zice printele obiectului Document. Este uzual ca un obiect, care este copil al altui obiect, s aib, la rndul su, alte obiecte copii. De asemenea, este posibil ca un copil s aib mai mul i prin i. Modul n care obiectele, care alctuiesc o aplica ie, sunt aranjate relativ unele fa de altele, mpreun cu modul n care con inutul i func ionalitatea sunt divizate prin obiecte este numit ierarhia de obiecte sau modelul de obiecte. Fiecare aplica ie are un model de obiecte propriu, reprezentarea grafic a ierarhiei de obiecte pentru aplica ie poate fi vzut n Visual Basic Help din aplica ie. Fiecare obiect din ierarhie are un con inut i o func ionalitate care se aplic, ambele, att obiectului nsui, ct i tuturor obiectelor descendente din ierarhie. Cu ct obiectul este situat mai sus n ierarhie, cu att este mai vast domeniul con inutului i func ionalit ii sale. Locul unui obiect n model este gndit astfel nct con inutul i func ionalitatea lui sunt adecvate domeniului su. Se poate gndi i faptul c, dac aplica ia este divizat n obiecte, fiecare obiect ofer acces la arii specifice de con inut i func ionalitate. Afirma iile care implic obiecte utilizeaz i termenii de "con inut n" pentru copil i "con ine" pentru printe. Astfel, obiectul Application Word con ine obiecte Document, dar obiectul Selection este con inut n obiectul Windows etc. Propriet i i metode Pentru a avea acces la con inutul i func ionalitatea unui obiect, pentru nceput trebuie s se identifice obiectul (subiect discutat n continuare). Dup identificare, obiectul este accesibil prin intermediul propriet ilor i metodelor sale. n general, prin proprietate se n elege un atribut numit al obiectului. Valoarea atributului (propriet ii) poate fi modificat (de cele mai multe ori) sau poate fi ob inut (tiut) programatic. Prin metod se n elege o procedur care ac ioneaz asupra unui obiect. Pentru a distinge o metod de o procedur obinuit (care poate de asemenea s ac ioneze asupra unui obiect, n general vorbind), trebuie precizat c metodele implementeaz func ionalitatea obiectului, sunt specifice obiectului cruia i se aplic i sunt definite o dat cu obiectul (deci la proiectarea aplica iei de baz, n cazul obiectelor Office). Orice procedur utilizator ac ioneaz asupra obiectului prin intermediul metodelor specifice (aplicabile) acelui obiect. n general, se utilizeaz propriet ile pentru a accesa con inutul i se apeleaz metodele pentru a realiza func ionalitatea obiectului. Totui, aceast distinc ie este relativ: exist propriet i care se apropie de metode i metode care seamn a fi propriet i. Atunci cnd vom discuta despre obiecte definite de utilizator se va vedea c este uor s se treac grani a dintre metode si propriet i n proiectarea obiectelor. Legtura dintre modelul obiectelor i interfa a utilizator Exist dou ci prin care utilizatorul poate interac iona cu obiectele aplica iei: o o manual (utiliznd interfa a utilizator a aplica iei); programatic (utiliznd un limbaj de programare).

n accesul manual se utilizeaz tastatura, mouse-ul sau cheile directe pentru a naviga ctre acea parte i func ie a aplica iei care execut ceea ce se dorete (formatarea unui paragraf, tergerea unor formule dintr-o celul, modificarea unui slide etc.). n accesul programatic, de exemplu n instruc iuni Visual Basic, se navigheaz n ierarhia de obiecte pentru a identifica obiectul vizat i apoi se utilizeaz proprietatea sau metoda care produce efectul urmrit. De exemplu, prin linia urmtoare, scris ntr-o procedur,

50

Workbook("Activitate.xls").Worksheets("Vanzari").Range("A5").Value = 100 se navigheaz n caietul Activitate la foaia Vanzari i se nscrie valoarea 100 n celula A5. Este evident c nscrierea are loc efectiv doar n momentul execu iei procedurii. Deoarece ambele moduri de acces, interfa a utilizator a aplica iei de baz i Visual Basic, ajung la acelai con inut i func ionalitate, multe dintre obiectele, propriet ile i metodele existente n modelele de obiecte Office au aceleai denumiri cu elementele din interfa a utilizator (denumiri de meniuri, comenzi, ac iuni etc.). Se poate observa, explicabil din punctul de vedere al evolu iei ctre modelele obiectuale, o asemnare global a modelului de obiecte cu interfa a utilizator. Aceast asemnare este ntrit i de faptul c pentru orice ac iune posibil prin interfa a utilizator exist posibilitatea de a scrie cod Visual Basic echivalent (vezi i discu ia cu nregistrarea macro-urilor). Din exemplul prezentat la accesul din VB, este de re inut importan a cunoaterii locului ocupat de obiectul procesat n ierarhia de obiecte: pentru a utiliza propriet ile sau metodele lui trebuie identificat corect prin navigarea (calificarea) de la nivelul cel mai de sus pn la el. ntregul traseu (cu excep ia nivelului Application, care este uneori subn eles) trebuie specificat ca n exemplul artat. Colec ii de obiecte O colec ie este un obiect care include obiecte similare (dar nu neaprat), astfel nct se poate opera cu ansamblul lor. Acest lucru nu nseamn c metodele sau propriet ile obiectelor (dac sunt toate de acelai tip) se aplic tuturor elementelor colec iei. Ca obiect separat, o colec ie are propriet i i metode specifice (numrul de elemente, adugarea unui nou element etc.). De regul, colec iile definite n Office (exist posibilitatea de a defini noi colec ii) se remarc prin aceea c au forma de plural a denumirii elementelor lor: Workbooks este colec ia de obiecte Workbook, Documents este colec ia de obiecte Document etc. Elementele (membrii) colec iei se pot identifica prin numrul de ordine (ncepnd cu 1) sau prin nume (rezult c ansamblul elementelor este ordonat). Astfel instruc iunea Presentations.Item("Perspective").Close utilizat n PowerPoint produce activarea prezentrii cu numele Perspective i apoi o nchide. Exemplul utilizeaz metoda Item pentru a returna elementul colec iei de prezentri cu numele specificat. De regul, aceast metod este implicit, deci Presentations("Perspective").Close este o form echivalent. Numrul de elemente ale colec iei se pot afla prin proprietatea Count, se pot aduga noi elemente prin metoda Add etc. O utilizare frecvent a colec iilor este parcurgerea tuturor elementelor ntr-o structur 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)

51

End If Next End Sub care, ntr-o aplica ie Word, afieaz numele tuturor documentelor deschise cu mai mult de un cuvnt scris. Automatizarea ac iunilor prin folosirea obiectelor Prin automatizarea unei ac iuni se n elege scrierea unei proceduri care s produc, la executarea ei, ac iunea dorit. Execu ia poate fi comandat direct sau ca rspuns la declaarea unui eveniment. Pentru a automatiza o ac iune n Microsoft Office, se va ob ine o referin la obiectul care dispune de con inutul i func ionalitatea pe care le urmrim i se vor aplica propriet ile i metodele adecvate. Procesul poate necesita o succesiune de asemenea opera ii. Ob inerea unei referin e la un obiect Pentru a ob ine o referin la un obiect trebuie s se construiasc o expresie care ajunge s acceseze un obiect din modelul de obiecte i apoi, utiliznd propriet i i/sau metode, s se navigheze n sus sau n jos prin ierarhia de obiecte pn cnd ajungem la obiectul dorit. Propriet ile i metodele utilizate pentru a returna punctul de start i pentru a parcurge ierarhia de obiecte se numesc accesori de obiecte (object accessors) sau accesori. Cteva idei utile pentru construirea expresiei care returneaz referin a la un obiect sunt urmtoarele: - un loc obinuit pentru a accesa modelul de obiecte este obiectul cu nivelul cel mai nalt, uzual obiectul Application. Se va utiliza proprietatea Application pentru a returna o referin la obiectul Application. Urmtoarea expresie returneaz o referin la obiectul Application (pentru orice bibliotec de obiecte care con ine un obiect Application). Application - pentru a ajunge din vrful ierarhiei pn la un obiect, se vor parcurge obiectele de pe toate nivelele, utiliznd accesori care returneaz un obiect din altul. De exemplu, proprietatea Documents a obiectului Word Application returneaz obiectul colec ie Documents, care reprezint toate documentele deschise. Prin urmare urmtoarea expresie ntoarce o referin la obiectul colec ie Documents: Application.Documents - Exist accesori direc i (shortcut accessors) care dau acces direct la obiecte din model fr s fie necesar un acces prin vrful ierarhiei. Asemenea accesori sunt Documents, Workbooks, Presentations care dau acces imediat la colec ia de documente din Word, Excel i PowerPoint. Exist i alte propriet i cu rol de accesori direc i: ActiveWindow, ActiveDocument, ActiveWorksheet, ActiveCell. De exemplu, urmtoarea instruc iune nchide documentul Word activ: ActiveDocument.Close Observa ie. Se poate utiliza drept shortcut orice accesor care apare n zona Members of din Object Browser atunci cnd este selectat <globals> n zona Classes; adic nu trebuie s se returneze obiectul cruia i se aplic proprietatea sau metoda naintea utilizrii propriet ii sau metodei, ntruct Visual Basic poate s determine din contextul n care se execut codul crui obiect i se aplic proprietatea sau metoda respectiv.

52

- Pentru a returna un singur element al unei colec ii se va utiliza proprietatea sau metoda Item cu numele sau numrul de ordine al elementului. Pentru cele mai multe colec ii, Item este implicit, deci poate lipsi Workbooks.Item("Vanzari") Workbooks("Vanzari") - Pentru a "urca" n ierarhia de obiecte, se utilizeaz, de obicei, proprietatea Parent a obiectului curent. De notat c proprietatea Parent poate returna uneori, n special dac obiectul este membru al unei colec ii, "bunicul" obiectului n locul printelui (adic printele colec iei n locul colec iei). De exemplu Document.Parent - returneaz obiectul Application i nu Documents. - Prin func ia TypeName (executat eventual n Immediate Window) se poate gsi ce tip de obiect ntoarce proprietatea Parent (func ia nu este limitat la aceast proprietate, vezi VB Help). Aplicarea propriet ilor i metodelor Dup ob inerea unei referin e la obiectul urmrit, acestuia i se pot aplica propriet i i metode pentru a modifica valoarea unui atribut sau pentru a-l procesa. Se utilizeaz operatorul punct (".") pentru a separa expresia care returneaz o referin la obiect de proprietatea sau metoda care se aplic obiectului. De exemplu ActiveWindow.Left = 200 fixeaz pozi ia din stnga a ferestrei active utiliznd proprietatea Left a obiectului Window, referin a la acest obiect fiind returnat de accesorul direct ActiveWindow. ActiveDocument.Close nchide documentul activ (n Word) utiliznd metoda Close a obiectului Document la care returneaz o referin accesorul ActiveDocument. Propriet ile i metodele pot avea argumente care s precizeze valorile sau ac iunile. Urmtorul exemplu Word utilizeaz metoda PrintOut cu specificarea paginilor care se tipresc: ActiveDocument.PrintOut From:=" 3", To:=" 7" Este uneori necesar s se navigheze prin mai multe nivele n modelul de obiecte pentru a ajunge la ceea ce se consider date reale n aplica ie, cum ar fi valorile din celulele foii de calcul sau textul dintr-un document Word. Urmtoarele exemple Word arat cum se poate ajunge la text din vrful ierarhiei de obiecte: o o o o o o Proprietatea Application returneaz o referin la obiectul Application. Proprietatea Documents a obiectului Application returneaz o referin la colec ia Documents. Metoda Item a colec iei Documents returneaz o referin la un songur obiect Document. Proprietatea Words a obiectului Document returneaz o referin la colec ia Words. Metoda Item a colec iei Words returneaz o referin la un singur obiect Range. Proprietatea Text a obiectului Range stabilete textul itemului referit.

Astfel, urmtorul exemplu completeaz primul cuvnt din document

53

Application.Documents.Item(1).Words.Item(1).Text = "Primul " Deoarece proprietatea Documents este o proprietate global, poate fi utilizat fr calificativul Application; deoarece Item este proprietate sau metod implicit pentru colec ia de obiecte, nu trebuie enun at explicit. Din aceste considerente, exemplul urmtor realizeaz exact aceeai ac iune ca i exemplul precedent: Documents(1).Words(1).Text = :Primul " Pentru alte exemple de referin e i de utilizare a metodelor i propriet ilor se vor urmri exemplificrile de la capitolele urmtoare. Ajutor n scrierea programelor Pentru o imagine complet a uneltelor i mecanismelor prin care mediul de programare VB sus ine activitatea de scriere a instruc iunilor surs se va citi i capitolul dedicat mediului VBE. Utilizarea Macro Recorder nregistrarea unui macro ofer un ajutor important atunci cnd se cunoate realizarea unei ac iuni n interfa a utilizator a aplica iei de baz i se dorete cunoaterea obiectelor, propriet ilor i metodelor care pot s realizeze acea ac iune (sau ceva asemntor). n general, codul generat de nregistrarea macro nu este foarte eficient i robust, deoarece nregistrarea pleac de la obiectul selectat n momentul startului i realizeaz doar navigarea n restul modelului de obiecte. Orice utilizare ulterioar va necesita o selectare sau activare similar pentru a ndeplini ac iunea ateptat. Trebuie s se considere codul nregistrat doar o prim schi a procedurii, modificri ulterioare trebuind s produc o variant mai clar i mai robust. Codul generat este mai robust i mai flexibil dac va con ine expresii care navigheaz prin ierarhia de obiecte fr s nceap cu un obiect selectat sau activat. Idei n acest sens pot fi ob inute din studierea exemplelor date n Visual Basic Help: pozi ionarea punctului de inser ie pe o denumire de proprietate sau metod i ac ionarea tastei F1 afieaz subiectul respectiv din Help. O cale direct de accesare a fiierului de ajutor pentru un obiect este pozi ionarea n graficul care prezint ierarhia de obiecte (specific fiecrei aplica ii) i dublu click pe un obiect afieaz 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 aplica ie din Microsoft Office are o bibliotec de obiecte (object library sau type library), care con ine informa ii despre obiectele, propriet ile, metodele, evenimentele i constantele predefinite ale aplica iei. Pentru accesul la informa ia respectiv se poate utiliza Object Browser, unealt din VBE. Pentru a deschide Object Browser din VBE (n Excel, Word sau PowerPoint) sau dintr-un modul (Access), se alege Object Browser din meniul View. n boxa Project/Library se alege numele bibliotecii care se consult, sau <All libraries> pentru a vedea o list complet. Dac biblioteca dorit nu este n lista celor disponibile, se va crea o referin la aceast bibliotec prin alegerile corespunztoare n dialogul References (meniul Tools) al proiectului curent.

54

n boxa Classes se afieaz numele tuturor obiectelor i tipurilor enumerate (constantele predefinite) n bibliotecile referite. Not. O clas este un tip, o descriere a unui obiect. Un obiect este o instan efectiv a unei clase. Deseori aceti termeni sunt utiliza i unul n locul celuilalt, dac nu se produc confuzii (uneori chiar i atunci). n boxa Members of se afieaz toate propriet ile, metodele i evenimentele proprii (asociate) clasei selectate n boxa Classes. Selectarea unei intrri n list poate fi completat cu F1 pentru a vedea textul ajuttor, iar n zona inferioar (Detail pane) se afieaz infroma ii privind sintaxa, starea read-only sau read-write, biblioteca unde apar ine, tipul rezultatului returnat (dat sau obiect). Dac o informa ie este de tip legtur, activarea acesteia produce informa ii suplimentare, lucru util pentru a deduce modul de navigare ctre obiect. n figura prezentat 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 dragand-drop ntr-o fereastr cod. Legarea timpurie i uneltele de construire a instruc iunilor Atunci cnd se creeaz ntr-o aplica ie o variabil obiect care se refer la un obiect furnizat de alt aplica ie, Visual Basic trebuie s verifice c obiectul exist i c propriet ile i metodele utilizate pentru obiect sunt specificate corect. Acest proces de verificare se numete legare (binding). Legarea poate s apar n timpul execu iei proiectului (legare trzie) sau n timpul compilrii (legare timpurie). Codul legat trziu este mai ncet dect codul legat timpuriu. n plus, uneltele de ajutor n scrierea codului pot s lucreze corect doar n cazul legrii timpurii. Pentru a lega timpuriu codul se vor parcurge etapele: Se stabilete o referin la biblioteca de tipuri care con ine obiectele referite (Tools - References). Se declar variabila obiect de un tip specific (de exemplu As Document i nu As Object). Dac se scrie cod care utilizeaz obiecte din mai multe biblioteci, se va specifica numele aplica iei unde sunt declarate obiectele, mai ales dac obiecte cu acelai nume exist n mai multe biblioteci. (de exemplu As Excel.Window).

Dac o proprietate sau o metod utilizat returneaz un tip generic Object i nu un tip specific, atunci pentru legarea timpurie se va declara mai nti o variabil de tipul specific i apoi se va atribui rezultatul generic returnat acestei variabile, dup modelul Dim testWs As Worksheet Set testWs = Workbooks(1).Worksheets(1) necesar deoarece metoda Item a obiectului Worksheets returneaz un tip Object i nu Worksheet (chiar dac se refer la o foaie de calcul). Programarea obiectelor altei aplica ii Se poate executa, ntr-o aplica ie din Office, cod care s lucreze cu obiecte din alt aplica ie. Pentru a realiza acest lucru, se va urmri schema urmtoare: 1. Se stabilete o referin la biblioteca de tipuri a celeilate aplica ii (meniul Tools - References). 2. Se declar variabile obiect care vor referi obiecte din alt aplica ie cu tipuri specifice. Se va urmri calificarea fiecrui tip cu numele aplica iei care expune obiectul. Exemplul urmtor declar o variabil care se refer la un document Word i o variabil care se refer la un caiet Exce:

55

Dim appWD As Word.Application, wbXL As Excel.Workbook 3. Se utilizeaz func ia CreateObject cu identificatorul programatic OLE al obiectului cu care se dorete s se lucreze n cealalt aplica ie, dup modelul Dim appWD As Word.Application Set appWD = CreateObject("Word.Application.8") appWD.Visible = True 4. Pentru informa ii asupra identificatorilor OLE se va vedea VB Help - "OLE Programmatic Identifiers". 5. Se aplic obiectului, con inut n variabil, propriet ile i metodele dup modelul urmtor, care creeaz un nou document Word: Dim appWD As Word.Application Set appWD = CreateObject("Word.Application.8") appWD.Documents.Add 6. La sfritul lucrului cu cealalt aplica ie, se va utiliza metoda Quit pentru a o nchide, dup modelul appWD.Quit Obiecte Microsoft Word Visual Basic suport un set de obiecte care corespund direct elementelor din Microsoft Word 97, cele mai multe familiare celor care cunosc interfa a utilizator din Word: obiectul Document reprezint un document deschis, obiectul Bookmark reprezint un bookmark (semn de carte, punct de referin ) ntr-un document etc. Orice element din Word documente, tabele, paragrafe, cmpuri etc. poate fi reprezentat printr-un obiect din Visual Basic. Pentru automatizarea lucrului n Word se utilizeaz metodele i propriet ile acestor obiecte. Modelul de obiecte din Word 97 cuprinde aproximativ 180 de obiecte. O reprezentare grafic a structurii ierarhice se poate vedea n Help "Microsoft Word Objects". O descriere detaliat a unui obiect se ob ine prin dublu click pe numele obiectului (n diagram) sau, uzual, prin indexul din Help. La instalarea aplica iei trebuie s se mearg pe Custom i s se selecteze Online Help for Visual Basic. Dintr-un document Word, pentru a ajunge la modelul de obiecte se deschide dialogul Help i se merge pe succesiunea Contents and Index Microsoft Word Visual Basic Reference Visual Basic Reference Getting Started with Visual Basic Microsoft Word Objects. Din editorul VB se ajunge la con inutul i indexul VB Help for Word prin succesiunea Help Contents and Index Microsoft Word Visual Basic Reference (din fia Contents) Shortcut to Microsoft Word Visual Basic Reference. n cele ce urmeaz se vor prezenta doar principalele obiecte (mai sus n ierarhie, cele mai des utilizate, pentru opera iunile curente etc.) cu principalele metode i propriet i i pentru scopurile uzuale. Obiectul Application La pornirea unei sesiuni Word se creeaz automat un obiect Application. Se utilizeaz propriet ile i metodele obiectului Application pentru a controla sau returna (afla) atributele ntregii aplica ii, a controla aspectul ferestrei Word i

56

pentru a accesa restul modelului de obiecte. Se utilizeaz proprietatea Application pentru a returna obiectul Application Word.

Propriet i (Application) Dintre propriet ile care controleaz aspectul vizibil al aplica iei men ionm cteva n continuare. DisplayScrolllBars Exprim faptul dac sunt sau nu afiate barele de defilare. Read/write. La citire, returneaz o valoare Boolean: True, dac un document, cel pu in, are o bar de defilare False, dac n nici o fereastr de document nu exist bare de defilare.

Valoarea propriet ii se poate modifica: Atribuirea valorii True afieaz barele de defilare n toate ferestrele Atribuirea valorii False elimin barele de defilare din toate ferestrele.

Application.DisplayScrollBars = True Application.DisplayScrollBars = False Pentru barele orizontale sau verticale, individual, se utilizeaz propriet ile DisplayHorizontalScrollBar i DisplayVerticalScrollBar pentru o fereastr sppecificat. DisplayStatusBar Exprim faptul dac este afiat bara de stare a aplica iei. Read/write. Boolean. La citire, returneaz o valoare Boolean: True dac bara este afiat, False n caz contrar. La scriere atribuirea unei valori logice produce efectul evident. Height Read/write. Long. nl imea ferestrei aplica iei Word. Pentru a vedea dimensiunea maxim admis se va utiliza proprietatea UsableHeight. Width Read/write. Long. Returneaz sau fixeaz l imea obiectului, n puncte. With Application .Height = 450

57

.Width = 600 End With WindowState Read/write. Long. Returneaz sau stabilete starea ferestrei aplica iei. Poate fi una dintre valorile wdWindowStateMaximize, wdWindowStateMinimize sau wdWindowStateNormal, cu interpretri evidente. Valoarea wdWindowStateNormal arat o fereastr care nu este minimizat sau maximizat. Pentru a putea seta starea ferestrei, aceasta trebuie s fie activ (se va utiliza metoda Activate n acest scop). Urmtoarea instruc iune maximizeaz fereastra aplica iei Word Application.WindowState = wdWindowStateMaximize Alte propriet i care controleaz comportarea global a aplica iei Word, cum ar fi cele care corespund atributelor accesate prin comanda Options din meniul Tools, se gsesc la obiectul Options. Utiliznd proprietatea Options a obiectului Applications, se returneaz un obiect Options care poate fi apoi configurat, dup exemplul With Application.Options .AllowDragAndDrop = True .ConfirmConversions = False .MeasurementUnit = wdPoints End With Pentru informa ii complete se va studia obiectul Options. Dintre propriet ile obiectului Application care ofer acces la obiecte situate mai jos n ierarhie (accesori) sunt enumerate cele mai des utilizate. ActiveDocument Read-only. Returneaz un obiect Document care reprezint documentul activ (cel care are focusul). Dac nu exist nici un document deschis, atunci apare o eroare. ActivePrinter Read/write. String. Returneaz sau stabilete numele imprimantei active. Exemplul urmtor alege imprimanta activ: ActivePrinter = "HP LaserJet 4 local on LPT1:" Se observ utilizarea denumirii din mediul Windows. ActiveWindow

58

Read-only. Returneaz un obiect Window care reprezint fereastra activ. Dac nu exist nici o fereastr deschis, apare o eroare. MsgBox Application.ActiveWindow ActiveWindow = "Fereastra activa" Primul exemplu afieaz numele ferestrei active, al doilea atribuie un nou nume ferestrei active. Este de remarcat c numele ferestrei nu este obligatoriu identic cu numele documentului i c exemplele func ioneaz corect pentru c proprietatea implicit a obiectului returnat este numele (Name). Documents Read-only. ntoarce colec ia Documents a tuturor documentelor deschise. Selection Read-only. ntoarce obiectul Selection, care reprezint un domeniu selectat (redus eventual la punctul de inser ie). Este de remarcat c exist o singur selec ie pe fereastr (sau ochi de fereastr) i doar una este activ cea returnat. Pentru exemple se va vedea prezentarea obiectului Selection. Windows Read-only. Returneaz colec ia Windows a tuturor ferestrelor document. Colec ia corespunde ferestrelor cu denumirile (i numerele de ordine) listate la meniul Window din Word. MsgBox Windows.Count afieaz numrul ferestrelor deschise n Word (ataate unor documente). Metode (Application) Dintre metodele obiectului Application enumerm doar Quit, celelalte sunt sau mai rar utilizate, sau se mai aplic i altor obiecte i vor fi prezentate ulterior. Quit Apelul procedurii duce la nchiderea aplica iei Word i, op ional, salveaz sau ruteaz documentele deschise. Sintaxa: expression.Quit(SaveChanges, Format, RouteDocument) unde expression este o expresie care returneaz un obiect Application.

59

SaveChanges este de tip Variant, op ional, i specific dac Word salveaz documentele naintea nchiderii. Poate fi o constant (de tipul enumerat WdSaveOptions) wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges, interpretrile fiind evidente. OriginalFormat este de tip Variant, op ional, i specific modul n care Word salveaz documentele al cror format original nu a fost acela de document Word. Poate fi o constant (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument. RouteDocument este de tip Variant, op ional. Este True dac se dorete directarea documentului ctre urmtorul recipient. Dac documentul nu are ataat o fi de rutare (routing slip), argumentul este ignorat (vezi obiectul RoutingSlip). n exemplul urmtor Application.Quit SaveChanges:=wdPromptToSaveChanges, OriginalFormat:=wdWordDocument se prsete Word, se ntreab utilizatorul dac se salveaz documentele care au fost modificate de la ultima salvare i toate documentele se salveaz n format Word (indiferent de formatul ini ial). Obiectul Document Deschiderea sau crearea unui fiier n Word produce crearea unui obiect Document. Se utilizeaz propriet ile i metodele obiectului Document sau ale colec iei Documents pentru a deschide, crea, salva, activa i nchide fiiere. n prezentarea obiectului Document alegem calea ac iunilor uzuale asupra unui document i nu listarea propriet ilor i metodelor (dect acolo unde este absolut necesar). Returnarea unui obiect Document Se poate ob ine orice document deschis ca un obiect Document prin Documents(index) unde index este numele documentului (ca ir) sau numrul de ordine al documentului n colec ie. Deoarece numrul de ordine se poate schimba, prin modificarea colec iei, se recomand utilizarea numelor documentelor. n exemplul Set wdRaport = Documents("Raport.doc") variabila wdRaport, definit de tip obiect, con ine un obiect Document care se refer la documentul deschis "Raport.doc". Orice transformare a variabilei se va reflecta n documentul Raport.doc. Se poate utiliza i proprietatea ActiveDocument (vezi Application) pentru a returna obiectul Document care se refer la documentul activ: If Documents.Count >= 1 Then MsgBox ActiveDocument.Name Else MsgBox "Nici un document nu este deschis" End If

60

Deschiderea documentelor Pentru a deschide un document existent, se va utiliza metoda Open a colec iei Documents, metod care deschide documentul specificat i l adaug la colec ia Documents. Returneaz un obiect Document. Sintaxa, n versiunea aplicabil aici, este expression.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format) unde expression este o expresie care returneaz un obiect Documents. FileName este de tip Variant i con ine numele documentului (inclusiv calea, dac este necesar). n Windows se pot specifica mai multe fiiere separate prin spa ii. Este semnalat eroare dac fiierul specificat nu exist. ConfirmConversions este de tip Variant, op ional. Are valoarea True pentru a afia dialogul Convert File dac fiierul nu este n format Word. ReadOnly este de tip Variant, op ional. Are valoarea True dac documentul se deschide ca read-only. AddToRecentFiles este de tip Variant, op ional. Are valoarea True dac numele fiierului se adaug listei fiierelor recent utilizate (de la baza meniului File). PasswordDocument este de tip Variant, op ional i reprezint parola necesar la deschiderea documentului. PasswordTemplate este de tip Variant, op ional i reprezint parola necesar la deschiderea ablonului (template). Revert este de tip Variant, op ional. Controleaz ce se ntmpl dac FileName este numele unui fiier deja deschis: True pentru a neglija orice schimbri nesalvate i redeschiderea documentului; False pentru a activa documentul deschis. WritePasswordDocument este de tip Variant, op ional. Este parola necesar pentru salvarea schimbrilor aduse documentului. WritePasswordTemplate este de tip Variant, op ional. Este parola necesar pentru salvarea modificrilor aduse ablonilui. Format este de tip Variant, op ional. Indic tipul de conversie utilizat la deschiderea documentului. Poate fi o constant (din tipul enumerat wdOpenFormat) dintre: wdOpenFormatAuto, wdOpenFormatTemplate, Valoarea implicit este wdOpenFormatAuto. Pentru o mai bun informare asupra ultimului argument, se va studia obiectul FileConverter. n exemplul urmtor se deschide fiierul Test.doc din folderul curent: Set wdTestDoc = Documents.Open(FileName:="test.doc") wdOpenFormatDocument, wdOpenFormatText, WdOpenFormatRTF, WdOpenFormatUnicodeText.

61

Este de remarcat, n exemplu, c fiierul este n directorul curent, ceea ce poate produce erori la executarea codului: este suficent ca utilizatorul s schimbe folderul pentru ca documentul test.doc s nu mai fie gsit. Din acest motiv este de preferat ca numele s con de remarcat, n exemplu, c fiierul este n directorul curent, ceea ce poate produce erori la executarea codului: este suficent ca utilizatorul s schimbe folderul pentru ca documentul test.doc s nu mai fie gsit. Din acest motiv este de preferat ca numele s con in calea complet, ceea ce contribuie la robuste ea codului. n acelai scop se vor utiliza propriet ile PathSeparator (a obiectului Application), care returneaz caracterul separator utilizat de sistemul de fiiere, diferit n DOS/Windows i Macintosh i DefaultFilePath (a obiectului Options), care returneaz/seteaz ci ale folderelor specificate. n exemplul urmtor se utilizeaz obiectul FileSearch pentru a determina dac exist fiierul 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 i a modului cum se formeaz argumentul FileName din cale i denumire. O alt modalitate de deschidere a unui document este prin afiarea dialogului Open uzual n Office (ca i n alte aplica ii Windows). Acest mod se realizeaz prin Dialogs(wdDialogFileOpen).Show care returneaz un obiect Dialog ce se refer la dialogul Open (din meniul File) iar metoda Show afieaz i execut ac iunile executate n boxa de dialog Open. Utilizarea metodei Display (n locul metodei Show) produce doar afiarea dialogului fr nici o alt ac iune. Dac utilizatorul apas butonul OK al boxei, atunci este returnat valoarea -1 i se poate ti numele fiierului selectat n box dup modelul urmtor: Set dlg = Dialogs(wdDialogFileOpen) aButton = dlg.Display fSelected = dlg.Name If aButton = -1 Then Documents.Open FileName:=fSelected End If Observa ie. Pentru o discu ie mai ampl asupra utilizrii cutiilor de dialog definite n Word se va vedea Word VB Help "Displaying built-in Word dialog boxes". Pentru a determina dac un anumit document este deschis se poate enumera colec ia Documents i testa numele documentelor deschise. n urmtorul exemplu se activeaz documentul "cautat.doc" dac este deschis i se deschide dac nu este deja deschis.

62

docFound = True For Each aDoc In Documents If InStr(1,aDoc.Name,"cautat.doc",1) Then aDoc.Activate Exit For Else docFound = False End If Next aDoc If docFound = False Then Documents.Open FileName:="cautat.doc" Pentru a determina cte documente sunt deschise se utilizeaz proprietatea Count a colec iei Documents: If Documents.Count = 0 Then MsgBox "Nu este deschis nici un document" Crearea i salvarea documentelor Pentru a crea un nou document se utilizeaz metoda Add aplicat colec iei Documents. Metoda returneaz documentul creat ca un obiect Document, astfel nct valoarea returnat poate fi atribuit unei variabile de tip obiect pentru a putea referi direct noul document n program: Dim myDoc As Document Set myDoc = Documents.Add myDoc.PageSetup.TopMargin = InchesToPoints(1.25) ultima instruc iune fixeaz marginea de sus la 1.25". Documentul nou devine documentul activ. Pentru a salva un document nou pentru prima dat, se utilizeaz metoda SaveAs a obiectului Document. Exemplul urmtor este de acest fel: ActiveDocument.SaveAs FileName:="salvat.doc" Documentul activ este salvat cu numele "salvat.doc" i poate fi identificat cu acest nume n colec ia Documents. Exemplul urmtor construiete o expresie mai complicat, exploatnd cele spuse mai sus: se creeaz un nou document care este salvat imediat cu un nume i apoi se insereaz n document un tabel cu dou linii i trei coloane. Documents.Add.SaveAs FileName:="vanzari.doc" Documents("vanzari.doc").Tables.Add _ Range:=Selection.Range, NumRows:=2, NumColumns:=3 Pentru salvarea modificrilor efectuate ntr-un document, se utilizeaz metoda Save a colec iei Documents: Documents("vanzari.doc").Save Utilizarea metodei Save cu un document nou deschide dialogul Save As pentru a ntreba utilizatorul despre numele dat fiierului. Pentru salvarea tuturor fiierelor deschise se va utiliza metoda Save aplicat colec iei Documents.

63

Metoda Save are sintaxa dependent de obiectul cruia i se aplic: expression.Save unde expression este orice expresie care returneaz un obiect Document sau Template, este aplicabil unui document sau template. expression.Save(NoPrompt, OriginalFormat) este aplicabil colec iei Documents. Argumentele sunt expression este orice expresie care returneaz un obiect Documents. NoPrompt este de tip Variant, op ional. Are valoarea True pentru ca Word s salveze automat toate documentele, False pentru ca Word s ntrebe utilizatorul naintea de salvarea fiecrui document care a fost modificat. OriginalFormat este de tip Variant, op ional. Specific modul n care sunt salvate documentele. Poate fi o constant (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument. Activarea unui document Pentru activarea unui alt document se aplic metoda Activate obiectului Document respectiv. Reamintim c la crearea unui nou document, acesta rmne activ. Documentul activat trebuie s fie deschis (inclus n colec ia Documents): Documents("raport.doc").Activate Doc1.Activate dac variabila Doc1 a primit ca valoare un document deschis. Metoda Activate, aplicabil mai multor obiecte (vezi Word VB Help Activate Method), are sintaxa expression.Activate unde expression este orice expresie care returneaz un obiect cruia i se poate aplica metoda. Tiprirea unui document ntruct tiprirea unui document este gestionat de mai multe comenzi i parametri, din dialoguri diferite n mediul Word, controlul tipririi din Visual Basic necesit eventuale interven ii asupra obiectului Options (pentru a fixa parametrii accesa i uzual prin Tools Options fia Print) i utilizarea metodei PrintOut, aplicabil obiectului Document. Propriet ile obiectului Options, care privesc tiprirea, sunt identificate uor prin aceea c numele lor ncepe cu Print: PrintComments, PrintHiddenText, PrintDrawingObjects, PrintFieldCodes etc., atribuirea valorii True fiind echivalent cu marcarea boxei de control din dialogul Word corespunztor. Metoda PrintOut este aplicabil obiectelor Application, Document sau Window i are parametri corespunztori op iunilor din dialogul Print (meniul File din mediul Word). Sintaxa, cu specificarea i explicarea principalelor argumente, este

64

expression.PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName) unde expression este orice expresie care returneaz un obiect Application, Document sau Window. Background este de tip Variant, op ional. Are valoarea True dac tiprirea are loc n fundal (macro-ul continu n timpul tipririi documentului). Append este de tip Variant, op ional. Are valoarea True atunci cnd, la tiprirea n fiier, documentul este adugat fiierului specificat n argumentul OutputFileName; are valoarea False pentru rescrierea fiierului OutputFileName. Range este de tip Variant, op ional i specific tipul de domeniu tiprit. Poate fi una din constantele (de tip WdPrintOutRange): wdPrintAllDocument, wdPrintCurrentPage, wdPrintFromTo, wdPrintRangeOfPages sau wdPrintSelection. OutputFileName este de tip Variant, op ional. Dac PrintToFile este True, atunci argumentul d numele (eventual cu cale) pentru fiierul unde are loc tiprirea. From este de tip Variant, op ional. Specific numrul paginii de unde ncepe tiprirea, dac Range este wdPrintFromTo. To este de tip Variant, op ional. Specific numrul paginii pn unde se tiprete, dac Range este wdPrintFromTo. Item este de tip Variant, op ional. Specific elementul care se tiprete. Poate fi o constant (de tipul enumerat WdPrintOutItem): wdPrintAutoTextEntries, wdPrintComments, wdPrintDocumentContent, wdPrintKeyAssignments, wdPrintProperties sau wdPrintStyles. Copies este de tip Variant, op ional. Specific numrul de copii tiprite. Pages este de tip Variant, op ional. Specific numerele paginilor i secven ele de pagini care se tipresc, separate prin virgule, dac Range este wdPrintRangeOfPages. De exemplu, "2, 6-10" nseamn pagina 2 i paginile de la 6 la 10. PageType este de tip Variant, op ional. Specific tipul de pagini tiprite. Poate fi o constant (de tipul WdPrintOutPages): wdPrintAllPages, wdPrintEvenPagesOnly sau wdPrintOddPagesOnly. PrintToFile este de tip Variant, op ional. Are valoarea True pentru a trimite comenzile de tiprire ctre un fiier. Numele fiierului este dat n argumentul OutputFileName. Collate este de tip Variant, op ional. Are valoarea True pentru a tipri toate paginile documentului naintea tipririi urmtoarei copii (argument valabil n cazul tipririi mai multor copii ale documentului argumentul Copies). FileName este de tip Variant, op ional. Numele fiierului (inclusiv calea, dac este n alt folder dect cel curent) care con ine documentul care se tiprete. Dac argumentul este omis, atunci se tiprete documentul activ. Argumentul este admis doar pentru obiectul Application. Exemplul urmtor fixeaz pentru documentul activ tiprirea textului ascuns i tiprete primele trei pagini: Options.PrintHiddenText = True ActiveDocument.PrintOut Range:=wdPrintFromTo, From:=" 1", To:=" 3" Dac tiprirea se efectueaz cu valorile curente (implicite) ale parametrilor, atunci este suficient comanda: ActiveDocument.PrintOut

65

Se observ c opera iunea de tiprire necesit, pentru o procesare mai fin, specificarea documentului, specificarea paginilor, a tipului de tiprire (toate, pagini pare sau impare), specificarea destina iei (imprimant sau fiier). Se va vedea i proprietatea PageSetup care controleaz atributele paginii pentru document, sec iune etc. nchiderea documentelor Pentru nchidere se aplic metoda Close obiectului Document sau colec iei Documents. Documents("raport.doc").Close Dac s-au efectuat modificri n document, de la ultima salvare, se afieaz dialogul de salvare. nchiderea tuturor documentelor deschise se efectueaz aplicnd metoda Close pentru ntreaga colec ie: Documents.Close Metoda Close este aplicabil mai multor obiecte. Sintaxa pentru Documents sau Document este expression.Close(SaveChanges, OriginalFormat, RouteDocument) unde expression este o expresie care returneaz un obiect Document sau Documents. SaveChanges este de tip Variant, op ional. Specific tipul de ac iune privind salvarea documentului nainte de nchidere. Poate fi o constant (de tip WdSaveOptions): wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges, cu interpretri evidente. OriginalFormat este de tip Variant, op ional. Specific formatul documentului la salvare (poate fi o constant (de tip WdOriginalFormat): wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument. RouteDocument este de tip Variant, op ional. Are valoarea True dac documentul este rutat ctre urmtorul recipient. Dac documentul nu are ataat o fi de rutare (routing slip), argumentul este ignorat (vezi obiectul RoutingSlip). Urmtorul exemplu nchide, fr salvare, toate documentele: Documents.Close SaveChanges:=wdDoNotSaveChanges Accesarea obiectelor dintr-un document Din obiectul Document se pot accesa, prin propriet i sau metode, obiecte care corespund entit ilor care formeaz documentul scris n Word. Dintre obiectele accesibile men ionm (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" afieaz un mesaj cu numrul tabelelor existente n documentul activ.

66

Este evident c utiliznd propriet ile i metodele obiectelor astfel returnate se pot modifica programatic obiectele referite: se pot aduga i formata tabele, cmpuri, paragrafe, cuvinte etc. ActiveDocument.Footnotes.Add Range:=myRange, Text:="Textul notei de subsol adaugate" adaug o not de subsol la locul din document specificat de variabila myRange. Obiectul Range Un obiect Range reprezint o zon continua dintr-un document. Fiecare obiect Range este definit de o pozi ie (de caracter) de nceput i de o pozi ie (de caracter) de sfrit. Utilizat pentru identificarea unor por iuni din document, obiectul Range este similar obiectului Bookmark, diferen a fiind totui important: un obiect Range exist doar att timp ct se execut procedura care l-a definit. Atunci cnd pozi ia de nceput este identic cu pozi ia de sfrit, obiectul Range identific punctul de inser ie. Nu exist limitri asupra ntinderii unui obiect Range. Obiectele Range sunt independente de selec ia din document: se poate defini i modifica un domeniu fr s se schimbe selec ia. Se pot defini, de asemenea, domenii multiple ntr-un document, n timp ce selec ia este unic ntr-un ochi de fereastr.. Pentru a n elege toate propriet ile obiectului Range (i ale altor obiecte, de altfel), trebuie tiut c zonele unui document se presupun structurate n episoade (stories). Un episod (story) este o zon de text diferit de celelalte zone din acel document. Astfel, dac un document con ine text principal (body text), note de subsol i anteturi, atunci documentul con ine un episod cu textul principal, un episod cu note de subsol i un episod cu anteturi. Exist 11 tipuri diferite de episoade posibile ntr-un document, corespunznd urmtoarelor constante (din WdStoryType): WdEndnotesStory WdFirstPageFooterStory WdMainTextStory WdTextFrameStory Tipul episodului pentru un obiect de gen domeniu (Range), selec ie (Selection) sau semn de carte (Bookmark) este returnat de proprietatea StoryType. Cunoaterea acestei propriet i este important prin aceea c mediul Word deschide ferestre sau ochiuri diferite dup episodul n care este punctul de inser ie (selec ia), Pentru navigarea programatic ntre aceste ochiuri trebuie s se cunoasc valoarea propriet ii StoryType. Propriet ile Start, End i StoryType identific un obiect Range n mod unic. Start i End specific sau returneaz pozi iile de nceput i, respectiv, de sfrit ale obiectului Range. Pozi ia de caracter de la nceputul fiecrui episod este 0, pozi ia de dup primul caracter este 1 .a.m.d. Propriet ile Start i End sunt de tip Long, read/write. Pozi iile returnate sunt relative la nceputul episodului. Dac fixarea unei propriet i stric ordinea natural dintre start i end, atunci cealalt valoare este fixat automat la valoarea atribuit. Prin atribuirea de valori propriet ilor Start i End se poate modifica dimensiunea domeniului referit. Obiect Range vs. obiect Selection n general, este de preferat s se opereze cu obiecte Range n loc de obiecte Selection, deoarece: wdEvenPagesFooterStory wdFirstPageHeaderStory wdPrimaryFooterStory wdEvenPagesHeaderStory wdFootnotesStory wdPrimaryHeaderStory

67

se pot defini i utiliza mai multe obiecte Range (doar un obiect Selection pe fereastr); procesarea obiectelor Range nu modific textul selectat; procesarea obiectelor Range este mai rapid dect a selec iei.

La nregistrarea unui macro creeaz, de obicei, referin e la obiectul Selection. Utilizarea obiectului Range poate simplifica totui codul creat. Urmtorul exemplu aplic stilul bold primelor dou cuvinte din document i insereaz un paragraf dup cele dou cuvinte: Set myRange = ActiveDocument.Range(Start:=0, End:=ActiveDocument.Words(2).End) myRange.Bold = True myRange.InsertParagraphAfter Este interesant de comparat acest cod cu secven a ob inut la nregistrarea unui macro care efectueaz aceeai sarcin. Returnarea unui obiect Range prin metoda Range Aplicat unui obiect Document, metoda Range returmeaz un obiect Range situat n episodul principal. Sintaxa este expression.Range(Start, End) unde expression este orice expresie care returneaz un obiect Document. Start este de tip Long, op ional. Specific punctul de nceput (n pozi ii de caracter). End este de tip Long, op ional. Specific punctul de sfrit (n pozi ii de caracter). Pozi iile de caracter ncep cu 0 la nceputul documentului. Sunt numrate toate caracterele, inclusiv caracterele netipribile. Caracterele ascunse se numr chiar dac nu sunt afiate. Dac nu se specific pozi iile de nceput i/sau sfrit, se consider, implicit, nceputul i sfritul documentului. Exemplul urmtor scrie n bold primele 10 caractere ale documentului: ActiveDocument.Range(Start:=0, End:=10).Bold = True Dac este necesar ca obiectul Range returnat s fie referit de mai multe ori, se va utiliza instruc iunea Set prin care se atribuie obiectul returnat unei variabile obiect: Dim myRange As Range Set myRange = ActiveDocument.Range myRange.InsertAfter Text:="Final" Se observ definirea unei variabile obiect de tip specificat Range, ob inerea unui obiect Range egal cu tot documnetul (prin nespecificarea valorilor de start i end), atribuirea acestui obiect variabilei definite i utilizarea variabilei pentru a referi obiectul. Efectul este inserarea cuvntului "Final" dup ultimul caracter din document. n exemplul urmtor se observ utilizarea unui obiect Range doar ca punct de referin n document (asemenea unui Bookmark): Set inceputDoc = ActiveDocument.Range(Start:=0, End:=0)

68

Pozi iile de start i end pot fi specificate direct sau prin intermediul propriet ilor Start i End ale altor obiecte cum ar fi Selection, Bookmark sau Range, ca n exemplul urmtor n care se definete un domeniu care se refer la a dou i a treia propozi ie din document: Set myRange=ActiveDocument.Range( _ Start:=ActiveDocument.Sentences(2).Start, _ End:=ActiveDocument.Sentences(3).End) Deoarece obiectul Range nu are un corespondent visual n document, se poate utiliza metoda Select a obiectului pentru a produce selectarea textului din domeniu i a verifica, astfel, definirea corect a obiectului Range: myRange.Select selecteaz por iunea de text con inut n variabila myRange, creia n prealabil i s-a atribuit un Range. Returnarea unui obiect Range prin proprietatea Range Proprietatea Range este disponibil pentru multiple obiecte de exemplu Paragraph, Bookmark, Endnote, Cell i este utilizat pentru ntoarcerea unui obiect Range. Exemplele urmtoare sunt uor interpretabile. Pentru explica ii complete se vor studia obiectele respective. Active.Document.Paragraphs(1).Range ActiveDocument.Tables(1).Rows(1).Range ActiveDocument.Bookmarks(1).Range Nu trebuie uitat structura WithEnd With pentru procesri multiple ale aceluiai obiect Range. Modificarea unei por iuni a unui document Visual Basic include obiecte care pot fi utilizate pentru a modifica urmtoarele tipuri de elemente ale documnetului: caractere, cuvinte, propozi ii, paragrafe i sec iuni. Tabelul urmtor arat propriet ile (aplicabile unor diverse obiecte) care corespund acestor elemente i obiectele returnate: expresia Words(index) Characters(index) Sentences(index) Paragraphs(index) Sections(index) obiect returnat Range Range Range Paragraph Section

Pentru ultimele dou colec ii din tabel este de notat c pentru a junge la obiectul Range corespunztor se va apela la proprietatea Range. Prin urmare Paragraphs(index).Range Sections(index).Range

69

dau acces la obiectele Range respective. Pentru modificarea unui domeniu de text din document, se poate crea un obiect Range cu acele elemente (caractere, propozi ii, paragrafe etc.). Aplicarea propriet ilor i metodelor obiectului Range astfel creat va produce modificarea textului referit de obiect: ActiveDocument.Words(1).Case = wdUpperCase trece primul cuvnt din document n majuscule. De remarcat c proprietatea Case este aplicat obiectului Range returnat de ActiveDocument.Words(1). n formarea obiectelor Range sunt importante propriet ile Start i End care dau nceputul i sfritul. Propriet ile elementelor documentului, specificate n tabelul anterior n prima coloan, sunt admise pentru obiectele Document, Selection i Range. Lucrul cu textul dintr-un obiect Range Accesul la con inutul unui obiect Range este realizat prin proprietatea Text. Proprietatea Text returneaz textul neformatat (plain text) al domeniului referit. Atunci cnd se seteaz aceast proprietate, textul domeniului referit este nlocuit de valoarea atribuit propriet ii. primCuvant = ActiveDocument.Words(1).Text ActiveDocument.Words(1).Text = "Capitol" returneaz sau modific primul cuvnt din documentul activ. Pentru inserarea unui text naintea sau dup un obiect Range se utilizeaz, respectiv, metodele InsertBefore sau InsertAfter. Dup inserarea unui text, domeniul este extins automat pentru a include i textul inserat (nainte sau dup). Sintaxa metodelor este expression.InsertBefore(Text) expression.InsertAfter(Text) unde expression este o expresie care returneaz un obiect Selection sau Range. Text este de tip String i reprezint textul care se insereaz. Pentru inserarea caracterelor speciale se va utiliza func ia Chr, sau constantele Visual Basic cum ar fi vbCr, vbLf, vbCrLf sau vbTab. Inserarea unui text dup un domeniu care se refer la un ntreg paragraf are loc dup marca de paragraf. Drept urmare textul este inserat la nceputul paragrafului urmtor. Pentru a anula acest lucru se va identifica sfritul de domeniu (Range sau Selection) i se va scdea cu 1 pozi ia final (deci se va trece n fa a caracterului marc de paragraf). Exemplul urmtor arat mecanismul utilizat: Set Doc = ActiveDocument

70

Set myRange = Doc.Range( _ Start:=Doc.Paragraphs(1).Range.End - 1, _ End:=Doc.Paragraphs(1).Range.End - 1) myRange.InsertAfter " sfrit de paragraf." Un domeniu poate fi redus la punctul de nceput sau de sfrit (propriet ile Start i End devin egale cu pozi ia de caracter respectiv) prin metoda Collapse. Sintaxa este expression.Collapse(Direction) unde expression este o expresie care returneaz un obiect Range sau Selection. Direction este de tip Variant, op ional i indic direc ia n care are loc implozia domeniului. Poate fi o constant (de tip WdCollapseDirection) dintre: wdCollapseEnd sau wdCollapseStart. Valoarea implicit este wdCollapseStart. Utilizarea metodei cu wdCollapseEnd, atunci cnd domeniul se refer la un ntreg paragraf, produce un domeniu situat dup marca de paragraf. Pentru formatarea textului dintr-un obiect Range, se utilizeaz proprietatea Font pentru formatarea caracterelor proprietatea ParagraphFormat pentru formatarea paragrafelor.

Proprietatea Font returneaz un obiect Font care dispune de toate metodele i propriet ile necesare pentru aplicarea formatrilor admise pentru caractere n Word. Proprietatea ParagraphFormat returneaz un obiect ParagraphFormat care permite efectuarea tuturor formatrilor admise pentru un paragraf n Word. Deoarece ambele obiecte, Font i ParagraphFormat sunt foarte complexe dar reprezint ac iuni de rutin pentru un utilizator Word nu vor fi prezentate aici. Exemplul urmtor constituie un model suficient pentru orice alt ac iune care implic aceste obiecte: With ActiveDocument.Paragraphs(1).Range.Font .Name = "Times New Roman" .Size = 14 .AllCaps = True End With With ActiveDocument.Paragraphs(1).Range.ParagraphFormat .LeftIndent = InchesToPoints(0.5) .Space1 End With Textul surs precedent realizeaz pentru primul paragraf din documentul activ setarea fontului ca "Times New Roman", de mrime 14 i scris cu majuscule. n formatarea paragrafului se realizeaz indentarea din stnga cu 1.5" i spa ierea la un rnd. Redefinirea unui obiect Range Pentru modificarea limitelor unui obiect Range se pot utiliza, n mod uzual, propriet ile Start i End:

71

myRange.End = myRange.End + 10 Metodele MoveStart i MoveEnd produc o ac iune similar, dar se pot utiliza unit i diverse, predefinite, pentru extinderea domeniului. Ambele metode returneaz un in reg care arat numrul de unit i cu care s-a modificat Start sau End, sau 0 dac opera iunea nu s-a putut realiza. Sintaxa este expression.MoveStart(Unit, Count) expression.MoveEnd(Unit, Count) unde expression este o expresie care returneaz un obiect Range sau Selection. Unit este de tip Variant, op ional. Reprezint unitatea cu care se deplaseaz punctul de start/end al obiectului. Poate fi una dintre constantele (de tip WdUnits): wdCharacter, wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow sau wdTable. Pentru obiectul Selection poate fi i wdLine. Valoarea implicit este wdCharacter. Count este de tip Variant, op ional. Numrul maxim de unit i cu care se mut punctul de start/end. Poate fi negativ sau pozitiv, cu interpretrile curente. n cazul cnd opera iunea produce inversarea fizic a pozi iilor de Start i End, cele dou pozi ii devin egale (Range sufer un colaps). Valoarea implicit este 1. n exemplul urmtor myRange.MoveEnd Unit:=wdParagraph, Count:=1 se extinde domeniul nct s cuprind i urmtorul paragraf. Observa ie. Exist i metode mai fine cum ar fi MoveUntil, MoveWhile, MoveStartUntil, MoveEndWhile etc. Se va vedea intrarea respectiv din Word VB - Help. Metoda SetRange poate fi utilizat pentru modificarea simultan a limitelor unui obiect Range existent. Nu trebuie s se confunde cu metoda Range, care definete obiectul. expression.SetRange(Start, End) unde expression este o expresie care returneazun obiect Range sau Selection. Start este de tip Long, pozi ia nou de start. End este de tip Long, pozi ia nou de sfrit (end). De exemplu: myRange.SetRange Start:=myRange.Start, End:=myRange.End+10 care extinde domeniul cu 10 caractere.

72

Pentru deplasarea obiectului Range cu un numr de unit i se va studia metoda Next. Acest procedeu se poate folosi la parcurgerea seceven ial a unei secven e de cuvinte, paragrafe. Este de reamintit c o asemenea parcurgere poate fi efectuat i prin structura For EachNext. Atribuirea obiectelor Range O prim procedur este cea, exemplificat mai sus, n care se utilizeaz instruc iunea Set pentru atribuirea unui Range la o variabil obiect, instruc iune care poate opera i n ipostaza Set Range2 = Range1 La modificarea unui obiect, schimbarea se va reflecta automat i n cellalt obiect. Este de observat c printr-o instruc iune de atribuire direct Range2 = Range1 se atribuie proprietatea implicit a obiectului Range1 (adic proprietatea Text) propriet ii implicite a obiectului Range2. Prin urmare codul este echivalent cu Range2.Text = Range1.Text care nu modific obiectele Range respective (doar con inutul lui Range2). Cele dou obiecte pot fi la loca ii diferite, doar con inutul este acelai i legtura dintre ele nu se stabilete permanent. Prin proprietatea Duplicate se creeaz un nou obiect Range, duplicat, cu aceleai limite i text: Set Range2 = Range1.Duplicate Modificarea limitelor unui obiect nu influen eaz limitele celuilalt, dar modificarea textului poate produce modificarea celuilalt n cazul suprapunerii domeniilor. Obiectul Selection Atunci cnd se proceseaz un document n Microsoft Word, este uzual s se selecteze o por iune de text i s se formateze/modifice/etc. por iunea selectat. n Visual Basic, opera iunea de selectare prealabil nu este necesar, obiectul Range permite toate ac iunile pentru domenii determinate ale documentului. Totui, atunci cnd se dorete ca, programatic, s se rspund unei selec ii efectuate de utilizator, sau s se modifice selec ia etc., se poate opera cu obiectul Selection. Exist un singur obiect Selection pe ochi de fereastr i doar un obiect este activ la un moment dat (corespunznd locului unde este puctul de inser ie, cu toat zona selectat adiacent). Este evident, din lucrul n Word, c o selec ie poate s se refere la un ntreg domeniu sau poate fi redus la punctul de inser ie. Obiectul Selection este returnat de proprietatea Selection a obiectelor Application, Window sau Pane. Utilizat cu Application, proprietatea returneaz obiectul Selection care se refer la selec ia activ. Prin urmare Selection.InsertAfter Text:=" Text adugat dup selec ie" utilizeaz proprietatea Selection a obiectului Application (fiind global nu trebuie specificat obiectul), este returnat selec ia activ i se insereaz un text, similar metodei InsertAfter de la Range.

73

Dac se lucreaz cu selec ia dintr-o fereastr particular, obiectul respectiv se specific: Windows("Document2").Selection.Paragraphs(1).SpaceBefore = InchesToPoints(0.15) mrete la 0.15" spa iul dinaintea primului paragraf din selec ie (dac selec ia este punctul de inser ie, se modific paragraful curent). Urmtorul exemplu insereaz text n antetul primei pagini With ActiveWindow .View.Type = wdPageView .View.SeekVCiew = wdSeekPrimaryHeader .ActivePane.Selection.InsertAfter Text:="Capitolul I" End With n general, metodele i propriet ile uzuale ale obiectului Selection sunt similare celor de la obiectul Range. Este totui de amintit c obiectul Selection are corespondent grafic n document: zona selectat. Orice extindere sau implozie se vede imediat. Deplasarea i extinderea selec iei Deoarece nu exist dect o selec ie pe ochi de fereastr, selectarea unei noi zone mut implicit i obiectul Selection. Aceast selectare se efectueaz aplicnd metoda Select unui element din document: ActiveDocument.Words(1).Select permite mutarea selec iei la primul cuvnt, astfel nct se poate utiliza dup aceea metoda Selection: Selection.Text = "Primul" pentru modificarea textului selectat. Exist un numr de metode care deplaseaz selec ia n document (prin modificarea corespunztoare a obiectului Selection). Move(Unit, Count) reduce selec ia la punctul de sfrit (Count > 0) sau de nceput (Count < 0) i deplaseaz apoi punctul de inser ie astfel ob inut Count unit i (in sensul pozitiv sau negativ). MoveEnd, MoveStart similare descrierilor de la obiectul Range MoveLeft(Unit,Count,Extend) unde Unit poate fi wdCell, wdCharacter, wdWord sau wdSentence, Count este numrul de unit i, Extend arat tipul ac iunii: wdMove pentru colaps la stnga i mutarea selec iei, wdExtend pentru extensie spre stnga. MoveRight(Unit,Count,Extend) este similar metodei MoveLeft, dar ac iunea este spre dreapta. MoveDown(Unit,Count,Extend), MoveUp(Unit,Count,Extend) cu ac iune similar metodelor precedente, dar direc ia de ac iune este sus-jos. Unit poate fi wdLine, wdParagraph, wdWindow sau wdScreen. Extend poate fi wdMove sau wdExtend, cu sensul explicat anterior. Exemple:

74

Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove mut punctul de inser ie la nceputul paragrafului urmtor. Selection.MoveEnd Unit:=wdParagraph, Count:=1 extinde selec ia prin mutarea pozi iei finale la sfritul paragrafului. Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend extinde selec ia activ cu un cuvnt spre dreapta. Utilizarea metodelor GoToNext, GoToPrevious sau GoTo permite mutarea selec iei prin alegerea tipului de element int din document, a direc iei etc. Metoda GoTo Aplicat obiectului Selection, mut punctul de inser ie n pozi ia de caracter imediat precedent elementului specificat i returneaz un obiect Range (cu excep ia specificrii elementelor wdGoToGrammaticalError, wdGoToProofreadingError sau wdGoToSpellingError, caz n care Obiectul Range include i textul eronat). Sintaxa este expression.GoTo(What, Which, Count, Name) unde expression este o expresie care returneaz un obiect Document, Range sau Selection. What este de tip Variant, op ional i precizeaz tipul elementului unde se mut punctul de inser ie (selec ia). Poate fi una dintre constantele (de tipul enumerat WdGoToItem): wdGoToBookmark wdGoToEquation wdGoToGrammaticalError wdGoToLine wdGoToPercent wdGoToSpellingError wdGoToComment wdGoToField wdGoToGraphic wdGoToObject wdGoToProofreadingError wdGoToTable wdGoToEndnote wdGoToFootnote wdGoToHeading wdGoToPage wdGoToSection

Which este de tip Variant, op iomal i specific modul de mutare a selec iei. Poate fi una dintre constantele (de tip WdGoToDirection): wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious sau wdGoToRelative. Count este de tip Variant, op ional i indic numrul utilizat la determinarea elementului (n func ie de tipul de ac iune dat de Which). Este doar pozitiv i pentru gsirea unui element anterior se va utiliza wdGoToPrevious cu un Count > 0. Name este Variant, op ional i d numele elementului int, dac What este wdGoToBookmark, wdGoToComment, wdGoToField sau wdGoToObject.

75

Exemple: Selection.GoTo What:=wdGoToHeading, Which:=wdGoToFirst Selection.GoTo What:=wdGoToHeading, Which:=wdGoToAbsolute, Count:=1 Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=4 Selection.GoTo What:=wdGoToLine, Which:=wdGoToPrevious, Count:=2 Selection.GoTo What:=wdGoToField, Name:="Date" Metodele GoToNext, GoToPrevious Pentru ac iuni limitate doar la deplasarea cu un singur element, metodele cu sintaxa (pentru obiectele Range sau Selection): GoToNext(What) GoToPrevious(What) unde What este una dintre constantele de tip WdGoToItem (vezi metoda GoTo). Metodele returneaz un obiect Range (vezi discu ia de la GoTo). Obiecte accesibile din Selection Cele mai multe obiecte accesibile din obiectele Range i Document sunt disponibile i din obiectul Selection. Se pot astfel procesa obiectele din interiorul selec iei. Lista obiectelor care sunt referite din Selection este Bookmarks, Borders, Cells, Characters, Columns, Comments, Document, Endnotes, Fields, Find, Font, Footnotes, FormFields, Frames, HeaderFooter, Hyperlinks, InlineShapes, PageSetup, ParagraphFormat, Paragraphs, Revision, Range, Rows, Sections, Sentences, Shading, ShapeRange, Tables, Words. Aceste obiecte (colec ii de obiecte) sunt returnate prin propriet ile cu aceleai denumiri ale obiectului Selection. De exemplu Selection.Paragraphs.LeftIndent = InchesToPoints(0.5) Selection.Words(1).Italic = True MsgBox Selection.Footnotes(1).Range.Text Pentru parcurgerea tuturor obiectelor dintr-o colec ie returnat se va folosi structuraFor EachNext: For Each aBook In Selection.Bookmarks MsgBox aBook.Name Next aBook Propriet i i metode uzuale ale obiectului Selection Proprietatea Text Se va utiliza proprietatea Text pentru a returna sau stabili con inutul obiectului Selection:

76

strText = Selection.Text Selection.Text = "Hello World" Se va utiliza metoda InsertBefore sau InsertAfter pentru inserarea unui text nainte sau dup selec ie (cu extinderea corespunztoare a selec iei). Formatarea textului selectat Se vor utiliza propriet ile Font i ParagraphFormat pentru accesul la propriet ile i metodele proprii caracterelor i, respectiv, paragrafelor: With Selection.Font .Name = "Times New Roman" .Size = 14 End With Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5) Returnarea obiectului Range O importan deosebit o are proprietatea Range, care returneaz un obiect Range ce se refer la selec ia curent. n acest mod se poate exploata faptul c pot exista mai multe obiecte Range i memora selec ii succesive: Set myRange = Selection.Range O alt utilizare este aceea cnd anumite metode sau propriet i se pot aplica doar unui obiect Range: Selection.Range.CheckSpelling Proprietatea Information Returnarea informa iilor despre selec ie, cum ar fi numrul paginii curente, numrul total de pagini, faptul c selec ia este n antet sau picior de pagin etc. Sintaxa este expression.Information(Type) unde expression este o expresie care returneaz un obiect Range sau Selection. Type este de tip Long i precizeaz tipul informa iei care se returneaz. Poate fi una dintre cele 35 de constante de tip WdInformation, dintre care men ionm (doar pentru a exemplifica tipuri de informa ii ob inute): o wdActiveEndAdjustedPageNumber numrul paginii care con ine sfritul activ al selec iei sau domeniului. Numrul este ajustat pentru a considera personalizrile efectuate de utilizator (numr de nceput etc.). wdActiveEndPageNumber numrul paginii care con ine sfritul activ al selec iei sau domeniului. Numrul este dat relativ la nceputul documnetului, i nu este modificat de personalizrile efectuate de utilizator (numr de nceput etc.). wdHorizontalPositionRelativeToPage pozi ia orizontal a selec iei sau domeniului; distan a de la marginea stng a selec iei la latura stng a paginii. Distan a este dat n twips (20 twips = 1 point, 72 points = 1 inch). Dac selec ia sau domeniul nu este n zona ecran, atunci se ntoarce 1.

77

o o o

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

Exemplul urmtor afieaz, dac selec ia este ntr-un tabel, numrul de coloane i de linii ale tabelului: If Selection.Information(wdWithInTable) = True Then MsgBox "Coloane = " & Selection.Information(wdMaximumNumberOfColumns) _ & vbCR & "Linii = " & Selection.Information(wdMaximumNumberOfRows) End If Determinarea tipului de selec ie (text sau punct de inser ie) Prin proprietatea Type se poate ob ine informa ia privind tipul selec iei. Valoarea returnat, Long, este una dintre constantele tipului enumerat WdSelectionType: wdNoSelection, wdSelectionFrame, wdSelectionNormal, wdSelectionBlock, wdSelectionInlineShape, wdSelectionRow, wdSelectionColumn, wdSelectionIP, wdSelectionShape

Dintre aceste constante, wdSelectionNormal reprezint selec ia uzual a unei por iuni de text, wdSelectionBlock reprezint selec ia sub form de bloc dreptunghiular, wdSelectionIP este selec ia redus la punctul de inser ie. Exemplul urmtor selecteaz paragraful care con ine punctul de inser ie, dac selec ia este redus la punctul de inser ie: If Selection.Type = wdSelectionIP Then Selection.Paragraphs(1).Range.Select End If Obiectele Find i Replacement Gsirea i nlocuirea unor domenii specificate de text dintr-un document este o opera iune frecvent n procesarea textelor. Pentru realizarea programatic, n Visual Basic, dispunem de obiectele Find (pentru gsirea textului specificat) i Replacement (pentru nlocuire). Obiectul Find este permis fie din Selection, fie din Range. Exist mici deosebiri ntre cele dou moduri de acces, legate ndeosebi de transformarea obiectelor dac procesul de cutare se termin cu succes. Obiectul Replacement este accesibil din obiectul Find i permite toate ac iunile disponibile n boxa de dialog Find and Replace (meniul Edit din Word). Schema general pentru realizarea unei cutri urmat, sau nu, de o nlocuire este o o stabilirea parametrilor cutrii/nlocuirii, prin propriet ile obiectului Find/ Replacement. In proprietatea Text se precizeaz textul cutat sau nlocuitor. executarea cutrii/nlocuirii prin aplicarea metodei Execute.

78

Find Dintre propriet ile obiectului Find men ionm Font, returneaz un obiect Font pentru care se pot stabili atributele cutate. Format, este setat pe True dac n cutare se consider formatul textului. Read-write, Boolean. Forward, direc ia cutrii: True pentru nainte, False pentru napoi. Read/wtite, Boolean. Found este True dac s-a gsit o potrivire. Read, Boolean. MatchCase este True pentru o cutare care diferen iaz majusculele de minuscule. Read-write, Boolean. MatchWildcards este True dac textul cutat con ine caractere ablon de cutare. Read/write, Boolean. ParagraphFormat, returneaz un obiect ParagraphFormat prin care se pot stabili atribute de paragraf cutate. Style permite stabilirea stilului cutat (predefinit sau utilizator). Pentru lista constantelor ce denumesc stilurile predefinite se va vedea Word VB Help Style Property. Text, con ine textul cutat. Read-write, String. Wrap precizeaz modul de continuare n cazul atingerii sfritului (sau nceputului) fiierului sau negsirii textului n domeniul cutat. Poate fi o constant (de tip WdFindWrap): wdFindAsk consultarea utilizatorului, wdFindContinue continuarea n restul documentului, wdFindStop oprirea la epuizarea domeniului de cutare. Read/write, Long.

Obiectul Find are dou metode: o o ClearFormatting pentru nlturarea oricrei formatri a textului cutat, necesar pentru a ini ia o nou cutare de formate; Execute pentru a efectua cutarea pe baza atributelor fixate.

ClearFormatting Anuleaz orice formatare specificat pentru o opera iune de cutare sau nlocuire. Corespunde butonului No Formatting din dialogul Find and Replace (meniul Edit). expression.ClearFormatting unde expression este o expresie care returneaz un obiect Find sau Replacement. Execute Execut opera iunea Find specificat. Returneaz True dac opera iunea de cutare se termin cu succes (este gsit o potrivire cu textul cutat). Unele dintre argumentele metodei acoper valori ale propriet ilor obiectului Find. expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace) unde expression este o expresie care returneaz un obiect Find. FindText este de tip Variant, op ional. Reprezint textul cutat. Pentru cutarea unui format anume se va specifica un ir vid (""). Se pot utiliza caracterele speciale, similar celor disponibile n cutrile Word uzuale. MatchCase este de tip Variant, op ional. True sau False dup cum n cutare are importan capitalizarea caracterelor.

79

MatchWholeWord este de tip Variant, op ional. Este True dac n cutare se vor potrivi doar cuvinte ntregi. MatchWildcards este de tip Variant, op ional. True dac textul cutat utilizeaz abloane de cutare (wildcards). MatchSoundsLike este de tip Variant, op ional. True dac opera iunea de cutare accept i cuvinte care "sun" la fel cu textul cutat. MatchAllWordForms este de tip Variant, op ional. True dac opera iunea de cutare accept ca succes toate formele textului cutat. Forward este de tip Variant, op ional. True pentru o cutare nainte (spre sfritul documentului). Wrap este de tip Variant, op ional. Controleaz continuarea opera iunii la epuizarea domeniului cercetat. Valorile posibile sunt date la proprietatea Wrap: wdFindContinue, wdFindStop sau wdFindAsk. Format este de tip Variant, op ional. True dac n cutare este specificat o formatare (de caracter sau paragraf). ReplaceWith este de tip Variant, op ional. Textul nlocuitor. Pentru a specifica un obiect grafic sau nontext, elementul se trece n Clipboard i se specific "^c" n ReplaceWith. Replace este de tip Variant, op ional. Specific numrul de nlocuiri. Poate fi o constant (de tip WdReplace): wdReplaceAll, wdReplaceNone sau wdReplaceOne. Selection.Find Returnarea unui obiect Find din obiectul Selection produce schimbarea selec iei la ndeplinirea criteriilor de cutare. Textul care corespunde propriet ilor cutrii devine noua selec ie. Urmtorul exemplu selecteaz urmtoarea apari ie a cuvntului "Hello", cutarea oprindu-se la atingerea sfritului documentului: With Selection.Find .Forward = True .Wrap = wdFindStop .Text = "Hello" .Execute End With Acelai efect se putea ob ine folosind argumentele metodei Execute: Selection.Find.Execute FindText:="Hello", Forward:=True, Wrap:=wdFindStop Range.Find Utilizarea propriet ii Find a obiectului Range nu produce modificarea selec iei curente, dar obiectul Range respectiv este redefinit la gsirea textului care ndeplinete condi iile: With ActiveDocument.Content.Find .Text = "blue" .Forward = True .Execute If .Found = True Then .Parent.Bold = True End With

80

De remarcat c proprietatea Content returneaz obiectul Range care con ine episodul principal al documentului (textul principal). Codul din exemplu execut o cutare a primei apari ii a cuvntului "blue" n documentul activ. Dac opera iunea se termin cu succes, atunci obiectul Range este redefinit la cuvntul gsit, astfel nct prin .Parent se face referin la obiectul Range redefinit i cuvntul "blue" este trecut n stilul bold. Acelai efect se ob inea prin Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="blue", Forward:=True If myRamge.Find.Found = True Then myRange.Bold = True atributele cutrii fiind definite prin argumentele metodei Execute. Obiectul Replacement Referin a la obiectul Replacement se ob ine prin proprietatea Replacement a obiectului Find: expression.Find.Replacement Obiectul Replacement reprezint atributele textului nou (nlocuitor) ntr-o opera iune de cutare cu nlocuire. Dintre propriet ile obiectului Replacement amintim: Font, returneaz un obiect Font prin care se pot stabili atributele caracterelor noului text. ParagraphFormat, returneaz un obiect ParagraphFormat prin care se pot stabili atribute de paragraf pentru noul text. Style permite stabilirea stilului pentru textul nou (predefinit sau utilizator). Pentru lista constantelor ce denumesc stilurile predefinite se va vedea Word VB Help Style Property. Text, con ine textul nlocuitor (nou). Read-write, String.

Obiectul Replacement are doar metoda ClearFormatting, prin care se anuleaz toate atributele de format asociate noului text. Este util s se aplice metoda naintea definirii unei noi formatri pentru textul nlocuitor. Sintaxa este similar metodei de la obiectul Find. Executarea unei opera iuni de nlocuire necesit, de obicei, precizarea argumentului Replace al metodei Execute (pentru Find): With Selection.Find .ClearFormatting .Text = "hi" .Replacement.ClearFormatting .Replacement.Text = "hello" .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue End With execut o cutare a cuvntului "hi", neformatat, i nlocuirea tuturor apari iilor cu cuvntul "hello", de asemenea neformatat. Cutarea i nlocuirea are loc n tot documentul, indiferent de unde se ncepe. Selec ia se modific la fiecare ntlnire a cuvntului "hi", deoarece se pleac din obiectul Selection. With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False

81

End With .Execute FindText:="", ReplaceWith:="", Format:=True, Replace:=wdReplaceAll End With n acest exemplu se utilizeaz att pentru cutare, ct i pentru nlocuire textul vid, ceea ce produce doar o nlocuire a formatului bold cu formatul normal. Este de remarcat, pentru nlocuirea formatelor, combina ia de valori ale argumentelor FindText, ReplaceWith, Format. Selec ia nu se modific, deoarece s-a plecat din obiectul Range (returnat de proprietatea Content). Obiectele Table, Column, Row i Cell Prelucrarea tabelelor, un subiect foarte important n procesarea textelor, este posibil programatic prin utilizarea obiectelor Table, care refer un tabel din document, Column, care refer o coloan dintr-un tabel, Row, care refer o linie dintr-un tabel i Cell, care refer o celul dintr-un tabel.

Datorit complexit ii lucrului cu tabele (trasare liber, uniri de celule, divizri de celule etc.), metodele i propriet ile obiectelor amintite pot uneori s se produc rezultate neateptate (ca i n procesarea uzual din Word) dac nu sunt n elese exact. n general obiectele sunt accesate ca elemente din colec iile respective, dar exist i posibilitatea accesrii individuale. Colec ia Tables Reprezint mul imea tuturor tabelelor dintr-o selec ie, domeniu sau document. Servete pentru returnarea unui tabel: expression.Tables(index) sau pentru adugarea, programatic, a unui nou tabel la colec ie utiliznd metoda Add: expression.Add(Range, NumRows, NumColumns) unde expression este o expresie care returneaz un obiect Tables. Range este obiectul Range care refer domeniul unde se insereaz tabelul n document. Dac domeniul nu este redus la punctul de inser ie, atunci tabelul adugat nlocuiete tot domeniul con inut. NumRows, de tip Long, este numrul ini ial de linii ale tabelului. NumColumns, de tip Long, este numrul ini ial de coloane ale tabelului. Obiectul Table Este returnat prin numrul de ordine dintr-o colec ie Tables.

82

Propriet ile obiectului se refer la formatarea global a tabelului sau la obiectele componente ale unui tabel. Din prima categorie fac parte: o AutoFormatType, de tip Long, read only, este o constant de tip WdTableFormat (vezi intrarea din Help corespunztoare) care arat dac tabelul este formatat prin AutoFormat. De exemplu, wdTableFormatNone reprezint un tabel neformatat, pe cnd wdTableFormatProfessional arat selectarea formatului automat Professional. Vezi i metoda AutoFormat. Shading returneaz un obiect Shading prin care se stabilesc atributele de umbrire. Uniform, de tip Boolean, read only, are valoarea True dac toate liniile au acelai numr de coloane.

o o

Accesul la obiectele componente se realizeaz prin propriet ile o o o Borders, colec ia de chenare a tabelului, Columns, colec ia de coloane, Rows, colec ia de linii.

Metodele obiectului Table permit att opera iuni asupra ntregului tabel (autoformat, tergere, selectare, sortare, divizare etc.), ct i accesul la celulele tabelului. Men ionm: o o o o Cell(Row,Column) returneaz un obiect Cell care refer celula de pe linia Row i coloana Column din tabel. Row i Column sunt de tip Long i au valori de la 1 la numrul maxim de linii, respectiv coloane. Delete produce eliminarea obiectului, deci tergerea din document a tabelului. Select realizeaz 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. Datorit sintaxei complexe, argumentele vor fi studiate n Word VB Help. Split(BeforeRow) duce la divizarea tabelului nainte de linia indicat n BeforeRow (de tip Variant, poate fi un numr de linie sau un obiect Row).

Colec ia Columns Reprezint colec ia coloanelor unui tabel i este returnat prin proprietatea Columns a unui obiect Table. Dintre propriet i enumerm o o o o o Borders, returneaz colec ia de chenare, Shading, returneaz un obiect Shading prin care se stabilesc atributele de umbrire, Width returneaz sau stabilete l imea coloanelor, n puncte. Read/write, de tip Long. First returneaz prima coloan din colec ie. Read only. Last returneaz ultima coloan din colec ie. Read only.

Metodele permit opera iuni specifice tuturor colec iilor (Count, Add) sau specifice obiectului coloane de tabel: o o o o Add(BeforeColumn) prin care se adaug o nou coloan n fa a coloanei referite de BeforeColumn (care este de tip Variant, op ional, returneaz un obiect Column). AutoFit care ajusteaz l imea coloanei, dac este posibil, pentru a cuprinde textul interior. DistributeWidth care produce o redistribuire a l imilor nct toate coloanele s fie egale. SetWidth(ColumnWidth, RulerStyle) care stabilete l imea coloanelor: ColumnWidth, de tip Single, este l imea n puncte; RulerStyle, de tip Long, controleaz modul n care este ajustata l imea. RulerStyle poate fi una dintre constantele WdRulerStyle: wdAdjustFirstColumn modific doar prima coloan, wdAdjustNone nu modific celelalte coloane, wdAdjustProportional ajusteaz toate coloanele din dreapta, wdAdjustSameWidth aceeai l ime tuturor coloanelor specificate. Ultimul argument este mai

83

important pentru stabilirea l imii unor celule sau unei singure coloane (aplicnd metoda obiectelor respective i nu colec iei). Obiectul Column Reprezint o singur coloan dintr-un tabel. Este referit ca element al colec iei Columns: expression.Tables(index tabel).Columns(index) Dintre propriet ile obiectului men ionm: o o o o o Borders, Shading, Width sunt similare celor enumerate la colec ia Columns. Cells returneaz colec ia de celule din coloana referit. Index, read only, Long, returneaz numrul de ordine al coloanei n colec ia Columns. IsFirst, IsLast sunt True dac este referit prima, respectiv ultima coloan din colec ie. Next, Previous returneaz urmtorul element, respectiv precedentul element din colec ia Columns.

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

Colec ia Rows, Obiectul Row Reprezint colec ia liniilor dintr-un tabel i, respectiv, o linie a tabelului. Utilizarea acestor obiecte este similar operrii cu obiectele Columns i Column. Exist o serie de propriet i specifice, linie antet, mpr irea ntre pagini etc, dar corespund direct atributelor din Word i au semnifica ii evidente. Colec ia Cells Reprezint celulele dintr-o coloan, linie, selec ie sau domeniu. Pe lng propriet ile similare celor prezentate la coloane (Borders, Shading, Width, Height etc.) este util proprietatea o VerticalAlignment care returneaz sau stabilete alinierea vertical a textului n celule. Poate fi o constant de tip WdVerticalAlignment: wdAlignVerticalBottom, wdAlignVerticalCenter, wdAlignVerticalJustify sau wdAlignVerticalTop. Read/write Long.

Metodele mai des ntrebuin ate sunt

84

o o o o o o o o

o o Obiectul Cell

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

Reprezint o celul dintr-un tabel. Poate fi returnat prin metoda Cell dintr-un obiect Table sau ca element al colec iei Cells. Propriet i de identificare sunt cele care returneaz, ca obiecte sau ca index, coloana i linia celulei: o o Column, ColumnIndex returneaz ca obiect sau ca index coloana celulei. Row, RowIndex returneaz ca obiect sau ca index linia celulei.

Propriet i navigare n colec ia Cells sunt o Next, Previous cu semnificatia imediat.

Propriet ile de aspect i dimensiuni sunt cele prezentate la Columns/Column. Proprietatea care d acces la con inutul celulei i permite deci adugarea de text etc. este: o Range care returneaz un obiect Range.

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

o o

o o o

85

o o

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

Exemple cu obiecte Table, Column, Row, Cell Subiectul este foarte amplu i pentru mai multe exemple se vor studia subiectele corespunztoare din Word Visual Basic Help. If Selection.Tables.Count >=1 Then Selection.Tables(1).ConvertToText Separator:=wdSeparateByTabs End If convertete n text primul tabel din selec ie, dac selec ia con ine tabele, separnd con inutul celulelor de pe o linie prin caractere tab. Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=1) Set myCell = ActiveDocument.Tables(1).Columns(1).Cells(1) stabilesc referin e la celula din prima linie i prima coloan a primului tabel din documentul activ. Ambele linii se refer la aceeai celul. i=1 For Each celula In ActiveDocument.Tables(1).Range.Cells celula.Range.InsertBefore Text:="Celula " & i i = i+1 Next celula produce numerotarea celulelor din primul tabel al documentului. Este de remarcat utilizarea propriettii Range a obiectului Table (pentru a returna un obiect Range pentru care se returneaz colec ia Cells), ca i utilizarea propriet ii Range a obiectului Cell pentru inserarea de text. ActiveDocument.Tables(1).Columns(1).Select selecteaz prima coloan a primului tabel. ActiveDocument.Tables(1).Rows(1).Shading.Texture = wdTexture10Percent aplic o umbrire de 10% primei linii din tabel. n continuare sunt prezentate doar unele aspecte, considerate mai des utilizate, ale operrii cu alte obiecte (dect cele prezentate n precedentele dou fiiere) din modelul de obiecte al aplica iei Microsoft Word. Pentru informa ii mai ample se va studia Word VB Help sau alte materiale bibliografice. Utilizarea Obiectului HeaderFooter Obiectul HeaderFooter poate s reprezinte fie un antet, fie un picior de pagin. Obiectul HeaderFooter este un membru al colec iei HeaderFooters, care este accesibil din obiectul Section. Este important de tiut c nu se pot aduga elemente la colec ia HeadersFooters. Un document Word poate s aib anteturi/picioare de pagin pentru prima pagin, pentru pagini pare i pentru pagini impare i toate acestea sunt reprezentate.

86

Se utilizeaz propriet ile Headers(index) sau Footers(index), ale obiectului Section, pentru a returna un obiect individual HeaderFooter, unde index este o constant din tipul enumerat WdHeaderFooterIndex: wdHeaderFooterEvenPages, wdHeaderFooterFirstPage sau wdHeaderFooterPrimary. Este ns evident, dup denumiri, c Headers se refer la anteturi iar Footers la picioare de pagin. Urmtorul exemplu arat cum se poate modifica prin program un picior de pagin (de pe pagina impar): Set oRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range With oRange .Delete .Fields.Add Range:=oRange, Type:=wdFieldFileName, Text:="\p" .InsertAfter Text:=vbTab .InsertAfter Text:=vbTab .Collapse Direction:=wdCollapseStart .Fields.Add Range:=oRange, Type:=wdFieldAuthor End With Se observ definirea unui Range pentru a referi con inutul piciorului de pagin, tergerea vechiului con inut, adugarea unui cmp cu numele fiierului (n Text se d switch-ul \p de inserare a cii fisierului), inserarea a dou caractere TAB (pentru pozi ionarea n dreapta a denumirii fiierului), comprimarea domeniului la punctul de start i inserarea unui cmp cu numele autorului (din informa ia adiacent documentului). Un obiect HeaderFooter poate fi returnat i prin proprietatea HeaderFooter a obiectului Selection, cu men iunea c selec ia trebuie s fie ntr-un antet sau picior de pagin. Aceast condi ie se realizeaz, de exemplu, prin utilizarea propriet ii View, aplicat ferestrei active, care returneaz un obiect View. Proprietatea Type a obiectului View permite returnarea/stabilirea tipului de viziune (constante WdViewType, read/write, Long): wdMasterView, wdNormalView, wdOnlineView, wdOutlineView, wdPageView sau wdPrintPreview. n modul page layout (wdPageView), proprietatea SeekView returneaz sau stabilete care element din document este afiat (constante WdSeekView, Read/write, Long): wdSeekCurrentPageFooter, wdSeekCurrentPageHeader, wdSeekEndnotes, wdSeekEvenPagesFooter, wdSeekEvenPagesHeader, wdSeekFirstPageFooter, wdSeekFirstPageHeader, wdSeekFootnotes, wdSeekMainDocument, wdSeekPrimaryFooter sau wdSeekPrimaryHeader. Urmtorul exemplu insereaz un numr de pagin centrat, n piciorul de pagin al paginii curente: With ActiveWindow.View .Type = wdPageView .SeekView = wdSeekCurrentPageFooter End With Selection.HeaderFooter.PageNumbers.Add _ PageNumberAlignment:=wdAlignPageNumberCenter Exemplul mai arat i modul de inserare a numerelor de pagin: prin proprietatea PageNumbers se returneaz colec ia cmpurilor cu numerele de pagin incluse n respectivul antet sau picior de pagin. Proprietatea Add a colec iei adaug un nou cmp numr de pagin (n mod uzual singurul element al colec iei), referit printr-un obiect PageNumber pentru care se pot stabili o serie de atribute, dup cum altele (renceperea numerotrii, tipul de numerotare) se stabilesc la nivel de colec ie. n sfrit, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi i picioare de pagin existente, se stabilesc din propriet ile obiectului PageSetup, care reprezint comanda uzual Page Setup (Word meniul File). Se utilizeaz proprietatea DifferentFirstPageHeaderFooter a obiectului PageSetup pentru a specifica o prim pagin diferit, proprietatea OddAndEvenPagesHeaderFooter pentru anteturi/picioare de pagin diferite pentru pagini

87

pare/impare. Dac proprietatea OddAndEvenPagesHeaderFooter este True, atunci se returneaz antetul/piciorul paginii impare prin wdHeaderFooterPrimary i antetul/piciorul paginii pare prin wdHeaderFooterEvenPages. Colec ia Styles Accesibil din obiectul Document, prin proprietatea Styles, colec ia Styles reprezint toate stilurile din documentul respectiv. Identificarea unui stil particular se efectueaz uzual prin expression.Styles(index) unde expression returneaz un obiect Document index este nume de stil (definit de utilizator), constant WdBuiltinStyle (nume de stil predefinit, cum ar fi wdStyleHeading1) sau numr (indicele n colec ie). Numele trebuie dat exact, cu spa ieri dac aa a fost definit, cu excep ia capitalizrii. Adugarea unui nou stil definit de utilizator se realizeaz prin metoda Add, avnd sintaxa expression.Add(Name, Type) unde expression este o expresie care returneaz un obiect Styles. Name este String i reprezint numele noului stil. Type este Variant, op ional i stabilete tipul stilului. Poate fi una dintre constantele WdStyleType: wdStyleTypeParagraph sau wdStyleTypeCharacter. Obiectul Style Reprezint un singur stil predefinit sau definit de utilizator. Obiectul Style include atributele stilului ca propriet i, dintre care enumerm: o o o o Font d acces la obiectul Font care permite formatarea caracterelor ParagraphFormat d acces ctre formatarea paragrafului NextParagraphStyle stabilete stilul pentru urmtorul paragraf BuiltIn care este True dac stilul este un stil predefinit (built-in).

De exemplu, prin Set aDoc = ActiveDocument.AttachedTemplate.OpenAsDocument With aDoc .Styles(wdStyleHeading1).Font.Name = "Arial" .Close SaveChanges:=wdSaveChanges End With se deschide ablonul ataat documentului activ ca un document Word (singurul mod n care se pot schimba stiluri ntr-un template) i se modific proprietatea Font a stilului "Heading 1", dup care se nchide template-ul.

88

Colec ia CommandBars Ansamblul meniurilor i barelor de unelte sunt reprezentate de colec ia CommandBars. Dup cum se tie din operarea Word, la personalizarea mediului trebuie s se precizeze domeniul de valabilitate al personalizrilor: ablon, document etc. n mod analog, nainte de a modifica programatic mediul de utilizare se va apela proprietatea global CustomizationContext pentru a preciza locul de memorare al modificrilor mediului. Pentru salvarea modificrilor de comenzi n ablonul Normal se va utiliza CustomizationContext = NormalTemplate iar pentru salvarea n ablonul ataat documentului CustomizationContext = ActiveDocument.AtttachedTemplate Exemplul urmtor adaug comanda Double Underline la bara de unelte Formatting: CustomizationContext = NormalTemplate CommandBars ("Formatting").Controls.Add Type:=msoControlButton, ID:=60, Before:=7 Pentru o discu ie mai ampl se va citi capitolul dedicat meniurilor i barelor de unelte. Colec ia Dialogs Dialogurile mediului Word (cum ar fi Open, Save As etc.) sunt activate n Visual Basic prin apelul colec iei Dialogs. La aceast colec ie nu se pot aduga alte elemente. Exist totui posibilitatea, discutat ntr-un capitol separat, de a proiecta dialoguri utilizator. Pentru accesarea unui dialog, se utilizeaz Dialogs(index), unde index este o constant de tip WdWordDialog, care identific boxa de dialog necesar. Se returneaz astfel un obiect Dialog care poate fi exploatat prin propriet ile i metodele sale. Exemplul urmtor afieaz dialogul Open: dlgAnswer = Dialogs(wdDialogFileOpen).Show Denumirile sunt construite, n general, prin "wdDialog" & "nume meniu" & "nume comand", de exemplu wdDialog & File & PageSetup => wdDialogFilePageSetup. O parcurgere a elementelor tipului enumerat WdWordDialog, prin intermediul Object Browser-ului, este edificatoare. Pentru informa ii mai ample se vor studia articolele din Word Visual Basic Help "Displaying built-in Word dialog boxes", "Built-in dialog box argument lists". Dintre propriet ile i metodele unui obiect Dialog men ionm: o o o o o Type, proprietatea care returneaz tipul boxei built-in. Poate fi una dintre constantele WdWordDialog. Read-only, Long. DefaultTab, proprietatea care returneaz sau stabilete fia activ la afiarea dialogului. Poate fi o constant de tip WdWordDialogTab. Read/write, Long. Display, metoda care afieaz dialogul, fr a transmite ac iunile efectuate de utilizator asupra dialogului. Show, metoda care afieaz dialogul, ac iunile utilizator fiind transmise sau executate. Execute, metoda care aplic configurarea curent a op iunilor dintr-un dialog.

89

Adugarea i editarea cmpurilor dintr-un document Se pot aduga cmpuri la un document prin aplicarea metodei Add colec iei Fields. expression.Add(Range, Type, Text, PreserveFormatting) unde expression este o expresie care returneaz un obiect Fields. Range este o expresie care returneaz un Range. Este domeniul unde se adaug cmpul. Dac domeniul nu este redus la punctul de inser ie, cmpul nlocuiete domeniul. Type este de tip Variant, op ional. Stabilete cmpul care se insereaz. Poate fi o constant de tip WdFieldType (vezi Help). Text este de tip Variant, op ional. Text adi ional necesar specificrii cmpului (de exemplu informa ii de gen switch). PreserveFormatting este de tip Variant, op ional. Are valoarea True pentru a pstra formatarea cmpului i la actualizri. Dintre propriet ile obiectului Field, membru al colec iei Fields, men ionm o o o o Result, care returneaz un obiect Range reprezentnd rezultatul cmpului. Code, care returneaz un obiect Range reprezentnd codul cmpului. Next, care returneaz urmtorul cmp n colec ie. Previous, care returneaz cmpul precedent din colec ie.

Dintre metode amintim o o DoClick, echivalent cu ac ionarea cmpului de ctre mouse. Update, care produce actualizarea rezultatului (recalcularea).

Exemplul urmtor schimb codul primului cmp din selec ie, actualizeaz cmpul i afieaz rezultatul: If Selection.Fields.Count >=1 Then With Selection.Fields(1) .Code.Text = "CREATEDATE \*MERGEFORMAT" .Update MsgBox .Result.Text End With End If Observa ie. Pentru alte obiecte, cum ar fi Shapes, care reprezint obiectele dintr-un strat de desen (drawing layer), se vor vedea capitolele dedicate obiectelor comune tuturor aplica iilor Office. Verificarea dac un obiect este valid n aceast sec iune se discut cteva tehnici pentru verificarea validit ii unei valori returnate de o expresie sau care este memorat ntr-o variabil. Aceste verificri pot elimina erori n execu ia codului proiectat.

90

Se poate utiliza func ia TypeName pentru a determina un tip de obiect. Sintaxa este TypeName(varname) unde varname este un Variant care con ine orice variabil cu excep ia variabilelor de un tip definit de utilizator. n exemplul urmtor se afieaz un mesaj n bara de stare a aplica iei n cazul cnd Selection.NextField returneaz un obiect Field (informa ie util n prelucrarea formularelor): If TypeName(Selection.NextField) = "Field" Then StatusBar = "Mai exist un cmp" O form echivalent este Set myField = Selection.NextField If TypeName(myField) = "Field" Then StatusBar = "Mai exist un cmp" n cazul cnd nu s-ar fi returnat un obiect, valoarea func iei era Nothing: If Not (myField Is Nothing) Then myField.Update Este disponibil proprietatea global IsObjectValid prin care se determin dac obiectul referit de o variabil este un obiect valid. Aceast proprietate returneaz False dac obiectul referit a fost ters (nu exist). Utilizarea este expression.IsObjectValid(Object) unde expression este o expresie care returneaz un obiect Application, op ional. Object este de tip Object, o variabil care se refer la un obiect. Exemplul urmtor efectueaz o trecere prin toate paragrafele, le numr i compar cu proprietatea Count (o verificare de dragul exemplificrii): 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 afiarea listei cu toate comenzile Word disponibile, se urmeaz secven a de comenzi, ini iat din Word: o o o Tools Macro selecteaza Word commands n lista Macro in

91

n boxa Macro name se afieaz toate comenzile, denumirile avnd ca prim aprte numele meniului utilizat implicit pentru comand (de genul FileOpen).

Se poate nlocui o comand Word printr-un macro, dac se scrie o procedur macro (reamintim c o procedur fr argumente este recunoscut ca un macro) cu acelai nume ca i comanda. Dac se creeaz o procedur cu numele FileSave, aceasta este executat de ctre Word atunci cnd se d comanda Save (meniul File), sau se click-eaz butonul Save (de pe bara Standard) sau se tasteaz combina ia direct asociat cu FileSave. Pentru scrierea unei proceduri de acest gen se poate urma o o o o Tools => Macro => Macros => Word commands n Macro in selectarea comenzii care se nlocuiete selectarea locului de memorare n boxa Macro in. De exemplu Normal.dot pentru valabilitate general (ob inerea unui macro global). Create

Editorul Visual Basic deschide un modul care con ine un ablon al noii proceduri, cum ar fi Sub FileSaveHtml() ' ' FileSaveHtml Macro ' Save file as HTML document ' WordBasic.FileSaveHtml End Sub n care se pot completa/terge orice instruc iuni. Pentru a reveni la comanda Word ini ial este suficient s se elimine sau s se redenumeasc procedura cu numele comenzii. Se poate nlocui, de asemenea, o comand Word dac se creeaz un modul de cod avnd acelai nume cu comanda (de exemplu FileSave) i care con ine o procedur denumit "Main". Lucrul cu evenimente Un eveniment este o ac iune recunoscut de un obiect i pentru care se poate scrie cod care s se execute, ca rspuns la producerea evenimentului. Evenimentele pot s se produc att ca rezultat al ac iunii utilizatorului sau prin program, ct i prin declanarea de ctre sistem. n Microsoft Word sunt recunoscute mai multe categorii de evenimente: asociate unui document, asociate aplica iei i asociate controalelor ActiveX. Evenimente ale obiectului Document Trei evenimente sunt recunoscute de obiectul Document: Close, New i Open. o Close se produce atunci cnd se nchide documentul. Dac procedura de rspuns este memorat ntr-un template, se execut att la nchiderea oricrui document bazat pe ablon, ct i la nchiderea ablonului dac este deschis pentru editare.

92

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

Procedurile de rspuns la aceste evenimente se scriu n modulul clas intitulat "ThisDocument". Pentru a crea o procedur se urmeaz etapele: 1. n Project Explorer, sub proiectul Normal sau document, se dublu clickeaz ThisDocument. (n viziunea Folder, ThisDocument este localizat n folderul Microsoft Word Objects.) 2. n lista Object se selecteaz Document. 3. n lista Procedure se selecteaz evenimentul dorit (Close, New sau Open). Ca rezultat se adaug n modul o procedur vid, denumit standard. 4. Se completeaz procedura cu instruc iunile necesare scopului urmrit.

Urmtorul exemplu maximizeaz fereastra aplica iei Word atunci cnd documentul este deschis: Private Sub Document_Open() Application.WindowState = wdWindowStateMaximize End Sub Domeniul de valabilitate (vizibilitate) a unei proceduri eveniment depinde de locul memorrii (de revzut completrile date la enumerarea evenimentelor). Procedurile eveniment din template-ul Normal nu au un domeniu global. Ele se vor executa doar dac ablonul Normal este i ablonul ataat documnetului. Procedurile care exist i n document i n template-ul ataat se vor executa amndou. Evenimente ale obiectului Application Evenimentele aplica iei apar atunci cnd utilizatorul prsete aplica ia sau atunci cnd focalizarea este mutat pe alt document. Totui, diferit fa de obiectul Document sau de controalele ActiveX, obiectul Application nu recunoate evenimentele n mod implicit (nu rspunde n mod standard la producerea lor). Din acest motiv, nainte de a utiliza evenimentele obiectului Application, se va crea un modul clas nou i se declar un obiect de tip Application cu evenimente. Se utilizeaz, n acest scop, comanda Class Module din meniul Insert al mediului VBE. Observa ie. Denumirile utilizate n continuarea acestei sec iuni nu sunt standard, cu excep iile evidente. Pentru a permite evenimentele obiectului Application, se va aduga modulului clas definit o declara ie de tipul Public WithEvents App As Application Dup ce noul obiect a fost declarat cu evenimente, el apare n lista Object a modulului clas i se pot scrie procedurile eveniment pentru noul obiect (selectabile din lista Procedure). nainte ca procedurile s se execute, trebuie s se conecteze obiectul declarat n modulul clas cu obiectul Application. Acest lucru se poate efectua din orice modul utiliznd, de exemplu, declara ia Public apl As New EventClass

93

unde EventClass este numele modulului clas creat. Dup crearea variabilei obiect apl (o instan a clasei EventClass), se poate stabili egalitatea ntre obiectul App al clasei EventClass i obiectul Application Word prin Sub InitializeApp() Set apl.App = Application End Sub Dup executarea procedurii InitializeApp, obiectul App din clasa EventClass puncteaz ctre obiectul Application Word i procedurile evenimentelor din clas se vor executa la apari ia evenimentelor corespunztoare. Exist dou evenimente recunoscute de obiectul Application (dup 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 focalizrii). Quit, care are loc la prsirea aplica iei Word de ctre utilizator.

Urmtorul exemplu asigur c barele de unelte Standard i Formatting sunt vizibile nainte de prsirea aplica iei (nct urmtoarea activare a aplica iei le afieaz): Private Sub App_Quit () CommandBars("Standard").Visible = True CommandBars("Formatting").Visible = True End Sub Evenimentele controalelor ActiveX Un document Word poate s includ controale ActiveX cum ar fi boxe de control, liste ascunse, butoane de comand. Pentru a scufunda un asemenea obiect ntr-un document, cel mai simplu este s se vizualizeze cutia de unelte pentru controale prin o o sau o meniul View => Toolbars => selectare Control Toolbox. ac ionare buton dreapta mouse pe o bar de unelte selectare Control Toolbox

Din cutia de controale se apas categoria de controale dorit i la punctul de inser ie se insereaz o instan a obiectului. Dublu click pe obiectul inserat d acces la rutinele de procesare a evenimentelor asociate controlului. Pentru a vedea execu ia procedurilor se va ac iona unealta Exit Design Mode din Control Toolbox. Word implementeaz, pentru controalele ActiveX dintr-un document, evenimentele o o LostFocus, care apare atunci cnd focalizarea este mutat de la control la alt obiect, GotFocus, care apare atunci cnd focalizarea este mutat pe controlul ActiveX scufundat.

Fiecare control ActiveX recunoate, totui, evenimente adi ionale, explicate la obiectele respective. n acest curs mai multe explica ii i exemple sunt date n capitolul "Controale ActiveX i dialoguri". Utilizarea macro-urilor automate (Auto Macro)

94

Anumite proceduri macro, identificate prin denumirile speciale recunoscute ca atare de aplica ie, sunt executate n mod automat la efectuarea unei opera ii specifice. Word recunoate urmtoarele denumiri drept macro-uri automate: AutoExec care se execut la pornirea aplica iei Word sau se ncarc un template global. AutoNew care se execut la fiecare creare a unui document nou. AutoOpen care se execut la deschiderea unui document existent. AutoClose care se execut la nchiderea unui document. AutoExit care se execut la nchiderea aplica iei Word sau la descrcarea unui ablon global. Macrourile automate sunt recunoscute dac o o Modulul este bnumit cu numele macro-ului i con ine o procedur denumit "Main." O procedur, n orice modul, are o denumire rezervat.

Macrourile automate pot fi memorate oriunde, template-ul Normal, alt ablon sau n document, cu excep ia procedurii AutoExec care nu se execut dac nu este memorat n Normal template sau un template global memorat n folderul Startup. n cazuri de conflict de denumiri, se execut macro-ul automat memorat n contextul cel mai apropiat, adic n ordinea: documentattached templateNormal template. Observa ie. Apsarea tastei Shift simultan cu comanda previne executarea unui macro automat. De exemplu, la crearea unui nou document pe baza unui template care are o procedur AutoNew, apsarea tastei Shift n momentul ac ionrii butonului OK din dialogul New, previne executarea macr-ului (tasta trebuie pstrat apsat pn cnd se afieaz noul document). ntr-o procedur care poate declana un macro automat, prevenirea execu iei se ia prin instruc iunea WordBasic.DisableAutoMacros Automatizarea aplica iilor Pentru a putea schimba date cu alte aplica ii, cum ar fi Excel, Access etc., se utilizeaz tehnica de automatizare a aplica iilor (cunoscut anterior drept OLE Automation). Automatizarea permite returnarea, editarea i exportul datelor prin referirea obiectelor, propriet ilor, metodelor altor aplica ii. Obiectele aplica ii referite n alt aplica ie sunt denumite obiecte de automatizare. Automatizarea aplica iei Word din alt aplica ie A. Primul pas pentru a face aplica ia Word disponibil n alt aplica ie, pentru automatizare (deci pentru manevrarea programatic sau nu a obiectelor Word), este crearea unei referin e la biblioteca de tipuri Word (Word type library): o o o Tools (din Visual Basic Editor) References selectarea boxei de control Microsoft Word 8.0 Object Library.

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

95

Dim appWD As Word.Application.8 C. Se apeleaz func ia CreateObject (pentru crearea unui obiect de automatizare) sau GetObject (pentru regsirea unui obiect de automatizare existent) cu Word OLE Programmatic Identifier (Word.Application.8 sau Word.Document.8), ca n exemplul urmtor. Pentru a vedea sesiunea Word se utilizeaz proprietatea Visible: Dim appWD As Word.Application.8 Set appWD = CreateObject("Word.Application.8") appWD.Visible = True Func ia CreateObject returneaz un obiect Application Word i-l asigneaz variabilei appWD. Utiliznd obiectele, propriet ile i metodele obiectului Application Word se poate controla aplica ia Word prin intermediul variabilei appWD. De exemplu, crearea unui nou document appWD.Documents.Add D. Func ia CreateObject pornete o sesiune Word pe care automatizarea nu o nchide atunci cnd expir variabila obiect care se refer la obiectul Application Word. Nici stabilirea referin ei obiectului la Nothing nu produce nchiderea aplica iei Word. Pentru aceasta se va utiliza metoda Quit a aplica iei Word. Urmtorul exemplu, din Microsoft Excel, insereaz datele din celulele A1:B10 din Sheet1 ntr-un document Word nou i, n acest document, le aranjeaz ntr-un tabel. Comentariile incluse explic etapele prelucrrii. ' 'declararea variabilei obiect appWD ' Dim appWD As Word.Application Err.Number = 0 On Error GoTo notloaded ' 'ob inerea unui obiect Word Application, dac este pornit o sesiune Word ' Set appWd = GetObject(, "Word.Application.8") notloaded: If Err.Number = 429 Then ' ' se ini iaz o sesiune Word (nu este alt sesiune deschis) ' Set appWD = CreateObject("Word.Application.8") theError = Err.Number End If 'se vizualizeaz sesiunea Word appWD.Visible = True With appWD 'crearea unui nou document Set myDoc = .Documents.Add With .Selection ' ' transferul datelor din foaia Excel n documentul Word, ' pe dou coloane separate prin TAB ' For Each c In Worksheets ("Sheet1").Range("A1:B10") .InsertAfter Text:=c.Value Count = Count +1

96

' ' salvarea documentului Word ' myDoc.SaveAs FileName:="C:\Temp.doc" End With ' ' nchiderea sesiunii Word, dac sesiunea este deschis de acest cod ' If theError = 429 Then appWD.Quit ' ' eliberarea variabilei appWD ' Set appWD = Nothing Automatizarea altei aplica ii din Word Pentru a controla alte aplica ii dintr-un document Word, se va proceda n mod analog automatizrii aplica iei Word din alte aplica ii (vezi sec iunea precedent). Cele dou exemple, unul referitor la Excel, cellalt la PowerPoint, devin mai explicite dup revederea exemplului anterior. Textul selectat n documentul Word activ este trimis ctre 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 urmtor creeaz o nuo prezentare PowerPoint, completeaz prima box text cu numele documentului Word activ i a doua box text cu primul paragraf al documentului. La terminare se elibereaz variabila obiect aplica ie. Dim pptObj As PowerPoint.Application.8 If Tasks.Exists("Microsoft PowerPoint") = True Then Set pptObj = GetObject(, "PowerPoint.Application.8") Else Set pptObj = CreateObject(, "PowerPoint.Application.8")

If Count Mod 2 = 0 Then .InsertAfter Text:=vbCr Else .InsertAfter Text:=vbTab End If Next c ' ' convertirea textului n tabel i autoformatarea tabelului ' .Range.ConvertToTable Separator:=wdSeparateByTabs .Tables(1).AutoFormat Format:=wdTableFormatClassic1 End With

97

End If ppt.Obj.Visible = True Set pptPres = pptObj.Presentations.Add Set aSlide =pptPres.Slides.Add(ndex:=1, Layout:=ppLayoutText) aSlide.Shapes(1).TextFrame.TextRange.Text = ActiveDocument.Name aSlide.Shapes(2). TextFrame.TextRange.Text = _ ActiveDocument.Paragraphs(1).Range.Text Set pptObj = Nothing Comunicarea cu obiectele Word scufundate Se poate utiliza proprietatea Application a oricrui obiect Word pentru a returna obiectul Word Application. Acest lucru este util pentru returnarea obiectului Word Application dintr-un document Word scufundat n alt aplica ie. Urmtorul exemplu, executat din Excel, necesit ca Shapes(1) din foaia activ s fie un document Word scufundat (ob inut prin InsertObject). Prin exemplu se modific documentul Word. Dim appWD As Word.Application Set embeddedDoc = ActiveSheet.Shapes(1) Set appWd = embeddedDoc.OLEFormat.Object.Object.Application appWD.ActiveDocument.Range(Start:=0, End:=0).InsertBefore Text:="Textul nou" n mod similar, exemplul urmtor, executat din PowerPoint, necesit ca Shapes(1) din primul slide s fie un document Word embedded: Dim appWD As Word.Application Set embeddedDoc = Presentations(1).Slides(1).Shapes(1) embeddedDoc.OLEFormat.Activate Set appWD = embeddedDoc.OLEFormat.Object.Application MsgBox appWd.ActiveDocument.Content.Text Controale ActiveX i Dialoguri Proiectele create n Visual Basic for Applications pot fi completate cu o interfa utilizator evoluat, sub forma unor cutii de dialog la nivelul celor existente deja n Microsoft Office. Performan ele i aspectul dialogurilor utilizator sunt mbunt ite prin posibilitatea de plasare a unor controale ActiveX (numite anterior controale OLE). Un control ActiveX trebuie gndit ca un obiect cruia i se pot stabili atribute (prin propriet i) i care recunoate evenimente (este "viu"). Aceste controale, cu propriet i ajustabile, recunosc multiple evenimente. Astfel, prin scrierea procedurilor eveniment, interfa a cu utilizatorul proiectului poate fi personalizat i diferen iat corespunztor. Controalele ActiveX pot fi plasate i direct n documentele aplica iilor: documente Word, foi de calcul Excel, diapozitive PowerPoint. Inserarea acestora este facilitat de cutia de unelte Control Toolbox, care poate fi afiat la fel cu orice alt bar de unelte. Aplica iile din Office 97 utilizeaz aceleai unelte pentru proiectarea dialogurilor, astfel nct prezentarea care urmeaz este valabil pentru toate proiectele VBA (din Word, Excel, PowerPoint i, cu unele excep ii, pentru Access).

98

Proiectarea boxelor de dialog utilizator Crearea unui dialog utilizator (termenul utilizator este adugat pentru diferen ierea de dialogurile built-in, ncorporate mediului i se refer la cel care scrie codul i nu la cel care l va utiliza, confuzia nefiind att de mare nct s trebuiasc o denumire special) necesit parcurgerea mai multor etape: o o o o crearea unei forme (form sau UserForm), care constituie suportul pe care sunt adugate controalele; plasarea controalelor pe form; stabilirea propriet ilor pentru controale; scrierea procedurilor de rspuns la evenimentele formei i controalelor plasate pe ea.

Atunci cnd se proiecteaz un dialog, n Visual Basic Editor, suntem n modul de proiectare (design mode). n acest mod se pot edita controalele i controalele nu reac ioneaz la evenimente. La execu ia boxei de dialog, deci la afiarea dialogului exact cum va fi vzut de un utilizator, suntem n modul de execu ie (run mode). Controalele rspund evenimentelor n modul execu ie. Crearea unui nou dialog Orice box de dialog utilizator din proiect este o form (sau UserForm). O UserForm nou con ine o bar de titlu i o zon goal n care se pot plasa controale. o Din meniul Insert, n Visual Basic Editor, se alege UserForm.

Este afiat o form nou ale crei propriet i se stabilesc n fereastra Properties (vezi figurile ataate, n figura cu forma sunt plasate i dou controale). Propriet ile formei sunt clasificate n categoriile: o o o o o o o aparen (Appearence); comportare (Behaviour); font (Font); Diverse (Misc); imagine (Picture); pozi ie (Position); defilare (Scrolling).

dup cum se vizualizeaz alegnd fia Categorized din fereastra Properties. Propriet ile de aparen se refer la culorile utilizate, la efectele vizuale de umplere etc. Propriet ile de comportare descriu modul de continuare a ac iunilor la prsirea ultimului control de pe form (Cycle) sau accesul utilizatorului la obiect (Enabled). Prin Font se specific fontul utilizat implicit pe form (poate fi modificat pentru fiecare control n parte). n Misc se gsesc propriet ile care stabilesc numele formei, memoria utilizat la afiare, imaginea mouse-ului etc. n Picture se dau specifica iile imaginii utilizate pentru pavarea formei. n Position sunt specifica iile de pozi ie i dimensiuni. n Scrolling se fixeaz vizibilitatea i pozi ia barelor de defilare.

99

Concomitent cu afiarea formei, n Design Mode, devine vizibil i cutia cu controale, Toolbox, (vezi figura). Pentru a aduga un control pe form, se trage controlul dorit pe form i se ajusteaz dimensiunile n mod uzual, sau se click-eaz controlul dorit, cursorul devine cursor cruce i se ntinde pe form cu dimensiunile dorite. Opera iunea de dragare din cutie pe form poate fi efectuat i n sens invers: tragerea unui control, sau a unui grup de controale, de pe form n cutie de unelte creeaz un template care poate fi reutilizat. Dup adugarea controalelor pe form, se utilizeaz comenzile din meniul Format sau butoanele de pe bara de unelte UserForm din VBE pentru a ajusta alinierea i spa ierea controalelor. Se utilizeaz dialogul Tab Order (din meniul View) pentru a modifica ordinea de parcurgere a controalelor la tastri succesive de Tab (n execu ie run time). VBE stabilete proprietatea TabIndex a controloalelor pentru a determina ordinea la Tab-uri.. Dac se dorete ca utilizatorul s nu aib acces prin Tab la un control, se va stabili proprietatea TabStop la False. Pentru aceasta, se ac ioneaz butonul drept al mouse-ului pe control i selectarea comenzii Properties din meniul contextual. Scrierea procedurilor de rspuns la evenimente Fiecare form sau control recunoate un set predefinit de controale, care pot fi declanate fie de utilizator, fie de sistem. De exemplu, un buton de comand recunoate evenimentul Click declanat de ac ionarea cu mouse-ul, iar forma recunoate evenimentul Initialize care apare atunci cnd este ini ializat. Pentru a scrie o procedur eveniment, se deschide fereastra Code prin dublu click pe UserForm sau pe controlul respectiv, selectarea numelui evenimentului n boxa Procedure a ferestrei Code. Procedurile eveniment au denumiri create ntr-un mod standard: numele formei sau controlului, liniu a de subliniere i numele evenimentului, de exemplu Command1_Click, UserForm_Deactivate etc. Evenimentele recunoscute de un obiect sunt listate n boxa Procedure a ferestrei Code asociate, cele care au deja ataate proceduri fiind scrise n bold. La scrierea codului de rspuns la evenimente, controalele sunt numite cu denumirile existente la acel moment. Cum aceste denumiri pot fi modificate oricnd n dezvoltarea proiectului, procedurile eveniment ataate nu se redenumesc n mod automat. Se recomand astfel ca denumirile s fie acordate nainte de scrierea procedurilor respective, n caz contrar orice modificare a numelor trebuie s fie nso it de modificrile denumirilor procedurilor. Controale n aceast sec iune se explic, pe scurt, principalele controale disponibile n proiectarea dialogurilor. Label Control Un control Label este utilizat pentru afiarea unui text, descriptiv, cum ar fi titluri, captri, instruc iuni de ajutor. Textul afiat nu este i nu poate fi legat de surse de date. Proprietatea implicit este Caption, reprezentnd textul afiat. Evenimentul implicit este Click, declanat la ac ionarea butonului stng mouse pe control.

100

TextBox Control Afieaz informa ie scris de utilizator sau primit dintr-o mul ime organizat de date. Dac TextBox este legat de o surs de date, atunci modificarea informa iei afiate produce i modificarea informa iei din sursa de date (de exemplu un cmp dintr-o tabel). Informa ia afiat poate fi formatat doar unitar (acelai font, acelai stil). Proprietatea implicit este Value, reprezentnd con inutul boxei. Evenimentul implicit este Change, declanat la modificarea propriet ii Value. ListBox Control Afieaz o list de valori i permite selectarea unei sau mai multor intrri din list. ntr-o ListBox cu o singur coloan se poate aduga o intrare prin metoda AddItem. Dac ListBox este legat de o surs de date, atunci este memorat valoarea selectat n surs. Controlul ListBox poate s apar ca o list ori ca un grup de controale OptionButton sau CheckBox. Pentru aceast din ultim op iune se va stabili proprietatea ListStyle la Option; proprietatea MultiSelect va determina atunci intrrile: Single butoane radio, Multi sau Extended boxe de control. Proprietatea implicit este Value, reprezentnd valoarea selectat curent (din coloana dat de proprietatea BoundColumn). Evenimentul implicit este Click. ComboBox Control Combin posibilit ile de la ListBox i TextBox: utilizatorul poate introduce o valoare nou (ca la TextBox), sau poate selecta o valoare dintr-o list (ca la ListBox). Grafic, un control ComboBox arat ca o list ascuns (doar o linie este afiat). Dac se leag controlul la o surs de date (celule dintr-o foaie de calcul) va fi afiat valoarea selectat n surs. Pentru un control cu mai multe coloane, proprietatea BoundColumn determin unde se afieaz sursa de date. Proprietatea implicit este Value, reprezentnd valoarea selectat. Evenimentul implicit este Change. CheckBox Control Afieaz starea selectat / neselectat a unui element. Este utilizat pentru alegeri ntre dou alternative (Yes/No, True/False sau On/Off.). Selectarea este afiat prin prezen a unui X n caseta corespunztoare i starea curent este Da, Adevrat, Prezent etc. Neselectarea este artat printr-o caset vid i indic starea Nu, Fals, Absent etc. n func ie de valoarea propriet ii TripleState, controlul poate s aib i valoarea Null.

101

La legarea de o surs de date, schimbarea strii se reflect n modificarea valorii sursei. Un CheckBox suspendat (disabled) afieaz starea dar nu poate fi modificat. Proprietatea implicit este Value, , adic Null starea null (nici selectat nici deselectat), (1) True (selectat), 0 False (deselectat). Evenimentul implicit este Click. OptionButton Control Permite afiarea elementului selectat dintr-un grup de op iuni. Controlul este cunoscut i ca buton radio (apsarea unui buton de selectare a unei game de lungimi de und le deselecteaz pe celelalte). Este de observat c butoanele de op iune dintr-un frame sunt mutual exclusive. Figura este capturat din modul Design. Dac un OptionButton este legat la o surs de date, controlul poate s arate valori Yes/No, True/False sau On/Off, coresponden ele ntre valori i starea controlului fiind evidente. Schimbarea strii butonului modific i sursa. Un control inhibat este desenat ters i nu arat nici o valoare. n func ie de proprietatea TripleState, controlul poate avea i valoarea Null. ToggleButton Control Arat starea de selectare a unui element (similar unui checkbox) prin imaginea grafic a unui buton apsat sau nu. Dac un control ToggleButton este legat de o surs de date, controlul arat valoarea curent a sursei ca Yers/No, True/False, On/Off sau ceva similar. Butonul apsat reprezint Yes, True sau On. Dac ToggleButton este legat de o surs de date, schombarea strii controlului se reflect i n valoarea sursei. Un control ToggleButton inhibat (disabled) este desenat neclar, arat totui valoarea dar nu poate fi modificat. Proprietatea implicit este Value, adic Null starea null (nici selectat nici deselectat), (1) True (selectat), 0 False (deselectat). Evenimentul implicit este Click. CommandButton Control Este utilizat pentru indicarea nceperii, terminrii sau ntreruperii unei ac iuni. Este reprezentat grafic precum butoanele uzuale OK, Cancel etc. din dialogurile aplica iilor din Office (i nu numai). n general, pentru realizarea scopului este utilizat procedura (sau macro) asociat evenimentului Click. Pe un CommandButton se poate afia text (proprietatea Caption), imagine (proprietatea Picture) sau ambele. Proprietatea implicit este Value, ntotdeauna False. Stabilind proprietatea Value drept True (ntr-o procedur), ini iaz evenimentul Click al butonului de comand. Evenimentul implicit este Click.

102

TabStrip Control Este utilizat, de obicei, pentru prezentarea unor seturi de informa ii (ca valori ale unor controale grafice), fiecare grup de informa ii apar innd altei entit i. Prin urmare structura informa iei afiate este ntotdeauna aceeai, dar se refer la entit i diferite (persoane, fapte etc.). Din punct de vedere grafic, se poate confunda acest control cu MultiPage, diferen a fiind aceea c la TabStrip zona de afiare (client region) este comun tuturor fielor (doar informa ia se modific), pe cnd la MultiPage fiecare fi (pagin) are o zon proprie, cu controale proprii. Se poate spune c dac se pstreaz structura informa iei, atunci se va utiliza un control TabStrip, un tab definind purttorul informa iilor. Dac informa ia este structurat n categorii, atunci se poate utiliza controlul MultiPage, fiecare categorie avnd propria zon client. Observa ie. TabStrip este implementat ca un container a unei colec ii Tabs de obiecte Tab. Proprietatea implicit pentru TabStrip este SelectedItem, care returneaz obiectul Tab selectat i este folosit la controlarea programatic a obiectului. Evenimentul implicit este Change, declanat la selectarea altui Tab. MultiPage Control Prezint mai multe pagini de informa ii distincte. Spre deosebire de controlul TabStrip, selectarea altei pagini poate prezenta o alt structur de informa ii. n acest mod se pot afia seturi consistente (categorii) de informa ii, pstrnd n acelai timp unitatea ntregii nregistrrii. Observa ie. MultiPage este implementat ca un container a unei colec ii Pages de obiecte Page. Proprietatea implicit este Value, care returneaz indexul paginii avtive curente (n colec ia Pages). Evenimentul implicit este Change, declanat la schimbarea paginii. Frame Control Reprezentat grafic ca un chenar cu o denumire, controlul servete la gruparea unor controale. Grupul poate fi unit doar prin categoria de informa ii, permi nd utilizatorului o identificare rapid a controalelor, dar, pentru anumite controale cum ar fi OptionButton, gruparea are efect i n comportarea controalelor din grup. Exemplul de la OptionButton arat un Frame care include butoane radio: acestea sunt mutual exclusive. Exemplul de la ToggleButton arat un Frame similar, dar butoanele pot fi ac ionate n orice configura ie. Evenimentul implicit este Click. Image Control Permite afiarea unui imagini (poze) pe o form, ca element al datelor reprezentate pe form i nu ca un simplu element decorativ. De exemplu fotografia unui angajat n forma cu informa iile personale ale angajatului. Cu alte cuvinte, nu se controleaz aspectul grafic al imaginii, ci modul cum ea apare n control (de unde, ct de mare etc.).

103

Controlul permite tierea (retezarea) imaginii, dimensionare, mriri, dar nu permite editarea propriu-zis (care va fi efectuat printr-un program de grafic). Dac se d controlului o dimensiune egal cu cea a formei, atunci Image poate furniza un fundal pe care se pot pozi iona alte controale. Sunt suportate formatele .bmp, .cur, .gif, .ico, .jpg, .wmf de fiiere grafice. Evenimentul implicit este Click. Utilizarea dialogurilor utilizator Pentru a schimba informa ii cu utilizatorul proiectului printr-o cutie de dialog utilizator, trebuie ca o o o dialogul s fie afiat, s se accepte ac iunile utilizatorului asupra controalelor din dialog i, la nchiderea dialogului, s se dispun de informa ia introdus de utilizator (pentru a fi procesat, pentru a controla ac iunile ulterioare etc.).

Afiarea unui dialog Afiarea unui dialog pentru testare, deci n Design Mode, se realizeaz prin comanda Run Sub/UserForm (meniul Run din VBE). Afiarea dialogului n mod programatic se realizeaz utiliznd metoda Show dup modelul [object.]Show dac object nu este specificat, atunci se va considera implicit dialogul asociat modulului activ UserForm. Dac obiectul specificat nu este ncrcat la apelarea metodei, atunci VB l ncarc automat. O cutie de dialog utilizator este ntotdeauna modal, deci utilizatorul trebuie s rspund (chiar dac prin nchidere) nainte de a utiliza altceva din aplica ie. Nu se execut alte instruc iuni pn cnd dialogul nu este ascuns sau nchis (descrcat unloaded). Este posibil totui s se lucreze n alte aplica ii. Ob inerea i stabilirea propriet ilor n execu ie Pentru modificri ale propriet ilor unui control este necesar ca valorile acestora s fie citite i redefinite n timpul execu iei (Run time sau Run Mode). Asemenea ac iuni sunt, de exemplu, utile atunci cnd pentru un control se dau valori implicite (default), deci valori cu care dialogul s se afieze indiferent de ac iunile de la alte afiri anterioare. n acest caz, se va aduga codul corespunztor n procedura de eveniment Initialize a dialogului. Afiarea formei declaneaz evenimentul Initialize i astfel au loc i atribuirile de valori specificate. Exemplul urmtor presupune existen a unei forme UserForm, denumit frmPhoneOrders, care are o o o un control TextBox, denumit txtCustomerName, un control ListBox, denumit lstRegions, un control CheckBox, denumit chkSendExpress.

Codul urmtor realizeaz ini ializarea valorilor de pe form, nct orice artare a formei se realizeaz n aceeai configura ie:

104

Private Sub UserForm_Initialize() With frmPhoneOrders .txtCustomerName.Text = "Mamma S.R.L." .chkSendExpress.Value = True With .lstRegions .AddItem "Iasi" .AddItem "Suceava" .AddItem "Botosani" .ListIndex = 2 End With End With End Sub

'se ini ializeaz TextBox 'se ini ializeaz CheckBox 'se ini ializeaz ListBox 'se selecteaz ultima intrare

Este de remarcat c dei n modelele de obiecte Word, Excel i PowerPoint colec iile sunt indexate de la 1, n tablourile i colec iile asociate formelor se folosete indexarea de la 0. De aici selectarea ultimei intrri (cu numrul de ordine 3) din list prin instruc iunea ListIndex = 2. Dac se dorete stabilirea valorilor ini iale pentru un control, dar apelurile ulterioare s re in modificrile efectuate, se vor da aceste valori nainte afirii dialogului. Urmtorul exemplu arat o procedur care afieaz forma dup atribuirea valorilor implicite. Private Sub GetUserName( ) With UserForm1 .lstRegions.AddItem "North" .lstRegions.AddItem "South" .lstRegions.AddItem "East" .lstRegions.AddItem "West" .txtSalesPersonID.Text = "0000" .Show End With End Sub Prin setarea propriet ilor unui control i aplicarea metodelor n timpul execu iei, se pot efectua modificri ntr-un dialog utilizator care se execut, modificri aprute ca rspuns la ac iunile i alegerile utilizatorului. De exemplu, accesibilitatea unor controale poate fi controlat prin modificarea propriet ii Enabled. Dac proprietatea este setat pe False, atunci utilizatorul nu poate accesa controlul: cum ar fi interzicerea accesului la butonul OK pn cnd o anumit informa ie nu este completat n dialog. Exemplul urmtor arat cum accesul la un grup de butoane radio nu este permis dect dac o CheckBox este marcat: Private Sub CheckBox1_Change() With Me ' Me se refer la forma curent If .CheckBox1.Value = True Then .OptionButton1.Enabled = False .OptionButton2.Enabled = False .OptionButton3.Enabled = False Else .OptionButton1.Enabled = True .OptionButton2.Enabled = True .OptionButton3.Enabled = True End If End With End Sub

105

Prin intermediul metodei SetFocus se controleaz focalizarea. Un control care are focusul este cel care rspunde la intrrile din tastatur. De exemplu Private Sub Image1_Click () Me.CheckBox1.SetFocus End Sub realizeaz trecerea focusului la CheckBox1 atunci cnd imaginea din controlul Image1 (unde este scris procedura eveniment) este click-at. n timpul execu iei se pot manevra i propriet ile/metodele formei. n acest mod se modific dinamic aspectul formei. Astfel, o utilizare frecvent este aceea cnd se modific por iunea afiat a formei, vizualiznd (deci dnd acces) controale suplimentare, sau ascunzndu-le (nu mai pot fi accesate, dei nu sunt inhibate). n acest scop se opereaz cu proprietatea Height. Presupunem c o form, cu un buton radio, este dimensionat n proiectare cu Height = 120 i se adaug un control, de exemplu un CheckBox, la baza formei, controlul fiind pozi ionat prin proprietatea Top setat la mai mult de 120 (deci n afara zonei afiate din form). Se adaug urmtoarele proceduri eveniment: Private Sub UserForm_Initialize () Me.Height = 120 'Orice afiare a formei readuce nl imea la 120 End Sub Private Sub OptionButton1_Click () With Me .Height = 300 .Height 'Modificarea butonului radio basculeaz ntre cele dou dimensiuni ale formei End With End Sub Pentru ca exemplul s func ioneze corect se presupune c forma extins la 180 afieaz i boxa de control. n exemplul urmtor se arat cum putem parcurge informa ii printr-un obiect TabStrip. Valoarea afiat ntr-o box text este modificat dup indexul tab-ului selectat: Private Sub TabStrip1_Click (ByVal Index As Long) If Index = 0 Then Me.TextBox1.Text = "7710 Park Lane" ElseIf Index = 1 Then Me.TextBox1.Text = "5520 5th Avenue" End If End Sub De amintit c numerotarea ncepe de la 0 ntr-o colec ie de pe o form. Validarea informa iilor introduse de un utilizator este un alt subiect important n procesarea unui dialog. Pentru efectuarea verificrilor c utilizatorul a introdus tipul corect de informa ii printr-un control, se va testa valoarea atunci cnd controlul pierde focusul sau cnd ntregul dialog este nchis. Evenimentele Enter i Exit pot fi utilizate n acest scop.

106

Enter apare imediat nainte ca un control s primeasc efectiv focusul de la alt control de pe aceeai form. Exit apare imediat nainte ca un control s piard focusul n favoarea altui control de pe aceeai form. Sintaxa procedurilor eveniment respective este Private Sub object_Enter( ) Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean) unde object este un nume valid de control care recunoate evenimentul Cancel este starea evenimentului: False arat procesarea evenimentului de ctre control (op iunea implicit); True arat c evenimentul este tratat de aplica ie i focusul rmne pe controlul curent. Deoarece evenimentul Enter se declaneaz nainte ca focusul s fie dat unui control, poate fi utilizat pentru afiarea unui text explicativ, de procesare a respectivului obiect. n scrierea procedurii pentru Exit nu trebuie uitat atribuirea valorii True argumentului pentru ca focusul s rmn pe controlul curent. De studiat i metoda SetFocus prin care un anumit control de pe form primete focusul. Urmtorul exemplu previne utilizatorul s prseasc o zon text n care trebuie s introduc neaprat o valoare numeric: Private Sub txtCustAge_Exit (ByVal Cancel As MsForms.ReturnBoolean) If Not IsNumeric(txtCustAge.Text) Then MsgBox "Vrsta trebuie s fie numeric" Cancel = True End If End Sub Pentru verificarea datelor nainte de nchiderea dialogului, se include codul corespunztor (prin care se pot verifica valorile mai multor controale de pe form) n aceeai procedur care descarc (nchide) dialogul. Dac exist erori de completare se va prsi procedura, prin Exit Sub, nainte de executarea instruc iunii Unload i se va da focusul primului control eronat. Exemplul urmtor se execut la ac ionarea butonului de comand, denumit cmdOK, i previne prsirea dialogului prin ac ionarea acestui buton dac boxa text txtCustAge nu este numeric: Private Sub cmdOK_Click () If Not IsNumeric (txtCustAge.Text) Then MsgBox "Vrsta trebuie s fie numeric" txtCustAge.SetFocus 'Controlul reprimete focusul Exit Sub 'Se prsete procedura End If custAge = txtCustAge.Text 'Se salveaz valoarea controlului Unload Me 'Se descarc forma End Sub Este de men ionat c pentru trecerea valorii n alt modul de cod, variabila custAge trebuie calificat, de exemplu ThisDocument.custAge.

107

La nchiderea unui dialog, toate datele introduse de utilizator se pierd. Returnarea valorilor controalelor dintr-o form dup ce forma a fost descrcat conduce la valorile implicite n locul celor introduse/selectate de utilizator. Din acest motiv, informa ia necesar trebuie s fie salvat n variabile de la nivelul modul, naintea descrcrii formei. Exemplul precedent utilizeaz n acest scop variabila custAge, care trebuie s fie declarat la nivel de modul prin Public custAge As Integer de exemplu. Cutiile de dialog utilizator sunt afiate ntotdeauna drept modale. Prin urmare utilizatorul trebuie s nchid dialogul nainte de a se ntoarce n aplica ia principal. nchiderea (descrcarea) formei se realizeaz prin instruc iunea Unload. n mod uzual se va include n form cel pu in un buton de comand prin ac ionarea cruia se nchide forma. Exemplul urmtor insereaz n documentul Word textul introdus de utilizator n boxa txtUserName i nchide forma, la ac ionarea butonului de comand denumit cmdOK: Private Sub cmdOK_Click () ActiveDocument.Content.InsertAfter txtUserName.Text Unload UserForm1 End Sub Pentru a utiliza aceeai box de dialog n mai multe aplica ii (Word, Excel, PowerPoint accept aceleai dialoguri). Dac dialogul con ine totui referiri la obiecte specifice unei aplica ii, atunci utilizarea n alt aplica ie nu este lipsit de erori. Pentru reutilizarea dialogurilor proiectate se export ca un fiier .frm care poate fi importat n alte aplica ii: n VBE unde s-a proiectat forma, right-click pe UserForm din Project Explorer, click Export File. Se alege un nume i Save. Se ob ine un fiier nume.frm. n VBE unde se dorete reutilizarea formei, right-click pe proiectul respectiv din Project Explorer, click pe Import File. Selectarea numelui formei i Open.

Utilizarea controalelor n documente Word, foi de calcul Excel sau diapozitive PowerPoint n acelai mod n care controalele se adaug unei forme, acestea pot fi adugate unui document, foi de calcul sau slide pentru a le transforma n obiecte interactive. De exemplu, se pot aduga boxe text, list, butoane radio etc. unui document, pentru a-l transforma ntr-un formular online. Se pot aduga butoane de comand pe o foaie de calcul pentru a executa proceduri macro uzuale etc. Dei modul de operare este foarte asemntor, exist deosebiri precum o o adugarea controalelor se realizeaz cu ajutorul cutiei de unelte Control Toolbox (i nu Toolbox ca n VBE). Afiarea acestei cutii se realizeaz din View - Toolbars - Control Toolbox. bascularea ntre Design mode i Run mode se efectueaz n Word sau Excel prin ac ionarea butoanelor Exit Design Mode i Design Mode de pe bara Visual Basic. n PowerPoint se trece n Slide Show pentru a fi n Run Mode i se revine ntr-o viziune de editare pentru Design Mode. un control poate avea mul imi diferite de evenimente ntr-un document, foaie sau slide n raport cu acelai control de pe o form. De exemplu, un buton de comand dintr-o form are evenimentul Exit, n timp ce un buton de comand dintr-un document nu recunoate acest eveniment.

108

Controale ActiveX n documente Word La adugarea i operarea cu controale ntr-un document Word sunt importante urmtoarele idei: Controalele ActiveX se pot aduga fie stratului (layer-ului) de text fie stratului de desen. Pentru plasarea controlului n text, se va ac iona simultan tasta SHIFT i click-ul pe controlul din Control Toolbox. n acest caz, controlul se va insera ca un caracter, pentru un aspect bun trebuie s se lucreze la atributele liniei i paragrafului. Pentru plasarea unui control n layer-ul de desen se ac ioneaz unealta din Control Toolbox fr a ac iona i tasta SHIFT. n acest caz, controlul este similar unui obiect Picture din documentul Word. Un control adugat pe stratul text este un obiect InlineShapes la care se ob ine acces programatic prin colec ia InlineShapes. Un control adugat pe stratul de desen este un obiect Shape la care se ajunge programatic prin colec ia Shapes. Controalele din stratul text sunt tratate precum caracterele i sunt pozi ionate n linia de text, se mut o dat cu textul sau cu inserarea de caractere etc. Controalele din Control Toolbox nu pot fi aduse prin dragare n document. La click pe un control, acesta este inserat la punctul de inser ie (pe stratul text) sau ntr-o pozi ie bazat pe aceasta (pe startul de desen). Inserarea consecutiv a mai multor obiecte n aceeai pozi ie pe stratul de desen poate s produc o stiv din care vedem doar ultimul control plasat, de aici controalele trebuiesc duse n locuri distincte din document. n Design Mode, controalele ActiveX sunt vizibile doar n viziunile Page Layout sau Online Layout. Controalele ActiveX din stratul de desen sunt ntotdeauna n Run Mode n viziunile Page Layout sau Online Layout. Dac se inten ioneaz ca utilizatorul s fie capabil s se mute ntre controalele unui formular online prin ac ionarea tastei TAB, controalele se vor plasa pe stratul text i se va proteja forma prin click pe butonul Protect Form de pe bara de unelte Forms. Dac, la crearea unui formular online, se dorete adugarea de cmpuri de formular n locul controalelor ActiveX, se va utiliza bara de unelte Forms.

Controale ActiveX n foi de calcul Excel Se pot aduga controale, la caiete sau foi de calcul, lng datele pe care le controleaz, astfel nct operarea n foaia de calcul s se efectueze ct mai cursiv i mai pe n eles. Urmtoarele afirma ii puncteaz principalele aspecte ale plasrii controalelor ActiveX pe o foaie de calcul Excel. n plus fa de propriet ile standard ale controalelor, se pot utiliza pentru controalele dintr-o foaie Excel propriet ile: BottomRightCell, LinkedCell, ListFillRange, Placement, PrintObject, TopLeftCell i ZOrder. La aceste propriet i se ajunge n mod uzual. Urmtorul exemplu arat cum se poate realiza, prin program, o defilare a ferestrei active pn cnd controlul CommandButton1 ajunge n col ul din stnga sus:

Set t = Sheet1.CommandButton1.TopLeftCell With ActiveWindow .ScrollRow = t.Row .ScrollColumn = t.Column End With Anumite metode i propriet i din Microsoft Excel Visual Basic sunt inhibate atunci cnd un control ActiveX este activat. De exemplu, metoda Sort nu poate fi utilizat cnd un control este activ. n acest caz se va activa n prealabil un alt element de pe foaie, dup modelul:

Private Sub CommandButton1_Click Range("a1").Activate Range("a1:a10").Sort Key1:=Range("a1") CommandButton1.Activate

109

End Sub Se observ revenirea la activarea butonului de comand dup ce s-a efectuat sortarea. Controalele dintr-un workbook Excel scufundat ntr-un document al altei aplica ii nu vor func iona dac utilizatorul va utiliza dublu click pentru editarea caietului. Controalele vor func iona dac utilizatorul va deschide caietul prin right-click i Open din meniul direct. La salvarea unui workbook Excel 97 n format Microsoft Excel 5.0/95, toat informa ia asociat cu controalele ActiveX se pierde. Cuvntul cheie Me dintr-o procedur eveniment a unui control ActiveX de pe o foaie de calcul se refer la foaia de calcul i nu la control.

Controale ActiveX n diapozitive PowerPoint Adugarea controalelor ActiveX la diapozitive PowerPoint pot produce un schimb de informa ii cu utilizatorul, de exemplu personalizri ale prezentrii dup op iunile privitorului. Principalele aspecte care trebuie urmrite sunt: Un control de pe un slide este ntotdeauna n Design Mode, cu excep ia viziunii Slide Show. Pentru ca un control particular s apar pe toate diapozitivele, se va plasa pe Slide Master. Cuvntul cheie Me dintr-o procedur eveniment a unui control dintr-un slide, se refer la slide. Dac evenimentul este a unui control de pe master, atunci Me se refer la master i nu la slide-ul afiat n momentul cnd s-a declanat evenimentul. Scrierea codului eveniment pentru slide-uri este similar scrierii de cod pentru controalele de pe o form. Exemplul urmtor stabilete culoarea de fundal a diapozitivului pe care se gsete butonul de comand:

Private Sub cmdChangeColor_Click() With Me .FollowMasterBackground = Not .FollowMasterBackground .Background.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass End With End Sub Se pot dota diapozitivele cu unelte de naviga ie. Dac acestea sunt pozi ionate din Master, vor fi disponibile pe toate diapozitivele. De exemplu, adugnd la Slide Master dou butoane denumite, respectiv, cmdBack i cmdForward, i scriind procedurile de eveniment urmtoare, demonstra ia poate fi condus ac ionnd respectivele butoane.

Private Sub cmdBack_Click () Me.Parent.SlideShowWindow.View.Previous End Sub Sub cmdForward_Click () Me.Parent.SlideShowWindow.View.Next End Sub Pentru a lucra cu toate controalele ActiveX de pe un slide anume fr a afecta celelalte forme desenate (Shapes) de pe slide, se poate construi o colec ie ShapeRange care con ine doar controalele. Se pot aplica apoi metode i propriet i ntregii colec ii sau parcurge, n mod uzual, colec ia pentru a procesa fiecare control n parte. Exemplul urmtor aliniaz controalele de pe primul diapozitiv din prezentarea activ i le aranjeaz vertical.

With ActivePresentation.Slides(1).Shapes numShapes = Count

110

If numShapes > 1 Then numControls = 0 ReDim ctrlArray(1 To numShapes) For i = 1 To numShapes If .Item(i).Type = msoOLEControlObject Then numControls = numControls + 1 ctrlArray(numControls) = .Item(i).Name End If Next If numControls > 1 Then ReDim Preserve ctrlArray(1 To numControls) Set ctrlRange = .Range(ctrlArray) ctrlRange.Distribute msoDistributeVertically, True ctrlRange.Align msoAlignLefts, True End If End If End With Lucrul, prin program, cu controale din documentele aplica iilor Accesul programatic la un control se poate ob ine prin numele controlului sau prin intermediul colec iei creia i apar ine. Denumirea unui obiect este cea specificat drept valoare a propriet ii (Name) n fereastra Properties a controlului. Urmtoarele exemple prezint principalele ac iuni care implic controale i documente. Stabilirea titlului (caption) unui control: CommandButton1.Caption = "Run" Dac numele controlului se utilizeaz n afara modulului clas asociat documentului, foii de calcul sau diapozitivului care con ine controlul, atunci numele controlului trebuie calificat cu numele documentului respectiv: Sheet1.CommandButton1.Caption = "Run" Se poate accesa un control ActiveX i prin colec ia Shapes, OLEObjects sau InlineShapes, dup caz. o o o Controalele adugate la stratul de desen al unui document, foaie sau slide sunt con inute n obiectele Shape i pot fi gestionate programatic prin intermediul colec iei Shapes. n Excel, controalele ActiveX sunt con inute de asemenea n obiectele OLEObject i pot fi programate prin colec ia OLEObjects. n Word, controalele ActiveX adugate n stratul text sunt con inute n obiectele InlineShape i pot fi controlate prin colec ia InlineShapes.

Pentru accesul prin intermediul colec iilor, se utilizeaz numele obiectului Shape care con ine un control particular i nu numele din cod al controlului. n Excel i PowerPoint, numele obiectului care con ine un control este numele de cod implicit al controlului (cum ar fi CommandButton1). n Word, numele obiectului (de forma implicit Control 1) care con ine un control nu este legat de numele de cod al controlului. Pentru a schimba numele de cod al unui control se selecteaz controlul i se schimb valoarea propriet ii (Name). Pentru a schimba numele unui obiect Shape, OLEObject sau altui obiect care con ine un control se va schimba valoarea propriet ii Name. o Adugarea unui buton de comand la prima foaie de calcul:

Worksheets(1).OLEObjects.Add "Forms.CommandButton.1" _

111

Left:=10, Top:=10, Height:=20, Width:=100 o Instruc iunea urmtoare stabilete proprietatea Left a controlului:

Worksheets(1).OLEObjects("CommandButton1").Left = 10 o Urmtorul exemplu stabilete titlul obiectului:

Worksheets(1).OLEObjects("CommandButton1").Object.Caption = "Run" o Adugarea 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 Adugarea unui control ComboBox la stratul de desen:

ActiveDocument.Shapes.AddOLEControl ClassType:="Forms.ComboBox.1" o Fixarea unor propriet i ale unui ComboBox de pe stratul de desen

ActiveDocument.Shapes("Control 1").Left = 100 ActiveDocument.Shapes("Control 1").OLEFormat.Object.Text = "Reed" o Adugarea i modificarea unui buton de comand la un diapozitiv:

ActivePresentation.Slides(1).Shapes.AddOLEObject Left:=100, Top:=100, _ Width:=150, Height:=50, ClassName:="Forms.CommandButton.1" ActivePresentation.Slides(1).Shapes("CommandButton1").Left = 100 ActivePresentation.Slides(1).Shapes("CommandButton1") _ .OLEFormat.Object.Caption = "Run" Obiectele Microsoft Excel Visual Basic suport un set de obiecte care corespund direct elementelor din Microsoft Excel, cele mai multe identificabile dup denumirea uzual din mediul Excel. Astfel, obiectul Workbook reprezint un caiet, obiectul Worksheet reprezint o foaie de calcul iar obiectul Range reprezint un domeniu de celule dintr-o foaie de calcul. Fiecare element din Microsoft Excel caiet, foaie, diagram, celul etc. poate fi reprezentat printr-un obiect n Visual Basic. Prin scrierea unor proceduri, care controleaz aceste obiecte, se pot automatiza opera iile efectuate n Excel. Pentru a vedea modelul de obiecte pentru Microsoft Excel, se va cuta "Microsoft Excel Objects" n Help. Pentru a vedea fiierele 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. Fiierele sunt disponibile dac la instalarea aplica iei s-a marcat boxa Online Help for Visual Basic. Dintre cele peste 100 de obiecte care alctuiesc ierarhia de obiecte Excel, vom prezenta n acest capitol doar pe cele mai importante. Prezentarea este simplificat i din cauz c prezentarea obiectelor Word a conturat problematica modelelor de obiecte Office i a fixat anumite reguli de operare cu aceste obiecte.

112

Obiectul Application Cele mai multe propriet i ale obiectului Application Excel controleaz atributele de vizualizare ale ferestrei aplica iei sau comporatrea global a aplica iei. De exemplu, valoarea propriet ii DisplayFormulaBar este True dac bara de formule este vizibil, iar valoarea propriet ii ScreenUpdating este False dac actualizarea ecranului este inhibat. n plus, propriet ile obiectului Application ofer acces la obiectele situate mai jos n ierarhie de obiecte (constituie ceea ce s-a numit accesori). Astfel, proprietatea Windows d acces la colec ia Windows (reprezentnd toate ferestrele deschise n aplica ie), proprietatea Workbooks d colec ia Workbooks a tutror caietelor deschise etc. Din aceast categorie enumerm: o o o o o o o o Charts, colec ia tuturor foilor de tip chart, Dialogs, colec ia tuturor dialogurilor predefinite n mediul Excel, Names, colec ia tutror numelor create n caietul activ, RecentFiles, colec ia fiierelor utilizate recent (dup lista din meniul File), Sheets, colec ia tutror foilor deschise n caietul activ, Windows, Workbooks, Worksheets, colec ia tuturor foilor de calcul din caietul activ.

Returnarea unui obiect particular din colec ie se efectueaz dup procedurile generale, explicate n capitolele introductive. n categoria accesorilor mai pot fi ncadrate propriet ile care returneaz un obiect Range: ActiveCell, Cells, Rows, Columns, Selection (dac este selectat un domeniu de celule). Propriet ile ActiveWorkbook, ActiveSheet, ActiveChart i ActiveWindow returneaz obiectele care reprezint elementele active corespunztoare din Excel. Anumite metode i propriet i care se aplic obiectului Application se aplic i unor obiecte situate mai jos n ierarhie. Utilizarea acestor propriet i i metode la nivelul Application vor modifica toate caietele, foile deschise. De exemplu, metoda Calculate aplicat la nivelul Application produce recalcularea tuturor foilor, din toate caietele, pe cnd utilizat la nivel de Workbook sau de Worksheet produce recalcularea doar a foilor locale. Obiectul Workbook Dup cum se tie, similarul unui document din Word este n Excel caietul (workbook). Deschiderea sau nchiderea unui fiier n Excel implic deci deschiderea sau nchiderea unui caiet. In Visual Basic, metodele utilizate la lucrul cu fiiere sunt metode ale obiectului Workbook sau ale colec iei Workbooks. Deschiderea unui Workbook Pentru a deschide un caiet se utilizeaz metoda Open. Metoda este aplicat ntotdeauna colec iei Workbooks, returnat prin proprietatea global cu aceeai denumire. Exemplul urmtor deschide caietul "Book1.xls" din folderul curent i afieaz apoi valoarea din prima celul a primei foi: Sub OpenBook1() Set myBook = Workbooks.Open(Filename:="Book1.xls") MsgBox myBook.Worksheets(1).Range("A1").Value End Sub Este de remarcat c obiectul Workbook returnat de metod se refer la caietul deschis, care rmne activ.

113

Asupra utilizrii utilizrii sau nu a cii pe care se gsete fiierul se vor reciti cele spuse la deschiderea documentelor Word. Exist dou foldere remarcabile pentru care se poate ob ine n mod automat calea: folderul cu fiierele Excel executabile i folderul Library (creat automat la instalarea aplica iei). Ob inerea acestor ci se realizeaz prin propriet ile Path i LibraryPath ale obiectului Application). Astfel EXEPath = Application.Path & Application.PathSeparator LibPath = Application.LibraryPath & Application.PathSeparator returneaz, respectiv, calea ctre fiierele executabile Excel i calea ctre fiierele de bibliotec. O cale returnat se termin cu separatorul adecvat sistemului pe care se execut aplica ia, astfel nct codul este independent de platform Windows sau Macintosh). Instruc iunile fName = LibPath & "Book1.xls" Set myBook = Workbooks.Open(Filename:=fName) considerate mpreun cu atribuirea variabilei LibPath de mai sus, realizeaz deschiderea fiierului Book1.xls din folderul Library. Se poate lsa utilizatorului op iunea de a decide aupra numelui fiierului care se deschide. Acest lucru se poate realiza prin metoda GetOpenFilename a obiectului Application. Metoda afieaz cutia de dialog standard Open, dar, n loc s deschid fiierul selectat, returneaz un ir cu numele complet calificat al fiierului. Urmtorul exemplu demonstreaz metoda: Sub DemoGEtOpenFilename() Do fName = Application.GetOpenFilename Loop Until fName <> False MsgBox "Opening " & fName Set myBook = Workbook.Open (Filename:=fName) End Sub Metoda GetOpenFilename Afieaz dialogul Open i returneaz numele de fiier selectat fr a deschide efectiv fiierul. expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect) unde expression este o expresie care returneaz un obiect Application. FileFilter este de tip Variant, op ional. Este un ir specificnd criteriile de filtrare a fiierelor listate n dialog. irul const n perechi formate din irul de filtrare i din specificarea filtrului n format MS-DOS, toate elementele fiind separate prin virgule. n partea rezervat, dou filtre MS-DOS sunt separate prin ";". Exemple: "Text Files (*.txt),*.txt,Add-In Files (*.xla),*.xla", "Visual Basic Files (*.bas; *.txt),*.bas;*.txt", implicit se consider "All Files (*.*),*.*". FilterIndex este de tip Variant, op ional. Specific indexul criteriului de filtrare implicit. de la 1 la numrul de filtre specificat n FileFilter. Implicit se consider 1. Title este de tip Variant, op ional. Specific titlul boxei de dialog. Implicit este "Open".

114

ButtonText este specific pentru Macintosh. MultiSelect este de tip Variant, op ional. Este True atunci cnd se pot selecta mai multe nume de fiiere, False dac este permis selectarea unui singur fiier. Implicit este False. n cazul selec iei multiple se va returna un tablou de denumiri (chiar dac este selectat un singur fiier). Metoda returneaz numele fiierului selectat sau numele introdus de utilizator. n cazul cnd utilizatorul anuleaz boxa (prin Cancel), se returneaz False. Metoda poate schimba att folderul curent ct i unitatea. Crearea i salvarea unui Workbook Se creeaz un nou caiet prin aplicarea metodei Add la colec ia Workbooks. Valoarea returnat se va atribui (prin Set) unei variabile obiect pentru a putea referi noul caiet n program. Noul workbook devine activ. Metoda Add (colec ia Workbooks) Returneaz un obiect Workbook. Sintaxa expression.Add(Template) unde expression este o expresie care returneaz un obiect Workbooks. (Metoda se poate aplica, cu parametri specifici, tuturor colec iilor.) Template este de tip Variant, op ional. Determin modul de creare a noului caiet. Dac argumentul este un ir cu numele (posibil cu cale) unui fiier Excel, noul caiet este deschis dup modelul fiierului specificat. Argumentul poate fi o constant (de tipul enumerat XlWBATemplate), caz n care se va crea un caiet cu o singur foaie de tipul determinat de constant. Valorile posibile sunt: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet sau xlWBATWorksheet. Dac argumentul este omis, atunci se creeaz un caiet cu un numr de foi egal cu proprietatea SheetsInNewWorkbook a obiectului Application). Salvarea unui caiet se efectueaz prin metoda SaveAs (la prima salvare) sau prin metoda Save. Exist, similar metodei GetOpenFilename, metoda GetSaveAsFilename (pentru Application). Metoda SaveAs are sintaxa expression.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout) unde expression returneaz un obiect Workbook. Filename, op ional, Variant. Con ine numele noului fiier, poate include o cale. FileFormat, op ional, Variant. Specific formatul de fiier utilizat la salvare. Lista formatelor admise (cele care se pot selecta i la salvarea din Excel) se gsete n Help la proprietatea FileFormat.

115

Password, op ional, Variant. Un ir unde capitalizarea este considerat (cel mult 15 caractere) care con ine parola de protejare a fisierului. WriteResPassword, op ional, Variant. Un ir care con ine parola necesar pentru scrierea fiierului. Dac la deschidere nu se d parola exact, fiierul este deschis doar n citire. ReadOnlyRecommended, op ional, Variant. Este True pentru a afia, la deschidere, un mesaj cu recomandarea de a deschide fiierul doar n citire. CreateBackup, op ional, Variant. Este True dac se creeaz o copie backup. AccessMode, op ional, Variant. Con ine modul de acces la workbook. Poate fi una dintre constantele (din tipul XlSaveAsAccessMode): xlShared (shared list), xlExclusive (exclusive mode) sau xlNoChange (nu se modific modul de acces). Ultima valoare este cea implicit. Argumentul este ignorat dac se salveaz xlShared fr a schimba numele fiierului. Pentru schimbarea modului de acces se utilizeaz metoda ExclusiveAccess. ConflictResolution, op ional, Variant. Specific modul de rezolvare a conflictelor de schimbare n cazul cnd fiierul este shared. Poate fi una dintre constantele (de tip XlSaveConflictResolution): xlUserResolution (afieaz un dialog privind conflictul i rezolvarea)), xlLocalSessionChanges (accept automat modificrile locale) sau xlOtherSessionChanges (accept celelalte schimbri n locul modificrilor locale). Prima constant este valoarea implicit. AddToMru, op ional, Variant. Este True dac se adaug numele fiierului la lista fiierelor utilizate recent. Implicit este False. TextCodePage, TextVisualLayout, op ionale, Variant. Neutilizate n versiunea U.S. English. Metoda Save Salveaz modificrile caietului specificat. expression.Save unde expression returneaz un obiect Workbook. Pentru marcarea unui fiier drept salvat fr a-l scrie efectiv pe disc, se va atribui valoarea True propriet ii Saved. Metoda GetSaveAsFilename Similar metodei GetOpenFilename, aceast metod afieaz dialogul standard Save As, returneaz un nume de fiier, dar nu salveaz nici un fiier. expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText) unde expression este o expresie care returneaz un obiect Application. InitialFilename, op ional, Variant. Specific numele de fiier propus. Dac acest nume este omis, atunci se va utiliza numele caietului activ.

116

FileFilter, op ional, Variant. irul care specific criteriul de filtrare. Pentru structura irului se va revedea metoda GetOpenFilename de la deschiderea documentelor. FilterIndex, op ional, Variant. Este indicele criteriului de filtrare, de la 1 la numrul de filtre dat la FileFilter. Implicit este 1. Title, op ional, Variant. Titlul boxei de dialog. ButtonText este specific Macintosh. Metoda returneaz numele de fiier selectat sau cel introdus de utilizator. Numele returnat poate include i calea. Metoda returneaz False dac dialogul este nchis de utilizator prin Cancel. Metoda poate schimba folderul sau unitatea curent. Urmtorul exemplu creaz un nou caiet i-l salveaz prin metoda GetSaveAsFilename: Sub CreateAndSave() Set newBook = Workbooks.Add Do fName = Application.GetSaveAsFilename Loop Until fName <> False newBook.SaveAs Filename:=fName End Sub nchiderea unui Workbook Pentru a nchide un workbook, se va aplica metoda Close a obiectului Workbook. nchiderea poate avea loc cu sau fr salvarea modificrilor. Metoda Close Produce nchiderea obiectului. Aplicat colec iei Workbooks are sintaxa expression.Close unde expression returneaz un obiect Workbooks. Dac exist modificri ale caietelor, se va afia dialogul de interogare asupra eventualei salvri. Aplicat obiectelor Window i Workbook metoda are sintaxa expression.Close(SaveChanges, FileName, RouteWorkbook) unde expression este o expresie care returneaz un obiect Workbook sau Window. SaveChanges este op ional, Variant. Dac nu exist modificri, argumentul este ignorat. Dac exist modificri n caiet dar caietul mai apare i n alt fereastr deschis, atunci argumentul este de asemenea ignorat. Dac exist modificri i caietul nu mai apare n alt fereastr, atunci salvarea se efectueaz dup valorile: True salvarea modificrilor sub numele dat la FileName sau dialog Save As; False nu se salveaz modificrile; argument omis interogare utilizator.

117

FileName este op ional, Variant. Salveaz modificrile sub acest nume. RouteWorkbook este op ional, Variant. Dac nu este indicat nici o rutare (nu exist nici un RoutingSlip ataat), argumentul este ignorat. Altfel, Excel efectueazrutarea documentului dup valorile acestui argument: True trimite caietul la urmtorul recipient; False caietul nu este transmis mai departe; omis interogarea utilizatorului asupra trimiterii. nchiderea unui workbook din Visual Basic nu execut macrourile Auto_Close din workbook. Se va utiliza metoda RunAutoMacros pentru executarea macrourilor automate de nchidere. Aceste macrouri sunt men inute n Excel din motive de compatibilitate, deci se refer la foi automatizate n versiuni Excel mai vechi. Exemplul urmtor arat deschiderea unui caiet, modificri temporare ale caietului i nchiderea fr salvarea modificrilor: Sub OpenChangeClose() Do fName = Application.GetOpenFilename Loop Until fName <> False Set myBook = Workbooks.Open (Filename:=fName) ' Aici se modific foile de calcul myBook.Close SaveChanges:=False End Sub Obiectul Range Prin intermediul unui obiect Range se poate referi o singur celul, un domeniu de celule, o ntreag linie sau coloan, o selec ie cu arii multiple sau un domeniu 3-D. Din acest motiv obiectul Range este oarecum neuzual prin aceea c poate reprezenta att o singur celul ct i o mul ime de celule. Nu exist un obiect colec ie pentru Range, as c un obiect Range poate fi gndit fie ca un obiect, fie ca o colec ie, dup situa ie. Exist foarte multe propriet i i metode care returneaz un obiect Range: ActiveCell BottomRightCell Cells ChangingCells CircularReference Columns CurrentArray CurrentRegion Dependents DirectDependents DirectPrecedents EntireColumn EntireRow Next Offset PageRange Precedents Range RowFields RowRange Rows Selection TableRange1 TableRange2 TopLeftCell UsedRange VisibleRange

Pentru specificarea exact a acestor propriet i i metode se vor cuta subiectele respective n Help. n continuare sunt men ionate, mai mult prin exemple, moduri de lucru cu obiecte Range.

118

Referin e de tip A1 sau nume de domeniu Unul dintre modurile uzuale de returnare a unui obiect Range este acela al utilizrii unei referin e de tip A1 sau al unui nume definit. inserarea unei valori ntr-o celul:

Worksheets("Sheet1").Range("A1").Value = 3 inserarea unei formule ntr-o celul:

Range("B1").Formula = "=510*RAND()" inserarea aceleeai valori ntr-un ntreg domeniu de celule:

Range("C1:E3").Value = 6 tergerea con inutului unor celule:

Range("A1","E3").ClearContents Stabilirea stilului bold pentru un domeniu numit (la nivel de workbook):

Range("myRange").Font.Bold = True Atribuirea aceleeai valori fiecrei celule dintr-un domeniu numit (la nivel de foaie):

Range("Sheet1!yourRange").Value = 3 Setarea unei variabile obiect la un domeniu:

Set objRange = Range("myRange") Este de men ionat c expresiile care nu sunt calificate se refer la foaia curent, deci multe din exemplele de mai sus nu ar opera dac foaia curent este o foaie de tip chart. O cauz frecvent de erori este utilizarea propriet ii Range ca argument al altei metode fr calificarea complet a obiectului Worksheet cruia i se aplic Range. Exemplul urmtor Sub SortRange() Worksheets("Sheet1").Range("A1:B10").Sort _ Key1:=Range("A1"), Order1:=xlDescending End Sub nu va func iona corect dect dac Sheet1 este foaia activ, altminteri calificarea argumentului Key1 nu este complet. Pentru o execu ie independent de context ar trebui folosit Key1:=Worksheets("Sheet1").Range("A1") Utilizarea indicilor de linii i coloane

119

O celul specific poate fi returnat utiliznd indicii numerici de linie i coloan pentru celula referit. Pentru a da o valoare celulei A1 se poate utiliza:

Worksheets("Sheet1").Cells(1,1).Value = 3 Pentru a insera o formul n celula B1 din foaia activ:

Cells(1,2).Formula = "=510*RAND()" Pentru a fixa o variabil obiect la domeniul format din celula A1

Set objRange = Worksheets("Sheet1").Cells(1,1) Referin ele prin indici sunt utile mai ales la parcurgerea unui bloc de celule prin instruc iuni de ciclare. Exemplul urmtor anuleaz toate celulele din domeniul A1:D10, cu o valoare mai mic 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 urmtor se arat o solu ie la listarea, ntr-o foaie separat, a tuturor denumirilor create n caietul activ i a domeniilor referite de acestea. Sub ListNames() Set newSheet = Worksheets.Add I=1 For Each nm in ActiveWorkbook.Names NewSheet.Cells(i,1).Value = nm.Name NewSheet.Cells(i,2).Value = "' " & nm.RefersTo Next nm NewSheet.Columns("A:B").AutoFit End Sub Utilizarea propriet ii Offset Atunci cnd este necesar referirea la un domeniu prin deplasri relative la alt domeniu de celule, se poate utiliza proprietatea Offset, a obiectului Range, care n argumentele RowOffset i ColumnOffset arat deplasarea fa de obiectul Range curent. Este returnat un nou obiect Range. Exemplul urmtor determin cteva tipuri de date din celulele domeniului A1:A10, tipurile determinate fiind nscrise, ca text, n celula corespunztoare din dreapta, B1:B10. Sub ScanColumn () For Each c In Worksheets("Sheet1").Range("A1:A10").Cells If Application.IsText(c.Value) Then

120

c.Offset(0,1).Value = "Text" ElseIf Application.IsNumber (c.Value) Then c.Offset(0,1).Value = "Number" ElseIf Application.IsLogical (c.Value) Then c.Offset(0,1).Value = "Boolean" ElseIf Application.IsError (c.Value) Then c.Offset(0,1).Value = "Error" ElseIf c.Value = "" Then c.Offset(0,1).Value = "(blank cell)" End If Next c End Sub Utilizarea propriet ilor CurrentRegion i UsedRange Aceste dou propriet i, explicate n continuare, sunt utile atunci cnd nu se tie de la nceput ct de mare este domeniul pe care se opereaz. Prin regiunea curent se n elege un domeniu dreptunghiular de celule, limitat de linii i coloane goale, eventual de marginile foii de calcul i de linii i coloane goale. Proprietatea CurrentRegion se aplic unui obiect Range i pot fi mai multe regiuni curente pe o foaie de calcul, dup obiectul Range cruia i se aplic proprietatea. Proprietatea returneaz un obiect Range, reflectnd extensia, n sensul prezentat mai sus, al obiectului Range cruia i se aplic proprietatea. Domeniul utilizat este determinat de celule nevide situate cel mai la stnga sus i cel mai la dreapta jos ntr-o foaie de calcul. Un asemenea domeniu con ine toate celule nevide din foaie, ca i celule vide interpuse pn la completarea unui domeniu dreptunghiular i este unic pe o foaie de calcul. Este natural ca proprietatea UsedRange s se aplice obiectului Worksheet i nu unui obiect Range. Proprietatea returneaz un obiect Range. Urmtorul exemplu aplic celulelor cu valori numerice dintr-o list, care ncepe n celula A1, formatul numeric 0.0: Sub FormatRange () Set myRange = Worksheets("Sheet1").Range("A1").CurrentRegion MyRange.NumberFormat = "0.0" End Sub Exemplul care urmeaz presupune c foaia activ con ine date dintr-un experiment desfurat n timp: prima coloan con ine datele calendaristice, a doua coloan con ine ora nregistrrii valorilor, coloanele a treia i a patra con in msurtorile experimentului. Procedura prezentat combin primele dou coloane ntr-o singur valoare de tip Date, convertete valoarea ob inut din GMT (Greenwich Mean Time) n PST (Pacific Standard Time) i le formateaz. Deoarece nu se tie dac exist i coloane goale ntre cele patru coloane cu date, se utilizeaz UsedRange. Sub ConvertDates () Set myRange = ActiveSheet.UsedRange myRange.Columns("C").Insert Set dateCol = myRange.Columns("C") For Each c In dateCol.Cells If c.Offset(0,-1).Value <>"" Then c.FormulaR1C1 = "=RC[-2]+RC[-1] - (8/24)" End If Next c dateCol.NumberFormat = "mmm-dd-yyyy hh:mm" dateCol.Copy dateCol.PasteSpecial Paste:=xlValues myRange.Columns("A:B").Delete

121

dateCol.AutoFit End Sub Exist i alte propriet i i metode care produc fie subdomenii, fie supradomenii pornind de la un obiect Range. Printre acestea enumerm: Areas, Cells, Columns, EntireColumn, EntireRow, Range i Rows. Parcurgerea unui domeniu de celule Dintre multiplele moduri de parcurgere a celulelor dintr-un domeniu, se prezint parcurgerile prin instruc iunile For Each Next i Do Loop, unele fiind deja utilizate n exemplele anterioare. Utilizarea instruc iunii For Each Next Acesta este modul recomandat de parcurgere a elementelor unei colec ii. Un exemplu anterior devine Sub RoundToZero () For Each r In Worksheets(Sheets1").Range("A1:D10").Cells If Abs(r.Value) < 0.01 Then r.Value = 0 End If Next r End Sub Pentru ca opera iunea anterioar s aib loc pe un domeniu selectat de utilizator, se poate utiliza metoda InputBox, specificndu-i utilizatorului s selecteze un domeniu de celule. Metoda returneaz un obiect Range care reprezint selec ia. Codul este completat cu instruc iuni de tratare a erorilor uzuale. Sub RoundToZero () Worksheets("Sheet1").Activate On Error GoTo PressedCancel Set r = Application.InputBox( _ Prompt:="Select a range of cells", _ Type:=8) On Error GoTo 0 For Each c In r.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 End If Next c Exit Sub PressedCancel: Resume End Sub Dac nu se dorete selectarea de ctre utilizator a domeniului procesat, se poate utiliza proprietatea CurrentRegion sau proprietatea UsedRegion pentru a returna obiectul Range prelucrat. De exemplu, dac se tie c domeniul ncepe cu celula A1 i nu include linii sau coloane vide, atunci se poate utiliza Set r = Worksheets("Sheet1").Range("A1").CurrentRegion

122

pentru a returna ntregul domeniu (compact) de celule care se prelucreaz. Urmtoarele dou exemple arat cum se poate ascunde fiecare a doua coloan 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 instruc iunii DoLoop Atunci cnd procesarea unui domeniu modific domeniul (de exemplu prin tergerea unor linii/coloane), utilizarea instruc iunii For EachNext nu produce cele mai bune rezultate. Solu ia este atunci utilizarea instruc iunii DoLoop. Exemplul urmtor sorteaz o list i elimin liniile elementelor duplicate: Sub RemoveDuplicates () Worksheets("Sheet1").Range("A1").Sort _ Key1:=Worksheets("Sheet1").Range("A1") Set currentCell = Worksheets("Sheet1").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1,0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell Loop End Sub Este de notat c structura repetitiv poate fi nlocuit prin Do While currentCell.Value <> "" ' instruc iunile de eliminare a liniilor cheilor duplicate Loop Utilizarea propriet ii Address

123

Aplicarea propriet ii Address returneaz adresa de celule a domeniului, adresa fiind sub forma de ir de caractere. Aceast utilizare este util, n general, pentru verificare i depanarea codului. Exemplul urmtor arat o form de completare a unei proceduri anterioare cu instruc iuni de control a mersului programului Sub HideColumns () Set r = Worksheets("Sheet1").UsedRange MsgBox r.Address ' doar pentru depanare For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True MsgBox r.Columns(i).Address ' doar pentru depanare End If Next i End Sub Acelai efect se poate ob ine prin stabilirea unor expresii de urmrire (watch expressions) de forma r.Address i r.Columns(i).Address, valorile respective pot fi examinate n fereastra Immediate. Pentru o discu ie mai pe larg se va studia capitolul dedicat depanrii i manevrrii erorilor. Evenimentele din Excel 97 O bun parte din codul scris ntr-o aplica ie este con inut n proceduri de rspuns la evenimente. Cunoaterea evenimentelor i alegerea unor rspunsuri adecvate produc o aplica ie senzitiv, vie, care interac ioneaz bine cu utilizatorul. n Microsoft Excel 97 se pot scrie proceduri eveniment la nivelurile: worksheet, chart, workbook i application. n plus fa de versiuni anterioare, sunt posibile i proceduri eveniment cu argumente. Procedurile de rspuns la evenimente la nivelurile Worksheet i Workbook sunt create n mod implicit pentru orice foaie de calcul, foaie de diagram sau caiet. Pentru a scrie proceduri de rspuns la evenimentele de la nivelul Chart sau pentru Application, trebuie s se creeze un nou obiect utiliznd cuvntul cheie WithEvents ntr-un modul clas. (vezi discu ia din sec iunea dedicat subiectului n acest capitol). Permiterea i inhibarea evenimentelor n mod uzual, toate evenimentele sunt permise. Cu alte cuvinte evenimentele au loc, sunt recunoscute ca atare i se execut procedurile corespunztoare fiecrui eveniment. n cazul cnd nu se dorete executarea procedurii de rspuns, acest lucru este controlat prin inhibarea evenimentului, cu efectul nerecunoaterii evenimentului de ctre sistem i, drept urmare, neexecutarea procedurii asociate. Proprietatea EnableEvents, a obiectului Application, poate primi valoarea True sau False dup cum evenimentele sunt permise sau inhibate. Urmtorul exemplu execut salvarea caietului fr producerea evenimentului BeforeSave: Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True

124

Utilizarea evenimentelor Completarea procedurilor implicite de rspuns la evenimente se efectueaz prin accesul la codul procedurilor i scrierea de cod n mod uzual. Pentru a vedea procedurile de eveniment ale unei foi (de calcul sau diagram): o click dreapta pe cotorul foii (pe bara de jos, unde se vd cotoarele tuturor foilor din caietul activ), comanda View Code din meniul contextual, alegerea numelui evenimentului n lista derulant Procedure, sau meniul Tools, comanda Macro i selectarea op iunii Visual Basic Editor. Se selecteaz foaia dorit n Project Explorer, butonul View Code i se alege numele evenimentului din lista Procedure.

Evenimentele obiectului Worksheet Eveniment Activate BeforeDoubleClick BeforeRightClick Calculate Change Deactivate Descriere Apare atunci cnd utilizatorul activeaz foaia. Acest eveniment se va utiliza n locul propriet ii OnSheetActivate Apare atunci cnd utilizatorul execut un dublu click ntr-o celul a foii. Se va utiliza n locul propriet ii OnDoubleClick. Apare atunci cnd utilizatorul execut un click dreapta ntr-o celul a foii. Apare cnd utilizatorul recalculeaz foaia. Acest eveniment se va utiliza n locul propriet ii OnCalculate. Apare atunci cnd utilizatorul schimb o formul dintr-o celul. Se va utiliza n locul propriet ii OnEntry. Apare atunci cnd foaia este activ i utilizatorul activeaz o alt foaie. Nu apare atunci cnd utilizatorul mut focusul de la o fereastr la alt fereastr a aceleeai foi. Acest eveniment se va utiliza n locul propriet ii OnSheetDeactivate. Apare atunci cnd utilizatorul selecteaz o celul din foaie.

SelectionChange

O prezentare complet i exemple se gsesc n intrrile respective din Help. Exemplu n codul care urmeaz, se reajusteaz dimensiunea coloanelor la fiecare recalculare: Private Sub Worksheet_Calculate () Columns("A:F").AutoFit End Sub Este de remarcat c modelul procedurii este accesat printr-una din tehnicile descrise la "Utilizarea evenimentelor".

125

Evenimentele obiectului Chart Declanate atunci cnd utilizatorul activeaz sau modific o diagram, evenimentele recunoscute de obiectul Chart sunt prezentate n tabelul urmtor. Eveniment Activate BeforeDoubleClick BeforeRightClick Calculate Deactivate Descriere Apare atunci cnd utilizatorul activeaz foaia diagram (nu apare la diagramele scufundate). Acest eveniment se va utiliza n locul propriet ii OnSheetActivate Apare atunci cnd utilizatorul execut un dublu click pe diagram. Se va utiliza n locul propriet ii OnDoubleClick. Apare atunci cnd utilizatorul execut un click dreapta pe diagram. Apare cnd utilizatorul reprezint n diagram date noi sau modificate. Apare atunci cnd foaia este activ i utilizatorul activeaz o alt foaie. Nu apare atunci cnd utilizatorul mut focusul de la o fereastr la alt fereastr a aceleeai foi. Acest eveniment se va utiliza n locul propriet ii OnSheetDeactivate. Apare atunci cnd utilizatorul dragheaz date peste diagram. Apare atunci cnd utilizatorul dragheaz un domeniu de celule peste diagram. Apare atunci cnd utilizatorul execut un click cu un buton al mouse-ului n timp ce pointerul acestuia este pozi ionat pe diagram. Apare la micarea pointerului mouse-ului peste diagram. Apare atunci cnd utilizatorul elibereaz un buton al mouse-ului n timp ce pointerul acestuia este pozi ionat pe diagram. Apare la redimensionarea diagramei. Apare la selectarea unui element al diagramei. Apare atunci cnd utilizatorul modific valoarea unei punct de pe diagram.

DragOver DragPlot MouseDown MouseMove MouseUp Resize Select SeriesChanges

Evenimentele foilor de diagrame sunt permise n mod implicit. Pentru a scrie proceduri de eveniment pentru diagramele scufundate, trebuie s se creeze un nou obiect utiliznd WithEvents ntr-un modul de clas. Exemplu Se schimb culoarea chenarului unui punct atunci cnd utilizatorul schimb valoarea punctului: Private Sub Chart_SeriesChange (ByVal SeriesIndex As Long, _ ByVal PointIndex As Long) Set p = ActiveChart.SeriesCollection(SeriesIndex).Points(PointIndex) p.Border.ColorIndex = 3 End Sub

126

Evenimentele obiectului Workbook Aceste evenimente se declaneaz atunci cnd utilizatorul schimb un caiet sau orice foaie din caietul respectiv. Eveniment Activate AddInInstall AddInUninstall BeforeClose BeforePrint BeforeSave Deactivate NewSheet Open SheetActivate SheetBeforeDoubleClick SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate SheetSelectionChange WindowActivate WindowDeactivate WindowResize Descriere Apare atunci cnd utilizatorul activeaz caietul. Apare atunci cnd utilizatorul instaleaz caietul ca un add-in. Se va utiliza n locul macroului Auto_Add. Apare atunci cnd utilizatorul dezinstaleaz 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 tipririi caietului. Apare nainte ca utilizatorul s salveze foaia. Acest eveniment se va utiliza n locul propriet ii OnSave. Apare atunci cnd caietul este activ i utilizatorul activeaz un alt caiet. Apare dup ce utilizatorul creeaz o nou 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 propriet ii OnSheetActivate. Apare la dublu click pe o celul (nu este utilizat cu foile diagram). Se va utiliza n locul propriet ii OnDoubleClick. Apare la click dreapta pe o celul a unei foi din caiet (nu este utilizat cu foile diagram). Apare la recalcularea unei foi (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnCalculate. Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnEntry. Apare la activarea altei foi din caiet. Se utilizeaz n locul propriet ii OnSheetDeactivate. Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram). Apare atunci cnd utilizatorul mut focusul pe orice fereastr a caietului. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul mut focusul n afara oricrei fereastre a caietului. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul deschide, redimensioneaz, maximizeaz sau minimizeaz orice fereastr a caietului.

Pentru explica ii se vor studia intrrile corespunztoare din Help.

127

Exemplu Deschiderea caietului maximizeaz fereastra aplica iei Excel: Sub Workbook_Open () Application.WindowState = xlMaximized End Sub Evenimentele obiectului Application Aceste evenimente se declaneaz la crearea/deschiderea unui caiet sau atunci cnd este modificat orice foaie din orice caiet deschis. Eveniment (pentru Application) NewWorkbook SheetActivate SheetBeforeDoubleClick SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate SheetSelectionChange WindowActivate WindowDeactivate WindowResize WorkbookActivate WorkbookAddInInstall WorkbookAddInUninstall WorkbookBeforeClose Descriere Apare la crearea unui nou caiet. Apare atunci cnd utilizatorul activeaz o foaie dintr-un caiet deschis. Se va utiliza n locul propriet ii OnSheetActivate. Apare la dublu click pe o celul dintr-un caiet deschis (nu este utilizat cu foile diagram). Se va utiliza n locul propriet ii OnDoubleClick. Apare la click dreapta pe o celul a unei foi dintr-un caiet deschis (nu este utilizat cu foile diagram). Apare la recalcularea unei foi (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnCalculate. Apare la modificarea formulei dintr-o celul (nu este utilizat cu foile diagram). Se utilizeaz n locul propriet ii OnEntry. Apare la activarea altei foi dintr-un caiet. Se utilizeaz n locul propriet ii OnSheetDeactivate. Apare la modificarea selec iei dintr-o foaie de calcul (nu func ioneaz cu foile diagram). Apare atunci cnd utilizatorul mut focusul pe orice fereastr deschis n aplica ie. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul mut focusul n afara oricrei fereastre a aplica iei. Se utilizeaz n locul propriet ii OnWindow. Apare atunci cnd utilizatorul redimensioneaz, maximizeaz sau minimizeaz orice fereastr deschis n aplica ie. Apare atunci cnd se mut focusul pe un caiet deschis Apare la instalarea unui workbook ca un add-in. Apare la dezinstalarea unui workbook ca un add-in. Apare nainte ca un caiet deschis s fie nchis.

128

WorkbookBeforePrint WorkbookBeforeSave WorkbookDeactivate WorkbookNewSheet WorkbookOpen

Apare nainte ca un caiet deschis s fie tiprit. Apare nainte ca un caiet deschis s fie salvat. Apare atunci cnd utilizatorul mut focusul n afara unui caiet deschis. Apare la adugarea unei noi foi la un caiet deschis. Apare atunci cnd utilizatorul deschide un caiet.

Utilizarea modulelor clas cu evenimente Deoarece diagramele scufundate ntr-o foaie de calcul i obiectul Application nu au evenimente permise n mod implicit, trebuie s se urmeze urmtoarele etape pentru a utiliza evenimentele recunoscute de aceste obiecte. Se creeaz un modul de tip clas i se declar un obiect de tip Chart sau Application cu evenimente. Pentru crearea modulului clas se d comanda Class Module din meniul Insert. Pentru permiterea evenimentelor obiectului Application se adaug declara ia

Public WithEvents App As Application Obiectul nou creat apare n boxa Object din modulul clas i se pot scrie procedurile evenimentelor pentru noul obiect. Se conecteaz obiectul declarat n modul la obiectul Application. Pentru aceast opera iune, n orice modul se d instruc iunea

Public X As New EventClass unde EventClass este numele dat, de exemplu, modulului clas creat, similar pentru X. dup crearea instan ei X a obiectului EventClass se poate stabili obiectul App al clasei EventClass egal cu obiectul Application Microsoft Excel.

Sub InitializeApp () Set X.App = Application End Sub Dup executarea procedurii de ini ializare, obiectul App din modulul EventClass puncteaz ctre obiectul Application Microsoft Excel i procedurile eveniment din modulul clas vor fi executate la declanarea evenimentelor.

Dei procedura poate prea laborioas, ideea poate fi utilizat pentru ca aceleai proceduri eveniment s fie asociate mai multor obiecte. S presupunem c am efectuat etapele precedente pentru un obiect diagram. S-a utilizat astfel declara ia Public WithEvents cht As Chart n etapa 2 i codul urmtor

129

Dim C1 As New EventClass Dim C2 As New EventClass Sub InitializeCharts () Set C1.cht = Worksheets (1).ChartObjects(1).Chart Set C2.cht = Worksheets (1).ChartObjects(2).Chart End Sub pentru ini ializare. Aceeai tehnic se poate utiliza i pentru obiectele Worksheet i Workbook pentru a utiliza evenimentele noii clase cu mai multe foi de calcul, n plus fa de evenimentele implicite. Obiectele Microsoft Access O baz de date Microsoft Access este alctuit din diferite tipuri de obiecte. Unel sunt utilizate pentru a afia date din baz, altele pentru memorarea i gestionarea datelor iar altele ca ajutor n programare. Unele obiecte sunt furnizate de Access, altele sunt oferite de diferite componente. n continuare se discut doar obiectele din Access: forme, rapoarte, controale i module. Obiectele accesibile n Microsoft Access Deoarece Microsoft Access include mai multe componente, fiecare cu mul imea proprie de obiecte, anumite seturi de obiecte sunt accesibile doar dac se specific o referin la biblioteca respectiv, referin a efectundu-se n mod uzual prin marcarea bibliotecii n lista afiat la comanda References din meniul Tools. Access face referin , 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 con inute obiectele de acces la date (Data Access Objects DAO) cum ar fi TableDef, QueryDef prin care se determin structura de date i se pot accesa datele prin cod VB. Aceste obiecte sunt discutate ntr-un capitol separat. Visual Basic for Applications. Aici sunt con inute trei obiecte care ajut la programare: Debug, Err i Collection.

Microsoft Access include, de asemenea, biblioteca Microsoft Office 8.0, dar aceasta trebuie s fie referit pentru a avea acces la obiecte cum ar fi CommandBar, FileSearch sau Assistant. Alte biblioteci trebuie s fie referite dac obiectele lor sunt necesare n cadrul procesului de automatizare: de exemplu Microsoft Excel. Pentru a lucra cu obiectele Microsoft Access din alte aplica ii care suport automatizarea, n aplica iile respective se va face referire la biblioteca de obiecte Microsoft Access 8.0. Obiectele Microsoft Access Biblioteca de obiecte Microsoft Access 8.0 con ine obiectele i colec iile enumerate n tabelul urmtor. Obiectele i utilizarea lor sunt descrise n continuarea capitolului. Obiectul sau colec ia Descriere

130

Application Form Forms Report Reports Control Controls Module Modules Reference References DoCmd Screen

Reprezint aplica ia Microsoft Access (obiect) Reprezint o form deschis (obiect) Con ine toate formele deschise. (colec ie) Reprezint un raport deschis (obiect) Con ine toate rapoartele curente deschise (colec ie) Reprezint un control pe o form, raport sau sec iune sau din alt control (obiect) Con ine toate controalele de pe o form sau raport (colec ie) Reprezint un modul standard sau un modul clas (obiect) Con ine toate modulele deschise curent (colec ie) Reprezint o referin la o bibliotec de obiecte (obiect) Reprezint toate referin ele stabilite n mod curent (colec ie) Reprezint o ac iune macro din Visual Basic (obiect) Reprezint aranjarea curent a obiectelor pe ecran.

Obiectele Access sunt organizate n mod ierarhic, arborele de structur fiind urmtorul Propriet ile, metodele i evenimentele asociate sunt vizibile, n mod similar tutror obiectelor accesate n VBA, prin Object Browser. Pentru a deschide acest instrument, se deschide un modul i apoi se d comanda Object Browser din meniul View (sau F2). Obiectul Application Obiectul Application reprezint aplica ia Microsoft Access i este obiectul de nivel cel mai nalt din ierarhia de obiecte Access, con innd toate celelalte obiecte i colec ii. Obiectul Application este obiectul implicit din ierarhia de obiecte. Drept urmare, atunci cnd se lucreaz din interiorul aplica iei Access, nu este necesar referirea lui explicit cnd se utilizeaz una dintre propriet ile sau metodele sale, sau cnd se scrie o referin la un obiect sau o colec ie inclus. Referirea explicit nu produce, totui, erori. Specificare obiectului Application este necesar doar atunci cnd, prin procedeul de automatizare, se lucreaz cu obiecte din ierarhia Access n interiorul altei aplica ii. Utilizarea obiectului Application n automatizare Atunci cnd se lucreaz cu obiectele Access din alte aplica ii, cum ar fi Excel sau Visual Basic, trebuie s se introduc o referin la biblioteca de obiecte i orice referire la un obiect Access trebuie s nceap cu Application, care permite intrarea n ierarhie. Automatizarea trebuie s nceap cu etapele: o stabilirea, aplica ia gazd, a unei referin e la biblioteca de obiecte Microsoft Access

131

o o

declararea unei variabile obiect care s reprezinte obiectul Application Microsoft Access returnarea unei referin e la obiectul Application u asignarea acestei referin e la variabila obiect.

n Visual Basic Editor, aceste etape se realizeaz prin: o deschiderea unui modul, comanda References din Tools, selectarea Microsoft Access 8.0 Object Library n lista Available References. Este evident c se presupune instalarea prealabil a produsului Microsoft Access 97, n caz contrar referin a nu este disponibil. Pentru declararea variabilei obiect este recomandat formularea

Dim appAccess As Access.Application o Dup declararea variabilei, returnarea unei referin e la obiectul Application se poate ob ine prin func ia CreateObject (dac Microsoft Access nu este lansat) sau GetObject (dac Microsoft Access este deja lansat). Asignarea referin ei la variabila obiect definit este de exemplu:

Set appAccess = CreateObject("Access.Application.8") o o unde numrul versiunii poate lipsi dac exist o singur versiune instalat de Access. Dac aplica ia gazd suport New se poate utiliza o singur instruc iune pentru declararea variabilei i asignarea referin ei:

Dim appAccess As New Access.Application o diferen a fiind c n aceast variant nu este deschis efectiv Microsoft Access pn cnd nu se lucreaz programatic cu variabila obiect, de exemplu

appAccess.NewCurrentDatabase "NewDb.mdb" Dup parcurgerea etapelor descrise, se poate utiliza variabila obiect creat pentru accesul la ierarhia de obiecte Access. Urmtorul exemplu, care lucreaz din Excel pe baza de date standard (furnizat de Microsoft Office i utilizat frecvent pentru exemplificri) Northwind, deschide o form i lucreaz cu ea. Pentru a vedea func ionarea exemplului se va deschide Excel, se va trece codul ntr-un modul i apoi se va executa. Sub OpenNorthwindEmployees () Dim appAccess As New Access.Application Const conPath As String = "C:\Program Files\Microsoft Office\Office" _ & "\Samples\Northwind.mdb" With appAccess ' Deschide baza de date .OpenCurrentDatabase conPath ' Deschide forma Employees .DoCmd.OpenForm "Employees" ' Stabileste captarea formei .Forms!Employees.Caption = "Northwind Employees" End With End Sub Prin automatizare se poate lucra cu DAO prin stabilirea prealabil a unei referin e la biblioteca de obiecte Microsoft DAO 3.5 i utilizarea apoi a propriet ii DBEngine a obiectului Application Microsoft Access pentru returnarea unei referin e la obiectul DBEngine DAO. Prin acest din urm obiect se ob ine acces la toat ierahia de obiect DAO.

132

Colec ia Forms Obiectul Form reprezint o form Access deschis ntr-unul din modurile de vizualizare Design, Form sau Datasheet. Obiectele Form sunt grupate n colec ia Forms, care con ine doar formele deschise curent n baza de date. n tabelul urmtor sunt rezumate rela iile obiectelor Form i ale colec iei Forms: Obiectul sau colec ia Form (obiect) Este con inut() n Forms Con ine Colec ia Controls Colec ia Properties Obiectul Module Obiecte Form

Forms (colec ie) Referirea la un obiect Form

Application

Pentru a lucra cu o form n Visual Basic, trebuie s se returneze o referin la obiectul Form corespunztor, referin a ob inndu-se prin intermediul colec iei Forms. O form poate fi referit doar dac este deschis iar deschiderea unei forme se realizeaz prin metoda OpenForm a obiectului DoCmd. Ca orice element dintr-o colec ie, o form poate fi referit prin nume sau prin indexul din cadrul colec iei. Referin a prin nume se poate face n mod explicit, dac se cunoate numele formei n momentul proiectrii aplica iei: Dim frm As Form Set frm = Forms!Employees sau prin nota ia cu paranteze, n cazul n care numele este cunoscut doar la momentul execu iei, ca n exemplul urmtor: Function SetFormCaption (strFormName As String) Dim frm As Form ' Se deschide forma DoCmd.OpenForm strFormName ' Se returneaz o referin la obiectul Form Set frm = Forms(strFormName) ' Se schimb captarea formei frm.Caption = Date End Function Referin a prin indice este de genul Forms(1), indexarea colec iei Forms ncepnd cu 0 (zero). n acest mod de referire trebuie s se lucreze cu grij deoarece numerotarea se reface la orice nchidere a unei forme, prin urmare o form anumit poate avea indici diferi i n momente diferite de execu ie. Cum colec ia Forms cuprinde formele deschise la momentul respectiv, nu se poate aduga i nici nu se poate elimina un membru al colec iei (opera iuni posibile pentru alte colec ii din VBA). Deschiderea i nchiderea unei forme produce opera iunile de adugare/eliminare a elementelor din colec ie. Pentru cazuri singulare (cum ar fi un obiect care nu se utilizeaz n mod repetat), referin a la o form se poate efectua i direct, prin invocarea modulului clas al formei: Form_Employees.Visible = True

133

Propriet ile obiectului Form Dintre propriet ile obiectului Form sunt prezentate doar cteva, considerate mai importante. Pentru celelalte se va studia intrarea corespunztoare din Help (Form Object). Proprietatea Me (Form Object) Returneaz o referin la forma n care se execut codul curent. Proprietatea poate fi utilizat n procedurile din modulul formei, poate fi utilizat pentru trecerea ca argument a obiectului Form fr a ti numele formei. Utilizarea propriet ii produce un cod independent de numele formei. Urmtorul exemplu arat cum, la fiecare ncrcare (deschidere) a formei, se poate modifica culoarea de fundal a sec iunii detaliu din form. n acest scop se scrie cod n procedura eveniment respectiv: ' Procedura se adaug la modulul formei Private Sub Form_Load () ' Ini ializarea generatorului de numere aleatoare Randomize ' Stabilirea culorii de fundal Me.Section(acDetail).BackColor = RGB(Rnd*256, Rnd*256, Rnd*256) End Sub Este de notat c atunci cnd se lucreaz cu o form Access din alt aplica ie, prin automatizare, nu se poate utiliza Me pentru a referi forma din aplica ia gazd. Proprietatea Section (Form Object) O form este divizat n Access n cinci sec iuni: detaliu (detail), antet (header), subsol (footer), antet de pagin (page header) i subsol de pagin (page footer). Proprietatea returneaz o referin la o sec iune particular, utilizarea acesteia permite stabilirea propriet ilor sec iunii. Pentru obiectul Form, sec iunile sunt identificate prin Index 0 1 2 3 4 Nume acDetail acHeader acFooter acPageHeader acPageFooter Semnifica ie Form detail Form header Form footer Form page header Form page footer

Un numr de propriet i se aplic mai degrab unei sec iuni dintr-o form dect obiectului Form. De exemplu, proprietatea BackColor se aplic unei sec iuni i nu unei forme (a se vedea exemplul precedent). O sec iune are de asemenea o proprietatea Controls, care returneaz o referin la colec ia Controls pentru acea sec iune. Urmtorul exemplu tiprete, n fereastra Debug, numele tuturor controalelor din sec iunea de detalii: Sub ControlsBySection (frm As Form) Dim ctl As Control ' Enumerarea controalelor din sec iunea de detalii

134

For Each ctl In frm.Section(acDetail).Controls Debug.Print ctl.Name Next ctl End Sub Proprietatea Properties (Form Object) Returneaz o referin la colec ia Properties a obiectului Form. Colec ia Properties con ine toate propriet ile formei i pot fi enumerate prin instruc iunea For EachNext. La colec ia Properties nu se poate aduga programatic o nou proprietate. Urmtorul exemplu tiprete toate propriet ile unui obiect Form Sub EnumerateFormProperties(frm As Form) Dim prp As Property ' enumerarea propriet ile unei forme For Each prp In frm.Properties Debug.Print prp.Name, prp.Value Next prp End Sub Proprietatea Module (Form Object) Aplicat unui obiect Form, proprietatea Module returneaz o referin la obiectul Module asociat formei. Referin a poate fi asignat unei variabile de tip Module. Modulul asociat cu o form nu exist n mod automat din momentul creerii formei. Proprietatea HasModule determin dac o form are un modul asociat. Dac proprietatea Module este referit n modul proiectare, Access creeaz modulul asociat i stabilete valoarea True pentru HasModule. Referirea la proprietatea Module a unei forme n execu ie (runtime) pentru care HasModule este False produce eroare. Proprietatea RecordSource (Form Object) Prin proprietatea aceasta se leag o tabel sau o interogare (query) la form. Dup ce propriet ii RecordSource i-a fost atribuit numele unei tabele sau interogri sau o instruc iune SQL se pot afia date din tabel, interogare sau SQL pe form. Un exemplu este Forms!frmCustomers.RecordSource = "Customers" prin care se leag forma de o tabel. Module ataate formelor Un obiect Form poate avea un modul asociat, care este reprezentat printr-un obiect Module. Cum acest modul nu este creat n mod automat la crearea formei, exist trei ci de creare a modulului asociat: o o click Code de pe meniul View cnd forma este n modul de vizualizare Design. Modulul este creat i salvat mpreun cu forma chiar dac nu con ine code. Stabilirea propriet ii HasModule la True. Aceasta se poate efectua din foaia de propriet i din Access sau din Visual Basic. Stabilirea propriet ii la False elimin modulul i codul con inut.

135

Referirea la proprietatea Module a formei din Visual Basic. Proprietatea returneaz o referin la obiectul Module asociat formei, crend mai nti modulul dac el nu exist.

n lucrul cu module asociate, trebuie re inut c o form fr modul asociat se deschide mai repede. Prin urmare nu se vor crea module dac nu exist necesitatea scrierii de cod pentru form. Eliminarea modulelor inutile reduce i dimensiunea bazelor de date. Un modul de form con ine toate procedurile eveniment definite pentru form, ca i alte proceduri specifice formei. De notat c o procedur care se acceseaz din multiple locuri ale bazei de date trebuie plasat ntr-un modul standard. Crearea formelor n timpul execu iei Pentru generarea unei forme n timpul execu iei (run-time) se poate utiliza func ia CreateForm. Func iile asociate sunt CreateControl i DeleteControl care adaug sau elimin controale de pe o form. Se poate, de asemenea, s se adauge programatic, n timpul execu iei, cod n modulul asociat formei prin metodele i propriet ile obiectului Module. De exemplu, metoda CreateEventProc creeaz o procedur eveniment pentru obiectul specificat (aici form, dar poate fi i raport, control etc.). Metoda InsertLines permite inserarea unor linii de cod, ca i InsertText, AddFromFile, AddFromString etc. Urmtorul exemplu creeaz o form i adaug o procedur eveniment modulului asociat formei. Function CreateFormWithCode () As Boolean Dim frm As Form, mdl As Module Dim lngLine As Long, strLine As String ' Permite tratarea erorilor On Error GoTo Error_CreateFormWithCode ' creeaz noua form i returneaz o referin la ea Set frm = CreateForm ' returneaz o referin la modul Set mdl = frm.Module ' creeaz procedura evenimentului Load lngLine = mdl.CreateEventProc("Load", "Form") strLine = vbTab & "Me.Caption = " & Date ' stabilete captarea formei n evenimentul Load mdl.InsertLines lingLine + 1, strLine ' returneaz True dac func ia se termin cu succes CreateFormWithCode = True Exit_CreateFormWitwCode: Exit Function Error_CreateFormWithCode: MsgBox Err & ": " & Err.Description CreateFormWithCode = False Resume Exit_CreateFormWithCode End Function O discu ie ceva mai ampl se gsete la sec iunea dedicat colec iei Modules. Colec ia Reports

136

Un obiect Report reprezint un raport microsoft Access care este deschis n Design view, Print Preview sau Layout Preview. Toate obiectele Report sunt membri ai colec iei Reports. De accentuat c doar rapoartele deschise sunt reprezentate n colec ie. Rela iile n sus i n jos ale colec iei Reports n ierarhia de obiecte sunt date n tabelul urmtor: Obiectul sau colec ia Report (obiect) Este con inut() n Reports Con ine Colec ia Controls Colec ia Properties Obiectul Module Obiecte Report

Reports (colec ie)

Application

Obiectele Report au caracteristici similare cu obiectele Form. Referirea obiectelor Report Pentru a referi un raport trebuie ca acesta s fie deschis, opera iune realizat prin metoda OpenReport a obiectului DoCmd. Referin ele se returneaz n mod uzual, dup unul dintre modelele: Dim rpt As Report Set rpt = Reports!Invoice Set rpt = Reports("Invoice") Set rpt = Reports(0) Module asociate rapoartelor Ca i un obiect Form, obiectul Report poate avea asociat un modul care este un modul clas. Modulul de cod asociat nu exist pn cnd nu este referit: o o click Code de pe meniul View cnd raportul este n modul de vizualizare Design. Modulul este creat i salvat cu raportul chiar dac nu con ine code. Stabilirea pentru obiectul Report a propriet ii HasModule la True. Aceasta se poate efectua din foaia de propriet i din Access sau din Visual Basic. Stabilirea propriet ii la False elimin modulul i codul con inut. Referirea, din Visual Basic, la proprietatea Module a raportului. Proprietatea returneaz o referin la obiectul Module asociat raportului, crend mai nti modulul dac el nu exist. ' definete variabila obiect rpt de tip Report ' referin prin nume cunoscut ' referin prin irul care con ine numele ' referin prin indicele din colec ie (bazat pe zero)

Crearea rapoartelor n timpul execu iei (run time) Pentru crearea programatic a rapoartelor se utilizeaz func ie CreateReport. Controalele se pot aduga sau elimina, n run time, prin func iile CreateReportControl sau DeleteReportControl. Func iile CreateForm, CreateReport Sintaxa apelurilor este CreateForm([database[, formtemplate]])

137

CreateReport([database[, reporttemplate]]) unde database este un ir, identific baza de date care con ine raportul sau forma creat. Dac este omis, se va utiliza baza curent (conform returului func iei CurrentDb). Baza de date specificat, dac este diferit de baza curent, trebuie deschis ca o baz de date bibliotec (vezi intrrile din Help pentru "library databases"). formtemplate, reporttemplate sunt, respectiv, iruri cu numele abloanelor utilizate la crearea noului obiect. Dac este omis, se va alege n mod implicit ablonul specificat de fia Forms/Reports din dialogul Options deschis de comanda Options din meniul Tools. Func iile deschid un obiect nou, minimizat, n modul de vizualizare Design. abloanele specificate pot fi create anterior ca abloane sau pot fi orice form, respectiv raport, din baza de date specificat n argumentul database. Func iile CreateControl, CreateReportControl Ambele func ii creeaz un control cu atributele specificate pe o forma, respectiv pe un raport. Att forma ct i raportul trebuie s fie deschise. Sintaxa este CreateControl(formname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]]) CreateReportControl(reportname, controltype[, section[, parent[, columnname[, left[, top[, width[, height]]]]]]]) unde formname, reportname reprezint numele formei sau raportului unde se creeaz controlul. controltype este o constant predefinit care reprezint tipul controlului. Se pot vedea prin Object Browser cu alegerile Access n Project/Library i Constants n Classes i copia n cod. Fr explica ii (denumirile sunt suficient de sugestive): acLabel, acRectangle, acLine, acImage, acCommandButton, acOptionButton, acCheckBox, acOptionGroup, acBoundObjectFrame, acTextBox, acListBox, acComboBox, acSubform, acObjectFrame, acPage, acPageBreak, acCustomControl, acToggleButton, acTabCtl. section este o constant identificnd sec iunea. Poate fi o constant dintre Constanta acDetail acHeader acFooter acPageHeader acPageFooter acGroupLevel1Header Semnifica ia (Default) Detail section Form or report header Form or report footer Page header Page footer Group-level 1 header (reports only)

138

acGroupLevel1Footer acGroupLevel2Header acGroupLevel2Footer

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 ir care identific controlul printe. Pentru controalele care nu sunt copii se utilizeaz irul vid sau se omite argumentul. columnname numele cmpului unde este legat controlul, dac este un control legat de date. Dac nu este cazul, se utilizeaz irul vid. left, top sunt expresii numerice ale coordonatelor relative la col ul din stnga sus, n twips. width, height sunt expresii numerice indicnd l imea i nl imea controlului, n twips. Func iile CreateControl i CreateReportControl pot fi utilizate doar n modul de vizualizare Design (vezi i efectul func iilor CreateForm, CreateReport). n stabilirea rela iilor printe-copil se va avea n vedere rela ia de pe form/raport. De exemplu, caset text (control tat) i eticheta asociat (control copil, subordonat). Sau, un grup de op iuni este printe pentru boxele de control con inute etc. Doar controalele label, check box, option button sau toggle button pot avea controale printe, dei pot fi create i independent. Controalele care pot fi legate de un cmp de date sunt text box, list box, combo box, option group i bound object frame. n plus, controalele toggle button, option button i check box pot fi legate de un cmp dac nu sunt con inute ntr-un grup de op iuni (option group). La legarea unui cmp, propriet ile controlului sunt modificate automat pentru a se conforma propriet ilor corespunztoare ale cmpului. Pentru a nltura un control se vor utiliza instruc iunile DeleteControl i DeleteReportControl cu sintaxa DeleteControl formname, controlname DeleteReportControl reportname, controlname Semnifica ia argumentelor este evident. Exemplu de creare a unui raport Folosind automatizarea din Excel, exemplul creeaz o tabela legat ntr-o baz de date Access i realizeaz un raport pe baza datelor din tabele legat. Pentru utilizarea exemplului trebuie sa se creeze un caiet Excel cu numele Revenue.xls, s se completeze datele ntr-o foaie a caietului i s se denumeasc un domeniu DataRange care include datele. Dup aceea, se va trece codul urmtor ntr-un modul din caiet. n proiectul Excel se vor stabili referin e la bibliotecile de obiecte Microsoft Access 8.0 i DAO 3.5.

139

Este esen ial ca, naintea execu iei codului, s fie instalat n sistem driver-ul Microsoft Excel ISAM (Msexcl35.dll). Dac nu este instalat, se va executa Setup pentru a-l instala. Driver-ul Microsoft Excel ISAM permite fiierelor Excel 97 s lucreze cu motorul de baze de date Microsoft Jet. ' se introduce n sec iunea Declarations a modulului Dim appAccess As New Access.Application Sub PrintReport () Dim rpt As Access.Report, ctl As Access.TextBox Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field Dim strDB As String, intLeft As Integer ' se declar calea ctre baza de date Northwind (din Office) Const conPath As String = "C:\Program Files " ' Se deschide baza de date appAccess.OpenCurrentDatabase conPath & "Northwind.mdb" ' se returneaz referin a la baz Set dbs = appAccess.CurrentDb ' se creeaz un obiect tabel nou Set tdf = dbs.CreateTableDef("XLData") ' se specific irul de conectare la driver-ul Excel ISAM tdf.Connect = "EXCEL 8.0; Database=C:\My Documents\Revenue.xls" ' se specific tabela surs ca un domeniu numit n foaie tdf.SourceTableName = "DataRange" ' se adaug noua tabel legat la baz dbs.TableDefs.Append tdf ' se creeaz noul raport Set rpt = appAccess.CreateReport ' se specific tabela legat drept sursa de date a raportului rpt.RecordSource = tdf.Name ' se creeaz un control pe raport pentru fiecare cmp din tabel For Each fld In tdf.Fields Set ctl = appAccess.CreateReportControl (rpt.Name, acTextBox, , , _ fld.Name, intLeft) intLeft = intLeft + ctl.Width Next fld ' deschiderea raportului n Print Preview appAccess.DoCmd.OpenReport rpt.Name, acViewPreview ' restaurarea raportului app.Access.DoCmd.Restore ' afisarea Access-ului ca aplica ia activ AppActivate "Microsoft Access" End Sub Colec ia Controls Un obiect Control reprezint un control de pe o form sau dintr-un raport Access. Obiectele Control sunt grupate n colec ia Controls. Legturile n ierarhia de obiecte Access sunt date n tabelul urmtor. Obiectul sau colec ia Este con inut() n Con ine

140

Control (obiect)

Controls

Colec ia Controls cnd controlul este un grup de op iuni (option group) sau un control tab. Colec ia Properties Obiect Hyperlink Obiecte Control Obiecte Control

Controls (colec ie)

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.

Exist dou tipuri de controale: o o preconstruite, n biblioteca de obiecte Microsoft Access 8.0, accesibile printr-o cutie de unelte, controale ActiveX (denumite i controale OLE sau custom controls).

Controale Microsoft Access Urmtorul tabel con ine lista controalelor predefinite. Controalele sunt cu denumirile de clas, dup cum apar n Object Browser. Fiecare control este un obiect cu propriet ile, metodele i evenimentele lui. Pentru detalii se vor studia intrrile sinonime din Help. Controlul BoundObjectFrame CheckBox ComboBox CommandButton Image Label Line ListBox ObjectFrame OptionButton OptionGroup Page PageBreak Descriere Afieaz o imagine, diagram sau obiect OLE memorat ntr-o tabel Access. Indic selectarea unei op iuni Combin list ascuns i o caset text. Un buton cu rol de pornire a unei opera iuni atunci cnd se efectueaz click pe el. Afieaz o imagine. Afieaz un text explicativ. Afieaz o linie orizontal, vertical sau diagonal Afieaz o list de valori. Afieaz o imagine, diagram sau obiect OLE care nu este memorat ntr-o tabel. Indic dac o op iune este selectat (buton radio). Afieaz un set de op iuni. Afiseaz controale pe o pagin a unui control tab. Marcheaz nceputul unui nou ecran sau a unei pagini tiprite.

141

Rectangle SubForm/SubReport TabControl TextBox ToggleButton Controale ActiveX

Afieaz un dreptunghi. Afieaz o form n interiorul altei forme sau un raport n interiorul altui raport. Afieaz pagini multiple, fiecare con innd o mul ime de controale. Afieaz date de tip text. Indic dac o op iune este selectat sau nu (on/off) prin imaginea unui buton apsat sau nu.

Un control ActiveX este un obiect care poate fi plasat pe o form pentru a afisa date sau efectua ac iuni. Spre deosebire de controalele preconstruite, codul asociat este memorat n fiiere separate, care trebuiesc instalate pentru a putea utiliza controlul ActiveX. n Microsoft Access sunt disponibile controalele o o Calendar, care permite afiarea i actualizarea unui calendar pe o form. Instalarea controlului se cere la instalarea Microsoft Access. WebBrowser, care permite afisarea paginilor Web i alte documente ntr-o form Access. Acest control este instalat separat (din folderul ValuPack al CD-ului Office sau direct prin instalarea browserului Microsoft Internet Explorer).

Referirea obiectelor Control Un control poate fi referit repetat prin declararea unei variabile care s-l reprezinte. Declararea poate fi fcut explicit, dac se cunoate tipul obiectului: Dim txt As TextBox sau, dac nu se tie tipul controlului sau dac variabila con ine o referin la un control ActiveX, ea este declarat de tip generic Control i poate primi referin e la orice tip de control (alternativ util pentru trecerea unor argumente de tipuri diferite de controale unei proceduri) . Pentru referin a unui obiect Control individual se pot utiliza mecanismele uzuale pentru colec ii: Set txt = Forms!Employees!LastName ' care se refer la controlul TextBox ' cu numele LastName de pe forma Employees Set txt = Me!LastName ' similar exemplului precedent, dar referin a este ' n forma care se execut curent Set txt = Me![Last Name] 'dac numele con ine spa ii Set ctl = Me.Controls(0) ' prin indice, bazat pe zero Set ctl = Me.Controls("LastName") Propriet ile obiectului Control Datorit marii variet i de controale, propriet ile sunt foarte numeroase (de exemplu Text Box Control are peste 50 de propriet i) nct aici se discut doar dou care merit o aten ie special.

142

Proprietatea Hyperlink (Control Object) Prin aplicarea propriet ii este returnat o referin la un obiect Hyperlink, care reprezint un text sau grafic definind un salt la un fiier, bookmark ntr-un fiier, pagin HTML pe WWW sau pe intranet. Controalele care suport proprietatea Hyperlink sunt combo box, command button, image, label i text box. Fiecare poate afia o hiperlegtur pe care utilizatorul o poate clicka pentru navigare. Atunci cnd se dispune de o referin la un obiect Hyperlink dintr-un control, utilizarea metodei Follow (a obiectului Hyperlink) produce saltul la loca ia indicat. Exemplul urmtor con ine o func ie care returneaz True n cazul n care controlul trecut drept argument con ine o hiperlegtur valid. Function FollowControlHyperlink (ctl As Control) As Boolean Const conNoHyperlink As Integer = 7976 ' permiterea controlului erorilor On Error GoTo Error_FollowControlHyperlink ' urmrirea adresei indicate ctl.Hyperlink.Follow ' returneaz True dac saltul este corect FollowControlHyperlink = True Exit_ FollowControlHyperlink: Exit Function Error_ FollowControlHyperlink: If Err = conNoHyperlink Then FollowControlHyperlink = False End If Resume Exit_ FollowControlHyperlink End Function Proprietatea ControlType (Control Object) Aplicat unui obiect Control, proprietatea indic tipul particular de control al obiectului. Utilizarea propriet ii poate duce i la schimbarea tipului de control (de exemplu Text Box n Combo Box) nu numai la aflarea tipului. Valorile propriet ii sunt acLabel acCommandButton acBoundObjectFrame acSubform acCustomControl acRectangle acOptionButton acTextBox acObjectFrame acToggleButton AcLine AcCheckBox AcListBox AcPage AcTabCtl acImage acOptionGroup acComboBox acPageBreak

cu interpretri imediate. Urmtorul exemplu verific proprietatea ControlType pentru fiecare control de pe o form i stabilete proprietatea Locked la valoarea True pentru casetele de text i boxele combo. Function LockTextControls (frm As Form) As Boolean

143

Dim ctl As Control ' tratarea erorilor On Error GoTo Error_LockTextControls ' parcurgerea controalelor For Each ctl In frm.Controls ' se prelucreaz doar controalele Text Box i Combo Box If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then ctl.Locked = True End If Next ctl ' returneaz True pentru succes LockTextControls = True Exit_LockTextControls: Exit Function Error_LockTextControls: MsgBox Err & ": " & Err.Description LockTextControls = False Resume Exit_ LockTextControls End Function Controale legate de date (Data-Bound Controls) Anumite controale din Microsoft Access pot fi legate de date, ceea ce nseamn c ele afieaz date memorate ntr-o tabel, interogare sau instruc iune SQL. Aceast categorie de controale include: bound object frame, check box, combo box, list box, option button, option group, text box, subform i subreport. i unele controale ActiveX (de exemplu Calendar control) pot fi, de asemenea, legate de date. Controalele legate de date au o proprietate ControlSource prin care se fixeaz numele cmpului tabelei, interogrii sau instruc iunii SQL din care se iau datele afiate de control. Este de notat c mai nainte de stabilirea acestei propriet i trebuie s se fixeze proprietatea RecordSource a formei/raportului pentru a specifica tabela, interogarea sau instruc iunea SQL care furnizeaz date formei/raportului. Exemplul urmtor stabilete proprietatea RecordSource a unei forme i proprietatea ControlSource a unui control text box, numit Text0, n procedura de tratare a evenimentului de ncrcare a formei. Private Sub Form_Load () ' sursa de nregistrri a formei Me.RecordSource = "Employees" ' sursa de date a controlului Me!Text0.ControlSource = "LastName" End Sub Controale care au o colec ie Controls Tab control i Option group control au, la rndul lor, o colec ie Controls care poate con ine mai multe controale. Colec ie Controls apar innd unui grup de op iuni con ine controale de tip options button, check box, toggle button sau label.

144

Controlul Tab con ine o colec ie Pages reprezentnd paginile controlului (vezi figura urmtoare). Colec ia Pages con ine obiecte Page care sunt controale (au ControlType = acPage). Fiecare obiect Page are colec ia Controls a tuturor controalelor din pagina respectiv. Celelalte controale (text box, option group, option button, toggle button, check box, combo box, list box, command button, bound object frame i unbound object frame) au o colec ie Controls cu cel mult un element: label reprezentnd eticheta ataat controlului. Colec ia Modules Un obiect Module reprezint un modul din Microsoft Access. Toate obiectele Module sunt incluse n colec ia Modules, membru al obiectului Application. S-a vzut c un obiect Form sau Report poate s con in de asemenea un singur obiect Module. Mul imea tuturor modulelor dintr-o baz de date Microsoft Access constituie proiectul Visual Basic al bazei de date. Colec ia Modules con ine doar modulele deschise curent n proiect. Modulele care nu sunt deschise pentru editare nu sunt incluse n colec ia Modules. Pentru a deschide un modul n Visual Basic se utilizeaz metoda OpenModule a obiectului DoCmd. Rela iile stabilite de ierarhia de obbiecte sunt Obiectul sau colec ia Module (obiect) Este con inut() n Colec ia Modules Obiecte Form Obiecte Report Obiectul Application Con ine (Nimic)

Modules (colec ie) Referirea la obiecte Module

Obiecte Module

Accesul la un modul se ob ine prin intermediul colec iei, n mod uzual. Astfel Dim mdl As Module Set mdl = Modules![ Utility Functions] ' returneaz o referin 'la modulul cu numele dat Set mdl = Modules(" Utility Functions") ' - idemSet mdl = Modules(0) ' returneaz o referin ' la primul modul al colec iei Modulele clas asociate formelor sau rapoartelor care sunt deschise se regsesc n colec ia Modules. Pentru modulele asociate formelor/rapoartelor care nu sunt deschise vezi discu ia de la prezentarea obiectelor forme i rapoarte. Module standard i module clas Reamintim cteva no iuni prezentate n capitolele introductive.

145

Microsoft Access con ine dou tipuri de module: module standard (standard modules) i module de clas (class modules). Ambele tipuri sunt disponibile n tab-ul Modules din fereastra Database a mediului Access. O form sau un raport pot avea de asemenea un modul de clas asociat. Codul care trebuie s fie accesibil din orice procedur se va scrie ntr-un modul standard. Acestea sunt publice n mod implicit, deci procedurile i variabilele de nivel modul sunt vizibile n mod uzual n tot proiectul. De asemenea, dac proiectul este referit de alt proiect Access, codul dintr-un modul standard poate fi utilizat n proiectul care efectueaz referin a. Modulele de clas sunt ntotdeauna private. Se pot utiliza modulele clas pentru a crea obiecte utilizate n proiectul curent, dar ele nu se pot partaja cu alte proiecte. Procedurile Sub i Function definite ntr-un modul de clas devin metode ale obiectului definit iar price procedur de tip Property Let, Property Get i Property Set devin propriet ile obiectului. Se pot utiliza modulele clas asociate cu o form sau raport pentru a defini procedurile declanate de evenimente i se pot aduga oricte proceduri utilizate doar n modulul clas respectiv. Propriet ile obiectului Module O descriere sumar a propriet ilor este con inut n tabelul urmtor. Explica ii detaliate se ob in din Help. Proprietatea Application CountOfDeclarationLines CountOfLines Lines Name Parent ProcBodyLine ProcCountLines ProcOfLine Descriere Returneaz o referin la obiectul Application. Returneaz numrul de linii de cod din sec iunea Declarations a modulului. Returneaz numrul de linii de cod din modul Returneaz textul con inut n liniile de cod specificate D numele modulului Returneaz o referin la obiectul sau colec ia care con ine modulul Returneaz numrul liniei la care ncepe definirea procedurii Returneaz numrul de linii dintr-o procedur Returneaz numele procedurii care con ine o linie specificat object.ProcBodyLine( _ procname, prockind) object.ProcCountLines( _ procname, prockind) object.ProcOfLine( _ line, pprockind) ProcStartLine Returneaz numrul liniei la care ncepe o procedur object.ProcStartLine( _ procname, prockind) Observa ii Permite ob inerea accesului la ierarhia de obiecte Access. Long, numrtoarea ncepe cu 1 Long, numrtoarea ncepe cu 1 object.Lines(line, numlines)

146

Type

Indic tipul modulului

AcStandardModule sau 0, acClassModule sau 1.

Determinarea numrului de linii dintr-un modul Liniile unui modul sunt numrate ncepnd cu 1. Numrul ultimei linii dintr-un modul este egal cu valoarea propriet ii CountOfLines. Numrul ultimei linii din sec iunea Declarations a unui modul este egal cu valoarea propriet ii CountOfDeclarationLines. Numerele de linii nu apar efectiv n modul, ele sunt utilizate doar pentru referin e. Lucrul cu procedurile Propriet ile Lines, ProcBodyLine, ProcCountLines, ProcOfLine i ProcStartLine sunt utilizate pentru a ob ine informa ii despre procedurile unui modul. Procedurile pot fi de tip Sub, Function, Property Get, Property Let sau Property Set. Primele dou tipuri sunt considerate de acelai tip, ultimele trei privesc crearea de propriet i ntr-un modul clas. Proprietatea ProcBodyLine returneaz numrul liniei la care ncepe definirea procedurii, adic linia care include o instruc iune Sub, Function sau Property Get/Let/Set. Proprietatea ProcLineStart returneaz numrul liniei care urmeaz dup separatorul de proceduri, dac sunt selectate op iunile Full Module View i Procedure Separator n fia Module din dialogul Option (meniul Tools). Acest numr poate fi diferit de cel returnat de ProcBodyLine, deoarece sunt considerate i liniile comentariu, vide etc din fa a liniei de definire. ProcStartLine returneaz numrul primei linii a ntregii procedurii. Exemplul urmtor utilizeaz propriet ile enumerate pentru a tipri o procedur n fereastra Debug (exemplul modific uor exemplul din Help). Function ProcLineInfo(strModuleName As String, _ strProcName As String) As Boolean Dim mdl As Module Dim lngStartLine As Long, lngBodyLine As Long Dim lngCount As Long, lngEndProc As Long On Error GoTo Error_ProcLineInfo ' Se deschide modulul specificat DoCmd.OpenModule strModuleName ' Returneaz o referin la obiectul Module Set mdl = Modules(strModuleName) ' se numr liniile din procedur lngCount = mdl.ProcCountLines(strProcName, vbext_pk_Proc) ' Determin linia de start lngStartLine = mdl.ProcStartLine(strProcName, vbext_pk_Proc) ' se determin linia de definire lngBodyLine = mdl.ProcBodyLine(strProcName, vbext_pk_Proc) Debug.Print ' se tipresc liniile de nceput

147

Debug.Print "Lines preceding procedure " & strProcName & ": " Debug.Print mdl.Lines(lngStartLine, lngBodyLine - lngStartLine) ' determinarea numrului ultimei linii lngEndProc = (lngBodyLine + lngCount - 1) - Abs(lngBodyLine - lngStartLine) ' tiprirea liniilor din corpul procedurii Debug.Print "Body lines: " Debug.Print mdl.Lines(lngBodyLine, (lngEndProc - lngBodyLine) + 1) Exit_ProcLineInfo: Exit Function Error_ProcLineInfo: MsgBox Err & " :" & Err.Description ProcLineInfo = False Resume Exit_ProcLineInfo End Function Procedura poate fi apelat, de exemplu, din baza de date exemplificatoare Northwind prin Sub GetProcInfo() ProcLineInfo "Utility Functions", "IsLoaded" End Sub Metodele obiectului Module Tabelul urmtor con ine o sintez a metodelor obiectului Module. Metoda AddFromFile AddFromString CreateEventProc DeleteLines Find InsertLines ReplaceLines Adugare de text la un modul Pentru a insera text ntr-un modul, este recomandat metoda InsertLines prin care se poate specifica linia unde are loc inserarea. Exemplul din Help (intrarea InsertLines Method) creeaz o form nou, adaug un buton de comand, creeaz procedura evenimentului Click i insereaz o linie de cod cu metoda InsertLines. Descriere Adaug la modul con inutul unui fiier text. Adaug modulului con inutul unui ir de caractere. Creeaz o procedur eveniment ntr-un modul clas. Elimin din modul liniile specificate. Gsete, ntr-un modul, textul specificat. Insereaz o linie sau un grup de linii de cod la o pozi ie specificat din modul. Inlocuiete o linie dintr-un modul cu textul specificat.

148

Dac textul care se dorete adugat trebuie s fie ntr-un modul nou, acesta se poate crea prin metoda RunCommand a obiectului Application (comanda Module din meniul Insert trebuie s fie permis): RunCommand acCmdNewObjectModule Pentru lista integral a constantelor permise la aplicarea metodei se va vedea intrarea "RunCommand Method Constants" n Help. Exemplul urmtor utilizeaz metoda AddFromFile pentru a aduga con inutul unui fiier text la un modul nou. Modulul creat este salvat cu acelai nume ca i fiierul text. Function AddFromTextFile(strFileName) As Boolean Dim strModuleName As String, intPosition As Integer Dim intLength As Integer Dim mdl As Module ' memorarea numelui de fiier ntr-o variabil strModuleName = strFileName ' eliminarea cii din numele fiierului Do ' gsirea caracterului \ intPosition = InStr(strModuleName, "\") If intPosition = 0 Then Exit Do Else intLength = Len(strModuleName) ' eliminare cale din ir strModuleName = Right (strModuleName, Abs(intLength intPosition)) End If Loop ' eliminarea extensiei intPosition = InStr(strModuleName, ".") If intPosition > 0 Then intLength = Len(strModuleName) strModuleName = Left(strModuleName, intPosition 1) End If ' Crearea modulului nou RunCommand acCmdNewObjectModule ' salvarea modulului DoCmd.Save , strModuleName ' returnarea referin ei la obiectul Module Set mdl = Modules(strModuleName) ' adugarea fiierului text mdl.AddFromFile strFileName ' salvarea modulului modificat DoCmd.Save End Function Observa ie. Dac execu ia procedurii n linia care execut prima salvare a modulului are loc n modul pas cu pas, atunci focusul este n modulul de unde se execut codul i nu n modulul nou creat. n acest fel, Visual Basic va ncerca, mai degrab, salvarea modulului cu focusul i nu a modulului nou creat.

149

Evenimentele unui modul clas Modulele de clas, care nu sunt asociate cu o form sau un raport, au dou evenimente: Initialize i Terminate. Evenimentul Initialize se declaneaz la crearea unei noi instan e a obiectului. Terminate apare atunci cnd se elimin un obiect utilizator din memorie. Pentru a crea procedurile de rspuns la evenimente, se deschide modulul clas, se selecteaz Class n boxa Object i se alege Initialize sau Terminate n lista Procedure. Evenimentele pot fi utilizate, de exemplu, pentru a ini ializa o variabil la nivel de modul o dat cu crearea obiectului. Colec ia References Un obiect Reference reprezint o referin din Microsoft Access la alt proiect sau la o bibliotec de obiecte. Obiectele Reference sunt con inute n colec ia References, fiecare element din colec ie corespunznd unei referin e selectate n dialogul References (meniul Tools). Colec ia References i obiectele Reference pot fi utilizate din Visual Basic pentru a aduga referin e, pentru a verifica referin ele existente sau pentru a anula referin ele care nu mai sunt necesare. Obiectul sau colec ia Reference (obiect) References (colec ie) Referirea obiectelor Reference Un obiect Reference este accesat prin intermediul colec iei References. Un obiect referit poate fi atribuit unei variabile obiect n mod uzual: Dim ref As Reference Set ref = References!VBA Set ref = References("VBA") Set ref = References(1) ' de remarcat c numerotarea ' colec iei References ncepe cu 1 Propriet ile obiectului Reference Tabelul urmtor prezint pe scurt propriet ile obiectului Reference. Proprietatea BuiltIn Collection FullPath Descriere Indic dac referin a este implicit, necesar bunei func ionri a aplica iei Microsoft Access. Returneaz o referin la colec ia References. Returneaz calea i numele de fiier al proiectului referit sau al bibliotecii de obiecte. Este con inut() n References Application Con ine (nimic) Obiecte Reference

150

GUID IsBroken Kind Major Minor Name

Returneaz identificatorul global unic (GUID Globally Unique Identifier) al proiectului referit sau al bibliotecii de obiecte. Un GUID este memorat n registry-ul Windows. Indic dac referin a puncteaz ctre o referin valid. Indic dac obiectul Reference puncteaz la un proiect Visual Basic (valoarea Project sau 1) sau la o bibliotec (TypeLib sau 0). Returneaz valoarea din stnga punctului zecimal din numrul de versiune al fiierului referit. Returneaz valoarea din dreapta punctului zecimal din numrul de versiune al fiierului referit. Returneaz numele proiectului sau al bibliotecii de obiecte ctre care duce referin a.

Metodele colec iei References Obiectul Reference nu are asociate metode. Metodele colec iei References sunt Metoda AddFromFile AddFromGUID Descriere Creeaz o referin la un fiier care con ine un proiect sau o bibliotec de obiecte. References.AddFromFile(filename) Creeaz o referin la un proiect sau bibliotec de obiecte pornind de GUID-ul fiierului, memorat n registry. Object.AddFromGUID(guid) Returneaz un element particular al colec iei References. Elimin un obiecte Reference din colec ia References.

Item Remove

Stabilirea unei referin e n Visual Basic Primele dou metode enumerate n tabelul precedent, AddFromFile i AddFromGUID, permit stabilirea unei referin e n mod programatic. Urmtorul exemplu creeaz o referin n timpul execu iei. Function AddReference (strFilePath As String) As Boolean Dim ref As Reference Const conReferenceExists As Long = 32813 On Error GoTo Error_AddReference ' Adaug o referin la un proiect sau bibliotec de obiecte Set ref = References.AddFromFile(strFilePath) AddReference = True Exit_AddReference: Exit Function Error_AddReference: If Err <> conReferenceExists Then MsgBox Err & ": " & Err.Description End If AddReference = False

151

Resume Exit_AddReference End Function Apelul acestei func ii poate fi efectuat dup modelul Sub SetSolutionsReferences () Const strRefPath As String = "C:\Program Files\Microsoft Office" _ & "\Office\Samples\Solutions.mdb" If AddReference (strRefPath) = True Then MsgBox "Reference set successfully." Else MsgBox "Reference not set successfully." End If End Sub Obiectul DoCmd Metodele obiectului DoCmd sunt utilizate pentru a executa ac iuni (macro-uri) Microsoft Access din Visual Basic. De altfel, aceasta este singura utilitate a obiectului DoCmd, acesta neavnd propriet i i evenimente. Sintaxa este [application.]DoCmd.method [arg1, arg2, ...] unde application este obiectul Application, op ional method este una dintre metodele suportate de obiect arg1, arg2, ... sunt argumentele metodei selectate. Omiterea argumentelor care sunt op ionale este echivalent cu acceptarea valorilor implicite ale acestora. Obiectul DoCmd nu suport metode care corespund cu ac iunile AddMenu. MsgBox. Se utilizeaz func ia MsgBox. RunApp. Se utilizeaz func ia Shell pentru a executa alt aplica ie. RunCode. Se execut func ia direct n Visual Basic (instruc iunea Call). SendKeys. Se utilizeaz instruc iunea SendKeys. SetValue. Se stabilete valoarea direct n Visual Basic (instruc iunea Let). StopAllMacros. Se utilizeaz instruc iunile Stop sau End. StopMacro. Se utilizeaz instruc iunile Exit Sub sau Exit Function.

Important! Pentru o list complet a ac iunilor, care coincide, excepnd cele enumerate, cu lista metodelor obiectului, se va urma: Help DoCmd Object Action Constants (lista alfabetic a ac iunilor) sau actions, reference topics (ac iuni grupate pe categorii). Pentru explica ii complementare se va urmri att subiectul privind metoda ct i subiectul privind ac iunea sinonim. Pentru exemplificare prezentm dou metode ale obiectului DoCmd.

152

Metoda OpenForm Se execut din Visual Basic ac iunea OpenForm. Sintaxa este DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode] [, windowmode][, openargs] unde formname este un ir cu numele valid al unei forme din baza de date curent. Dac se execut codul nre-o bibliotec, forma se va cuta mai nti n baza de date bibliotec i apoi n baza curent. view este modul de vizualizare Access i poate avea una din valorile: acDesign, acFormDS, acNormal (default), acPreview. Valoarea implicit deschide forma n Form view. filtername este un ir care con ine numele valid al unei interogri din baza de date curent. wherecondition este un ir care con ine o clauz valid WHERE SQL, fr cuvntul WHERE. datamode este una dintre constantele: acFormAdd, acFormEdit, acFormPropertySettings (default), acFormReadOnly. Argumentul fixeaz modul de acces la date (adugare, editare etc.). Argumentele acoper propriet ile AllowEdits, AllowDeletions, AllowAdditions i DataEntry ale formei, propriet ile sunt considerate n modul implicit (acFormPropertySettings). windowmode stabilete modul de afiare a ferestrei formei. Poate fi o constant: acDialog (propriet ile Modal i PopUp ale formei sunt Yes), acHidden (forma este ascuns), acIcon (forma este minimizat), acWindowNormal (valoarea implicit, forma este afiat potrivit propriet ilor sale). openargs este un ir utilizat pentru stabilirea propriet ii OpenArgs a formei. Aceast valoare poate fi utilizat ulterior de cod (de exemplu ntr-o procedur eveniment). Argumentul este valabil doar n Visual Basic (nu exist pentru ac iunea sinonim Access). Metoda RunCommand Prin aceast metod, aplicabil obiectului Application sau DoCmd, se execut o comand dintr-un meniu predefinit sau dintr-o bar de unelte. Sintaxa este [object.]RunCommand command unde object este Application sau DoCmd, op ional. command este o constant intrinsec specificnd comanda care se execut. Lista tuturor constantelor admise ca argument de comand se poate vedea n Help (intrarea RunCommand Method Constants) sau n Object Browser (Access n lista Project/Library, AcCommand n lista Classes). Meniurile i barele de unelte construite de utilizator nu pot fi accesate prin metoda RunCommand.

153

Obiectul Screen Obiectul Screen se refer la forma, raportul, foaia de date (datasheet) sau controlul care are focusul. Acest obiect se poate utiliza pentru a lucra cu un obiect particular de pe ecran. De exemplu, se poate utiliza proprietatea ActiveForm pentru a returna o referin la forma din fereastra activ, fr a ti numele formei. Obiectul Screen nu poate fi utilizat pentru activarea formei, raportului sau controlului. Acest efect se ob ine prin metoda SelectObject a obiectului DoCmd. Referirea la Screen atunci cnd nu exist nici o form activ, raport sau control, produce o eroare de execu ie. Propriet ile obiectului Screen Tabelul urmtor con ine propriet ile obiectului Screen. Proprietatea ActiveControl ActiveDatasheet ActiveForm ActiveReport Application MousePointer Parent PreviousControl Tipul de pointer poate fi: Valoare 0 1 3 7 9 11 Explica ie (Default) Forma pointerului este determinat de Microsoft Access Normal Select (Arrow) Text Select (I-Beam) Vertical Resize (Size N, S) Horizontal Resize (Size E, W) Busy (Hourglass) Descriere Returneaz o referin la controlul care are focusul. Returneaz o referin la foaia de date care are focusul. Returneaz o referin la forma care are focusul. Returneaz o referin la raportul care are focusul Returneaz o referin la obiectul Application. Stabilete sau ntoarce valoarea tipului de pointer al mouse-ului. Returneaz o referin la obiectul care con ine obiectul Screen. Returneaz o referin la controlul care a avut anterior focusul.

Potrivit celor spuse anterior, utilizarea obiectului Screen trebuie s implementeze i tratarea erorilor deoarece dac obiectul ateptat nu are focusul, atunci se produce o eroare. Este de preferat s se utilizeze mai nti metoda SetFocus pentru a focaliza obiectul dorit i apoi s se utilizeze Screen. Metoda SetFocus este cea asociat formei, raportului,

154

controlului int. Este interzis utilizarea obiectului Screen cu metoda OutputTo (care produce ieirea unor date pe o form, raport etc.) a obiectului DoCmd. Este de notat c proprietatea ActiveForm i proprietatea Me nu produc n mod necesar aceeai referin . Me reprezint forma n care se execut curent codul, pe cnd ActiveForm returneaz forma activ pe ecran i care poate fi diferit de cea n care se execut n acel moment cod Visual Basic. De exemplu, un eveniment Timer poate s apar pe o form care nu este activ. n acest caz Me este utilizat pentru a referi forma pe care se produce evenimentul Timer iar ActiveForm se refer la forma activ pe ecran cnd se produce evenimentul Timer. Urmtorul exemplu utilizeaz evenimentul Timer pentru a interoga forma activ la intervale regulate de timp. Forma n care se declaneaz evenimentul poate fi sau nu forma activ. Private Sub Form_Load () Me.TimerInterval = 30000 End Sub Private Sub Form_Timer () Const conFormNotActive As Integer = 2475 Const conFormInDesignView As Integer = 2478 On Error GoTo Error_Timer ' reconsult sursa de date pentru forma activ Screen.ActiveForm.Requery Exit_Timer: Exit Sub Error_Timer: If Err = conFormNotActive Or Err = conFormInDesignView Then Resume Exit_Timer Else MsgBox Err & ": " & Err.Description End If End Sub Observa ie. Intervalul de timp, din proprietatea TimerInterval este n milisecunde, instruc iunea Me.TimerInterval = 30000 stabilete prin urmare declanarea evenimentului la fiecare 30 de secunde. Stabilirea intervalului se efectueaz n procedura evenimentului Load. DAO (Data Access Objects) Biblioteca de tipuri Microsoft DAO ofer o cale de control a unei baze de date din orice aplica ie care suport Visual Basic for Applications. Anumite obiecte DAO reprezint structura bazei de date iar altele reprezint datele nsi. Prin intermediul obiectelor DAO se pot crea i gestiona baze de date locale sau la distan ntr-o multitudine de formate, se poate lucra cu datele lor. n acest capitol se explic cum se pot programa obiectele DAO din aplica iile Microsoft Office. Lucrul cu obiectele DAO Obiectele DAO se utilizeaz pentru a lucra n mod programatic cu o baz de date. Principalele ac iuni privesc: crearea unei baze de date, modificarea structurii tabelelor, interogrilor, indexrilor i rela iilor,

155

regsirea, adugarea, tergerea sau modificarea datelor din baz, implementarea securit ii datelor, lucrul cu date n diferite formate de fiiere i legarea tabelelor din alte baze de date la baza curent, conectarea la baze de date pe servere la distan i construirea de aplica ii client/server.

Observa ie. Pentru a utiliza obiectele DAO, trebuie ca la instalarea pachetului Microsoft Office s se selecteze i boxa de control Data Access. Obiectele DAO sunt organizate ntr-o structur ierarhic. Obiectul DBEngine este de nivelul cel mai nalt i con ine toate celelalte obiecte i colec ii ale ierarhiei DAO. Urmtorul tabel con ine o descriere sumar a obiectelor. Obiect Connection Container Database DBEngine Document Error Field Group Index Parameter Property QueryDef Recordset Relation TableDef User Workspace Descriere Conectarea prin re ea la o baz de date Open Database Connectivity (ODBC). Informa ii de securitate pentru diferite tipuri de obiecte ale bazei de date. Baza de date deschis. Obiectul cel mai de sus al ierarhiei. Informa ia de securitate pentru obiecte individuale din baza de date. Informa ii de eroare privind accesul la date. Cmp n obiecte TableDef, QueryDef, Recordset, Index, Relation. Contul grupului n baza curent. Indexul tabelei. Parametru de interogare. Proprietate a unui obiect. Defini ia unei interogri salvate n baza de date. Mul ime de nregistrri definite de o tabel sau de o interogare. Legtura (rela ia) dintre dou cmpuri de tabel sau interogri. Defini ia unei tabele salvate n baza de date Contul utilizatorului n grupul de lucru curent. Sesiunea DAO activ.

Proiectarea bazelor de date n Microsoft Access Dei se pot crea baze de date prin VB cu DAO, uneori, pentru baze de date cu oarecare grad de permanen , se poate alege varianta de a proiecta baza de date n mediul Access destinat pentru asemenea opera iuni i

156

deschiderea bazei cu DAO din alt aplica ie care suport Visual Basic.

La crearea unei baze de date n Access, urmtoarele lucruri sunt de re inut. o Cnd se deschide un fiier .mdb creat n Access din alt aplica ie, nu se poate lucra cu forme, rapoarte, macro-uri sau module Access. Formele i rapoartele trebuiesc proiectate, deasemenea i codul VB, n aplica ia unde se lucreaz. Dac se scrie cod pentru procesarea unei baze de date n Access, codul respectiv nu se va executa n mod necesar i la copierea n modulele altei aplica ii. Pentru execu ie trebuie, n acest caz, s se elimine/nlocuiasc toate entit ile specifice Access-ului (obiecte, metode, propriet i sau func ii). n Access se utilizeaz func ia CurrentDb pentru a returna o referin la baza de date curent deschis n fereastra Access. Se poate utiliza DAO pentru a lucra cu aceast baz. Dac se copie acest cod n alt aplica ie care are Visual Basic, se va modifica textul surs nct s se utilizeze metoda OpenDatabase a obiectului Workspace. Microsoft Access creeaz propriet i suplimentare ale obiectelor DAO. Atunci cnd se formeaz o baz cu DAO n Visual Basic i aceast baz este deschis ulterior n microsoft Access, se pot observa i alte propriet i adugate obiectelor. Aceste propriet i sunt i ele enumerate n colec ia Properties a obiectului DAO.

Stabilirea unei referin e la biblioteca de obiecte DAO Referin a se poate realiza n mod automat, de exemplu de ctre Microsoft Access, sau manual prin succesiunea uzual: Visual Basic Editor meniul Tools References selectare Microsoft DAO 3.5 Object Library. Dup stabilirea referin ei se pot vedea obiectele DAO n Object Browser 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 complet pentru a vedea dac este nevoie de referirea bilbiotecii de compatibilitate este compilarea codului sub DAO 3.5. Dac nu exist erori rezult c nu este necesar biblioteca de compatibilitate. Referirea obiectelor DAO n Visual Basic Obiectele DAO pot fi referite n cod n acelai mod ca orice alt obiect. Deoarece obiectul DBEngine nu are o colec ie, poate fi referit direct. Celelalte obiecte se vor referi n cadrul colec iilor unde apar in i potrivit locului din ierarhia deobiecte. Fiecare obiect poate fi referit ntr-o colec ie prin valoarea propriet ii Name a obiectului respectiv sau prin numrul de ordine din colec ie. Obiectele DAO sunt indexate plecnd cu 0.

Exemple: Databases("Salariati") Databases(0) Referirea unui obiect Database n cod se realizeaz i prin pozi ionarea n ierarhie: Dim dbs As Database Set dbs = DBEngine.Workspaces(0).Databases(0)

157

prin care se ob ine o referin la prima baz de date (indicele 0 din colec ia Databases) din prima zona de lucru (indicele 0 din colec ia Workspaces), zona implicit. De notat c dac se lucreaz ntr-o aplica ie diferit de Access, atunci trebuie s se deschid o baz de date cu metoda OpenDatabase mai nainte de a rula codul precedent. Pentru aplica iile diferite de Access, calificarea obiectelor poate produce mai mult claritate, plus certitudinea referii corecte: Dim dbs As DAO.Database Adugarea de noi obiecte DAO la o colec ie Dup cum s-a precizat deja, anumite obiecte DAO reprezint structura bazei de date, celelalte oferind mijloace de lucru cu datele din baz. Obiectele care reprezint structura bazei sunt salvate o dat cu baza. n general, obiectele utilizate n lucrul cu datele din baz nu sunt salvate ci sunt create de fiecare dat 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 colec iei asociate de obiecte salvate. Exemplul urmtor d o imagine despre acest proces. Exmplul creeaz un nou obiect TableDef (care reprezint o nou tabel) cu un nou obiect Field (care reprezint un cmp din noua tabel). Obiectul Field creat se adaug la colec ia Fields a noii tabele iar noul obiect TableDef este adugat la colec ia TableDefs a obiectului Database care reprezint baza de date deschis. Function AddTable () As Boolean ' declara ii Dim dbs As Database, tdf As TableDef, fld As Field Const conPath As String = "C:\ \Northwind.mdb" On Error GoTo Err_AddTable ' asignarea bazei curente la variabila database Set dbs = DAO.DBEngine.Workspaces(0).OpenDatabase(conPath) ' crearea noii tabele Set tdf = dbs.CreateTableDef("ArchivedInvoices") Set fld = tdf.CreateField("OrderId", dbLong) ' adugarea la colec iile adecvate, care se salveaz tdf.Fields.Append fld dbs.TableDefs.Append tdf dbs.Close AddTable = True Exit_AddTable: Exit Function Err_AddTable: MsgBox "Error " & Err & ": " & Err.Description AddTable = False Resume Exit_AddTable End Function Observa ie. n Access se va utiliza CurrentDb pentru a returna o referin la baza de date curent deschis.

158

Lucrul cu date externe Se poate utiliza DAO pentru lucrul cu diferite formate de baze de date. Exist trei mari categorii de formate de baze de date accesibile prin DAO. Prima categorie este caracterizat de formatul Microsoft Jet. Se poate utiliza DAO cu toate bazele de date create cu Microsoft Jet, incluznd cele create n Microsoft Access, Microsoft Visual Basic, Microsoft Visual C++ i Microsoft Excel. A doua categorie este caracterizat de formatul ISAM instalabil. Un driver ISAM care se poate instala este un driver care ofer acces la formate de baze de date externe prin DAO i Microsoft Jet. La instalarea aplica iei se poate cere instalarea oricrui driver pentru formatele: Microsoft FoxPro dBase Paradox Microsoft Excel Microsoft Exchange/Outlook Lotus 1-2-3 Date tabelare n fiiere HTML etc.

A treia categorie de formate de baze de date accesibile prin DAO este sursa de date Open Database Connectivity (ODBC). Sursele de date ODBC, cum ar fi Microsoft SQL Server 4.2 i mai mari, necesit un driver ODBC. Adesea o surs de baze ODBC este pe un server de re ea, adic ODBC este util pentru dezvoltarea aplica iilor client/server. Urmtoarea sec iune trateaz subiectul mai pe larg. Utilizare DAO cu surse de date ODBC Exist dou moduri diferite de utilizare DAO cu ODBC: prin Microsoft Jet, sau prin noua tehnologie numit ODBCDirect. Dac se lucreaz cu o baza de date creat cu Microsoft Jet database engine sau ntr-un format extern suportat de un driver instalabil ISAM, toate opera iunile DAO sunt procesate prin Microsoft Jet. Dac se lucreaz cu o surs de date ODBC, opera iunile DAO se pot procesa fie prin Microsoft Jet, fie prin ODBCDirect care ocolete motorul Microsoft Jet i lucreaz direct cu datele n sursa ODBC. Alegerea este n func ie de tipul de opera iuni efectuate. Se poate utiliza DAO cu Microsoft Jet, pentru surse ODC, atunci 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 execut interogri sau proceduri memorate pe un server back_end cum ar fi Microsoft SQL Server, sau cnd aplica ia client unde se lucreaz necesit capacit ile specifice ODBC cum ar fi actualizri n loturi sau interogri asincrone. ODBC poate efectua anumite opera iuni client/server mult mai repede. Deoarece nu toate posibilit ile DAO sunt accesibile cu ODBCDirect, Microsoft DAO mai suport nc ODBC prin Microsoft Jet. Se poate astfel utiliza ODBC prin Microsoft Jet, prin ODBCDirect, sau prin ambele cu o singur surs de date ODBC. Metoda care este utilizat n accesarea unei surse ODBC este determinat de tipul spa iului de lucru n care se lucreaz. Un spa iu de lucru, reprezentat printr-un obiect Workspace, este o sesiune deschis pentru un cont utilizator particular. O sesiune marcheaz o succesiune de opera ii efectuate de motorul de baze de date, ncepe cu intrarea (log on)

159

utilizatorului i se termin la ieirea utilizatorului (log off). Opera iunile pe care un utilizator le poate executa n timpul unei sesiuni sunt determinate de drepturile conferite acelui utilizator. Dac nu se specific tipul spa iului de lucru, DAO creeaz un spa iu n mod implicit. Cu DAO 3.5 se poate crea oricare dintre cele dou spa ii de lucru pentru opera ii ODBC. n spa iul Microsoft Jet se utilizeaz accesul prin Jet, n spa iul ODBCDirect se va utiliza cealalt posibilitate. Fiecare spa iu de lucru are propriul model de obiecte i vor fi prezentate n continuarea capitolului. Utilizare DAO cu Microsoft Jet Spa iile de lucru Microsoft Jet includ obiecte pentru definirea structurii bazei de date, cum ar fi TableDef, QueryDef, Field, Index, Parameter i Relation. Alte obiecte, cum ar fi Recordset, sunt utile pentru procesarea datelor din baz. O a treia categorie de obiecte, cum ar fi User, Group, Container i Document, servesc pentru asigurarea securit ii datelor. Pentru a vedea ntreaga ierarhie de obiecte pentru spa iul de lucru Microsoft Jet se va selecta Help (Microsoft Access Programming and Language References) Microsoft Data Access Objects (DAO) "Data Access Object Model for Microsoft Jet Workspaces". In schema urmtoare este prezentat doar partea superioar a ierarhiei. La prezentarea fiecrui obiect se vor aduce unele explica ii suplimentare. Se observ c obiectul de nivel cel mai nalt, DBEngine, nu apar ine unei colec ii, deci poate fi referit direct. Toate celelalte obiecte sunt referite prin colec ia la care apar in. Sge ile fr obiect terminal puncteaz ctre structuri nereprezentate n figur. Obiectul DBEngine Obiectul DBEngine, de nivel maxim n ierarhia de obiecte DAO, este obiectul implicit al modelului, astfel nct men ionarea lui explicit poate fi omis n multe situa ii. Pe nivelul imediat inferior al ierarhiei se gsesc dou colec ii: Workspaces spa iile de lucru, Errors erorile aprute n timpul unei opera iuni DAO. Colec ia Workspaces este implicit i referin a la ea poate fi omis. O referin la primul obiect Workspace din colec ia Workspaces poate fi ob inut prin una din instruc iunile Set wrk = DBEngine.Workspaces (0) Set wrk = DBEngine (0) Set wrk = Workspaces (0) n care se observ prezen a op ional a obiectelor implicite. Propriet ile obiectului DBEngine sunt prezentate n tabelul urmtor. Proprietatea DefaultType Descriere Long, determin tipul spa iului de lucru: dbUseJet Microsoft Jet database engine dbUseODBC ODBC data source iruri, numele utilizatorului i parola

DefaultUser, DefaultPassword

160

IniPath LoginTimeout SystemDB Version

ir, informa ia despre cheia din Windows Registry care con ine valorile pentru Microsoft Jet database engine (numai spa iile de lucru Microsoft Jet). ntreg, timpul ct se ateapt intrarea unu utilizator. ir, calea pentru localizarea curent a fiierului cu informa ia despre grupurile de lucru, workgroup (doar spa ii Microsoft Jet). ir, informa ii despre versiunea DAO.

Dac nu se creeaz un obiect Workspace specific, un asemenea obiect este creat n mod automat de DAO atunci cnd este necesar. Atributele implicite ale acestui spa iul sunt DefaultUser egal cu Admin iar DefaultPassword egal cu irul vid "". n mod implicit, proprietatea DefaultType are valoarea dbUseJet i spa iul de lucru este Microsoft Jet. Proprietatea poate fi acoperit pentru un spa iu particular prin tipul precizat la crearea acestuia. Metodele obiectului DBEngine sunt Metoda BeginTrans, CommitTrans, Rollback CompactDatabase, RepairDatabase CreateDatabase, CreateWorkspace Idle OpenConnection, OpenDatabase RegisterDatabase SetOption Descriere Metodele care controleaz efectuarea tranzac iilor.

Compactarea bazei de date, refacerea unei baze deteriorate. Crearea unei baze de date sau a unui spa iu de lucru. Suspend procesarea datelor din baz Deschide i returneaz o referin la un obiect Connection, respectiv Database. Completeaz n Windows Registry informa ia ODBC. nlocuiete temporar valorile din Windows Registry pentru spa iile Microsoft Jet

Unele metode sunt prezentate n continuare. Pentru mai multe informa ii despre func iuni i parametri se vor vedea intrrile respective din DAO Help. Colec ia Workspaces Obiectul DAO Workspace definete o sesiune pentru un utilizator, bazat pe permisiunile (drepturile) utilizatorului. Se utilizeaz obiectul Workspace pentru a gestiona sesiunea curent. Workspace con ine bazele de date deschise i ofer mecanismul necesar tranzac iilor i securit ii aplica iei. Colec ia Workspaces con ine toate obiectele active Workspace din DBEngine, care au fost adugate colec iei. La nceputul lucrului cu obiecte DAO din Visual Basic, DAO creeaz n mod automat un spa iu implicit. Referirea la acesta se realizeaz prin

161

Dim wrk As Workspace Set wrk = Workspaces (0) adic se refer primul obiect din colec ie. Spa iile de lucru DAO pot fi partajate sau ascunse. Un spa iu este ascuns pn cnd utilizatorul l marcheaz drept partajat prin adugarea obiectului Workspace la colec ia Workspaces. Dup adugare, spa iul este accesat prin intermediul colec iei. Un obiect Workspace necesar doar pentru o procedur particular se poate crea dar fr adugarea la colec ia Workspaces. Dup cum s-a mai spus, exist dou tipuri de obiecte Workspace: Microsoft Jet i ODBCDirect. n Microsoft Jet se poate utiliza DAO cu motorul de baze de date Microsoft Jet pentru a accesa date din baze de date Microsoft Jet, surse de date ISAM instalabile i surse de date ODBC. ntr-un spa iu ODBCDirect, se poate utiliza DAO pentru a accesa date din surse ODBC fr a trece prin motorul Jet. ntr-o aceeai aplica ie se poate lucra cu ambele tipuri de spa ii de lucru. Crearea unui spa iu Microsoft Jet Se utilizeaz metoda CreateWorkspace a obiectului DBEngine. Exemplul urmtor utilizeaz constanta de tip dbUseJet. Dac proprietatea DefaultType este fixat pe dbUseJet, atunci argumentul de tip nu este necesar i se creeaz n mod automat un spa iu Microsoft Jet. Dim wrk As Workspace Set wrk = CreateWorkspace("JetWorkSpace", "Admin", "", dbUseJet) noul spa iu fiind pentru utilizatorul Admin i fr parol. Noul spa iu de lucru nu este adugat n mod automat la colec ia Workspaces, pentru aceasta se va utiliza metoda Append a colec iei. Acest lucru este necesar atunci cnd spa iul nou definit este utilizat i n afara procedurii unde a fost creat. Metoda CreateWorkspace (obiectul DBEngine) Sintaxa Set workspace = CreateWorkspace(name, user, password, type) unde workspace este o variabil obiect care reprezint obiectul Workspace care se creeaz. name este irul care con ine numele unic al obiectului. ncepe cu o liter, are lungimea maxim 20. user identific proprietarul noului obiect Workspace. password con ine parola pentru noul obiect Workspace, un ir pn la 14 caractere cu excep ia lui null. type este op ional i stabilete tipul spa iului (dbUseJet, dbUseODBC) Dup utilizarea metodei este creat obiectul Workspace, ncepe o nou sesiune i obiectul poate fi referit n cod. Obiectele Workspace nu sunt permanente, nu se pot salva iar proprietatea Name nu mai poate fi modificat dup trecerea obiectului n colec ia Workspaces.

162

Dac tipul este stabilit la dbUseODBC i nu exist deja create spa ii Jet, atunci motorul Jet nu este ncrcat n memorie i toat activitatea se efectueaz cu sursa de date ODBC identificat n obiectul Connection. Pentru a elimina un obiect Workspace din colec ia Workspaces, se nchid toate bazele de date i conexiunile i apoi se utilizeaz metoda Close a obiectului Workspace. Colec ia Errors (obiectul DBEngine) Un obiect Error con ine informa ia despre o eroare aprut n timpul unei opera iuni DAO. Apari ia mai multor erori n aceeai opera iune se reflect n obiecte Error distincte, mul imea acestora formnd colec ie Errors. Atunci cnd o nou opera iune genereaz o eroare, colec ie Errors este golit i completat cu noile erori. Opera iunile DAO care nu genereaz erori nu au efect asupra colec iei Errors. Erorile sunt indexate n colec ie n ordinea cresctoare a nivelelor de eroare. Nivelul cel mai nalt (deci ultimul obiect din colec ie) este eroare raportat de VBA, identic cu eroarea raportat de obiectul VBA Err. Colec ia Errors are: proprietatea Count, care d numrul elementelor din colec ie metoda Refresh, care actualizeaz colec ia potrivit situa iei curente.

Obiectul Error nu are dect propriet ile (nu con ine metode sau colec ii) Description, irul care con ine descrierea erorii HelpContext, este un Long cu identificatorul de context din fiierul Help asociat HelpFile, con ine calea complet ctre fiierul Help Number, numrul (Long) al erorii. Pentru o list complet se va vedea intrarea Trappable Microsoft Jet and DAO Errors din Help. Source, un ir con innd numele obiectului sau aplica iei care a generat eroarea.

Colec ia Databases Obiectul Database reprezint o baz de date deschis. Aceast poate fi o baz Jet sau o surs extern de date. Colec ia Databases con ine toate bazele de date deschise curent. Situarea n ierarhie este Obiectul sau colec ia Database (obiect) Este con inut n Colec ia Databases Con ine Colec ia Containers Colec ia QueryDefs Colec ia Properties Colec ia Recordsets Colec ia Relations Colec ia TableDefs Obiecte Database

Databases (colec ie) Deschiderea unei baze de date

Obiectul Workspace

Metoda OpenDatabase, a obiectului DBEngine sau a obiectului Workspace, deschide o baz de date i returneaz o referin la obiectul care o reprezint. Utilizarea metodei cu obiectul DBEngine deschide baza de date n spa iul de lucru implicit, ca n exemplul urmtor

163

Function RetrieveRecordset (strDbName As String, strSource As String ) As Boolean Dim dbs As Database Dim rst As Recordset On Error GoTo Err_RetrieveRecordset Set dbs = OpenDatabase (strDbName) Set rst = dbs.OpenRecordset(strSource, dbOpenDynaset) ' se prelucreaz nregistrrile din recordset RetrieveRecordset = True Exit_RetrieveRecordset: rst.Close dbs.Close Exit Function Err_RetriveRecordset: MsgBox "Eroare " & Err & ": " & Err.Description RetrieveRecordset = False Resume Exit_RetriveRecordset End Function n Microsoft Access, se utilizeaz func ia CurrentDb pentru a returna o referin la baza de date curent. Metoda OpenDatabase se utilizeaz pentru deschiderea altei baze de date dect cea curent deschis sau pentru a deschide baze n spa iul de lucru ODBCDirect. Dim dbs As Database Set dbs = CurrentDb Debug.Print dbs.Name Crearea cu DAO a duplicatelor unei baze de date (database replicas) Diferite necesit i de arhivare sau de lucru n re ea impun crearea i gestionarea unor copii ale unei baze de date. Una dintre copii este desemnat drept Design Master, celelalte copii find denumite duplicate sau replici. Replicile pot fi men inute pe aceeai main sau pe maini diferite. Adugarea, modificarea sau tergerea obiectelor se poate efectua doar n Design Master. Datele pot fi modificate n Design Master i n orice replic a bazei de date. Atunci cnd un utilizator modific date dintr-o baz duplicat, utilizatorii celorlalte replici pot s-i sincronizeze replicile, astfel nct aceleai date s fie n toate copiile. Se poate utiliza DAO pentru a face o baz replicabil, pentru a crea replici, le sincroniza i gestiona mul imea replicilor. Se pot crea, de asemenea, replici par iale care con in doar o submul ime de nregistrri dintr-o replic total. Utilizarea replicilor par iale permite sincronizarea unei replici doar cu datele necesare i nu cu ntreaga baz de date. Pentru ca o baz de date s admit replici trebuie s se fixeze proprietatea Replicable sau proprietatea ReplicableBool a obiectului Database corespunztor. Aceste propriet i nu exist pentru obiectul Database pn cnd nu sunt create prin metoda CreateProperty i adugate la colec ia Properties. Dup permiterea replicrilor, crearea unei baze duplicat se realizeaz prin metoda MakeReplica. Diferen a dintre propriet ile Replicable i ReplicableBool este de valori: prima are o valoare ir, a doua o valoare logic. Urmtorul exemplu creeaz manual o copie a bazei de date, o face replicabil i creeaz o replic a bazei.

164

Function ReplicateDatabase (strDBName As String) As Boolean Dim dbs As Database, prp As Property Dim strBackup As String, strReplica As String Const conPropNotFound As Integer = 3270 On Error GoTo Err_ReplicateDatabase If InStr(strDBName, ".mdb") > 0 Then strBackup = Left(strDBName, Len(strDBName) - 4) Else strBackup = strDBName End If strReplica =strBackup & "Replica" & ".mdb" If MsgBox("Make backup copy of file?", vbOKCancel) = vbOK Then strBackup = strBackup & ".bak" FileCopy strDBName, strBackup MsgBox "Copied file to " & "strBackup" End If Set dbs = OpenDatabase (strDBName, True) dbs.Properties("ReplicaBool") = True dbs.MakeReplica strReplica, "Replica of " & strDBName MsgBox "Created replica '" & strReplica & "'." dbs.Close ReplicateDatabase = True Exit_ReplicateDatabase: Exit Function Err_ ReplicateDatabase: If Err = conPropNotFound Then Set prp = dbs.CreateProperty("ReplicableBool", dbBoolean, True) dbs.Properties.Append prp Resume Next Else MsgBox "Error " & ": " & Err.Description End If ReplicateDatabase = False Resume Exit_ReplicateDatabase End Function Colec ia TableDefs Un obiect TableDef reprezint defini ia memorat a unei tabele din baz sau a unei tabele legate din spa iul de lucru Microsoft Jet. Toate obiectele TableDef memorate ntr-o baz de date formeaz colec ia TableDefs. Rela iile din ierarhie sunt Obiectul sau colec ia TableDef (obiect) Este con inut n Colec ia TableDefs Con ine Colec ia Fields Colec ia Indexes Colec ia Properties Obiecte TableDef

TableDefs (colec ie)

Obiectul Database

165

Crearea prin cod a unei tabele Metoda de creare este CreateTableDef a obiectului Database. Dup crearea unui nou obiect TableDef, dar nainte de adugarea la baz, trebuie s se defineasc unul sau mai multe cmpuri pentru tabela definit. Sintaxa metodei CreateTableDef este Set tabledef = database.CreateTableDef (name, attributes, source, connect) unde tabledef este o variabil obiect reprezentnd obiectul TableDef care se creeaz.

database este o variabil obiect reprezentnd obiectul Database unde se dorete crearea noului obiect. name este un ir op ional, care con ine denumirea tabelei. attributes este o constant sau o combina ie de constante indicnd caracteristici ale tabelei. Lista este n Help - TableDef object - Attributes Property. source este un Variant (subtip String), op ional. Con ine numele tabelei n baza de date extern care este sursa datelor. irul devine proprietatea SourceTableName a noului obiect. connect, un Variant (subtip String), op ional. Con ine informa ia despre sursa unei baze deschise, o baz de date utilizat ntr-o interogare pass-through, sau o tabel legat. La proprietatea Connect se pot gsi mai multe informa ii. Argumentele care se omit la crearea tabelei se vor asigna prin propriet i nainte de adugarea obiectului la colec ie. Dup aceea nu mai sunt disponibile toate propriet ile. Pentru eliminarea unui obiect TableDef se utilizeaz metoda Delete a colec iei TableDefs. Urmtorul exemplu realizeaz crearea unei tabele pentru baza de test Northwind. Function CreateErrorsTable () As Boolean Dim dbs As Database, tdf As TableDef, fld As Field, idx As Index Dim rst As Recordset, intCode As Integer, strErr As String Const conAppObjErr = "Application-defined or object-defined error" ' creeaz tabela Errors cu cmpurile ErrorCode i ErrorString Set dbs = CurrentDb On Error Resume Next ' tergerea unei tabele Errors existente dbs.TableDefs.Delete "Errors" On Error GoTo Error_CreateErrorsTable ' crearea tabelei Set tdf = dbs.CreateTableDef("Errors") ' creare cmpuri Set fld = tdf.CreateField("ErrorCode", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("ErrorString", dbMemo) tdf.Fields.Append fld

166

' creare index Set idx = tdf.CreateIndex("ErrorCodeIndex") Set fld = idx.CreateField("ErrorCode") With idx .Primary = True .Unique = True .Required = True End With idx.Fields.Append fld tdf.Indexes.Append idx ' deschidere recordset n tabela Errors Set rst = dbs.OpenRecordset("Errors") ' stabilirea indexului pentru recordset rst.Index = "ErrorCodeIndex") ' artarea pointerului clepsidr DoCmd.Hourglass True ' ciclarea n codurile de eroare For intCode = 1 To 32767 On Error Resume Next strErr = "" ' tentativa de apari ie a une erori Err.Raise intCode ' verificarea dac eroarea este VBA, DAO sau Access ' dac eroarea nu este VBA, atunci proprietatea Description a obiectului 'Err con ine textul "Application-defined or object-defined error" If Err.Description <> conAppObjErr Then strErr = Err.Description ' se utilizeaz metoda AccessError pentru returnarea irului descriptiv ' pentru erorile DAO i Access. ElseIf AccessError(intCode)<>conAppObjErr Then strErr = AccessError(intCode) End If ' dac numrul de eroare are un ir descriptiv, se adaug la tabela definit If Len(strErr) > 0 Then 'Adugarea noii nregistrri la recordset rst.AddNew ' adugarea numrului erorii la tabel rst!ErrorCode = intCode ' adugarea irului descriptiv rst!ErrorString.AppendChunk strErr ' actualizare nregistrare rst.Update End If Next intCode DoCmd.Hourglass False ' nchidere recordset rst.Close MsgBox "Errors table created" ' artarea noii tabele n fereastra Database (din Access) RefreshDatabaseWindow

167

CreateErrorsTable = True Exit_CreateErrorsTable: Exit Function Error_CreateErrorsTable: MsgBox Err & ": " & Err.Description CreateErrorsTable = False Resume Exit_CreateErrorsTable End Function Legarea unei tabele la o baz de date Pentru a utiliza ntr-o baz de date tabele dintr-o surs de date extern, aceasta trebuie legat la baza de date. Se pot lega tabele care sunt n alt baz de date Microsoft Jet, sau tabele din alte programe i formate de fiiere, cum ar fi Microsoft Excel, dBase, Microsoft FoxPro etc. Acest mod este mai eficient dect s se deschid baza de date extern direct, mai ales dac tabela vine dintr-o surs de date ODBC. Pentru a lega o tabel la o baz de date, se utilizeaz metoda CreateTableDef pentru a crea o nou tabel. Dup aceea se specific valorile pentru propriet ile Connect i SourceTableName ale noului obiect creat. Se poate stabili de asemenea proprietatea Attributes. n final se adaug tabela la colec ia TableDefs. Urmtorul exemplu leag o foaie de calcul Excel 8.0 ca o tabel la o baz de date. nainte de executarea unui astfel de exemplu trebuie s ne convingem c pe sistem este instalat driverul Microsoft Excel ISAM (Msexcl35.dll). Acest driver permite fiierelor Excel 97 s lucreze cu Microsoft Jet database engine. Function LinkExcelTable() As Boolean Dim dbs As DAO.Database, tdf As DAO.TableDef Const errNoISAM As Integer = 3170 Const conPath As String = _ "C:\Program Files \Northwind.mdb" On Error GoTo Err_LinkExcelTable ' returneaz o referin la baza de date Northwind Set dbs = OpenDatabase(conPath) ' creeaz un nou obiect TableDef Set tdf = dbs.CreateTableDef("LinkedTable") ' specific domeniul care este tabela surs tdf.SourceTableName = "DataRange" ' specific irul de conectare tdf.Connect = "EXCEL 8.0; DATABASE=C:\My Documents\XLTable.xls" ' adugarea noului obiect la colec ie dbs.TableDefs.Append tdf LinkExcelTable = True Exit_LinkExcelTable: Exit Function Err_LinkExcelTable: If Err = errNoISAM Then Dim strErr As String strErr = Err & ": " & Err.Description strErr = strErr _ & " You may not have the ISAM driver installed properly "

168

MsgBox strErr, vbOKOnly, "Error!" Else MsgBox "Error " & Err & ": " & Err.Description End If End Function Colec ia Fields n spa iul de lucru Microsoft Jet, obiectul Field reprezint un cmp dintr-o tabel, interogare, index, rela ie sau recordset. Colec ie Fields con ine toate obiectele Field asociate, respectiv, obiectele TableDef, QueryDef, Index, Relation sau Recordset. Localizarea n ierarhia de obiecte este Obiectul sau colec ia Field (obiect) Fields (colec ie) Este con inut n Colec ia Fields Obiectul TableDef Obiectul Index Obiectul QueryDef Obiectul Recordset Obiectul Relation Con ine Colec ia Properties Obiecte Field

Colec ia Fields este colec ia implicit a unui obiect TableDef, QueryDef, Index, Relation sau Recordset, ceea ce nseamn c nu trebuie fcut o referin la colec ie n mod explicit. De exemplu, urmtoarele instruc iuni returneaz o referin 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 colec ia Fields a unui obiect TableDef, QueryDef, Index sau Relation, obiectul Field este o unitate structural. El reprezint o coloan dintr-o tabel, avnd un tip particular de date. Dac se creeaz o baz de date n Microsoft Access, se pot crea cmpuri pentru toate aceste obiecte i s se fixeze propriet ile lor n mediul Access i nu este necesar utilizarea programrii n acest scop. ntr-un obiect Recordset, un obiect Field con ine date i poate fi utilizat pentru a citi date dintr-o nregistrare sau scrie date ntr-o nregistrare. n interfa a utilizator Access nu se poate lucra, totui, cu cmpurile obiectului Recordset; trebuie sse fac apel la DAO. Colec ia Fields a obiectului TableDef con ine toate cmpurile definite. Pentru un obiect QueryDef, colec ia con ine toate cmpurile incluse n interogare din una sau mai multe tabele. Colec ia Fields a obiectului Index include cmpurile pentru care este definit indexul. Pentru un obiect Relation, colec ia con ine cmpurile implicate n rela ie. Tipic, exist dou cmpuri n colec ia Fields: unul care este cheia primar, specificat de proprietatea Table a obiectului Relation; al doilea este cmpul extern corespunztor, din tabela specificat de proprietatea ForeignTable a obiectului Relation.

169

Colec ia Fields a obiectului Recordset con ine cmpurile specificate n argumentul source a metodei OpenRecordset. Argumentul source specific sursa nregistrrilor pentru noul obiect Recordset i poate fi un nume de tabel, nume de interogare sau o instruc iune SQL care returneaz nregistrri. Proprietatea Value a obiectului Field se aplic doar unui obiect din colec ia Fields a unui obiect Recordset. Proprietatea returneaz valoare datei memorate n acel cmp n nregistrarea curent. Deoarece Value este proprietatea implicit a obiectului Field iar Fields este colec ia implicit a obiectului Recordset, se poate returna valoarea unui cmp fr a specifica explicit fie Fields, fie Value. Exemplul urmtor este sugestiv n acest sens: Dim dbs As Database, rst As Recordset Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Set dbs = OpenDatabase(conPath) Set rst = dbs.OpenRecordset("Employees") ' referin a explicit la colec ie i valoare Debug.Print rst.Fields("LastName").Value ' referin explicit la valoare Debug.Print rst!FirstName.Value ' referin e implicite Debug.Print rst!Title Colec ia Indexes Un obiect Index reprezint un index dintr-o tabel a bazei de date, n spa iul de lucru Microsoft Jet. Colec ia Indexes con ine toate obiectele Index definite pentru o tabel particular. Pozi ia n ierarhia de obiecte este urmtoarea: Obiectul sau colec ia Index (obiect) Indexes (colec ie) Este con inut n Colec ia Indexes Obiectul TableDef Con ine Colec ia Fields Colec ia Properties Obiecte Index

Un index mrete viteza de cutare i sortare a tabelei. Se poate mbunt i performan a interogrii bazei de date prin indexarea cmpurilor pe ambele pr i ale jonc iunilor, cmpuri care sunt sortate, sau cmpuri care sunt utilizate drept criterii de interogare. Totui, indexurile pot s mreasc dimensiunea bazei i s ncetineasc performan a cnd se actualizeaz cmpuri indexate, cnd se adaug sau se elimin date. Performan a poate fi redus i n cazul aplica iilor multiuser. Din aceste motive utilizarea indexurilor va fi fcut cu aten ie. Un index specific ordinea n care nregistrrile sunt accesate din tabelele bazei de date ntr-un obiect Recordset de tip tabel. Pentru a crea un index cu DAO, opera iune posibil pentru unul sau mai multe 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 (coloan) care se include n obiectul Index. Stabilirea propriet ilor obiectului Index. Metoda Append pentru fiecare obiect Field care se adaug la colec ia Fields. Metoda Append pentru adugarea noului obiect Index la colec ia Indexes.

170

Urmtorul exemplu este ilustrativ. Sub SeekRecord () Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Dim dbs As Database, tdf As TableDef, idx As Index Dim fld As Field, fldLast As Field, fldFirst As Field Dim rst As Recordset ' returnarea unei referin e la baza de date Northwind Set dbs = DBEngine().OpenDatabase(conPath) ' returnarea unei referin e la tabela Employees Set tdf = dbs.TableDefs("Employees") ' crearea unui index nou pe cmpurile LastName i FirstName Set idx = tdf.CreateIndex("FirstLastName") ' crearea cmpurilor din index Set fldLast = idx.CreateField("LastName", dbText) Set fldFirst = idx.CreateField("FirstName", dbText) ' adugarea obiectelor Field idx.Fields.Append fldLast idx.Fields.Append fldFirst ' fixarea propriet ii Required idx.Required = True ' adugarea noului obiect index tdf.Indexes.Append idx ' deschiderea recordset-ului de tip tabel Set rst = dbs.OpenRecordset("Employees") ' fixarea propriet ii Index a obiectului Recordset rst.Index = idx.Name ' efectuarea opera iunii de cutare rst.Seek "=", "King", "Robert" ' tiprirea valorilor tuturor cmpurilor cu excep ia cmpului Photo For Each fld In rst.Fields If fld.Type <> dbLongBinary Then Debug.Print fld End If Next fld End Sub Observa ie. n mediul Microsoft Access se poate lucra cu mul imea indexurilor n meniul View, comanda Indexes. Colec ia QueryDefs Printr-o interogare n elegem o opera iune, formalizat, prin care este returnat o mul ime de nregistrri care satisfac cerin e impuse sau se execut o ac iune specific asupra unei mul imi de nregistrri selectate dup cerin ele din interogare. Un obiect QueryDef reprezint o interogare n DAO. Obiectele QueryDef pot fi salvate cu baza de date n Microsoft Jet sau pot fi temporare n ODBCDirect i Jet. Rela iile n ierarhia de obiecte DAO sunt Obiectul sau colec ia Este con inut n Con ine

171

QueryDef (obiect)

Colec ia QueryDefs

Colec ia Fields Colec ia Parameters Colec ia Properties Obiecte QueryDef

QueryDefs (colec ie) Obiectele QueryDef ofer:

Obiectul Database

folosirea propriet ii SQL pentru a fixa sau returna defini ia interogrii; folosirea colec iei Parameters pentru a fixa sau returna parametrii interogrii; utilizarea propriet ii Type pentru a determina dac interogarea selecteaz nregistrrile dintr-o tabel existent, creeaz o nou tabel etc.; utilizarea propriet ii MaxRecords pentru a limita numrul de nregistrri returnate de o nregistrare; folosirea propriet ii ODBCTimeout pentru a indica timpul de ateptare a rezultatului unei interogri.

n spa iul de lucru Microsoft Jet mai sunt posibile: utilizarea propriet ii ReturnRecords pentru a indica, la interogri prin SQL, returnarea de nregistrri; utilizarea propriet ii Connect pentru a realiza o interogare a unei baze ODBC prin SQL.

n spa iul ODBCDirect sunt specifice utilizarea propriet ii Prepare pentru a determina dac se invoc ODBC SQLPrepare API la executarea interogrii; utilizarea propriet ii CacheSize pentru depozitarea (cache) nregistrrilor returnate de interogare.

Obiectele QueryDef temporare nu sunt salvate pe disc i nu sunt adugate la colec ia QueryDefs. n general, interogrile temporare sunt utile atunci cnd frazele SQL sunt create, repetat, n timpul execu iei. Un obiect QueryDef permanent din spa iul Jet poate fi gndit ca o instruc iune SQL compilat. Astfel, interogarea este mai rapid dect o instruc iune SQL executat prin metoda OpenRecordset. Pentru a crea un obiect QueryDef se utilizeaz metoda CreateQueryDef. n spa iul Jet, dac se precizeaz numele noului obiect se creeaz un obiect QueryDef permanent i care este adugat automat la colec ia QueryDefs i salvat n disc. Dac se d implicit sau explicit un nume vid, "", atunci rezultatul este un obiect QueryDef temporar. n spa iul ODBCDirect o interogare este ntotdeauna temporar. Colec ia QueryDef con ine toate obiectele QueryDef deschise. Cnd o interogare este nchis, ea este nlturat automat din colec ia QueryDef. Referin a la un obiect permanent QueryDef este uzual, prin intermediul colec iei: QueryDefs(0) QueryDefs("name") QueryDefs![name] Referin a la obiectele temporare QueryDef se poate ob ine doar prin variabilele obiect la care s-au asignat interogrile.

172

Crearea interogrilor permanente Interogrile permanente, salvate mpreun cu baza de date, pot fi create n Visual Basic cu DAO sau n interfa a utilizator din Microsoft Access. Exemplul urmtor constituie un model pentru crearea unei interogri. Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Dim dbs As Database, qdf As QueryDef, rst As Recordset Dim strSQL As String strSQL = "SELECT FirstName, LastName, LastName, HireDate FROM Employees " _ & "WHERE Title = 'Sales Representative' ORDER BY HireDate;" Set dbs = OpenDatabase(conPath) Set qdf = dbs.CreateQueryDef("Sales Representatives", strSQL) Set rst = qdf.OpenRecordset Obiectul QueryDef nou creat nu trebuie adugat la colec ia QueryDefs, deoarece prin specificarea unei valori nenule a argumentului name se creeaz o interogare permanent i aceasta este adugat automat la colec ie. Un nume nul ar duce la crearea unei interogri temporare (n spa iul ODBCDirect toate obiectele QueryDef sunt ntotdeauna temporare). Colec ia Parameters (QueryDef Object) Un obiect Parameter reprezint o valoare transmis unei interogri. Colec ia Parameters con ine toate obiectele Parameter definite de un obiect QueryDef. Localizarea n ierarhia de obiecte DAO este precizat n tabelul alturat. Obiectul sau colec ia Parameter (obiect) Parameters (colec ie) Este con inut n Colec ia Parameters Obiectul QueryDef Con ine Colec ia Properties Obiecte Parameter

Dac se dorete ca utilizatorul sau aplica ia s ofere o valoare n timpul execu iei, prin care s se limiteze mul imea nregistrrilor returnate de o interogare, aceasta se realizeaz prin definirea parametrilor interogrii. Pentru a crea un parametru se utilizeaz declara ia SQL PARAMETERS. Sintaxa declara iei este: PARAMETERS name datatype [, name datatype [, ]] Declara ia PARAMETERS precede restul instruc iunii SQL i este separat prin caracterul ";", dup exemplul urmtoarei instruc iuni SQL: PARAMETERS [ Beginning OrderDate] DATETIME,[ Ending OrderDate] DATETIME; SELECT * FROM Orders WHERE (OrderDate Between [ Beginning OrderDate] And [ Ending OrderDate] );

173

Fiecare parametru definit n instruc iunea SQL este reprezentat de un obiect Parameter n colec ia Parameters a obiectului QueryDef bazat pe instruc iunea SQL. Valoarea unui parametru se poate specifica prin fixarea propriet ii Value a obiectului Parameter. Exemplul urmtor realizeaz o asemenea opera iune. Function NewParameterQuery (dteStart As Date, dteEnd As Date) As Boolean Dim dbs As Database, qdf As QueryDef, rst As Recordset Dim strSQL As String On Error Resume Next ' returnarea referin ei la baza curent Set dbs = CurrentDb ' construc ia irului SQL strSQL = "PARAMETERS [Beginning OrderDate] DATETIME, " _ & "[Ending OrderDate] DATETIME; SELECT * FROM Orders " & _ "WHERE (OrderDate Between [Beginning OrderDate] " _ & "AND [ Ending OrderDate] )';" ' eliminarea interogrii dac ea exist dbs.QueryDefs.Delete "ParameterQuery" On Error GoTo Err_NewParameterQuery ' crearea unui nou obiect QueryDef Set qdf = dbs.CreateQueryDef("ParameterQuery", strSQL) ' fixarea valorilor parametrilor If dteStart > dteEnd Then MsgBox "Start date is later than end date." Exit Function End If qdf.Parameters("Beginning OrderDate") = dteStart qdf.Parameters("Ending OrderDate") = dteEnd ' deschiderea recordset-ului din interogare Set rst = qdf.OpenRecordset rst.MoveLast MsgBox "Query returned " & rst.RecordCount & " records." NewParameterQuery = True Exit_NewParameterQuery: rst.Close Set dbs = Nothing Exit Function Err_NewParameterQuery: MsgBox "Error " & Err & ": " & Err.Description NewParameterQuery = False Resume Exit_NewparameterQuery End Function Func ia poate fi apelat din fereastra Debug prin ? NewParameterQuery(#6-30-95#, #6-30-96#) Observa ie. n Microsoft Access se pot defini parametrii unei interogri n Query Design View. Colec ia Relations (obiectul Database)

174

Un obiect Relation reprezint o rela ie ntre cmpuri din tabele sau nterogri. Colec ia Relations con ine toate obiectele Relation ale unei baze de date. Localizarea n ierarhia de obiecte DAO a spa iului de lucru Microsoft Jet este Obiectul sau colec ia Relation (obiect) Relations (colec ie) Rela ii ntre tabele Separarea informa iilor ntre mai multe tabele ale unei baze de date, dup criterii care in de subiect, categorie, administrare etc., ridic problema reunirii informa iilor pentru necesit i de raportare a lor. Pentru rezolvarea acestei probleme o prim opera iune este aceea de a stabili rela ii ntre tabele. Prin rela ie se n elege, n problematica bazelor de date, o asociere stabilit ntre dou cmpuri (denumite cmpuri cheie, de regul cu acelai nume) din dou tabele. n acest mod nregistrrile celor dou tabele pot fi coordonate nct nregistrrile curente s con in informa ii corelate dup cmpurile asociate. Rela ia lucreaz prin potrivirea valorilor cmpurilor cheie. n cele mai multe cazuri, cmpurile cheie sunt cheia primar dintr-o tabel (s-o numim tabela A), care constituie un identificator unic pentru fiecare nregistrare, i o cheie extern din alt tabel (s-o numim tabela B). Exist trei tipuri de rela ii: one-to-one, one-to-many, many-to-many dup numrul nregistrrilor din cele dou tabele, care ndeplinesc condi ia de matching. O rela ie one-to-many, cea mai frecvent, o nregistrare din tabela A poate s se potriveasc cu mai multe nregistrri din tabela B; invers, o nregistrare din tabela B are doar o nregistrare din A cu care se potrivete. ntr-o rela ie many-to-many, o nregistrare din tabela A poate s se potriveasc cu mai multe nregistrri din tabela B, iar o nregistrare din tabela B poate s se corespund cu mai multe nregistrri din tabela A. Acest tip de rela ie este posibil prin definirea unei a treia tabele (tabela de jonc iune junction table) ale crei cmpuri chei primare sunt n rela ie cu cheile externe din tabelele A i B. Astfel, o rela ie many-to-many este format din dou rela ii one-to-many care implic o a treia tabel. Rela ia one-to-one presupune c nregistrrile din tabelele A i B sunt n coresponden una la una, fiecare nregistrare din A se poate potrivi doar cu o nregistrare din B i reciproc. Dei nu este o situa ie uzual, prin aceea c legtura foarte puternic ar presupune c informa ia trebuia grupat ntr-o singur tabel, rela ia one-to-one poate fi utilizat pentru divizarea unei tabele cu prea multe cmpuri sau izolarea unei pr i a tabelei. Modul de rela ie creat de Microsoft Access depinde de definirea cmpurilor care sunt puse n rela ie (chei primare, indexuri unice etc.). Obiectul Relation Obiectul Relation poate fi utilizat pentru a crea noi rela ii sau pentru a examina rela iile existente n baza curent. Propriet ile obiectului servesc la specificarea tipului de rela ie, a tabelelor care particip n rela ie, cnd s se for eze integritatea referen ial (integritatea referen ial Referential integrity este un sistem de reguli utilizate n Access pentru a asigura c rela iile dintre nregistrrile tabelelor legate sunt valide i c nu se terg sau modific date legate; integritatea referen ial interzice adugarea de nregistrri la o tabel legat pentru care nu exist cheie primar, modificarea valorilor n tabela primar care conduce la nregistrri orfane n tabela legat etc.) i cnd s se execute actualizrile i tergerile Este con inut n Colec ia Relations Obiectul Database Con ine Colec ia Fields Colec ia Properties Obiecte Relation

175

n cascad (actualizri n cascad cascading update pentru rela iile care impun integritatea referen ial, o op iune care, n cazul modificrii unei chei primare din nregistrrile tabelei primare, conduce la actualizarea automat a cheilor externe n toate nregistrrile legate din tabelele externe; tergeri n cascad cascading delete similar, dar pentru tergeri de nregistrri: tergerea unei inregistrri din tabela primar produce tergerea nregistrrilor legate din tabelele externe). Toate aceste no iuni sunt prezentate, pe scurt, n continuare. Adugarea unui obiect Relation la colec ia Relations, se va crea obiectul prin metoda CreateRelation i se adaug la colec ie prin metoda Append. Astfel, obiectul Relation este salvat o dat cu obiectul Database. Eliminarea unui obiect Relation se realizeaz metoda Delete. Referirea la un obiect Relation se realizeaz n mod uzual: Relations(0) Relations("name") Relations![name] Ac iunile principale realizate prin utilizarea obiectului Relation sunt enumerate n continuare. Stabilirea unei rela ii impuse ntre cmpuri din tabele de baz (o tabel de baz este o tabel a unei baze de date Microsoft Jet) dar nu rela ii care implic tabele i interogri legate (o tabel legat este o baz extern, legat de o baz de date Jet). Stabilirea unei rela ii neimpuse ntre orice tip de tabel sau interogare nativ sau legat. Utilizarea propriet ii Name pentru a referi rela ia dintre cmpurile din tabela primar (prin tabela primar se n elege partea "one" dintr-o rela ie one-to-many) referit i tabela extern (tabela de pe partea "many" a rela iei one-to-many) care face referirea. Utilizarea propriet ii Attributes pentru a determina dac rela ia dintre cmpuri este one-to-one i cum s se impun integritatea referen ial. De asemenea, tot prin Attributes, se poate determina dac motorul Microsoft Jet poate efectua actualizarea n cascad i tergerea n cascad n tabelele legate prin rela ii. Utilizarea propriet ii Attributes pentru a determina dac rela ia este asociere stnga (left join, include toate nregistrrile din prima tabel din stnga chiar dac nu exist nici o potrivire cu nregistrri din a doua tabel din dreapta) sau asociere dreapta (right join, include toate nregistrrile din a doua tabel din dreapta chiar dac nu exist potriviri cu nregistrri din prima tabel din stnga rela iei). Utilizarea propriet ii Name a obiectelor Field din colec ia Fields a obiectului Relation pentru a stabili sau returna numele cmpurilor din cheia primar a tabelei referite, sau setrile propriet ii ForeignName a obiectelor Field pentru a stabili sau returna denumirile cmpurilor din cheia extern a tabelei care face referin a.

Un obiect Relation are o colec ie Fields care con ine dou cmpuri, cte unul n fiecare tabel a rela iei.Cmpurile rela iei trebuie s aib acelai tip de dat i trebuie s aib valori comune. Se vor utiliza propriet ile Table i ForeignTable ale obiectului Relation pentru a specifica tabele care iau parte la rela ie i cum sunt legate. La crearea unei rela ii one-to-many, tabela de pe partea "one" a rela iei este tabela n care cmpul din legtur este cheia primar. Prin urmare proprietatea Table trebuie s fie numele acestei tabele. Tabela de pe partea "side" a rela iei este tabela n care cmpul legat este cheie extern iar numele tabelei se va da propriet ii ForeignTable. Urmtorul exemplu creeaz o rela ie ntre tabelele Employees i Orders din baza de date de test Northwind. Cele dou tabele sunt unite prin cmpul EmployeeID care este cheie primar n baza Employees toate valorile acestui cmp sunt unice i cheie extern pentru Orders aceeai valoare poate s apar n mai multe nregistrri. Function NewRelation() As Boolean Dim dbs As Database Dim fld As Field, rel As Relation ' calea ctre baza de date Northwind Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" On Error GoTo Err_NewRelation

176

' returneaz o referin la baza curent Set dbs = OpenDatabase(conPath) ' gsirea unei rela ii EmployeesOrders deja existente For Each rel In dbs.Relations If rel.Table = "Employees" And rel.ForeignTable = "Orders" Then ' mesaj de tergere a rela iei existente If MsgBox(rel.Name & " already exists. " & vbCrLf _ & "This relation will be deleted and re-created.", vbOK) = vbOK Then dbs.Relations.Delete rel.Name Else ' dac utilizatorul rspunde cu Cancel Exit Function End If End If Next rel ' crearea noii rela ii i stabilirea propriet ilor ei Set rel = dbs.CreateRelation("EmployeesOrders", "Employees", "Orders") ' stabilirea propriet ilor pentru for area integrit ii referen iale rel.Attrbutes = dbRelationDeleteCascade + dbRelationUpdateCascade ' creare cmp n colec ia Fields a obiectului Relation, la creare se fixeaz Name Set fld = rel.CreateField("EmployeeID") ' numele pentru cmpul extern fld.ForeignName = "EmployeeID" ' adugarea obiectelor create rel.Fields.Append fld dbs.Relations.Append rel MsgBox "Relation '" &rel.Name & " ' created." Set dbs = Nothing NewRelation = True Exit_NewRelation: Exit Function Err_NewRelation MsgBox "Error " & Err & ": " & Err.Description NewRelation = False Resume Exit_NewRelation End Function Observa ie. n Microsoft Access se lucreaz cu rela iile prin meniul Tools Relationships. Colec ia Recordsets Obiectul Recordset reprezint o mul ime de nregistrtri din baza de date. Colec ia Recordsets con ine toate obiectele Recordset deschise. Situarea n ierarhia de obiecte este Obiectul sau colec ia Recordset (obiect) Recordsets (colec ie) Este con inut n Colec ia Recordsets Obiectul Database Con ine Colec ia Fields Colec ia Properties Obiecte Recordset

177

Obiectele Recordset sunt utilizate pentru modificarea datelor memorate ntr-o tabel a unei baze de date (structura tabelei poate fi modificat prin comenzi DAO sau SQL). Crearea unui obiect Recordset se ob ine din metoda OpenRecordset cu sintaxa: Set recordset = object.OpenRecordset (source, type, options, lockedits) Descrierea parametrilor se va vedea n Help OpenRecordset method. DAO ofer cinci tipuri de obiecte Recordset: table (doar n spa ii de lucru Jet), dynaset, snapshot, forward-only, dynamic (doar n spa ii ODBCDirect).

Observa ie. Un obiect Recordset trebuie ntotdeauna nchis dup terminarea lucrului cu el i nainte de a nchide obiectul Database n care a fost creat. Pentru aceasta se utilizeaz metoda Close a obiectului Recordset. Obiecte Recordset de tip tabel Un obiect Recordset de tip tabel reprezint o tabel de baz (base table) din baza de date. Toate cmpurile i nregistrrile din tabel sunt incluse ntr-un obiect Recordset de tip tabel. Acesta poate fi utilizat ntr-un spa iu de lucru Microsoft Jet pentru a aduga, terge sau modifica nregistrri din tabel. Un obiect Recordset poate fi deschis pe tabelele de baz ale unei baze de date Jet, dar nu pe tabelele din surse ODBC sau tabele legate. Se mai poate utiliza Recordset cu bazele de date instalabile ISAM (FoxPro, dBase sau Paradox) pentru a deschide aceste tabele n mod direct mai degrab dect s se lege acestea la baza de date curent. Informa ii complete despre un obiect table-type Recordset se ob in din DAO Help "Table-Type Recordset Object Summary", de unde sunt legturi ctre toate propriet ile i metodele obiectului. Intrarea poate fi atins eventual prin Database Object > Summary > Database Object, Databases Collection Summary, de unde este o legtur ctre Recordsets. Proprietatea RecordCount a unui obiect Recordset de tip tabel returneaz numrul de nregistrri din tabel. Obiectul Recordset de tip tabel poate utiliza indexurile definite pentru tabela de baz. La crearea obiectului se poate preciza n proprietatea Index numele unui index definit pentru tabel. Metoda Seek va cuta n ordinea dat de index. Pentru a crea un obiect Recordset de tip tabel se va specifica valoarea dbOpenTable pentru argumentul type a metodei OpenRecordset a obiectului Database. Observa ie. Pentru o tabel legat dintr-o surs de date extern se va utiliza mai nti metoda OpenDatabase pentru deschiderea bazei i apoi se deschide un obiect Recordset de tip tabel. Exemplul urmtor creeaz un obiect Recordset de tip tabel, folosete metoda Seek pentru localizarea unei nregistrri i fixeaz nregistrarea gsit drept nregistrare curent. Function ReturnEmployeesRecord(strKey As String) As Boolean Dim dbs As Database, rst As Recordset Const conPath As String = _

178

"C:\Program Files\ \Northwind.mdb" On Error GoTo Err_ReturnEmployeesRecord ' returnarea referin ei la baza de date Set dbs = OpenDatabase(conPath) ' deschidere recordset pentru tabela Employees Set rst = dbs.OpenRecordset("Employees", dbOpenTable) ' fixarea indexului rst.Index = "LastName" ' opera iunea de cutare rst.Seek "=", strKey ' valoarea cutat este argument al func iei ' verificarea gsirii If rst.NoMatch = False Then ' tiprirea unor cmpuri din nregistrarea gsit Debug.Print rst!EmployeeID, rst!FirstName & " " & rst!LastName, rst!Title ReturnEmployeesRecord = True Else ReturnEmployeesRecord = False End If Exit_ReturnEmployeesRecord: ' nchidere recordset i baz rst.Close dbs.Close Exit Function Err_ReturnEmployeesRecord: MsgBox "Error " & Err & ": " & Err.Description ReturnEmployeesRecord = False Resume Exit_ReturnEmployeesRecord End Function Obiecte Recordset de tip dynaset Un obiect Recordset de tip dynaset reprezint rezultatul unei cutri n una sau mai multe tabele. Obiectul este o mul ime dinamic de inregistrri care se poate utiliza pentru adugarea, modificarea sau tergerea nregistrrilor n una sau mai multe tabele ale bazei. Cu un obiect Recordset de tip dynaset se pot extrage i actualiza date ntr-o uniune multipl de tabele, incluznd tabele legate din mai multe baze de date. Obiecte Recordset de tip dynaset se pot crea att n spa ii de lucru Microsoft Jet, ct i n spa ii de lucru ODBCDirect. Dac obiectul implic o surs de date la distan , el const ntr-o serie de bookmark-uri, fiecare identificnd unic o nregistrare din recordset. Date efective nu sunt returnate dect la referirea lor explicit. Pentru a determina numrul de nregistrri din recordset se aplic mai nti metoda MoveLast astfel regsindu-se toate nregistrrile din mul ime. Obiectul Recordset de tip dynaset poate fi actualizat, dar nu toate cmpurile suport opera ia. Proprietatea DataUpdatable a obiectului Field respectiv arat dac se poate modifica valoarea cmpului. Obiectul nu se poate actualiza dac pagina de date necesar este blocat de alt utilizator nregistrarea a fost deja modificat de la ultima citire utilizatorul nu are drepturile necesare cel pu in o tabel sau un cmp este read-only obiectul Recordset a fost creat din mai multe tabele fr instruc iunea JOIN

179

obiectul include cmpuri dintr-o surs de date ODBC, sau tabele Paradox, i nu exist un index unic pe acele tabele.

Crearea unui obiect dynaset-type Recordset se indic utiliznd constanta dbOpenDynaset pentru argumentul type al metodei OpenRecordset, dup modelul Sub PrintHireDates () Dim dbs As Database, rst As Recordset Dim strSQL As String Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" ' deschiderea bazei de date, referirea ei Set dbs = DBEngine.Workspaces(0).OpenDatabase(conPath) ' ini ializarea irului SQL strSQL = "SELECT FirstName, LastName, HireDate FROM Employees " & _ "WHERE HireDate <= #1-1-93# ORDER BY HireDate;" ' deschiderea recordsetului de tip dynaset Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset) ' tiprirea nregistrrilor din recordset Do Until rst.EOF Debug.Print rst!FirstName, rst!LastName, rst!HireDate Rst.MoveNext Loop ' nchiderea recordsetului i a bazei rst.Close dbs.Close

End Sub

Obiecte Recordset de tip snapshot Un obiect Recordset de tip snapshot este o mul ime static de nregistrri care reprezint rezultatul unei interogri. Un snapshot include toate valorile pentru toate cmpurile cerute n interogare, fie c exist n cod referin e la ele sau nu. Obiectul Recordset de tip snapshot necesit mai pu ine resurse dect cel de tip dynaset, dar datele nu pot fi actualizate n obiectul Recorset de tip snapshot. Ini ial, la parcurgerea nregistrrilor din obiect, toate datele sunt copiate n memorie i apoi, dac mul imea este prea vast, ntr-o baz de date Jet temporar de pe maina utilizatorului. Printre nregistrrile unui obiect snapshot se poate naviga n ambele sensuri. Pentru a crea un obiect snapshot-type Recordset se specific valoarea dbOpenSnapshot pentru argumentul type al metodei OpenRecordset. Obiecte Recordset de tip forward-only Un obiect Recordset de tip forward-only este identic cu unul de tip snapshot cu excep ia faptului c nregistrrile pot fi defilate doar nainte (nu se poate efectua dect o singur trecere prin nregistrri). ntr-un obiect recordset de acest tip exist doar o singur nregistrare la un moment dat. Rezult c nu se pot utiliza metode cum ar fi MoveLast, MoveFirst, MovePrevious. Obiectele de acest tip, utile atunci cnd nregistrrile sunt parcurse doar o dat, ofer cea mai mare vitez de acces.

180

Crearea unui obiect forward-only-type Recordset este produs de constanta dbOpenForwardOnly atribuit argumentului type al metodei OpenRecordset. Metodele obiectelor Recordset n tabelul urmtor este o prezentare a metodelor permise pentru diferite tipuri de obiecte Recordset. Este inclus i tipul dinamic, disponibil doar n spa ii ODBCDirect. Jet = opera iune permis n spa iul Microsoft Jet ODBC = opera iune permis n spa iul de lucru ODBCDirect Method AddNew Cancel CancelUpdate Clone Close CopyQueryDef Delete Edit FillCache FindFirst FindLast FindNext FindPrevious GetRows Move MoveFirst MoveLast MoveNext MovePrevious Jet Jet Jet Jet 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/ODBC Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC Jet Jet Jet Jet Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC Jet/ODBC Doar nainte, fr offset ODBC ODBC ODBC ODBC 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

181

NextRecordset OpenRecordset Requery Seek Update Jet Jet Jet

ODBC Jet Jet/ODBC

ODBC Jet Jet/ODBC

ODBC

ODBC

Jet/ODBC

ODBC

Jet/ODBC

ODBC *

ODBC

ODBC

* n spa iul ODBCDirect anumite opera iuni depind de driver (dac acesta suport sau nu opera iunea respectiv) Pentru propriet ile diferitelor tipuri de obiecte Recordset se vor studia intrrile respective din Help. Securitatea datelor Microsoft Access dispune de dou metode de asigurare a securit ii informa iilor: stabilirea de parole pentru deschiderea bazelor de date i securitate la nivel de utilizator, prin fixarea drepturilor de acces la diferite obiecte ale bazei de date.

Securitatea la nivel de utilizator/grup se realizeaz cu ajutorul obiectelor Group, mpreun cu obiectele User, Container, Document i Workspace. Obiectul Group reprezint un grup de conturi iar obiectul User reprezint un cont individual. Utilizatorii pot fi membri ai grupurilor. Atunci cnd se stabilete securitatea bazei, aceasta se efectueaz pentru un obiect particular sau mul ime de obiecte specificnd tipul de drepturi pe care utilizatorul sau grupul l are asupra obiectelor respective. Dac un grup are o anumit permisiune pentru un obiect, to i utilizatorii grupului au aceeai permisiune. Invers, dac un utilizator are drepturi asupra unui obiect, grupul la care apar ine utilizatorul are aceleai drepturi. Grupurile pot fi create prin metoda CreateGroup a obiectului Workspace sau User. Obiectul Container reprezint un set particular de obiecte dintr-o baz de date pentru care se pot atribui drepturi ntr-un grup securizat. DAO ofer trei tipuri de obiecte Container; fiecare baz de date con ine cel pu in aceste obiecte avnd denumirile: Databases bazele de date salvate , Tables tabelele i interogrile salvate , Relationships rela iile salvate. O aplica ie poate s defineasc i obiecte Container proprii; Microsoft Access definete obiectele Container cu denumirile Forms formele salvate , Modules modulele salvate, Reports rapoartele salvate , Scripts macrourile salvate. Pentru stabilirea drepturilor se stabilete proprietatea UserName a containerului respectiv i apoi proprietatea Permissions adecvat. Fiecare obiect Container con ine o colec ie Documents, fiecare element Document reprezentnd un document din baz. Att DAO ct i aplica ia ofer diferite tipuri de obiecte Document, de exemplu Database (DAO), Form (Access) etc. Pentru stabilirea drepturilor se stabilete proprietatea UserName a documentului respectiv i apoi proprietatea Permissions. Pentru informa ii detaliate se vor studia intrrile din Help pentru obiectele men ionate i legturile propuse. Colec ia Properties Cele mai multe obiecte DAO con in o colec ie Properties. Fiecare obiect Property din colec ie corespunde unei propriet i a obiectului. Colec ia propriet ilor poate fi utilizat fie pentru a determina ce propriet i se aplic unui obiect particular, fie pentru a returna valorile existente ale propriet ilor. Exemplul urmtor afieaz n fereastra Debug toate propriet ile obiectului reprezentnd baza de date curent.

182

Sub DisplayProperties() Dim dbs As Database, prp As Property Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" ' deschide baza Set dbs = OpenDatabase(conPath) Debug.Print "Current Database Properties" ' enumerarea colec iei For Each prp In dbs.Properties Debug.Print prp.Name Next prp dbs.Close

End Sub

Anumite propriet i ale obiectelor DAO nu exist n mod automat n colec ia Properties a obiectului respectiv. nainte de utilizarea unei asemenea propriet i, trebuie s se creeze un obiect Property care s reprezinte proprietatea i s se adauge obiectul la colec ia Properties. Din acest moment proprietatea poate fi utilizat la fel cu toate celelalte existente n colec ie. Urmtoarea func ie este o procedur generic utilizabil n cazul procesrii unei propriet i care nu exist n mod implicit. Func ia implementeaz tratarea erorilor. Prima dat cnd se cheam procedura apare o eroare deoarece nu exist proprietatea cerut. n handler-ul erorii se creeaz noul obiect Property i se adaug la colec ia lui. Orice apel ulterior nu mai produce erori i proprietatea este stabilit pe valoarea specificat. Function SetProperty(obj As Object, strName As String, _ intType As Integer, varSetting As Variant) As Boolean Dim prp As Property Const conPropNotFound As Integer = 3270 On Error GoTo Error_SetProperty ' referirea explicit la colec ia Properties obj.Properties(strName) = varSetting SetProperty = True Exit_SetProperty: Exit Function Error_SetProperty: If Err = conPropNotFound Then ' creare proprietate, tip, valoare ini ial Set prp obj.CreateProperty(strName, intType, varSetting) ' adugarea la colec ia Properties obj.Properties.Append prp obj.Properties.Refresh SetProperty = True Resume Exit_SetProperty Else MsgBox Err & ": " & vbCrLf & Err.Description SetProeprty = False Resume Exit_SetProperty End If End Function

183

De exemplu, pentru a fixa proprietatea ReplicableBool a obiectului Database, se poate utiliza func ia precedent prin Sub ReplicateDatabase() Dim dbs As Database Const conPath As String = _ "C:\Program Files\ \Northwind.mdb" Set dbs = OpenDatabase(conPath, True) If SetProperty(dbs, "ReplicableBool", dbBoolean, True) Then Debug.Print "Database replicated successfully." Else Debug.Print "Database not replicated." End If

End Sub

De fiecare dat cnd se fixeaz sau se citete o proprietate care nu exist n mod automat n colec ia Properties a unui obiect, referin a la colec ia Properties trebuie s fie explicit. De exemplu, Debug.Print dbs.Properties("ReplicableBool") Func ia artat n exemplul anterior poate fi utilizat pentru definirea unor propriet i proprii (introduse de utilizator) pentru obiectele DAO. De exemplu, se poate defini o proprietate care s memoreze numele utilizatorului care a modificat ultima dat o tabel. i referin ele la propriet ile definite de utilizator se vor efectua n mod explicit. Anumite aplica ii, cum ar fi Access, definesc propriet i proprii pentru obiectele DAO. De exemplu Microsoft Access definete propriet i pentru obiectele TableDef, QueryDef, Field i Document. Accesarea datelor ODBC Atunci cnd este nevoie s se lucreza cu surse de date ODBC, trebuie s se decid dac se va utiliza DAO cu Microsoft Jet, ODBCDirect sau ambele. n continuare se discut pentru nceput avantajele fiecrui tip de acces i alte probleme conexe domeniului. Alegerea modului de lucru este func ie de posibilit ile de lucru oferite n cele dou spa ii. Utilizarea Microsoft Jet pentru date ODBC Alegerea modului de acces Jet poate fi influen at de urmtoarele argumente. Posibilit ile enumerate sunt proprii spa iilor de lucru Microsoft Jet i nu sunt suportate de spa iile ODBCDirect. o o Legturi actualizabile se pot actualiza date din obiecte Recordset bazate pe legturi multiple de tabele Suport pentru tabele legate se pot memora legturi permanenete la date de pe server ntr-o baz local Microsoft Jet. La legarea unei tabele, se poate memora (cache) informa ia despre structura tabelei, incluznd informa ii despre cmpuri i indexuri, n baza local. Acest fapt mrete viteza de conectare la accesrile ulterioare ale sursei de date. Suport pentru metode Find se pot utiliza metodele FindFirst, FindNext, FindPrevious i FindLast cu obiectele Recordset. Eecuri (failures) par iale ale actualizrii interogrilor dac eueaz o interogare de mari dimensiuni, interogarea se oprete, d controlul utilizatorului pentru a decide sau nu dac se pstreaz modificrile efectuate pn n momentul eecului. Propriet i definite de utilizator se pot personaliza obiectele DAO prin adugarea unor propriet i persistente. De exemplu o proprietate Description care smemoreze un text descriptiv al obiectului. Interogri ncruciate se poate utilzia propozi ia SQL TRANSFORM pentru a crea rezumate ncruciate (crosstab) ale datelor interogate.

o o

o o

184

o o

Acces la date eterogene se poate lucra cu date de pe server, baze de date Microsoft Jet native (fiiere .mdb) i date ISAM instalabile (FoxPro, Paradox, dBASE). Se pot efectua uniri de tabele din surse diferite. Utilizare programatic pentru Data Definition Language (DDL) se poate folosi DAO pentru opera iuni care modific structura bazei de date (adugare de tabel, modificare etc.). Ataare de forme i controale n spa iul Jet se pot ataa forme i controale datelor din surse ODBC. Spa iul ODBCDirect nu suport tabele legate deci nici forme sau controale.

Utilizare ODBCDirect pentru date ODBC Cu ODBCDirect se pot accesa date de pe server utiliznd modelul de obiecte DAO existent direct n topul interfe ei de programare ODBC. ODBCDirect implementeaz un strat de cod peste ODBC API, care stabilete conexiunile, creeaz cursoare i execut proceduri utiliznd resurse minime de pe sta ia de lucru, fr a trece prin Microsoft Jet. Avantajele utilizrii spa iului de lucru ODBCDirect sunt enumerate n continuare. o Acces direct aplica ia acceseaz sursa de date ODBC n mod direct. Se pot astfel mbunt i performan ele, reduce traficul de re ea i beneficia de capacit ile de procesare ale serverului (mai mari dect ale sta iei de lucru). Reducerea necesarului de resurse netrecnd prin Microsoft Jet, aplica ia cere mai pu ine resurse locale. Dac se utilizeaz ODBCDirect din Access se va ine seama c Microsoft Access ncarc ntotdeauna Microsoft Jet (chiar dac opera iunile ODBCDirect nu trec pe acolo). Imbunt irea accesului la func ionalitatea specific serverului se pot utiliza avantajele func iunilor specifice serverului ODBC i care nu sunt permise prin Microsoft Jet. De exemplu, n spa iul ODBCDirect se poate specifica locul de memorare a cursorului: la client sau la server, pentru serverele care suport diferite tipuri de cursoare. Interogri asincrone se pot executa o interogare a bazei de date i apoi alte opera iuni fr a atepta terminarea interogrii. Se pot testa propriet ile pentru a vedea stadiul execu iei interogrii. Astfel se poate simula concuren a i optimiza performan a aplica iei. Actualizare optimist n loturi modificrile locale se pot stoca n Recordset i trimite apoi serverului ntr-un singur lot. Executarea procedurilor memorate se pot manevra intrrile i ieirile procedurilor memorate pe server; se pot specifica valori de intrare i verifica valorile returnate, opera iuni imposibile n spa iul de lucru Jet.

o o

nregistrarea unei surse de date ODBC Pentru a putea fi utilizat, att n spa iul de lucru Microsoft Jet, ct i n spa iul ODBCDirect, o surs de date ODBC trebuie s fie nregistrat. Acest proces memoreaz informa ia despre sursa de date n Windows Registry i ofer aceast informa ie aplica iilor. nregistrarea se poate efectua att din managerul de ODBC (disponibil n mediul Windows), ct i din Visual Basic. Paii necesari nregistrrii difer dup sursa de date ODBC, driverele respective necesitnd informa ii specifice. n continuare se d, ca exemplu, nregistrarea sursei de date SQL Server utiliznd managerul de ODBC: 1. Windows Control Panel => dublu click pe 32bit ODBC 2. Click Add i apoi dublu click pe SQL Server. 3. n caseta Data Souce Name se tasteaz un nume (DSN). Acesta poate fi orice ir i nu trebuie s corespund cu numele bazei de date sau tabelei accesate. 4. n Description se tasteaz o desciere a bazei de date, orice text de altfel.

185

5. n caseta Server se introduce numele serverului de re ea unde se afl sursa datelor. Nu se include un dublu backslash (\\) naintea numelui. 6. Click Options i se introduce numele bazei de date accesate n caseta Database Name. Exemplul urmtor con ine codul necesar nregistrrii programatice a unei surse de date. Pentru aceasta se utilizeaz metoda RegisterDatabase a obiectului DBEngine. Function RegisterDB() As Boolean Dim str As String On Error GoTo Err_RegisterDB ' construirea irului de cuvinte cheie str = " Description=SQL Server on Server Publishers" & _ vbCR & "OemToAnsi=No" & _ vbCR & "Network=(Default)" & _ vbCR & "Address=(Default)" & _ vbCR & Server=Publishers" & _ vbCR & "Database=Pubs" ' nregistrarea bazei de date DBEngine.RegisterDatabase "Pubs", "SQL Server", True, str RegisterDB = True Exit_RegisterDB: Exit Function Err_RegisterDB: MsgBox "Error " & Err &": " & Err.Description RegisterDB = False Resume Exit_RegisterDB End Function Metoda RegisterDatabase completeaz informa ia de conectare necesar la deschiderea sursei de date ODBC. Sintaxa metodei este DBEngine.RegisterDatabase dbname, driver, silent, attributes unde dbname este numele bazei de date, driver este numele driverului ODBC, silent este True dac se nu dorete afiarea dialogului driverului pentru fixarea atributelor, attributes con ine irul atributelor care se trec n Windows Registry.

186

Utilizarea DAO cu ODBCDirect

Modelul de obiecte pentru spa iul ODBCDirect include un subset de obiecte din spa iul Microsoft Jet la care se adaug un obiect nou, Connection i clasa corespunztoare. Diagrama urmtoare arat ierarhia de obiecte a spa iului de lucru ODBCDirect. Obiectul DBEngine DBEngine con ine att spa iile de lucru Jet, ct i spa iile de lucru ODBCDirect. Proprietatea DefaultType a obiectului determin tipul spa iului creat n mod implicit la utilizarea metodei CreateWorkspace. Dup cum s-a mai precizat, la spa iile Microsoft Jet, valoarea dbUseODBC caracterizeaz spa iile ODBCDirect. Argumentul implicit poate fi acoperit prin specificarea explicit a argumentului type la aplicarea metodei CreateWorkspace. Observa ie. Dac programarea este efectuat in Microsoft Access, atunci nu se va specifica Proprietatea DefaultType la valoarea dbUseODBC deoarece poate produce rezultate neateptate (Access utilizeaz DAO i Jet pentru multiple opera iuni). Instruc iunile urmtoare creeaz un spa iu ODBCDirect: Dim wrkODBC As Workspace Set wrkODBC = DBEngine.CreateWorkspace _ ("NewODBCwrk", "Admin", "", dbUseODBC) Tipul spa iului de lucru poate fi identificat prin proprietatea Type a obiectului Workspace. Este returnat una dintre valorile dbUseJet sau dbUseODBC, proprietatea fiind read-only, adicnu se poate modifica tipul spa iului de lucru odat creat. Colec ia Workspaces n acest model, fr a specifica de fiecare dat, un obiect Workspace reprezint un spa iu de lucru ODBCDirect, iar colec ia Workspaces con ine mul imea tuturor spa iilor ODBC active. Situarea n ierarhie este dat n tabelul urmtor. Obiectul sau colec ia Workspace (obiect) Workspaces (colec ie) Con inut n Colec ia Workspaces Obiectul DBEngine Con ine Colec ia Connections Colec ia Databases / Colec ia Properties Obiecte Workspace

187

Un spa iu de lucru ODBCDirect ruteaz, n cazul utilizrii ODBC, apelurile direct la ODBC API spre deosebire de spa iul Microsoft Jet, care ruteaz mai nti apelurile la motorul de baze de date Jet i pe urm la ODBC API. Referirea la un spa iu de lucru se efectueaz n mod uzual, prin intermediul colec iei: DBEngine.Workspaces(index) DBEngine.Workspaces("name") DBEngine.Workspaces![name] Principalele propriet i i metode utilizabile sunt Name, UserName i Type (propriet i) pentru stabilirea/aflarea propriet ilor unei sesiuni. Metoda Close pentru terminarea sesiunii. Metoda OpenDatabase pentru a deschide o baz de date. Metodele BeginTrans, CommitTrans i Rollback pentru conducerea tranzac iilor.

Alte propriet i sunt prezentate n continuare. Colec ia Connections Dup crearea unui spa iu ODBCDirect, trebuie s se conecteze la o surs de date ODBC. Conectarea se poate efectua prin deschiderea unei baze de date (metoda OpenDatabase, prezentat ulterior) sau prin deschiderea unui nou obiect Connection. Un obiect Connection reprezint o conectare la o baz de date ODBC din spa iul ODBCDirect. Colec ia Connections con ine toate obiectele Connection deschise curent. La deschiderea unui nou obiect Connection, acesta este adugat n mod automat la colec ie. Analog, nchiderea unui obiect prin metoda Close elimin din colec ie obiectul Connection nchis. Avantajele utilizrii obiectului Connection sunt o o o Conectare asincron. Opera iunea de conectare se desfoar n paralel cu alte opera iuni i poate fi verificat dac s-a efectuat. Interogare asincron. Similar celor anterior spuse, dar pentru interogri. Obiecte QueryDef. Se pot defini obiecte QueryDef care reprezint interogrile din sursa de date ODBC.

Pentru a crea un obiect Connection se utilizeaz metoda OpenConnection, cu sintaxa Set connection = workspace.OpenConnection (name, options, readonly, connect) unde connection este numele noului obiect, workspace este numele unui obiect Workspace de tip ODBCDirect din care se efectueaz conectarea, name este numele unei surse de date nregistrate. Obiectul Connection creat poate fi referit prin numele sursei (DSN) sau prin indexul din colec ie,

188

options determin dac i cnd s fie ntrebat utilizatorul la stabilirea conexiunii i dac aceasta este asincron; valorile se vor studia din Help - OpenConnection method, readonly permite controlul actualizrii datelor: True pentru a interzice modificarea datelor. connect este un ir de conectare valid care con ine parametrii necesari driverului ODBC. Argumentul poate con ine numele utilizatorului, parola etc. irul de conectare trebuie s nceap cu "ODBC;" i s con in o serie de valori necesare driverului pentru a accesa datele sursei. Componentele irului difer dup sursa de date. n mod uzual cerin ele minime sunt ID-ul utilizatorului, parola i DSN, dup modelul: ODBC;UID=JamesK;PWD=OpenSesame;DSN=MasterData Dac irul de conectare nu con ine toate elementele necesare, driverul ODBC afieaz un dialog pentru ob inerea informa iilor lips. Dialogul nu este afiat dac irul de conectare este completat cu informa iile necesare. Observa ie. La conectarea la o baz de date Microsoft SQL Server care utilizeaz securitatea integrat se vor omite parametrii UID i PWD deoarece se utilizeaz numele utilizator i parola din Windows NT. De exemplu, irul de conectare poate fi ODBC;UID=;PWD=;DATABASE=Pubs;DSN=Pubs Exemplul urmtor ilustreaz utilizarea metodei OpenConection pentru a deschide un nou obiect Connection. Function OpenPubsConnection() As Boolean Dim wrk As Workspace, cnn As Connection, rst As Recordset, fld As Field Dim strConnect As String, strSQL As String On Error GoTo Err_OpenPubsConnection ' Crearea irului de conectare strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" ' Crearea irului SQL strSQL = SELECT * FROM Authors WHERE State = 'MD';" ' Crearea spa iului de lucru ODBC Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) ' Deschiderea conexiunii Set cnn = wrk.OpenConnection("Pubs", dbDriverNoPrompt, False, strConnect) ' Deschiderea recordsetului din conexiune Set rst = cnn.OpenRecordset(strSQL,dbOpenDynaset) ' Tiprirea valorilor din recordset Do Until rst.EOF For Each fld In rst.Fields Debug.Print fld.Name, fld.Value Next fld Debug.Print rst.MoveNext Loop OpenPubsConnection = True Exit_OpenPubsConnection: rst.Close cnn.Close Exit Function

189

Err_ OpenPubsConnection: MsgBox "Error " & Err & ": " & Err.Description OpenPubsConnection = False Resume Err_ OpenPubsConnection End Function Dup crearea obiectului Connection, se pot deschide obiecte Recordset i executa interogri pe obiectul Connection. La deschiderea unui obiect Connection, este creat un obiect Database corespunztor i adugat colec iei Databases din spa iul de lucru. Reciproc, la deschiderea unei baze de date n spa iul ODBCDirect este creat un obiect Connection i adugat colec iei Connections. nchiderea oricrui obiect din perechea Connection, Database produce i nchiderea celuilalt obiect. Observa ie. Ca i la Database, se vor nchide mai nti toate obiectele Recordset deschise. Deschiderea conectrilor asincrone Acest tip de conectare, necesar mai ales cnd conectarea dureaz mai mult, timp n care se pot efectua alte opera iuni, este specificat prin constanta dbRunAsync dat argumentului options al metodei OpenConnection. Dim wrk As Workspace, cnn As Connection, strConnect As String Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) strConnect = "ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set cnn = wrk.OpenConnection("",dbDriverNoPrompt + dbRunAsync, False, strConnect) Proprietatea StillExecuting a obiectului Connection poate fi testat pentru a determina stabilirea conexiunii. Pentru a anula o conectare care ia prea mult timp se utilizeaz metoda Cancel a obiectului. Colec ia Databases Se poate utiliza metoda OpenDatabase a obiectului Workspace pentru a deschide o baz de date i conectarea astfel la o sursde date ODBC. Totui, obiectul Database nu suport n spa iul de lucru ODBCDirect toate func iunile pe care le ofer obiectul Connection. n special, nu se poate efectua conectarea asincron, executa interogri asincrone sau defini obiecte QueryDef reprezentnd interogri ale sursei de date. Pentru conectarea la o surs ODBC prin OpenDatabase dintr-un spa iu de lucru ODBCDirect se va specifica un ir de conectare valid n argumentul connect al metodei, dup exemplul urmtor. Dim wrk As Workspace, dbs As Database Dim strConnect As String strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set wrk = DBEngine.CreateWorkspace("NewODBCDirect", "sa", "", dbUseODBC) Set dbs = wrk.OpenDatabase("Pubs", dbDriverNoPrompt, False, strConnect) Pentru argumentele metodei se va studia Help - OpenDatabase method (DAO). Dintre metodele i propriet ile obiectului Database, men ionm doar cteva. metoda Execute pentru a efectua o interogare de tip ac iune (action query o interogare care copie sau schimb date; sunt incluse adugare, tergere, actualizare, n opozi ie cu o interogare de tip selectare care returneaz o mul ime de nregistrri).

190

Proprietatea Connect stabilete o conectare la o surs de date ODBC. Proprietatea QueryTimeout pentru limitarea duratei de timp n care se execut o interogare. Proprietatea RecordsAffected pentru a determina numrul nregistrrilor modificate ntr-o interogare ac iune. Metoda OpenRecordset pentru executarea unei interogri de tip selectare i crearea unui obiect Recordset. Proprietatea Version permite determinarea versiunii motorului de baze de date care a creat baza.

Comutarea ntre obiectele Connection i Database Pentru a utiliza avantajele fiecrui tip de conectare la o surs ODBC, se poate trece de la un obiect la altul prin proprietatea Connection a obiectului Database sau prin proprietatea Database a obiectului Connection. Aceste propriet i pot fi folosite pentru a crea obiecte Connection din obiecte Database i, reciproc, obiecte Database din obiecte Connection. Se pot astfel aduga capacit i ODBCDirect la aplica ii care utilizeaz doar obiecte Database. De exemplu, se poate utiliza un obiect Database pentru opera iunile uzuale, dar dac este nevoie de o interogare asincron, atunci se poate crea un obiect Connection din obiectul Database i executa apoi interogarea din Connection. Exemplul urmtor ilustreaz aceast metod. Sub DeleteRecords() Dim dbs As Database, strConnect As String Dim cnn As Connection ' Deschiderea bazei de date n spa iul de lucru implicit strConnect = ""ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set dbs = OpenDatabase("", False, False, strConnect) ' crearea unui obiect Connection din Database. ' Dac spa iul de lucru este ODBCDirect, atunci interogarea se execut asincron ' Dac spa iul de lucru este Microsoft Jet, apare o eroare i ' interogarea se execut sincron. Err = 0 On Error Resume Next Set cnn = dbs.Connection If Err = 0 Then cnn.Execute "DELETE FROM Authors", dbRunAsync Else dbs.Execute "DELETE FROM Authors" End If End Sub Colec ia QueryDefs Un obiect QueryDef reprezint o defini ie temporar a unei interogri din spa iul ODBCDirect. Colec ia QueryDefs con ine toate interogrile existente curent n spa iul de lucru. Situarea n ierarhia de obiecte este dat n tabelul urmtor. Obiectul sau colec ia QueryDef (obiect) QueryDefs (colec ie) Con inut n Colec ia QueryDefs Obiectul Connection Con ine Colec ia Parameters Colec ia Properties Obiecte QueryDef

191

Obiectele QueryDef create n spa iile de lucru ODBCDirect sunt ntotdeauna temporare. Ele nu pot fi salvate n sursa de date chiar dac li se atribuie un nume. Executarea interogrilor asincrone Crearea i executarea interogrilor n spa iile ODBCDirect sunt similare cu crearea i executarea din spa iile de lucru Microsoft Jet. Interogarea se creeaz prin metoda CreateQueryDef a obiectului Connection i utilizarea metodelor Execute sau OpenRecordset pentru interogarea rezultat. Se pot utiliza interogri asincrone nct utilizatorii s continue aplica ia n timp ce se execut interogarea i se poate da utilizatorilor posibilitatea de a anula o interogare asincron n cazul n care dureaz prea mult. Exemplul urmtor poate constitui un model. Function DeleteLargeSales () As Boolean Dim wrk As Workspace, rst As Recordset Dim cnn As Connection, qdf As QueryDef Dim strConnect As String, strSQL As String Dim errObj As Error On Error GoTo Err_DeleteLargeSales ' crearea spa iului de lucru Set wrk = DBEngine.CreateWorkspace("ODBC","sa", "", dbUseODBC) ' crearea irului de conectare strConnect = ""ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs" ' deschiderea conexiunii Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' tergerea unei interogri 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 interogrii qdf.Execute dbRunAsync While qdf.StillExecuting ' cod care se va executa pn cnd se termin interogarea ' Se verific proprietatea StillExecuting pentru a detecta terminarea Wend DeleteLargeSales = True Exit_DeleteLargeSales: cnn.Close wrk.Close Exit Function Err_DeleteLargeSales:

192

For Each errObj In Errors Debug.Print errObj.Number, errObj.Description Next errObj DeleteLargeSales = False Resume Exit_DeleteLargeSales End Function Exemplul urmtor utilizeaz metoda Execute direct pe obiectul Connection (i nu obiectul QueryDef ca n exemplul anterior). Dim cnn As Connection, strConnect As String strConnect = "ODBC;DSN=Publishers;UID=SA;PWD=;DATABASE=Pubs" Set cnn = OpenConnection("", dbDriveNotPrompt, False, strConnect) cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync cnn.Close La executarea unei interogri asincrone aceasta se poate anula prin testarea metodei StillExecuting. Exemplul urmtor con ine o asemenea tehnic. Function CancelAsyncQuery() As Boolean Dim wrk As Workspace, cnn As Connection, strConnect As String Dim errObj As Error On Error GoTo Err_CancelAsyncQuery Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC) strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' Pornirea unei tranzac ii pentru a putea reface dac este necesar wrk.BeginTrans cnn.Execute "DELETE FROM sales WHERE qty = 100", dbRunAsync ' Executarea altor opera iuni ' dac interogarea nu s-a terminat, anuleaz i reface If cnn.StillExecuting Then cnn.Cancel wrk.Rollback ' dac interogarea s-a terminat, ncheierea tranzac iei Else wrk.CommitTrans End If CancelAsyncQuery = True Exit_CancelAsyncQuery: cnn.Close wrk.Close Exit Function Err_CancelAsyncQuery: For Each errObj In Errors Debug.Print errObj.Number, errObj.Description Next errObj CancelAsyncQuery = False Resume Exit_CancelAsyncQuery End Function

193

Proprietatea StillExecuting i metoda Cancel pot fi utilizate mpreun cu obiectele QueryDef, Connection i Recordset. Un obiect Connection suport o singur opera iune asincron la un moment dat. n timpul executrii unei interogri asincrone pe o conexiune nu se mai pot executa i alte opera iuni DAO, cum ar fi procesarea unui recordset. Pentru a executa interogri asincrone multiple n acelai timp se vor crea obiecte Connection separate i se va executa fiecare interogare asincron pe un obiect Connection diferit. Dac se folosete tehnica tranzac iilor simultan cu interogrile asincrone, aplicarea metodei CommitTrans poate opri execu ia pn cnd se termin interogarea. Din acest motiv se va verifica StillExecuting periodic i se va termina tranzac ia doar dup ce inteorgarea s-a ncheiat (StillExecuting returneaz False) sau a fost anulat. Dac o interogare de tip ac iune este anulat n afara unei tranzac ii, atunci actualizarea nregistrrilor s-a efectuat doar pn n momentul activrii metodei Cancel i opera iunea nu poate fi refcut prin Rollback. Pentru a nu permite opera iuni par iale de acest tip, metoda Cancel se va utiliza doar n interiorul unei tranzac ii. n plus, dac interogarea asincron este ini iat ntr-o procedur i procedura este prsit nainte de terminarea interogrii, aceasta va continua s se execute. Pentru a mbunt i performan a la regsirea datelor dintr-o surs ODBC se poate utiliza stocarea local a nregistrrilor. Valoarea dat n proprietatea CacheSize a obiectului QueryDef specific numrul de nregistrri stocate. n mod implicit se stocheaz 100 de nregistrri. Sub SetCacheSize() Dim wrk As Workspace, qdf As QueryDef, rst As Recordset Dim cnn As Connection, strConnect As String Set wrk = CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC) Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) strConnect ="ODBC;DSN=Pubs;UID=sa;PWD=;DATABASE=Pubs" Set qdf = cnn.CreateQueryDef("temporary") qdf.SQL = "SELECT * FROM roysched" qdf.CacheSize = 200 Set rst = qdf.OpenRecordset() ' executarea opera iunilor necesare pe recordset rst.Close cnn.Close End Sub Colec ia Parameters Printr-un obiect Parameter se reprezint un parametru transmis unei interogri (dac este cazul) sau unei proceduri memorate pe server. Utilizarea parametrilor permite o mai mare flexibilitate a interogrilor, care nu mai trebuiesc recompilate la fiecare modificare a parametrilor cutrii. Un obiect Parameter din spa iul ODBCDirect este similar, cu mici diferen e, unui obiect Parameter din spa iul Microsoft Jet. n ODBCDirect se poate schimba valoarea propriet ii Type (read-only n spa iul Jet). De asemenea se poate utiliza proprietatea Direction pentru a indica dac un parametru este de intrare, de ieire, ambele sau valoarea returnat de o procedur (a se vedea n Help - Direction Property). Colec ia Recordsets Un obiect Recordset reprezint nregistrrile care rezult din executarea unei interogri pe un obiect Connection sau un obiect Database, ntr-un spa iu de lucru ODBCDirect. Colec ia Recordsets con ine toate obiectele Recordset deschise curent. Situarea n ierarhia de obiecte este prezentat n tabelul urmtor

194

Obiectul sau colec ia Recordset (obiect) Recordsets (colec ie)

Con inut n Colec ia Recordsets Obiectul Connection Obiect Database

Con ine Colec ia Fields Colec ia Properties Obiecte Recordset

Obiectele Recordset suportate n spa iul de lucru ODBCDirect sunt de tipurile: dynaset, snapshot, forward-only i dinamic. Cu excep ia ultimului tip, toate celelalte tipuri de obiecte Recordset au fost prezentate la spa iul de lucru Microsoft Jet. Obiecte Recordset de tip dinamic Un obiect Recordset de tip dinamic este similar unui obiect de tip dynaset, dar este actualizat n mod dinamic, pe msur ce al i utilizatori execut modificri n tabela de baz. Pentru a crea un obiect Recordset de tip dinamic se va specifica valoarea dbOpenDynamic pentru argumentul type al metodei OpenRecordset. Recordseturile de tip dinamic sunt disponibile doar pentru acele drivere ODBC care ofer propriile cursoare. nainte de deschiderea unui Recordset dinamic trebuie s se asigure c driverul ODBC suport acest lucru. Pentru driverele care nu ofer cursoare proprii, deci nu suport recordseturi dinamice, se vor deschide obiecte Recordset de tip snapshot sau forward-only. Avantajul utilizrii obiectelor Recordset de tip dinamic este reflectarea imediat a tuturor schimbrilor din date, inclusiv nregistrrile adugate sau terse. Pentru a realiza acest lucru este ns necesar ca DAO s interogheze mereu tabelele de baz, ceea ce se traduce prin performan redus ca vitez. Acest tip se recomand, prin urmare, doar pentru situa ii unde este esen ial s se dispun de cele mai recente actualizri ale datelor. Deschiderea asincron a obiectelor Recordset Pentru a deschide un Recordset n mod asincron, similar interogrilor din spa iile ODBCDirect, se utilizeaz constanta dbRunAsync ca valoare a argumentului options pentru metoda OpenRecordset. Se pot astfel utiliza metoda Cancel i proprietatea StillExecuting direct pe obiectul Recordset. De exemplu, la deschiderea unui Recordset care dureaz foarte mult deoarece returneaz un mare numr de nregistrri, utilizatorul poate fi lsat s anuleze opera iunea pentru a specifica criterii mai restrictive de formare a obiectului. La anularea (prin Cancel) a unei metode OpenRecordset, obiectul Recordset devine nevalabil i trebuie redeschis pentru a regsi un obiect Recordset corect. Pentru cazul obiectelor Recordset cu multe nregistrri este util aplicarea metodei MoveLast n mod asincron. Acest fapt se realizeaz utiliznd argumentul dbRunAsync cu metoda, sub forma recordset.MoveLast dbRunAsync n continuare se poate testa proprietatea StillExecuting (a obiectului Recordset) i aplica metoda Cancel. Colec ia Fields n spa iul de lucru ODBCDirect, un obiect Field reprezint un cmp dintr-un obiect QueryDef sau obiect Recordset. Anumite procesri sunt enumerate n continuare.

195

Proprietatea OrdinalPosition este utilizat pentru determinarea ordinii obiectului Field n colec ia Fields. Proprietatea Value fixeaz sau returneaz data memorat n cmp. Metodele AppendChunk, GetChunk i proprietatea FieldSize returneaz sau fixeaz o valoare dintr-un obiect OLE sau cmp memo a unui obiect Recordset. Propriet ile Type, Size i Attributes determin tipul datelorcare pot fi memorate ntr-un cmp. Propriet ile SourceField i SourceTable determin sursa original a datelor. Propriet ile Value, VisibleValue i OriginalValue sunt utilizate pentru verificarea completrii cu succes a unei actualizri n loturi (problema este discutat i n continuare).

Utilizarea ODBCDirect n aceast sec iune sunt prezentate cteva opera iuni uzuale ntr-un spa iul de lucru ODBCDirect: actualizarea optimist n loturi, lucrul cu cursoare, lucrul cu proceduri memorate. Utilizarea actualizrii optimiste n loturi n multe aplica ii client-server, actualizrile optimiste apar pe principiul "nregistrare cu nregistrare". Aceasta se ntmpl n mod uzual n modul o o o o Un utilizator editeaz o nregistrare. Utilizatorul vrea s salveze nregistrarea. Serverul ncearc s blocheze aceast nregistrare; dac reuete, nregistrarea este actualizat, n caz contrar o violare a blocrii este tratat de ctre aplica ie. Utilizatorul se mut la alt nregistrare i procesul se reia.

Dei acest mod de operare func ioneaz bine n multe cazuri, este uneori mai eficient ca utilizatorul s editeze mai multe nregistrri care sunt stocate local i abia apoi s le trimit serverului ntr-un singur lot pentru actualizare. Metoda se numete actualizare optimist n loturi (batch optimistic updating) i presupune etapele: o o o o o o Crearea unui spa iu ODBCDirect Stabilirea propriet ii DefaultCursorDriver, a spa iului de lucru, la valoare dbUseClientBatchCursor. Deschiderea unui obiect Connection sau Database din spa iul ODBCDirect. Utilizarea metodei OpenRecordset pentru obiectul deschis n pasul precedent cu scopul de a deschide un Recordset i specificarea constantei dbOptimisticBatch ca valoarea a argumentului lockedits. Efectuarea editrilor necesare n obiectul Recordset. Toate editrile sunt memorate local. La terminare, actualizarea sursei de date se efectueaz prin metoda Update a obiectului Recordset, cu specificarea valorii dbUpdateBatch pentru argumentul type.

Observa ie. Dac se lanseaz (programatic) o actualizare n lot n timp ce o nregistrare din obiectul Recordset este editat de utilizator, nregistrarea care se editeaz va fi actualizat n mod automat nainte de nceperea actualizrii n lot. Exemplul urmtor ilustreaz modul de utilizare a actualizrii n lot. Function RunInBatch() Dim wrk As Workspace, cnn As Connection, rst As Recordset Dim strConnect As String ' crearea spa iului de lucru Set wrk = DBEngine.CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC) ' stabilirea driverului de cursor implicit wrk.DefaultCursorDriver = dbUseClientBatchCursor ' crearea irului de conectare strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UID=sa;PWD=;"

196

' deschiderea conexiunii Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' deschiderea recordsetului din conexiune Set rst = cnn.OpenRecordset( _ "SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch) ' schimbarea nregistrrilor n recordsetul local While Not rst.EOF rst.Edit rst!qty = rst!qty + 1 rst.Update rst.MoveNext Wend ' actualizarea nregistrrilor n sursa de date rst.Update dbUpdateBatch End Function Dac mai multe nregistrri au fost editate local i se dorete ca nregistrarea curent s fie actualizat naintea actualizrii n lot, se poate apela metoda Update i specifica dbUpdateCurrentRecord pentru argumentul type. n acest mod se scrie nregistrarea curent n sursa de date fr a se efectua alt actualizare, exemplul urmtor ilustraz metoda. ' Editarea i actualizarea primei nregistrri ' Doar prima nregistrare este scris n sursa de date rst.MoveFirst rst.Edit rst!qty = rst!qty + 2 rst.Update dbUpdateCurrentRecord ' actualizarea restului de nregistrri rst.Update dbUpdateBatch Tratarea coliziunilor La ncercarea de actualizare a unui grup de nregistrri ntr-un singur lot, este posibil ca al i utilizatori s editeze n acelai timp una sau mai multe nregistrri din lot, producnd astfel o coliziune. Pentru tratarea coliziunilor se va examina proprietatea BatchCollisions a obiectului Recordset. Proprietatea BatchCollisions returneaz un tablou care memoreaz bookmark-uri punctnd ctre nregistrrile din obiectul Recordset pentru care au aprut coliziuni. De fiecare dat cnd apare o coliziune n timpul actualizrii n lot, este adugat la tablou un pointer ctre registrarea pentru care apare coliziunea. Se poate parcurge fiecare asemenea bookmark i examina urmtoarele propriet ii ale obiectului Field al nregistrrii curente. Proprietatea Value OriginalValue VisibleValue Descriere Valoarea curent a cmpului din Recordset. Aceasta corespunde valorii cmpului dup apelul metodei Update. Valoarea cmpului din obiectul Recordset nainte de apelul metodei Update. Valoarea cmpului dup cum este memorat n baza de date.

Dup examinarea propriet ilor se poate alege o op iune dintre:

197

Se poate for a scrierea n baza de date a valorii curente din obiectul Recordset, suprascriind valoarea original a cmpului. Pentru aceasta se apeleaz metoda Update i specifica True pentru argumentul force. Se poate schimba valoarea curent din obiectul propriu Recordset la valoarea original i for a schimbarea n baza de date.

Observa ie. Apelul metodei Update cu dbUpdateBatch ca argument type i True ca argument force produce trecerea n baz a tuturor modificrilor proprii i suprascrierea modificrilor efectuate de al i utilizatori. Din acest motiv este mai sigur apelul metodei Update fr for are i rezolvarea ulterioar a coliziunilor prin folosirea tabloului returnat de proprietatea BatchCollisions mpreun cu Value, OriginalValue i VisibleValue. Urmtorul exemplu arat utilizarea tabloului returnat de proprietatea BatchCollision n for area n baza de date a modificrilor din obiectul Recordset local. Function BatchForceChanges() Dim rst As Recordset, cnn As Connection, varCollision As Variant ' deschiderea recordsetului pentru actualizarea optimist n lot Set rst = cnn.OpenRecordset("SELECT * FROM sales", _ dbOpenDynaset, 0, dbOptimisticBatch) ' modificarea nregistrrilor din recordsetul local While Not rst.EOF rst.Edit rst!qty = rst!qty + 1 rst.Update rst.MoveNext Wend rst.Update dbUpdateBatch ' verificarea coliziunilor i for area modificrilor For j = 0 to rst.BatchCollisionCount - 1 varCollision = rst.BatchCollision(j) rst.BookMark = varCollision rst.Update dbUpdateCurrentRecord, True Next j End Function Exemplul urmtor poate fi modificat astfel nct actualizarea nregistrrilor cu coliziuni s nu se desfoare una cte una, dei metoda de for are global nu este tocmai indicat. ' deschidere recordset Set rst = _ cnn.OpenRecordset(("SELECT * FROM sales", dbOpenDynaset, 0, dbOptimisticBatch) ' modificare nregistrrilor While Not rst.EOF rst.Edit rst!qty = rst!qty + 1 rst.Update rst.MoveNext Wend rst.Update dbUpdateBatch, True

198

Utilizarea cursoarelor n spa iile ODBCDirect Un cursor indic pozi ia nregistrrii curente dintr-o mul ime rezultat. Majoritatea tipurilor de cursoare con in o reprezentare a datelor din sursa de date i nu sunt actualizabile. Numim keyset un cursor care con ine date efective i care sunt actualizabile. Cu un cursor se lucreaz prin intermediul unui obiect DAO Recordset. La deschiderea unui obiect Recordset prin DAO, ODBCDirect creeaz cursorul corespunztor. Fiecare tip de obiect Recordset, cu excep ia celui de tip tabel, corespunde unui tip diferit de cursor. Caracteristicile cursoarelor Se pot utiliza cursoare pentru a lucra cu mul imi de date dintr-o surs ODBC. Cursoarele pot: o o o o o o S reprezinte anumite nregistrri sau toate nregistrrile unei tabele S reprezinte anumite nregistrri sau toate nregistrrile unei uniuni de tabele S nu reprezinte nici o nregistrare S fie read-only sau actualizabile fie la cursor sau la nivel de cmp S fie complet navigabile sau doar nainte S existe fie la client, fie pe server.

Cursoare pe partea client sau pe partea server Un cursor necesit resurse temporare pentru a-i pstra datele. Aceste resurse pot fi n forma RAM, un fiier paginabil cum ar fi memoria virtual din Windows, sau fiiere/baze de date temporare. Dac resursele sunt memorate pe maina clientului, cursorul este numit cursor client-side. Cu acest tip de cursor, serverul trimite datele reprezentnd cursorul prin re ea ctre client, ca i datele cerute de cursor. Clientul gestioneaz resursele temporare necesare. Anumite motoare de baze de date, cum ar fi Microsoft SQL Server 6.0, suport i cursoare de tip server-side. Cu acest tip de cursor, serverul gestioneaz mul imea de nregistrri rezultate cu resurse de pe server. Serverul returneaz prin re ea doar datele cerute de client. Utilizarea acestui tip de cursor poate crete performan a aplica iei, mai ales atunci traficul de re ea este mare, dar apare condi ia ca serverul s poat oferi resursele necesare tuturor cursoarelor cerute de clien i. Alegerea tipului de cursor La deschiderea unui obiect Recordset pe o surs de date care nu este ODBC, constanta utilizat pentru argumentul type al metodei OpenRecordset determin tipul de recordset deschis. La deschiderea unui Recordset pe o surs ODBC, acelai argument, type, specific tipul de cursor pe care l reprezint obiectul Recordset. Fiecare tip de cursor corespunde unui tip de recordset. Urmtorul tabel arat efectul valorilor argumentului type att pentru surse de date ODBC, ct i pentru surse non-ODBC. Constanta (argumentul type) dbOpenDinamic dbOpenDynaset dbOpenSnapshot dbOpenForwardOnly Recordset type (surse non-ODBC) Dynamic type Dynaset type Snapshot type Forward-only type Cursor type (surse de date ODBC) Dynamic Keyset Static Forward-only scrolling (valoarea implicit)

199

Observa ie. Cum obiecte Recordset de tip tabel nu exist n spa iile de lucru ODBCDirect, nu exist cursor corespunztor acestui tip de recordset. Proprietatea DefaultCursorDriver a obiectului Workspace specific unde este creat cursorul la client sau pe server. Valorile posibile pentru proprietate sunt date n tabelul alturat. Constanta (proprietatea DefaultCursorDriver) dbUseODBCCursor dbUserServerCursor dbUseDefaultCursor dbUseClientBatchCursor dbUseNoCursor Descriere

Utilizare cursoare la client. Rezultate bune pentru mul imi mici de nregistrri rezultate. Utilizare cursoare pe server. Performan mai bun pentru multe nregistrri dar poate duce la mrirea traficului de re ea, nu toate sursele ODBC suport aceast valoare. Utilizare cursoare pe server, dac este posibil; cursoare client n caz contrar. Utilizarea cursoarelor lor la client. Cerut la actualizrile n loturi. Deschidere obiect Recordset ca forward-only, read-only, cu rowset = 1.

Blocarea nregistrrilor (Record Locking) La deschiderea unui obiect Recordset se poate specifica i tipul de blocaj al nregistrrilor inten ionat n cazul actualizrilor. Pentru aceasta se utilizeaz argumentul lockedits al metodei OpenRecordset. Urmtorul tabel con ine explica ii pentru tipurile posibile de blocaj i valorile corespunztoare ale argumentului lockedits. Constanta (argumentul lockedits) dbOptimistic dbPessimistic dbOptimisticValue dbOptimisticBatch dbReadOnly Descrierea tipului de blocaj al cursorului ODBC Pagina con innd nregistrarea este blocat doar att timp ct nregistrarea este actualizat prin metoda Update. Pagina cu nregistrarea este blocat ct mai devreme, de la utilizarea metodei Edit. Utilizarea concuren ei optimiste bazat pe valorile nregistrrilor. Utilizarea actualizrii optimiste n lot. Implicit pentru spa iile ODBCDirect, interzice modificri n datele obiectului Recordset.

Anumite combina ii de tipuri de cursoare i de blocaj nu func ioneaz mpreun. De exemplu, cu cursoarele Microsoft SQL Server 6.0, specificarea dbOpenSnapshot pentru argumentul type cere specificarea dbReadOnly pentru lockedits. Combina iile care merg se vor vedea n documenta ia driverului cursorului. Utilizarea unei combina ii nesuportate este raportat de DAO n colec ia Errors, de unde poate fi analizat i tratat prin alegerea urmtoarei combina ii plauzibile. Limitri ale cursoarelor Datorit valorilor implicite prezentate n tabelele anterioare, obiectul Recordset implicit este read-only, forward-only i nu poate fi actualizat. Editarea nregistrrilor necesit specificarea explicit a unui tip de blocaj diferit de dbReadOnly la aplicarea metodei OpenRecordset.

200

Deoarece nu se pot deschide recordseturi de tip tabel n spa iul ODBCDirect, nu se pot utiliza proprietatea Index i metoda Seek de regsire a datelor. De asemenea nu se pot utiliza metodele Find: FindFirst, FindNext, FindPrevious sau FindLast. n mediul client/server este mai eficient s se selecteze doar datele necesare i nu mul imi mai vaste din care s se gseasc ulterior nregistrrile necesare. Aceast nseamn c interogrile trebuie efectuate mai atent (mai restrictive). Regsirea unor mul imi multiple de rezultate Orice propozi ie SQL poate include mai multe propozi ii SELECT sau proceduri memorate care invoc una sau mai multe propozi ii SELECT. Fiecare instruc iune SELECT genereaz o mul ime de rezultate care trebuie s fie procesat de cod sau ignorat mai nainte ca resursele s fie eliberate i urmtoarea mul ime de rezultate s fie disponibil pentru procesare. Deoarece nu se tie a priori cte mul imi de rezultate sunt generate de o procedur memorat, codul trebuie s fie pregtit s prelucreze un numr necunoscut de mul imi. De notat c n cazul returnrii de ctre o procedur memorat a mai multor mul imi de rezultate, nici una dintre acestea nu poate fi actualizat. Se pot utiliza fie cursoare client-side, fie cele server-side pentru regsirea unor multiple mul imi de rezultate. Dac se utilizeaz cursoare client-side, mul imile de rezultate sunt returnate de toate obiectele Recordset. Cursoarele server-side returneaz multiple mul imi de rezultate doar la deschiderea unui Recordset de tip forward-only. Pentru ob inerea mai multor mul imi de rezultate 1. Stabilirea propriet ii DefaultCursorDriver la valoarea dbUseServerCursor pentru specificarea cursoarelor server-side 2. Crearea unui obiect QueryDef i stabilirea propriet ii SQL la un ir valid SQL care returneaz multiple obiecte Recordset. 3. Stabilirea propriet ii CacheSize a obiectului QueryDef la 1 pentru a cere serverului trimiterea unei singure nregistrri o dat. La regsirea nregistrrilor n acest mod nu se utilizeaz efectiv cursorul. 4. Deschiderea obiectului Recordset pe obiectul QueryDef creat. Se d valoarea dbOpenForwardOnly pentru argumentul type al metodei OpenRecordset. 5. Utilizarea metodei NextRecordset pentru a accesa urmtorul obiect Recordset din grupul de obiecte Recordset returnat de server. Aceasta ignoreaz obiectul Recordset curent i l nlocuiete cu urmtorul obiect. Dac nu mai exist obiecte Recordset atunci metoda NextRecordset returneaz valoarea False iar obiectul curent Recordset va fi gol (empty). Exemplul urmtor tiprete valorile pentru fiecare cmp din fiecare nregistrare a fiecrei mul imi de rezultate. Function GetMultipleResults() Dim wrk As Workspace, rst As Recordset, cnn As Connection, qdf As QueryDef Dim fld As Field, strSQL As String, strConnect As String, fDone As Boolean ' creare spa iu ODBCDirect Set wrk = DBEngine.CreateWorkspace(""ODBCDirect", "Admin", "", dbUseODBC) ' creare ir de conectare strConnect = "ODBC;DSN=Pubs;DATABASE=Pubs;UID=sa;PWD=;" ' deschidere conexiune Set cnn = wrk.OpenConnection("", dbDriverNoPrompt, False, strConnect) ' Creare instruc iuni SQL strSQL = "SELECT au_lname, au_fname FROM Authors; SELECT title FROM Titles;" ' stabilirea cursorului implicit wrk.DefaultCursorDriver = dbUseServerCursor ' Deschidere recordset Set qdf = cnn.CreateQueryDef("", strSQL) qdf.CacheSize = 1 ' Deschiderea recordset pentru interogare

201

Ser rst = qdf.OpenRecordset(dbOpenForwardOnly) Do Until fDone = True ' tiprirea 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 necesit parametri de intrare i returneaz valori. Urmtorul exemplu creeaz procedura numit GetEmps, memorat pe server. strSQL = "CREATE PROCEDURE GetEmps AS" strSQL = strSQL & "SELECT * FROM EMPLOYEE;" cnn.Execute strSQL Dac exist dei o procedur cu acest nume, se poate utiliza instruc iunea DROP pentru a terge mai nainte versiunea veche: strSQL = "DROP PROCEDURE GetEmps;" cnn.Execute strSQL Se poate executa procedura memorat utiliznd metoda Execute a obiectului Connection. Pentru a regsi valoarea returnat se creeaz un obiect QueryDef i deschidem un recordset pe el. Set qdf = cnn.CreateQueryDef("qry", "{ call GetEmps() }") Set rst = qdf.OpenRecordset Se utilizeaz obiectul Parameter pentru a lucra cu parametrii. Proprietatea Direction a obiectului Parameter comunic DAO cum func ioneaz parametrul. Driverul ODBC ncearc s determine direc ia parametrului (intrare sau ieire) dar proprietatea Direction este read/write aa c direc ia poate fi schimbat. Urmtorul exemplu creeaz o procedur memorat cu un parametru de intrare i o valoare returnat. Procedura este executat i se regsete valoarea returnat. ' crearea procedurii memorate pe server strSQL = "CREATE PROCEDURE UpdateEmps (@invar int) AS RETURN @invar;" cnn.Execute strSQL ' crearea QueryDef pentru a executa procedura memorat Set qdf = cnn.CreateQueryDef("qry", "{ ? = call UpdateEmps(?) }") ' tratarea parametrilor qdf.Parameters(0).Direction = dbParamReturnValue qdf.Parameters(1) = 10

202

qdf.Execute ' ob inerea valorii returnate var = qdf.Parameters(0).Value Modelul de obiecte PowerPoint n acest capitol se prezint principalele obiecte din modelul de obiecte Microsoft PowerPoint 97. Pentru a vedea o imagine a ntregului model de obiecte PowerPoint ca i enumerrile complete ale propriet ilor i metodelor se vor consulta, totui, intrrile respective din Help. Afiarea sistemului de help Microsoft PowerPoint Visual Basic este posibil dac la instalarea aplica iei PowerPoint s-a selectat instalarea componentei Online Help for Visual Basic. Pentru a vedea con inutul i indexul acestui sistem de fiiere Help, click pe Contents and Index n meniul Help din Visual Basic Editor (VBE), iar n fia Contents din dialogul Help Topics dublu click pe "Microsoft PowerPoint Visual Basic Reference". Obiectul Application La pornirea unei sesiuni PowerPoint, se creeaz un obiect Application. Propriet ile i metodele acestui obiect sunt utilizate pentru controlarea atributelor i comportrii ntregii aplica ii i ob inerea accesului la restul modelului de obiecte PowerPoint. Urmtoarele propriet i pot fi utilizate fr calificatorul Application, constituind accesori la modelul de obiecte: ActivePresentation, ActiveWindow, AddIns, Assistant, CommandBars, Presentations, SlideShowWindows i Windows. Pentru alte propriet i i metode este necesar calificarea. De exemplu: Application.Quit Cele mai utilizate propriet i i metode sunt prezentate, dup func ionalitate, n continuare. Returnarea unui obiect Application Din cod executate n PowerPoint, obiectul Application este referit prin cuvntul cheie Application, ca n exemplul anterior. Dac se atribuie unei variabile obiectul Application, variabila se va declara de tip PowerPoint.Application, dup modelul Dim appPPT As PowerPoint.Application Set appPPT = Application Se poate utiliza de asemenea proprietatea Application a oricrui obiect PowerPoint pentru a returna obiectul Application PowerPoint. Aceast metod este util atunci cnd este necesar s se ob in referin a la obiectul Application dintr-o prezentare PowerPoint scufundat n documentul altei aplica ii. Urmtorul exemplu, executat din Excel, stabilete o variabil la obiectul aplica ie PowerPoint utiliznd primul shape (care trebuie s fie o prezentare PowerPoint) din foaia de calcul. Dim appPPT As PowerPoint.Application Set embeddedPres = Worksheets(1).Shapes(1) embeddedPres.OLEFormat.Activate Set appPPT = embeddedPres.OleFormat.Object. Application

203

Urmtorul exemplu creeaz un obiect Application PowerPoint din alt aplica ie, pornete PowerPoint i deschide o prezentare existent: Set ppt = CreateObject("Powerpoint.Application.8") ppt.Visible = True ppt.Presentations.Open "numele prezentrii, eventual cu cale" Controlul aspectului ferestrei aplica iei Un rezumat al propriet ilor i metodelor care controleaz aspectul ferestrei n care se execut PowerPoint este prezentat n tabelul urmtor. Ac iunea Activarea ferestrei aplica iei PowerPoint Verificarea faptului c fereastra aplica iei PowerPoint este activ Stabilirea sau returnarea textului care apare n bara de titlu a aplica iei PowerPoint Stabilirea sau returnarea mrimii i pozi iei ferestrei PowerPoint pe ecran Stabilirea sau returnarea vizibilit ii ferestrei aplica iei. Trebuie dat valoarea True la crearea obiectului Application PowerPoint n alt aplica ie pentru a vedea PowerPoint pe ecran. Stabilirea sau returnarea strii ferestrei aplica iei: maximizat, minimizat sau flotant. Proprietatea sau metoda util Metoda Activate Proprietatea Active Proprietatea Caption Propriet ile Height, Left, Top i Width Proprietatea Visible

Proprietatea WindowsState

Multe dintre aceste propriet i i metode se aplic, de asemenea, obiectului DocumentWindow pentru controlarea aspectului ferestrei documentului. Controlarea atributelor i comportrii globale a aplica iei Atributele sau ac iunile caracteristice pentru ntreaga aplica ie PowerPoint sunt controlate prin propriet ile i metodele prezentate n tabelul urmtor. Ac iunea Numele imprimantei active Returnarea numrului de construc ie PowerPoint Afiarea unui subiect de Help Returnarea numelui sistemului de operare Returnarea cii ctre aplica ia PowerPoint Prsirea (nchiderea) aplica iei PowerPoint Proprietatea sau metoda util Proprietatea ActivePrinter Proprietatea Build Metoda Help Proprietatea OperatingSystem Proprietatea Path Metoda Quit

204

Executarea unei proceduri Visual Basic Returnarea numrului de versiune Accesarea principalelor obiecte ale aplica iei

Metoda Run Proprietatea Version

Propriet ile enumerate n tabelul urmtor dau acces la principalele obiecte con inute n obiectul Application: prezentri, ferestre ale documentului, ferestre de vizualizare a diapozitivelor. Toate propriet ile sunt ale obiectului Application. Obiectul returnat Presentations (colec ie) Prezentarea activ DocumentWindows (colec ie) Fereastra documentului activ AddIns (colec ie) SlideShowWindows (colec ie) Accesarea obiectelor partajate de Microsoft Office Ob inerea referin elor de obiecte comune tuturor aplica iilor Microsoft Office, cum ar fi barele de meniuri i de unelte, FileSearch etc., este rezumat n tabelul urmtor. Referin la Office Assistant Meniuri i bare de unelte PowerPoint Cutarea fiierelor Editorul Visual Basic Obiectul Presentation Se creeaz un obiect Presentation de fiecare dat cnd se deschide sau se creeaz un fiier (o prezentare) n PowerPoint. Se va observa c multe dintre propriet ile i metodele obiectului Presentation corespund intrrilor din meniul File. Propriet ile i metodele obiectului Presentation, sau ale colec iei respective, sunt utilizate pentru a deschide, crea, salva sau nchide fiiere. Prin intermediul lor se vor controla atributele i comportarea global i, de asemenea, se va ob ine acces la obiectele con inute: slide-uri i mastere. Returnarea obiectului Presentation Se va utiliza proprietatea ActivePresentation a obiectului Application pentru a returna prezentarea care este afiat n fereastra activ. Urmtorul exemplu salveaz prezentarea activ: Proprietatea utilizat Proprietatea Assistant Proprietatea CommandBars Proprietatea FileSearch Proprietatea VBE Proprietatea utilizat Proprietatea Presentations Proprietatea ActivePresentation Proprietatea Windows Proprietatea ActiveWindow Proprietatea AddIns Proprietatea SlideShowWindows

205

ActivePresentation.Save Se poate returna oricare dintre prezentrile deschise curent prin colec ia Presentations, n modul uzual de referire a unui element dintr-o colec ie: Presentations("Sample Presentation").Slides.Add 1, 1 adaug un nou slide la prezentarea "Sample Presentation". Prin proprietatea Presentation a obiectelor DocumentWindow i SlideShowWindow se poate returna o referin la prezentarea care a creat respectivele ferestre (de remarcat c proprietatea Parent returneaz un obiect diferit dac obiectul apar ine unei prezentri scufundate). Urmtorul exemplu afieaz numele prezentrii care se execut n prima fereastr slide show: MsgBox SlideShowWindow(1).Presentation.Name Pentru a returna un obiect Presentation reprezentnd o prezentare scufundat, se utilizeaz proprietatea Object a obiectului OLEFormat pentru forma (shape) care con ine prezentarea scufundat, dup modelul Dim embeddedPres As Presentation Set embeddedPres = ActivePresentation.Slides(1).Shapes(3).OLEFormat.Object prin care se atribuie variabilei embeddedPres prezentarea scufundat n al treilea shape de pe diapozitivul cu numrul 1. Deschiderea unei prezentri existente Metoda Open a colec iei Presentations (returnat de proprietatea sinonim a obiectului Application) realizeaz deschiderea unei prezentri, dup modelul Dim myPres As Presentation Set myPres = Presentations.Open _ (FileName:= " nume fiier + cale (dac este necesar)") myPres.Window(1).ViewType = ppViewSlideSorter unde prezentarea deschis este vizualizat n modul Slide Sorter. Crearea unei prezentri noi n acest scop se utilizeaz metoda Add a colec iei Presentations. Este uzual ca obiectul Presentation ob inut s fie atribuit unei variabile pentru procesare programatic ulterioar. n exemplul urmtor se creeaz o prezentare nou i se adaug un slide. Dim myPres As Presentation Set myPres = Presentations.Add myPres.Slides.Add 1, ppLayoutTitle Atribuirea unui nume semnificativ are de asemenea rolul de a permite o referire uoar la o prezentare. n exemplul urmtor se creeaz o nou prezentare care este salvat imediat cu un nume prin aplicarea metodei SaveAs. Este de remarcat c proprietatea Name a obiectului Presentation este read-only i prin urmare nu poate fi modificat; astfel o prezentare este identificat n mod unic prin numele su ntr-un proiect. Numele poate fi utilizat n mod uzual pentru a ob ine o referin prin intermediul colec iei Presentations:

206

Presentations.Add.SaveAs "Sales Report" Presentations("Sales Report").Slides.Add 1, ppLayoutTitle Importul unei prezentri dintr-o schi (outline) Word Crearea unei prezentri dintr-un outline scris n Word se realizeaz din Microsoft Word prin metoda PresentIt a obiectului Document reprezentnd outline-ul. Exemplul urmtor este ilustrativ: Documents.Open("C:\Presentation Outline.doc").PresentIt Activarea unei prezentri Nu exist o metod Activate pentru obiectul Presentation. Activarea prezentrii are loc o dat cu activarea uneia dintre ferestrele de document ale prezentrii: Presentations("Sales Report").Windows(1).Activate Controlul numerotrii i dimensiunii diapozitivelor Proprietatea PageSetup a obiectului Presentation returneaz un obiect PageSetup. Acest obiect con ine valorile pentru orientarea pagini de note i a diapozitivelor, dimensiuni i numerotare. Propriet ile obiectului PageSetup sunt similare dialogului PageSetup din meniul File, astfel nct anumite atribuiri produc n mod automat efecte asupra altor parametri (de exemplu o l ime mai mare dect nl imea produce o orientare landscape). Propriet ile sunt: FirstSlideNumber - returneaz sau stabilete numerotarea primului diapozitiv. NotesOrientation, SlideOrientation - returneaz sau stabilesc orientarea pe ecran i imprimant a notelor i diapozitivelor. Pot fi una dintre valorile (MsoOrientation): msoOrientationHorizontal, msoOrientationMixed sau msoOrientationVertical. SlideHeight, SlideWidth - returneaz sau stabilesc dimensiunile unui diapozitiv, n puncte. SlideSize - tipul de dimensiune a unui diapozitiv. Poate fi una dintre constantele predefinite (PpSlideSizeType): ppSlideSize35MM, ppSlideSizeA4Paper, ppSlideSizeCustom, ppSlideSizeLetterPaper, ppSlideSizeOnScreen sau ppSlideSizeOverhead. Exemplul urmtor stabilete pentru toate diapozitivele dimensiunea 11" x 8.5" i numerotarea diapozitivelor de la 17. With ActivePresentation.PageSetup .SlideWidth = 11 * 72 .SlideHeight = 8.5 * 72 .FirstSlideNumber = 17 End With Ar fi de remarcat c stabilirea explicit a dimensiunilor produce trecerea propriet ii SlideSize la valoarea ppSlideSizeCustom i a propriet ii SlideOrientation la msoOrientationHorizontal. Stabilirea unui aspect unitar al prezentrii Se poate lucra programatic cu abloane i cu elementele master ale unei prezentri. Aplicarea unui ablon se efectueaz prin metoda ApplyTemplate a obiectului Presentation, dup modelul

207

ActivePresentation.ApplyTemplate " template-ul, eventual cu cale " Propriet ile HandoutMaster, NotesMaster, SlideMaster sau TitleMaster ale obiectului Presentation returneaz un obiect Master care reprezint masterul entit ii respective. Utilizarea propriet ilor obiectului Master permite stabilirea fundalului, modificarea schemei de culori, adugarea de controale ActiveX, lucrul cu stilurile de text. Orice modificare efectuat pentru Master se reflect n categoria respectiv de elemente ale prezentrii. Dintre propriet ile obiectului Master prezentm cteva n continuare, fiecare necesitnd ns o cutare n Help deoarece returneaz colec ii de obiecte complexe. Background - returneaz un obiect ShapeRange reprezentnd background-ul diapozitivului. ColorScheme - returneaz sau stabilete obiectul ColorScheme reprezentnd schema de culori a masterului. HeadersFooters - returneaz colec ia HeadersFooters care reprezint antetul, subsolul, data i numrul de pagin al diapozitivului. Height, Width - returneaz dimensiunile, n puncte. Sunt read-only pentru un master. Shapes - returneaz colec ia Shapes reprezentnd toate elementele care au foest plasate sau inserate n master. Colec ia poate con ine desene, forme (shapes), obiecte OLE, imagini etc. TextStyles - returneaz colec ia TextStyles reprezentnd trei stiluri de text: title text (stilul titlului), body text (textul din interiorul diapozitivului) i default text (textul din forme grafice shapes). Urmtorul exemplu stabilete umplerea fundalului diapozitivului master: ActivePresentation.SlideMaster.Background.Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientBrass Dac se dorete ca o form specific, cum ar fi o imagine sau un control ActiveX, s apar pe toate slide-urile unei prezentri, aceasta se va aduga la master. Un control ActiveX de pe master va rspunde la evenimente din prezentarea diapozitivelor la fiecare click pe control, pe orice slide s-ar afla. Modificrile uniforme ale textului se realizeaz prin intermediul stilurilor. Fiecare obiect TextStyle (din colec ia returnat de proprietatea TextStyles) con ine un obiect TextFrame care descrie cum este plasat textul n boxa de text i un obiect Ruler care con ine tab stopurile i informa ia de indentare. Proprietatea Levels a obiectului TextStyle returneaz colec ia TextStyleLevels care con ine informa ia de formatare pentru 5 nivele de list ierarhizat (pentru titlu i corp se va utiliza ntotdeauna nivelul nti). Exemplul urmtor utilizeaz aceste propriet i pentru o formatare: With ActivePresentation.SlideMaster.TextStyles(ppBodyStyle).Levels(1) With .Font .Name = "Arial" .Size = 36 End With With .ParagraphFormat LineRuleAfter = False .SpaceAfter = 6 End With End With

208

Observa ie. Stilurile pentru titlu i textul interior se poate stabili n mod diferit pentru fiecare master. Stilul textului din formele gafice nu se aplic pentru fiecare master, ci este global, pentru ntreaga prezentare. Tiprirea unei prezentri Metoda PrintOut a obiectului Presentation tiprete prezentarea: ActivePresentation.PrintOut Op iunile de tiprire sunt fixate anterior tipririi prin propriet ile i metodele obiectului PrintOptions (returnat de proprietatea sinonim a obiectului Presentation). Dintre propriet ile obiectului PrintOptions enumerm: OutputType care returneaz sau stabilete care elemente ale presentrii se tipresc. Poate fi o constant de tip PpPrintOutputType: ppPrintOutputBuildSlides ppPrintOutputOutline ppPrintOutputSlides (implicit) ppPrintOutputTwoSlideHandouts NumberOfCopies care returneaz sau stabilete numrul de copii tiprite. FitToPage care este True dac la tiprire se va scala diapozitivul nct s se potriveasc foii de hrtie. Ranges care returneaz obiectul PrintRanges reprezentnd domeniile de dipozitive care se tipresc. Collate care este True (i implicit) dac o copie a prezentrii este tiprit complet naintea copiei urmtoare. Exemplul urmtor utilizeaz cteva asemenea propriet i: With ActivePresentation.PrintOptions .NumberOfCopies = 3 .Collate = True .Parent.PrintOut End With unde se remarc faptul c proprietatea Parent returneaz obiectul Presentation cruia i se poate folosi proprietatea PrintOut. Salvarea unei prezentri Prima salvare a prezentrii, n care i se dun nume, se efectueaz prin metoda SaveAs: With Presentations.Add .Slides.Add 1, ppLayoutTitle .SaveAs "Sample" ppPrintOutputNotesPages ppPrintOutputSixSlideHandouts ppPrintOutputThreeSlideHandouts

209

End With Urmtoarele salvri se ob in prin metoda Save: ActivePresentation.Save nchiderea unei prezentri Pentru a nchide o prezentare se aplic obiectului Presentation metoda Close: Presentations("Sample").Close Dac prezentarea a fost modificat de la ultima salvare, este afiat, n mod automat, un mesaj de interogare asupra salvrii. Pentru a nchide prezentarea fr salvare i fr afiarea mesajului se stabilete mai nti proprietatea Saved la True: With Application.Presentations("Sample") .Saved = True .Close End With Configurarea i executarea unei prezentri Se va utiliza proprietatea SlideShowSettings a obiectului Presentation pentru a returna obiectul sinonim SlideShowSettings care reprezint execu ia unei prezentri de diapozitive. Obiectul SlideShowSettings are o singur metod, Run, care execut prezentarea potrivit parametrilor stabili i de propriet ile obiectului SlideShowSettings. Dintre propriet i enumerm cteva n continuare. AdvanceMode returneaz sau stabilete valoarea care controleaz modul de trecere la urmtorul diapozitiv. Poate fi o constant de tip PpSlideShowAdvanceMode: ppSlideShowManualAdvance, ppSlideShowRehearseNewTimings sau ppSlideShowUseSlideTimings. StartingSlide, EndingSlide stabilesc sau returneaz diapozitivul cu care se ncepe execu ia prezentrii i cel unde se termin vizionarea. LoopUntilStopped care este True dac prezentarea se execut ciclic pn la apsarea tastei ESC. RangeType returneaz sau fixeaz tipul de prezentare executat. Poate fi una dintre constantele de tip PpSlideShowRangeType: ppShowAll, ppShowNamedSlideShow sau ppShowSlideRange. Urmtorul exemplu ilustreaz cteva propriet i: With ActivePresentation.SlideShowSettings .StartingSlide = 2 .EndingSlide = 4 .RangeType = ppShowSlideRange .AdvanceMode = ppSlideShowUseSlideTimings .LoopUntilStopped = True .Run

210

End With unde se remarc faptul c ultima instruc iune apeleaz metoda Run, dup ce s-au fixat atributele execu iei. Accesul la diapozitivele prezentrii Prin metoda Slides a obiectului Presentation se ob ine accesul la diapozitivele prezentrii i, de aici, la textul i grafica unui diapozitiv. Obiectul Slide este prezentat n sec iunea urmtoare. Obiectele Slides, Slide i SlideRange Exist trei obiecte diferite n modelul de obiecte PowerPoint care reprezint diapozitive: colec ia Slides a tuturor diapozitivelor dintr-o prezentare, colec ia SlideRange a diapozitivelor dintr-o submul ime de diapozitive i obiectul Slide care reprezint un diapozitiv individual. n general, se va utiliza colec ia Slides pentru adugarea unui diapozitiv i cnd se parcurg toate diapozitivele prezentrii; se va utiliza obiectul Slide dac se lucreaz cu un anumit diapozitiv; se va utiliza colec ia SlideRange pentru a formata sau lucra cu mai multe diapozitive. Returnarea colec iei Slides ntreaga mul ime de diapozitive a unei prezentri este referit prin proprietatea Slides a obiectului Presentation. Urmtorul exemplu insereaz slide-urile din Clipboard la sfritul prezentrii (pentru c nu s-a specificat locul lipirii prin .Paste(index)): Activepresentation.Slides.Paste Returnarea obiectului Slide O referin la un slide anumit se ob ine prin intermediul colec iei Slides n mod uzual prin metoda Item. Metoda fiind implicit, men ioanrea ei este facultativ. ActivePresentation.Slides(3).Copy copie al treilea slide n Clipboard. Fiecare diapozitiv al unei prezentri are ataat un numr de identificare unic, definit automat la crearea diapozitivului. Atunci cnd n proiectarea unei prezentri se insereaz noi diapozitive, se terg diapozitive, se sorteaz etc., referirea prin indice nu returneaz ntotdeauna acelai diapozitiv. Referirea prin numrul de identificare conduce mereu la acelai diapozitiv. Proprietatea SlideID a unui slide returneaz numrul de identificare, proprietatea fiind read-only. Proprietatea FindBySlideID permite specificarea unui slide prin ID-ul su. Exemplul urmtor utilizeaz aceste propriet i: Dim newSlideID As Long newSlideID = ActivePresentation.Slides.Add(1,ppLayoutTitleOnly).SlideID ActivePresentation.Slides.FindBySlideID(newSlideID).Copy Pentru a ob ine o referin la diapozitivul afiat curent ntr-o fereastr document sau de slide show, se utilizeaz proprietatea Slide a obiectului View al ferestrei, dup modelul Windows(2).View.Slide.Copy Pentru a returna un slide dintr-o selec ie, se folosete Selection.SlideRange(index), unde index este numele sau numrul de ordine din colec ie:

211

ActiveWindow.Selection.SlideRange(1).Layout = ppLayoutTitle Returnarea unui obiect SlideRange Prin Slides.Range(index), unde index este numele, indexul sau un tablou de asemenea elemente (nume sau indici), se returneaz un obiect SlideRange din colec ia Slides. Pentru diapozitivele selectate astfel se poate realiza o formatare unitar etc. With Activepresentation.Slides.Range(Array(1, 3)) .FollowMasterBackground = False .Background.Fill.PresetGradient (msoGradientHorizontal, 1, msoGradientLateSunset) End With Adugarea unui diapozitiv La colec ia Slides se aplic metoda Add. Se creeaz un nou diapozitiv, se adaug la colec ia tuturor diapozitivelor. Metoda accept dou argumente prin care se specific locul noului slide i layout-ul diapozitivului. Ca rezultat al aplicrii metodei se returneaz un obiect Slide. Sintaxa: expression.Add(Index, Layout) unde expression returneaz o colec ie Slides. Index specific rangul noului slide n colec ia Slides (locul efectiv ocupat). Nu poate depi Slides.Count + 1. Layout specific formatul noului diapozitiv. Poate fi una dintre constantele PpSlideLayout: ppLayoutBlank ppLayoutClipartAndText sppLayoutLargeObject ppLayoutObjectAndText ppLayoutTable ppLayoutTextAndClipart ppLayoutTextAndTwoObjects ppLayoutTitleOnly ppLayoutTwoObjectsOverText ppLayoutVerticalTitleAndTextOverChart Exemplul urmtor adaug un slide titlu la nceputul prezentrii active. ActivePresentation.Slides.Add 1, ppLayoutTitleOnly ppLayoutChart ppLayoutClipArtAndVerticalText ppLayoutMediaClipAndText ppLayoutObjectOverText ppLayoutText ppLayoutTextAndMediaClip ppLayoutTextOverObject ppLayoutTwoColumnText ppLayoutVerticalText ppLayoutChartAndText ppLayoutFourObject ppLayoutObject ppLayoutOrgchart ppLayoutTextAndChart ppLayoutTextAndObject ppLayoutTitle ppLayoutTwoObjectsAndText ppLayoutVerticalTitleAndText

212

Inserarea de diapozitive bazate pe un outline Word se realizeaz prin metoda InsertFromFile, dup modelul ActivePresentation.Slides.InsertFromFile _ FileName:=" numele fiierului Word ", Index:=3 Metoda are un domeniu mai larg de aplicabilitate, sintaxa este expression.InsertFromFile(FileName, Index, SlideStart, SlideEnd) unde expression returneaz o colec ie Slides. FileName este numele fiierului, eventual cu cale. Index rangul diapozitivului din colec ia Slides specificat dup care se insereaz noile diapozitive. SlideStart, SlideEnd specific prin indicii de inceput i de sfrit domeniul diapozitivelor din fiier care se insereaz n colec ia Slides. Indicele omis este luat implicit drept indicele minim, respectiv maxim. Stabilirea fundalului i a schemei de culori Pentru o formatare global se vor utiliza elementele master. Dac se dorete ca un diapozitiv sau un grup de diapozitive s aib o formatare distinct, se va utiliza proprietatea Background sau ColorScheme a obiectului Slide sau SlideRange. Proprietatea Background returneaz un obiect ShapeRange, se aplic proprietatea Fill pentru returnarea obiectului FillFormat i acest obiect reprezint umplerea fundalului. Propriet ile i metodele acestui obiect modific aspectul background-ului dorit. Este de men ionat c pentru a pstra modificrile valabile doar pentru diapozitivul (diapozitivele) procesat, proprietatea FollowMasterBackground trebuie fixat pe False. Datorit complexit ii obiectului, FillFormat se va studia din Help, pentru a vedea multiplele propriet i i metode suportate. Exemplul urmtor d o imagine redus a posibilit ilor de prelucrare grafic: With ActivePresentation.Slides(1) .FollowMasterBackground = False .Background.Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientDaybreak End With metoda PresetGradient aplic un efect vizual caracterizat de trei parametri, Style, Variant i PresetGradientType, corespunznd dialogului Fill Effects din PowerPoint (i nu numai). Modificarea culorilor se poate realiza prin schimbarea schemei de culori sau prin editarea unei culori particulare dintr-o schem. Proprietatea ColorScheme a unui obiect Slide sau SlideRange returneaz obiectul ColorScheme care reprezint schema de culori. Se poate schimba apoi schema sau se poate utiliza metoda Colors pentru a edita culori. Numerotarea schemelor de culori este cea din dialogul Color Scheme din PowerPoint. Exemplele urmtoare ilustreaz mecanismul modificrilor.

213

With ActivePresentation .Slides(1).ColorScheme = .ColorScheme(3) End With sau ActivePresentation.Slides(1).ColorScheme.Colors(ppTitle).RGB = RGB(0,255,0) care coloreaz titlul n verde. Culorile schemei de culori pot fi referite printr-o constant de tip PpColorSchemeIndex: ppAccent1, ppAccent2, ppAccent3, ppBackground, ppFill, ppForeground, ppNotSchemeColor, ppShadow sau ppTitle, cu interpretrile imediate din PowerPoint. Schema de culori este pierdut la aplicarea unui template, moment n care se schimb i schemele de culori disponibile. Alegerea unui layout La adugarea unui diapozitiv s-a vzut c se stabilete i layout-ul acestuia prin argumentul Layout. Returnarea sau modificarea layout-ului se realizeaz prin proprietatea Layout: ActivePresentation.Slides(1).Layout = ppLayoutTextAndChart La modificarea layout-ului sunt totui pstrate i rezervrile care con in text sau obiecte. Adugarea de obiecte la un diapozitiv Se pot aduga obiecte (cum ar fi AutoShapes, obiecte OLE, imagini) la un diapozitiv utiliznd una dintre metodele colec iei Shapes. O referin la aceast colec ie se ob ine prin proprietatea Shapes a obiectului Slide, colec ia reprezentnd ntregul layer de desen de pe un diapozitiv. Operarea cu aceste obiecte este descris ntr-un capitol separat, dedicat obiectelor desenate. Schimbarea ordinii diapozitivelor Pentru a schimba locul unui diapozitiv ntr-o prezentare se utilizeaz metodele Cut i Paste prin care se ia un diapozitiv din locul vechi i se insereaz n noua pozi ie: With ActivePresentation.Slides .Item(4).Cut .Paste 6 End With care mut diapozitivul diapozitivul 4 pe locul 6 din prezentare. Stabilirea efectelor tranzi iei diapozitivelor Atributele tranzi iei unui diapozitiv sunt pstrate n propriet ile obiectului SlideShowTransition, returnat de proprietatea sinonim SlideShowTransition a obiectului Slide sau SlideRange. Propriet ile privind tranzi ia corespund op iunilor disponibile prin dialogul specializat din PowerPoint: AdvanceOnClick, AdvanceOnTime, AdvanceTime, EntryEffect, SoundEffect, Speed. Primele dou propriet i, AvanceOnClick i AvanceOnTime, sunt True dac trecerea la urmtorul slide are loc la click sau dup un timp fixat de AdvanceTime. Pot fi stabilite ambele tipuri de avans la True.

214

EntryEffect stabilete modul de apari ie a noului diapozitiv. Poate avea una dintre valorile tipului enumerat PpEntryEffect, de forma ppEffectAppear, ppEffectBlindsHorizontal, ppEffectBlindsVertical, ppEffectBoxIn i nc alte vreo 60 de constante, descriind efectele selectabile prin dialogurile PowerPoint. SoundEffect returneaz obiectul sinonim care controleaz ce se va cnta cnd are loc tarnzi ia. Metoda util (nu sunt multe altele) este ImportFromFile prin care se specific un fiier de tip sound. Speed precizeaz ritmul efecturii tranzi iei. Returneaz sau stabilete acest ritm ca o constant de tip PpTransitionSpeed: ppTransitionSpeedFast, ppTransitionSpeedMedium, ppTransitionSpeedMixed sau ppTransitionSpeedSlow. Exemplul urmtor ilustreaz cteva dintre aceste propriet i. With ActivePresentation.Slides(1).SlideShowTransition .Speed = ppTransitionSpeedFast .EntryEffect = ppEffectStripsDownLeft .SoundEffect.ImportFromFile "c:\\bass.wav" .AdvanceOnTime = True .AdvanceTime = 5 End With ActivePresentation.SlideShowSettings.AdvanceMode = _ ppSlideShowUseSlideTimings n exemplu se remarc faptul c proprietatea AdvanceMode ia valoarea ppSlideShowUseSlideTimings, pentru considerarea timpului fixat la tranzi ia diapozitivului. Referirea noti elor vorbitorului (Speaker's notes) Proprietatea NotesPages returneaz un obiect SlideRange care reprezint paginile de note pentru un diapozitiv sau un domeniu de diapozitive. Obiectul returnat are anumite restric ii n privin a utilizrii unor propriet i i metode n raport cu obiectul SlideRange care reprezint un domeniu de slide-uri. Pentru a modifica toate diapozitivele simultan se va utiliza proprietatea NotesMaster a obiectului Presentation, proprietatea care returneaz un obiect Slide reprezentnd masterul noti elor. ActivePresentation.Slides(1).NotesPage.Shapes.Placeholders(2) _ .TextFrame.TextRange.InsertAfter " textul care se adaug " Obiectul Selection n PowerPoint, obiectul Selection reprezint selec ia efectuat ntr-o fereastr de document. Se pot utiliza metodele obiectului Selection pentru a tia, copia, terge sau deselecta por iunea selectat. Proprietatea Type a obiectului Selection identific tipul selec iei (diapozitive, shape, text sau nimic). Pentru returnarea unui anumit tip de selec ie se vor utiliza propriet ile ShapeRange, SlideRange i TextRange. Observa ie. Codul bazat pe o selec ie este n general ineficient i presupunerea selectrii prealabile a unei entit i nu este de obicei necesar; de exemplu, se poate schimba fontul unui text i fr a-l selecta n prealabil. Dac proiectul VBA pornete de la cod ob inut prin Macro Recorder, se va modifica pentru a-l face, pe ct posibil, independent de selec ie. Crearea unei selec ii Se poate ob ine o selec ie fie n mod manual, fie aplicnd metoda Select unuia dintre obiectele Shape, ShapeRange, Slide, SlideRange sau TextRange. Exemplul urmtor selecteaz formele 1 i 3 de pe slide-ul 1 din prezentarea activ:

215

ActivePresentation.Slides(1).Shapes.Range(Array(1,3)).Select Este de re inut c se poate efectua o selec ie programatic doar dac s-ar putea efectua aceeai selec ie n mod manual: obiectul trebuie s fie accesibil, viziunea trebuie s permit selec ii de acel tip etc. Returnarea unei selec ii Se va utiliza proprietatea Selection a obiectului DocumentWindow pentru a returna selec ia din fereastra respectiv: ActiveWindow.Selection.Cut Returnarea unui obiect din selec ie Prin proprietatea ShapesRange a obiectului Selection se returneaz colec ia ShapeRange care include toate formele desenate din selec ie. Se utilizeaz metoda Item pentru accesul la un obiect din colec ie. Exemplul urmtor taie a treia form desenat din selec ia existent n fereastra activ: ActiveWindow.Selection.ShapeRange(3).Cut Prin intermediul propriet ii TextRange se poate accesa textul dintr-o selec ie sau textul dintr-o form desenat. n continuare se prezint principalele opera iuni realizate prin intermediul obiectului TextRange. Returnarea domeniului de text dintr-o selec ie. ActiveWindow.Selection.TextRange.Copy Prin intermediul metodelor Characters, Lines, Paragraphs, Runs, Sentences sau Words se poate ob ine o por iune anumit de text din textul con inut n TextRange. Returnarea domeniului de text dintr-o form desenat (shape) se realizeaz prin proprietatea TaxtRange a obiectului TextFrame. ActiveWindow.Selection.ShapeRange(3).TextFrame.TextRange _ .Characters(1,3).Font.Bold = True Se utilizeaz proprietatea HasTextFrame pentru a vedea dac o form are ataat un cadru cu text i se utilizeaz proprietatea HasText pentru a determina dac exist text n cadrul de text. Inserarea de text, dat i timp sau numr de slide se realizeaz prin intermediul metodelor InsertAfter, InsertBefore, InsertDateTime, InsertSlideNumber sau InsertSymbol. Prin proprietatea SlideRange a obiectului Selection se returneaz colec ia SlideRange care include toate diapozitivele selectate. Exemplul urmtor taie diapozitivele selectate n fereastra activ. ActiveWindow.Selection.SlideRange.Cut Obiectele View i SlideShowView La deschiderea unui fiier n PowerPoint, se creeaz simultan un obiect Presentation, care reprezint con inutul fiierului, un obiect DocumentWindow, care reprezint interfa a dintre utilizator i fiier n modul design, un obiect View, care reprezint un container pentru con inutul fiierului n modul design.

216

La pornirea unui slide show, se creeaz un obiect SlideShowWindow, care reprezint interfa a ntre utilizator i fiier n modul run, i un obiect SlideShowView, care reprezint un container pentru con inutul fiierului n modul run (de execu ie). n elegerea prezentrilor, ferestrelor i a viziunilor Modificrile entit ilor care se vd pe ecranul aplica iei se realizeaz prin modificarea unuia dintre obiectele Presentation, DocumentWindow sau View. Care anume dintre obiecte se modific este prezentat n continuare. Schimbrile efectuate asupra con inutului efectiv al diapozitivelor cum ar fi adugarea, tergerea sau formatarea obiectelor sunt modificri ale prezentrii i sunt controlate de propriet ile i metodele obiectului Presentation ca i de obiectele inferioare n ierarhia de obiecte PowerPoint. Schimbrile efectuate asupra interfe ei care afieaz con inutul cum ar fi modificarea dimensiunii ferestrei sau comutarea afiarii n alb-negru sunt modificri ale ferestrei documentului sau ferestrei de demonstrare a diapozitivelor i sunt controlate de propriet ile/metodele obiectelor DocumentWindow sau SlideShowWindow. Aceste modificri nu afecteaz con inutul fiierului. Modiifcrile ferestrei documentului se pstreaz la comutarea viziunilor. Schimbrile efectuate asupra modului n care informa ia este afiat cum ar fi dac se vede text i grafic sau numai grafic, ct de mari apar pe ecran elementele sunt modificri ale viziunii i sunt controlate de propriet ile i metodei obiectelor View i SlideShowView. Aceste modificri nu afecteaz con inutul fiierului i nu sunt re inute la comutarea viziunilor. Returnarea obiectelor View i SlideShowView Obiectul View reprezint modul n care informa ia este afiat n fereastra documentului. Se utilizeaz proprietatea View a obiectului DocumentWindow pentru a returna un obiect View. Urmtorul exemplu fixeaz fereastra documentului s se ajusteze automat la dimensiunile ferestrei aplica iei. Windows(1).View.ZoomToFit = True Obiectul SlideShowView reprezint modul n care informa ia este afiat n fereastra de slide show. Se utilizeaz proprietatea View a obiectului SlideShowWindow pentru a returna obiectul SlideShowView. Urmtorul exemplu execut un slide show a prezentrii active cu inhibarea shortcut-urilor (metoda Run a obiectului SlideShowSettings returneaz un obiect SlideShowWindow) ActivePresentation.SlideShowSettings.Run.View _ .AcceleratorsEnabled = False Urmtorul exemplu fixeaz culoarea pointerului i forma pointerului pentru al doilea slide show care se execut curent (exist doar o fereastr pe aplica ie n care se execut un slide show, dar pot exista mai multe aplica ii care execut slide show-uri n acelai timp). With SlideShowWindow(2).View .PointerColor.RGB = RGB(255,0,0) .PointerType = ppSlideShowPointerPen End With Navigarea printre diapozitive Prin metoda GoToSlide a obiectului View sau SlideShowView se activeaz slide-ul specificat. Este de men ionat c termenul "diapozitiv activ" depinde de viziunea curent: n slide view sau n note view, slide-ul curent este cel afiat; n outline view sau slide sorter view, slide-ul activ este cel selectat.

217

SlideShowWindows(1).View.GoToSlide 3 Se poate trece la primul diapozitiv prin metoda First, la ultimul diapozitiv prin Last, sau se poate trece la un slide show denumit prin metoda GoToNamedShow. Prin ultima metod se trece la alt prezentare de diapozitive n timpul unei alte prezentri. Cnd prezentarea avanseaz, urmtorul diapozitiv artat este urmtorul din prezentarea unde s-a fcut transferul i nu urmtorul din prezentarea curent. Sintaxa este expression.GotoNamedShow(SlideShowName) unde expression este obligatorie, returneaz un obiect SlideShowView. SlideShowName este obligatoriu, numele slide show-ului unde se trece controlul. SlideShowWindows(1).View.GotoNamedShow "slide show-ul unde se trece " Alipirea con inutului Clipboard-ului la un obiect View Prin metoda Paste a obiectului View se alipete con inutul din Clipboard la viziunea din fereastra de document activ. Urmtorul exemplu copie selec ia din prima fereastr n Clipboard i o alipete apoi la viziunea din fereastra a doua. Dac opera iunea nu poate avea loc (vezi tabelul urmtor) se produce o eroare. Windows(1).Selection.Copy Windows(2).View.Paste Opera iunea de alipire depinde de viziunea ferestrei. Situa iile posibile de copiere a con inutului din Clipboard sunt prezentate n tabelul urmtor. Viziunea Slide view sau notes page view Se poate alipi Shapes, text sau diapozitive ntregi. Formele alipite sunt adugate n top-ul ordinei pe z i nu nlocuiesc formele selectate. Dac este selectat o form, textul alipit va fi adugat la textul formei; dac este selectat text, textul alipit nlocuiete selec ia; dac nu este selectat nimic, textul alipit este plasat ntr-un text frame propriu. Dac se alipete un ntreg slide, o imagine a slide-ului este inserat pe diapozitiv, master sau pagina de note ca un obiect scufundat. Text sau diapozitive ntregi. Un slide alipit este inserat naintea slide-ului care con ine punctul de inser ie. Nu se pot alipi forme desenate n outline view. Diapozitive ntregi. Un slide alipit este inserat la punctul de inser ie sau dup ultimul slide din selec ie. Nu se pot alipi forme sau text n slide sorter view.

Outline view

Slide sorter view

Din tabel rezult importan a alegerii unei viziuni corecte pentru prezentare nainte de a efectua o opera iune de tiere+alipire. Stabilirea sau verificarea tipului de viziune din fereastra documentului

218

Prin proprietatea Type a obiectului View se ob ine ce fel de viziune are documentul activ iar proprietatea ViewType a obiectului DocumentWindow se utilizeaz pentru a stabili viziunea din fereastra documentului. Urmtorul exemplu realizeaz o copiere cu fixarea tipului de viziune adecvat opera iunii de alipire. Windows(1).Selection.Copy With Windows(2) .ViewType = ppViewSlide .View.Paste End With Alte constante pentru viziuni sunt grupate n PpViewType: ppViewHandout, ppViewNotesPage, ppViewSlideMaster, ppViewTitleMaster Interpretrile sunt imediate. Returnarea diapozitivului curent Proprietatea Slide returneaz obiectul Slide care reprezint diapozitivul afiat n acel moment ntr-o fereastr de slide show sau ntr-o fereastr document. SlideShowWindows(1).View.Slide.Copy Dac slide-ul afiat curent este dintr-o prezentare scufundat, se poate utiliza proprietatea Parent a obiectului Slide returnat de proprietatea sinonim pentru a returna prezentarea scufundat (proprietatea Presentation a obiectului SlideShowWindow sau DocumentWindow returneaz prezentarea n care fereastra a fost creat i nu prezentarea scufundat). Controlarea comportrii obiectelor n timpul unui slide show ntregul strat de desen de pe un diapozitiv este reprezentat de colec ia Shapes i fiecare obiect de pe un diapozitiv fie c este o rezervare de loc (placeholder), o form AutoShape sau un obiect OLE este reprezentat de un obiect Shape. Utiliznd propriet ile i metodele colec iei Shapes se pot aduga obiecte la diapozitive i se ob ine acces la obiectele individuale de pe un diapozitiv. Prin propriet ile i metodele unui obiect Shape se poate controla aspectul formei, textul sau obiectul OLE care este con inut i modul n care se comport forma respectiv n timpul unui slide show. n continuare se discut doar despre comportarea formei desenate n slide show, aspectele celelalte fiind discutate n capitolul dedicat desenelor din Microsoft Office. Controlul anima iei Obiectul AnimationSettings con ine propriet ile i metodele care controleaz cum i cnd apare un shape pe un anumit slide n timpul prezentrii. Urmtorul exemplu fixeaz forma a doua de pe primul slide s devin animat n mod automat dup cinci secunde. With ActivePresentation.Slides(1).Shapes(2).AnimationSettings ppViewHandoutMaster, ppViewOutline, ppViewSlideShow, ppViewNotesMaster, ppViewSlide, ppViewSlideSorter

219

End With

.AdvanceMode = ppAdvanceOnTime .AdvanceTime = 5 .TextLevelEffect = ppAnimateByAllLevels .Animate = True

La lucrul cu propriet ile obiectului AnimationSettings este important s se n eleag interac iunea dintre propriet ile obiectului ntre ele i cu proprietatea AdvanceMode a obiectului SlideShowSettings. Efectele valorilor stabilite pentru propriet ile obiectului AnimationSettings nu devin vizibile dect dac forma respectiv este animat, adic proprietatea Animate este fixat pe True. n animarea textului proprietatea TextUnitEffect stabilete unitatea de anima ie (cuvnt, paragraf etc) prin ppAnimateByCharacter, ppAnimateByParagraph, ppAnimateByWord sau ppAnimateUnitMixed. Proprietatea TextLevelEffect (care interac ioneaz cu precedenta la anumite valori) stabilete nivelul ierarhic al textului animat: ppAnimateByAllLevels ppAnimateByFourthLevel ppAnimateLevelMixed ppAnimateByFifthLevel ppAnimateBySecondLevel ppAnimateLevelNone. PpAnimateByFirstLevel PpAnimateByThirdLevel

Pentru introducerea temporizrii n anima ie, se va stabili proprietatea AdvanceMode la ppAdvanceOnTime i se va indica un numr de secunde n AdvanceTime. Totodat, proprietatea AdvanceMode a obiectului SlideShowSettings trebuie s fie ppSlideShowUseSlideTimings. Proprietatea AfterEffect controleaz ce se ntmpl dup ce forma a devenit animat. Dac forma a fost animat i alt form nu este animat dup ea, atunci efectele ulterioare nu sunt vizibile. n plus, efectul propriet ii DimColor nu este vizibil dect dac AfterEffect este stabilit la ppAfterEffectDim. Ordinea de animare a formelor de pe un slide este stabilit prin proprietatea AnimationOrder, proprietatea EntryEffect stabilete modul de apari ie a formei iar ChartUnitEffect controleaz modul de animare al elementelor unei diagrame. Controlul rspunsului la ac iunea mouse-ului Efectul ac iunilor mouse-ului (click sau trecere peste form) este controlat de colec ia ActionSettings. Colec ia con ine dou obiecte identificate prin indexul ppMouseClick sau ppMouseOver reprezentnd, respectiv, ac iunile la click sau trecerea mouse-ului pe deasupra formei sau textului n timpul unui slide show. With ActivePresentation.Slides(1).Shapes(3).TextFrame. _ TextRange.ActionSettings(ppMouseClick) .Action = ppActionHyperLink .HyperLink.Address = "http://www.microsoft.com" End With Unde se remarc utilizarea indexului de identificare a ac iunii la click pe form i definirea unei ac iuni prin proprietatea Action. Valorile posibile pentru Action sunt constantele PpActionType: ppActionEndShow ppActionFirstSlide ppActionHyperlink

220

ppActionLastSlide ppActionNamedSlideShow ppActionOLEVerb ppActionRunProgram.

ppActionLastSlideViewed ppActionNextSlide ppActionPreviousSlide

ppActionMixed ppActionNone ppActionRunMacro

Este de notat c anumite ac iuni sunt proprii doar unor tipuri de forme i se vor alege acele ac iuni care sunt disponibile n interfa a utilizator din PowerPoint pentru forma procesat. n urmtorul exemplu se stabilete c, n slide show, atunci cnd a treia form de pe al doilea diapozitiv este click-at, culoarea formei este momentan inversat, se aude fiierul sound "applause" i prezentarea revine la primul slide. With ActivePresentation.Slides(2).Shapes(3) _ .ActionSettings(ppMouseClick) .Action = ppActionFirstSlide .SoundEffect.Name = "applause" .AnimateAction = True End With Dac se stabilete o proprietate a obiectului ActionSettings dar fr efectul scontat, se va verifica valoarea atribuit propriet ii Action. Tabelul care urmeaz ofer cteva precizri. Dac se utilizeaz proprietatea Hyperlink Run Run ActionVerb SlideShowName Pentru a efectua Valoarea necesar pentru proprietatea Action ppActionHyperlink ppActionRunProgram ppActionRunMacro ppActionOLEVerb ppActionNamedSlideShow

Stabilirea propriet ilor pentru hiperlegtura care este urmrit ca rspuns la ac iunea mouse-ului. Returnarea/stabilirea numelui programului executat ca rspuns la ac iunile mouse-ului. Returnarea/stabilirea numelui procedurii macro executate ca rspuns la ac iunea mouse-ului. Stabilirea verbului OLE care va fi invocat ca rspuns la ac iunea mouse-ului. Stabilirea numelui slide show-ului propriu care se va executa ca rspuns la o ac iune a mouse-ului.

Urmtorul exemplu utilizeaz proprietatea Hyperlink: With ActivePresentation.Slides(1).Shapes(1).ActionSettings(ppMouseClick) .Action = ppActionHyperlink .Hyperlink.Address = "http://www.infoiasi.ro" End With Controlul unui clip

221

Obiectul PlaySettings, returnat prin proprietatea PlaySettings a obiectului AnimationSettings, con ine propriet i i metode care controleaz cum i cnd se deruleaz un clip media. Urmtorul exemplu insereaz un movie numit "Clock.avi" n primul slide din prezentarea activ, fixeaz execu ia automat dup anima ia sau tranzi ia precedent, specific continuarea show-ului n timp ce se execut filmul i specific faptul c obiectul movie este ascuns n timpul slide show-ului cu excep ia timpului cnd se execut. Set clockMovie = ActivePresentation.Slides(1).Shapes.AddMediaObject _ (FileName:="c:\\clock.avi", Left:=20, Top:=20) With clockMovie.AnimationSettings.PlaySettings .PlayOnEntry = True .PauseAnimation = False .HideWhileNotPlaying = True End With n func ie de modul cum se insereaz clipul ca un obiect OLE (utiliznd comanda Object din meniul Insert sau utiliznd metoda AddMediaObject) sau ca un obiect media nativ (utiliznd meniul Movies and Sounds sau metoda AddMediaObject), se pot aplica diferite propriet i obiectului PlaySettings. Se regsesc astfel op iunile disponibile n fia Play Settings din dialogul Custom Animation (deschis din meniul SlideShow). Modul preferat de inserare a clipurilor este ca obiecte native media, deoarece acestea nu necesit Windows Media Player i reac ioneaz astfel mai rapid. Multe dintre propriet ile obiectului PlaySettings se aplic numai clipurilor media native. Proprietatea ActionVerb, care corespunde op iunilor listate n boxa Object din fia PlaySettings a dialogului Custom Animation, este singura care nu se aplic clipurilor media native. Utiliznd proprietatea Type a obiectului Shape se poate determina dac un clip este nativ (valoarea returnat msoMedia) sau nu. Proprietatea MediaType a obiectului Shape determin dac este sound sau movie (ppMediaTypeMixed, ppMediaTypeMovie, ppMediaTypeOther sau ppMediaTypeSound). Urmtorul exemplu fixeaz toate obiectele native sound din primul slide s se execute mereu pn sunt oprite manual. Dim so As Shape For Each so In ActivePresentation.Slides(1).Shapes If so.Type = msoMedia Then If so.MediaType = ppMediaTypeSound Then so.AnimationSettings.PlaySettings.LoopUntilStopped = True End If End If Next Meniuri i bare de unelte Interfa a cu utilizatorul este o parte foarte important a oricrei aplica ii. Acest fapt are o pondere mult mai mare n proiectele dezvoltate n VBA deoarece aplica iile gazd (Microsoft Office, Visio, Autocad etc.) dispun de interfe e utilizator sofisticate de care trebuie s se apropie orice nou component. Problematica poate fi despr it n: o o Personalizarea/modificarea interfe ei aplica iei de baz Dialogurile create de utilizator.

n acest capitol se discut prima categorie de ac iuni: tehnicile prin care se poate adapta, completa sau modifica interfa a cu utilizatorul propus n mod standard n aplica iile Microsoft Office 97. Se prezint att ac iunile permise de mediu (prin dialogul Customize comun aplica iilor Word, Excel, PowerPoint, Access) asupra meniurilor i barelor de unelte afiate, ct i ac iunile programatice, din Visual Basic, asupra obiectelor respective.

222

Modificarea interfe ei cu utilizatorul Interfa a cu utilizatorul prezent n programele din Microsoft Office este format din bare de meniu i bare de unelte. Ca rspuns la activarea unei comenzi din meniu sau a unei unelte se va realiza o ac iune a aplica iei gazd sau se va deschide un dialog pentru fixarea unor atribute ale ac iunii dorite. Exist dou posibilit i de adaptare a barelor de unelte i a meniurilor: dialogul Customize i Visual Basic. Dei dialogul difer uor de la o aplica ie la alta, obiectele programabile sunt aceleai n toate aplica iile Microsoft Office (cu excep ia Outlook). Dialogul Customize Prin intermediul casetei de dialog Customize se pot efectua modificri ale interfe ei utilizator n timpul proiectrii aplica iei Visual Basic (pentru simplitatea exprimrii utilizm formularea design-time). Cu alte cuvinte, modificri efectuate nainte ca aplica ia s se execute. Modificrile includ: adugarea, tergerea, mutarea, restaurarea componentelor meniurilor i barelor de unelte. De asemenea stabilirea propriet ilor acestor componente, care nu se vor modifica n timpul execu iei (cu formularea mai concis run-time). Aceste modificri pot fi efectuate i n Visual Basic, dar dac exist ambele posibilit i de modificare, cele din design-time, direct n mediul aplica iei gazd, se realizeaz mai uor. Pentru afiarea dialogului Customize se urmeaz succesiunea: meniul View Toolbars Customize. Acelai efect se ob ine prin punctarea unei bare de unelte i click dreapta. Din meniul contextual se alege apoi Customize. Dialogul afiat este, cu mici diferen e specifice, acela n toate aplica iile Office 97. Forma afiat de Microsoft Word este dat n figura alturat. Se observ cele trei fie i grupul de butoane din dreapta. Particularit ile importante ale dialogului sunt: o n Access, fia Toolbars con ine un buton Properties care afieaz dialogul Toolbar Properties prin care se fixeaz propriet ile barelor de meniu sau de unelte, n Excel, fia Toolbars con ine un buton Attach care afieaz dialogul Attach Toolbars prin care se pot copia (ataa) la caietul activ bare de unelte/meniu din spa iul de lucru al aplica iei, n Word, fia Commands con ine o list derulant Save in n care se alege contextul modificrilor din design-time (template, document etc.) i un buton Keyboard care ini iaz un dialog de stabilire a cheilor directe. Dialogul NewToolbar, care apare la click pe New (fia Toolbars), con ine de asemenea op iunea Make toolbar available to pentru fixarea domeniului de vizibilitate.

o o

Dup deschiderea dialogului Customize se urmeaz aceeai procedur pentru modificarea oricrui meniu sau toolbar, indiferent dac este predefinit sau construit de utilizator. Paii uzuali sunt o o n lista Toolbars din fia Toolbars se selecteaz boxele de control alturate denumirilor acelor bare care se afieaz; orice bar nou creat este afiat n mod automat; click pe orice intrare de meniu (inclusiv captrile de meniu/submeniu) sau control de pe o bar de unelte pentru a o selecta; n timpul afirii dialogului Customiza meniurile i uneltele nu sunt active/executabile, pot fi doar selectate; click dreapta pe obiectul selectat i utilizarea comenzilor din meniul contextual pentru transformrile dorite. n timpul afirii dialogului Customize se pot rearanja prin drag-and-drop toate intrrile din meniuri/unelte. Tragerea n caseta dialogului elimin o intrare din meniu/bar de unelte, iar opera iunea invers adaug noi intrri.

o o

Visual Basic

223

Personalizarea meniurilor i barelor de unelte se poate efectua programatic utiliznd por iunea reprezentnd barele de comand din modelul de obiecte, comun tuturor aplica iilor din Microsoft Office. Nivelul cel mai nalt este colec ia CommandBars, returnat de proprietatea CommandBars n toate aplica iile din Office. Fiecare bar de meniu, meniu contextual sau bar de unelte este reprezentat printr-un obiect CommandBar n aceast colec ie. Un obiect CommandBar con ine o colec ie CommandBarControls reprezentnd elementele de control ale barei respective. Ierarhia acestor obiecte, pentru cazul Microsoft Word (similar n toate celelalte aplica ii din Office), este prezentat n figura alturat. Utilizarea acestor obiecte este explicat, pentru principalele ac iuni, n continuarea acestui capitol. Se poate scrie cod care, executat o singur dat, produce crearea sau modificarea elementelor de control din interfa a utilizator. Codul simuleaz modificrile din design-time prin caseta Customize. Sunt i situa ii n care este nevoie de o combina ie programare + personalizare pentru a realiza configurarea dorit a mediului aplica iei: o o o Dac nu se poate utiliza dialogul Customize pentru crearea unei bare noi de meniu, aceasta se va crea prin program i dup aceea se poate configura prin dialogul Customize. Dac aplica ia gazd nu ofer posibilitatea de afiare simultan a dialogului Customize i a meniurilor contextuale predefinite sau utilizator, modificarea acestora trebuie realizat n Visual Basic. Dac aplica ia gazd nu ofer o interfa pentru adugarea sau modificarea boxelor text, listelor derulante drop-down sau combo box, trebuie utilizat codul Visual Basic pentru adugarea i proiectarea acestor controale.

Se poate scrie cod i pentru modificarea meniului sistem n timp ce aplica ia se execut (de exemplu inhibarea unor comenzi sau adugarea unui meniu etc.). Aceste modificri sunt cunoscute drept modificri n run-time. Domeniul schimbrilor asupra interfe ei utilizator Fiecare aplica ie Microsoft Office utilizeaz reguli uor diferite privind unde i cum se salveaz modificrile aduse interfe ei utilizator. Pentru un control corect al interfe ei proiectate n aplica ia Visual Basic este important n elegerea domeniului de valabilitate al schimbrilor. Microsoft Access Se pot utiliza bare de meniu proprii sau meniuri contextuale proprii n trei moduri o Ataate de o form sau de un raport. Microsoft Access afieaz meniurile proprii la deschiderea formei sau la afiarea raportului n print preview. Pentru informa ii suplimentare se va studia subiectul "MenuBar Property" n Help. Drept un meniu contextual ataat unei forme, unui raport sau unui control dintr-o form. Microsoft Access afieaz un asemenea meniu la click dreapta pe form, raport sau control. Pentru informa ii suplimentare se va studia subiectul "ShortCutMenuBar Property" n Help. Ca o bar meniu global, a aplica iei. Microsoft Access afieaz aceast bar proprie n toate ferestrele, cu excep ia formelor sau rapoartelor care au propria bar definit. Se poate specifica bara de meniu utilizat n aplica ie prin dialogul Startup.

Se pot utiliza una sau mai multe bare de unelte proprii ntr-o aplica ie. Se creeaz barele de unelte necesare i se alege pentru afiare una dintre metodele urmtoare: o Dac aplica ia are doar o bar de unelte utilizator, se va utiliza commanda Toolbars (din meniul View) pentru a o afia; bara respectiv va apare de fiecare dat cnd se pornete aplica ia.

224

o o

Dac aplica ia are bare diferite pentru forme sau rapoarte, se va specifica bara necesar n proprietatea Toolbar a formei sau raportului. Bara indicat se va afia i ascunde mpreun cu forma. Dac sunt necesare mai multe bare de unelte proprii pentru o form sau raport, sau dac se dorete ascunderea/afiarea barelor predefinite, se va utiliza proprietatea Visible a obiectului CommandBar n Visual Basic sau ac iunea ShowToolbar n macro-uri. Dac se dorete ca aplica ia s afieze doar barele proprii, se pot ascunde barele de unelte built-in prin comanda Startup (meniul Tools) i se deselecteaz boxa de control Allow Built-in Toolbars.

Microsoft Excel Barele de meniu sau/i barele de unelte proprii pot fi salvate cu spa iul de lucru sau cu caietul. La prsirea aplica iei Excel, barele de unelte din spa iul de lucru sunt salvate automat n fiierul Username8.xlb (unde Username este numele utilizatorului curent utilizat la intrarea n Windows 95). Dac utilizatorul nu este logged on, fiierul este Excel8.xlb. Barele de unelte salvate n caiet sunt memorate n fiierul caietului respectiv. Meniurile i barele de unelte de la nivelul workbook permit proiectarea unei interfe e pe msura oricrei aplica ii (de exemplu un add-in) i distribuirea barelor i procedurilor ataate. Pentru distribuire, obiectele proiectate se vor ataa caietului, care con ine aplica ia, nct barele de unelte s fie memorate n acelai fiier cu aplica ia. Mutarea unui meniu sau bar de unelte din spa iul de lucru n caiet Dac dialogul Customize nu este deschis, se va afia prin View - Toolbars - Customize. n fia Toolbars a dialogului, click pe Attach. Ca urmare a ac iunii se afieaz dialogul Attach Toolbars. n caseta din stnga Custom toolbars se selecteaz numele meniului sau barei de unelte care se copie n caietul activ. Click Copy. Numele obiectului copiat apare n lista din dreapta Toolbars in workbook.

Obiectul original, de la nivelul spa iu de lucru, poate fi eliminat n mod uzual ac ionnd butonul Delete din dialogul Customize, fia Toolbars. Dac versiunea de la nivelul sap iului de lucru (workspace) nu este eliminat, aceasta poate fi modificat fr afectarea versiunii de la nivelul caietului. n aceast situa ie, obiectul este modificat la nivelul spa iului de lucru, aducerea versiunii din caiet la aceeai configurare se realizeaz doar prin repetarea procedurii descrise, adic prin copierea versiunii din spa iu peste versiunea din caiet. Dup copierea unui obiect (meniu sau bar de unelte) n caiet, obiectul devine disponibil numai dup ce utilizatorul n deschide. O versiune salvat n caiet re ine nu numai numele i con inutul, ci i asignrile de cod, locul, dimensiunea, forma, pozi ia n ecran i atributul de vizibilitate (ascuns sau vizibil). Eliminarea unui meniu/bar de unelte salvat n caiet Versiunea salvat n caiet poate fi eliminat prin: Dac dialogul Customize nu este deschis, se va deschide dup procedura uzual. n fia Toolbars click pe Attach. Se afieaz dialogul Attach Toolbars. n zona Toolbars in workbook click pe numele obiectului care se elimin. Click Delete.

Observa ie. Nu se poate utiliza Visual Basic pentru a ataa sau elimina obiecte bare de meniu sau de unelte la un caiet. La deschiderea unui caiet care con ine obiecte de interfa pe msur, Microsoft Excel determin mai nti dac exist deja un obiect cu aceeai denumire n spa iul de lucru. Dac nu, este creat un nou meniu sau bar de unelte n spa iul

225

de lucru i se copie n acest nou obiect bara de meniu sau de unelte din caiet. n acest mod se dispune de un obiect care poate fi modificat, ascuns etc., obiect care i salveaz modificrile n spa iul de lucru la prsirea aplica iei Excel. Nu exist nici un mijloc prin care s se redenumeasc un meniu sau toolbar, nct la redeschiderea caietului spa iul de lucru con ine deja obiectul cu numele respectiv i Microsoft Excel utilizeaz copia creat anterior n locul obiectului din caiet. Procedurile ataate rmn totui cele din caiet, adic aplica ia distribuit triete n continuare prin intrrile de meniuri sau unelte pstrate n spa iul de lucru. Acest mod de operare are accentul pus pe ac iunile utilizatorului, care are dreptul s-i organizeze spa iul de lucru dup voie. Pentru a restaura versiunea original distribuit, utilizatorul trebuie s elimine copia din spa iul de lucru prin procedura explicat anterior. Microsoft Word Word memoreaz meniurile i barele de unelte n abloane, similar macrourilor. La modificarea unui meniu sau toolbar, modificrile sunt memorate implicit n template-ul Normal i modificrile sunt accesibile n mod global, adic un asemenea obiect poate fi afiat chiar dac documentul este bazat pe un alt ablon. Un toolbar memorat ntr-un alt template este disponibil doar dac ablonul respectiv este ataat documentului activ sau dac ablonul este ncrcat ca un template global (a se vedea meniul Tools, comanda Templates and Add-ins). Dac se memoreaz o bar de unelte n document, afiarea ei este posibil doar dac documentul respectiv este activ. La distribuirea unei aplica ii Visual Basic cu meniuri i bare de unelte personale, aceste trebuie memorate ntr-un ablon propriu sau ntr-un document. Deoarece fiecare utilizator are propriul template Normal, aplica iile Visual Basic nu trebuie s modifice ablonul Normal. Este recomandat de asemenea s se elimine obiectele personale din interfa la prsirea aplica iei. Dac dou obiecte toolbar cu acelai nume sunt disponibile simultan (unul ntr-un ablon, altul n document), ambele sunt listate n dialogul Customize i pot fi afiate separat sau mpreun n acelai timp. n Visual Basic se poate aduga, modifica sau elimina bare meniu sau de unelte n orice document sau template. Totui, deoarece proprietatea CommandBars se aplic doar obiectului Application, contextul trebuie fixat nainte de efectuarea modificrilor. Similar utilizrii zonei Store in din fia Commands, dialogul Customize, n Visual Basic se va stabili valoarea propriet ii CustomizationContext pentru a specifica un obiect Document sau Template, reprezentnd locul unde se execut modificri. Proprietatea CustomizationContext se fixeaz naintea utilizrii propriet ii CommandBars ceea ce asigur returnarea unei referin e la colec ia corect (din document sau din template). Microsoft PowerPoint Obiectele personale sunt memorate ntotdeauna n spa iul de lucru. La prsirea aplica iei PowerPoint, barele de unelte din spa iul de lucru sunt salvate n fiierul Username.pcb (unde Username este numele logon al utilizatorului). Dac utilizatorul nu este logged on, fiierul este Powerpnt.pcb. Deoarece obiectele din interfa nu sunt vizibile n timpul prezentrii, customizarea este limitat la schimbarea meniurilor i uneltelor accesibile n design mode. Se poate utiliza fie dialogul Customize, fie Visual Basic. Dac aplica ia Visual Basic ofer o interfa modificat pentru proiectarea prezentrilor, se va utiliza Visual Basic pentru modificarea interfe ei i este o bun idee aceea ca la prsirea aplica iei s se elimine modificrile efectuate. Componente ale interfe ei utilizator Meniurile sunt liste cu comenzi din care utilizatorul poate s aleag. Meniurile ofer un mod convenabil i consistent de a grupa comenzi asociate dup func iuni i un mod simplu de acces al utilizatorului. Anumite comenzi pot s determine

226

afiarea unor submeniuri, pe diferite nivele de organizare. Exist de asemenea meniuri contextuale (shortcut menus) care ofer o modalitate de grupare a comenzilor uzuale aplicabile n contextul limitat al unei ac iuni specifice. Se pot asigna chei de acces pentru a permite afiarea imediat a unui meniu, ca i asignarea unor taste directe la comenzi. n plus, meniurile ocup mai pu in loc dect barele de unelte (nu toate comenzile sunt afiate permanent). Barele de unelte con in controale care permit executarea comenzilor des utilizate. Barele de unelte sunt adecvate pentru prezentarea atributelor individuale (cum ar fi bold, italic etc.), pentru comenzile care se pot reprezenta vizual (cum ar chenare, dimensiunile liniilor etc.) i pentru comenzile pentru care se dorete accesul printr-un simplu click. Barele de unelte rmn mereu vizibile i acest fapt conduce la o parcurgere mai uoar pentru determinarea comenzii dorite. Dezavantajele includ necesitatea mouse-ului (controalele nu pot fi accesate din tastatur) i ocuparea spa iului de lucru n detrimentul documentului principal. Pentru prezentarea unui set complex de op iuni se va utiliza o caset de dialog. Dac se dorete plasarea unei unelte mai aproape de datele asociate, cea mai bun solu ie poate fi plasarea unui control direct n document. Mai multe informa ii pot fi gsite n capitolul Controale ActiveX i dialoguri. Sistemul de meniuri n fiecare aplica ie Microsoft Office, sistemul de meniuri este compus dintr-o mul ime de meniuri i cte o mul ime de intrri n fiecare meniu. Fiecare menu este fie un meniu, un submeniu sau un meniu contextual. n continuare termenul de component se refer n mod generic la un meniu sau o intrare ntr-un meniu. O bar de meniu este o bar aezat n partea superioar a ferestrei active i care afieaz numele tuturor meniurilor care sunt permise n aplica ie la un moment dat. O aplica ie din Microsoft Office poate s modifice bara de meniu afiat ca urmare a modificrii ferestrei active (de exemplu editarea unui obiect chart) sau ca rspuns la instruc iuni Visual Basic.

Un meniu este o list de intrri care apare (se deruleaz) la click pe numele meniului din bara de meniu. Un submeniu (child menu) este un meniu ataat de o latur a altui meniu (parent menu), adiacent unei captri particulare a submeniului, localizat n meniul printe. Fiecare captare de submeniu este marcat cu o sgeat punctnd spre dreapta. Submeniurile se pot aduga i la meniurile contextuale. Un submeniu este afiat atunci cnd se puncteaz captarea corespunztoare din meniul printe. Un meniu contextual este un meniu flotant n document i care con ine un grup de comenzi adecvate pentru o anume ac iune (de exemplu procesarea unui paragraf). Meniul contextual este afiat atunci cnd utilizatorul execut un click dreapta pe un obiect care are ataat un asemenea meniu. Ac iuni de adaptare a sistemului de meniuri Sistemul de meniuri se poate modifica ntr-o aplica ie Microsoft Office n diferite moduri: o o crearea de noi bare de meniu adugarea de noi meniuri la barele preconstruite sau personale

227

o o o

adugarea de noi intrri (comenzi sau captri de submeniuri) la meniuri i submeniuri existente (built-in sau custom) adugarea i modificarea meniurilor contextuale atribuirea de macrouri la intrri din meniuri.

n plus, n orice moment se poate restaura meniul sistem predefinit la starea implicit (cea afiat la instalarea aplica iei). Adugarea de componente personale sau modificarea componentelor built-in Fiecare aplica ie din Office are un meniu sistem propriu. Componentele acestuia pot fi modificate sau se pot crea i modifica componente personale. Se alege modificarea unui meniu predefinit atunci cnd interven ia este minim (de exemplu includerea unui meniu care este legat de o macro). Dac este necesar o interven ie masiv, atunci se prefer crearea unei noi bare de meniu i adugarea componentelor proprii pe aceast bar. Utilizarea submeniurilor Dac un meniu devine prea populat, atunci se impune mpr irea comenzilor pe submeniuri. n acest mod se ofer utilizatorului mai pu in informa ie la un moment dat i aplica ia crete n claritate. Organizarea submeniurilor se poate baza pe entit ile procesate (comenzi, clien i etc.) sau pe ac iunile suportate de entit i (adugare, editare etc.). Utilizarea meniurilor contextuale Dac se dorete ca utilizatorul s aib acces la comenzile (mcar cele mai uzuale) aplicabile n contextul unui obiect selectat, comenzi care, n mod uzual, sunt dispersate n mai multe meniuri, solu ia este oferit de meniurile contextuale. Comenzile dorite se vor aduga meniurilor contextuale built-in. n Microsoft Access se pot crea i meniuri contextuale proprii asociate unor obiecte din aplica ie. Utilizarea controalelor Text Box, List Box i Combo Box Dei este posibil s se adauge, prin cod Visual Basic, controale predefinite, sau proprii, de tip textbox, listbox sau combo, la meniuri de orice fel, asemenea controale sunt mai adecvate pentru plasarea n bare de unelte.Casetele text din meniuri pot fi utile n anumite situa ii pentru afiarea sau returnarea unei propriet i. Aceeai utilitate o poate avea un control de tip list sau combo. Neajunsul principal este acela c selectarea unei intrri dintr-o list nchide meniul (utilizatorul trebuie s redeschid meniul pentru a revedea alegerea etc.). Dac se dorete adugarea controalelor de tipurile enumerate (built-in sau proprii) se vor utiliza tehnici descrise n sec iuni ale acestui capitol. Modificrile sistemului de meniuri n timpul proiectrii (design-time) Modificrile descrise aici sunt cele efectuate nainte ca aplica ia s se execute. Sunt incluse adugarea, tergerea, mutarea, restaurarea componentelor din meniuri, ca i fixarea propriet ilor acestora.

228

Adugarea unei bare de meniu proprii n Microsoft Access exist posibilitatea adugrii unei bare proprii de meniu att n Visual Basic, ct i prin dialogul Customize. n Microsoft Excel, Word i PowerPoint adugarea se poate efectua doar prin Visual Basic. Dialogul Customize (doar Microsoft Access) Deschiderea dialogului Customize, Fia Toolbars, click New n boxa Toolbar name se tasteaz numele noii bare i click OK. Click Properties pentru afiarea dialogului Toolbar Properties. n zona Type se alege Menu Bar.

Noua bar de meniu este adugat listei din caseta Toolbars a fiei Toolbars (caseta Customize). Visual Basic Prin metoda Add a colec iei CommandBars se creeaz o nou bar de meniu; argumentul MenuBar al metodei Add determin cnd obiectul CommandBar creat poate fi afiat ca o bar de meniu. Exemplul urmtor realizeaz aceast opera iune: Set cstm = CommandBars.Add(Name:="Custom Menu Bar", Position:=msoBarTop, _ MenuBar:=True, Temporary:=False) Adugarea meniurilor Se poate aduga un meniu la orice bar de meniu built-in sau proprie. Deoarece o aplica ie Office poate afia diferite bare de meniu built-in n contexte diferite, este necesar uneori ca adugarea s aib loc la mai multe bare de meniu, pentru ca utilizatorul s aib acces la meniul adugat indiferent de contextul curent al aplica iei. La adugarea unui meniu se poate specifica o cheie de acces, litera care apare subliniat la afiarea meniului. Observa ie.Dei o aplica ie Microsoft Office poate s listeze barele de unelte cu meniurile contextuale din fia Toolbars a dialogului Customize, utilizatorul nu poate nici aduga meniuri contextuale, nici s tearg meniuri contextuale. Se pot doar aduga noi intrri, modifica intrrile existente sau elimina unele intrri din meniurile contextuale. Anumite opera iuni suplimentare sunt posibile totui n Access i Excel, ac iuni descrise ulterior. Dialogul Customize Afiarea dialogului Customize. Vizualizarea barei de meniu dorite prin selectarea n lista Toolbars. n fia Commands click New Menu n lista Categories. Se trage itemul New Menu din cutia Commands la pozi ia dorit de pe bara de meniu. Click dreapta pe noul menu i completarea numelui n zona Name. Un ampersand (&) situat naintea unui caracter din nume l transform n cheie de acces la meniu.

Adugarea comenzilor este descris ulterior n acest capitol. Dialogul Customize ofer i posibilitatea de adugare a unui meniu built-in la o bar de meniu proprie sau built-in. Comenzile adugate pot fi personalizate fr ca originalul s fie afectat.

229

Afiarea dialogului Customize. Vizualizarea barei de meniu dorite prin selectarea n lista Toolbars. n fia Commands click Built-in Menus n boxa Categories. Se trage un meniu built-in din boxa Commands n pozi ia dorit.

Visual Basic Pentru adugarea unui meniu se utilizeaz metoda Add a colec iei CommandBarControls. Prin aceasta se adaug un meniu la bara reprezentat de obiectul CommandBar implicat. Argumentul Type al metodei Add trebuie dat drept msoControlPopup pentru a indica afiarea unui meniu activarea controlului adugat. Controalele care afieaz meniuri sunt cunoscute drept controale pop-up. Argumentul Before indic pozi ia noului meniu ntre cele deja existente.Proprietatea Caption a obiectului CommandBarPopup returnat de metoda Add este utilizat pentru stabilirea numelui i cheii de acces la noul meniu. Exemplul urmtor adaug un nou meniu la bara meniu a unui caiet Excel: Set cstmAccounting = CommandBars ("Worksheet Menu Bar").Controls _ .Add(Type:=msoControlPopup, Before:=9) cstmAccounting.Caption = "&Accounting") Dup specificarea tastei de acces (prin &), numele poate fi specificat pentru referin fie cu sau fr caracterul ampersand. Adugarea submeniurilor Un meniu (child menu) este un meniu ataat de o latur a altui meniu (parent menu), adiacent unei intrri din meniul printe (titlul submeniului submenu caption), afiat la selectarea titlului. Se pot aduga submeniuri la meniuri, alte submeniuri sau la meniurile contextuale. Similar cu definirea unui meniu, mai nti se definete un submeniu vid la care se adaug apoi intrrile dorite. Dialogul Customize Se afieaz dialogul Customize Dac bara de meniu care con ine meniul la care se face ataarea nu este vizibil se activeaz prin Toolbars. n fia Commands click New Menu n boxa Categories. Se trage New Menu din boxa Commands n pozi ia de pe meniu unde se ataeaz. Dac ataarea este pe un nivel inferior, se trage mai nti pe meniu i pe urm din titlu n titlu pn se deschide nivelul unde are loc ataarea. Click dreapta pe noul submeniu pentru a-i fixa numele n zona Name. Se va utiliza caracterul & pentru stabilirea cheii de acces.

Adugarea intrrilor se discut n continuarea capitolului. Visual Basic Adugarea programatic este similar adugrii unui meniu la o bar de meniu, difer doar nivelul din ierarhia de obiecte: Set cstmAcctProduct = CommandBars("Worksheet Menu Bar").Controls("Accounting") _ .Controls.Add(Type:=msoControlPopup) cstmAcctProduct.Caption = "&Product" adugarea are loc la meniul Accounting creat n exemplul de la meniuri. Cheia direct este litera "P". Se observ c valoarea argumentului Type este tot msoControlPopup, argumentul Before, neutilizat n exemplu, permite fixarea pozi iei

230

noului submeniu ntre intrrile meniului printe. Este de remarcat c titlul submeniului se insereaz o dat cu submeniul i nu exist anterior. Dup definirea titlului submeniului acesta poate fi utilizat la ob inerea unei referin e att cu ampersand. ct i fr. Adugarea i gruparea comenzilor Se poat aduga comenzi la orice meniu propriu sau built-in, modifica aspectul lor i separa vizual n grupuri logice. Dei se pot aduga boxe text, boxe liste sau boxe combo la meniuri/submeniuri, ele nu sunt recomandate. Locul lor este de regul pe barele de unelte. Dac totui se dorete o asemenea adugare se va utiliza re eta dat la discutarea barelor de unelte. Dialogul Customize Pentru adugarea unei comenzi built-in: Se afieaz dialogul Customize. Dac bara de meniu care con ine meniul la care se face ataarea nu este vizibil se activeaz prin Toolbars. n fia Commands se selecteaz o categorie de comenzi din boxa Categories. Comenzile din categoria selectat sunt listate n boxa Commands. Se trage comanda dorit din boxa Commands n pozi ia adecvat din meniu. Navigarea n cazul unei ierarhii de meniuri se realizeaz prin dragare pe meniu, apoi pe titlul submeniului etc.

Se poate realiza copierea unei comenzi built-in prin afiarea meniului care o con ine i tragerea comenzii simultan cu apsarea tastei CTRL. Dialogul Customize ofer i posibilitatea de adugare a unei comenzi proprii la o bar de meniu proprie sau biult-in. Cum fiecare aplica ie din Microsoft Office prezint tehnici diferite pentru realizarea acestei opera iuni, n continuare se discut separat fiecare aplica ie. Microsoft Access Adugarea la un meniu a unei intrri care execut un macro se realizeaz dup aceeai procedur ca la adugarea unei comenzi built-in la un meniu. n boxa Categories click All Macros. Se trage macro-ul dorit n pozi ia sa din meniu. Pentru adugarea unei intrri care execut o procedur func ie se urmeaz de asemenea aceeai pai ca la adugarea unei comenzi built-in: n Categories se alege orice categorie i se trage o comand oarecare pe meniul dorit. Dup aceea, prin click dreapta i selectare Control Properties se deschide dialogul sinonim. n zona Caption se trece noul nume al comenzii iar n On Action se tasteaz o expresie care execut procedura Visual Basic de forma: =functionname(). Microsoft Excel Se urmeaz aceeai pai ca n procedura pentru adugarea unei comenzi built-in la un meniu:; n caseta Categories click Macros i se trage Custom Menu Item din caseta Commands la pozi ia dorit pe meniu. Click dreapta pe noua intrare i apoi click pe Assign Macro. n Macro Name din dialogul Assign Macro se precizeaz numele macroului ataat intrrii. Microsoft Word

231

Se urmeaz aceeai pai ca n procedura pentru adugarea unei comenzi built-in la un meniu:; n caseta Categories click Macros, n caseta Commands apare lista procedurilor ataate i se trage macroul dorit n pozi ia adecvat din meniu. Observa ie. Dac n Word se scrie o procedur al crui nume coincide cu numele unei comenzi built-in (sau dac o procedur cu numele "MAIN" exist ntr-un modul cu nume identic comenzii), procedura va nlocui func ionalitatea predefinit a comenzii built-in de fiecare dat cnd modulul de cod este disponibil. Orice copie a intrrii de meniu (care activa comanda built-in), de pe orice meniu, va executa procedura nlocuitoare. Microsoft PowerPoint Se procedeaz la fel ca n Microsoft Word. Modificarea aspectului unei comenzi Pentru orice comand de pe un meniu se poate afia o imagine alturat numelui comenzii. Controlul aspectului este ob inut prin meniul contextual afiat n timp ce dialogul Customize este activ. Stilul intrrii de meniu poate fi doar text sau text i imagine. Ac iunile uzuale sunt o o o Utilizarea unui buton predefinit: click dreapta pe comand, Change Button Image i selectarea imaginii dorite din caseta afiat. Copierea imaginii unui alt buton: click dreapta pe butonul a crui imagine se copie, Copy Button Image, click dreapta pe butonul unde se copie imaginea i Paste Button Image. Copierea unei imagini dintr-un program de grafic: n programul de grafic se deschide imaginea dorit, selectarea i copierea imaginii (preferabil de mrime 1616 pixeli), comutarea la aplica ia Office, click dreapta pe comand i click Paste Button Image. Editarea imaginii curente a unui buton: click dreapta pe comand, Edit Button Image, se editeaz imaginea n dialogul afiat i OK. Restabilirea imaginii originale (sau nimic dac nu exist imagine implicit): click dreapta i ResetButton Image.

o o

Gruparea comenzilor Comenzile asociate dup func ionalitate se pot grupa prin separarea ntre linii. Liniile nsi nu sunt intrri separate de meniu, apari ia lor fiind un atribut al comenzii care ncepe un nou grup. Pentru a ncepe un grup (prima intrare cu o linie deasupra): o o o Se afieaz dialogul Customize. Se afieaz bara de meniu pe care se afl meniul dorit. Click dreapta pe intrarea de meniu care ncepe grupul i click pe Begin Group. La deschiderea ulterioar a meniului contextual comanda Begin Group apare cu marcajul de selectare i un nou click anuleaz linia de nceput de grup.

Visual Basic Se utilizeaz metoda Add a colec iei CommandBarControls pentru adugarea unei noi intrri la obiectul CommandBar care reprezint un meniu sau un submeniu particular. Pentru adugarea unei comenzi built-in se va specifica numrul ID al comenzii n argumentul Id al metodei Add. Urmtorul exemplu adug comanda Spelling la meniul numit "Quick Tools" de pe bara de meniu "Custom Menu Bar". Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _ .Controls.Add(Id:=2)

232

Informa ii suplimentare se gsesc n sec iunea "Identificarea intrrilor i controalelor din meniuri i bare de unelte". Pentru adugarea unei comenzi proprii, se adaug o intrare nou n meniu i se fixeaz proprietatea OnAction la procedura ini iat de respectiva intrare. Argumentul Type al metodei Add va avea valoarea msoControlButton indicnd o comand. Exemplul urmtor, pentru Microsoft Excel, adaug un meniu Open Database la meniul File. Comanda adugat execut procedura OpenDatabaseProc. Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _ .Controls.Add(Type:=msoControlButton, Before:=3) With databaseItem .Caption = "Open Database" .OnAction = "OpenDatabaseProc" End With Exist multe propriet i ale obiectelor reprezentnd comenzile din meniuri, propriet i care pot fi fixate n Visual Basic. Pentru mai multe informa ii se va studia obiectul CommandBarButton din Help. Textul descriptiv afiat la punctarea controlului poate fi dat n proprietatea TooltipText. n DescriptionText se poate da un text afiat n bara de stare a aplica iei etc. Proprietatea Style stabilete tipul butonului, cu imagine ataat 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 despr itoare de grupul precedent. Astfel databaseItem.BeginGroup = True adaug o linie naintea intrrii definite n exemplul precedent. Se utilizeaz Control(index), unde index este titlul sau indexul unei intrri, pentru a returna obiectul care reprezint intrarea. Dintre metode men ionm doar metoda SetFocus prin care se stabilete focalizarea pe respectiva comand (ac ionarea tastaturii are efect direct asupra controlului) i metoda Execute prin care se execut procedura ataat controlului. Adugarea i modificarea meniurilor contextuale Meniuri contextuale definite de utilizator pot fi create doar n Microsoft Access sau Excel. Aplica iile Word i PowerPoint nu dispun de aceast posibilitate. Crearea meniurilor contextuale se poate efectua prin dialogul Customize (n Access) sau prin Visual Basic (n Access i Excel). n Access, meniurile contextuale pot fi asociate rapoartelor, formelor i controalelor dintr-o form, un meniu contextual fiind afiat la click dreapta pe obiectul ataat. n Excel exist evenimentul BeforeRightClick la care se poate rspunde prin modificarea unui meniu contextual existent sau prin afiarea unui meniu contextual propriu. Modificarea meniurilor contextuale predefinite de aplica ii se poate efectua n mod uzual n toate aplica iile din Microsoft Office. Dialogul Customize

233

Pentru Microsoft Access se poate utiliza dialogul Customize pentru adugarea unui meniu contextual: o o o o o Se afieaz dialogul Customize. n fia Toolbars click New. n boxa Toolbar name se introduce numele noului menu contextual i OK. Este afiat un meniu flotant, vid, cu numele dat. Click Properties pentru afiarea dialogului Toolbar Properties. n Type se selecteaz Shortcut Menu.

Pentru afiarea noului menu contextual din dialogul Customize se va selecta checkboxul de la Shortcut Menus din fia Toolbars. Meniul creat este listat ultimul n bara afiat. Visual Basic Prin metoda Add a colec iei CommandBars se creeaz un nou meniu contextual dac se fixeaz valoarea msoBarPopup pentru argumentul Position al metodei, dup modelul Set cstm = CommandBars.Add(Name:="Shortcuts1", Position:=msoBarPopup, _ MenuBar:=False, Temporary:=False Completarea cu comenzi, modificarea unui meniu contextual se efectueaz prin procedeele descrise la editarea meniurilor/submeniurilor. Prin CommandBars(name), unde name este numele meniului contextual, se returneaz obiectul CommandBar reprezentnd meniul contextual. Opernd cu elementele colec iei Controls disponibil din obiectul CommandBar se poate personaliza meniul contextual. tergerea componentelor meniu Se poate elimina, cu excep ia meniurilor contextuale i a barelor de meniu built-in, orice component de meniu: intrri proprii sau built-in, meniuri proprii sau built-in, bare de meniu proprii. Prin eliminarea componentelor built-in se poate adapta aplica ia proiectat n Visual Basic la necesit ile utilizatorului att prin simplificarea interfe ei (mai ales pentru utilizatori lipsi i de experien ) ct i prin introducerea accesului direct la fuc ionalitatea proiectului. Este de notat c se pot restaura componentele built-in eliminate, dar nu i componentele proprii. Acestea trebuiesc create din nou. Dialogul Customize Cu dialogul Customize deschis se poate elimina orice component de meniu prin o o o Se deschide dialogul Customize Se afieaz bara de meniu unde se afl componenta dorit. Click dreapta pe componenta respectiv i click pe Delete n meniul contextual afiat.

Pentru tergerea unei ntregi bare de meniu proprie, se deschide dialogul Customize, fia Toolbars, click pe numele barei i click pe butonul Delete. n acest mod nu se poate elimina o bar de meniu predefinit. Visual Basic Se utilizeaz metoda Delete pentru a terge o bar de meniu proprie, un meniu/submeniu drop-down propriu sau nu, sau o intrare proprie sau built-in. Nu se poate elimina o bar de meniu built-in sau un meniu contextual.

234

Urmtorul exemplu Excel elimin meniul Edit din bara de meniu pentru diagrame. CommandBars("Chart Menu Bar").Controls("Edit").Delete Urmtorul exemplu terge o bar de meniu proprie CommandBars("Custom Menu Bar").Delete Restaurarea componentelor de meniu built-in Dialogul Customize Utilizarea acestui dialog pentru restaurarea componentelor meniu/submeniu la configura ia original se face prin: o o o Afiarea dialogului Customize. Vizualizarea barei de meniu necesare. Click dreapta pe meniul/submeniul care se restaureaz i click pe Restore n meniul contextual.

Pentru a restaura n totalitate o bar de meniu built-in, se deschide dialogul Customize, click pe numele barei de meniu n lista Toolbars din fia sinonim i click pe butonul Restore. Prin restaurarea barei de meniu, toate meniurile i submeniurile con inute sunt de asemenea restaurate. Visual Basic Metoda Reset aplicat obiectului reprezentnd o component buit-in produce restaurarea componentei, dup modelul CommandBars("Chart Menu Bar").Controls("Edit").Reset aplicabil n Excel sau CommandBars("Menu Bar").Reset care restaureaz, n Word, bara de meniuri sistem. Modificrile sistemului de meniuri n execu ie (run-time) Sistemul de meniuri create n timpul proiectrii poate fi programat astfel nct s rspund dinamic la modificarea condi iilor din timpul execu iei. Se poate nlocui bara de meniu implicit cu o bar proprie. Dac o anumit intrare nu este adecvat ntr-un context dat, atunci ea poate fi inhibat sau eliminat. O intrare care reprezint o op iune cu dou stri, se poate reprezenta imaginea ei ca un buton apsat sau nu. Se poate, de asemenea, redenumi o comand dup ac iunea posibil asupra unei entit i (de genul Hide Show). Este de n eles c toate aceste modificri pot fi efectuate n timpul execu iei prin cod Visual Basic. Afiarea unei bare de meniu Pentru afiarea unei bare proprii de meniu n locul bare de meniu active, se fixeaz proprietatea Visible a obiectului CommandBar corespunztor la valoarea True. Noua bar de meniu vizualizat nlocuiete n mod automat bara activ. Prin fixarea propriet ii Visible la False, se reface bara de meniu implicit, opera iune recomandat naintea prsirii proiectului Visual Basic.

235

La pornirea aplica iei Microsoft Office este afiat bara de meniu implicit. n Word se poate totui nlocui bara implicit a aplica iei la pornire deoarece ultima bar de meniu afiat la oprirea aplica iei Word poate fi salvat n template-ul Normal i restaurat n mod automat. n celelalte aplica ii, ca i n Word, se utilizeaz evenimentul Open pentru fixarea pe True a propriet ii Visible pentru bara de meniu proprie, sau se utilizeaz un macro activat de utilizator sau prin program. Afiarea dinamic a componentelor de meniu Dac o component de meniu se aplic doar unui document particular, este recomandabil ca aceast component s apar doar atunci cnd documentul este activ; acest mod de operare reduce aglomerarea inutil a interfe ei. Se poate limita via a unei componente de meniu doar la perioada n care este deschis sau activ documentul cruia i se aplic. O alternativ este ca asocierea document component de meniu s se gestioneze prin stabilirea propriet ii Visible la True sau False dup cum este necesar, sau nu, componenta respectiv. Procedeul poate fi utilizat inclusiv pentru o bar de meniu i este, uneori, de preferat procedeului prin care se adaug/terge o component. Pentru a afia n mod dinamic componentele de menu, se scriu procedurile de rspuns la evenimente prin care se afieaz sau se ascund, se creeaz sau se terg componentele respective. Dac, ns, aplica ia gazd nu suport evenimente, atunci nu se pot personaliza componentele n mod dinamic. O alternativ este, pentru aceste aplica ii, asignarea procedurilor la proprietatea OnAction a altor elemente de meniu. Dac aplica ia permite controale ActiveX, atunci se poate modifica interfa a aplica iei container ca rspuns la un eveniment suportat de un control ActiveX. Observa ie. Deoarece Word memoreaz personalizrile n documente sau abloane, componentele proprii sunt vizibile atunci cnd documentul sau ablonul este disponibil n contextul curent i ascunse atunci cnd documentul sau templateul nu este disponibil. Prin contrast, deoarece Microsoft Excel memoreaz personalizrile la nivel de spa iu de lucru, modificarea dinamic a interfe ei se realizeaz prin schimbarea propriet ii Visible n proceduri eveniment. Permiterea i inhibarea componentelor de meniu Dac se dorete oprirea utilizatorului de la selectarea unei intrri de meniu, comanda respectiv poate fi inhibat. O comand inhibat apare pe meniu ntr-o culoare tears i nu poate fi activat. Acest atribut este stabilit de proprietatea Enabled care la True permite accesul la comand iar la False interzice accesul. Proprietatea nu se poate fixa pentru intrri built-in de meniu i nici pentru un submeniu ca obiect (pot fi inhibate ns toate intrrile submeniului). Urmtorul exemplu Excel adaug comanda Open Database la meniul File a barei de meniu pentru foaia de calcul i apoi inhib comanda adugat: CommandBars("Worksheet Menu Bar").Controls("File") _ .Controls.Add("Open Database").Enabled = False Dac proprietatea este stabilit la nibvelul unui meniu, ca n exemplul urmtor, toate comenzile meniului sunt interzise: CommandBars("Worksheet Menu Bar").Controls("File").Enabled = False Indicarea strii unei intrri de meniu Dac o intrare a unui meniu reprezint o op iune cu dou stri, este posibil s se modifice aspectul imaginii comenzii nct s arate ca un buton apsat sau ridicat, potrivit strii op iunii. Aceasta se realizeaz prin stabilirea propriet ii State a intrrii. Proprietatea poate avea una dintre valorile (constantele MsoButtonState): msoButtonUp, msoButtonDown sau msoButtonMixed. Exemplul urmtor (n Excel) comut ntre cele dou stri ale unei comenzi proprii inserate n meniul View:

236

Sub DatabaseView() With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database") If .State = msoButtonUp Then .State = msoButtonDown ' comutare la viziunea database Else .State = msoButtonUp ' comutare la viziunea worksheet End If End With End Sub n timpul execu iei se poate schimba imaginea butonului prin lucrul cu proprietatea FaceId pentru a schimba imaginea n momentul schimbrii strii comenzii. Pentru a specifica imaginea de buton care s fie afiat alturi de comand, trebuie s se gseasc comanda built-in cu imaginea dorit, s se determine ID su i s se atribuie aceast valoare propriet ii FaceId (schimbarea propriet ii FaceId nu modific func ionalitatea comenzii). Urmtorul exemplu Excel amplific exemplul precedent prin schimbarea imaginii n func ie de stare. Sub DatabaseView() With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database") If .State = msoButtonUp Then .FaceId = 987 .State = msoButtonDown ' comutare la viziunea database Else .FaceId = 1 .State = msoButtonUp ' comutare la viziunea worksheet End If End With End Sub Redenumirea unei intrri de meniu Proprietatea Caption con ine denumirea intrrii. Modificnd valoarea propriet ii se poate prezenta utilizatorului o comand adecvat contextului curent. Exemplul urmtor arat cum se poate utiliza acest fapt. Se ncepe prin inserarea unei comenzi Open Database, moment n care comanda se nlocuiete cu comanda Close Database, adecvat contextului: CommandBars("MyMenuBar").Controls("File").Controls("Open Database") _ .Caption = "Close &Database" La redenumirea intrrii trebuie avut grij ca alte proceduri care se refer la comand s utilizeze n referin e noul nume. Se poate utiliza, evident, o variabil care se refer la intrarea de meniu, ceea ce nltur problemele suplimentare care apar la redenumire: Set openDatabase = CommandBars(("MyMenuBar"). _ Controls("File").Controls("Open Database") Schimbarea titlului se efectueaz prin openDatabase.Caption = "Close &Database"

237

Bare de unelte Fiecare aplica ie Microsoft Office ofer un sistem de bare de unelte (toolbar) con innd controale pe care utilizatorul le ac ioneaz pentru a avea acces la comenzile frecvente. Fiecare toolbar poate s apar depozitat (docked) la una dintre laturile ferestrei aplica iei sau ca o fereastr flotant pozi ionat oriunde n spa iul de lucru. Fiecare control de pu un toolbar este control grafic prin care utilizatorul poate schimba informa ii cu aplica ia Visual Basic. Afiarea unei bare de unelte ntr-o aplica ie Office se realizeaz prin meniul View, comanda Toolbars i click pe numele barei dorite. Imaginea ataat barei respective devine selectat. Un nou click ascunde bara de unelte. Bare de unelte adi ionale pot fi vzute n dialogul Customize, n lista din Categories. Exist mai multe tipuri de controale care apar pe o bar de unelte, discutate n continuare. Cel mai comun tip de unealt este un buton de control simplu, cu o imagine. Grafica, denumit imaginea butonului, este o reprezentare vizual a comenzii sau op iunii activate de respectivul control. Utilizatorul poate s ac ioneze un buton pentru a executa o ac iune (de exemplu butonul New creeaz un nou document) sau s comute ntre dou stri posibile (cum ar fi butonul Bold). Alt tip de control este un buton de control care con ine o imagine i o palet derulabil ataat. Utilizatorul ac ioneaz sgeata n jos a controlului penbtru a afia paleta de unde selecteaz op iunea dorit. Ac ionarea butonului (nu a sge ii) aplic op iunea selectat (indicat prin grafic). Un exemplu de acest gen este controlul Font Color. Un control poate fi de tip text box, list box sau combo box. Utilizatorul poate fie tasta text n zona de text, fie ac iona sgeata n jos i selecta un element al listei. De exemplu, controlul Font Size de pe bara de unelte Word Formatting permite nscrierea direct a mrimii fontului sau selectarea dintr-o list disponibil de mrimi. Ultimul tip de unealt este controlul pop-up, care afieaz un meniu cu alte controale. n esen un asemenea control este similar cu un meniu, exemplul fiind butonul Draw care produce la activare afiarea barei de unelte Drawing. Observa ie. Dei sunt identice ca aparen i comportare, controalele de pe barele de unelte nu sunt aceleai cu controalele ActiveX. Nu se pot aduga controale ActiveX la bare de unelte i nu se pot aduga controale de toolbar la documente sau forme. Principii de adaptare a barelor de unelte Aplica iile Microsoft Office ofer o mare varietate de modalit i pentru modificarea barelor de unelte: se pot crea noi bare de unelte, se pot aduga noi butoane la barele existente, se poate modifica imaginea de pe un buton, se pot asigna macro-uri, texte ToolTip de ajutor, text asociat afiat n bara de stare a aplica iei. Dac se modific o bar built-in sau se creeaz o bar de unelte proprie depinde de numrul de modificri inten ionate sau de dorin a proiectantului. Este recomandabil ca adugarea sau modificarea unui numr mic de butoane s se efectueze pe o bar de unelte predefinit, n timp ce proiectele mari s dispun de bare de unelte proprii. Indiferent de calea aleas, configura ia standard poate fi restaurat oricnd. Modificrile pot fi efectuate n timpul proiectrii (design-time) sau n timpul execu iei (run-time) prin proceduri Visual Basic. Este preferabil ca modificrile principale s se efectueze n timpul proiectrii i doar eventualele modificri dinamice, func ie de ac iunile utilizatorului, s se efectueze n run-time. O schimbare frecvent a sistemului de meniuri poate ngreuna ac iunile utilizatorului. Utilizarea meniurilor La orice bar de unelte, built-in sau proprie, se pot aduga controale pop-up, aceleai ca la crearea meniurilor/submeniurilor. Aceast ac iune este un compromis acceptabil ntre modificarea unei bare de meniu i

238

introducerea unui mare numr de butoane unelte. Reamintim butonul Draw, sau AutoShapes, de pe bara de unelte Drawing care deschide un meniu. Adugarea meniurilor, submeniurilor i intrrilor la o bar de unelte se realizeaz n modul descris n sec iunile precedente care se refer la personalizarea meniurilor. Utilizarea controalelor Text box, List box i Combo box Controale de tip text box, list box i combo box se pot aduga att la barele de unelte built-in ct i la barele proprii. Aceste controale pot fi utile pentru ob inerea repetat a unor informa ii de la utilizator sau pentru executarea unei proceduri dependente de valoarea controlului. Dialogul Customize suport adugarea unor controale predefinite (built-in) la orice bar de unelte. Pentru adugarea unor controale proprii se va utiliza Visual Basic prin care se pot proiecta i aduga controale de tipurile discutate aici. Dac dialogul Customize este deschis, se poate modifica l imea oricrui control (built-in sau propriu) text box, list box sau combo box. Modificrile barelor de unelte n timpul proiectrii (design-time) n aceast sec iune se prezint crearea unei noi bare de unelte, adugarea de controale noi (built-in sau proprii), eliminarea controalelor dintr-o bar de unelte, gruparea controalelor i schimbarea dimensiunilor controalelor text box, list box i combo box. Se poate de asemenea modifica sau edita imaginea de pe un control. Adugarea unei bare de unelte Dac se dorete ca uneltele proprii s fie con inute ntr-o bar de unelte separat, procesul se desfoar n dou etape: crearea barei i adugarea controalelor (similar lucrului cu barele de meniu). Se poate utiliza dialogul Customize sau Visual Basic. Dialogul Customize Se afieaz dialogul Customize n fia Toolbars click New. n Toolbar name se introduce numele noii bare de unelte i OK. Se afieaz o bar de unelte flotant, cu numele introdus. La aceasta se pot aduga controale.

Noul toolbar este adugat la lista Toolbars de pe fia Toolbars a dialogului Customize. Visual Basic Se utilizeaz Add a colec iei CommandBars pentru a crea o nou bar de unelte. Prin fixarea argumentului Position la msoBarLeft, msoBarTop, msoBarRight, msoBarBottom sau msoBarFloating se stabilete dac obiectul CommandBar creat este flotant sau aliniat la o latur (docked). Urmatorul exemplu creeaz i afieaz o bar de unelte nou numit "Custom Tools". Set cstm = CommandBars.Add(Name:="Custom Tools", Position:=msoBarFloating, _ MenuBar:=False, Temporary:=False) cstm.Visible = True

239

Adaugarea i gruparea controalelor Pe lng adugarea controalelor la orice bar de unelte, acestea pot fi separate prin linii dup func ionalitate. Dialogul Customize Prin dialogul Customize se pot aduga controale built-in n modul urmtor: Se afieaz dialogul Customize Prin fia Toolbars se vizualizeaz bara de unelte care se modific. n fia Commands se alege categoria necesar de comenzi. Comenzile categoriei sunt afiate n caseta Commands. Se trage controlul care se adaug din lista Commands n pozi ia sa de pe bara de unelte.

Pentru adugarea controalelor proprii fiecare aplica ie Office are particularit ile ei, prezentate n continuare. Microsoft Access Pentru adugarea unui control care execut un macro se urmeaz paii descrii anterior dar n Categories (fia Commands) se selecteaz All Macros. Se trage apoi macroul dorit din lista Commands pe bara de unelte. Pentru un control care execut o procedur de tip Function se procedeaz similar n primii pai dar pe bar se trage orice control (din orice categorie). Dup pozi ionarea pe bara de unelte, click dreapta pe control i deschiderea dialogului Control Properties n care se fixeaz numele n Caption i ac iunea de executare a procedurii Visual Basic n On Action. Expresia trebuie s aib sintaxa: =functionname(). Microsoft Excel Se urmeaz aceiai pai descrii anterior, dar n Categories se alege Macros, se trage controlul Custom Button din lista Commands n pozi ia stabilit pe bara de unelte. Click dreapta pe noul control i Assign Macro in meniul contextual. n dialogul Assign Macro se selecteaz macroul executat de buton. Microsoft Word Similar procedurii de la Excel, n Categories se alege Macros i se trage din lista Commands denumirea procedurii dorite pe bara de unelte care se modific. Utiliznd meniul contextual afiat pentru noul control se stabilesc atributele sale. Este de revzut i observa ia fcut la subiectul similar de la meniuri privind procedurile proprii care au acelai nume cu controalele built-in. Microsoft PowerPoint Se procedeaz la fel ca n Word. Modificarea aparen ei unei unelte Aspectul unui buton de pe o bar de unelte poate fi o imagine, un text sau ambele. Aspectul este determinat de stilul butonului, fixat prin comenzile din meniul contextual disponibil n timp ce este activ dialogul Customize. Stilurile posibile pentru un buton sunt descrise n tabelul urmtor.

240

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 i numele

Atunci cnd dialogul Customize este activ, se poate schimba imaginea de pe buton ntr-unul din modurile descrise la procedura similar de la intrrile unui meniu. Gruparea controalelor ntr-un mod similar celui de la gruparea comenzilor de pe un meniu, pentru a ncepe un grup cu un control se activeaz dialogul Customize i n meniul contextual al controlului se alege Begin Group. O nou activare a acestei comenzi elimin linia separatoare de grup. Visual Basic Se utilizeaz metoda Add a colec iei CommandBarsControls pentru adugarea unui nou control la obiectul CommandBar care reprezint toolbarul care se modific. Adugarea unui control built-in se efectueaz specificnd numrul ID al controlului n argumentul Id al metodei Add. Urmtorul exemplu adaug controlul built-in Spelling la bara numit "Quick Tools". Set mySpell = CommandBars("Quick Tools").Controls.Add(Id:=2) Pentru adugarea unui control propriu se adaug un nou control i apoi se fixeaz proprietatea OnAction pe procedura Visual Basic executat la clickarea controlului. n argumentul Type se d valoarea msoControlButton pentru a arta c este bvorba de un buton. Se poate stabili proprietatea FaceId la ID-ul unui control built-in pentru a-i da o imagine definit. Urmtorul exemplu (n Excel) adaug un buton pe bara de unelte Standard, naintea butonului Save. Butonul reprezint procedura OpenDatabaseProc. Exemplul stabilete imaginea butonului la o gril (ID 987). Set databaseItem = CommandBars("Standard").Controls. _ Add(Type:=msoControlButton, Before:=3) With databaseItem .OnActiona = "OpenDatabaseProc" .FaceId = 987 End With Pentru a ncepe un nou grup se fixeaz pe True proprietatea BeginGroup a obiectului CommandBarButton, CommandBarPopup sau CommandBarComboBox reprezentnd controlul. Se utilizeaz Controls(index), unde index este titlul sau indicele controlului, pentru a returna obiectul reprezentnd controlul. Adugarea i ini ializarea controalelor text box, list box i combo box Dac un control de acest tip este built-in, adugarea lui se poate efectua prin dialogul Customize n mod similar adugrii altor controale built-in.

241

Pentru adugarea i ini ializarea con inutului unui control propriu de tip text box, list box sau combo box se poate utiliza doar Visual Basic. Prin metoda Add a colec iei CommandBarControls se poate crea un asemenea control 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 dac titlul (textul) apare n stnga boxei respective. Urmtorul exemplu adaug un control combo box cu eticheta "Quarter" la o bar de unelte proprie i atribuie controlului macro-ul cu numele "ScrollToQuarter". Set newCombo = CommandBars("Custom1").Controls. _ Add(Type:=msoControlComboBox) With newCombo .AddItem "Q1" .AddItem "Q2" .AddItem "Q3" .AddItem "Q4" .Style = msoComboNormal .OnAction = "ScrollToQuarter" End With La executarea aplica iei Visual Basic, procedura atribuit controlului n proprietatea OnAction este apelat de fiecare dat cnd se modific controlul. n procedur se poate utiliza proprietatea ActionControl a obiectului CommandBars pentru a gsi care control a fost schimbat i a returna valoarea modificat. Proprietatea ListIndex returneaz intrarea introdus n combo box. Eliminarea unui control dintr-o bar de unelte Eliminarea controalelor poate fi necesar att pentru c unele ac iuni sunt executate prin interfa a proprie proiectat, ct i pentru simplificarea interfe ei cu un utilizator mai pu in experimentat. Restaurarea configura iilor standard este posibil pentru barele de unelte built-in. Barele de unelte i controalele proprii trebuiesc create din nou n vederea restaurrii unei configura ii ini iale. Dialogul Customize Pentru a terge un control: o o o Se deschide dialogul Customize. Se afieaz bara de unelte care se modific prin fia Toolbars. Click dreapta pe controlul care se elimin i comanda Delete din meniul contextual.

242

Pentru a elimina o ntreag bar de unelte proprie se deschide dialogul Customize, click pe numele barei n lista Toolbars a fiei sinonime i click pe butonul Delete. Nu se pot elimina barele built-in (acestea se afieaz sau nu prin View Toolbars etc.). Visual Basic Se utilizeaz metoda Delete pentru a elimina din colec ia corespunztoare un obiect de control sau bar de unelte proprie. Nu se poate elimina o bar de unelte built-in. Urmtorul exemplu Excel elimin controlul Print din bara de unelte Standard. CommandBars("Standard").Controls("Print").Delete iar pentru a terge o bar proprie de unelte CommandBars("Custom Bar").Delete Restaurarea barelor de unelte built-in Din dialogul Customize o o o Se afieaz dialogul Customize. n fia Toolbars se selecteaz bara de unelte care se restaureaz. Click Restore.

n Visual Basic se utilizeaz metoda Reset: CommandBars("Standard").Reset Barele de unelte proprii nu se restaureaz n mod automat; ele se creeaz din nou. Modificrile barelor de unelte n timpul execu iei (run-time) Barele de unelte pot fi programate astfel nct s rspund dinamic la schimbrile de condi ii din timpul execu iei. Ac iunile posibile uzuale sunt interzicerea accesului la un buton i comutarea imaginii apsat/ridicat. Afiarea sau ascunderea controalelor i barelor de unelte Pentru mrirea spa iului de lucru sau pentru simplificarea interfe ei cu utilizatorul, o bar de unelte poate fi afiat doar atunci cnd este necesar. Vizibilitatea unei bare este dependent de valoarea propriet ii Visible, cu valorile True i False. Fixarea valorii True este echivalent cu selectarea barei n lista Toolbars din dialogul Customize i click pe OK. Urmtoarea procedur Excel, atribuit intrrii de meniu View MyToolbar din meniul View, comut strile intrrii din meniu i proprietatea Visible a barei de unelte de fiecare dat cnd utilizatorul face click pe intrarea din meniu. Sub ViewMyAppToolbar() With CommandBars("Worksheet Menu Bar").Controls("View"). _ Controls("View MyToolbar") If .State = msoButtonUp Then .State = msoButtonDown CommandBars("MyAppTools").Visible = True Else

243

End Sub

End With

End If

.State = msoButtonUp CommandBars("MyAppTools").Visible = False

Atunci cnd o bar de unelte este vizibil, utilizatorul poate ac iona orice control de pe ea. Prin fixarea propriet ii Visible drept True sau False se poate efectiv aduga sau elimina un control din spa iul de lucru al utilizatorului fr a terge efectiv controlul. Observa ie. Deoarece Microsoft Word salveaz personalizrile la nivel de documente sau abloane, barele de unelte proprii i controalele proprii sunt vizibile doar dac documentul sau template-ul este disponibil. Microsoft Excel salveaz personalizrile la nivel de spa iu de lucru i se va utiliza proprietatea Visible n coduri activate de evenimente pentru a modifica dinamic interfa a cu utilizatorul. Mutarea i redimensionarea barelor de unelte Adaptarea proeminen ei pe ecran a unei bare de unelte la contextul curent a aplica iei se poate efectua i prin schimbarea locului pe ecran, a dimensiunilor. Propriet ile Height, Width, Left, Top i Position permit manevrri de pozi ie i dimensiune pentru un obiect CommandBar. Restaurarea barelor de unelte built-in Metoda Reset realizeaz restaurarea unui obiect predefinit. Urmtorul exemplu realizeaz refacerea tuturor barelor de unelte built-in i eliminarea tuturor barelor proprii. Pentru aceasta se folosete proprietatea BuiltIn care returneaz True pentru un obiect predefinit. For Each cb In CommandBars If cb.BuiltIn Then cb.Reset Else cb.Delete End If Next Observa ie. Prin restaurarea barelor built-in se elimin i toate controalele proprii inserate n acele bare. Se poate pierde astfel accesul la o procedur din aplicatia Visual Basic. Pentru a ocoli aceast capcan se recomand ca eliminarea controalelor proprii de pe o bar de unelte built-in s se efectueze individual, n func ie de contextul curent i nu prin restaurare global. Permiterea i interzicerea accesului la controale Ca alternativ la afiarea i ascunderea controalelor se poate permite sau interzice accesul prin manevrarea propriet ii Enabled. Proprietatea poate fi utilizat i pentru aflarea strii curente a controlului. Urmtorul exemplu inhib butonul al treilea de pe bara Standard. CommandBars("Standard").Controls(3).Enabled = False Un control interzis produce un beep la ac ionare i nu lanseaz procedura asociat.

244

Indicarea strii activ/inactiv a unui buton Pentru butoanele care comut ntre dou stri, proprietatea State, cu valorile msoButtonDown i msoButtonUp, poate fi utilizat, similar exemplelor de la meniuri, pentru reprezentarea grafic a celor dou op iuni posibile. Modificarea controalelor Text box, List box i Combo box Dac se utilizeaz controale proprii de tip text box, list box sau combo box, n timpul execu iei se poate modifica textul afiat n zona text a controlului sau aduga/elimina intrri n listele controalelor. Proprietatea Text reflect textul afiat n zona text a controlului i poate fi fixat pe o valoare reflectnd modificri din aplica ie. Metodele AddItem i RemoveItem permit procesarea listelor din controale. Alte propriet i i metode se vor studia din Help. De exemplu exist posibilitatea declarrii unui antet de list (intrri separate de celelalte printr-o linie). ID-uri de controale i intrri de meniu Fiecare aplica ie Office con ine un set unic de bare de meniuri i de unelte i un set unic de intrri de meniuri i de controale, doar o mic parte dintre acestea apar efectiv n aplica ie. De asemenea, dup cum s-a explicat la nceputul capitolului, fiecare aplica ie are un mod unic de memorare a meniurilor i barelor de unelte. n timp ce func ionalitatea asociat cu fiecare intrare built-in de meniu i cu fiecare unealt apar ine unei aplica ii Office specifice, titlul, imaginea de pe buton, l imea i alte propriet i implicite sunt memorate ntr-o resurs partajat de toate aplica iile. Referin ele la componentele con inute n aceast unic resurs se fac prin numerele ID specifice intrrilor de meniu i uneltelor. Aceeai resurs comun con ine de asemenea propriet ile implicite ale controalelor pop-up care afieaz meniurile builtin. Totui, aceste controale pop-up nu con in i intrrile meniurilor built-in, cu alte cuvinte controalele pop-up sunt vide. Referirea la ID-uri poate fi ocolit prin utilizarea dialogului Customize. Sunt ns situa ii cnd referin a este necesar: o o o Se dorete atribuirea unui intrri la un meniu/bar de unelte predefinit sau proprie iar intrarea respectiv nu este disponibil din dialogul Customize n design-time. Se adaug o intrare built-in la un meniu sau la o bar de unelte n run-time. Se dorete copierea unei imagini de buton la alt buton n run-time.

Se poate atribui ID-ul unui element built-in la argumentul Id al metodei Add pentru colec ia CommandBarsControls, sau se poate atribui ID-ul unui element la proprietatea FaceId a oricrui control propriu sau built-in. Observa ie. Chiar dac resursa partajat con ine informa ie despre orice element de interfa din toate aplica iile Office, nu se pot aduga ntr-o aplica ie intrri i controale a cror func ionalitate este con inut n alt aplica ie. Se poate totui copia, i n cazul func ionalit ilor distincte, imaginea butoanelor de la o aplica ie la alta. Pentru determinarea ID-urile elementelor de interfa dintr-o aplica ie Office, se poate urma una din cile: o ntr-un modul se scrie cod pentru atribuirea unui element de meniu sau control dintr-o bar de unelte la o variabil obiect. Se utilizeaz apoi mijloacele de debug pentru a vedea valoarea propriet ii Id a obiectului. Numrul ob inut se memoreaz i poate fi ulterior utilizat.

245

Se execut urmtoarea procedur ntr-o aplica ie Office pentru a crea un document text care con ine lista ID-urilor i titlurilor tuturor comenzilor built-in din aplica ie.

Public Sub outputIDs() Const maxId = 4000 Open "c:\ids.txt" For Output As #1 ' crearea unei bare temporare cu toate elementele disponibile asignate Set cbr = CommandBars.Add("Temporary", msoBarTop, False, True) For i = 1 To maxId On Error Resume Next cbr.Controls.Add ID:=i Next On Error GoTo 0 ' scrierea ID i titlu pentru fiecare control For Each btn In cbr.Controls Write #1, btn.ID, btn.Caption Next ' eliminarea barei de comand i nchiderea fierului de ieire cbr.Delete Close #1 End Sub o Executarea procedurii urmtoare ntr-o aplica ie Office pentru a crea un set de bare de unelte proprii care con in attea butoane cte valori valide de proprietate FaceId exist n Office; fiecare imagine de buton i textul ToolTip este fixat la o asemenea valoare. Se poate referi ncruciat ID-ul unei comenzi built-in la proprietatea FaceId a unui buton de pe aceste bare i reciproc.

Sub MakeAllFaceIds() ' Make fourteen bars with 300 faces each. ' Note that maxId is greater than last valid ID, so ' error will occur when first invalid ID is used Const maxId = 3900 On Error GoTo realMax For bars = 0 To 13 firstId = bars*300 lastId = firstId + 299 Set tb = CommandBars.Add For i = firstId To lastId Set btn = tb.Controls.Add btn.FaceId = i btn.ToolTipText = "FaceId = " & i Next tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(lastId)) tb.Width = 591 tb.Visible = True Next ' Delete the button that caused the error and set toolbar name realMax: btn.Delete tb.Name = ("Faces " & CStr(firstId) & " to " & CStr(i1)) tb.Width = 591 tb.Visible = True End Sub

246

Not. ID-urile controalelor pop-up pentru meniurile built-in sunt n domeniul 30002 30426. Reamintim c aceste ID-uri returneaz copii vide ale meniurilor predefinite. Forme grafice (shapes) i stratul de desen Visual Basic dispune de un model de obiecte, reprezentnd stratul de desen, comun aplica iilor Microsoft Word, Microsoft Excel i Microsoft PowerPoint. Obiectul cel mai sus n ierarhia acestui model este colec ia Shapes, care con ine toate obiectele grafice AutoShapes, forme libere, obiecte OLE, imagini care pot fi incluse n stratul de desen al documentului. Este de notat c formele grafice incluse n stratul de text din Word nu sunt incluse n colec ia Shapes. Pentru o discu ie mai ampl privind controalele ActiveX, care sunt o categorie special de forme grafice, se va vedea capitolul Dialoguri i controale ActiveX. Observa ie. Pentru simplificarea exprimrii se utilizeaz termenul "form" pentru shape, dei "form grafic" ar fi mai potrivit n contextul subiectului. Obiectele Shape, ShapeRange i Shapes Exist trei obiecte diferite care reprezint formele: colec ia Shapes, reprezentnd toate formele din stratul de desen dintrun document Microsoft Excel, Word sau PowerPoint, colec ia ShapeRange, care reprezint o submul ime de forme din stratul de desen i obiectul Shape, care reprezint o form grafic individual. n general, se utilizeaz colec ia Shapes atunci cnd se adaug forme pe stratul de desen sau se parcurg toate formele; se utilizeaz obiectul Shape cnd se dorete formatarea sau procesarea unei anumite forme grafice i se utilizeaz colec ia ShapeRange cnd se dorete procesarea/formatarea unui grup de forme grafice. O colec ie ShapeRange poate con ine oricte elemente. Dac include un singur obiect, este similar unui obiect Shape. Se poate utiliza o colec ie ShapeRange care con ine toate elementele din Shapes pentru a formata toate formele n acelai timp. Propriet ile i metodele care se aplic obiectului Shape se pot aplica de asemenea i colec iei ShapeRange. Returnarea colec iei Shapes O referin la colec ia Shapes se ob ine prin proprietatea sinonim aplicat unui obiect document. Exemplul urmtor selecteaz toate formele din stratul de desen: myDocument.Shapes.SelectAll Returnarea obiectului Shape Un obiect Shape poate fi ob inut prin intermediul colec iei Shapes, n modul general de ob inere a unui element dintr-o colec ie, dup unul dintre exemplele urmtoare: myDocument.Shapes(3).Duplicate myDocument.Shapes("Red Square").Duplicate Fecare form are un nume atribuit n mod implicit, cum ar fi "Rectangle 3", ob inut la adugarea formei la colec ia Shapes. Prin proprietatea Name se poate atribui un nume sugestiv. Acest lucru se poate realiza concomitent cu adugarea/crearea formei: myDocument.Shapes,AddShape(msoShapeRectangle, 144, 144, 72, 72) _ .Name = "Red Square"

247

Aceast metod, care utilizeaz obiectul returnat de metoda AddShape, poate fi utilizat i cu alte propriet i sau metode ale obiectului Shape. Returnarea colec iei ShapeRange Prin referin e de tipul Shapes.Ranges(index), unde index este fie numele, fie indicele, fie un tablou de denumiri sau de indici, se returneaz o colec ie ShapeRange care reprezint un subset a colec iei Shapes. Exemplul urmtor umple formele 1 i 3 din myDocument: myDocument.Shapes.Range(Array(1, 3)).Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientLateSunset Se utilizeaz Selection.ShapeRange pentru a returna o colec ie ShapeRange care reprezint toate formele din selec ie. Prin Selection.ShapeRange(index), unde index este un indice sau un nume de form, se ob ine accesul la un obiect Shape din selec ie: ActiveWindow.Selection.ShapeRange(1).Fill.PresetGradient _ msoGradientHorizontal, 1, msoGradientLateSunset Observa ie. Macro recorderul genereaz cod bazat pe selec ie. Atunci cnd se scrie cod direct, sau se editeaz codul generat de macro recorder, se poate crea un cod mai eficient prin returnarea formelor direct din colec ia Shapes. Desenarea unei forme pe un Document, Worksheet sau Slide Adugarea unei forme pe stratul de desen se efectueaz printr-una dintre metodele colec iei Shapes dedicate acestui scop. Fiecare tip de form se ob ine printr-o metod specific i acestea sunt enumerate n tabelul urmtor. Tipul de form grafic Callout Note ataabile (doar PowerPoint) Linie sau curb care conecteaz dou forme diferite Curb Bzier Control nativ de formular Excel (doar Microsoft Excel) Etichet Linie Sound sau movie (doar PowerPoint) Control ActiveX (doar Word; pentru Excel i PowerPoint se utilizeaz AddOLEObject) Obiect OLE scufundat sau legat Metoda AddCallout AddComment AddConnector AddCurve AddFormControl AddLabel AddLine AddMediaObject AddOLEControl AddOLEObject Parametri (Type, Left, Top, Width, Height, Anchor) (Left, Top, Width, Height) (Type, BeginX, BeginY, EndX, EndY) (SafeArrayOfPoints) (Type, Left, Top, Width, Height) (Orientation, Left, Top, Width, Height) (BeginX, Beginy, EndX, EndY) (FileName, Left, Top, Width, Height) (ClassType, Left, Top, Width, Height, Anchor) (ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height, Anchor)

248

Imagine

AddPicture

(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height, Anchor) (Type, Left, Top, Width, Height) (SafeArrayOfPoints) (Type, Left, Top, Width, Height) (Orientation, Left, Top, Width, Height) (PresetTextEffect, Text, FontName, FontSize, FontBold, FontItalic, Left, Top, Anchor) (EditingType, X1, Y1)

Rezervare de loc pentru text sau pentru un obiect grafic (doar PowerPoint) Linie poligonal nchis sau deschis AutoShape (form predefinit) TextBox WordArt

AddPlaceholder AddPolyline AddShape AddTextbox AddTextEffect

Titlu de diapozitiv (doar PowerPoint) Form liber

AddTitle BuildFreeform ConvertToShape

ntre parametri se remarc Left i Top care specific pozi ia formei, Width i Height care fixeaz dimensiunile obiectului grafic. Pentru explica ii suplimentare asupra parametrilor care nu sunt suficient de explici i se vor studia intrrile respective din Help. Editarea unei forme Prin intermediul propriet ilor i metodelor obiectelor Shapes i ShapeRange se pot modifica formele grafice reprezentate. Acestea pot fi repozi ionate n document, redimensionate, eliminate; se poate schimba aspectul lor i li se poate aduga text. Determinarea propriet ilor i metodelor adecvate Propriet ile i metodele care controleaz atributele i comportarea comune tuturor tipurilor de forme se aplic direct obiectelor Shapes i ShapeRange. Propriet ile i metodele care se aplic doar unor categorii de forme sunt ncapsulate n obiecte secundare care se acceseaz prin obiectul Shape. Propriet i i metode comune n aceast categorie sunt incluse propriet ile care controleaz dimensiunea i pozi ia formei (Left, Top, Height, Width) i metode care controleaz comportri generice de editare (cum ar fi Duplicate i Zorder). Un exemplu uzual este With myDocument.Shapes(1) .Height = 50 .Width = 100 End With Propriet i i metode specifice Atributele specifice unui anumit tip de form sunt grupate sub obiecte secundare, cum ar fi FillFormat, con innd propriet ile care se aplic formelor cu culori de umplere, sau CalloutFormat, con innd toate propriet ile baloanelor

249

(callouts). Pentru a lucra cu acest tip de atribute trebuie s se returneze mai nti obiectele care le con in. De exemplu, se utilizeaz proprietatea Fill pentru a returna obiectul FillFormat i se poate aplica apoi proprietatea ForeColor: myDocument.Shapes(1).Fill.FillColor.RGB = RGB(255,0,0) n tabelul urmtor sunt prezentate obiectele accesibile din obiectul Shape i care con in propriet ile i metodele specifice. Se remarc faptul c nu toate denumirile propriet ilor con in cuvntul "Format" existent n obiectul returnat (precum Fill care returneaz FillFormat). Proprietatea obiectului Shape Callout ConnectorFormat (Excel i PowerPoint) ControlFormat (Excel) Fill Line LinkFormat OLEFormat PictureFormat Shadow TextEffect ThreeD WrapFormat (doar Word) Obiectul returnat CalloutFormat ConnectorFormat ControlFormat FillFormat LineFormat LinkFormat OLEFormat PictureFormat ShadowFormat TextEffectFormat ThreeDFormat WrapFormat Aplicabil la Baloane de dialog Conectori de forme Controale de formular native Forme cu culori de umplere (toate cu excep ia liniilor) Toate formele (LineFormat reprezint linia sau chenarul) Obiecte OLE legate, imagini legate (doar Word), cmpuri legate (doar Word) Obiecte OLE Imagini i obiecte OLE Toate formele Obiecte WordArt Forme care pot fi reliefate Forme care pot fi nconjurate de text

ncercarea de a returna obiecte secundare (cum ar fi CalloutFormat, ConnectorFormat, OLEFormat, PictureFormat sau TextEffectFormat) dintr-un tip inadecvat de form produce eroare. Pentru alte obiecte (FillFormat, LineFormat, ShadowFormat sau ThreeDFormat) nu se produce eroare chiar dac forma container nu suport obiectul returnat. Pentru a nu avea probleme se va utiliza proprietatea Type i, cnd este aplicabil, proprietatea AutoShapeType, nainte de aplicarea unei metode sau propriet i specifice i se va introduce o secven de tratare a erorii. For Each sh In myDocument.Shapes If sh.Type = msoLinkedOLEObject Then sh.LinkFormat.Update End If Next

250

Culorile de umplere ale formelor Prin culorile de umplere se n elege nu numai culoarea efectiv utilizat pentru colorarea suprafe ei formei ci i efectele utilizate la colorare, precum i posibilitatea de a utiliza o imagine drept fundal etc. Obiectul FillFormat reprezint ntreaga umplere a formei, propriet ile i metodele sale permit stabilirea culorii, tipului, transparen ei. Deoarece atributele legate de culori i tipuri de umplere sunt interdependente, stabilirea unui atribut produce, de regul, modificri ale altor atribute, astfel nct s se ob in o mul ime consistent de atribute. Din acelai motiv multe atribute sunt read-only, valorile lor fiind atribuite n func ie de metodele utilizate. Tipul de umplere se stabilete printr-una dintre metodele Background (doar PowerPoint), OneColorGradient, Patterned, PresetGradient, PresetTextured, Solid, TwoColorGradient, UserPicture sau UserTextured, corespunznd op iunilor disponibile n interfa a utilizator a aplica iilor. Prin propriet ile read/write BackColor, ForeColor, Transparency i Visible se poate controla aspectul umplerii. Deoarece sunt foarte multe valori predefinite pentru propriet i sau argumentele metodelor, valorile respective se vor lua din intrrile Help corespunztoare obiectelor implicate. Urmtorul exemplu adaug o form dreptunghiular la document, fixeaz cele dou culori i tipul de gradient pentru umplere: Public Sub fil() Dim sh As Shape Set sh = ThisDocument.Shapes.AddShape(msoShapeRectangle, 90, 90, 90, 50) sh.WrapFormat.Type = wdWrapTight With sh.Fill .ForeColor.RGB = RGB(200, 0, 0) .BackColor.RGB = RGB(0, 200, 170) .TwoColorGradient msoGradientHorizontal, 1 .Visible = msoTrue End With End Sub Adugarea de umbre i efecte 3-D Proprietatea Shadow a obiectului Shape returneaz un obiect ShadowFormat prin care se controleaz umbririle formei. Urmtorul exemplu produce adugarea unei umbre albastre semitransparente, cu dimensiune de 4 puncte: With sh.Shadow .Transparency = 0.5 .ForeColor.RGB = RGB(0, 0, 255) .Visible = msoTrue .OffsetY = 4 .OffsetX = 4 End With Proprietatea ThreeD a obiectului Shape returneaz un obiect ThreeDFormat care controleaz reliefarea formei. Urmtorul exemplu adaug efectul de extrudare i precizeaz o adncime de 50 de puncte, purpurie, perpendicular i luminat de sus With sh.ThreeD .Visible = msoTrue .Depth = 50 .ExtrusionColor.RGB = RGB(255, 0, 255)

251

.Perspective = msoFalse .PresetLightingDirection = msoLightingTop End With Este normal ca acest efect s nu fie suportat de anumite forme. Adugarea de text la o form Zona din interiorul unei forme care poate con ine text este numit cadru cu text, text frame, i este reprezentat de un obiect TextFrame. Acest obiect, returnat de proprietatea TextFrame, con ine textul propriu-zis, precum i propriet ile i metodele care controleaz alinierea i ancorarea cadrului cu textul. Doar formele built-in de tip AutoShapes bidimensionale au asociate cadre cu text. naintea referirii obiectului TextFrame se verific disponibilitatea acestuia prin proprietatea HasTextFrame (valabil n PowerPoint) sau prin verificarea propriet ii Type. Se poate utiliza i tratarea erorilor n cazul n care proprietatea TextFrame poate fi aplicat unui obiect care nu o suport. n Microsoft Word se utilizeaz proprietatea TextRange a obiectului TextFrame pentru a returna un obiect Range care reprezint textul din cadrul respectiv: ActiveDocument.Shapes(1).TextFrame.TextRange.Text = " " n Microsoft Excel se utilizeaz proprietatea Characters a obiectului TextFrame pentru a returna un obiect Characters care reprezint textul din interiorul cadrului: ActiveWorksheet.Shapes(1).TextFrame.Characters.Text = " " n PowerPoint, se utilizeaz proprietatea TextRange a obiectului TextFrame pentru a returna un obiect TextRange care reprezint domeniul textului din cadrul respectiv: ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text = " " Lucrul cu obiecte OLE Propriet ile i metodele obiectului OLEFormat, cum ar fi Activate i DoVerb, controleaz obiectul OLE con inut ntr-o form. Obiectul OLEFormat este returnat de proprietatea OLEFormat a obiectului Shape: With myDocument.Shapes(3) If .Type = msoEmbeddedOLEObject Or _ .Type = msoLinkedOLEObject Then .OLEFormat.DoVerb End If End With Utilizarea propriet ii Object a obiectului OLEFormat returneaz obiectul OLE con inut n forma desenat specificat (n Excel trebuie s se utilizeze de dou ori proprietatea Object ntr-o linie, separate de operatorul punct, pentru a returna obiectul OLE). Urmtorul exemplu, executat din Word sau PowerPoint, adaug text la celula A1 a primei foi de calcul dintr-un caiet Excel con inut n forma a treia din myDocument. With myDocument.Shapes(3)

252

.OLEFormat.Activate .OLEFormat.Object.Worksheets(1).Range("A1").Value = " noul text " End With Proprietatea Application a obiectului OLE, returnat de proprietatea sinonim, d acces la obiectul din vrful ierarhiei modelului de obiecte al aplica iei care a creat obiectul OLE. Urmtorul exemplu, executat din Microsoft Excel (se va remarca dubla utilizare a propriet ii Object), afieaz numele aplica iei n care a fost creat fiecare obiect OLE scufundat n foaia activ: For Each s In ActiveSheet.Shapes If s.Type = msoEmbeddedOLEObject Then s.OLEFormat.Activate MsgBox s.OLEFormat.Object.Object.Application.Name End If End With Lucrul cu mai multe forme Pentru a lucra cu mai multe forme se poate parcurge o colec ie Shapes sau ShapeRange i lucra cu fiecare element al colec iei sau se poate construi o colec ie ShapeRange cu toate formele grafice care se prelucreaz i se aplic metode sau propriet i ntregii colec ii ShapeRange. Exist i posibilitatea, disponibil n interfa a utilizator, de a grupa mai multe forme grafice, precum i posibilitatea de aliniere a formelor. Dac opera iunea dorit se poate executa n interfa a utilizator pe o selec ie multipl de forme grafice, atunci construirea unei colec ii ShapeRange este recomandat. Dac opera iunea nu se poate efectua n interfa a utilizator pe o selec ie multipl, atunci parcurgerea unei colec ii, Shapes sau ShapeRange, este calea adecvat. Parcurgerea poate fi efectuat printr-o structur uzual For Each Next: For Each sh In myDoc.Shapes If sh.Type = msoAutoShape Then sh.TextFrame.TextRange.InsertAfter " (version 1)" End If Next Construirea unui ShapeRange Dac este necesar ob inerea unui domeniu de forme care s con in doar forme de anumite tipuri, se va utiliza o instruc iune condi ional de testare a atributelor i se va aduga denumirea sau indicele formei selectate la un tablou dinamic. Se va construi apoi un obiect ShapeRange utiliznd acest tablou. Urmtorul exemplu construiete un domeniu de forme cu toate formele de tip AutoShapes din document i apoi le grupeaz. With myDocument.Shapes numShapes = .Count If numShapes > 1 Then numAutoShapes = 0 ReDim autoShpArray(1 To numShapes) For i = 1 To numShapes

253

If .Item(i).Type = msoAutoShape Then numAutoShapes = numAutoShapes + 1 autoShpArray(numAutoShapes) = .Item(i).Name End If Next If numAutoShapes > 1 Then ReDim Preserve autoShpArray(1 To numAutoShapes) Set asRange = .Range(autoShpArray) asRange.Group End If End If End With Lucrul cu colec ia ShapeRange Atunci cnd se aplic propriet i sau metode colec iei ShapeRange, se va ine seama de urmtoarele principii: Aplicarea unei metode colec iei este echivalent cu aplicarea acelei metode la fiecare obiect Shape din colec ie. Stabilirea unei propriet i a colec iei este echivalent cu stabilirea acelei propriet i fiecrui obiect Shape din colec ie. proprietate a colec iei care returneaz o constant, returneaz valoarea comun dac toate obiectele componente au o aceeai valoare, sau constant "mixed" (de exemplu msoLineDashStyleMixed pentru stilul de punctare a liniei). proprietate a colec iei care returneaz un tip de dat simplu, cum ar fi Long, Single sau String, returneaz valoarea propriet ii pentru a form dac toate formele au aceeai valoare a propriet ii. Valoarea anumitor propriet i poate fi returnat sau stabilit numai dac exist exact o form n colec ie. Dac exist mai multe forme n colec ie, atunci apare o eroare. Acest fapt apare atunci cnd se utilizeaz o proprietate sau metod care se poate aplica doar pentru un obiect.

Aceste principii ac ioneaz i atunci cnd se lucreaz cu propriet i sau metode ale formelor, grupate n obiecte secundare ale colec iei ShapeRange (cum ar fi FillFormat). Urmtorul exemplu construiete un obiect ShapeRange din dou forme numite i aplic ambelor o umplere de tip gradient. Set myRange = myDoc.Shapes.Range(Array("Big Star", "Little" Star")) myRange.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientBrass Metodele Align i Distribute sunt utilizate pentru alinierea sau distribuirea uniforma a formelor dintr-o colec ie ShapeRange. Prin metoda Zorder se poate modifica ordinea pe Z care determin ordinea de suprapunere a formelor. Metoda Group realizeaz gruparea tuturor formelor dintr-o colec ie ShapeRange. Prin Ungroup, Regroup se realizeaz opera iunile sinonime din interfa a utilizator. Dac se dorete lucrul cu o form individual dintr-un grup, dar fr a renun a la grupare n prealabil, se utilizeaz proprietatea GroupItems a obiectului Shape care reprezint grupul. Proprietatea returneaz un obiect GroupShapes i metoda Item a acestui obiect returneaz o form individual din grupul de forme: With myDocument.Shapes .AddShape(msoShapeIsoscelesTriangle, 10, 10, 100, 100).Name = "shpOne" . AddShape(msoShapeIsoscelesTriangle, 150, 10, 100, 100).Name = "shpTwo" . AddShape(msoShapeIsoscelesTriangle, 300, 10, 100, 100).Name = With .Range(Array("shpOne", "shpTwo", "shpThree")).Group

254

.Fill.PresetTextured msoTextureBlueTissuePaper .GroupItems(2).Fill.PresetTextured msoTextureGreenMarble End With End With Tratarea erorilor i depanarea programelor Acest capitol arat cum s se utilizeze uneltele de depanare i verificare a programelor oferite de Visual Basic Editor. Sunt prezentate i modurile n care se pot controla erorile din execu ie (run-time errors) aprute n urma ncercrii de a executa opera iuni interzise. Informa iile din acest capitol se aplic proiectelor VBA din Microsoft Excel 97, Word 97 i PowerPoint 97. Cum se gestioneaz erorile n mod ideal, procedurile Visual Basic n-ar trebui s con in cod de tratare a erorilro. Realitatea arat ns c probleme hardware sau ac iuni neanticipate ale utilizatorului pot s produc erori n execu ie, ca urmare programul se oprete i exist pu ine anse ca utilizatorul s continue execu ia aplica iei. Sunt posibile i erori care dei nu opresc execu ia produc rezultate ulterioare eronate. De exemplu, procedura urmtoare returneaz True dac fiierul specificat exist i False dac nu, dar nu con ine instruc iuni de tratare a erorilor. Function FileExists (filename) As Boolean FileExists = (Dir(filename) <>"") End Function Func ia Dir returneaz primul fiier care se potrivete numelui specificat sau un ir de lungime zero n cazul cnd nu exist nici o potrivire. Codul anterior pare a fi corect i acoperitor pentru toate situa iile posibile. Totu, dac litera de drive specificat nu este valid, apare eroarea "Device unavailable". Dac unitatea este de floppy disk, func ia va func iona corect doar dac n unitate este o dischet i poarta este nchis. n caz contrar Visual Basic va semnala eroarea "Disk not ready" i execu ia se oprete. Pentru a ocoli asemenea situa ii, trebuie s se utilizeze modalit ile de error-handling din VBE pentru a intercepta erorile (sau "a prinde" - trapping) i a executa ac iuni corective. La apari ia unei erori, Visual Basic stabilete diferite propriet i ale obiectului reprezentnd eroare, Err, cum ar fi numrul erorii, descrierea etc. Obiectul Err poate fi utilizat ntr-o rutin de tratare a erorii astfel nct aplica ia poate rspunde inteligent la o situa ie de eroare. De exemplu, probleme legate de unitate, cum ar fi o unitate invalid sau o unitate de floppy fr dischet, pot fi tratate dup modelul urmtor. Function FileExists (filename) As Boolean Dim Msg As String ' Trecerea la tratarea erorilor On Error GoTo CheckError FileExists = (Dir(filename) <> "") ' nu a aprut nici o eroare Exit Function CheckError: ' secven a de tratare a erorii aprute ' definirea constantelor care reprezint eroarea Const mnErrDiskNotReady = 71, mnErrDeviceUnavailable = 68

255

' vbExclamation, vbOK, vbCancel, vbCritical i vbOKCancel ' sunt constante definite n biblioteca VBA If (Err.Number = mnErrDiskNotReady) Then Msg = "Put a floppy disk in the drive and close the door" ' Afiarea mesajului If MsgBox(Msg, vbExclamation & vbOKCancel) = vbOK Then Resume Else Resume Next End If ElseIf Err.Number = mnErrDeviceUnavailable Then Msg = "This drive or path does not exist: " & filename MsgBox Msg, vbExclamation Resume Next Else Msg = "Unexpected error #" & Str(Err.Number) & " occurred: " _ & Error.Description ' Afiarea mesajului MsgBox Msg, vbCritical Stop End If Resume End Function n acest cod, proprietatea Number a obiectului Err con ine numrul asociat cu eroarea aparut; proprietatea Description con ine o scurt descriere a erorii. Instruc iunea Resume returneaz controlul la instruc iunea care a produs eroarea iar Resume Next returneaz controlul la instruc iunea urmtoare celei care a produs eroarea. Proiectarea unei rutine de tratare a erorilor O secven de tratare a erorilor, error handler, este o rutin care capteaz i rspunde la erori n aplica ie. Asemenea secven e se pot aduga la orice procedur unde se anticipeaz posibilitatea unei erori (se poate presupune c orice instruc iune Visual Basic poate produce o eroare, cu excep ia cazurilor cnd se tie explicit c acest fapt nu poate avea loc). Procesul de proiectare a unui error handler necesit trei pai: 1. Stabilirea, sau permiterea, unei captri de erori prin specificarea locului din program unde se va efectua transferul controlului atunci cnd apare o eroare. Instruc iunea On Error permite captarea erorii i transferul controlului execu iei la eticheta specificat. 2. Scrierea unei rutine de tratare a erorilor, care s rspund tuturor erorilor anticipate. Dac execu ia i-a transferat controlul n aceast secven , se zice c secven a este activ (capcana de prindere a erorii este activ). 3. Ieirea (prsirea) secven ei error-handling. Detalii sunt oferite n sec iunile care urmeaz. Stabilirea capcanei de erori O capcan de erori este activat atunci cnd se execut o instruc iune On Error, care specific o secven de tratare a erorilor. Capcana rmne deschis att timp ct procedura care o con ine este activ, adic pn cnd este executat o instruc iune Exit Sub, Exit Function, Exit Property, End Sub, End Function sau End Property din procedura care include secven a de tratare a erorilor. Dei numai o capcan de erori poate fi permis la un moment dat n orice

256

procedur, se pot crea mai multe capcane alternative care s fie activate la diferite momente. O capcan de erori poate fi inhibat prin utilizarea instruc iunii On Error GoTo 0. Pentru activarea unei capcane de erori se utilizeaz instruc iunea On Error GoTo line, unde line este eticheta care identific secven a de instruc iuni, din procedur, care trateaz erorile. Scrierea unei rutine de tratare a erorilor Primul pas n scrierea unei rutine error-handling este adugarea unei etichete de linii pentru marcarea nceputului secven ei de tratare a erorilor. O conven ie comun este aceea de a plasa codul error-handler la sfritul procedurii i a-l preceda de o instruc iune Exit Sub, Exit Function sau Exit Property. Aceasta permite procedurii s nu execute codul de tratare a erorilor atunci cnd nu apar erori. Corpul rutinei de tratare a erorilor con ine cod de identificare a erorii aprute, prin structuri Select Case sau If...Then...Else. Este obligatoriu ca o alternativ s se refere la erorile neanticipate i care nu sunt tratate individual. Proprietatea Number a obiectului Err con ine un cod numeric reprezentnd cea mai recent eroare. Utilizarea obiectului Err n combina ie cu structurile Select Case sau If...Then...Else, se pot lua ac iuni specifice fiecrei erori. Ieirea din rutina de tratare a erorilor Urmtorul tabel cuprinde instruc iunile prin care se poate iei dintr-o secven error-handling. Acest fapt nseamn, n general, cedarea controlului execu iei ctre alt instruc iune din procedura activ. Instruc iunea Resume [0] Descriere Execu ia programului se reia cu instruc iunea care a cauzat eroarea sau cel mai recent apel al procedurii con innd rutina error-handling. Este utilizat pentru a repeta o opera iune dup ce s-a corectat situa ia care a produs eroarea. Reia execu ia programului cu instruc iunea imediat urmtoare celei care a cauzat eroarea. Dac eroarea a aprut n afara procedurii care con ine codul de eroare, execu ia se reia cu instruc iunea imediat urmtoare apelului la procedura unde a aprut eroarea, dac procedura apelat nu are activat o secven de eroare. Reia execu ia programului cu instruc iunea avnd eticheta specificat n line, unde line este o etichet de linie (sau un numr de linie diferit de zero) care se gsete n aceeai procedur ca i error-handler-ul. Declaneaz eroarea de execu ie avnd numrul specificat. Atunci cnd o asemenea instruc iune este executat n interiorul rutinei de eroare, Visual Basic caut lista de apeluri pentru alt rutin de tratare a erorilor. (Lista de apeluri este lan ul de proceduri apelate pentru a ajunge n punctul curent de execu ie. Informa ii suplimentare se gsesc n sec iunea "Ierarhia tratrii erorilor.)

Resume Next

Resume line

Err:Raise Number:=number

Diferen a dintre Resume i Resume Next Diferen a este c Resume continu execu ia cu instruc iunea care a generat eroarea (instruc iunea este reexecutat), n timp ce Resume Next continu cu instruc iunea care urmeaz celei care a generat eroarea. n general, se utilizeaz Resume atunci cnd eroarea poate fi corectat. Se poate scrie cod care s nu arate utilizatorului ca avut loc o eroare, sau cod care s permit utilizatorului s corecteze eroarea.

257

Exemplul urmtor ncearc efectuarea unei mpr iri "sigure", fr a afia erorile care pot s apar: "Division by zero" (numitor egal cu zero, numrtor nenul), "Overflow" (i numitorul i numrtorul sunt egali cu zero) sau "Illegal procedure call" (un operand este o valoare nenumeric, sau nu poate fi considerat numeric). In toate cele trei cazuri procedura urmtoare returneaz Null. Function Divide (numer, denom) As Variant Const mnErrDivByZero = 11, mnErrOverFlow = 6, mnErrBadCall = 5 On Error GoTo MathHandler Divide = numer / denom Exit Function MathHandler: If Err.Number = mnErrDivByZero Or Err.Number = mnErrOverFlow _ Or Err.Number = mnErrBadCall Then Divide = Null Else MsgBox "Unanticipated error " & Err.Number & ": " & _ Err.Description, vbExclamation End If Resume Next End Function Reluarea execu iei la o linie specificat Prin Resume line se d controlul execu iei la linia specificat. Urmtorul exemplu ilustreaz utilizarea acestei instruc iuni ntr-o variant a procedurii FileExists prezentat ntr-un exemplu anterior. Function VerifyFile As String Const mnErrBadFileName = 52, mnErrDriveDoorOpen = 71 Const mnErrDeviceUnavailable = 68, mnErrInvalidFileName = 64 Dim strPrompt As String, strMsg As String, strFileSpec As String strPrompt = "Enter file specification to check:" StartHere: strFileSpec = "*.*" strMsg = strMsg & vbCRLF & strPrompt ' Let the user modify the default strFileSpec = inputBox(strMsg, "File Search", strFileSpec, 100, _ 100) ' Exit if user deletes default If strFileSpec = "" Then Exit Function On Error GoTo Handler VerifyFile = Dir(FileSpec) Exit Function Handler: Select Case Err.Number Case ErrInvalidFileName, ErrBadFileName strMsg = "Your file specification was invalid; _ try another." Case mnErrDriveDoorOpen strMsg = "Close the disk drive door and try again." Case mnErrDeviceUnavailable strMsg = "The drive you specified was not found. _ Try again." Case Else Dim intErrNum As Integer intErrNum = Err.Number

258

End Select Resume StartHere ' The user can try another file name End Function

Err.Clear Err.Raise Number:=intErrNum ' Regenerate the error

Dac este gsit un fiier care se potrivete specifica iei, func ia returneaz numele fiierului. Dac nu se potrivete nici un fiier, func ia returneaz un ir de lungime zero. n cazul apari iei unei dintre erorile anticipate, se afieaz mesajul corespunztor (prin intermediul variabilei strMsg) i utilizatorul poate ncerca un nou nume prin reluarea de la eticheta StartHere. Dac apare o eroare diferit de cele anticipate (i posibile n opera iunea efectuat), pe ramura de program Case Else se regenereaz eroarea nct urmtoarea capcan de erori din lista de apeluri poate s intre n ac iune. Acest fapt este necesar din cauz c dac eroarea nu ar fi regenerat, codul ar continua s se execute la linia Resume StartHere. Prin regenerare, eroarea apare din nou i noua eroare va fi captat la urmtorul nivel din stiva de apeluri. Ierarhia de tratare a erorilor Un error-handler permis este unul care a fost activat prin executarea unei instruc iuni On Error i nu a fost interzis (prin On Error GoTo 0 sau prin prsirea procedurii care l con ine). Un error-handler activ este cel care se execut curent. Pentru a fi activ, o secven error-handling trebuie s fie mai nti permis, dar nu toate secven ele permise sunt i active. De exemplu, dup o instruc iune Resume, un handler este dezactivat dar rmne permis. La apari ia unei erori ntr-o procedur, care nu are o secven error-handling permis, sau ntr-o rutin error-handling activ, Visual Basic caut lista de apeluri pentru a gsi o alt rutin permis de tratare a erorilor. Lista de apeluri este secven a de apeluri care conduce la procedura curent; ea este afiat n dialogul Call Stack, disponibil n modul break prin meniul View, comanda Call Stack. Cutarea n lista de apeluri Presupunem urmtoarea succesiune de apeluri: 1. O procedur eveniment apeleaz procedura A. 2. Procedura A cheam procedura B. 3. Procedura B apeleaz procedura C. n timp ce se execut C, celelalte proceduri sunt suspendate. Dac apare o eroare n procedura C iar procedura nu are un error- handler, Visual Basic caut napoi n lista de apeluri - mai nti B, apoi A, apoi procedura de eveniment, dar att - i execut prima secven ntlnit de tratare a erorii. Dac nu exist nici o asemenea secven , atunci se afieaz un mesaj implicit de eroare i se oprete execu ia aplica iei. Dac Visual Basic gsete o secven error-handling, execu ia continu n acea rutin, ca i cum eroarea ar fi aprut n procedura care con ine rutina error handling respectiv. Dac o instruc iune Resume sau Resume Next este executat n rutina error handling, execu ia continu dup cum este artat n tabelul urmtor. Instruc iunea Resume Rezultatul Apelul la procedura pe care Visual Basic tocmai a cercetat-o n lista de apeluri este reexecutat. n apelurile considerate mai sus, dac procedura A are un error handler permis care include o instruc iune Resume, Visual Basic reexecut apelul la procedura B.

259

Resume Next

Execu ia se ntoarce la instruc iunea care urmeaz ultimei instruc iuni executate n acea procedur. Aceasta este instruc iunea care urmeaz apelului la procedura pe care Visual Basic tocmai a cercetat-o n lista de apeluri. n lista de apeluri exemplificat, dac procedura A are un error handler permis care include o instruc iune Resume Next, execu ia se ntoarce la instruc iunea de dup apelul la procedura B.

De notat c instruc iunea executat este n procedura unde s-a gsit rutina de tratare a erorilor i nu n mod necesar n procedura unde a aprut eroarea. Dac nu se ine seama de acest aspect esen ial al tratrii erorilor, execu ia poate prea de neexplicat n momentul apari iei unei erori. Pentru o verificare mai simpl a codului, se poate trece n modul break n momentul apari iei unei erori, dup cum este explicat ulterior n acest capitol ("Oprirea tratrii erorilor"). Dac erorile tratate n secven a error-handler nu includ eroarea aprut, se poate produce o eroare neanticipat n procedura care are un error handler permis: procedura poate s bucleze la infinit, n special cnd error handlerul execut o instruc iune Resume. Pentru a preveni o asemenea situa ie, se va utiliza metoda Raise a obiectului Err ntr-o secven Case Else (sau similar) din handler. Aceasta genereaz o eroare din secven a de tratare activ, for nd Visual Basic s caute n lista de apeluri un handler care s se ocupe de eroarea aprut. Efectul unei cutri regresive n lista de apeluri este greu de prevzut, deoarece depinde de instruc iunea Resume sau Resume Next executat. Trebuie gndit c execu ia nu se reia, n mod necesar, n procedura unde a aprut eroarea, ci n procedura unde este un error-handler activ. Indica ii pentru o tratare complex a erorilor La scrierea unei aplica ii Visual Basic mari, care utilizeaz diverse module, codul de tratare a erorilor poate fi foarte complex. Se vor urmri urmtoarele linii generale: o n timpul verificrii/depanrii codului, se va utiliza metoda Raise a obiectului Err pentru a regenera eroarea n toate secven ele de eroare pentru cazurile neanticipate. Pe lng o cutare ierarhic pentru un handler care s trateze eroarea, Visual Basic va afia un mesaj de eroare pentru acele erori care nu sunt tratate n cod. Se pot identifica astfel erori posibile i care pot fi considerate la o nou dezvoltare a aplica iei. Se va utiliza metoda Clear dac trebuie s se ini ializeze n mod explicit obiectul Err dup tratarea unei erori. Acest fapt este necesar atunci cnd se utilizeaz tratarea pe loc a erorilor cu On Error Resume Next. Visual Basic apeleaz automat metoda Clear de fiecare dat cnd execut orice tip de instruc iune Resume, Exit Sub, Exit Function, Exit Property sau orice instruc iune On Error. Dac nu se dorete ca alt procedur din lista de apeluri s capteze eroarea, se va utiliza instruc iunea Stop pentru a for a terminarea codului. Instruc iunea Stop permite examinarea contextului erorii n mediul de dezvoltare. Se va scrie o procedur error handler de siguran (fail-safe) sigur care s fie apelat de toate secven ele de tratare a erorilor ca ultim ac iune pentru erorile care nu sunt gestionate. Aceast procedur poate efectua o terminare controlat a aplica iei prin descrcarea formelor i salvarea datelor.

Testarea tratrii erorilor prin generarea de erori Simularea erorilor este util n timpul verificrii aplica iei sau cnd se doreste tratarea unei condi ii particulare ca i cum ar fi echivalent unei erori de execu ie. De exemplu, se scrie un modul care utilizeaz un obiect definit ntr-o aplica ie extern i se dorete ca erorile returnate de acel obiect s fie tratate de restul aplica iei precum erorile Visual Basic. Pentru a testa toate erorile posibile se vor genera erorile prin cod. Aceast opera iune implic metoda Raise a obiectului Err. Metoda are sintaxa object.Raise number, source, description, helpfile, helpcontext

260

unde object este obiectul Err. number este un ntreg Long identificnd natura erorii. Erorile Visual Basic (att Visual Basic ct i definite de utilizator) sunt n domeniul 0-65535. La stabilirea propriet ii Number pentru coduri proprii de eroare n module clas se va aduga numrul de cod propriu la constanta vbObjectError. De exemplu, generarea erorii cu numrul 1050 implic atribuirea valorii vbObjectError + 1050 la proprietatea Number. source este op ional, ir denumind obiectul sau aplica ia care genereaz eroarea. La stabilirea acestei propriet i pentru un obiect se va utiliza project.class. Dac nu se precizeaz sursa se utilizeaz ID-ul proiectului Visual Basic curent. description este optional, ir care descrie eroarea. n cazul cnd nu se specific acest argument se atribuie irul implicit pentru o eroare Visual Basic (cum este returnat de func ia Error) sau "Application-defined or object-defined error" n cazul unei cod propriu de eroare. helpfile este optional, calea complet ctre un fiier Microsoft Windows Help n care se poate gsi ajutor pentru eroarea generat. Implicit se va utiliza informa ia asociat cu fiierul Visual Basic Help. helpcontext este optional, ID de context pentru intrarea din fiierul de ajutor. n mod implicit se consider informa ia unei erori Visual Basic, dac exist. n cazul utilizrii metodei Raise fr specificarea anumitor argumente iar valorile propriet ilor obiectului Err con in valori care nu au fost cur ate, aceste valori sunt luate n considerare. Este de men ionat c instruc iunea Error poate fi utilizat de asemenea pentru generarea de erori, dar obiectul Err dispune de o informa ie mai bogat. Acest fapt este util n special la crearea modulelor clas. Se poate simula orice eroare Visual Basic prin considerarea numrului de cod al erorii respective. Definirea erorilor proprii n afara erorilor definite de Visual Basic, utilizatorul poate s defineasc erori proprii, care s permit identificarea unor condi ii proprii aplica iei proiectate, captarea acestor erori efectundu-se mai departe dup procedura general. Procesul de definire se realizeaz prin adugarea de noi numere de eroare la constanta vbObjectError. Constanta vbObjectError rezerv numere de la offsetul propriu la suma offsetului cu 512. Utiliznd un numr mai mare dect acesta asigur c numerele proprii de eroare nu intr n conflict cu viitoarele versiuni de Visual Basic. Pentru a defini numere de eroare proprii se adaug constante la sec iunea de declara ii a modulului: ' Error constants Const gLostCarrier = 1 + vbObjectError + 512 Const gNoDialTone = 2 + vbObjectError + 512 Se poate utiliza ulterior metoda Raise pentru noile numere de eroare, cu utilizarea eventual a descrierilor proprii de eroare. Tratarea inline a erorilor Atunci cnd se testeaz apari ia erorilor imediat dup fiecare linie de cod care poate produce erori, se zice c tratarea erorilor este inline. Utiliznd acest mod de tratare a erorilor, se pot scrie func ii i instruc iuni care returneaz numerele de

261

eroare aprute; se poate genera o eroare Visual Basic ntr-o procedur i gestiona eroarea n procedura apelant; se poate scrie o func ie care s returneze o dat de tip Variant i utiliza acest rezultat n procedura apelant. Returnarea numerelor de eroare Cea mai simpl metod de acest gen este crearea unor func ii i instruc iuni care returneaz, atunci cnd apar erori, numere de eroare (sau constante cu aceast semnifica ie) n loc de valorile uzuale. De exemplu Function FileExists (p As String) As Long If Dir (p) <> "" Then FileExists = conSuccess Else FileExists = conFailure End If End Function care poate fi utilizat prin Dim ResultValue As long ResultValue = FileExists ("C:\Testfile.txt") If ResultValue = conFailure Then ... ' se trateaaz eroarea Else ... ' se proceseaz fiierul End If Lucrul esen ial n tratarea inline a erorilor este testarea apari iei unei erori imediat dup instruc iunea sau apelul de func ie care poate s produc eroarea. n acest mod se poate proiecta un handler care anticipeaz exact tipul de erori care pot s apar. Aceast abordare nu necesit ca o eroare de execu ie s apar efectiv. Tratarea erorilor n procedura apelant Alt metod pentru a indica apari ia unei erori este s se genereze o eroare Visual Basic n procedur activ i s se trateze eroarea ntr-un handler inline din procedura apelant. Exemplul urmtor arat o variant a procedurii FileExists n care se genereaz un numr de eroare n cazul eecului. naintea apelului func iei, instruc iunea On Error Resume Next stabilete propriet ile obiectului Err dar nu precizeaz o rutin error-handling. Instruc iunea On Error Resume Next este urmat de codul de tratare a erorii. Acesta testeaz propriet ile obiectului Err pentru a vedea dac a aprut o eroare. Dac Err.Number nu con ine zero, atunci a aprut o eroare. Function FileExists (p As String) If Dir (p) <> "" Then Err.Raise conSuccess Else Err.Raise conFailure End If End Function Dim ResultValue As Long On Error Resume Next ResultValue = FileExists ("C:\Testfile.txt")

262

If Err.Number = conFailure Then ... ' se trateaz eroarea Else ... ' se continu programul End If Urmtorul exemplu, mai complex, utilizeaz att valoarea returnat, ct i un argument pentru a detecta apari ia unei erori. Function Power (X As Long, P As Integer, ByRef Rezult As Long) _ As Long On Error GoTo ErrorHandler Result = X^P Exit Function ErrorHandler: Power = conFailure End Function ' Apelul func iei Power Dim lngReturnValue As Long, lngErrorMayBe As Long lngErrorMayBe = Power (10, 2, lngReturnValue) If lngErrorMayBe = conFailure Then ... ' tratarea erorii Else ... ' continuarea programului End If Utilizarea datelor de tip Variant Alt cale pentru a returna informa ii despre erorile eventuale este utilizarea datelor de tip Variant i func iile asociate, potrivit exemplului urmtor. O variabil de tip Variant are un indicator privind tipul de dat con inut i acest tag poate fi fixat ca un cod de eroare Visual Basic. Function Power (X As Long, P As Integer) As Variant On Error GoTo ErrorHandler Result = X^P Exit Function ErrorHandler: Power = CVErr(Err.Number) ' convertete codul de eroare n tagged Variant End Function ' Apelul func iei Power Dim varReturnValue As Variant varReturnValue = Power (10, 2) If IsError (varReturnValue) Then ... ' tratarea erorii Else ... ' continuarea programului End If Tratarea centralizat a erorilor Atunci cnd se adaug cod de tratare a erorilor la o aplica ie, tratarea inline produce tratri repetate ale acelorai erori. Codul poate fi redus prin scrierea unor proceduri apelate repetat de secven ele error handling.

263

Func ia FileErrors din exemplul urmtor afieaz un mesaj adecvat erorii produse i, cnd este posibil, permite acoperirea erorii. Este returnat procedurii apelante un cod cu ac iunea de urmat. Este de notat c, undeva n program, se vor defini constantele utilizate. Function FileErrors () As Integer Dim intMsgType As Integer, strMsg As String Dim intResponse As Integer ' Valoarea returnat n eles ' 0 Resume ' 1 Resume Next ' 2 Eroare netratabil ' 3 Eroare necunoscut intMsgType = vbExclamation Select Case Err.Number Case mnErrDeviceUnavailable ' error 68 strMsg = " That device appears unavailable." intMsgType = vbExclamation + 4 Case mnErrDiskNotReady 'error 71 strMsg = "Insert a disk in the drive and close the door." Case mnErrDeviceIO 'error 57 strMsg = " Internal disk error." intMsgType = vbExclamation + 4 Case mnErrDiskFull ' error 61 strMsg = " Disk is full. Continue?" intMsgType = vbExclamation + 3 Case mnErrBadFileName, mnErrBadFileNameOrNumber ' error 64, 52 strMsg = " That filename is illegal." Case mnErrPathDoesNotExist ' error 76 strMsg = " That path doesn't exist." Case mnErrBadFileMode ' error 54 strMsg = " Can't open your file for that type of access." Case mnErrFileAlreadyOpen ' error 55 strMsg = " This file is already open." Case mnErrInputPastEndOfFile ' error 62 strMsg = " This file has a nonstandard end-of-file marker," strMsg = strMsg & "or an attempt was made to read beyond" strMsg = strMsg & "the end-of-file marker." Case Else FileErrors = 3 Exit Function End Select intResponse = MsgBox (strMsg, intMsgType, "Disk Error") Select Case intResponse Case 1, 4 ' butoanele OK, Retry FileErrors = 0 Case 5 ' butonul Ignore FileErrors = 1 Case 2, 3 ' butoanele Cancel, End FileErrors = 2 Case Else FileErrors = 3 End Select End Function

264

Aceast procedur trateaz erorile comune legate de fiiere i unitatea de dischet. Pentru celelalte erori se returneaz valoarea 3. Procedura apelant va trebui apoi s trateze aceast eroare, s o genereze nc o dat prin metoda Raise sau s cheme alt procedur care s trateze eroarea neanticipat. Inhibarea tratrii erorilor Dac o capcan de erori a fost permis ntr-o procedur, aceasta este scoas automat la prsirea procedurii. Sunt situa ii cnd este necesar anularea capcanei nainte de prsirea procedurii gazd. Acest fapt este realizat de instruc iunea On Error GoTo 0. Dup executarea acestei instruc iuni, Visual Basic detecteaz erorile dar nu sunt captate n procedur. Instruc iunea poate fi utilizat oriunde, inclusiv n interiorul unei rutine error handler. Depanarea programelor care au rutine de tratare a erorilor Atunci cnd se depaneaz programe, analiza comportrii poate fi complicat n cazul captrii erorilor de ctre rutinele error handler. Posibilitatea de a transforma n comentarii liniile On Error din fiecare modul simplific analiza dar este stnjenitoare. Este de preferat modalitatea prin care tratarea erorilor este inhibat i, de fiecare dat cnd apare o eroare, se intr n modul break. Pentru aceasta, se va selecta op iunea Break on All Errors din fia General a dialogului Options (meniul Tools). Selectarea acestei op iuni are ca efect, la apari ia unei erori, intrarea n modul break i afiarea ferestrei Watch cu codul care a produs eroarea. Tratarea erorilor din obiectele referite n procedurile care fac referin la unul sau mai multe obiecte este mult mai dificil s se determine unde apare o eroare, mai ales dac eroarea apare ntr-un obiect al altei aplica ii. De exemplu, s considerm o aplica ie care const dintr-un modul form (MyForm), care face referin la un modul clas (MyClassA), care face referin la un obiect Microsoft Excel Worksheet. Dac obiectul Worksheet nu rezolv o eroare particular aprut n foaia de calcul ci o regenereaz, Visual Basic va trece eroarea ctre obiectul care se refer la obiectul Worksheet., adic MyClassA. Visual Basic remapeaz n mod automat erorile netratate aprute n obiecte din afara Visual Basic ctre codul de eroare 440. Obiectul MyClassA poate fie s trateze eroarea (ceea ce este preferabil), fie s o regenereze. Interfa a specific faptul c orice obiect care regenereaz o eroare aprut ntr-un obiect referit nu poate s propage pur i simplu eroarea (s transmit codul de eroare 440), ci trebuie s o remapeze la un numr de eroare cu semnifica ie definit. Acest numr poate fi un numr Visual Basic (dac se poate efectua o asemenea echivalare), sau un numr propriu, adugat dup procedura explicat anterior. De cte ori este posibil, un modul clas va trebui s trateze orice eroare care apare n interiorul modulului i orice eroare care apr n obiecte referite i nerezolvate de obiectele nsele. Exist totui erori care nu pot fi tratate din cauz c nu pot fi anticipate. Exist i cazuri cnd este mai potrivit o tratare a erorii de ctre obiectul care face referin a dect de obiectul referit. Atunci cnd apare o eroare n modulul unei forme, Visual Basic genereaz unul dintre numerele de eroare predefinite. Observa ie. Dac se creeaz o clas public, trebuie ca fiecare secven care trateaz o eroare non-Visual Basic s fie bine documentat. Al i programatori care se refer la aceast clas trebuie s cunoasc cum s trateze erorile transmise de obiectul respectiv. La regenerarea unei erori, celelalte propriet i ale obiectului Err se vor lsa neschimbate. Dac eroarea transmis nu este tratat, propriet ile Source i Description pot fi afiate pentru a ajuta utilizatorul s ia msuri corective.

265

Tratarea erorilor transmise din obiecte referite Un modul clas ar putea s includ urmtoarea secven pentru tratarea erorilor pe care le poate aborda i regenerarea celor care nu pot fi rezolvate. Secven a este explicat dup prezentarea codului. MyServerHandler: Select Case ErrNum Case 7 ' eroarea out-of-memory ... Case 440 ' erori din obiecte externe Err.Raise Number:=vbObjectError + 9999 ' eroare din alt obiect Visual Basic Case Is > vbObjectError And Is < vbObjectError + 65536 ObjectError = ErrNum Select Case ObjectError ' acest obiect trateaz erorile pe baza ' documenta iei obiectului de unde provine eroarea Case vbObjectError + 10 ... Case Else ' remaparea erorii ca o eroare obiect generic i regenerarea ei Err.Raise Number:=vbObjectError + 9999 End Select Case Else ' remaparea erorii ca o eroare obiect generic i regenerarea ei Err.Raise Number:=vbObjectError + 9999 End Select Err.Clear Resume Next Instruc iunea Case 440 capteaz erorile care apar ntr-un obiect referit extern aplica iei Visual Basic. n acest exemplu, eroarea este propagat utiliznd valoarea 9999, deoarece este dificil pentru acest tip de handler central s determine cauza erorii. Apari ia unei astfel de erori este, de obicei, rezultatul unei erori fatale de automatizare (o eroare care produce oprirea execu iei componentei) sau din cauza unui obiect care nu a tratat corect o eroare captat. Eroarea 440 nu ar trebui propagat dect n cazul unei erori fatale. Dac aceast secven ar fi scris pentru un handler inline (vezi sec iunea "Tratarea inline a erorilor"), ar fi posibil s se determine cauza erorii i s se corecteze. Instruc iunea Case Is > vbObjectError And Is < vbObjectError + 65536 capteazerorile care au originea ntr-un obiect din aplica ia Visual Basic, sau din obiectul care con ine handlerul. Numai asemenea obiecte pot produce erori n domeniul specificat. Documenta ia pentru codul de eroare oferit pentru obiect trebuie s defineasc codurile posibile, semnifica ia lor, astfel nct aceast por iune a handlerului s poat fi scris adecvat erorilor anticipate. Codurile de eroare efective pot fi documentate fr offsetul vbObjectError sau pot fi documentate dup ce s-a adugat deplasarea, n care caz instruc iunea Case Else trebuie s scad deplasarea vbObjectError. Pe de alt parte, erorile obiectelor pot fi constante, artate n biblioteca de tipuri a obiectului i vizibile n Object Browser. n acest caz se utilizeaz constanta de eroare n Case Else i nu codul de eroare. Orice eroare care nu este tratat trebuie s fie regenerat cu un nou numr, dup cum este n instruc iunea Case Else. n aplica ia proprie se poate proiecta un handler care s anticipeze acest nou numr definit. Dac aplica ia este o clas public, trebuie s fie inclus n documenta ie o explica ie a acestei noi erori. Ultima instruc iune Case Else capteaz i regenereaz orice alt eroare care nu a fost tratat anterior. Deoarece aceast parte a capcanei va prinde erori care au sau nu adugat deplasarea vbObjectError, remaparea se va efectua simplu

266

ctre un cod generic "unresolved error". Acest cod se va aduga la vbObjectError indicnd oricrui handler c aceast eroare provine dintr-un obiect referit. Depanarea tratrii erorilor din obiecte referite Deoarece depanarea aplica iilor care se refer la obiecte create n Visual Basic sau la clase definit n module clas este dificil, se recomand selectarea op iunii Break in Class Module din fia General a dialogului Options (meniul Tools). Cu aceast op iune selectat, orice eroare dintr-un modul clas duce la intrarea clasei n modul break a debuggerului, permi nd analiza erorii. Depanarea programelor Tehnicile de depanare prezentate n acest capitol utilizeaz uneltele de analiz oferite de Visual Basic. Mediul de dezvoltare Visual Basic nu poate s identifice sau s fixeze erorile, dar ofer unelte pentru a analiza fluxul execu iei i cum se schimb valorile variabilelor i propriet ilor. Se poate considera c uneltele de depanare ajut la examinarea aplica iei pentru a n elege ce se ntmpl i de ce. Uneltele de depanare oferite de Visual Basic includ puncte de oprire (breakpoints), expresii de oprire (break expressions), expresii de urmrire (watch expressions), executarea codului pas cu pas (instruc iune cu instruc iune sau procedur cu procedur) i afiarea valorilor variabilelor i propriet ilor. Sunt oferite de asemenea posibilit i speciale cum ar fi editarea codului i continuarea execu iei (edit-and-continue), stabilirea urmtoarei instruc iuni care s se execute dup o eroare i testarea cu aplica ia n modul break. Tipuri de erori Exist trei tipuri de erori care se pot intlni ntr-un program. Erori de compilare. Acestea rezult din scrierea incorect a codului. Aceste erori sunt detectate de Visual Basic la compilarea codului. Erori de execu ie. Acestea apar n timpul execu iei aplica iei (i sunt detectate de Visual Basic) atunci cnd o instruc iune ncearc s efectueze o opera iune imposibil (de genul mpr irii prin zero). Erori de logic. Acestea apar atunci cnd aplica ia nu se execut n modul gndit la proiectare. O aplica ie poate s fie corct sintactic, s se execute fr a efectua opera iuni imposibile i totui s produc rezultate incorecte. Doar testarea aplica iei i analiza rezultatelor poate spune c aplica ia func ioneaz corect. Unelte de depanare Nu exist artificii magice pentru depanare i nu exist o secven fix de opera iuni care s lucreze ntotdeauna. n esen , ajutorul oferit n depanare este pentru o mai bun n elegere a mersului aplica iei. Se poate astfel fotografia starea aplica iei la un moment dat, instantaneul ob inut cuprinznd valori ale variabilelor, expresiilor i propriet ilor, precum i numele apelurilor active de proceduri. Bara de unelte Debug Imaginea alturat arat bara de unelte Debug din mediul Visual Basic Editor.

267

n tabelul urmtor se explic pe scurt func ionalitatea uneltelor principale din aceast bar. Unealta de depanare Run/Continue Break Reset Toggle Breakpoint Step Into Step Over Step Out Locals Window Immediate Window Watch Window Quick Watch Call Stack Scop Comut din modul design n modul run (Run) sau din modul break n modul run (Continue). Comut din run time n modul break. Comut din run time sau modul break n modul design. Definete o linie ntr-un modul, unde Visual Basic suspend execu ia aplica iei. Execut urmtoarea linie executabil din aplica ie i intr n proceduri. Execut urmtoarea linie executabil din aplica ie dar nu intr n proceduri. Execut restul de cod din procedura curent i se opreste la linia urmtoare din procedura apelant. Afieaz valoarea curent a variabilelor locale. Permite executarea de cod sau interogarea unei valori n timp ce aplica ia este n break mode. Afieaz valorile unor expresii selectate. Listeaz valoarea curent a unei expresii n timp ce aplica ia este n modul break. n timp ce aplica ia este n modul break, afieaz o cutie de diaolg care arat toate procedurile care au fost apelate dar nc nu s-au executat complet.

Sec iunile urmtoare aduc explica ii suplimentare asupra modului de utilizare efectiv a acestor unelte. Evitarea "bug"-urilor Respectarea urmtoarelor reguli poate conduce la evitarea introducerii unor bug-uri n aplica ie. o Aplica ia se proiecteaz cu aten ie prin notarea evenimentelor importante i a modului n care codul va rspunde la fiecare eveniment. Fiecare procedur general, ca i fiecare procedur eveniment trebuie s aib un scop specific, bine definit. Se vor include ct mai multe comentarii. La ntoarcerea n cod i analiza comportrii aplica iei, comentariile privind scopul fiecrei rutine sunt de un real ajutor. Se vor utiliza, pe ct posibil, referin e explicite. Variabilele obiect se declar dup cum sunt listate obiectele n cutia Classes din Object Browser i nu prin tipuri Variant sau Object. Se va dezvolta sau adapta o schem consistent de construc ie a denumirilor pentru variabilele i obiectele din aplica ie. Se va utiliza declara ia Option Explicit pentru a ocoli erorile de tastare a identificatorilor i confundarea unui control cu altul.

o o o o

Design Time, Run Time i Break Mode Se utilizeaz Visual Basic n design time pentru a crea o aplica ie i n run time pentru a o executa. n break mode execu ia programului este suspendat astfel nct se pot examina i modifica date. Bara de titlu Visual Basic arat ntotdeauna modul utilizat curent.

268

Caracteristicile celor trei moduri i tehnicile pentru comutarea ntre ele sunt listate n urmtorul tabel. Mod Design time Descriere Lucrul la crearea unei aplica ii se execut n acest mod. Se pot proiecta formulare, trasa controale, scrie cod etc. Nu se poate executa cod sau utiliza unelte de depanare, cu excep ia stabilirii de puncte de oprire i crerii de expresii de urmrire. Pentru a trece la run time click pe butonul Run. Pentru trecerea n break mode click pe Step Into din meniul meniul Run i aplica ia intr n modul break la prima instruc iune executabil. n timpul execu iei, cnd aplica ia are controlul, se interac ioneaz cu aplica ia ca orice alt utilizator. Se poate vedea codul dar nu se poate schimba. Pentru a trece n design time se ac ioneaz butonul Reset iar pentru a trece n break mode click pe butonul Break. Execu ia este suspendat n timpul rulrii aplica iei. Se poate vedea i edita codul, examina sau modifica date, reporni aplica ia, sfri execu ia sau continua din punctul de oprire. Pentru comutarea n run time, click pe butonul Continue (acelai cu Run). Trecerea n design time se ob ine prin butonul Reset. Se poat fixa puncte de oprire i expresii de urmrit n design time, dar celelalte unelte de depanare lucreaz doar n modul break.

Run time

Break mode

Utilizarea ferestrelor de depanare Cu ajutorul ferestrelor de depanare se pot monitoriza valorile expresiilor i variabilelor n timp ce se parcurg instruc iunile aplica iei. Exist trei ferestre de depanare: Immediate, Watch i Locals. Pentru afiarea oricreia dintre aceste ferestre se activeaz comanda corespunztoare din meniul View sau butonul corespunztor de pe bara Debug. Fereastra Immediate arat informa ia care rezult din instruc iunile de depanare din cod sau care este cerut prin instruc iuni scrise direct n fereastr. Fereastra Watch arat valorile curente ale expresiilor urmrite (watch expressions), acelea pentru care s-a hotrt monitorizarea. O expresie de oprire (break expression) este o expresie santinel care produce intrarea Visual Basic n modul break atunci cnd o anumit condi ie definit devine adevrat. n fereastra Watch, coloana Context indic procedura, modulul, sau modulele n care fiecare expresie santinel este evaluat. Fereastra Watch poate afia o valoare pentru o expresie urmrit numai dac instruc iunea curent este n contextul specificat; n caz contrar, coloana Value afieazun mesaj indicnd c instruc iunea nu este n context. Fereastra Locals arat valorile oricrei variabile din domeniul procedurii curente. Dup cum execu ia trece din procedur n procedur, con inutul ferestrei Locals se modific pentru a reflecta doar variabilele aplicabile procedurii curente. O variabil care reprezint un obiect apare n fereastra Locals cu un semn plus (+) n stnga numelui su. Se poate efectua click pe semn pentru a expanda variabila, afia propriet ile obiectului i valorile curente. Dac o proprietate a obiectului con ine un alt obiect, acesta poate fi expandat de asemenea. Aceeai examinare se poate aplica pentru variabilele care con in tablouri sau tipuri definite de utilizator. Utilizarea modului break n design time se poate schimba aspectul sau codul aplica iei, dar nu se pot vedea efectele schimbrilor. n run time se poate urmri cum se comport aplica ia, dar nu se poate interveni direct n cod. Modul Break oprete execu ia aplica iei i ofer un instantaneu al condi iilor n orice moment. Variabilele i valorile propriet ilor sunt pstrate, astfel nct se poate analiza starea curent a aplica iei i introduce modificri care afecteaz execu ia aplica iei. Cnd aplica ia este n modul break se pot efectua urmtoarele ac iuni:

269

o o o o o o o o

Modificarea codului aplica iei. Observarea strii interfe ei. Determinarea apelurilor procedurilor. Urmrirea valorilor variabilelor, propriet ilor i instruc iunilor. Schimbarea valorilor variabilelor i propriet ilor. Controlarea fluxului execu iei prin aflarea/stabilirea instruc iunii urmtoare. Execu ia imediat a unor instruc iuni Visual Basic. Controlarea manual a operrii aplica iei.

Intrarea n modul break la o instruc iune cu probleme n timpul depanrii unui program este uneori de dorit oprirea aplica iei n acel loc din cod unde se bnuiete existen a unei probleme. Acesta este unul dintre motivele pentru care Visual Basic prevede puncte de oprire i instruc iuni Stop. Un punct de oprire (breakpoint) definete o instruc iune sau o mul ime de condi ii unde Visual Basic oprete execu ia n mod automat i trece aplica ia n modul break fr a executa instruc iunea care con ine punctul de oprire. Se poate intra n modul break i manual, prin oricare dintre ac iunile o o o CTRL+BREAK Comanda Break din meniul Run Butonul Break de pe bara de unelte Debug.

Este posibil s se opreasc execu ia atunci cnd aplica ia nu are de lucru (idle - este ntre procesarea unor evenimente). Cnd se ntmpl acest fapt, execu ia nu se oprete la o linie specific, dar Visual Basic comut oricum la modul break. Se poate intra automat n modul break automat atunci cnd se ntmpl oricare dintre urmtoarele condi ii: o o o o o O instruc iune genereaz o eroare de execu ie netratat. O instruc iune genereaz o eroare de execu ie i a fost selectat Break on All Errors n fia General (meniul Tools). O expresie de oprire definit n dialogul Add Watch s-a modificat sau a devenit True, dup cum a fost definit. Execu ia atinge o linie cu un punct de oprire. Execu ia atinge o instruc iune Stop.

Fixarea unei erori run-time i continuare Anumite erori din execu ie rezult din neglijen a cu care este scris codul. Aceste erori pot fi corectate uor prin declararea variabilelor, modificarea denumirilor etc. Dup o asemenea corectur programul poate continua chiar din linia unde s-a oprit. Acest fapt se realizeaz prin ac ionarea comenzii Continue (meniul Run) sau butonul Continue. La continuarea aplica iei se poate verifica fixarea erorii. Dac se selecteaz op iunea Break on All Errors, Visual Basic inhib tratarea erorilor din cod, nct la orice eroare semnalat se intr n modul break. Erorile vor fi captate de secven ele de tratare doar dac op iunea Break on All Errors nu este selectat. Anumite erori, cum ar fi schimbarea declara iilor de variabile, adugarea unor noi variabile etc., necesit repornirea aplica iei. n acest caz Visual Basic prezint un mesaj care las repornirea aplica iei la voia utilizatorului. Monitorizarea datelor prin expresii de urmrire Atunci cnd un calcul nu produce rezultatul ateptat sau apar probleme cnd o anumit proprietate sau variabil ia o valoare particular, este de interes s se poat identifica momentul n care o expresie i schimb sau atinge o valoare.

270

Visual Basic monitorizeaz n mod automat expresiile definite de utilizator drept expresii santinel (de urmrit). La trecerea aplica iei n modul break, aceste expresii apar n fereastra Watch. Se poate de asemenea instrui o expresie urmrit s treac aplica ia n modul break atunci valoarea ei se modific sau devine True (pentru condi ii). Acest mod de operare reduce, de obicei, parcurgerea pas cu pas a proiectului pn cnd se atinge o anumit condi ie (de exemplu, o variabil de ciclare ajunge la o anumit valoare, sau un indicator dintr-o procedur este modificat). Adugarea, editarea sau eliminarea unei expresii urmrite Toate opera iunile din titlu se pot efectua att n design time, ct i n modul break. Pentru a aduga o expresie santinel se utilizeaz dialogul Add Watch afiat din meniul Debug. Se utilizeaz dialogul Edit Watch, afiat tot din meniul Debug, pentru modificarea sau eliminarea unei expresii definite. Cele dou dialoguri, Add Watch i Edit Watch, au aceeai structur de controale cu excep ia butonului Delete care apare doar n dialogul Edit Watch. Componentele comune celor dou dialoguri sunt prezentate n tabelul urmtor. Componenta Zona text Expression Descriere Con ine expresia pe care expresia urmrit o evelueaz. Aceast expresie este o variabil, o proprietate, un apel de func ie sau orice alt expresie valid. n dialogul Add Watch aceast box de text con ine expresia curent (dac exist). Stabilete domeniul variabilelor urmrite n expresie. Se va completa atunci cnd exist variabile sinonime cu domenii diferite. Se poate restrnge domeniul la o procedur specific sau la un modul anumit, sau se poate extinde la ntreaga aplica ie prin selectarea intrrilor All Procedures i All Modules. Visual Basic poate evalua mai uor o variabil ntr-un context restrns. Stabilete cum rspunde Visual Basic la expresia urmrit: - urmrete expresia i afieaz valoarea n fereastra Watch atunci cnd aplica ia intr n modul break; - aplica ia intr n modul break automat atunci cnd se modific valoarea expresiei sau cnd aceasta devine True.

Grupul de op iuni Context

Grupul de op iuni Watch Type

Observa ie. Se poate aduga o expresie urmrit prin tragerea expresiei dintr-un modul n fereastra Watch. Utilizarea urmririi rapide Cnd aplica ia este n modul break, se poate verifica valoarea unei propriet i, variabile sau expresii pentru care nu s-a definit n prealabil o expresie de urmrire. Se folosete n acest scop dialogul Quick Watch (din meniul Debug sau de pe bara sinonim). Dialogul arat valoarea expresiei selectate nrtr-un modul. Pentru a continua urmrirea acestei expresii, se ac ioneaz butonul Add (inhibat dac opera iunea de urmrire nu este posibil); fereastra Watch este afiat etc. Utilizarea unui punct de oprire n execu ie, un punct de oprire (breakpoint) produce oprirea execu iei programului exact naintea unei linii specifice de cod. Atunci Visual Basic execut o procedur i se ajunge la o linie de cod care are fixat un punct de oprire, atunci aplica ia este trecut n modul break.

271

Se poate stabili sau anula un punct de oprire n modul break, n design time sau n run time dac aplica ia este inactiv (idle). Pentru a fixa un punct de oprire se efectueaz un click pe marginea din stnga ferestrei modulului, n dreptul instruc iunii (vezi figura de mai sus). Instruc iunea astfel marcat este colorat potrivit culorii specificate n dialogul Options (meniul Tools), fia Editor Format. Prin click pe indicatorul de breakpoint se anuleaz punctul de oprire respectiv. Se remarc n figura anterioar c instruc iunea curent este i ea marcat prin culoare i un indicator pe latura din stnga a ferestrei de cod. Atunci cnd se atinge un punct de oprire i aplica ia este oprit, se poate examina starea curent a aplica iei, focusul putnd fi mutat ntre forme, module, ferestrele de depanare. Aplica ia este oprit exact naintea executrii liniei care con ine punctul de oprire. Dac se dorete observarea efectului executrii acestei instruc iunii se va ac iona Step Into sau Step Over. Pentru izolarea unei probleme reamintim c o instruc iune poate s contribuie indirect la eroare datorit atribuirii unor valori incorecte. Examinarea valorilor variabilelor i propriet ilor se efectueaz n modul break prin ferestrele Locals, Quick Watch, expresii urmrite i fereastra Immediate. Utilizarea instruc iunii Stop O alternativ la fixarea unui punct de oprire este plasarea unei instruc iuni Stop. La ntlnirea unei instruc iuni Stop, Visual Basic oprete execu ia i comut n modul break. Dei Stop ac ioneaz ca un breakpoint, instruc iunea nu poate fi fixat sau inhibat n acelai mod. Reamintim c o instruc iune Stop oprete doar temporar execu ia n timp ce o instruc iune End oprete execu ia, reini ializeaz variabilele i produce ntoarcerea la modul design. O aplica ie oprit prin Stop poate fi continuat prin Continue din meniul Run. Executarea unor secven e de cod selectate Dac se poate identifica instruc iunea care a cauzat eroarea, un singur breakpoint poate localiza problema ivit. Este mai frecvent situa ia n care o ntreag secven de cod este bnuit c produce execu ia incorect a aplica iei. n acest caz, un breakpoint izoleaz zona de cod i se parcurge apoi ntreaga por iune pas cu pas prin Step Into i Step Over. Dac este necesar, se poate de asemenea sri peste instruc iuni sau rentoarce execu ia la o nou linie. Pentru comenzile descrise n tabelul urmtor trebuie ca aplica ia s fie n modul break. Modul de parcurgere Step Into Step Over Step Out Descriere Execut instruc iunea curent i se oprete la urmtoarea linie, chiar dac ea este n alt procedur. Execut ntreaga procedur apelat de linia curent i se oprete la linia urmtoare liniei curente. Execut restul procedurii curente i se oprete la instruc iunea urmtoare celei care a apelat procedura curent.

272

Utilizarea comenzii Step Into Se utilizeaz Step Into pentru a executa o singur instruc iune. Visual Basic trece temporar n run time, execut instruc iunea curent i avanseaz la urmtoarea instruc iune, revine n modul break. Pentru acest tip de opera iune se ac ioneaz butonul Step Into din bara Debug. n cazul scrierii mai multor instruc iuni pe o aceeai linie, Visual Basic le va considera separat (punctele de oprire apar doar la prima instruc iune din linie). Utilizarea comenzii Step Over Comanda Step Over se aplic tot instruc iunii curente, dar aceasta trebuie s con in un apel la o procedur. Dac prin comanda Step Into s-ar trece n procedur pas cu pas, prin Step Over procedura este executat ca o unitate i se trece apoi la instruc iunea urmtoare n procedura curent. Pentru acest tip de opera iune se ac ioneaz butonul Step Over din bara Debug. Acest tip de ac iune este util atunci cnd procedura apelat este verificat. Totui, dac n procedura apelat exist o instruc iune Stop sau este definit un punct de oprire, atunci execu ia este stopat n acele locuri. Utilizarea comenzii Step Out Prin comanda Step Out se mrete viteza de parcurgere a secven elor de cod n sensul c dac se tie c restul instruc iunilor dintr-o procedur nu pot crea probleme, atunci ele pot fi executate n bloc i nu pas cu pas. Se revine n procedura apelant, la instruc iunea urmtoare apelului. Pentru acest tip de opera iune se ac ioneaz butonul Step Out din bara Debug. Trecerea peste sec iuni de cod n modul break se poate selecta o instruc iune oarecare, mai departe pe firul execu iei, i click pe Run To Cursor din meniul Debug permite reluarea execu iei din punctul selectat. Se pot astfel sri secven e neinteresante de cod. Stabilirea instruc iunii urmtoare O ac iune similar celei descrise n sec iunea anterioar este selectarea unei instruc iuni oriunde n procedura curent i click Set Next Statement din meniul Debug. Se pot astfel urmri doar anumite fire de execu ie sau se pot reexecuta anumite secven e pentru alte valori date variabilelor/propriet ilor. Indicarea instruc iunii urmtoare Prin click pe Show Next Statement din meniul Debug se plaseaz punctul de inser ie n linia care urmeaz a fi executat. Este o modalitate util mai ales cnd se depaneaz o secven error handler i nu se tie exact care este urmtoarea instruc iune. Comanda este disponibil doar n modul break. Monitorizarea listei de apeluri (Call Stack) Dialogul Call Stack, afiat prin meniul/bara de unelte Debug, arat o list a apelurilor active de proceduri. Dialogul poate fi afiat doar n modul break. Apelurile active sunt cele care au ini iat proceduri care nu au fost complet executate. Prin lista afiat se poate trasa ordinea de apeluri care au dus la instruc iunea curent. Cu ct asemenea lan uri de apeluri sunt mai lungi, cu att depanarea aplica iei este mai dificil. n lista din dialogul Call Stack toate apelurile active sunt prezentate ntr-o serie de apeluri nln uite. Ea plaseaz cea mai timpurie procedur apelat la baza listei i adaug apelurile urmtoare n topul listei. Informa ia dat pentru fiecare

273

procedur ncepe cu numele modulului, urmat de numele procedurii. Prin butonul Show din dialog se afieaz instruc iunea dintr-o procedur care trece controlul aplica iei ctre urmtoarea procedur din list. Observa ie. Deoarece dialogul Call Stack nu indic variabila asignat unei instan e a unei clase, nu se poate distinge ntre instan e multiple ale claselor. Testarea datelor i procedurilor cu fereastra Immediate n procesul de depanare sau de experimentare a unei aplica ii, este adesea necesar s se execute proceduri individuale, s se evalueze expresii sau s se atribuie noi valori variabilelor sau propriet ilor. Toate aceste ac iuni pot fi executate din fereastra Immediate. Expresiile sunt evaluate i rezultatele sunt tiprite n fereastra Immediate. Tiprirea informa iilor n fereastra Immediate Exist dou metode pentru tiprirea n fereastra Immediate Includerea unor instruc iuni Debug.Print n codul aplica iei, Introducerea direct n fereastra Immediate a instruc iunilor care utilizeaz metoda Print.

Aceste tehnici ofer urmtoarele avantaje n raport cu utilizarea expresiilor urmrite: Aplica ia nu trebuie oprit pentru a ob ine informa ii. Datele i mesajele sunt afiate pe msur ce aplica ia se execut. Informa iile sunt afiate ntr-o fereastr separat (Immediate), nct nu se interfereaz cu ieirea vzut de utilizatori.

Tiprirea din codul aplica iei Metoda Print trimite ieirea ctre fereastra Immediate atunci cnd se include calificarea cu obiectul Debug. De exemplu Debug.Print "Salary = "; Salary Aceast tehnic lucreaz cel mai bine atunci cnd exist un loc particular n aplica ie n care variabila urmrit (aici Salary) se modific. De exemplu, instruc iunea anterioar poate apar ine unei structuri repetitive. Tiprirea din fereastra Immediate Dac aplica ia este n modul break, se poate muta focalizarea n fereastra Immediate pentru a examina date. Aici se pot evalua expresii valide, inclusiv expresii care se refer la propriet i. Modulul activ curent determin domeniul de referin . Orice instruc iune care utilizeaz metoda Print poate fi nscris i la terminarea cu ENTER se va evalua expresia i se va afia rezultatul. Un semn de ntrebare (?) poate nlocui metoda Print: ? ActiveDocument.Name executat din Microsoft Word, afieaz n fereastra Immediate numele documentului Word activ. Atribuirea de valori n modul break, se pot atribui valori la propriet i i variabile. Urmtorul exemplu prezint o schem de utilizare a ferestrei Immediate pentru calcule. Fiecare linie (cu excep ia celor care afieaz rezultatele) se va termina cu ENTER:

274

x=2 ? x+3 5 y=3 ? x*y 6 Se poate modifica valoarea unei propriet i sau a unei variabile din proiect i relua apoi executarea aplica iei. Dac Option Explicit este prezent n modulul curent, toate variabilele invocate n fereastra Immediate trebuie s fie declarate n modul. Domeniul se aplic apelurilor de proceduri ca i variabilelor. Testarea procedurilor cu fereastra Immediate n fereastra Immediate se poate evalua orice instruc iune executabil valid Visual Basic, dar nu se accept declara ii de date. Se pot utiliza apeluri la proceduri care permit astfel testarea procedurii cu diverse seturi de argumente. X = Quadratic(2,8,8) DisplayGraph 50, Arr1 Form_MouseDown 1,0,100,100 La apsarea tastei ENTER, Visual Basic comut la run time pentru a executa instruc iunea i se ntoarce apoi n modul break. n acest moment se pot vedea rezultatele i efectele asupra variabilelor i propriet ilor. Se poate apela orice procedur din forma activ curent, ca i orice procedur dintr-un modul, cu excep ia cazului n care procedura este Private, caz n care se poate apela doar n timpul executrii modulului. O procedur poate fi executat n mod repetat, fiecare apel este men inut de Visual Basic ca o instan separat. Aceasta permite testarea separat a diferitelor seturi de argumente. Dialogul Call Stack men ine o list a procedurilor executate de fiecare comand din fereastra Immediate. Se poate prin urmare utiliza Call Stack pentru a selecta orice instan a procedurii i afia apoi valorile variabilelor din procedur. Observa ie. Dei cele mai multe instruc iuni sunt suportate de fereastra Immediate, o structur de control este permis doar dac poate fi exprimat complet pe o linie: se utilizeaz caracterul ":" pentru separarea instruc iunilor care alctuiesc structura de control. Verificarea numerelor de eroare Se poate utiliza fereastra Immediate pentru a afia mesajul asociat cu un numr specific de eroare. De exemplu, tastarea instruc iunii Error 58 produce o caset cu mesajul asociat erorii File already exists Trucuri utile n fereastra Immediate o o Dup introducerea unei instruc iuni, aceasta se poate reexecuta prin mutarea punctului de inser ie napoi n instruc iune i ENTER. nainte de ENTER se poate edita instruc iunea curent.

275

o o o

Se poate utiliza mouse-ul sau sge ile pentru a naviga n fereastra Immediate. Nu se apas ENTER dect pe instruc iunea care se execut. CTRL+HOME mut punctul de inser ie la linia de nceput a ferestrei; CTRL+END l mut la ultima linie. Tastele HOME i END mut punctul de inser ie la nceputul i, respectiv, sfritul liniei curente.

Considera ii speciale Anumite evenimente care sunt o parte comun cu utilizarea Microsoft Windows pot s ridice probleme speciale pentru depanarea unei aplica ii. Este important s fim contien i de aceste probleme pentru a nu complica procesul de depanare. Dac rmnem contien i de modul n care modul break poate pune evenimentele n dezacord cu ceea ce aplica ia ateapt, avem o ans s gsim solu ii. n anumite proceduri de evenimente, trebuie sutilizm instruc iuni Debug.Print pentru a monitoriza valorile variabilelor/propriet ilor n loc s utilizm expresii santinel sau puncte de oprire. Oprirea execu iei n procedurile evenimentelor MouseDown sau KeyDown Dac se oprete execu ia n timpul unei proceduri eveniment MouseDown, se poate lsa butonul mouse-ului sau utiliza mouse-ul pentru alte taskuri. Cnd se continu execu ia, totui, aplica ia presupune c butonul mouse-ului este nc apsat. Nu se va ob ine evenimentul MouseUp pn cnd nu se apas din nou butonul mouse-ului i apoi se elibereaz. Cnd se apas butonul mouse-ului n run time, se oprete execu ia n evenimentul MouseDown dac aici este un breakpoint. n acest scenariu nu se va ob ine niciodat evenimentul MouseUp. Solu ia este eliminarea breakpoint-ului din procedura MouseDown. Dac execu ia se oprete n timpul procedurii KeyDown, se aplic din nou considera iile anterioare. Dac exist un breakpoint n procedura evenimentului KeyDown, nu se va ob ine niciodat evenimentul KeyUp. Oprirea execu iei n procedurile evenimentelor GotFocus i LostFocus Dac se oprete execu ia n procedurile evenimentelor GotFocus sau LostFocus, temporizarea sistemului de mesaje poate cauza rezultate inconsistente. Pentru aceasta se vor utiliza instruc iuni Debug.Print n locul punctelor de oprire din procedurile care trateaz evenimentele GotFocus i LostFocus. Distribuirea solu iilor Microsoft Excel 97, Word 97 i PowerPoint 97 n acest capitol se discut probleme privind distribuirea solu iilor dezvoltate pentru Microsoft Excel 97, Word 97 i PowerPoint 97. Pe lng modul efectiv de distribuire sunt reamintite i opera iuni preparatorii cum ar fi protejarea codului, erori posibile etc. Pregtirea solu iei pentru distribuire n momentul n care s-a nchegat o solu ie trebuie s se ia o serie de decizii n vederea distribuirii solu iei. Prima decizie este cum s se mpacheteze proiectul: ca un simplu document sau ca un add-in (sau template n Word). Dac se decide distribuirea ca un add-in, este important s se decid cum i cnd se va ncrca: automat sau la cerere. n sfrit, trebuie s se decid asupra modului de protejare a codului i, evident, asupra unei ultime verificri n ceea ce privete corectitudinea codului (de obicei ultimul bug apare chiar nainte de punctul final al proiectului). Alegerea modului de mpachetare a solu iei

276

Atunci cnd se ascrie o solu ie n Visual Basic for Applications, se ob ine un proiect asociat unui document. La distribuirea solu iei trebuie s se decid dac utilizatorul trebuie s aib acces la document i codul asociat sau numai la cod. Dac se dorete accesul att la document ct i la cod, se va distribui documentul adic document Word, caiet Excel sau prezentare PowerPoint. Acest caz este frecvent la scrierea unei solu ii verticale o solu ie foarte specific pentru un utilizator foarte specific. De exemplu, dac se creeaz n Microsoft Word un formular de testare a performan ei, atunci att documentul ct i codul care l automatizeaz trebuie s fie accesibil utilizatorului. Dac, pe de alt parte, se dorete ca numai codul (proiectul) s fie accesibil, atunci se va distribui ca un add-in (Microsoft Excel i PowerPoint) sau ca un template global (Word). Observa ie. Utilizatorii nu au acces la foile de calcul dintr-un add-in deoarece acestea sunt ascunse automat la crearea unui add-in dintr-un caiet. n mod similar, atunci cnd o prezentare PowerPoint este organizat ca un add-in, slide-urile sale sunt eliminate automat. Pentru o discu ie suplimentar se va citi sec iunea "Salvarea solu iei ca un Add-in sau Global Template". Se poate interzice accesul utilizatorului la documentul asociat proiectului, fie din cauz c documentul nu este pentru utilizator, fie pentru c el con ine date pe care utilizatorul nu trebuie s le modifice sau s le vad. Acesta este cazul cnd solu ia con ine proceduri care extind i adapteaz setul de op iuni ale aplica iei proceduri care sunt proiectate s aib o larg aplicabilitate, independente de un document specific. De exemplu, dac se scriu proceduri care automatizeaz sarcini de formatare a foilor de calcul, utilizatorul trebuie s aib acces la aceste proceduri din orice caiet deschis, dar nu trebuie s acceseze caietul asociat proiectului. La distribuirea solu iei ca un add-in sau template trebuie s se decid separat dac se va proteja codul proiectului. Controlul ncrcrii unui Add-in sau Global Template Dac se decide distribuirea solu iei proprii ca un add-in sau template, este normal s se decid momentul ncrcrii acestuia. Utilizatorul poate ntotdeauna s ncarce un add-in utiliznd dialogul Template and Add-Ins sau Add-Ins (meniul Tools), dar nu aceasta este solu ia cea mai bun. Sa alternativ se poate stabili ca un add-in sau template global s se ncarce automat la pornirea aplica iei. Sau, pentru a nu ncetini pornirea aplica iei, se poate alege ncrcarea ca rspuns la un eveniment anumit sau prin alegerea unei comenzi. n sfrit, se poate ncrca un add-in sau un template global n mod programatic. ncrcarea unui Add-In sau Global Template la start Posibilit ile unui add-in devin accesibile unui utilizator doar dup ce add-in-ul este ncrcat. De exemplu, cnd un template global este ncrcat, Word mixeaz meniurile, barele de unelte, intrrile AutoText i macrourile din template cu meniul Word. Din acest motiv se poate inten iona ca ncrcarea add-inului sau a template-ului s aib loc la activarea aplica iei Word, Excel sau PowerPoint. Pentru a ncrca add-inuri sau template-uri n mod automat la pornirea aplcia iei, trebuie s se palseze n folderul Office Startup, localizat de obicei pe calea "Program Files\Microsoft Office\ Office\Startup". n Microsoft Excel se poate de asemenea palsa un add-in n folderul Xlstart sau n folderul desemnat ca un folder de pornire alternativ. Acest fapt se realizeaz prin atribuirea unei ci i a unui nume de folder la cheia HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\AltStartup din Windows registry. ncrcarea automat a unui Add-In n Microsoft Excel prin comanda OPEN din Windows Registry

277

n plus fa de memorarea unui add-in ntr-unul dintre folderele de pornire (vezi sec iuena precedent), se poate utiliza comanda OPEN din Windows Registry pentru a specifica fiierele addn care se ncarc automat la pornirea aplica iei Excel. Trebuie s se creeze cte o comand OPEN n cheia de registru HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel pentru fiecare fiier add-in. Pentru cazul mai multor fiiere se utilizeaz OPEN pentru primul fiier, OPEN1 pentru al doilea, OPEN2 pentru al treilea etc. Sintaxa pentru comanda OPEN este OPEN =[ /Switch] pathandfilename unde /Switch poate fi /R sau /F. Comutatorul /R deschide fiierul read-only iar /F este utilizat pentru a cere ncrcarea caietelor. Microsoft Excel citeste doar atta informa ie dintr-un workbook ct este necesar pentru referirea func iilor utilizator. Un exemplu este HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\OPEN = /R "C:\OFFICE\OFFICE\LIBRARY\ANALYSIS\ANALYS32.XLL" Comanda OPEN este suportat doar din motive de compatibilitate i este necesar pentru cererea de ncrcare a macrourilor. Alternativ recomandat este prezentat ulterior n acest capitol, o dat cu Init Commands i Init Menus. ncrcarea automat a unui Add-In n Microsoft PowerPoint utiliznd valoarea AutoLoad din Windows Registry Opera iunea de ncrcare automat a unui add-in prin valorile din Windows Registry se poate efectua i n PowerPoint, dar valorile fixate sunt altele dect n Excel. Numele fiierului add-in se va da, n Windows Registry, ca subcheie fie sub HKEY_CURRENT_USER, fie sub HKEY_LOCAL_MACHINE. Valoarea Path a cheii trebuie s fie loca ia add-in-ului. Valoarea AutoLoad se va fixa pe 1 pentru o ncrcare automat. ncrcarea Add-In-urilor care au fost ncrcate n sesiunea precedent Un add-in ncrcat i nregistrat n sesiunea curent Excel sau PowerPoint va fi ncrcat automat la o nou pornire a aplica iei. Un template global ncrcat n Word rmne disponibil pentru sesiunea curent, dar nu este rencrcat automat la o nou pornire a aplica iei. Observa ie. Un add-in adugat listei din dialogul Add-Ins (utiliznd butonul Add New) din Excel sau PowerPoint este nregistrat sub HKEY_CURRENT_USER. n continuare, aceste add-in-uri nregistrate vor fi accesibile doar pentru utilizatorul intrat pe main n momentul adugrii.

278

ncrcarea programatic a unui Add-In sau Global Template Colec ia Addins permite instalarea prin program a unui add-in sau template global. n Word sau Microsoft Excel se va stabili la True proprietatea Installed a obiectului Addin: Addins("C:\\Gallery.dot").Installed = True n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili la True pentru nregistrarea automat, aceeai valoare dndu-se propriet ii Registered pentru a nregistra add-in-ul. With Addins("C:\\mytools.ppa") .Loaded = True .Registered = True End With ncrcarea programatic a unui add-in ca rspuns la un eveniment Dac se dorete ncrcarea programatic a unui add-in ca rspuns la un eveniment, codul care comand aceast opera iune se plaseaz n procedura de eveniment. Deschiderea i ncrcarea programatic a unui template global prin linia de comand Se utilizeaz urmtoarea linie de comand, de exemplu, unde path este loca ia fiierului Add-in.dot, pentru a instala un add-in numit Add-in.dot, i executarea unei proceduri numit Main din modulul denumit Add-inInstall: WinWord "<Path>\Add-in.dot" /mAdd-inInstall Word are un numr de argumente pe linia de comand. Comutatorul /m execut codul din modulul specificat. De notat c nu exist nici un spa iu dup "m" i c nu se specific procedura Main; doar o procedur denumit Main se va executa, n lipsa unei asemenea proceduri nu se execut nimic la ncrcarea modulului. n continuare este un exemplu de procedur Main. ' numele modulului este Add-inInstall, pentru a func iona cu ' linia de comand din exemplul anterior Option Explicit Sub Main() 'Check to see if Add-In is loaded in Add-In list Dim wkbAddin As Word.AddIn On Error GoTo ErrorHandler Set wkbAddin = AddIns(ThisDocument.Name) If wkbAddin Is Nothing Then ' Add the template to the add-ins collection and install it Set wkbAddin = AddIns.Add(ThisDocument.FullName, True) End If ' If template is the active document close it If ThisDocument.Name = ActiveDocument.Name Then ' The Add-in should not be dirty ThisDocument.Close End If Exit Sub Errorhandler: ' Only ignore "Subscript out of range" errors

279

End Sub

Select Case Err.Number Case 9, 5941 Err.Clear Resume Next Case Else ' Assert the error when in Debug mode #If DebugMode Then AssertError #End If ' Insert other error handling code here End Select

Descrcarea programatic a unui Add-in sau Template Un add-in rmne ncrcat pn cnd se termin sesiunea curent, pn la descrcarea prin program sau pn la descrcarea prin dialogul Add-Ins (sau Templates and Add-ins) activat prin meniul Tools. Prin descrcarea unui add-in se salveaz memoria disponibil. n Word sau Microsoft Excel, pentru descrcarea unui add-in sau template global, se stabilete la False proprietatea Installed a obiectului Addin. Addins(C:\\Gallery.dot").Installed = False n PowerPoint, proprietatea Loaded a obiectului Addin se va stabili pe False pentru descrcare, iar proprietatea Registered se va stabili pe False pentru a nltura nregistrarea add-in-ului. ncrcarea la cerere ncrcarea unui add-in sau template la pornirea aplica iei poate s creasc semnificativ timpul pornirii aplica iei. Se poate utiliza atunci ncrcarea la cerere pentru a amna ncrcarea pn atunci cnd utilizatorul apeleaz o comand sau o procedur din add-in. Este de men ionat c wizard-urile i add-in-urile ini iate de o comand din menu sunt ncrcate, n mod automat, la cerere. Exist mai multe tehnici pentru a stabili ncrcarea la cerere, specifice diferitelor aplica ii. Observa ie. Dac se inten ioneaz utilizarea unui add-in sau template ca o bibliotec de cod, apelat din alte proiecte, nu trebuie ca aceasta s fie ncrcat explicit deoarece Visual Basic va ncrca add-in-ul sau template-ul referit la cerere, atunci cnd o procedur din bibliotec este apelat. Utilizarea referin elor explicite n Microsoft Excel Prima metod de ncrcare la cerere este utilizarea unei referin e explicite atunci cnd se atribuie un nume de macro la o unealt. Urmtoarea linie cheam procedura MySub care st n modulul ThisWorkbook din caietul (add-in) "C:\My Documents\MyTools.xla": 'C:\My Documents\MyTools.xla'!ThisWorkbook.MySub Add-in-ul este ncrcat doar atunci cnd este executat macro-ul.

280

Pentru solu ii care sunt distribuite utiliznd un program de instalare se va vedea sec iunea "Adugarea de meniuri i submeniuri la Microsoft Excel fr ncrcarea unui Add-In". ncrcarea la cerere a bibliotecilor de func ii n Microsoft Excel Dac se distribuie o solu ie care con ine o bibliotec de func ii macro ar fi de dorit ncrcarea la cerere a acestei biblioteci. De asemenea, n mod normal este de dorit ca func iile s fie listate n Function Wizard. Pentru ncrcarea la cerere a func iilor este nevoie de macro-uri XLM (Microsoft Excel 4.0 macro sheets). Aceste macro-uri sunt de obicei doar "nveliuri" pentru func ii Visual Basic. Atunci cnd Microsoft Excel vede c un Add-In este marcat pentru ncrcarea la cerere, el citete doar anteturile macrourilor func ii; ra iunea de prezentare sub form XLM este aceea c informa ia din anteturi poate fi citit fr a ncrca Visual Basic for Applications (care se va ncrca doar atunci cnd este necesar). Modificarea unui add-in pentru a beneficia de ncrcare la cerere 1. Se adaug la caietul add-in o foaie Microsoft Excel 4.0 macro: click dreapta pe un tab Worksheet i selectare Insert, din dialog se va selecta Ms Excel 4.0 Macro. 2. Crearea unui macro func ie care nvelete o func ie Visual Basic. o o o o o o o o o o o o n prima celul se scrie numele func iei. n celula de sub numele func iei se insereaz func ia Argument(Name_Text, Data_Type_ID). Name_Text este numele parametrului. Ideal ar fi ca acesta s fie numele parametrului func iei din VBA pe care se presupune c-l reprezint. Data_Type_ID este ID-ul care determin tipul de dat pe care Excel l accept pentru acest argument; acest parametru este op ional. Se repet paii b, c i d pentru fiecare parametru din func ia VBA. Dac este necesar s se specifice tipul rezultatului se va utiliza func ia Result(Data_Type_ID). Func ia Return(value) semnaleaz sfnritul macro-ului func ie. Se selecteaz toate celulele care con in macro-ul. Se selecteaz Define din submeniul Name (meniul Insert). Se denumete domeniul cu numele func iei. Se selecteaz butonul radio Function din grupul Macro. Click pe Add i apoi OK.

1. Se selecteaz Insert din bara de meniu i Define din submeniul Name. Se adaug numele "__DemandLoad" care se refer la "=TRUE" (se tasteaz exact aa n boxa Refers To). Este de observat c exist dou caractere "_" n fa a lui DemandLoad. Click Add, apoi Close. 2. Se stabilete proprietatea IsAddin a obiectului Workbook la TRUE. 3. Se salveaz caietul. n continuare este un exemplu de macro care nfoar o func ie VBA. MyFunction =ARGUMENT("szArgOne") =ARGUMENT("intArgTwo") =RETURN(vMyFunction(szArgOne, intArgTwo)) Func ia VBA fiind de forma Function vMyFunction (szArgOne As String, intArgTwo As Integer) As String End Function

281

Aceti pai permit ca add-in-ul s fie ncrcat la cerere. Dup ce este ncrcat, add-in-ul nu este descrcat din memorie pn cnd se termin instan a curent a aplica iei Excel. Adugarea meniurilor n Excel fr ncrcarea unui Add-in Microsoft Excel 97 are dou chei noi de registru, care sunt citite la pornirea aplica iei i care creeaz intrri de meniu oferind puncte de intrare ntr-un add-in; acest add-in se ncarc doar atunci cnd este cerut de o comand dintr-un meniu, care se refer la add-in. Cheile respective sunt Init Menus i Init Commands. n continuare se prezint de asemenea i cheia Delete Commands, care permite eliminarea unor intrri de meniu. Cheia Init Menus (HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Menus) con ine cte o valoare String pentru fiecare menu adugat unei mare de meniu built-in. Fiecare nume de valoare este unic i identific meniul creat. irul are sintaxa: Value_name = Menu_bar_num, Menu_name,Menu_position[, Menu_parent] Argument Menu_bar_num Descriere Numrul barei de meniu built-in la care se dorete adugarea meniului. Barele de meniu se schimb dup tipul foii active. Numerele sunt: 3 Nil menu bar (nu exist caiet deschis) 10 worksheet, dialog sheet, macro sheet 4.0 11 chart sheet 12 modul Visual Basic Numele noului meniu Pozi ia noului meniu pe bara meniu. Aceasta poate fi numele unui meniu dup care se plaseaz cel nou, sau un numr indicnd pozi ia noului meniu de la stnga barei meniu. Este op ional: dac se definete un submeniu, acesta este numele sau numrul meniului care va con ine noul submeniu, definirea cruia fiind controlat de restul parametrilor.

Menu_name Menu_position Menu_parent

Cheia Init Comands (HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Init Commands) con ine cte o valoare de tip string pentru fiecare comand adugat unui meniu. Fiecare nume de valoare este unic i identific comanda adugat. irul are sintaxa Value_name = Menu_bar_num,Menu_name,Command_name,Macro, Command_position,[ Macro_key] ,[ Status_text] ,[ Help_reference] parametrii fiind explica i n tabelul urmtor. Argument Menu_bar_num Descriere Numrul barei de meniu built-in la care se dorete adugarea meniului. Barele de meniu se schimb dup tipul foii active. Numerele sunt: 10 Worksheet, dialog sheet, macro sheet 4.0

282

11 Chart sheet 12 modul Visual Basic Menu_name Numele meniului sau submeniului. Submeniurile sunt indicate printr-un ir "meniu\submeniu", caracterul backslash delimitnd numele meniului de cel al submeniului. Submeniul trebuie s fie existent deja sau s fie declarat n cheia Init Menu. Numele noii comenzi. Referin a la o procedur dintr-un caiet add-in. Alegerea comenzii deschide add-in-ul i execut procedura. Procedura va terge comanda adugat de aceast cheie de registru i o va nlocui cu o comand care va executa procedura necesar. Pozi ia noii comenzi n meniu. Aceasta poate fi numele unei comenzi dup care se plaseaz cea nou, sau un numr indicnd pozi ia noii comenzi pe meniu. Dac este omis, comanda apare la sfritul meniului. Este op ional, cheia ataat procedurii, dac exist. Este op ional, mesajul afiat n bara de stare atunci cnd se selecteaz comanda. Este op ional, numele fiierului i numrul intrrii pentru un Help ataat comenzii.

Command_name Macro

Command_position

Macro_key Status_text Help_reference Cheia Delete Commands

Se poate utiliza cheia Delete Commands pentru a terge comenzi din meniurile buil-in. Add-In Manager (comanda AddIns din meniul Tools) citete i scrie valori n cheia Delete Commands. Cheia con ine cte un ir pentru fiecare comand care este tears din meniu. Fiecare nume de valoare este unic i identific comanda eliminat. irul are sintaxa Value_name = Menu_bar_num,Menu_name,Command_position Argument Menu_bar_num Descriere Numrul barei de meniu built-in unde se dorete modificarea meniului. Barele de meniu se schimb dup tipul foii active. Numerele sunt: 3 Nil menu bar (nu exist caiet deschis) 10 worksheet, dialog sheet, macro sheet 4.0 11 chart sheet 12 modul Visual Basic Numele meniu Pozi ia comenzii pe bara meniu. Aceasta poate fi numele unei comenzi sau un numr indicnd pozi ia comenzii n meniu.

Menu_name Menu_position

Observa ie. Este recomandabil s nu se elimine comanda Exit din meniul File dac nu s-a creat o cale alternativ de prsire a aplica iei Microsoft Excel. ncrcarea la cerere n PowerPoint Pentru o ncrcare la cerere a unui add-in PowerPoint, singura posibilitate este s se creeze un DLL pentru a aduga intrri de meniuri i bare de unelte atunci cnd PowerPoint este ncrcat.

283

Pentru a aduga un DLL, se creeaz o cheie cu numele add-in-ului DLL sub cheia \Office\8.0\PowerPoint\DLL Addins\ din Windows Registry. Sub cheia creat se adaug trei valori denumite: AutoLoad, InitFunction i Path. o o o AutoLoad <DWORD> este 0 sau 1. O valoare egal cu 1 arat c DLL este ncrcat automat la pornirea aplica iei PowerPoint. InitFunction <STRING> numele func iei din DLL pe care PowerPoint trebuie s o apeleze o dat ce DLL este ncrcat. Aceast func ie din DLL va crea intrrile de meniu i barele de unelte dorite. Path <STRING> calea complet i numele fiierului DLL.

Acest DLL trebuie s adauge intrrile necesare n meniuri, s creeze barele de unelte i s stabileasc propriet ile OnAction prin referirea complet calificat a numelor de macro-uri dintr-un fiier add-in VBA (*.ppa, *.ppz). ncrcarea la cerere din Word Pentru implementarea unei scheme de ncrcare la cerere, trebuie s se utilizeze cod cu legare trzie. n aceast situa ie codul rspunde de deschiderea i nchiderea template-urilor (vezi i sec iunea "Apelul procedurilor utiliznd referin e cu legare trzie"). Scrierea codului executat la ncrcarea sau descrcarea unui Add-in sau Global Template Se poate scrie cod care s se execute ca rspuns la ncrcarea sau descrcarea unui add-in. De exemplu, atunci cnd se ncarc un add-in se poate executa o procedur care s afieze o bar de unelte dnd acces la func iunile add-in-ului. n mod similar, la descrcarea add-in-ului, aceeai bar de unelte se poate elimina prin executarea unei proceduri speciale. Fiecare aplica ie are totui un mod propriu de realizare a acestor ac iuni. Microsoft Excel evenimentele AddinInstall i AddinUninstall Fiecare add-in are dou evenimente, AddinInstall i AddinUninstall, care sunt declanate la ncrcarea i, respectiv, descrcarea add-in-ului, att prin dialogul Add-ins ct i programatic. Aceste evenimente sunt locurile ideale de plasare a intrrilor n cheile Init Menus i Init Commands din Windows Registry. Se poate utiliza evenimentul Open a unui caiet pentru a efectua nregistrarea caietului i adugarea lui la dialogul AddIn. n urmtorul exemplu se prezint o structur general de utilizare a procedurilor evenimentelor AddinInstall i AddinUninstall. Option Explicit Private Sub Workbook_AddinInstall() ' Add code to customize the Microsoft Excel User Interface (UI) here MsgBox "Addin Installed" End Sub Private Sub Workbook_AddinUninstall() ' Add code to remove customization of the Microsoft Excel UI here MsgBox "Addin Uninstalled" End Sub Private Sub Workbook_Open() ' Check to see if add-in is loaded in Microsoft Excel's AddIn list Dim wkbAddIn As Excel.AddIn On Error GoTo Errorhandler Set wkbAddIn = AddIns(ThisWorkbook.Name) If wkbAddIn Is Nothing Then ' Setting the CopyFile argument to true will cause the add-in ' to be copied to the local harddisk if it is on a removeable ' medium.

284

End If ' Initialize add-in here. Exit Sub Errorhandler: ' Only ignore "Subscript out of range" errors. If Err.Number = 9 Then Err.Clear Resume Next Else ' Assrt the error when in Debug mode. #If DebugMode Then AssertError #End If ' Insert other error handling code here. End If End Sub

Set wkbAddIn = AddIns.Add(ThisWorkbook.FullName, True) ' Thenext line will cause the Workbook.AddInInstalled event ' to fire. wkbAddIn.Installed = True

Microsoft PowerPoint Procedurile Auto_Open i Auto_Close Dei nu suport evenimente, un add-in PowerPoint suport procedura Auto_Open care se execut la ncrcarea fiierului add-in i procedura Auto_Close care se execut la descrcarea fiierului add-in. Procedurile Auto_Open i Auto_Close se execut doar dac ele se gsesc n fiierul add-in. Prezen a lor ntr-un fiier de prezentare (*.ppt) nu produce nici un efect. Microsoft Word Procedurile AutoExec i AutoExit La crearea unui template n Word, se poat crea procedurile numite AutoExec i AutoExit, care se execut atunci cnd template-ul este ncrcat sau descrcat. De exemplu, se pot utiliza AutoExec i AutoExit pentru a afia sau ascunde bare de unelte atunci cnd utilizatorul ncarc sau descarc template-ul. Se pot crea de asemenea module cu denumirile AutoExec i AutoExit, fiecare con innd o procedur de tip Sub denumit Main. Procedura Main din modulul AutoExec se va executa la ncrcarea proiectului, iar Main din modulul AutoExit atunci cnd proiectul este descrcat. Observa ie. Dac fiierul este deschis ca un document, macroul AutoExec sau modulul sinonim nu se vor executa. n locul acestora se execut procedura AutoOpen sau/i procedura de eveniment Document_Open (vezi intrarea de Help Using Events with the Document Object). Urmtorul exemplu ini iaz monitorizarea evenimentelor aplica iei nct se pot utiliza evenimentele obiectului Application. Primele dou rutine trebuie s fie plasate ntr-un modul clas denumit CAppEvents, ultimele trebuie s fie plasate ntr-un modul standard numit AutoExec. Procedura Main din modulul AutoExec, apelat automat la ncrcarea in memorie a template-ului care con ine proiectul, instan iaz clasa CAppEvents. Evenimentul Class_Initialize leag variabila App la obiectul Application. Visual Basic va executa apoi procedura evenimentului DocumentChange de fiecare dat cnd documentul activ se schimb. ' Class module named CAppEvents Public WithEvents App As Word.Application Private Sub Class_Initialize() ' Make the class self_initializing by connecting the object declared

285

End Sub Private Sub App_DocumentChange() ' Display a message box with the active document name If Documents.Count > 0 Then MsgBox ActiveDocument.Name End Sub ' In a standard module named AutoExec Global AppEvent As CAppEvents Public Sub Main() ' Instantiate and initialize the CAppEvents class. This is all ' that is needed to have the above class work. Set AppEvent = New CAppEvents End Sub n Word se poate dori includerea codului care s gestioneze un add-in n procedurile evenimentelor Open, Close i New ale unui document, care se execut atunci cnd un template global este deschis sau nchis ca un document sau cnd este creat un nou document pe baza ablonului. Se pot utiliza de asemenea procedurile evenimentelor Startup, Quit i DocumentChange ale obiectului Application. n acest caz se va revedea modul n care se pot utiliza evenimentele obiectului Application. Observa ie. Dac ntr-un document exist att macro-urile AutoClose, AutoNew i AutoOpen, ct i procedurile evenimentelor similare, atunci se vor executa att macro-uri ct i procedurile. Verificarea final a codului naintea mpachetrii solu iei ca un add-in sau un template global, este util o ultim verificare pentru eliminarea unor erori frecvente, amintite n continuare. Verificarea referin elor la ActiveWorkbook sau ActiveDocument Reamintim c dac proiectul VB dintr-un add-in sau template global con ine o referin explicit sau implicit la documentul activ sau la caietul activ, el sa ve referi n execu ie la acel document sau caiet care se va ntmpla s fie activ n momentul aplicrii referin ei. Pentru referin a la add-in sau template se va utiliza prin urmare ThisWorkbook sau ThisDocument. De exemplu, ambele proceduri scrise n continuare apeleaz foaia denumit "Addin Definition" n caietul care este activ n momentul execu iei codului. Prima procedur con ine o referin explicit, prin ActiveWorkbook. A doua procedur are o referin implicit: deoarece nu se refer explicit la un caiet anumit, referin a este presupus n caietul activ. Sub ExplicitReference() Set rMnuTable = ActiveWorkbook.Worksheets("Addin Definition). _ Range("MenuDefinition") Add_Menu rMnuTable End Sub Sub ImplicitCode() Set rMnuTable = Worksheets("Addin Definition). _ Range("MenuDefinition") Add_Menu rMnuTable End Sub Urmtorul cod utilizeaz proprietatea ThisWorkbook pentru a realiza o referin la caietul n care se execut codul adic n caietul add-in.

' in the class mnodule with the Application object. Set App = Application

286

Sub CorrectCode() Set rMnuTable = ThisWorkbook.Worksheets("Addin Definition). _ Range("MenuDefinition") Add_Menu rMnuTable End Sub Apelul rutinelor din alte proiecte Dac se dorete apelarea unor func ii, proceduri i clase care sunt definite n alt proiect, proiectul apelant trebuie s aib o referin la proiectul apelat. Este de notat c nu se pot crea referin e la prezentri PowerPoint dect n cazul n care acestea sunt salvate ca add-in-uri PowerPoint; dup salvarea ca un add-in prezentarea poate fi referit din alte prezentri. Este evident c pentru a utiliza referin e la proiecte trebuie ca proiectele implicate s poarte denumiri diferite (de regul, la nceputul utilizrii VBA, proiectele se las cu denumirile implicite). Numele implicit al unui proiect se poate vedea/modifica fie n fereastra Properties, fie n Project Name din dialogul Project Properties (ob inut prin click dreapta n VBE i alegerea project name Properties). Referin a la un alt proiect se realizeaz manual prin dialogul References ( meniul Tools) sau programatic prin metoda AddFromFile a colec iei References. Linia urmtoare stabilete o referin din caietul activ la proiectul din add-in-ul MyTools.xla: ActiveWorkbook.VBProject.References.AddFromFile "C:\Tools\MyTools.xla" Este ns de notat c nainte de a stabili programamtic o referin , trebuie (n Word, Excel, PowerPoint) stabilit o referin la biblioteca de tipuri Visual Basic for Applications Extensibility. Aceast bibliotec ofer obiectele care permit lucrul programatic cu proiectul VBA. Observa ie. Rutina Auto_Open dintr-un add-in referit nu este executat la ncrcare prin referin dintr-un alt add-in sau prezentare. Evitarea referin elor nerezolvate La salvarea i distribuirea unui add-in sau template, referin ele stabilite pentru proiectul asociat rmn valabile. Totui, dac add-in-urile sau abloanele referite nu sunt la aceleai loca ii pe maina utilizatorului cum erau pe maina de dezvoltare, referin ele nu vor putea fi rezolvate la beneficiar i solu ia nu va fi executat. n PowerPoint, Visual Basic ncearc s rezolve referin a prin cutarea n acelai folder cu proiectul apelant. n Word i Microsoft Excel, Visual Basic ncearc rezolvarea referin elor prin cutare n loca iile: 1. 2. 3. 4. n acela folder cu add-in-ul sau template-ul apelant. n folderul rdcin a aplica iei gazd. n folderul System i Windows. n toate folderele variabilei de mediu Path.

n Microsoft Excel, Visual Basic privete de asemenea n folderele adugate la valoarea Add-in Path din registry. Dac o referin nu este rezolvat dup completarea cutrii prezentate, execu ia este oprit. n continuare sunt enumerate cteva metode care pot fi utilizate n evitarea/rezolvarea referin elor nerezolvate.

287

o o

Toate fiierele se vor livra n acelai folder. Aceasta este solu ia comun. n Excel se poate actualiza cheia de registry Add-ins Path. Microsoft Excel 97 ofer cheia de registru

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Add-in Path care puncteaz ctre folderele unde Microsoft Excel privete pentru add-in-uri. Valoarea Add-in Path este un ir care const din ci multiple delimitate de caractere ";". La instalarea aplica iei Excel, programul Setup adaug cile ctre folderele Library, Analysis i Solver. Alte programe de instalare pot s modifice valoarea Add-in Path. Modificarea trebuie s fie "politicoas": noile intrri se vor aduga celor existente. Programele de tip uninstall trebuie s elimine doar por iunea din valoare adugat la instalare. o Adugarea folderului solu iei la variabila de mediu Path. Se pot utiliza func iile API GetEnvironmentVariable i SetEnvironmentVariable pentru adugarea temporar a folderului solu iei, sau se poate utiliza scrierea n instruc iunea Path din Autoexec.bat pentru o adugare permanent. Exemplul urmtor utilizeaz func iile GetEnvironmentVariable i SetEnvironmentVariable pentru a modifica temporar variabila de mediu Path. Option Explicit Private Declare Function GetEnvironmentVariable Lib "kernel32" _ Alias "GetEnvironmentVariableA" (ByVal lpName As String, _ ByVal lpBuffer As String, _ ByVal nSize As Long) As Long Private Declare Function SetEnvironmentVariable Lib "kernel32" _ Alias "SetEnvironmentVariableA" (ByVal lpName As String, _ ByVal lpValue As String) As Long ' AppWord is a user defined compile directive #If AppWord = True Then Public Sub AutoExec() AppendEnvironmentPath ThisDocument End Sub #End If 'AppExcel is a user defined compile directive #If AppExcel = True Then Public Sub Workbook_Open() AppendEnvironmentPath ThisWorkbook End Sub #End If Private Sub AppendEnvironmentPath (ThisDocObject As Object) Const ENV_PATH As String = "Path" Dim iRet As Long Dim szPath As String SzPath = String(1024, 0) ' Retrieve the current environment setting. IRet = GetEnvironmentVariable(ENV_PATH, szPath, 1024) If iRet Then ' iRet contains the length of the returned string. ' trim any trailing characters szPath = Mid$(szPath, 1, iRet) ' See if the template path is included in the path statement. If InStr(1,szPath, ThisDocObject.Path, vbTextCompare) = 0 Then

288

Else

End If

' Path is not part of the environment. szPath = szPath & ";" & ThisDocObject.Path iRet = SetEnvironmentVariable (ENV_PATH, szPath) If iRet = 0 Then ' Handle error here. Template path was not appended to ' environment. Err.Raise vbObjectError + Err.LastDllError, _ ThisDocObject.Name & ".AppendEnvironmentPath", _ "Path environment was not set." End If

End Sub

End If

' should raise an error here. This should never happen Err.Raise vbObjectError + Err.LastDllError, _ ThisDocObject.Name & ".AppendEnvironmentPath", _ "No path environment was found."

Se poate scrie un add-in agent de referin (reference broker) care s adapteze referin ele pentru a main specific. Un asemenea agent de referin ar trebuie s verifica referin a i s lege nainte ca solu ia s se execute (sau la momentul ncrcrii). Acest tip de component este bun pentru solu ii trietajate (three-tier). Agentul trebuie s lege dinamic componenta front-end de componenta back-end pe baza versiunii, nivelului de securitate sau al i parametri determina i de administrator. Aceast tehnic poate fi utilizat la actualizarea automat a componentelor. O cale pentru determinarea dac o referin este valid este utilizarea propriet ii IsBroken a obiectului Reference. Proprietatea IsBroken este True dac referin a nu se refer la o intrare valid n Windows Registry.

Apelul unei rutine dintr-un Add-in PowerPoint fr fixarea unei referin e Dac se dorete ncrcarea temporar a unui fiier add-in i executarea unei rutine din fiier, se va utiliza o instruc iune Application.Run i imediat apoi se va descrca fiierul add-in. La executarea Application.Run, Microsoft PowerPoint va ncrca add-in-ul i Va executa macroul specificat. Pentru a descrca fiierul se utilizeaz proprietatea Loaded, dup modelul: Sub CallAddInMacro() Application.Run "\MyAddIn.ppa!MyMacro" AddIns("MyAddIn").Loaded = False End Sub Ultima instruc iune poate fi nlocuit i cu AddIns(AddIns.Count).Loaded = False Apelul rutinelor folosind referin e legate trziu Se poate apela orice procedur public, proprietate sau variabil din modulul ThisDocument sau ThisWorkbook al unui document sau caiet utiliznd o referin trzie la obiectul asociat Document sau Workbook. De exemplu, urmtoarele instruc iuni atribuie obiectul Document, returnat de Open, unei variabile obiect. Dup aceea se apeleaz procedura MySub din modulul clas ThisDocument al documentului:

Dim objDoc As Object Set objDoc = Documents.Open(szFileName)

289

objDoc.MySub Dac documentul reprezentat de variabila objDoc nu are, n modulul su ThisDocument, o procedur public denumit MySub, atunci apare o eroare de execu ie. n acest mod se poate apela cod doar din module ThisDocument sau ThisWorkbook. Dac se dorete apelul unor proceduri din alte module, clase sau forme ale proiectului asociat documentului/caietului deschis, se vor scrie proceduri intermediare n modulul ThisDocument sau ThisWorkbook pentru a le accesa. Observa ie. Procedeul descris nu func ioneaz n PowerPoint deoarece nu exist un modul ThisPresentation n proiect. Protejarea sau neprotejarea codului Stabilirea propriet ii IsAddin nu protejeaz codul surs al proiectului. Pentru protejarea codului se va marca Lock project for viewing (meniul Tools, project Properties, fia Protection) i se va fixa o parol. Dac se fixeaz doar parola, fr blocarea accesului la cod, acesta poate fi vzut dar nu pot s deschid dialogul project Properties fr cunoaterea parolei. Dup stabilirea parolei proiectul se va salva obinuit prin Save (meniul File din Visual Basic Editor). Pentru nlturarea protec iei se va elimina marcarea boxei de control Lock project for viewing i parola introdus. Salvarea solu iei ca un Add-in sau Global Template Fiecare aplica ie din Microsoft Office are un mod propriu de creare a unui add-in. n Microsoft Excel i PowerPoint se salveaz fiierul ntr-un format specific. n Word se salveaz documentul ca un fiier template (.dot). Crearea unui Add-in n Excel La transformarea unui caiet ntr-un add-in, foile caietului sunt ascunse i procedurile din proiect sunt ascunse utilizatorului (procedurile nu mai apar n dialogul Macros). Pentru crearea unui add-in Excel, se fixeaz pe True proprietatea IsAddIn a caietului care con ine codul. O cale de realizare a acestui lucru este salvarea unei copii a caietului respectiv ca un add-in Excel prin selectarea tipului de fiier Microsoft Excel Add-In (*.xla) n dialogul Save As. Proprietatea poate fi stabilit i manual din VBE: se selecteaz "ThisWorkbook" n Project Explorer i se modific proprietatea IsAddIn n Properties Window. Dup ce proprietatea IsAddIn este fixat pe True, caietul este ascuns n Microsoft Excel. Proprietatea se poate stabili i programatic. Observa ie. Dac este nevoie s se modifice elementele caietului dup crearea add-in-ului, se fixeaz proprietatea IsAddIn la False, caietul devine vizibil i editabil. Dup modificare se reface proprietatea IsAddIn i se salveaz caietul. Crearea unui Add-in PowerPoint Atunci cnd se salveaz o copie a prezentrii ca un add-in, toate diapozitivele prezentrii sunt nlturate i numai proiectul VB asociat este compilat i memorat n noul fiier add-in PowerPoint (*.ppa). Procedurile din add-in sunt ascunse i nu apar n dialogul Macros. naintea salvrii prezentrii ca un add-in se recomand salvarea normal ca o prezentare (fiier .ppt) i apoi crearea unei copii ca add-in prin alegerea tipului PowerPoint Add-In (*.ppa) n dialogul Save As. Dac este nevoie de modificri, acestea se efectueaz n fiierul .ppt i se salveaz din nou ca un add-in (fiier .ppa).

290

Crearea unui template global Word Microsoft Word nu suport un format de fiier de tip add-in, similar cu Excel sau PowerPoint. Un template global, sau un template care a fost ncrcat n memorie nct macro-urile sale sunt disponibile din orice document, este echivalentul Word al unui add-in. Pentru crearea unui template global se alege Document Template (*.dot) n Savve As Type din dialogul Save As. Depanarea unui Add-in sau Global Template Pentru depanare se utilizeaz, cu unele particularit i, deprotejarea codului i efectuarea ac iunilor uzuale de verificare a codului. Depanarea unui Add-in Excel Pentru depanarea unui add-in Excel o dat ncrcat, se nltur protec ia proiectului respectiv. Dac este necesar s se vad caietul asociat se fixeaz proprietatea IsAddIn la False. Depanarea unui Add-in PowerPoint Aplica ia PowerPoint necesit fixarea unei valori de registru pentru depanarea unui add-in, deoarece nu se afieaz n mod implicit n Project Explorer add-in-urile ncrcate. Pentru vizibilitatea acestora se va fixa sub cheia HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\PowerPoint\Options valoarea DebugAddins la 1. Urmtoarea pornire a aplica iei PowerPoint va afia n Project Explorer toate add-in-urile ncrcate. Din acest moment se poate deproteja codul etc. Prin fixarea valorii 1 pentru DebugAddins se onoreaz i punctele de oprire din macro-urile atribuite ac iunilor din slide show (dialogul Action Setting din meniul SlideShow). Depanarea unui template global Word Se deschide template-ul global, se deprotejeaz dac este necesar i se efectueaz depanarea in mod uzual. Distribuirea solu iilor prin Setup Wizard Microsoft Office Developer's Edition include un Setup Wizard prin care se poate crea un program Setup de instalare a solu iei oferite. Prin intermediul unor dialoguri succesive se preia informa ia necesar construirii unei mul imi de foldere imagini de disc cu programul de instalare i fiierele necesare. Aceste foldere se pot copia pe dischete sau loca ie de re ea etc. n continuare sunt enumerate facilit ile rezolvate de wizard-ul de instalare: o o o o o o o Copierea fiierelor n loca iile necesare. Crearea shortcut-urilor Windows pentru pornirea solu iei. Adugarea cheilor din Windows Registry necesare. Definirea componentelor selectabile la instalare. Instalarea versiunii run-time de Access. Instalarea unor componente Microsoft Office: Graph 97, Replication Manager, drivere ISAM (indexed sequential access method), fiiere necesare pentru ODBCDirect. Executarea unei aplica ii sau deschiderea unui fiier dup terminarea instalrii.

291

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