Obiecte Microsoft Word
Visual Basic suporta un set de obiecte care corespund direct elementelor din Microsoft Word 97, cele mai multe familiare celor care cunosc interfata utilizator din Word: obiectul Document reprezinta un document deschis, obiectul Bookmark reprezinta un bookmark (semn de carte, punct de referinta) într-un document etc. Orice element din Word — documente, tabele, paragrafe, câmpuri etc. — poate fi reprezentat printr-un obiect din Visual Basic. Pentru automatizarea lucrului în Word se utilizeaza metodele si proprietatile acestor obiecte.
Modelul de obiecte din Word 97 cuprinde aproximativ 180 de obiecte. O reprezentare grafica a structurii ierarhice se poate vedea în Help – "Microsoft Word Objects". O descriere detaliata a unui obiect se obtine prin dublu click pe numele obiectului (în diagrama) sau, uzual, prin indexul din Help. La instalarea aplicatiei trebuie sa se mearga pe Custom si sa se selecteze Online Help for Visual Basic.
Dintr-un document Word, pentru a ajunge la modelul de obiecte se deschide dialogul Help si se merge pe succesiunea Contents and Index – Microsoft Word Visual Basic Reference – Visual Basic Reference – Getting Started with Visual Basic – Microsoft Word Objects.
Din editorul VB se ajunge la continutul si indexul VB Help for Word prin succesiunea Help – Contents and Index – Microsoft Word Visual Basic Reference (din fisa Contents) – Shortcut to Microsoft Word Visual Basic Reference.
În cele ce urmeaza se vor prezenta doar principalele obiecte (mai sus în ierarhie, cele mai des utilizate, pentru operatiunile curente etc.) cu principalele metode si proprietati si pentru scopurile uzuale.
La pornirea unei sesiuni Word se creeaza automat un obiect Application. Se utilizeaza proprietatile si metodele obiectului Application pentru a controla sau returna (afla) atributele întregii aplicatii, a controla aspectul ferestrei Word si pentru a accesa restul modelului de obiecte. Se utilizeaza proprietatea Application pentru a returna obiectul Application Word.
Dintre proprietatile care controleaza aspectul vizibil al aplicatiei mentionam câteva în continuare.
Exprima faptul daca sunt sau nu afisate barele de defilare. Read/write.
La citire, returneaza o valoare Boolean:
Valoarea proprietatii se poate modifica:
Pentru barele orizontale sau verticale, individual, se utilizeaza proprietatile DisplayHorizontalScrollBar si DisplayVerticalScrollBar pentru o fereastra sppecificata.
Exprima faptul daca este afisata bara de stare a aplicatiei. Read/write. Boolean.
La citire, returneaza o valoare Boolean: True daca bara este afisata, False în caz contrar.
La scriere atribuirea unei valori logice produce efectul evident.
Read/write. Long.
Înaltimea ferestrei aplicatiei Word. Pentru a vedea dimensiunea maxima admisa se va utiliza proprietatea UsableHeight.
Read/write. Long.
Returneaza sau fixeaza latimea obiectului, în puncte.
With ApplicationRead/write. Long.
Returneaza sau stabileste starea ferestrei aplicatiei. Poate fi una dintre valorile wdWindowStateMaximize, wdWindowStateMinimize sau wdWindowStateNormal, cu interpretari evidente. Valoarea wdWindowStateNormal arata o fereastra care nu este minimizata sau maximizata.
Pentru a putea seta starea ferestrei, aceasta trebuie sa fie activa (se va utiliza metoda Activate în acest scop). Urmatoarea instructiune maximizeaza fereastra aplicatiei Word
Application.WindowState = wdWindowStateMaximize***
Alte proprietati care controleaza comportarea globala a aplicatiei Word, cum ar fi cele care corespund atributelor accesate prin comanda Options din meniul Tools, se gasesc la obiectul Options.
Utilizând proprietatea Options a obiectului Applications, se returneaza un obiect Options care poate fi apoi configurat, dupa exemplul
With Application.OptionsPentru informatii complete se va studia obiectul Options.
Dintre proprietatile obiectului Application care ofera acces la obiecte situate mai jos în ierarhie (accesori) sunt enumerate cele mai des utilizate.
Read-only.
Returneaza un obiect Document care reprezinta documentul activ (cel care are focusul). Daca nu exista nici un document deschis, atunci apare o eroare.
Read/write. String.
Returneaza sau stabileste numele imprimantei active. Exemplul urmator alege imprimanta activa:
ActivePrinter = "HP LaserJet 4 local on LPT1:"Se observa utilizarea denumirii din mediul Windows.
Read-only.
Returneaza un obiect Window care reprezinta fereastra activa. Daca nu exista nici o fereastra deschisa, apare o eroare.
MsgBox Application.ActiveWindowPrimul exemplu afiseaza numele ferestrei active, al doilea atribuie un nou nume ferestrei active. Este de remarcat ca numele ferestrei nu este obligatoriu identic cu numele documentului si ca exemplele functioneaza corect pentru ca proprietatea implicita a obiectului returnat este numele (Name).
Read-only.
Întoarce colectia Documents a tuturor documentelor deschise.
Read-only.
Întoarce obiectul Selection, care reprezinta un domeniu selectat (redus eventual la punctul de insertie). Este de remarcat ca exista o singura selectie pe fereastra (sau ochi de fereastra) si doar una este activa – cea returnata.
Pentru exemple se va vedea prezentarea obiectului Selection.
Read-only.
Returneaza colectia Windows a tuturor ferestrelor document. Colectia corespunde ferestrelor cu denumirile (si numerele de ordine) listate la meniul Window din Word.
MsgBox Windows.Countafiseaza numarul ferestrelor deschise în Word (atasate unor documente).
Dintre metodele obiectului Application enumeram doar Quit, celelalte sunt sau mai rar utilizate, sau se mai aplica si altor obiecte si vor fi prezentate ulterior.
Apelul procedurii duce la închiderea aplicatiei Word si, optional, salveaza sau ruteaza documentele deschise. Sintaxa:
expression.Quit(SaveChanges, Format, RouteDocument)
unde
expression este o expresie care returneaza un obiect Application.
SaveChanges este de tip Variant, optional, si specifica daca Word salveaza documentele înaintea închiderii. Poate fi o constanta (de tipul enumerat WdSaveOptions) wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges, interpretarile fiind evidente.
OriginalFormat este de tip Variant, optional, si specifica modul în care Word salveaza documentele al caror format original nu a fost acela de document Word. Poate fi o constanta (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.
RouteDocument este de tip Variant, optional. Este True daca se doreste directarea documentului catre urmatorul recipient. Daca documentul nu are atasata o fisa de rutare (routing slip), argumentul este ignorat (vezi obiectul RoutingSlip).
În exemplul urmator
Application.Quit SaveChanges:=wdPromptToSaveChanges, OriginalFormat:=wdWordDocumentse paraseste Word, se întreaba utilizatorul daca se salveaza documentele care au fost modificate de la ultima salvare si toate documentele se salveaza în format Word (indiferent de formatul initial).
Deschiderea sau crearea unui fisier în Word produce crearea unui obiect Document. Se utilizeaza proprietatile si metodele obiectului Document sau ale colectiei Documents pentru a deschide, crea, salva, activa si închide fisiere.
În prezentarea obiectului Document alegem calea actiunilor uzuale asupra unui document si nu listarea proprietatilor si metodelor (decât acolo unde este absolut necesar).
Se poate obtine orice document deschis ca un obiect Document prin
Documents(index)
unde index este numele documentului (ca sir) sau numarul de ordine al documentului în colectie. Deoarece numarul de ordine se poate schimba, prin modificarea colectiei, se recomanda utilizarea numelor documentelor. În exemplul
Set wdRaport = Documents("Raport.doc")variabila wdRaport, definita de tip obiect, contine un obiect Document care se refera la documentul deschis "Raport.doc". Orice transformare a variabilei se va reflecta în documentul Raport.doc.
Se poate utiliza si proprietatea ActiveDocument (vezi Application) pentru a returna obiectul Document care se refera la documentul activ:
If Documents.Count >= 1 ThenPentru a deschide un document existent, se va utiliza metoda Open a colectiei Documents, metoda care deschide documentul specificat si îl adauga la colectia Documents. Returneaza un obiect Document. Sintaxa, în versiunea aplicabila aici, este
expression.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format)
unde
expression este o expresie care returneaza un obiect Documents.
FileName este de tip Variant si contine numele documentului (inclusiv calea, daca este necesar). În Windows se pot specifica mai multe fisiere separate prin spatii. Este semnalata eroare daca fisierul specificat nu exista.
ConfirmConversions este de tip Variant, optional. Are valoarea True pentru a afisa dialogul Convert File daca fisierul nu este în format Word.
ReadOnly este de tip Variant, optional. Are valoarea True daca documentul se deschide ca read-only.
AddToRecentFiles este de tip Variant, optional. Are valoarea True daca numele fisierului se adauga listei fisierelor recent utilizate (de la baza meniului File).
PasswordDocument este de tip Variant, optional si reprezinta parola necesara la deschiderea documentului.
PasswordTemplate este de tip Variant, optional si reprezinta parola necesara la deschiderea sablonului (template).
Revert este de tip Variant, optional. Controleaza ce se întâmpla daca FileName este numele unui fisier deja deschis: True pentru a neglija orice schimbari nesalvate si redesc 343e41d hiderea documentului; False pentru a activa documentul deschis.
WritePasswordDocument este de tip Variant, optional. Este parola necesara pentru salvarea schimbarilor aduse documentului.
WritePasswordTemplate este de tip Variant, optional. Este parola necesara pentru salvarea modificarilor aduse sablonilui.
Format este de tip Variant, optional. Indica tipul de
conversie utilizat la deschiderea documentului. Poate fi o
wdOpenFormatAuto, |
wdOpenFormatDocument, |
WdOpenFormatRTF, |
wdOpenFormatTemplate, |
wdOpenFormatText, |
WdOpenFormatUnicodeText. |
Valoarea implicita este wdOpenFormatAuto.
Pentru o mai buna informare asupra ultimului argument, se va studia obiectul FileConverter.
În exemplul urmator se deschide fisierul Test.doc din folderul curent:
Set wdTestDoc = Documents.Open(FileName:="test.doc")Este de remarcat, în exemplu, ca fisierul este în directorul curent, ceea ce poate produce erori la executarea codului: este suficent ca utilizatorul sa schimbe folderul pentru ca documentul test.doc sa nu mai fie gasit. Din acest motiv este de preferat ca numele sa con de remarcat, în exemplu, ca fisierul este în directorul curent, ceea ce poate produce erori la executarea codului: este suficent ca utilizatorul sa schimbe folderul pentru ca documentul test.doc sa nu mai fie gasit. Din acest motiv este de preferat ca numele sa contina calea completa, ceea ce contribuie la robustetea codului. În acelasi scop se vor utiliza proprietatile PathSeparator (a obiectului Application), care returneaza caracterul separator utilizat de sistemul de fisiere, diferit în DOS/Windows si Macintosh si DefaultFilePath (a obiectului Options), care returneaza/seteaza cai ale folderelor specificate.
În exemplul urmator se utilizeaza obiectul FileSearch pentru a determina daca exista fisierul care trebuie deschis:
defaultDir = Options.DefaultFilePath(wdDocumentsPath)Se va observa utilizarea structurii With…End With si a modului cum se formeaza argumentul FileName din cale si denumire.
O alta modalitate de deschidere a unui document este prin afisarea dialogului Open uzual în Office (ca si în alte aplicatii Windows). Acest mod se realizeaza prin
Dialogs(wdDialogFileOpen).Showcare returneaza un obiect Dialog ce se refera la dialogul Open (din meniul File) iar metoda Show afiseaza si executa actiunile executate în boxa de dialog Open.
Utilizarea metodei Display (în locul metodei Show) produce doar afisarea dialogului fara nici o alta actiune. Daca utilizatorul apasa butonul OK al boxei, atunci este returnata valoarea -1 si se poate sti numele fisierului selectat în boxa dupa modelul urmator:
Set dlg = Dialogs(wdDialogFileOpen)Observatie. Pentru o discutie mai ampla asupra utilizarii cutiilor de dialog definite în Word se va vedea Word VB Help – "Displaying built-in Word dialog boxes".
Pentru a determina daca un anumit document este deschis se poate enumera colectia Documents si testa numele documentelor deschise. În urmatorul exemplu se activeaza documentul "cautat.doc" daca este deschis si se deschide daca nu este deja deschis.
docFound = TruePentru a determina câte documente sunt deschise se utilizeaza proprietatea Count a colectiei Documents:
If Documents.Count = 0 Then MsgBox "Nu este deschis nici un document"Pentru a crea un nou document se utilizeaza metoda Add aplicata colectiei Documents. Metoda returneaza documentul creat ca un obiect Document, astfel încât valoarea returnata poate fi atribuita unei variabile de tip obiect pentru a putea referi direct noul document în program:
Dim myDoc As Documentultima instructiune fixeaza marginea de sus la 1.25".
Documentul nou devine documentul activ.
Pentru a salva un document nou pentru prima data, se utilizeaza metoda SaveAs a obiectului Document. Exemplul urmator este de acest fel:
ActiveDocument.SaveAs FileName:="salvat.doc"Documentul activ este salvat cu numele "salvat.doc" si poate fi identificat cu acest nume în colectia Documents.
Exemplul urmator construieste o expresie mai complicata, exploatând cele spuse mai sus: se creeaza un nou document care este salvat imediat cu un nume si apoi se insereaza în document un tabel cu doua linii si trei coloane.
Documents.Add.SaveAs FileName:="vanzari.doc"Pentru salvarea modificarilor efectuate într-un document, se utilizeaza metoda Save a colectiei Documents:
Documents("vanzari.doc").SaveUtilizarea metodei Save cu un document nou deschide dialogul Save As pentru a întreba utilizatorul despre numele dat fisierului.
Pentru salvarea tuturor fisierelor deschise se va utiliza metoda Save aplicata colectiei Documents.
Metoda Save are sintaxa dependenta de obiectul caruia i se aplica:
expression.Save
unde expression este orice expresie care returneaza un obiect Document sau Template, este aplicabila unui document sau template.
expression.Save(NoPrompt, OriginalFormat)
este aplicabila colectiei Documents. Argumentele sunt
expression este orice expresie care returneaza un obiect Documents.
NoPrompt este de tip Variant, optional. Are valoarea True pentru ca Word sa salveze automat toate documentele, False pentru ca Word sa întrebe utilizatorul înaintea de salvarea fiecarui document care a fost modificat.
OriginalFormat este de tip Variant, optional. Specifica modul în care sunt salvate documentele.
Poate fi o constanta (de tipul enumerat WdOriginalFormat) dintre wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.
Pentru activarea unui alt document se aplica metoda Activate obiectului Document respectiv. Reamintim ca la crearea unui nou document, acesta ramâne activ. Documentul activat trebuie sa fie deschis (inclus în colectia Documents):
Documents("raport.doc").Activatedaca variabila Doc1 a primit ca valoare un document deschis.
Metoda Activate, aplicabila mai multor obiecte (vezi Word VB Help – Activate Method), are sintaxa
expression.Activate
unde expression este orice expresie care returneaza un obiect caruia i se poate aplica metoda.
Întrucât tiparirea unui document este gestionata de mai multe comenzi si parametri, din dialoguri diferite în mediul Word, controlul tiparirii din Visual Basic necesita eventuale interventii asupra obiectului Options (pentru a fixa parametrii accesati uzual prin Tools – Options – fisa Print) si utilizarea metodei PrintOut, aplicabila obiectului Document.
Proprietatile obiectului Options, care privesc tiparirea, sunt identificate usor prin aceea ca numele lor începe cu Print: PrintComments, PrintHiddenText, PrintDrawingObjects, PrintFieldCodes etc., atribuirea valorii True fiind echivalenta cu marcarea boxei de control din dialogul Word corespunzator.
Metoda PrintOut este aplicabila obiectelor Application, Document sau Window si are parametri corespunzatori optiunilor din dialogul Print (meniul File din mediul Word). Sintaxa, cu specificarea si explicarea principalelor argumente, este
expression.PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName)
unde
expression este orice expresie care returneaza un obiect Application, Document sau Window. Background este de tip Variant, optional. Are valoarea True daca tiparirea are loc în fundal (macro-ul continua în timpul tiparirii documentului).
Append este de tip Variant, optional. Are valoarea True atunci când, la tiparirea în fisier, documentul este adaugat fisierului specificat în argumentul OutputFileName; are valoarea False pentru rescrierea fisierului OutputFileName.
Range este de tip Variant, optional si specifica tipul de domeniu tiparit. Poate fi una din constantele (de tip WdPrintOutRange): wdPrintAllDocument, wdPrintCurrentPage, wdPrintFromTo, wdPrintRangeOfPages sau wdPrintSelection.
OutputFileName este de tip Variant, optional. Daca PrintToFile este True, atunci argumentul da numele (eventual cu cale) pentru fisierul unde are loc tiparirea.
From este de tip Variant, optional. Specifica numarul paginii de unde începe tiparirea, daca Range este wdPrintFromTo.
To este de tip Variant, optional. Specifica numarul paginii pâna unde se tipareste, daca Range este wdPrintFromTo.
Item este de tip Variant, optional. Specifica
elementul care se tipareste. Poate fi o
Copies este de tip Variant, optional. Specifica numarul de copii tiparite.
Pages este de tip Variant, optional. Specifica numerele paginilor si secventele de pagini care se tiparesc, separate prin virgule, daca Range este wdPrintRangeOfPages. De exemplu, "2, 6-10" înseamna pagina 2 si paginile de la 6 la 10.
PageType este de tip Variant, optional. Specifica tipul de pagini tiparite. Poate fi o constanta (de tipul WdPrintOutPages): wdPrintAllPages, wdPrintEvenPagesOnly sau wdPrintOddPagesOnly.
PrintToFile este de tip Variant, optional. Are valoarea True pentru a trimite comenzile de tiparire catre un fisier. Numele fisierului este dat în argumentul OutputFileName.
Collate este de tip Variant, optional. Are valoarea True pentru a tipari toate paginile documentului înaintea tiparirii urmatoarei copii (argument valabil în cazul tiparirii mai multor copii ale documentului – argumentul Copies).
FileName este de tip Variant, optional. Numele fisierului (inclusiv calea, daca este în alt folder decât cel curent) care contine documentul care se tipareste. Daca argumentul este omis, atunci se tipareste documentul activ. Argumentul este admis doar pentru obiectul Application.
Exemplul urmator fixeaza pentru documentul activ tiparirea textului ascuns si tipareste primele trei pagini:
Options.PrintHiddenText = TrueDaca tiparirea se efectueaza cu valorile curente (implicite) ale parametrilor, atunci este suficienta comanda:
ActiveDocument.PrintOutSe observa ca operatiunea de tiparire necesita, pentru o procesare mai fina, specificarea documentului, specificarea paginilor, a tipului de tiparire (toate, pagini pare sau impare), specificarea destinatiei (imprimanta sau fisier).
Se va vedea si proprietatea PageSetup care controleaza atributele paginii pentru document, sectiune etc.
Pentru închidere se aplica metoda Close obiectului Document sau colectiei Documents.
Documents("raport.doc").CloseDaca s-au efectuat modificari în document, de la ultima salvare, se afiseaza dialogul de salvare. Închiderea tuturor documentelor deschise se efectueaza aplicând metoda Close pentru întreaga colectie:
Documents.CloseMetoda Close este aplicabila mai multor obiecte. Sintaxa pentru Documents sau Document este
expression.Close(SaveChanges, OriginalFormat, RouteDocument)
unde
expression este o expresie care returneaza un obiect Document sau Documents.
SaveChanges este de tip Variant, optional. Specifica tipul de actiune privind salvarea documentului înainte de închidere. Poate fi o constanta (de tip WdSaveOptions): wdDoNotSaveChanges, wdPromptToSaveChanges sau wdSaveChanges, cu interpretari evidente.
OriginalFormat este de tip Variant, optional. Specifica formatul documentului la salvare (poate fi o constanta (de tip WdOriginalFormat): wdOriginalDocumentFormat, wdPromptUser sau wdWordDocument.
RouteDocument este de tip Variant, optional. Are valoarea True daca documentul este rutat catre urmatorul recipient. Daca documentul nu are atasata o fisa de rutare (routing slip), argumentul este ignorat (vezi obiectul RoutingSlip).
Urmatorul exemplu închide, fara salvare, toate documentele:
Documents.Close SaveChanges:=wdDoNotSaveChangesDin obiectul Document se pot accesa, prin proprietati sau metode, obiecte care corespund entitatilor care formeaza documentul scris în Word. Dintre obiectele accesibile mentionam (nu toate): Bookmarks, Characters, CommandBars, Comments, DocumentProperties, Endnotes, Fields, Footnotes, FormFields, Frames, HyperLinks, Indexes, Lists, ListTemplates, PageSetup, Paragraphs, Range, Revisions, Sections, Sentences, Shapes, StoryRanges, Styles, Subdocuments, Tables, TablesOfContents, TablesOfFigures, Template, Variables, Windows, Words.
De exemplu, prin
MsgBox "Sunt " & ActiveDocuments.Tables.Count & " tabele în document"afiseaza un mesaj cu numarul tabelelor existente în documentul activ.
Este evident ca utilizând proprietatile si metodele obiectelor astfel returnate se pot modifica programatic obiectele referite: se pot adauga si formata tabele, câmpuri, paragrafe, cuvinte etc.
ActiveDocument.Footnotes.Add Range:=myRange, Text:="Textul notei de subsol adaugate"adauga o nota de subsol la locul din document specificat de variabila myRange.
Un obiect Range reprezinta o zona continua dintr-un document. Fiecare obiect Range este definit de o pozitie (de caracter) de început si de o pozitie (de caracter) de sfârsit. Utilizat pentru identificarea unor portiuni din document, obiectul Range este similar obiectului Bookmark, diferenta fiind totusi importanta: un obiect Range exista doar atât timp cât se executa procedura care l-a definit.
Atunci când pozitia de început este identica cu pozitia de sfârsit, obiectul Range identifica punctul de insertie. Nu exista limitari asupra întinderii unui obiect Range.
Obiectele Range sunt independente de selectia din document: se poate defini si modifica un domeniu fara sa se schimbe selectia. Se pot defini, de asemenea, domenii multiple într-un document, în timp ce selectia este unica într-un ochi de fereastra..
Pentru a întelege toate proprietatile obiectului Range (si ale altor obiecte, de altfel), trebuie stiut ca zonele unui document se presupun structurate în episoade (stories). Un episod (story) este o zona de text diferita de celelalte zone din acel document. Astfel, daca un document contine text principal (body text), note de subsol si anteturi, atunci documentul contine un episod cu textul principal, un episod cu note de subsol si un episod cu anteturi. Exista 11 tipuri diferite de episoade posibile într-un document, corespunzând urmatoarelor constante (din WdStoryType):
WdEndnotesStory |
wdEvenPagesFooterStory |
wdEvenPagesHeaderStory |
WdFirstPageFooterStory |
wdFirstPageHeaderStory |
wdFootnotesStory |
WdMainTextStory |
wdPrimaryFooterStory |
wdPrimaryHeaderStory |
WdTextFrameStory |
Tipul episodului pentru un obiect de gen domeniu (Range), selectie (Selection) sau semn de carte (Bookmark) este returnat de proprietatea StoryType. Cunoasterea acestei proprietati este importanta prin aceea ca mediul Word deschide ferestre sau ochiuri diferite dupa episodul în care este punctul de insertie (selectia), Pentru navigarea programatica între aceste ochiuri trebuie sa se cunoasca valoarea proprietatii StoryType.
Proprietatile Start, End si StoryType identifica un obiect Range în mod unic. Start si End specifica sau returneaza pozitiile de început si, respectiv, de sfârsit ale obiectului Range. Pozitia de caracter de la începutul fiecarui episod este 0, pozitia de dupa primul caracter este 1 s.a.m.d.
Proprietatile Start si End sunt de tip Long, read/write. Pozitiile returnate sunt relative la începutul episodului. Daca fixarea unei proprietati strica ordinea naturala dintre start si end, atunci cealalta valoare este fixata automat la valoarea atribuita.
Prin atribuirea de valori proprietatilor Start si End se poate modifica dimensiunea domeniului referit.
În general, este de preferat sa se opereze cu obiecte Range în loc de obiecte Selection, deoarece:
La
înregistrarea unui macro creeaza, de obicei, referinte la obiectul Selection.
Este interesant de comparat acest cod cu secventa obtinuta la înregistrarea unui macro care efectueaza aceeasi sarcina.
Aplicata unui obiect Document, metoda Range returmeaza un obiect Range situat în episodul principal. Sintaxa este
expression.Range(Start, End)
unde
expression este orice expresie care returneaza un obiect Document.
Start este de tip Long, optional. Specifica punctul de început (în pozitii de caracter).
End este de tip Long, optional. Specifica punctul de sfârsit (în pozitii de caracter).
Pozitiile de caracter încep cu 0 la începutul documentului. Sunt numarate toate caracterele, inclusiv caracterele netiparibile. Caracterele ascunse se numara chiar daca nu sunt afisate. Daca nu se specifica pozitiile de început si/sau sfârsit, se considera, implicit, începutul si sfârsitul documentului.
Exemplul urmator scrie în bold primele 10 caractere ale documentului:
ActiveDocument.Range(Start:=0, End:=10).Bold = TrueDaca este necesar ca obiectul Range returnat sa fie referit de mai multe ori, se va utiliza instructiunea Set prin care se atribuie obiectul returnat unei variabile obiect:
Dim myRange As RangeSe
observa definirea unei variabile obiect de tip
În exemplul urmator se observa utilizarea unui obiect Range doar ca punct de referinta în document (asemenea unui Bookmark):
Set inceputDoc = ActiveDocument.Range(Start:=0, End:=0)Pozitiile
de start si end pot fi specificate direct sau prin intermediul proprietatilor Start
si End ale altor obiecte cum ar fi Selection,
Deoarece obiectul Range nu are un corespondent visual în document, se poate utiliza metoda Select a obiectului pentru a produce selectarea textului din domeniu si a verifica, astfel, definirea corecta a obiectului Range:
myRange.Selectselecteaza portiunea de text continuta în variabila myRange, careia în prealabil i s-a atribuit un Range.
Proprietatea Range este disponibila pentru multiple obiecte — de exemplu Paragraph, Bookmark, Endnote, Cell — si este utilizata pentru întoarcerea unui obiect Range.
Exemplele urmatoare sunt usor interpretabile. Pentru explicatii complete se vor studia obiectele respective.
Active.Document.Paragraphs(1).RangeNu trebuie uitata structura With…End With pentru procesari multiple ale aceluiasi obiect Range.
Visual Basic include obiecte care pot fi utilizate pentru a modifica urmatoarele tipuri de elemente ale documnetului: caractere, cuvinte, propozitii, paragrafe si sectiuni. Tabelul urmator arata proprietatile (aplicabile unor diverse obiecte) care corespund acestor elemente si obiectele returnate:
expresia |
obiect returnat |
Words(index) |
Range |
Characters(index) |
Range |
Sentences(index) |
Range |
Paragraphs(index) |
Paragraph |
Sections(index) |
Section |
Pentru ultimele doua colectii din tabel este de notat ca pentru a junge la obiectul Range corespunzator se va apela la proprietatea Range. Prin urmare
Paragraphs(index).Rangedau acces la obiectele Range respective.
Pentru modificarea unui domeniu de text din document, se poate crea un obiect Range cu acele elemente (caractere, propozitii, paragrafe etc.). Aplicarea proprietatilor si metodelor obiectului Range astfel creat va produce modificarea textului referit de obiect:
ActiveDocument.Words(1).Case = wdUpperCasetrece primul cuvânt din document în majuscule. De remarcat ca proprietatea Case este aplicata obiectului Range returnat de ActiveDocument.Words(1).
În formarea obiectelor Range sunt importante proprietatile Start si End care dau începutul si sfârsitul.
Proprietatile elementelor documentului, specificate în tabelul anterior în prima coloana, sunt admise pentru obiectele Document, Selection si Range.
Accesul la continutul unui obiect Range este realizat prin proprietatea Text. Proprietatea Text returneaza textul neformatat (plain text) al domeniului referit. Atunci când se seteaza aceasta proprietate, textul domeniului referit este înlocuit de valoarea atribuita proprietatii.
primCuvant = ActiveDocument.Words(1).Textreturneaza sau modifica primul cuvânt din documentul activ.
Pentru inserarea unui text înaintea sau dupa un obiect Range se utilizeaza, respectiv, metodele InsertBefore sau InsertAfter. Dupa inserarea unui text, domeniul este extins automat pentru a include si textul inserat (înainte sau dupa).
Sintaxa metodelor este
expression.InsertBefore(Text)
expression.InsertAfter(Text)
unde
expression este o expresie care returneaza un obiect
Text este de tip String si reprezinta textul care se insereaza.
Pentru inserarea caracterelor speciale se va utiliza functia Chr, sau constantele Visual Basic cum ar fi vbCr, vbLf, vbCrLf sau vbTab.
Inserarea unui text dupa un domeniu care se refera la un întreg paragraf are loc dupa marca de paragraf. Drept urmare textul este inserat la începutul paragrafului urmator. Pentru a anula acest lucru se va identifica sfârsitul de domeniu (Range sau Selection) si se va scadea cu 1 pozitia finala (deci se va trece în fata caracterului marca de paragraf). Exemplul urmator arata mecanismul utilizat:
Set Doc = ActiveDocumentUn domeniu poate fi redus la punctul de început sau de sfârsit (proprietatile Start si End devin egale cu pozitia de caracter respectiva) prin metoda Collapse. Sintaxa este
expression.Collapse(Direction)
unde
expression este o expresie care returneaza un obiect Range sau Selection.
Direction este de tip Variant, optional si indica directia
în care are loc implozia domeniului. Poate fi o
Utilizarea metodei cu wdCollapseEnd, atunci când domeniul se refera la un întreg paragraf, produce un domeniu situat dupa marca de paragraf.
Pentru formatarea textului dintr-un obiect Range, se utilizeaza
Proprietatea Font returneaza un obiect Font care dispune de toate metodele si proprietatile necesare pentru aplicarea formatarilor admise pentru caractere în Word.
Proprietatea ParagraphFormat returneaza un obiect ParagraphFormat care permite efectuarea tuturor formatarilor admise pentru un paragraf în Word.
Deoarece ambele obiecte, Font si ParagraphFormat sunt foarte complexe dar reprezinta actiuni de rutina pentru un utilizator Word nu vor fi prezentate aici. Exemplul urmator constituie un model suficient pentru orice alta actiune care implica aceste obiecte:
With ActiveDocument.Paragraphs(1).Range.FontTextul sursa precedent realizeaza pentru primul paragraf din documentul activ setarea fontului ca "Times New Roman", de marime 14 si scris cu majuscule. În formatarea paragrafului se realizeaza indentarea din stânga cu 1.5" si spatierea la un rând.
Pentru modificarea limitelor unui obiect Range se pot utiliza, în mod uzual, proprietatile Start si End:
myRange.End = myRange.End + 10Metodele MoveStart si MoveEnd produc o actiune similara, dar se pot utiliza unitati diverse, predefinite, pentru extinderea domeniului. Ambele metode returneaza un intreg care arata numarul de unitati cu care s-a modificat Start sau End, sau 0 daca operatiunea nu s-a putut realiza. Sintaxa este
expression.MoveStart(Unit, Count)
expression.MoveEnd(Unit, Count)
unde
expression este o expresie care returneaza un obiect Range sau Selection.
Unit este de tip Variant, optional. Reprezinta unitatea cu care se deplaseaza punctul de start/end al obiectului. Poate fi una dintre constantele (de tip WdUnits): wdCharacter, wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow sau wdTable. Pentru obiectul Selection poate fi si wdLine. Valoarea implicita este wdCharacter.
Count este de tip Variant, optional. Numarul maxim de unitati cu care se muta punctul de start/end. Poate fi negativ sau pozitiv, cu interpretarile curente. În cazul când operatiunea produce inversarea fizica a pozitiilor de Start si End, cele doua pozitii devin egale (Range sufera un colaps). Valoarea implicita este 1.
În exemplul urmator
myRange.MoveEnd Unit:=wdParagraph, Count:=1se extinde domeniul încât sa cuprinda si urmatorul paragraf.
Observatie. Exista si metode mai fine cum ar fi MoveUntil, MoveWhile, MoveStartUntil, MoveEndWhile etc. Se va vedea intrarea respectiva din Word VB - Help.
Metoda SetRange poate fi utilizata pentru modificarea
simultana a limitelor unui
expression.SetRange(Start, End)
unde
expression este o expresie care returneazaun obiect Range sau Selection.
Start este de tip Long, pozitia noua de start.
End este de tip Long, pozitia noua de sfârsit (end).
De exemplu:
myRange.SetRange Start:=myRange.Start, End:=myRange.End+10care extinde domeniul cu 10 caractere.
Pentru deplasarea obiectului Range cu un numar de unitati se va studia metoda Next. Acest procedeu se poate folosi la parcurgerea seceventiala a unei secvente de cuvinte, paragrafe. Este de reamintit ca o asemenea parcurgere poate fi efectuata si prin structura For Each…Next.
O prima procedura este cea, exemplificata mai sus, în care se utilizeaza instructiunea Set pentru atribuirea unui Range la o variabila obiect, instructiune care poate opera si în ipostaza
Set Range2 = Range1La modificarea unui obiect, schimbarea se va reflecta automat si în celalalt obiect.
Este de observat ca printr-o instructiune de atribuire directa
Range2 = Range1se atribuie proprietatea implicita a obiectului Range1 (adica proprietatea Text) proprietatii implicite a obiectului Range2. Prin urmare codul este echivalent cu
Range2.Text = Range1.Textcare nu modifica obiectele Range respective (doar continutul lui Range2). Cele doua obiecte pot fi la locatii diferite, doar continutul este acelasi si legatura dintre ele nu se stabileste permanent.
Prin proprietatea Duplicate se creeaza un nou obiect Range, duplicat, cu aceleasi limite si text:
Set Range2 = Range1.DuplicateModificarea limitelor unui obiect nu influenteaza limitele celuilalt, dar modificarea textului poate produce modificarea celuilalt în cazul suprapunerii domeniilor.
Obiecte Microsoft Word (II)
Atunci când se proceseaza un document în Microsoft Word, este uzual sa se selecteze o portiune de text si sa se formateze/modifice/etc. portiunea selectata. În Visual Basic, operatiunea de selectare prealabila nu este necesara, obiectul Range permite toate actiunile pentru domenii determinate ale documentului. Totusi, atunci când se doreste ca, programatic, sa se raspunda unei selectii efectuate de utilizator, sau sa se modifice selectia etc., se poate opera cu obiectul Selection.
Exista un singur obiect Selection pe ochi de fereastra si doar un obiect este activ la un moment dat (corespunzând locului unde este puctul de insertie, cu toata zona selectata adiacenta). Este evident, din lucrul în Word, ca o selectie poate sa se refere la un întreg domeniu sau poate fi redusa la punctul de insertie.
Obiectul Selection este returnat de proprietatea Selection a obiectelor Application, Window sau Pane. Utilizata cu Application, proprietatea returneaza obiectul Selection care se refera la selectia activa. Prin urmare
Selection.InsertAfter Text:=" Text adaugat dupa selectie"utilizeaza proprietatea Selection a obiectului Application (fiind globala nu trebuie specificat obiectul), este returnata selectia activa si se insereaza un text, similar metodei InsertAfter de la Range.
Daca se lucreaza cu selectia dintr-o fereastra particulara, obiectul respectiv se specifica:
Windows("Document2").Selection.Paragraphs(1).SpaceBefore = InchesToPoints(0.15)mareste la 0.15" spatiul dinaintea primului paragraf din selectie (daca selectia este punctul de insertie, se modifica paragraful curent).
Urmatorul exemplu insereaza text în antetul primei pagini
With ActiveWindowÎn general, metodele si proprietatile uzuale ale obiectului Selection sunt similare celor de la obiectul Range. Este totusi de amintit ca obiectul Selection are corespondent grafic în document: zona selectata. Orice extindere sau implozie se vede imediat.
Deoarece nu exista decât o selectie pe ochi de fereastra, selectarea unei noi zone muta implicit si obiectul Selection. Aceasta selectare se efectueaza aplicând metoda Select unui element din document:
ActiveDocument.Words(1).Selectpermite mutarea selectiei la primul cuvânt, astfel încât se poate utiliza dupa aceea metoda Selection:
Selection.Text = "Primul"pentru modificarea textului selectat.
Exista un numar de metode care deplaseaza selectia în document (prin modificarea corespunzatoare a obiectului Selection).
Move Unit, Count) – reduce selectia la punctul de sfârsit (Count > 0) sau de început (Count < 0) si deplaseaza apoi punctul de insertie astfel obtinut Count unitati (in sensul pozitiv sau negativ).
MoveEnd, MoveStart – similare descrierilor de la obiectul Range
MoveLeft Unit,Count,Extend) – unde Unit poate fi wdCell, wdCharacter, wdWord sau wdSentence, Count este numarul de unitati, Extend arata tipul actiunii: wdMove pentru colaps la stânga si mutarea selectiei, wdExtend pentru extensie spre stânga.
MoveRight(Unit,Count,Extend) – este similara metodei MoveLeft, dar actiunea este spre dreapta.
MoveDown(Unit,Count,Extend), MoveUp(Unit,Count,Extend) – cu actiune similara metodelor precedente, dar directia de actiune este sus-jos. Unit poate fi wdLine, wdParagraph, wdWindow sau wdScreen. Extend poate fi wdMove sau wdExtend, cu sensul explicat anterior.
Exemple:
Selection.MoveDown Unit wdParagraph, Count:=1, Extend:=wdMovemuta punctul de insertie la începutul paragrafului urmator.
Selection.MoveEnd Unit wdParagraph, Count:=1extinde selectia prin mutarea pozitiei finale la sfârsitul paragrafului.
Selection.MoveRight Unit wdCharacter, Count:=1, Extend:=wdExtendextinde selectia activa cu un cuvânt spre dreapta.
Utilizarea metodelor GoToNext, GoToPrevious sau GoTo permite mutarea selectiei prin alegerea tipului de element tinta din document, a directiei etc.
Aplicata
obiectului Selection, muta punctul de insertie în pozitia de caracter imediat
precedenta elementului specificat si returneaza un
obiect Range (cu exceptia specificarii elementelor wdGoToGrammaticalError,
wdGoToProofreadingError sau wdGoToSpellingError, caz în care
expression.GoTo(What, Which, Count, Name)
unde
expression este o expresie care returneaza un obiect Document, Range sau Selection.
What este de tip Variant, optional si precizeaza tipul elementului unde se muta punctul de insertie (selectia). Poate fi una dintre constantele (de tipul enumerat WdGoToItem):
wdGoToBookmark |
wdGoToComment |
wdGoToEndnote |
wdGoToEquation |
wdGoToField |
wdGoToFootnote |
wdGoToGrammaticalError |
wdGoToGraphic |
wdGoToHeading |
wdGoToLine |
wdGoToObject |
wdGoToPage |
wdGoToPercent |
wdGoToProofreadingError |
wdGoToSection |
wdGoToSpellingError |
wdGoToTable |
Which este de tip Variant, optiomal si specifica modul de mutare a selectiei. Poate fi una dintre constantele (de tip WdGoToDirection): wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious sau wdGoToRelative.
Count este de tip Variant, optional si indica numarul utilizat la determinarea elementului (în functie de tipul de actiune dat de Which). Este doar pozitiv si pentru gasirea unui element anterior se va utiliza wdGoToPrevious cu un Count > 0.
Name este Variant, optional si da numele elementului tinta, daca What este wdGoToBookmark, wdGoToComment, wdGoToField sau wdGoToObject.
Exemple:
Selection.GoTo What wdGoToHeading, Which:=wdGoToFirstPentru
actiuni limitate doar la deplasarea cu un singur
element, metodele cu sintaxa (pentru
GoToNext(What)
GoToPrevious(What)
unde
What este una dintre constantele de tip WdGoToItem (vezi metoda GoTo).
Metodele returneaza un obiect Range (vezi discutia de la GoTo).
Cele mai multe obiecte accesibile din obiectele Range si Document sunt disponibile si din obiectul Selection. Se pot astfel procesa obiectele din interiorul selectiei. Lista obiectelor care sunt referite din Selection este
Bookmarks, Borders, Cells, Characters, Columns, Comments, Document, Endnotes, Fields, Find, Font, Footnotes, FormFields, Frames, HeaderFooter, Hyperlinks, InlineShapes, PageSetup, ParagraphFormat, Paragraphs, Revision, Range, Rows, Sections, Sentences, Shading, ShapeRange, Tables, Words.
Aceste obiecte (colectii de obiecte) sunt returnate prin proprietatile cu aceleasi denumiri ale obiectului Selection. De exemplu
Selection.Paragraphs.LeftIndent = InchesToPoints(0.5)Pentru parcurgerea tuturor obiectelor dintr-o colectie returnata se va folosi structuraFor Each…Next:
For Each aBook In Selection.BookmarksSe va utiliza proprietatea Text pentru a returna sau stabili continutul obiectului Selection:
strText = Selection.TextSe va utiliza metoda InsertBefore sau InsertAfter pentru inserarea unui text înainte sau dupa selectie (cu extinderea corespunzatoare a selectiei).
Se vor utiliza proprietatile Font si ParagraphFormat pentru accesul la proprietatile si metodele proprii caracterelor si, respectiv, paragrafelor:
With Selection.FontO
importanta deosebita o are
O alta utilizare este aceea când anumite metode sau proprietati se pot aplica doar unui obiect Range:
Selection.Range.CheckSpellingReturnarea informatiilor despre selectie, cum ar fi numarul paginii curente, numarul total de pagini, faptul ca selectia este în antet sau picior de pagina etc. Sintaxa este
expression.Information(Type)
unde
expression este o expresie care returneaza un obiect Range sau Selection.
Type este de tip Long si precizeaza tipul informatiei care se returneaza. Poate fi una dintre cele 35 de constante de tip WdInformation, dintre care mentionam (doar pentru a exemplifica tipuri de informatii obtinute):
Exemplul urmator afiseaza, daca selectia este într-un tabel, numarul de coloane si de linii ale tabelului:
If Selection.Information(wdWithInTable) = True ThenPrin proprietatea Type se poate obtine informatia privind tipul selectiei. Valoarea returnata, Long, este una dintre constantele tipului enumerat WdSelectionType:
wdNoSelection, |
wdSelectionBlock, |
wdSelectionColumn, |
wdSelectionFrame, |
wdSelectionInlineShape, |
wdSelectionIP, |
wdSelectionNormal, |
wdSelectionRow, |
wdSelectionShape |
Dintre aceste constante, wdSelectionNormal reprezinta selectia uzuala a unei portiuni de text, wdSelectionBlock reprezinta selectia sub forma de bloc dreptunghiular, wdSelectionIP este selectia redusa la punctul de insertie.
Exemplul urmator selecteaza paragraful care contine punctul de insertie, daca selectia este redusa la punctul de insertie:
If Selection.Type = wdSelectionIP ThenGasirea si înlocuirea unor domenii specificate de text dintr-un document este o operatiune frecventa în procesarea textelor. Pentru realizarea programatica, în Visual Basic, dispunem de obiectele Find (pentru gasirea textului specificat) si Replacement (pentru înlocuire).
Obiectul Find este permis fie din Selection, fie din Range. Exista mici deosebiri între cele doua moduri de acces, legate îndeosebi de transformarea obiectelor daca procesul de cautare se termina cu succes.
Obiectul Replacement este accesibil din obiectul Find si permite toate actiunile disponibile în boxa de dialog Find and Replace (meniul Edit din Word).
Schema generala pentru realizarea unei cautari urmata, sau nu, de o înlocuire este
Dintre proprietatile obiectului Find mentionam
Obiectul Find are doua metode:
Anuleaza orice formatare specificata pentru o operatiune de cautare sau înlocuire. Corespunde butonului No Formatting din dialogul Find and Replace (meniul Edit).
expression.ClearFormatting
unde
expression este o expresie care returneaza un obiect Find sau Replacement.
Executa operatiunea Find specificata. Returneaza True daca operatiunea de cautare se termina cu succes (este gasita o potrivire cu textul cautat). Unele dintre argumentele metodei acopera valori ale proprietatilor obiectului Find.
expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace)
unde
expression este o expresie care returneaza un obiect Find.
FindText este de tip Variant, optional. Reprezinta textul cautat. Pentru cautarea unui format anume se va specifica un sir vid (""). Se pot utiliza caracterele speciale, similar celor disponibile în cautarile Word uzuale.
MatchCase este de tip Variant, optional. True sau False dupa cum în cautare are importanta capitalizarea caracterelor.
MatchWholeWord este de tip Variant, optional. Este True daca în cautare se vor potrivi doar cuvinte întregi.
MatchWildcards este de tip Variant, optional. True daca textul cautat utilizeaza sabloane de cautare (wildcards).
MatchSoundsLike este de tip Variant, optional. True daca operatiunea de cautare accepta si cuvinte care "suna" la fel cu textul cautat.
MatchAllWordForms este de tip Variant, optional. True daca operatiunea de cautare accepta ca succes toate formele textului cautat.
Forward este de tip Variant, optional. True pentru o cautare înainte (spre sfârsitul documentului).
Wrap este de tip Variant, optional. Controleaza continuarea operatiunii la epuizarea domeniului cercetat. Valorile posibile sunt date la proprietatea Wrap: wdFindContinue, wdFindStop sau wdFindAsk.
Format este de tip Variant, optional. True daca în cautare este specificata o formatare (de caracter sau paragraf).
ReplaceWith este de tip Variant, optional. Textul înlocuitor. Pentru a specifica un obiect grafic sau nontext, elementul se trece în Clipboard si se specifica "^c" în ReplaceWith.
Replace este de tip Variant, optional. Specifica numarul de înlocuiri. Poate fi o
Returnarea unui obiect Find din obiectul Selection produce schimbarea selectiei la îndeplinirea criteriilor de cautare. Textul care corespunde proprietatilor cautarii devine noua selectie. Urmatorul exemplu selecteaza urmatoarea aparitie a cuvântului "Hello", cautarea oprindu-se la atingerea sfârsitului documentului:
With Selection.FindAcelasi efect se putea obtine folosind argumentele metodei Execute:
Selection.Find.Execute FindText "Hello", Forward:=True, Wrap:=wdFindStopUtilizarea
proprietatii Find a
De
remarcat ca proprietatea Content returneaza
atributele cautarii fiind definite prin argumentele metodei Execute.
Referinta la obiectul Replacement se obtine prin proprietatea Replacement a obiectului Find:
expression.Find.Replacement
Obiectul Replacement reprezinta atributele textului nou (înlocuitor) într-o operatiune de cautare cu înlocuire.
Dintre proprietatile obiectului Replacement amintim:
Obiectul Replacement are doar metoda ClearFormatting, prin care se anuleaza toate atributele de format asociate noului text. Este util sa se aplice metoda înaintea definirii unei noi formatari pentru textul înlocuitor. Sintaxa este similara metodei de la obiectul Find.
Executarea unei operatiuni de înlocuire necesita, de obicei, precizarea argumentului Replace al metodei Execute (pentru Find):
With Selection.Findexecuta o cautare a cuvântului "hi", neformatat, si înlocuirea tuturor aparitiilor cu cuvântul "hello", de asemenea neformatat. Cautarea si înlocuirea are loc în tot documentul, indiferent de unde se începe. Selectia se modifica la fiecare întâlnire a cuvântului "hi", deoarece se pleaca din obiectul Selection.
With ActiveDocument.Content.FindÎn acest exemplu se utilizeaza atât pentru cautare, cât si pentru înlocuire textul vid, ceea ce produce doar o înlocuire a formatului bold cu formatul normal. Este de remarcat, pentru înlocuirea formatelor, combinatia de valori ale argumentelor FindText, ReplaceWith, Format. Selectia nu se modifica, deoarece s-a plecat din obiectul Range (returnat de proprietatea Content).
Prelucrarea tabelelor, un subiect foarte important în procesarea textelor, este posibila programatic prin utilizarea obiectelor
Datorita complexitatii lucrului cu tabele (trasare libera, uniri de celule, divizari de celule etc.), metodele si proprietatile obiectelor amintite pot uneori sa se produca rezultate neasteptate (ca si în procesarea uzuala din Word) daca nu sunt întelese exact.
În general obiectele sunt accesate ca elemente din colectiile respective, dar exista si posibilitatea accesarii individuale.
Reprezinta multimea tuturor tabelelor dintr-o selectie, domeniu sau document. Serveste pentru returnarea unui tabel:
expression.Tables(index)
sau pentru adaugarea, programatica, a unui nou tabel la colectie utilizând metoda Add:
expression.Add(Range, NumRows, NumColumns)
unde
expression este o expresie care returneaza un obiect Tables.
Range este obiectul Range care refera domeniul unde se insereaza tabelul în document. Daca domeniul nu este redus la punctul de insertie, atunci tabelul adaugat înlocuieste tot domeniul continut.
NumRows, de tip Long, este numarul initial de linii ale tabelului.
NumColumns, de tip Long, este numarul initial de coloane ale tabelului.
Este returnat prin numarul de ordine dintr-o colectie Tables.
Proprietatile obiectului se refera la formatarea globala a tabelului sau la obiectele componente ale unui tabel. Din prima categorie fac parte:
Accesul la obiectele componente se realizeaza prin proprietatile
Metodele obiectului Table permit atât operatiuni asupra întregului tabel (autoformat, stergere, selectare, sortare, divizare etc.), cât si accesul la celulele tabelului. Mentionam:
Reprezinta colectia coloanelor unui tabel si este returnata prin proprietatea Columns a unui obiect Table.
Dintre proprietati enumeram
Metodele permit operatiuni specifice tuturor colectiilor (Count, Add) sau specifice obiectului coloane de tabel:
Reprezinta o singura coloana dintr-un tabel. Este referita ca element al colectiei Columns:
expression.Tables(index tabel).Columns(index)
Dintre proprietatile obiectului mentionam:
Metodele obiectului Column sunt
Reprezinta colectia liniilor dintr-un tabel si, respectiv, o linie a tabelului. Utilizarea acestor obiecte este similara operarii cu obiectele Columns si Column. Exista o serie de proprietati specifice, linie antet, împartirea între pagini etc, dar corespund direct atributelor din Word si au semnificatii evidente.
Reprezinta celulele dintr-o coloana, linie, selectie sau domeniu.
Pe lânga proprietatile similare celor prezentate la coloane (Borders, Shading, Width, Height etc.) este utila proprietatea
Metodele mai des întrebuintate sunt
Reprezinta o celula dintr-un tabel. Poate fi returnata prin metoda Cell dintr-un obiect Table sau ca element al colectiei Cells.
Proprietati de identificare sunt cele care returneaza, ca obiecte sau ca index, coloana si linia celulei:
Proprietati navigare în colectia Cells sunt
Proprietatile de aspect si dimensiuni sunt cele prezentate la Columns/Column.
Proprietatea care da acces la continutul celulei si permite deci adaugarea de text etc. este:
Metodele aplicabile unui obiect Cell sunt
Subiectul este foarte amplu si pentru mai multe exemple se vor studia subiectele corespunzatoare din Word Visual Basic Help.
If Selection.Tables.Count >=1 Thenconverteste în text primul tabel din selectie, daca selectia contine tabele, separând continutul celulelor de pe o linie prin caractere tab.
Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=1)stabilesc referinte la celula din prima linie si prima coloana a primului tabel din documentul activ. Ambele linii se refera la aceeasi celula.
i = 1produce numerotarea celulelor din primul tabel al documentului. Este de remarcat utilizarea proprietatii Range a obiectului Table (pentru a returna un obiect Range pentru care se returneaza colectia Cells), ca si utilizarea proprietatii Range a obiectului Cell pentru inserarea de text.
ActiveDocument.Tables(1).Columns(1).Selectselecteaza prima coloana a primului tabel.
ActiveDocument.Tables(1).Rows(1).Shading.Texture = wdTexture10Percentaplica o umbrire de 10% primei linii din tabel.
Obiecte Microsoft Word (III)
În continuare sunt prezentate doar unele aspecte, considerate mai des utilizate, ale operarii cu alte obiecte (decât cele prezentate în precedentele doua fisiere) din modelul de obiecte al aplicatiei Microsoft Word. Pentru informatii mai ample se va studia Word VB Help sau alte materiale bibliografice.
Obiectul HeaderFooter poate sa reprezinte fie un antet, fie un picior de pagina. Obiectul HeaderFooter este un membru al colectiei HeaderFooters, care este accesibila din obiectul Section. Este important de stiut ca nu se pot adauga elemente la colectia HeadersFooters. Un document Word poate sa aiba anteturi/picioare de pagina pentru prima pagina, pentru pagini pare si pentru pagini impare si toate acestea sunt reprezentate.
Se
utilizeaza proprietatile Headers(index)
sau Footers(index), ale obiectului Section, pentru a
returna un obiect individual HeaderFooter, unde index este o
Urmatorul exemplu arata cum se poate modifica prin program un picior de pagina (de pe pagina impara):
Set oRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).RangeSe observa definirea unui Range pentru a referi continutul piciorului de pagina, stergerea vechiului continut, adaugarea unui câmp cu numele fisierului (în Text se da switch-ul \p de inserare a caii fisierului), inserarea a doua caractere TAB (pentru pozitionarea în dreapta a denumirii fisierului), comprimarea domeniului la punctul de start si inserarea unui câmp cu numele autorului (din informatia adiacenta documentului).
Un obiect HeaderFooter poate fi returnat si prin proprietatea HeaderFooter a obiectului Selection, cu mentiunea ca selectia trebuie sa fie într-un antet sau picior de pagina. Aceasta conditie se realizeaza, de exemplu, prin utilizarea proprietatii View, aplicata ferestrei active, care returneaza un obiect View.
Proprietatea Type a obiectului View permite returnarea/stabilirea tipului de viziune (constante WdViewType, read/write, Long): wdMasterView, wdNormalView, wdOnlineView, wdOutlineView, wdPageView sau wdPrintPreview. În modul page layout (wdPageView), proprietatea SeekView returneaza sau stabileste care element din document este afisat (constante WdSeekView, Read/write, Long): wdSeekCurrentPageFooter, wdSeekCurrentPageHeader, wdSeekEndnotes, wdSeekEvenPagesFooter, wdSeekEvenPagesHeader, wdSeekFirstPageFooter, wdSeekFirstPageHeader, wdSeekFootnotes, wdSeekMainDocument, wdSeekPrimaryFooter sau wdSeekPrimaryHeader.
Urmatorul exemplu insereaza un numar de pagina centrat, în piciorul de pagina al paginii curente:
With ActiveWindow.ViewExemplul mai arata si modul de inserare a numerelor de pagina: prin proprietatea PageNumbers se returneaza colectia câmpurilor cu numerele de pagina incluse în respectivul antet sau picior de pagina. Proprietatea Add a colectiei adauga un nou câmp numar de pagina (în mod uzual singurul element al colectiei), referit printr-un obiect PageNumber pentru care se pot stabili o serie de atribute, dupa cum altele (reînceperea numerotarii, tipul de numerotare) se stabilesc la nivel de colectie.
În sfârsit, o serie de atribute importante pentru un document, cum ar fi tipurile de anteturi si picioare de pagina existente, se stabilesc din proprietatile obiectului PageSetup, care reprezinta comanda uzuala Page Setup (Word – meniul File).
Se utilizeaza proprietatea DifferentFirstPageHeaderFooter a obiectului PageSetup pentru a specifica o prima pagina diferita, proprietatea OddAndEvenPagesHeaderFooter pentru anteturi/picioare de pagina diferite pentru pagini pare/impare. Daca proprietatea OddAndEvenPagesHeaderFooter este True, atunci se returneaza antetul/piciorul paginii impare prin wdHeaderFooterPrimary si antetul/piciorul paginii pare prin wdHeaderFooterEvenPages.
Accesibila din obiectul Document, prin proprietatea Styles, colectia Styles reprezinta toate stilurile din documentul respectiv. Identificarea unui stil particular se efectueaza uzual prin
expression.Styles(index)
unde
expression returneaza un obiect Document
index este nume de stil (definit de utilizator), constanta WdBuiltinStyle (nume de stil predefinit, cum ar fi wdStyleHeading1) sau numar (indicele în colectie). Numele trebuie dat exact, cu spatieri daca asa a fost definit, cu exceptia capitalizarii.
Adaugarea unui nou stil definit de utilizator se realizeaza prin metoda Add, având sintaxa
expression.Add(Name, Type)
unde
expression este o expresie care returneaza un obiect Styles.
Name este String si reprezinta numele noului stil.
Type este Variant, optional si stabileste tipul stilului. Poate fi una dintre constantele WdStyleType: wdStyleTypeParagraph sau wdStyleTypeCharacter.
Reprezinta un singur stil predefinit sau definit de utilizator. Obiectul Style include atributele stilului ca proprietati, dintre care enumeram:
De exemplu, prin
Set aDoc = ActiveDocument.AttachedTemplate.OpenAsDocumentse deschide sablonul atasat documentului activ ca un document Word (singurul mod în care se pot schimba stiluri într-un template) si se modifica proprietatea Font a stilului "Heading 1", dupa care se închide template-ul.
Ansamblul meniurilor si barelor de unelte sunt reprezentate de colectia CommandBars. Dupa cum se stie din operarea Word, la personalizarea mediului trebuie sa se precizeze domeniul de valabilitate al personalizarilor: sablon, document etc. În mod analog, înainte de a modifica programatic mediul de utilizare se va apela proprietatea globala CustomizationContext pentru a preciza locul de memorare al modificarilor mediului.
Pentru salvarea modificarilor de comenzi în sablonul Normal se va utiliza
CustomizationContext = NormalTemplateiar pentru salvarea în sablonul atasat documentului
CustomizationContext = ActiveDocument.AtttachedTemplateExemplul urmator adauga comanda Double Underline la bara de unelte Formatting:
CustomizationContext = NormalTemplatePentru o discutie mai ampla se va citi capitolul dedicat meniurilor si barelor de unelte.
Dialogurile mediului Word (cum ar fi Open, Save As etc.) sunt activate în Visual Basic prin apelul colectiei Dialogs. La aceasta colectie nu se pot adauga alte elemente. Exista totusi posibilitatea, discutata într-un capitol separat, de a proiecta dialoguri utilizator.
Pentru accesarea unui dialog, se utilizeaza Dialogs(index), unde index este o constanta de tip WdWordDialog, care identifica boxa de dialog necesara. Se returneaza astfel un obiect Dialog care poate fi exploatat prin proprietatile si metodele sale. Exemplul urmator afiseaza dialogul Open:
dlgAnswer = Dialogs(wdDialogFileOpen).ShowDenumirile sunt construite, în general, prin "wdDialog" & "nume meniu" & "nume comanda", de exemplu wdDialog & File & PageSetup => wdDialogFilePageSetup. O parcurgere a elementelor tipului enumerat WdWordDialog, prin intermediul Object Browser-ului, este edificatoare.
Pentru informatii mai ample se vor studia articolele din Word Visual Basic Help – "Displaying built-in Word dialog boxes", "Built-in dialog box argument lists".
Dintre proprietatile si metodele unui obiect Dialog mentionam:
Se pot adauga câmpuri la un document prin aplicarea metodei Add colectiei Fields.
expression.Add(Range, Type, Text, PreserveFormatting)
unde
expression este o expresie care returneaza un obiect Fields.
Range este o expresie care returneaza un Range. Este domeniul unde se adauga câmpul. Daca domeniul nu este redus la punctul de insertie, câmpul înlocuieste domeniul.
Type este de tip Variant, optional. Stabileste câmpul care se insereaza. Poate fi o constanta de tip WdFieldType (vezi Help).
Text este de tip Variant, optional. Text aditional necesar specificarii câmpului (de exemplu informatii de gen switch).
PreserveFormatting este de tip Variant, optional. Are valoarea True pentru a pastra formatarea câmpului si la actualizari.
Dintre proprietatile obiectului Field, membru al colectiei Fields, mentionam
Dintre metode amintim
Exemplul urmator schimba codul primului câmp din selectie, actualizeaza câmpul si afiseaza rezultatul:
If Selection.Fields.Count >=1 ThenObservatie. Pentru alte obiecte, cum ar fi Shapes, care reprezinta obiectele dintr-un strat de desen (drawing layer), se vor vedea capitolele dedicate obiectelor comune tuturor aplicatiilor Office.
În aceasta sectiune se discuta câteva tehnici pentru verificarea validitatii unei valori returnate de o expresie sau care este memorata într-o variabila. Aceste verificari pot elimina erori în executia codului proiectat.
Se poate utiliza functia TypeName pentru a determina un tip de obiect. Sintaxa este
TypeName varname)
unde varname este un Variant care contine orice variabila cu exceptia variabilelor de un tip definit de utilizator.
În exemplul urmator se afiseaza un mesaj în bara de stare a aplicatiei în cazul cand Selection.NextField returneaza un obiect Field (informatie utila în prelucrarea formularelor):
If TypeName(Selection.NextField) = "Field" Then StatusBar = "Mai exista un câmp"O forma echivalenta este
Set myField = Selection.NextFieldÎn cazul când nu s-ar fi returnat un obiect, valoarea functiei era Nothing:
If Not (myField Is Nothing) Then myField.UpdateEste disponibila proprietatea globala IsObjectValid prin care se determina daca obiectul referit de o variabila este un obiect valid. Aceasta proprietate returneaza False daca obiectul referit a fost sters (nu exista). Utilizarea este
expression.IsObjectValid(Object)
unde
expression este o expresie care returneaza un obiect Application, optionala.
Object este de tip Object, o variabila care se refera la un obiect.
Exemplul urmator efectueaza o trecere prin toate paragrafele, le numara si compara cu proprietatea Count (o verificare de dragul exemplificarii):
Dim i As IntegerMajoritatea comenzilor Word pot fi modificate prin transformarea lor în macro-uri.
Pentru afisarea listei cu toate comenzile Word disponibile, se urmeaza secventa de comenzi, initiata din Word:
Se poate înlocui o comanda Word printr-un macro, daca se scrie o procedura macro (reamintim ca o procedura fara argumente este recunoscuta ca un macro) cu acelasi nume ca si comanda. Daca se creeaza o procedura cu numele FileSave, aceasta este executata de catre Word atunci când se da comanda Save (meniul File), sau se click-eaza butonul Save (de pe bara Standard) sau se tasteaza combinatia directa asociata cu FileSave.
Pentru scrierea unei proceduri de acest gen se poate urma
Editorul Visual Basic deschide un modul care contine un sablon al noii proceduri, cum ar fi
Sub FileSaveHtml()în care se pot completa/sterge orice instructiuni.
Pentru a reveni la comanda Word initiala este suficient sa se elimine sau sa se redenumeasca procedura cu numele comenzii.
Se poate înlocui, de asemenea, o comanda Word daca se creeaza un modul de cod având acelasi nume cu comanda (de exemplu FileSave) si care contine o procedura denumita "Main".
Un eveniment este o actiune recunoscuta de un obiect si pentru care se poate scrie cod care sa se execute, ca raspuns la producerea evenimentului. Evenimentele pot sa se produca atât ca rezultat al actiunii utilizatorului sau prin program, cât si prin declansarea de catre sistem.
În Microsoft Word sunt recunoscute mai multe categorii de evenimente: asociate unui document, asociate aplicatiei si asociate controalelor ActiveX.
Trei evenimente sunt recunoscute de obiectul Document: Close, New si Open.
Procedurile de raspuns la aceste evenimente se scriu în modulul clasa intitulat "ThisDocument". Pentru a crea o procedura se urmeaza etapele:
Urmatorul exemplu maximizeaza fereastra aplicatiei Word atunci când documentul este deschis:
Private Sub Document_Open()Domeniul de valabilitate (vizibilitate) a unei proceduri eveniment depinde de locul memorarii (de revazut completarile date la enumerarea evenimentelor).
Procedurile eveniment din template-ul Normal nu au un domeniu global. Ele se vor executa doar daca sablonul Normal este si sablonul atasat documnetului.
Procedurile care exista si în document si în template-ul atasat se vor executa amândoua.
Evenimentele aplicatiei apar atunci când utilizatorul paraseste aplicatia sau atunci când focalizarea este mutata pe alt document. Totusi, diferit fata de obiectul Document sau de controalele ActiveX, obiectul Application nu recunoaste evenimentele în mod implicit (nu raspunde în mod standard la producerea lor). Din acest motiv, înainte de a utiliza evenimentele obiectului Application, se va crea un modul clasa nou si se declara un obiect de tip Application cu evenimente. Se utilizeaza, în acest scop, comanda Class Module din meniul Insert al mediului VBE.
Observatie. Denumirile utilizate în continuarea acestei sectiuni nu sunt standard, cu exceptiile evidente.
Pentru a permite evenimentele obiectului Application, se va adauga modulului clasa definit o declaratie de tipul
Public WithEvents App As ApplicationDupa ce noul obiect a fost declarat cu evenimente, el apare în lista Object a modulului clasa si se pot scrie procedurile eveniment pentru noul obiect (selectabile din lista Procedure).
Înainte ca procedurile sa se execute, trebuie sa se conecteze obiectul declarat în modulul clasa cu obiectul Application. Acest lucru se poate efectua din orice modul utilizând, de exemplu, declaratia
Public apl As New EventClassunde EventClass este numele modulului clasa creat.
Dupa crearea variabilei obiect apl (o instanta a clasei EventClass), se poate stabili egalitatea între obiectul App al clasei EventClass si obiectul Application Word prin
Sub InitializeApp()Dupa executarea procedurii InitializeApp, obiectul App din clasa EventClass puncteaza catre obiectul Application Word si procedurile evenimentelor din clasa se vor executa la aparitia evenimentelor corespunzatoare.
Exista doua evenimente recunoscute de obiectul Application (dupa permiterea lor, ca mai sus):
Urmatorul exemplu asigura ca barele de unelte Standard si Formatting sunt vizibile înainte de parasirea aplicatiei (încât urmatoarea activare a aplicatiei le afiseaza):
Private Sub App_Quit ()Un document Word poate sa includa controale ActiveX cum ar fi boxe de control, liste ascunse, butoane de comanda. Pentru a scufunda un asemenea obiect într-un document, cel mai simplu este sa se vizualizeze cutia de unelte pentru controale prin
sau
Din cutia de controale se apasa categoria de controale dorita si la punctul de insertie se insereaza o instanta a obiectului. Dublu click pe obiectul inserat da acces la rutinele de procesare a evenimentelor asociate controlului. Pentru a vedea executia procedurilor se va actiona unealta Exit Design Mode din Control Toolbox.
Word implementeaza, pentru controalele ActiveX dintr-un document, evenimentele
Fiecare control ActiveX recunoaste, totusi, evenimente aditionale, explicate la obiectele respective. În acest curs mai multe explicatii si exemple sunt date în capitolul "Controale ActiveX si dialoguri".
Anumite proceduri macro, identificate prin denumirile speciale recunoscute ca atare de aplicatie, sunt executate în mod automat la efectuarea unei operatii specifice. Word recunoaste urmatoarele denumiri drept macro-uri automate:
AutoExec care se executa la pornirea aplicatiei Word sau se încarca un template global.
AutoNew care se executa la fiecare creare a unui document nou.
AutoOpen care se executa la deschiderea unui document existent.
AutoClose care se executa la închiderea unui document.
AutoExit care se executa la închiderea aplicatiei Word sau la descarcarea unui sablon global.
Macrourile automate sunt recunoscute daca
Macrourile automate pot fi memorate oriunde, template-ul Normal, alt sablon sau în document, cu exceptia procedurii AutoExec care nu se executa daca nu este memorata în Normal template sau un template global memorat în folderul Startup.
În cazuri de conflict de denumiri, se executa macro-ul automat memorat în contextul cel mai apropiat, adica în ordinea: document…attached template…Normal template.
Observatie. Apasarea tastei Shift simultan cu comanda previne executarea unui macro automat. De exemplu, la crearea unui nou document pe baza unui template care are o procedura AutoNew, apasarea tastei Shift în momentul actionarii butonului OK din dialogul New, previne executarea macr-ului (tasta trebuie pastrata apasata pâna când se afiseaza noul document).
Într-o procedura care poate declansa un macro automat, prevenirea executiei se ia prin instructiunea
WordBasic.DisableAutoMacrosPentru a putea schimba date cu alte aplicatii, cum ar fi Excel, Access etc., se utilizeaza tehnica de automatizare a aplicatiilor (cunoscuta anterior drept OLE Automation). Automatizarea permite returnarea, editarea si exportul datelor prin referirea obiectelor, proprietatilor, metodelor altor aplicatii. Obiectele aplicatii referite în alta aplicatie sunt denumite obiecte de automatizare.
A. Primul pas pentru a face aplicatia Word disponibila în alta aplicatie, pentru automatizare (deci pentru manevrarea programatica sau nu a obiectelor Word), este crearea unei referinte la biblioteca de tipuri Word (Word type library):
B. Se declara o variabila obiect care va referi un obiect Application Word, dupa exemplul
Dim appWD As Word.Application.8C. Se apeleaza functia CreateObject (pentru crearea unui obiect de automatizare) sau GetObject (pentru regasirea unui obiect de automatizare existent) cu Word OLE Programmatic Identifier (Word.Application.8 sau Word.Document.8), ca în exemplul urmator. Pentru a vedea sesiunea Word se utilizeaza proprietatea Visible:
Dim appWD As Word.Application.8Functia CreateObject returneaza un obiect Application Word si-l asigneaza variabilei appWD. Utilizând obiectele, proprietatile si metodele obiectului Application Word se poate controla aplicatia Word prin intermediul variabilei appWD. De exemplu, crearea unui nou document
appWD.Documents.AddD. Functia CreateObject porneste o sesiune Word pe care automatizarea nu o închide atunci când expira variabila obiect care se refera la obiectul Application Word. Nici stabilirea referintei obiectului la Nothing nu produce închiderea aplicatiei Word. Pentru aceasta se va utiliza metoda Quit a aplicatiei Word.
Urmatorul exemplu, din Microsoft Excel, insereaza datele din celulele A1:B10 din Sheet1 într-un document Word nou si, în acest document, le aranjeaza într-un tabel. Comentariile incluse explica etapele prelucrarii.
Pentru a controla alte aplicatii dintr-un document Word, se va proceda în mod analog automatizarii aplicatiei Word din alte aplicatii (vezi sectiunea precedenta).
Cele doua exemple, unul referitor la Excel, celalalt la PowerPoint, devin mai explicite dupa revederea exemplului anterior.
Textul selectat în documentul Word activ este trimis catre o foaie de calcul Excel, în celula A1:
Dim xlObj As Excel.Application.8Exemplul urmator creeaza o nuoa prezentare PowerPoint, completeaza prima boxa text cu numele documentului Word activ si a doua boxa text cu primul paragraf al documentului. La terminare se elibereaza variabila obiect aplicatie.
Dim pptObj As PowerPoint.Application.8Se poate utiliza proprietatea Application a oricarui obiect Word pentru a returna obiectul Word Application. Acest lucru este util pentru returnarea obiectului Word Application dintr-un document Word scufundat în alta aplicatie.
Urmatorul exemplu, executat din Excel, necesita ca Shapes(1) din foaia activa sa fie un document Word scufundat (obtinut prin Insert…Object…). Prin exemplu se modifica documentul Word.
Dim appWD As Word.ApplicationÎn mod similar, exemplul urmator, executat din PowerPoint, necesita ca Shapes(1) din primul slide sa fie un document Word embedded:
Dim appWD As Word.Application
|