Utilizarea Find and Replace în VBA

Instrumentul Găsire și înlocuire din Word poate fi util în unele macrocomenzi. Aveți posibilitatea să îl utilizați, de exemplu, pentru a ajusta rapid mai multe stiluri într-un întreg document. Sau, ați putea automatiza procesul de finalizare a documentelor (verificarea ortografică, revizuirea informațiilor corporative, în căutarea de referințe vechi, sau orice rutină care trebuie să fie făcută înainte de publicare).

Pentru a accesa caracteristicile Găsire și înlocuire Word prin VBA, utilizați obiectele Find și Replacement. Această secțiune ilustrează modul de lucru cu metoda Execute a obiectului Find, de obicei cea mai bună metodă de utilizat atunci când lucrați cu Find. De obicei, veți specifica parametrii pentru operațiunea Find ca argumente în comanda Execute, dar îi puteți specifica în prealabil utilizând proprietățile dacă preferați această abordare.

Tabelul următor descrie proprietățile Find care sunt utile pentru majoritatea operațiilor.

Utilizați obiectul Replacement pentru a specifica criteriile de înlocuire într-o operație de înlocuire. Obiectul Replacement are următoarele proprietăți, care corespund proprietăților obiectului Find (dar în schimb se referă la operațiunea de înlocuire): Font, Highlight, ParagraphFormat, Style și Text.

Înțelegerea sintaxei metodei Execute

Sintaxa pentru metoda Execute este următoarea:

expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format,
ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl, MatchPrefix, MatchSuffix, MatchPhrase, IgnoreSpace, IgnorePunct)

Ultimele cinci argumente, începând cu MatchPrefix, nu sunt afișate în instrumentul Auto List Members din Editor, nici în lista de parametri MSDN. Cu toate acestea, ele pot fi utilizate în cod, ca de exemplu, IgnoreSpace:=True.

Argumentele cel mai frecvent utilizate pentru această metodă sunt explicate aici:

  • expression este o expresie necesară care returnează un obiect Find. De obicei, este mai ușor să utilizați direct obiectul Find.
  • FindText este un argument opțional de tip Variant care specifică textul pe care îl căutați. Deși acest argument este opțional, veți dori aproape întotdeauna să îl specificați, chiar dacă specificați doar un șir gol ("") pentru a vă permite să căutați formatarea, nu textul. (Dacă nu specificați "" pentru FindText, va fi căutat din greșeală textul anterior căutat, și stilul pe care doriți să localizați nu va fi găsit cu excepția cazului în care textul este, de asemenea, prezent.)

Aveți posibilitatea să căutați caractere speciale utilizând aceleași caractere speciale pe care le utilizați atunci când utilizați interactiv caseta de dialog FInd din Word (de exemplu, ^p pentru un marcaj de paragraf sau ^t pentru caracterul tab) și metacaractere utilizând metacaracterele Windows tradiționale. Pentru ca metacaracterele să funcționeze într-o macrocomandă, trebuie să setați MatchWildcards la True. Aveți posibilitatea să căutați un simbol introducând caracterul ^ și un zero, urmat de codul său de caracter. De exemplu, caracterul pentru ghilimele de închidere duble (”), specificați ^0148, deoarece codul său de caracter este 148.

  • MatchCase este un argument opțional de tip Variant pe care îl puteți seta la True pentru a face căutarea sensibilă la litere mari și mici.
  • MatchWholeWord este un argument opțional de tip Variant pe care îl puteți seta la True pentru a restricționa căutarea la găsirea cuvintelor întregi, în loc de cuvinte conținute în alte cuvinte.
  • MatchWildcards este un argument opțional de tip Variant pe care îl puteți seta la True pentru a utiliza metacaractere în căutare.
  • MatchSoundsLike este un argument opțional de tip Variant pe care îl puteți seta la True pentru ca Word să găsească cuvinte care crede că sună asemănător cu elementul Find specificat.
  • MatchAllWordForms este un argument opțional de tip Variant pe care îl puteți seta la True pentru ca Word să găsească toate formele elementului specificat în Find (de exemplu, diferite forme ale aceluiași verb sau substantiv).
  • Forward este un argument opțional de tip Variant pe care îl puteți seta la True pentru a face căutarea în Word înainte (de la începutul documentului spre sfârșit) sau False pentru ca Word să caute înapoi.
  • Wrap este un argument opțional de tip Variant care stabilește dacă o căutare care începe oriunde, alta decât începutul unui document (pentru o căutare înainte) sau sfârșitul unui document (pentru o căutare în spatele episcopiei), sau care are loc într-un interval, wraps (continuă) atunci când ajunge la sfârșitul sau începutul documentului. Word oferă diferite opțiuni pentru Wrap, după este detaliat în tabelul următor.
  • Format este un argument opțional de tip Variant pe care îl puteți seta la True pentru ca operațiunea de căutare să găsească formatarea, precum și (sau în loc de) orice text specificat cu Find.
  • ReplaceWith este un argument opțional de tip Variant care specifică textul înlocuitor. Puteți utiliza un șir gol pentru ReplaceWith pentru a elimina pur și simplu textul din FindText; de asemenea, puteți utiliza caractere speciale pentru ReplaceWith, la fel ca și la argumentul FindText. Pentru a utiliza un obiect grafic, copiați-l în Clipboard, apoi specificați ^c (care înseamnă conținutul din Clipboard).

