Folosirea casetelor de dialog predefinite ale aplicației din VBA

Unele aplicații, cum ar fi Word și Excel, permit utilizarea casetelor de dialog încorporate prin VBA. Dacă o casetă de dialog încorporată oferă funcționalitatea de care este nevoie, utilizarea acesteia poate fi o soluție excelentă: nu trebuie construită o casetă de dialog personalizată, trebuie doar să se facă referire la caseta de dialog încorporată din cod.

O casetă de dialog încorporată nu are nevoie de depanare, iar utilizatorii procedurilor sunt deja familiarizați cu caseta de dialog din aplicație. Aceste căsuțe de dialog încorporate se numesc căsuțe de dialog obișnuite (common dialog boxes) și au fost descrise pe scurt în secțiunea Folosirea de bucle pentru acțiuni care se repetă.

Afișarea unei casete de dialog predefinite

Pentru a afișa o casetă de dialog predefinită, este nevoie să i se cunoască numele și constanta. Apoi se decide care va fi metoda folosită pentru afișarea casetei de dialog.

Găsirea casetei de dialog și a Constantei

Deși Office 2016 nu mai folosește meniuri (cu unele excepții, cum ar fi editorul Visual Basic), casetele de dialog încorporate (în Word și alte aplicații) sunt încă identificate de constante derivate din interfața mai veche, în stilul meniului, pre-Ribbon. Aceste constante încep cu literele wdDialog (de la Word dialog), urmate de numele casetei de dialog.

Numele casetelor de dialog obișnuite sunt derivate din comenzile de meniu pre-Office 2010 care afișează casetele de dialog înainte de introducerea interfeței Panglică (cu Office 2007). De exemplu, pentru a vă referi la caseta de dialog Deschidere, utilizați constanta wdDialogFileOpen, deoarece în versiunile anterioare ale Word, ați fi ales File> Open pentru a afișa caseta de dialog.

Sau pentru a afișa caseta de dialog Print (File > Print options), utilizați constanta wdDialogFilePrint, și pentru a afișa caseta de dialog Opțiuni (Instrumente> Opțiuni), utilizați constanta wdDialogToolsOptions.

Așadar, deși interfața utilizator a evoluat dincolo de meniurile clasice, structura de meniu rămâne ca parte a sistemului de clasificare a obiectelor interne - cum ar fi aceste constante folosite pentru identificarea diferitelor căsuțe de dialog.

Excel urmează o convenție taxonomică similară, dar mai puțin rigidă. Casetele de dialog Excel încorporate sunt (pentru compatibilitatea cu codul macrocomenzilor mai vechi) încă identificate de constante începând cu literele xlDialog urmate de numele căsuței de dialog. Numele casetei de dialog este derivat fie din comenzile clasice ale meniului care au fost necesare pentru afișarea acesteia, fie din titlul casetei de dialog. De exemplu, pentru a vă referi la caseta de dialog Deschidere, utilizați constanta xlDialogOpen (în loc de xlDialogFileOpen).

