Exemplu Word: Procedură de mutare paragraf

Primul exemplu mută paragraful curent în sus sau jos în document cu unul sau două paragrafe în Word.

Înregistrarea procedurii

Mai întâi se înregistrează procedura în Word pentru a muta paragraful curent. În procedură, trebuie înregistrate comenzile pentru următoarele acțiuni:

  • Selectarea paragrafului curent
  • Tăierea selecției și apoi lipirea acesteia
  • Deplasarea punctului de inserție în sus și în jos în document
  • Introducerea unui marcaj (bookmark), mutarea punctului de inserare la acesta, apoi ștergerea marcajului.

Procedura finalizată va afișa o casetă de dialog cu butoane de opțiune pentru mutarea alineatului curent în sus cu un paragraf, în sus cu două paragrafe, în jos cu un paragraf sau în jos cu două paragrafe. Caseta de dialog ar trebui să includă, de asemenea, o casetă de validare care indică faptul că utilizatorul dorește ca punctul de inserare să revină la poziția inițială la sfârșitul procedurii. Deoarece este probabil un comportament implicit de dorit pentru procedură, această casetă de selectare va fi selectată implicit. Utilizatorii pot debifa caseta de selectare dacă nu doresc să returneze punctul de inserție în poziția inițială.

În primul rând, se deschide Word cu un document nou, gol (Ctrl + N) în care se introduc patru paragrafe de text (pot fi obținute automat scriind în Word =rand(3,1) sau = lorem(3,1) sau =rand.old(3,1), apoi apăsarea tastei Enter), pentru a putea verifica dacă procedura va muta paragrafele așa cum ar trebui. Apoi, se așează punctul de inserare într-unul dintre paragrafele introduse și se înregistrează macrocomanda:

  1. Clic pe pictograma Record Macro din bara de stare sau pictograma Record Macro din secțiunea Code a etichetei Developer de pe panglică. Apare caseta de dialog Record Macro.
  2. Se tastează numele macrocomenzii, Move_Paragraph, în caseta de text Macro Name și descrierea în caseta text Description.
  3. Se alege un șablon sau document, dacă este nevoie, în lista Store Macro In. (Pentru ca macrocomanda să nu se regăsească în modulul NewMacros din fișierul Normal.dotm, se alege altă locație din listă.
  4. Cu clic pe butoanele Button sau Keyboard se poate crea un buton pe bara Quick Access Toolbar button sau o combinație de taste pentru macrocomandă.
  5. Clic pe butonul OK pentru a începe înregistrarea macrocomenzii.

Se înregistrează câteva acțiuni în macrocomandă:

1. Se introduce un marcaj în poziția curentă a punctului de inserare, cu clic Insert – Links – Bookmark de pe panglică. Apare caseta de dialog Bookmarks (Marcaje). Se introduce un nume pentru marcaj și clic pe butonul Add (Adăugare). În acest exemplu, marcajul este numit Move_Paragraph_Temp pentru a indica faptul că este un marcaj temporar folosit pentru procedura Move_Paragraph.

2. Se selectează paragraful curent apăsând F8 de patru ori. Prima apăsare a F8 activează modul Extindere, a doua selectează cuvântul curent, a treia selectează fraza curentă și a patra selectează paragraful curent. Apăsați tasta Esc pentru a dezactiva modul Extindere după selectarea paragrafului.

3. Se preia (”decupează”) paragraful selectat cu una dintre variațiile comenzii Cut (de exemplu, apăsați fie Ctrl + X sau Shift + Delete, sau cu clic pe pictograma Cut în secțiunea Clipboard a panglicii).

4. Se mută punctul de inserare în sus cu un paragraf apăsând Ctrl + ↑.

5. Se lipește paragraful tăiat din nou folosind o comandă Paste (de exemplu, Ctrl + V sau Shift + Insert sau cu clic pe butonul Paste din fila Acasă a panglicii).

6. Se deplasează punctul de inserare în jos cu un paragraf apăsând Ctrl + ↓.

7. Se mută punctul de inserție cu două paragrafe apăsând de două ori Ctrl + ↑.

Rețineți că, dacă la început punctul de inserare era la începutul primului paragraf din document, punctul de inserare poate fi mutat în sus doar cu un paragraf. Acest lucru nu contează - oricum apăsarea pe taste este înregistrată. Este posibil ca Word să emită un semnal sonor.

8. Se deplasează punctul de inserție cu două paragrafe în jos apăsând Ctrl + ↓ de două ori. (Dacă se ajunge la sfârșitul documentului după prima apăsare a tastelor, nu sunt probleme, oricum apăsarea este înregistrată. Word poate emite un sunet.)

9. Se deschide din nou caseta de dialog Marcaj în document (clic pe Insert – Links – Bookmarks de pe panglică), se selectează marcajul Move_Paragraph_Temp, apoi clic pe butonul Go (Salt la) pentru a sări la el. Apoi clic pe butonul Delete pentru a șterge marcajul Move_Paragraph_Temp. Și clic pe butonul Închidere (Close) pentru a închide caseta de dialog Marcaje.

10. Se oprește Macro Recorder cu clic pe pictograma Stop Recording din bara de stare sau pictograma Stop Recording din Developer – Code de pe panglică.

Se deschide macrocomanda înregistrată în Editorul Visual Basic apăsând Alt + F8, selectând numele macrocomenzii din caseta de dialog Macros și clic pe butonul Edit.

Macrocomanda ar putea să arate astfel:

1. Sub Move_Paragraph()
2. '
3. ' Macrocomanda Muta_Paragraf
4. ' Muta un paragraf mai sus sau mai jos
5. ' 
6.   With ActiveDocument.Bookmarks
7.     .Add Range:=Selection.Range, Name:="Move_Paragraph_Temp"
8.     .DefaultSorting = wdSortByName
9.     .ShowHidden = False
10.  End With
11.  Selection.Extend
12.  Selection.Extend
13.  Selection.Extend
14.  Selection.Extend
15.  Selection.EscapeKey
16.  Selection.Cut
17.  Selection.MoveUp Unit:=wdParagraph, Count:=1
18.  Selection.Paste
19.  Selection.MoveDown Unit:=wdParagraph,  Count:=1
20.  Selection.MoveUp Unit:=wdParagraph, Count:=2
21.  Selection.MoveDown Unit:=wdParagraph,  Count:=2
22.  Selection.GoTo What:=wdGoToBookmark, 
             Name:="Move_Paragraph_Temp"
23.  ActiveDocument.Bookmarks("Move_Paragraph_Temp").Delete
24.  With ActiveDocument.Bookmarks
25.     .DefaultSorting = wdSortByName
26.     .ShowHidden = False
27.  End With
28. End Sub

Comenzile din macrocomandă sunt:

  • Linia 1 începe macrocomanda iar linia 28 o încheie. Liniile 2 și 5 sunt goale și încadrează liniile de comentariu pe care se află numele macrocomenzii (linia 3) și descrierea (linia 4).
  • Liniile de la 6 până la 10 conțin comanda With care adaugă marcajul Move_Paragraph_Temp. Liniile 7 și 8 nu sunt necesare, dar Macro Recorder înregistrează toate setările din caseta de dialog Bookmarks, inclusiv setarea pentru opțiunea Sort By și caseta de bifare Hidden Bookmarks.
  • Liniile de la 11 până la 15 folosesc caracteristica Extend Selection pentru a selecta paragraful curent.
  • Liniile 17, 19, 20 și 21 au înregistrat sintaxa pentru mutarea punctului de inserție în sus și în jos cu câte un paragraf sau două.
  • Pe linia 16 se află comanda Cut și pe linia 18 comanda Paste.
  • Linia 22 mută punctul de inserție la marcajul Move_Paragraph_Temp, iar linia 23 șterge marcajul. Liniile de la 24 până la 27 au înregistrat setările din caseta de dialog Bookmarks, care nu sunt necesare aici.

Prin ștergerea liniilor care nu mai sunt necesare, codul devine mai scurt și mai ușor de înțeles:

1. Sub   Move_Paragraph()
2.   ActiveDocument.Bookmarks.Add Range:=Selection.Range, 
         Name:="Move_Paragraph_Temp"
3.   Selection.Extend
4.   Selection.Extend
5.   Selection.Extend
6.   Selection.Extend
7.   Selection.EscapeKey
8.   Selection.Cut
9.   Selection.MoveUp Unit:=wdParagraph, Count:=1
10.  Selection.Paste
11.  Selection.MoveDown Unit:=wdParagraph, Count:=1
12.  Selection.MoveUp Unit:=wdParagraph, Count:=2
13.  Selection.MoveDown Unit:=wdParagraph, Count:=2
14.  Selection.GoTo What:=wdGoToBookmark, _ 
         Name:="Move_Paragraph_Temp"
15. End Sub

Crearea casetei de Dialog

Apoi se creează caseta de dialog pentru procedură (care la final ar trebui să arate ca în imaginea de mai jos):

1. Se adaugă un formular în Visual Basic Editor cu clic pe butonul Insert și alegerea controlului UserForm (sau clic pe butonul Insert dacă este afișată pictograma UserForm) sau cu Insert > UserForm.

2. În fereastra Properties a formularului la Name și Caption se completează numele și titlul formularului. În exemplul de mai sus numele formularului este frmMoveParagraph și titlul este Mutare Paragraf, astfel încât numele formularului seamănă cu cel al titlului, dar diferit de numele procedurii (Move_Current_Paragraph).

3. În formular se adaugă două cadre, pentru a acționa ca grup în caseta de dialog:

a. Dublu-clic pe instrumentul Frame din Toolbox, apoi în formular clic și tragere pentru a plasa fiecare cadru.

b. Se aliniază cadrele cu selectarea lor și alegând Format > Align > Lefts.

c. Cu cadrele încă selectate, se verifică dacă au aceeași lățime cu Format > Make Same Size > Width. (Nu se alege Format > Make Same Size > Height or Format > Make Same Size > Both, deoarece cadrul de sus trebuie să fie mai mare pe verticală.)

d. Pentru cadrul de sus la Caption se alege Mutare iar la cel de jos Punct de insertie, selectând fiecare cadru pe rând și setând proprietatea Caption din fereastra Properties. Numele cadrului de sus fraMovement și al cadrului de jos fraInsertionPoint.

4. Se adaugă patru butoane radio în cadrul Mutare:

a. Dublu-clic pe instrumentul OptionButton din Toolbox, apoi clic pe cadrul Mutare pentru a plasa fiecare buton radio. De această dată nu se face clic și tragere, doar clic pentru ca butoanele să aibă aceeași dimensiune.

b. După plasarea celor 4 butoane, clic pe butonul Select Objects din Toolbox pentru a reveni la cursorul de selecție. Apoi se selectează cele 4 butoane și se aliniază cu Format > Align > Lefts, se spațiază egal cu Format > Vertical Spacing > Make Equal și dacă este necesar, se folosesc și opțiunile Format > Vertical Spacing - Increase, Decrease, și Remove, pentru a ajusta spațiul dintre butoanele radio. (Alinierea și spațierea se poate face și manual.)

c. Se modifică numele Caption pentru fiecare buton în proprietatea Caption din fereastra Properties: Un paragraf mai sus, Doua paragrafe mai sus, Un paragraf ami jos și Doua paragrafe mai jos. Aceste butoane radio vor controla numărul de paragrafe cu care va fi mutat paragraful curent.

d. Dacă este nevoie să se redimensioneze butoanele, pentru a vedea și textul din captions, se selectează, apoi se grupează cu clic dreapta și Group din meniul contextual sau cu Format > Group, sau clic pe butonul Group din bara cu instrumente UserForm. Apoi se selectează grupul și se trage de mânere pentru redimensionare.

e. Se redenumesc butoanele radio cu optSusUnu, optSusDoi, optJosUnu și optJosDoi, în proprietatea Name din fereastra Properties.

În mod implicit, toate butoanele radio din formular (dacă nu sunt incluse într-un cadru) fac parte din același grup de opțiuni. Aceasta înseamnă că doar unul dintre aceste butoane radio poate fi selectat la un moment dat. Pentru a avea mai multe grupuri de butoane radio într-un formular, grupurile trebuie specificate separat. Cel mai simplu mod de a face acest lucru este prin poziționarea fiecărui grup într-un control Frame separat. Alternativ, se poate specifica o proprietate GroupName diferită pentru fiecare buton radio.

f. Apoi în fereastra Properties se setează proprietatea Value a primului buton radio la True. În proprietatea Accelerator ale butoanelor radio se pot alege taste rapide, de exemplu u, d, U, D - adică ”unu” și ”doi”, cu litere mici pentru ”mutare în sus” și cu litere mari pentru ”mutare în jos”.

Proprietatea Accelerator este case-sensitive (ține cont dacă litere sunt mari sau mici) doar dacă în caption pentru control sunt deopotrivă litere mari și mici pentru aceeași literă.

5. În cadrul Punct de insertie se plasează o casetă de bifare:

a. Clic pe instrumentul CheckBox din Toolbox, apoi clic în cadrul Insertion Point din formular pentru a plasa acolo o casetă de bifare.

b. În fereastra Properties, se setează numele casetei chkRevenireLaPozitiaAnterioara (un nume lung, dar sugestiv). Apoi în proprietatea Caption se scrie Revenire la pozitia anterioara. La tasta rapidă (Accelerator) se alege R și la proprietatea Value se alege True, astfel caseta va fi implicit bifată.

6. Apoi se adaugă butoanele de comandă pentru formular:

a. Dublu-clic pe instrumentul CommandButton tool din Toolbox, apoi câte un clic pentru a plasa fiecare buton și la final clic pe butonul Select Objects pentru a reactiva cursorul de selecție.

b. Se redimensionează și se poziționează butoanele folosind comenzile din meniul Format. De exemplu, se pot grupa butoanele, apoi se alege Format > Center In Form > Horizontally pentru a centra pe orizontală perechea de butoane.

c. Se setează proprietățile pentru fiecare buton: cel din stânga (butonul OK) Name = cmdOK, Caption = OK, Accelerator = O (O de la OK, nu zero), Default = True. Pentru butonul din dreapta (butonul Anulare), Name = cmdCancel, Caption = Anulare, Accelerator = A, Cancel = True, Default = False.

7. Se atașează codul la formular. Cu dublu-clic pe butonul Anulare se comută la fereastra Code pentru a afișa procedura asociată butonului:

Private Sub cmdCancel_Click()
End Sub

VBA Editor creează câte o procedură pentru fiecare eveniment sau control (sau formular) la dublu-clic și deschide fereastra Code. Pentru majoritatea controalelor, va fi evenimentul Click, ca la controlul CommandButton.

Se tastează comanda End între cele două linii:

Private Sub cmdCancel_Click()
End 
End Sub

Comanda End elimină formularul de pe ecran și încheie procedura - în acest caz, procedura Move_Current_Paragraph.

Codul pentru butonul OK este mai complex. Când utilizatorul face clic pe butonul OK, procedura trebuie să continue executarea și să facă următoarele:

  • Elimină caseta de dialog de pe ecran – o ascunde sau o descarcă din memorie (sau ambele). De obicei, folosirea ambelor comenzi este mai explicită.
  • Se verifică proprietatea Value din caseta de bifare pentru a vedea dacă este bifată sau nu.
  • Se verifică proprietatea Value pentru fiecare buton radio pentru a vedea care a fost selectat înainte de a apăsa butonul OK.

Apoi se continuă cu crearea casetei de dialog Move Current Paragraph:

8. Dublu-click pe butonul OK pentru a afișa codul atașat la buton. (Dacă deja este deschisă fereastra Code, se selectează cmdOK din lista Object (în partea stângă sus a ferestrei Code). VBA Editor creează automat o procedură pentru evenimentul Click al butonului.

Mai întâi se adaugă următoarele două linii între liniile Private Sub și End Sub:

frmMoveParagraph.Hide 
Unload frmMoveParagraph

Linia frmMoveParagraph.Hide activează metoda Hide pentru formularul frmMoveParagraph, ascunzând formularul. Linia Unload frmMoveParagraph descarcă formularul din memorie.

Ștergerea unui formular poate preveni confuziile

Nu este necesar să ascundeți sau să descărcați un formular pentru a continua executarea unei proceduri, dar dacă nu se face acest lucru, utilizatorii pot deveni confuzi. De exemplu, cu clic pe butonul OK din caseta de dialog Print într-o aplicație Windows, caseta de dialog ar trebui să dispară și să fie executată comanda Print. Dacă caseta de dialog nu a dispărut (dar a lansat lucrarea de tipărire în fundal), utilizatorul poate să creadă că acel clic nu a fost înregistrat, așa că se face clic din nou și din nou până când dispare caseta de dialog. Astfel vor fi imprimate mai multe copii, ceea ce este greșit.

9. Apoi, procedura are nevoie să verifice proprietatea Value a casetei de bifare chkRevenireLaPozitiaAnterioara pentru a afla dacă trebuie introdus un marcaj în document pentru a marca poziția curentă a punctului de inserție. Acest lucru se face cu comanda If...Then:

If chkReturnToPreviousPosition = True 
Then 
End If

Dacă chkRevenireLaPozitiaAnterioara este True adică caseta este selectată, este rulat codul de pe liniile care urmează după comanda Then. Comanda Then este formată din liniile de cod pentru inserare marcaj înregistrate anterior. Se preiau aceste linii din procedură și se adaugă în comanda If.Then astfel:

If chkRevenireLaPozitiaAnterioara = True Then 
   With ActiveDocument.Bookmarks
   .Add Range:=Selection.Range, Name:=" Move_Paragraph_Temp"
   End With 
End If

Dacă check box este bifată, procedura inserează un marcaj. Dacă nu este bifată, procedura trece peste aceste linii.

10. Apoi, imediat după End If, se adaugă codul pentru selectarea și decuparea paragrafului curent:

Selection.Extend
Selection.Extend
Selection.Extend
Selection.Extend
Selection.Cut

11. Apoi trebuie să se verifice proprietățile Value pentru butoanele radio pentru a vedea care a fost selectat înainte de a da clic pe butonul OK din formular. Și aici se va folosi o condiție If de data asta de tip If...Then ElseIf...Else, cu liniile de inserare punct de inserție din macrocomanda înregistrată:

If optSusUnu = True Then
   Selection.MoveUp Unit:=wdParagraph, Count:=1 
ElseIf optSusDoi = True Then
   Selection.MoveUp Unit:=wdParagraph, Count:=2 
ElseIf optJosUnu = True Then
   Selection.MoveDown Unit:=wdParagraph, Count:=1
Else
Selection.MoveDown Unit:=wdParagraph, Count:=2 
End If
Selection.Paste

Aici, cele patru opțiuni optSusUnu, optSusDoi, optJosUnu și optJosDoi (ultima opțiune folosește comanda Else și nu este specificată după nume), reprezintă alegeri de mutare a paragrafului curent în sus cu un paragraf sau cu două paragrafe și în jos cu unul sau două paragrafe.

Condiția este simplă: dacă optSusUnu este True (dacă este selectat acel butonul radio), se execută condiția Then, se mută punctul de inserție în sus cu un paragraf față de poziția curentă (după decuparea paragrafului curent, punctul de inserție va fi la începutul paragrafului care era după paragraful curent). Dacă optSusUnu este False, este evaluată prima condiție ElseIf. Dacă condiția este evaluată la True, este rulată a doua condiție Then. Și dacă starea se evaluează la False, se evaluează următoarea condiție ElseIf. Dacă această condiție se dovedește a fi falsă, este rulat codul Else. În acest caz, instrucțiunea Else înseamnă că butonul de opțiune optJosDoi a fost selectat în caseta de dialog, astfel încât codul Else mută punctul de inserare în jos cu două paragrafe.

După ce se mută se mută punctul de inserare în funcție de butonul radio ales de utilizator, este executată următoarea linie de cod (Selection.Paste) cu paragraful decupat, aflat în Clipboard.

12. La final, dacă este selectată caseta de selectare chkRevenireLaPozitiaAnterioara, procedura trebuie să readucă punctul de inserție la locul unde a fost inițial. Din nou, acest lucru se poate testa cu o condiție If...Then simplă care încorporează liniile de acces la marcaj și șterge marcajele din procedura înregistrată:

If chkRevenireLaPozitiaAnterioara = True Then 
Selection.GoTo What:=wdGoToBookmark, _
Name:=" Move_Paragraph_Temp" 
ActiveDocument.Bookmarks("Move_Paragraph_Temp").Delete 
End If

Dacă caseta de bifare chkRevenireLaPozitaAnterioara este selectată, VBA mută punctul de inserție la marcajul temporar, apoi șterge acel marcaj.

Mai jos este scrisă întreaga procedură pentru butonul cmdOK.

1. Private Sub cmdOK_Click()
2.   frmMoveParagraph.Hide
3.   Unload frmMoveParagraph
4.   If chkRevenireLaPozitiaAnterioara = True Then
5.     With ActiveDocument.Bookmarks
6.       .Add Range:=Selection.Range, _
   Name:=''Move_Paragraph_Temp"
7.     End With
8.   End If
9.   Selection.Extend
10.  Selection.Extend
11.  Selection.Extend
12.  Selection.Extend
13.  Selection.Cut
14.  If optSusUnu = True Then
15.     Selection.MoveUp Unit:=wdParagraph, Count:=1
16.  ElseIf optSusDoi = True Then
17.     Selection.MoveUp Unit:=wdParagraph, Count:=2
18.  ElseIf optJosUnu = True Then
19.     Selection.MoveDown Unit:=wdParagraph, Count:=1
20.  Else
21.     Selection.MoveDown Unit:=wdParagraph, Count:=2
22.  End If
23.  Selection.Paste
24.  If chkRevenireLaPozitiaAnterioara = True Then
25.     Selection.GoTo What:=wdGoToBookmark, _
  Name:="Move_Paragraph_Temp"
26.     ActiveDocument.Bookmarks("Move_Paragraph_Temp").Delete
27.  End If
28. End Sub

Pentru a testa corect acest exemplu, trebuie eliminat marcajul introdus în timpul înregistrării macrocomenzii. Marcajul se poate elimina cu clic pe elementul de marcare din panglica Word, fila Insert, secțiunea Links. În caseta de dialog Bookmarks care se deschide, se selectează Move_Paragraph_Temp și se face clic pe butonul Delete.

Apoi se deschide documentul în Word, creat mai devreme, care conține mai multe paragrafe de text. Cu tastele Alt + F11 se deschide editorul Visual Basic. Cu dublu clic pe frmMoveParagraph din Exploratorul de proiecte se afișează formularul. Se apasă F5 pentru a rula această procedură. Cu clic pe butonul OK din formular se poate observa că alineatele au fost rearanjate în document.