Cum se pot folosi obiectele grafice în câmpul ReplaceWith

Pentru a utiliza un obiect grafic așa cum este descris mai sus, obiectul trebuie să se afle în stratul de text (nu plutind peste text). Dacă graficul plutește peste text, ^c înlocuiește cu conținutul anterior al textului din Clipboard.

  • Replace este un argument opțional de tip Variant care controlează numărul de înlocuiri pe care le face: una (wdReplaceOne), toate (wdReplaceAll) sau niciuna (wdReplaceNone).
  • MatchPrefix este un argument opțional de tip Variant care vă permite să căutați un șir de caractere care se află la începutul cuvintelor, dar nu și dacă șirul specificat are ca prefix alt caracter (alte caractere). Iată cum funcționează: dacă lăsați MatchPrefix și MatchWholeWord setate la False și căutați cuvântul real, veți obține rezultate cu orice cuvânt care conține acest șir, cum ar fi real, suprareal, realitate, boreal, și altele. Va fi găsit orice cuvânt care conține șirul real. Dar dacă setați MatchWholeWord la True, va fi găsit doar cuvântul real. Dacă lăsați opțiunea MatchWholeWord setată la False dar setați MatchPrefix la True, vor fi găsite cuvintele care încep cu real, cum ar fi real și realitate. Cuvinte ca suprareal nu vor fi găsite deoarece ele nu încep cu șirul specificat.
  • MatchSuffix este un argument opțional de tip Variant care funcționează la fel ca MatchPrefix, cu excepția faptului că MatchSuffix permite căutarea unui șir de caractere de la sfârșitul unui cuvânt dar nu și alte caractere care urmează după ele. Folosind exemplul anterior, cu MatchSuffix seta la True, pot fi găsite cuvinte ca suprareal și boreal dar nu și realitate.
  • MatchPhrase este un argument opțional de tip Variant care atunci când este setat la True ignoră orice caractere de control (cum ar fi caractere pentru paragraf sau pentru tab) sau spații goale (unul sau mai multe caractere pentru spațiu) dintre cuvinte.
Această
frază
devine echivalentă cu 
această frază.
  • IgnoreSpace este un argument opțional de tip Variant care ignoră orice spațiu alb între cuvinte, dar care nu ignoră caracterele de control.
  • IgnorePunct este un argument opțional de tip Variant care ignoră toate caracterele de punctuație între cuvintele dintr-o expresie de căutare.

Căutare practică: Nu uitați să ștergeți formatarea

Un comportament în Word care poate încurca chiar și pe utilizatorii și dezvoltatorii cu experiență este că setările din caseta de dialog Find persistă. De exemplu, să spunem că căutați un stil, cum ar fi Heading1. Totul merge bine, găsiți titlurile și închideți caseta de dialog Find And Replace (sau, dacă căutați folosind codul VBA, macrocomanda termină executarea).

Apoi, oarecum mai târziu, executați o altă macrocomandă care folosește caseta de dialog Find And Replace sau utilizați caseta pentru a căuta un cuvânt, cum ar fi program, despre care știți că apare de mai multe ori în document, dar utilitarul Find afișează un mesaj care afirmă că "Elementul de căutare nu a fost găsit" (“The search item was not found.”). Ce nu e bine?

Căutarea inițială pentru acel stil titlu persistă într-o sesiune din Word. Chiar și trecerea la un alt document în timpul sesiunii curente nu va șterge criteriile de căutare, inclusiv orice stil, font sau alte criterii speciale de căutare, ar fi MatchCase, care ar fi putut fi utilizate anterior.

Cu alte cuvinte, acum căutați cuvântul program, dar și stilul Heading1. Deci, nici unul dintre instanțele cuvântului program scrise ca text normal nu va fi afișat, deoarece acestea nu sunt scrise în stilul specificat.

Dacă căutați un stil, dar nu ați făcut clic pe butonul No Formatting din caseta de dialog Find and Replace atunci când ați terminat, acea căutare de stil rămâne activă.

