Crearea unei proceduri pentru Word

Macrocomanda care va fi creată pentru Word determină funcția Track Changes să comute la modul în care va fi afișat textul șters (indiferent dacă este șters sau ascuns). Cu alte cuvinte, folosind această macrocomandă, veți putea trece instantaneu între a păstra sau a șterge textul șters de pe ecran (tăiat cu o linie).

Se începe cu folosirea Macro Recorder pentru a obține proprietățile și setările obiectului. Apoi, se poate modifica manual codul în Editor pentru a crea comportamentul de comutare.

La înregistrarea macrocomenzii se urmează etapele:

1. Se pornește Word. Dacă Word deja rulează, se închide și se redeschide.

2. Se înregistrează o macrocomandă pentru a obține calificările obiectului (proprietăți și setări) de care este nevoie. (Pentru unii, înregistrarea poate părea neclară, dar Macro Recorder este cu adevărat un dar când vine vorba de găsirea obiectelor și de obținerea codificării corecte a sintaxelor complicate.) Urmați acești pași:

a. Clic pe eticheta Developer de pe Ribbon; apoi clic pe butonul Record Macro din secțiunea Code pentru a afișa fereastra de dialog Record Macro.

b. Se poate accepta numele macrocomenzii dat automat de Macro Recorder (Macro1, Macro2 etc.), se poate scrie un nume sugestiv, sau se poate scrie, de exemplu, Temp, pentru a reține că această macrocomandă este temporară și poate fi ștearsă ulterior.

c. În lista Store Macro In se alege All Documents (Normal.dotm). Nu se scrie nimic în descriere. Aceasta este o macrocomandă temporară pentru a înțelege modul de lucru, deci nu va fi adăugată la colecția cu macrocomenzi.

d. Clic pe butonul OK pentru a porni înregistrarea macrocomenzii.

e. Clic pe eticheta Review de pe Ribbon, apoi click pe săgeata mică din partea dreaptă jos a secțiunii Tracking. Se deschide caseta de dialog Track Changes Options. În această casetă, clic pe butonul Advanced Options. (Caseta de dialog Advanced Track Changes Options arată diferit în Office 2010 și versiunile ulterioare. Se deschide prima casetă de dialog făcând clic pe jumătatea inferioară a pictogramei Track Changes.) La Deletions (ștergeri) în lista derulantă trebuie să fie selectată opțiunea Strikethrough, apoi se face de două ori clic pe OK pentru a închide cele două casete de dialog cu opțiuni de urmărire a modificărilor. (Opțiunea Strikethrough este implicită, deci probabil este deja selectată, dar dorim ca Macro Recorder să arate cum este scrisă această opțiune în codul VBA.) Apăsând OK pentru a închide o casetă de dialog, se înregistrează toate setările curente din acea casetă.)

f. Se repetă pasul dinainte pentru a redeschide caseta de dialog Track Changes Options. Acum se selectează Hidden din lista Deletions și iar clic pe OK de două ori pentru a închide casetele de dialog.

g. Se oprește înregistrarea macrocomenzii cu click pe butonul alb de înregistrare din bara de stare sau cu clic pe butonul Stop Recording de pe eticheta Developer aflată pe Ribbon.

3. Se apasă Alt+F8 pentru a afișa caseta de dialog Macros. Se selectează macrocomanda Temp recent înregistrată și clic pe butonul Edit pentru a o deschide în Visual Basic Editor. Codul ar trebui să arate astfel:

1. Sub temp()
2. '
3. ' temp Macro
4. '
5. '
6. With Options
7.    .InsertedTextMark = wdInsertedTextMarkUnderline
8.    .InsertedTextColor = wdRed
9.    .DeletedTextMark = wdDeletedTextMarkStrikeThrough
10.   .DeletedTextColor = wdRed
11.   .RevisedPropertiesMark = wdRevisedPropertiesMarkNone
12.   .RevisedPropertiesColor = wdByAuthor
13.   .RevisedLinesMark = wdRevisedLinesMarkOutsideBorder
14.   .CommentsColor = wdRed
15. .RevisionsBalloonPrintOrientation = _ 
       wdBalloonPrintOrientationPreserve