În orice caz, cea mai simplă modalitate de a găsi numele pentru caseta de dialog încorporată de care aveți nevoie este să căutați „Listele de argumente din caseta de dialog încorporată” ( Built-In Dialog Box Argument Lists) din Word sau Excel în sistemul de ajutor al editorului Visual Basic. (Access folosește un sistem cu totul diferit pentru căsuțele de dialog comune, care necesită importarea bibliotecilor de obiecte folosind meniul său Visual Basic Editor's Tools > References și folosirea obiectelor specializate.)

De asemenea, puteți vizualiza o listă de casete de dialog Word sau Excel încorporate afișând Browser-ul de obiecte (apăsați F2 în editor) și tastând wddialog (pentru Word) sau xldialog (pentru Excel) în caseta de text Căutare.

Utilizați aceste constante cu proprietatea Dialogs, care returnează obiectul de colecție Dialogs, care la rândul său conține toate casetele de dialog încorporate din aplicația gazdă.

De exemplu, pentru a afișa caseta de dialog Save As Word, utilizați metoda Show, așa cum este ilustrat în următoarea comandă:

Dialogs(wdDialogFileSaveAs).Show

Este simplu. Pentru a afișa caseta de dialog Replace din Word, în loc de wdDialogFileSaveAs, se alege wdDialogEditReplace.

Colecția de casete de dialog poate fi creată în Word, dar nu și în Excel

În Word, colecția Dialogs este un „obiect care poate fi creat”, ceea ce înseamnă că îl puteți accesa direct fără a trece prin obiectul Application. În Excel, însă, colecția Dialogs nu poate fi creată, așa că trebuie să adăugați întotdeauna obiectul Application la cod, astfel:

Application.Dialogs (xlDialogOptionsGeneral).Show

Alegerea între metoda Show și metoda Display

VBA oferă două metode de afișare a casetelor de dialog pe ecran: Show și Display:

  • Metoda Show arată obiectul Dialog specificat și apoi folosește funcții încorporate în obiectul Dialog pentru a efectua solicitările utilizatorului. Nu trebuie scris niciun cod. De exemplu, dacă utilizați metoda Show pentru a afișa caseta de dialog wdDialogFileSaveAs și utilizatorul introduce un nume pentru fișier în caseta Nume fișier și face clic pe butonul Salvează, VBA în sine salvează automat fișierul cu numele dat în folderul specificat (și cu orice alte opțiuni alese de utilizator). Nu se scrie cod pentru a salva acest fișier.
  • Metoda Display doar afișează pe ecran caseta de dialog, dar nu execută acțiunile solicitate de utilizator în caseta de dialog. În schimb, vă permite să obțineți setările (cererile și selecțiile utilizatorului) din caseta de dialog odată ce utilizatorul o închide, dar atunci trebuie scris propriul cod pentru a efectua ceea ce a cerut utilizatorul.

Dacă caseta de dialog pe care doriți să o afișați are file, puteți afișa fila la alegere specificând proprietatea DefaultTab. Vă referiți la o filă cu numele casetei de dialog plus cuvântul Tab și numele filei. De exemplu, constanta pentru caseta de dialog Bullets And Numering este wdDialogFormatBulletsAndNumbering, iar constanta pentru fila sa contorizată este wdDialogFormatBulletsAndNumberingTabOutlineNumbered.

De asemenea, caseta de dialog Font este denumită wdDialogFormatFont, iar fila pentru spațierea caracterelor este denumită wdDialogFormatFontTabCharacterSpacing. Puteți afișa această filă folosind următoarele comenzi:

With Dialogs(wdDialogFormatFont)
.DefaultTab = wdDialogFormatFontTabCharacterSpacing.Show 
End With

Pentru a vedea o listă cu toate constantele de filă Word, căutați wdWordDialogTab în browserul de obiecte al editorului VBA (apăsați F2). Veți găsi o mulțime de constante.

Folosirea metodei SHOW pentru a afișa și executa o casetă de dialog

Metoda Show afișează caseta de dialog specificată și răspunde automat la orice acțiune indicată de utilizator. Metoda Show este utilă atunci când utilizatorul dorește o acțiune interactivă. Ca exemplu, într-o procedură care cere realizarea unor operații de formatare în documentul curent, se poate verifica dacă documentul este deschis înainte de a reliza formatarea. Apoi, dacă documentul nu este deschis, se poate afișa caseta de dialog predefinită Open astfel încât utilizatorul să poată deschide un fișier. (CasetA de dialog Open poate fi precedată de un mesaj care explică problema.) În codul de mai jos se poate vedea această parte de procedură.

1. If Documents.Count = 0 Then
2.     Proceed = MsgBox("Nu este deschis niciun document." _
  & vbCr & vbCr & _
  "Deschideti un document pentru ca procedura sa  functioneze.", _ 
   vbOKCancel + vbExclamation, "Format Report")
3. If Proceed = vbOK Then
4.   Dialogs(wdDialogFileOpen).Show
5.   If Documents.Count = 0 Then End
6.   Else
7.     End
8.   End If
9. End If
10. 'urmeaza restul procedurii

Iată cum funcționează codul:

  • Linia 1 verifică proprietatea Count din colecția Documents pentru a vedea dacă sunt deschise documente; dacă nu e deschis niciun document, sunt executate comenzile de la linia 2 până la linia 8.
  • Linia 2 afișează o casetă mesaj care informează utilizatorul că nu este deschis niciun document și îi cere să deschidă unul pentru ca procedura să funcționeze. Caseta de dialog are butoanele OK și Cancel și ține minte butonul apăsat în variabila Proceed.
  • Linia 3 verifică dacă utilizatorul a apăsat butonul OK; în acest caz, linia 4 afișează o casetă de dialog Open pentru ca utilizatorul să aleagă fișiserul, pe care VBA îl va deschide la clic pe butonul Open din caseta de dialog Open.
  • Utilizatorul poate anula procedura în acest moment cu clic pe butonul Cancel din caseta de dialog Open, deci linia 5 verifică din nou proprietatea Count a colecției Documents și folosește comanda End pentru a termina executarea procedurii în cazul în care nu este deschis niciun document.
  • Dacă nu a fost apăsat butonul OK, executarea se mută de la linia 3 la comanda Else de pe linia 6, iar comanda End de pe linia 7 încheie executarea procedurii.
  • Linia 8 conține comanda End If pentru instrucțiunea If imbricată, iar linia 9 conține comanda End If pentru instrucțiunea If externă.
  • Linia 10 conține un comentariu pentru a indica că urmează adăugat cod – restul procedurii va rula din acest punct, la care s-a ajuns doar dacă este deschis un document.

Folosirea metodei DlSPLAY pentru a afișa o casetă de dialog

Nu uitați că, spre deosebire de metoda Show, metoda Display afișează o casetă de dialog încorporată, dar nu răspunde la nicio acțiune pe care utilizatorul o face în caseta de dialog. În schimb, trebuie scris cod care verifică setările pe care utilizatorul le-a ales în caseta de dialog și apoi scrise mai multe coduri pentru a îndeplini cerințele utilizatorului. Când se folosește metoda Display, utilizatorul lucrează cu casete de dialog familiare, dar programatorul controlează total comportamentul care rezultă din acea interacțiune.

De exemplu, de multe ori trebuie să aflați în ce folder ar trebui să funcționeze o procedură, cum ar fi atunci când aveți nevoie de locația unui număr de documente pe care utilizatorul dorește să le manipuleze. Pentru a obține folderul, puteți afișa o casetă de intrare simplă în care se solicită utilizatorului să introducă calea corectă către folder - dacă utilizatorul cunoaște calea și o poate introduce corect.

Poate că o soluție mai bună este să afișați o casetă listă care conține partiții, foldere și fișiere de pe hard disk-ul utilizatorului, dar pentru a face acest lucru trebuie să dimensionați un tablou și să-l completați cu folderele și numele de fișiere și trebuie să reîncărcați afișajul de fiecare dată când utilizatorul se mișcă în sus sau în jos în arbore - destul de multe lucrări de programare.

Deci, de ce să nu împrumutați toată această funcționalitate dintr-o casetă de dialog comună încorporată? Este deja parte a aplicațiilor Office. Puteți obține același rezultat mult mai ușor folosind o casetă de dialog încorporată care are arborele încorporat (de exemplu, caseta de dialog Open) și apoi regăsirea răspunsurilor utilizatorului în scopuri proprii.

Dacă trebuie să executați setările (alegerile utilizatorului) într-o casetă de dialog încorporată, puteți utiliza metoda Execute. Dar poate doriți să verificați selecțiile utilizatorului în caseta de dialog înainte de a le implementa. Dacă găsiți o problemă, puteți afișa, de exemplu, o casetă de dialog, cum ar fi o casetă de intrare, pentru a solicita clarificări.

Setarea și restaurarea opțiunilor dintr-o casetă de dialog predefinită (Built-In Dialog Box)

Cele mai multe dintre casetele de dialog predefinite (încorporate) din Word și Excel au argumente pe care le puteți utiliza pentru regăsirea sau setarea valorilor în caseta de dialog. De exemplu, caseta de dialog Open din Word are argumente pentru Name, ConfirmConversions, ReadOnly, LinkToSource, AddToMru (adăugarea documentului în lista celor mai recent utilizate documente – MRU - din secțiunea recentă a filei File pe Panglica), PasswordDoc și altele. O parte din ele sunt opțiuni care se pot vedea în caseta de dialog Open în sine. Altele sunt opțiuni asociate pe care le veți găsi pe diversele file din caseta de dialog Opțiuni. Puteți ghici unele nume de argumente din numele controalelor corespunzătoare din caseta de dialog, dar alte nume nu sunt legate direct. Pentru a afla numele, căutați „Liste de argumente din caseta de dialog încorporată” (“Built-In Dialog Box Argument Lists”) în sistemul de ajutor al editorului VBA (alegeți MSDN pe Web, apoi căutați cu Bing).

De exemplu, următoarele instrucțiuni setează conținutul pentru caseta text File Name în caseta de dialog Save As din Word apoi afișează caseta de dialog:

With Dialogs(wdDialogFileSaveAs)
.Name = "Yellow Paint Primer"
.Show
End With

Rețineți că unele argumente aplicate la casetele de dialog afișate în Office 2003 nu sunt utilizate în versiunile ulterioare ale casetelor de dialog Office. Deci, poate fi necesar să experimentați un pic pentru a vedea dacă un anumit argument moștenit este încă util în interfața Office 2016.

Dacă schimbați setările într-o casetă de dialog care utilizează setări sticky (persistente), este bine să le schimbați înapoi la sfârșitul procedurii, astfel încât utilizatorii să nu obțină rezultate neașteptate la următoarea deschidere a casetei de dialog.

Ce buton a ales utilizatorul în caseta de dialog?

Pentru a afla pe ce buton a făcut clic utilizatorul într-o casetă de dialog, se verifică valoarea returnată a metodei Show sau a metodei Display. Valorile de returnare sunt prezentate în tabelul următor.

De exemplu, se poate anula întreaga procedură dacă utilizatorul face clic pe butonul Cancel într-o casetă de dialog, astfel:

If Dialogs(wdDialogFileOpen).Show = 0 Then End

Specificarea unei pauze - Time-Out pentru o casetă de dialog

În unele aplicații, inclusiv Word, puteți afișa câteva casete de dialog încorporate pentru o perioadă specificată, în loc să le lăsați să rămână deschise până când utilizatorul le eliberează dând clic pe OK, Cancel sau pe un alt buton. Pentru a face acest lucru, utilizați argumentul TimeOut de tip Variant cu metoda Show sau metoda Display. Specificați TimeOut ca un număr de unități, o unitate fiind aproximativ o miime de secundă. (Dacă sistemul este ocupat cu multe alte sarcini, rezultatul real poate fi o întârziere ceva mai lungă.) Așadar, puteți afișa pagina General a casetei de dialog Opțiuni Word timp de aproximativ 10 secunde - suficient de mult pentru ca utilizatorul să verifice setarea Name și schimbarea acesteia dacă este necesar - folosind următoarele comenzi:

With Dialogs(wdDialogToolsOptions)
.DefaultTab = wdDialogToolsOptionsTabUserInfo .Show (10000)
End With

Argumentul TimeOut nu lucrează cu casete de dialog particularizate

TimeOut nu funcționează cu casetele de dialog personalizate create de programator, doar cu casetele de dialog Word integrate. De asemenea, unele căsuțe de dialog Word încorporate - precum caseta de dialog New (wdDialogFile- New) și caseta de dialog Personalizare – Customize (wdDialogToolsCustomize) - nu recunosc nici ele opțiunea TimeOut.

Sincronizarea cu TimeOut a unei căsuțe de dialog este utilă în special pentru informații necritice, cum ar fi numele de utilizator din acest exemplu, deoarece permite procedura să continue, chiar dacă utilizatorul a părăsit computerul. De asemenea, se poate închide caseta de dialog Salvare în care procedura a sugerat un nume de fișier viabil, dar a permis utilizatorilor să o înlocuiască dacă au fost prezenți. Cu toate acestea, pentru o procedură în care introducerea utilizatorului este esențială, nu se va folosi argumentul TimeOut. În acest caz, utilizatorul va fi constrâns să răspundă făcând clic cel puțin pe un buton. În acest context, caseta de dialog nu ar trebui să dispară de la sine prin această tehnică de timeout.