De asemenea, atunci când utilizați obiectul Find și obiectul Replacement într-o macrocomandă, va trebui adesea să utilizați metoda ClearFormatting, care elimină orice formatare specificată în câmpurile Find What și Replace With. Utilizarea metodei ClearFormatting are același efect ca și clic pe butonul No Formatting cu focalizarea pe caseta Find What sau pe Replace With. Următoarele afirmații (aici utilizate într-o structură With) șterg formatarea din obiectele Find și, respectiv Replacement:

With ActiveDocument.Content.Find
  .ClearFormatting 
  .Replacement.ClearFormatting 
End With

Este o idee bună să vă obișnuiți să folosiți metoda ClearFormatting la începutul oricărei macrocomenzi care caută orice. Uneori nu e necesar? Sigur. Dar ștergerea setărilor anterioare de căutare este o asigurare bună împotriva acestui bug comun și încurcat.

O situație similară apare atunci când utilizați metoda Execute, așa este descrisă mai devreme. Rețineți că atunci când utilizați Execute, trebuie să specificați aproape întotdeauna argumentul FindText , chiar dacă specificați doar un șir gol ("") pentru a vă permite să căutați formatarea. Dacă nu specificați FindText, riscați să căutați din greșeală șirul căutat anterior.

Să punem Find and Replace la lucru

Cel mai simplu mod de a utiliza Find and Replace este să specificați numai parametrii de care aveți nevoie într-o instrucțiune Execute, eliminând orice parametri opționali care sunt irelevanți pentru căutare. Pentru liste lungi de argumente, este întotdeauna mai bine să utilizați abordarea de numire a argumentului, astfel:

  FindText:="National Velvet"

Acest exemplu înlocuiește toate perechile de marcaje de paragraf (eliminând astfel liniile goale) din documentul activ cu marcaje de paragraf unic; puteți căuta caracterele ^p^p și să le înlocuiți cu ^p, ca în comanda următoare:

ActiveDocument.Content.Find.Execute FindText:="^p^p",
 ReplaceWith:="^p", _
Replace:=wdReplaceAll

Executând această comandă într-o buclă, aveți posibilitatea să înlocuiți toate marcajele de paragraf suplimentare din document. Aici va trebui să utilizați o buclă, deoarece constanta wdReplaceAll specifică faptul că activitatea de găsire și înlocuire ar trebui să treacă doar o dată prin întregul document.

Aici este necesară bucla, deoarece este posibil să aveți mai multe marcaje de paragraf în clustere, cum ar fi patru la rând: ^p^p^p^p. Prima trecere prin document ar înlocui cele patru cu două (^p^p), astfel încât va trebui să parcurgă din nou documentul pentru a reduce caracterele ^p la câte una. Cu alte cuvinte, în acest caz, trebuie să repetați de mai multe ori căutarea și înlocuirea.

Puteți folosi și o comandă With pentru a specifica proprietățile pentru operațiunea Find and Replace. În exemplul de cod de mai jos, documentul Example.docm este deschis, iar codul înlocuiește scrisul formatat îngroșat (bold) cu scris înclinat (italic).

LISTING 21.1: Folosirea With pentru a specifica proprietățile

1. With Documents("Example.docm").Content.Find
2.   .ClearFormatting
3.   .Font.Bold = True
4.   With .Replacement
5.     .ClearFormatting
6.     .Font.Bold = False
7.     .Font.Italic = True
8.   End With
9.   .Execute FindText:= "", ReplaceWith:= "" _
        Format:=True, Replace:=wdReplaceAll
10. End With
  • Aici, linia 1 identifică obiectul Document (Example.docm din colecția Documents) cu care va lucra și începe o comandă With cu obiectul Find.
  • Linia 2 folosește metoda ClearFormatting pentru a șterge orice formatare din obiectul Find.
  • Linia 3 setează proprietatea Bold pentru obiectul Font la True.
  • Liniile de la 4 până la 8 conțin o comandă With imbricată pentru obiectul Replacement.
  • Linia 5 folosește metoda ClearFormatting pentru a șterge formatarea din obiectul Replacement,
  • Linia 6 setează proprietatea Bold la False.
  • Linia 7 setează proprietatea Italic la True.
  • Linia 9 folosește metoda Execute pentru a executa operația de înlocuire. Aici ambele comenzi FindText și ReplaceWith sunt specificate ca șiruri goale, pentru ca Word să înlocuiască doar formatarea; Format este setat la True pentru a activa setul de formatare din obiectele Find și Replacement, iar Replace este setat la wdReplaceAll pentru a înlocui toate instanțele care sunt formatate îngroșat cu formatarea înclinat - italic.
  • Linia 10 încheie comanda With exterioară.