16. End With
17. ActiveWindow.View.RevisionsMode = wdMixedRevisions
18. With Options
19.   .MoveFromTextMark = wdMoveFromTextMarkDoubleStrikeThrough
20.   .MoveFromTextColor = wdGreen
21.   .MoveToTextMark = wdMoveToTextMarkDoubleUnderline
22.   .MoveToTextColor = wdGreen
23.   .InsertedCellColor = wdCellColorLightBlue
24.   .MergedCellColor = wdCellColorLightYellow
25.   .DeletedCellColor = wdCellColorPink
26.   .SplitCellColor = wdCellColorLightOrange
27. End With
28. With ActiveDocument
29.   .TrackMoves = False
30.   .TrackFormatting = True
31.End With
32.With Options
33.   .InsertedTextMark = wdInsertedTextMarkUnderline
34.   .InsertedTextColor = wdRed
35.   .DeletedTextMark = wdDeletedTextMarkHidden
36.   .DeletedTextColor = wdRed
37.   .RevisedPropertiesMark = wdRevisedPropertiesMarkNone
38.   .RevisedPropertiesColor = wdByAuthor
39.   .RevisedLinesMark = wdRevisedLinesMarkOutsideBorder
40.   .CommentsColor = wdRed
41.   .RevisionsBalloonPrintOrientation = _ 
        wdBalloonPrintOrientationPreserve
42. End With
43. ActiveWindow.View.RevisionsMode = wdMixedRevisions
44. With Options
45.   .MoveFromTextMark = wdMoveFromTextMarkDoubleStrikeThrough
46.   .MoveFromTextColor = wdGreen
47.   .MoveToTextMark = wdMoveToTextMarkDoubleUnderline
48.   .MoveToTextColor     =   wdGreen
49.   .InsertedCellColor      = wdCellColorLightBlue
50.   .MergedCellColor     =   wdCellColorLightYellow
51.   .DeletedCellColor = wdCellColorPink
52.   .SplitCellColor = wdCellColorLightOrange
53. End With
54. With ActiveDocument
55.   .TrackMoves = False
56.   .TrackFormatting     =   True
57. End With
    58. End Sub 

4. Se poate vedea că este foarte mult cod pentru doar câteva acțiuni destul de simple care au fost realizate. Acest lucru se datorează faptului că Macro Recorder înregistrează setările pentru toate opțiunile posibile din caseta de dialog Track Changes care a fost accesată, nu doar pentru opțiunea unică care a fost selectată și modificată. În cod se pot vedea setările care au fost înregistrate din opțiunile casetei de dialog afișate.

În figura de mai sus se poate vedea modul în care codul reflectă acele setări. De exemplu, linia din cod

.SplitCellColor = wdCellColorLightOrange

poate fi regăsită ca setare în caseta de dialog.

5. Un al doilea set de setări aproape identice din cod reprezintă a doua deschidere a casetei de dialog, în liniile de la 9 până 35. Linia 35 reflectă modificarea făcută la cea de-a doua deschidere - specificând o proprietate ascunsă, pentru proprietatea DeletedTextMark a obiectului Options. Se pot observa și cele două valori pentru această proprietate: wdDeletedTextMarkStrikeThrough (când în meniul derulant Deletions s-a ales Strikethrough) și wdDeletedTextMarkHidden (când a fost setat la Hidden).

6. În Editor, se selectează întreaga macrocomandă, de la instrucțiunea Sub temp până la instrucțiunea End Sub și se apasă tasta Delete.

7. Se verifică dacă Visual Basic Editor este setat ca în secțiunea "Setare Visual Basic Editor pentru crearea de macrocomenzi", de mai sus.

8. În fereastra Project Explorer, clic dreapta oriunde în elementul Normal și din meniul contextual se alege Insert > Module. Visual Basic Editor adaugă un modul nou în șablonul global Normal.dotm și afișează fereastra Code pentru acest modul.

9. Se apasă tasta F4 pentru a activa fereastra Properties a noului modul. (Prin activare se înțelege comutare la fereastra în care se pot introduce date.) Visual Basic Editor selectează proprietatea (Name), singura proprietate valabilă pentru acest modul.

10. Se tastează un nume pentru noul modul în fereastra Properties. De exemplu, se șterge numele implicit (Module 1 sau Module 2 etc) și se tastează numele Procedura_de_Pastrat_1.

11. Se apasă tasta F7 sau clic în fereastra Code pentru a o activa.

12. În fereastra Code, se verifică dacă Visual Basic Editor a introdus instrucțiunea Option Explicit în zona cu declarații din partea de sus a foii (zona code).

Dacă nu, alegeți Tools > Options pentru a afișa caseta de dialog Options, asigurați-vă că este bifată caseta de validare Require Variable Declaration din pagina Editor și apoi faceți clic pe butonul OK (acest pas a fost descris mai sus).

13. Sub instrucțiunea Option Explicit, se tastează instrucțiunea Sub pentru acea procedură și se apasă tasta Enter. Se redenumește procedura cu

Comutare_Urmarire_Modificari_intre_Ascuns_si_TaiatCuLinie:

Sub Comutare_Urmarire_Modificari_intre_Ascuns_si_TaiatCuLinie

14. La apăsarea tastei Enter, Visual Basic Editor inserează parantezele necesare la finalul instrucțiunii Sub, o linie goală, o linie cu instrucțiunea End Sub și plasează cursorul pe linia goală pentru a începe scrierea de cod:

Sub Sub Comutare_Urmarire_Modificari_intre_Ascuns_si_TaiatCuLinie
 
End Sub

15. Se apasă tasta Tab pentru a deplasa linia goală la dreapta Sub statement.

16. Se tastează if options. (cu litere mici, iar la final se pune punct). Editor va afișa lista Properties/Methods.

17. Se tastează caracterele del și se folosește tasta ↓ sau se derulează cu mausul, pentru a selecta din listă elementul DeletedTextMark.

18. Apoi se tastează = (semnul egal). Visual Basic Editor adaugă comanda DeletedTextMark, urmată de semnul egal, apoi se afișează lista cu constante din Properties/ Methods care se folosesc cu proprietatea DeletedTextMark.

19. Se selectează din listă elementul wdDeletedTextMarkHidden și se introduce în cod apăsând tasta Tab sau cu dublu clic pe element.

20. Se tastează Then apoi se apasă tasta Enter. De reținut că după apăsarea tastei Enter pentru a trece la o linie nouă, Visual Basic Editor verifică dacă sunt erori pe linie. Dacă s-au folosit litere mici pentru instrucțiunea If Options, Visual Basic Editor aplică litere mari (doar pentru afișare - VBA nu ține cont de literele mari atunci când execută codul). Dacă nu sunt spații de o parte sau alta a semnului egal, Visual Basic Editor le adaugă.

21. Se introduce Options.DeletedTextMark=wdDeletedTextMarkStrikethrough, folosind asistența oferită de Visual Basic Editor (descrisă mai sus de la pasul 16 până la pasul 18), apoi se apasă tasta Enter.

22. Se apasă tasta Backspace sau Shift+Tab pentru a muta cursorul de pe noua linie spre stânga.

23. Se tastează cuvântul cheie ElseIf, apoi se adaugă restul codului astfel:

ElseIf Options.DeletedTextMark = wdDeletedTextMarkStrikeThrough Then

   Options.DeletedTextMark = wdDeletedTextMarkHidden 
   End If

24. Se verifică dacă procedura complete arată așa:

Sub Toggle_Track_Changes_between_Hidden_and_Strikethrough()
If Options.DeletedTextMark = wdDeletedTextMarkHidden Then 
Options.DeletedTextMark = wdDeletedTextMarkStrikeThrough 
ElseIf Options.DeletedTextMark = wdDeletedTextMarkStrikeThrough Then
Options.DeletedTextMark = wdDeletedTextMarkHidden 
End If 
End Sub

25. Se apasă Alt+F11 pentru a comuta la Word, apoi se tastează o linie sau două de text.

26. Se aranjează ferestrele Word și Visual Basic Editor una lângă alta. În Word, clic pe eticheta Review de pe Ribbon, apoi clic pe partea de sus a butonului Track Changes (pictograma) pentru a activa caracteristica care marchează (sau manevrează) revizuirile (revisions). Se șterge un cuvânt din text. Se poate vedea că acel cuvânt este fie tăiat cu o linie, fie ascuns. Cu ajutorul macrocomenzii se poate comuta între aceste două stări, deci în Visual Basic Editor, se apasă tasta F5 sau clic pe butonul Run Sub/UserForm (de pe bara Standard sau Debug) pentru a executa macrocomanda. Revenind în Word, se poate vedea efectul pentru cuvântul șters. Se poate vedea și caseta de dialog Track Changes Options pentru a vedea dacă s-a modificat setarea pentru Deletions.

27. Clic pe butonul Save de pe bara cu instrumente Standard din Visual Basic Editor.

De reținut că macrocomanda se poate scrie folosind instrucțiunea With pentru obiectul Options, astfel:

Sub Toggle_Track_Changes_between_Hidden_and_Strikethrough_2() 
   With Options
      If .DeletedTextMark = wdDeletedTextMarkHidden 
      Then
        .DeletedTextMark = wdDeletedTextMarkStrikeThrough 
      ElseIf .DeletedTextMark = wdDeletedTextMarkStrikeThrough 
      Then 
        .DeletedTextMark = wdDeletedTextMarkHidden 
      End If
   End With 
End Sub

Sunt câteva metode pentru a scrie un anumit comportament în VBA. Deși programatorii profesioniști învață un set cu "cele mai bune practici", în codul VBA pentru uz personal se poate scrie cum se dorește.