Crearea și lucrul cu casetele de dialog complexe

Ar trebui să evitați să utilizați o casetă de dialog complexă atunci când una simplă face același lucru și este mai ușor pentru utilizatori să lucreze cu ea. Dacă o macrocomandă are nevoie doar de două casete de selectare și un grup de butoane de opțiuni, nu este necesar să folosiți mai multe pagini de control cu actualizare dinamică. Dar deseori, veți dori să creați căsuțe de dialog complexe pentru a oferi utilizatorilor flexibilitatea cerută de procedurile dvs.

Actualizarea unei casete de dialog pentru a reflecta alegerile utilizatorului

Este relativ ușor să schimbați un formular pentru a reflecta opțiunile pe care le alege utilizatorul. Instrumentul principal pentru a face acest lucru este evenimentul Click, la care reacționează majoritatea controalelor plasate pe un formular și la care se poate scrie cod în fereastra Code care este „în spatele” (asociată cu) formularul.

Când se face dublu clic pe un control dintr-un formular, se deschide fereastra Code pentru formularul respectiv și se afișează o procedură implicită Sub. Această procedură este asociată cu clic pe acel control.

Procedura este numită automat după numele controlului și evenimentul implicit al controlului. Dacă faceți dublu clic pe un buton de comandă, de exemplu, se deschide fereastra Cod cu evenimentul implicit Click al butonului:

Private Sub CommandButton1_Click()
End Sub

Orice cod pe care îl introduceți în această procedură va fi executat atunci când utilizatorul face clic pe acest buton de comandă.

Unele controale au alte evenimente implicite în loc de Click; evenimentul Change se folosește la căsuțe de dialog complexe și va fi descris ulterior.

Procedura din secțiunea următoare arată un exemplu de cod care actualizează o casetă de dialog în cazul în care utilizatorul face clic pe un buton din mai multe.

Afișarea unei părți ascunse dintr-un formular

Ascunderea unei părți dintr-un formular complex este o modalitate excelentă de a simplifica interacțiunea utilizatorului cu caseta de dialog. De exemplu, caseta de dialog Găsire și înlocuire (Find And Replace) din Word: când apare pentru prima dată (apăsând Ctrl + H sau cu clic pe pictograma Replace din secțiunea Edit, din fila Home a panglicii), este afișată doar partea din caseta de dialog pentru tipul cel mai obișnuit de căutare și înlocuire - doar ce se caută și cu ce se înlocuiește, împreună cu opțiunea de a înlocui pas cu pas sau tot.

Dar când sunt necesare opțiuni mai puțin obișnuite sau mai avansate pe care versiunea prescurtată a casetei de dialog Găsire și înlocuire nu le afișează implicit, se face clic pe butonul Mai multe (More) pentru a afișa partea de jos a casetei de dialog, ca în figura următoare.

Aici se află mai multe opțiuni care sunt utilizate mai rar.

Poate doriți să adoptați o abordare similară cu propriile căsuțe de dialog, ascunzând un subset de acțiuni de care, de cele mai multe ori, majoritatea utilizatorilor nu vor avea nevoie. Pentru a face acest lucru, puteți utiliza două tehnici, fie separat, fie în tandem:

  • Se setează proprietatea Visible la False pentru a ascunde controalele care se află în partea neafișată a casetei de dialog. Se setează proprietatea Visible la True pentru a afișa acele controale (după ce utilizatorul apasă pe butonul More sau alt declanșator).
  • Se cresc dimensiunile casetei de dialog (lungime, lățime sau ambele) pentru a afișa zona care conține controalele. Caseta de dialog Găsire și înlocuire folosește tehnica de mărire a proprietății Height pentru casetă.

Ca un exemplu simplu al acestei tehnici, se ia în considerare caseta de dialog prezentată în figura de mai jos. Când este afișată caseta de dialog, este vizibilă doar partea superioară; cu clic pe butonul Mai mult, este afișată partea de jos. Procedura care urmează după figură conține codul din spatele căsuței de dialog care face ca toate acestea să se întâmple.

Partea de sus a formularului Inventare oferă opțiunile strict necesare. Cu clic pe butonul Mai mult este afișat și restul casetei de dialog (afișată în partea de jos), care conține controale mai puțin folosite.

1. Private Sub UserForm_Initialize()
2.      frmInventories.Height = 120
3.  End Sub
4.   
5.  Private Sub cmdMore_Click()
6.    If cmdMore.Caption = "Mai putin <<" Then
7.       cmdMore.Caption = "Mai mult >>"
8.       cmdMore.Accelerator = "M"
9.       frmInventories.Height = 120
10.   Else
11.      frmInventories.Height = 240
12.      cmdMore.Caption = "<< Mai putin"
13.      cmdMore.Accelerator = "P"
14.      fraOptions.Enabled = True
15.   End If
16. End Sub
17.  
18. Private Sub chkArtNames_Click()
19.    If chkArtNames = True Then
20.       optFromDocument.Enabled = True
21.       optFromDocument = True
22.       optAutoNames.Enabled = True
23.    Else
24.       optFromDocument.Enabled = False
25.       optFromDocument = False
26.       optAutoNames.Enabled = False
27.       optAutoNames = False
28.    End If
29. End Sub
30.  
31. Private Sub cmdOK_Click()
32.   frmInventories.Hide
33.   Unload frmInventories
34.   'aici creare inventare
35. End Sub
36.  
37. Private Sub cmdCancel_Click()
38.    End
39. End Sub

Mai sus sunt cinci proceduri scurte care controlează comportamentul casetei de dialog:

UserForm_Initialize Inițializează caseta de dialog înainte de a fi afișată.

cmdMore_Click Rulează când este ap[sat butonul cmdMore. Acest buton gestionează caption Mai mult >> atunci când este afișată doar partea de sus a casetei de dialog și caption << Mai puțin când este afișată întreaga casetă de dialog.

chkArtNames_Click Rulează când este bifată caseta Nume fisiere.

cmdOK_Click Rulează la clic pe butonul OK.

cmdCancel Click Rulează cu clic pe butonul Cancel.

Iată ce se petrece în cod.

  • Procedura UserForm_Initialize setează proprietatea Height a formularului frmInventories la 120, care este suficientă pentru a afișa doar partea de sus a casetei de dialog. (Pentru a obține înălțimea corectă a casetei de dialog, se trage până la înălțimea potrivită și se observă proprietatea Height din fereastra Properties.) Această procedură este necesară doar dacă formularul este setat la înălțimea maximă în timpul proiectării. Prin setarea formularului la înălțimea de 120 în timpul proiectării, se poate evita folosirea procedurii UserForm_Initialize. Totuși, pentru un formular care are trei sau mai multe mărimi diferite – sau pentru un formular cu două mărimi diferite, una fiind aleasă în timpul executării programului în funcție de condițiile mediului – trebuie folosită o procedură UserForm_Initialize.
  • Procedura cmdMore_Click începe cu verificarea de pe linia 6, dacă proprietatea Caption a butonului de comandă cmdMore este <<Mai puțin. Dacă este așa, înseamnă că este afișată întreaga casetă de dialog. Linia 7 setează proprietatea Caption a butonului cmdMore la Mai mult >>, butonul care va fi folosit pentru a afișa partea de jos a ferestrei de dialog dacă este nevoie. Linia 8 setează proprietatea Accelerator a butonului cmdMore la M (pentru a alege tasta M din Mai mult ca tastă rapidă pentru buton). Linia 9 setează proprietatea Height a formularului frmInventories la 120, care este înălțimea cerută pentru a afișa doar partea de sus a casetei de dialog.

Proprietatea Caption funcționează, dar folosirea unei variabile de stare este considerată mai elegantă

Verificarea proprietății Caption a butonului cmdMore este o modalitate eficientă de a determina starea curentă a acestui formular (indiferent dacă este extins sau nu), dar aceasta nu este cea mai elegantă dintre tehnici. Este o formă de hard coding, considerată de mulți drept un mod greu de programare. În schimb, se poate păstra o variabilă de stare internă (o comutare Static) în sunt stocate informații despre caseta de dialog - dacă este afișată în starea completă sau în starea parțială. Utilizarea unei variabile interne de stare evită presupunerea că această legendă va rămâne întotdeauna aceeași. Codul nu ar funcționa corect, de exemplu, dacă formularul ar fi fost localizat la un moment dat (adaptat pentru o altă limbă locală, unde nu sunt folosite cuvintele Mai mult și Mai putin).

  • Dacă condiția de la linia 6 este False, execuția trece de la linia 6 la instrucțiunea Else din linia 10. Aceasta trebuie să însemne că proprietatea Caption a butonului cmdMore este deja setată la Mai mult >>, astfel că caseta de dialog este afișată în versiunea cu dimensiunea mai mică și cu clic pe butonul Mai mult >> se extinde din nou caseta de dialog. Linia 11 stabilește proprietatea Height a formularului la 249, afișând astfel și partea inferioară a casetei de dialog. Linia 12 schimbă proprietatea Caption a butonului de comandă cmdMore în <<Mai putin. Linia 13 stabilește proprietatea Accelerator a butonului de comandă cmdMore la P.
  • Linia 14 activează cadrul fraOptions (identificat ca Opțiuni în caseta de dialog și dezactivat în formularul de utilizator, la fel ca butonul de opțiune optFromDocument și butonul opțiune optAutoNames), făcând accesibil utilizatorului controlul pe care îl conține. Linia 16 încheie procedura cmdMore_Click.
  • Procedura chkArtNames_Click (linile de la 18 până la 29) este executată când este bifată caseta Nume fisiere. Această procedură activează și dezactivează butoanele radio de sub casetă. Linia 19 verifică dacă este bifată caseta chkArtNames. Dacă este bifată, sunt executate comenzile de pe liniile 20 până la 22. Linia 20 setează proprietatea Enabled a butonului radio optFrom Document (identificat ca preluate din document din caseta de dialog) la True, deci fiind activat, iar linia 21 selectează acest buton radio ca fiind implicit activat. Linia 22 activează optAutoNames, butonul radio identificat ca numite automat în caseta de dialog.
  • Dacă nu este bifată caseta chkArtNames, executarea comută la comanda Else de pe linia 23, care direcționează execuția la linia 24. Această linie setează proprietatea Enabled a butonului radio optFromDocument la False, dezactivându-l. Linia 25 deselectează butonul radio (chiar dacă este sau nu este activat). Linia 26 dezactivează butonul radio optAutoNames, iar linia 27 îl deselectează (și aici, chiar dacă este sau nu este selectat). Comanda End If de pe linia 28 încheie comanda If, ar linia 29 încheie procedura.
  • Procedura cmdOK_Click de pe liniile de la 31 până la 35 afișează începutul procedurii care rulează la clic pe butonul OK. Linia 32 ascunde caseta de dialog Inventare, iar linia 33 o elimină din memorie. Linia 34 conține un comentariu care explică crearea inventarelor care vor fi scrise aici.
  • Procedura cmdCancel_Click conține doar o instrucțiune End pentru a încheia procedura dacă utilizatorul alege butonul Cancel.

Urmărirea unei Proceduri într-un formular

Următorul nivel de complexitate în lucrul cu formularele este folosirea lor pentru a urmări diferitele etape ale unei proceduri și pentru a ghida utilizatorul cu privire la modul de lucru.

De exemplu, caseta de dialog Creare pagina web nouă pentru angajat ghidează utilizatorul printr-o procedură în patru etape pentru a crea o pagină web pentru un nou angajat.

Primul pas este identificarea angajatului care merită această onoare folosind fie lista derulantă, fie butonul Selectati alt angajat din cadrul pasului 1.

Al doilea pas este introducerea unui text introductiv, critic sau laudativ adecvat despre angajat.

Al treilea pas este de a selecta o fotografie a angajatului, care va fi inclusă în pagina web.

Al patrulea pas este salvarea paginii web într-un folder de pe intranetul companiei.

Când utilizatorul afișează prima dată caseta de dialog Creare pagina web nouă pentru angajat, va vedea versiunea casetei de dialog prezentată în figura de mai sus, cu pașii 2, 3 și 4 dezactivați și instrucțiunile pentru pasul 1 afișate în caseta Instrucțiuni din partea de sus.

Când utilizatorul urmărește instrucțiunile și selectează angajatul folosind fie lista derulantă casetă combo, fie butonul de comandă Selectati alt angajat, codul atașat la lista derulantă a casetei combo sau butonul de comandă activează cadrul pasului 2, activând caseta de text disponibilă utilizatorului.

Când utilizatorul trece la etapa a doua din caseta de dialog, apar modificări: indicațiile din cadrul etichetei Instructiuni au fost modificate și activarea casetei combo de la etapa 1 a activat cadrul din etapa 2.

Iată codul pentru evenimentul Change din caseta combo cmbSelectareAngajat; codul pentru evenimentul Click al butonului de comandă cmdSelectatiAltAngajat este similar, deși puțin mai complex.

Private Sub cmbSelectareAngajat_Change() 
lblNumeAngajat = cmbSelectareAngajat.Text 
fraPasul2.Enabled = True
lblInstructiuni = "Introduceti text in caseta text de la pasul 2. " & _
   "De exemplu, puteti scrie cateva informatii biografice" & _
   "despre angajat, detalii despre functia sa " & _
   "sau contributia sa in cadrul firmei."
cmdClearEmployeeName.Enabled = True 
End Sub

Butonul Selectati alt angajat din caseta de dialog se poate încheia cu trei puncte (...), ca și alte butoane de comandă.

Aceste trei puncte este convenția Windows care indică că această alegere (aici, butonul de comandă, dar și în alt context) va afișa o altă casetă de dialog în loc să execute imediat o acțiune.

Iată modificările care apar când utilizatorul completează etapa 1 din caseta de dialog:

  • Se modifică textul din eticheta casetei Instructiuni din partea de sus a casetei de dialog pentru a afișa informații despre etapa 2 a procedurii.
  • Numele angajatului ales este afișat deasupra etichetei Angajat din cadrul 1.
  • Este activat cadrul pentru etapa 2 (caseta text este activată în cadru).

Folosirea casetelor de dialog Multipagini și a controalelor TabStrip

VBA include un control MultiPage, care activează crearea mai multor casete de dialog pe mai multe pagini, și un control TabStrip, care permite crearea casetelor de dialog din TabStrips (similare tab-urilor de pe panglica aplicațiilor Office). Ați utilizat aproape sigur căsuțele de dialog cu mai multe pagini (dacă nu sunteți sigur care sunt acestea, apăsați Ctrl + D în Word pentru a deschide caseta de dialog Font și pentru a vedea un exemplu de astfel de casetă). Puteți accesa orice pagină (pe rând) făcând clic pe fila din partea de sus a paginii. Fiecare pagină conține un set diferit de controale și poate avea un aspect diferit adecvat scopului paginii.

Un Tab nu este o Pagină

Tab-ul este pătratul mic care se află în partea de sus a paginii, nu pe întreaga pagină. Multe persoane se referă la pagini ca „tab-uri”, deoarece tab-ul este partea pe care faceți clic pentru a accesa pagina. Este perfect în regulă să folosiți acești termeni în mod interschimbabil, dar aici tab înseamnă doar componenta și pagina pentru a face referire la acea pagină.

Casetele de dialog multipagini sunt folosite pentru a afișa o mulțime de informații într-un singur formular, fără ca acestea să umple întregul ecran. Informațiile pot fi împărțite în seturi discrete de informații conexe pentru a le încadra în pagini. Fiecare pagină poate (și ar trebui) să aibă un aspect diferit de controale care guvernează comportamentul elementelor discrete; paginile sunt în mod normal împărțite după temă sau scop.

La fel ca și caseta de dialog Font din aplicațiile Office, care are un tab Font și un tab Advanced sau ca și caseta de dialog Tools>Options din editorul VBA.

O casetă de dialog care folosește un TabStrip diferă de o casetă de dialog cu mai multe pagini, deoarece conține un control TabStrip care conține mai multe tab-uri, dar nu mai multe pagini. DIn punctul de vedere al utilizatorului, pare că sunt afișate diferite pagini, dar aspectul efectiv al controalelor din caseta de dialog nu se schimbă. Indiferent de fila de pe TabStrip care este selectată, setul de controale rămâne același, deși datele afișate în comenzi se schimbă. Această abordare este utilă pentru afișarea înregistrărilor dintr-o bază de date. Tab-urile comută doar la o altă înregistrare.

TabStrips sunt utile atunci când trebuie să afișați seturi de informații consistente, cum ar fi înregistrările cu clienții companiei. Fiecare înregistrare are același set de câmpuri (analog cu coloanele dintr-o bază de date): un număr de cont, un nume (poate mai multe), o adresă, numere de telefon, adrese de e-mail, adrese URL, istoricul comenzilor, soldul contului și altele.

Prin urmare, puteți utiliza același set de comenzi (de exemplu, casete de text și etichete) pentru a afișa informațiile pentru fiecare înregistrare. Controlul TabStrip reglementează setul de informații al clientului care este afișat în ele. Deoarece puține baze de date au un număr mic și fix de înregistrări, va trebui să populați TabStrip din mers (în timpul execuției) cu file și titluri.

În secțiunea Crearea unei casete de dialog personalizate sunt explicate proprietățile unice ale controalelor TabStrip și MultiPage.

Folosirea casetelor de dialog Multipage

Limitarea numărului de pagini din casetele de dialog Multipage

Puteți crea căsuțe de dialog care conțin zeci de tab-uri (file) sau zeci de pagini. Și dacă rămâneți fără spațiu orizontal pentru a afișa filele, Editorul VBA adaugă o bară de defilare pentru a permite utilizatorului să parcurgă filele. Cu toate acestea, casetele de dialog cu foarte multe tab-uri nu sunt folosite în practică. Și, fără îndoială, nu tot ceea ce este posibil este și de dorit.

Se recomandă ca numărul de pagini din căsuțele de dialog să fie maxim 10 sau 12 pagini, deoarece e posibil ca prea multe informații să copleșească utilizatorul.

Dacă aveți nevoie de mai multe pagini pentru a organiza informațiile într-o casetă de dialog, luați în considerare o modalitate alternativă de afișare. (Cel mai probabil, ar trebui să subdivizați informațiile în categorii mai mici, mai ușor de gestionat.) De exemplu, Microsoft petrece nenumărate ore timp de mai mulți ani testând grupuri de utilizatori și observând comportamentul oamenilor atunci când folosesc Word. Un rezultat este că proiectanții Microsoft subdivizează sarcinile și interacțiunea utilizatorilor în diverse subcategorii.

Faceți clic pe fila Layout (Aspect) din panglica Word. Se pot observa că numeroasele comenzi din această categorie sunt subdivizate în zone logice: Configurare pagină, Paragraf și Aranjament. Ba mai mult, două dintre aceste subcategorii - Configurare pagină și Paragraf - afișează pictograme mici (o casetă cu o săgeată neagră) în colțul din dreapta jos. Făcând clic pe aceste pictograme se deschide o casetă de dialog separată cu opțiuni suplimentare, utilizate mai rar.

Tab-urile sunt diferite. Dacă utilizați un TabStrip pentru a vă deplasa prin înregistrările dintr-un set de înregistrări al bazei de date, e posibil să fie nevoie de mai multe tab-uri (file) într-un tabStrip. Dacă numărul de file nu este absurd de mare, acest lucru nu ar trebui să fie o problemă. Cu toate acestea, o soluție mai bună de gestionare a unei baze de date ar putea fi trecerea la unul dintre cele mai robuste, controale de interfață de utilizator legate de baza de date specializate disponibile în Access, Visual Basic Express sau Visual Basic .NET. Pentru mai multe informații despre diverse produse Visual Studio 2015, consultați www.visualstudio.com/en-us

Pentru crearea unei casete de dialog multipagini, clic pe pictograma MultiPage din Toolbox, apoi click în formular unde ar trebui să apară acel control. VBA Editor plasează un control MultiPage cu două pagini și etichete numite Page 1 și Page 2. Controlul poate fi mutat și redimensionat. De obicei controlul MultiPage este mai mic decât formularul care îl conține (ca în majoritatea casetelor de dialog din aplicațiile Windows).

După crearea unui controlul MultiPage, se poate lucra pe o pagină cu clic dreapta pe tab și folosirea meniului contextual:

  • Pentru a adăuga o altă pagină clic dreapta pe etichetă și alegerea opțiunii New Page din meniul contextual. VBA va adăuga o pagină nouă de mărime implicită și o va numi Pagen, unde n este următorul număr care urmează (chiar dacă sunt redenumite altfel decât Page1, Page2 etc.).
  • Pentru a redenumi o pagină într-un control MultiPage, clic dreapta pe etichetă și alegerea opțiunii Rename din meniul opțional. În caseta de dialog Rename, se introduce numele - caption (textul label) pentru acea pagină în caseta text Caption, tasta rapidă în caseta text Accelerator Key și textul ajutător pentru acel control (pe care utilizatorul îl vede dacă mută cursorul mausului peste acel tab al paginii) din caseta test Control Tip Text. Click pe butonul OK pentru a închide caseta de dialog Rename.
  • Pentru a șterge o pagină din controlul MultiPage, clic dreapta pe etichetă și se alege Delete Page din meniul contextual. VBA Editor va șterge pagina fără a mai cere altă confirmare.
  • Pentru a muta o pagină în alt loc al controlului MultiPage, clic dreapta pe etichetă și alegerea opțiunii Move din meniul contextual pentru a afișa caseta de dialog Page Order. În caseta Page Order, se selectează pagina sau paginile care vor fi mutate (Shift+click pentru a selecta mai multe pagini alăturate, Ctrl+click pentru a selecta pagini care nu sunt alăturate), apoi se folosesc butoanele Move Up și Move Down pentru rearanjarea paginii sau paginilor. La sfârșitul operației, clic pe butonul OK pentru a închide caseta de dialog Page Order.
  • Pentru a specifica pagina afișată implicit din caseta de dialog multipage, se folosește proprietatea Value din controlul MultiPage. Această proprietate poate fi setată fie în timpul proiectării, fie al execuției. De exemplu, se poate folosi o procedură de inițializare ca și cea afișată aici pentru a afișa a treia pagină (identificată cu valoarea 2, deoarece numerotarea paginilor începe de la 0) din controlul MultiPage numit MyMulti în timpul execuției:
Sub UserForm_Initialize()
MyMulti.Value = 2 
End Sub

După crearea unei casete de dialog multipagini, aici se pot adăuga diferite controale. Fiecare control trebuie să aibă un nume unic în acel formular (nu doar în caseta în care apare).

La proiectarea unei casete de dialog multipagini, se ține cont de următoarele:

  • Care este modul de împărțire a informației sau opțiunilor din caseta de dialog? Care informații pot fi grupate împreună?
  • Care controale pot să apară pe fiecare pagină? Majoritatea casetelor de dialog au nevoie de cel puțin două butoane de comandă, cum ar fi OK și Cancel (sau End sau Close – disponibile în fiecare pagină pentru a permite utilizatorului să închidă caseta dialog de pe oricare pagină deschisă.
  • În cazuri rare, poate doriți să forțați utilizatorul să revină la o anumită pagină pentru a închide o casetă de dialog. În aceste cazuri, asigurați-vă că fiecare pagină care nu conține un buton de comandă pentru a respinge caseta de dialog spune utilizatorului unde va găsi un astfel de buton de comandă.
  • Pentru setări, trebuie să aveți un buton Apply (precum și un buton OK) pentru a aplica modificările pe o anumită pagină fără a închide caseta de dialog?
  • Deoarece fiecare control dintr-un formular multipage are un nume unic, la returnarea informațiilor dintr-o casetă de dialog multipagini trebuie să specificați doar obiectul relevant - nu trebuie să specificați pe ce pagină este.

Majoritatea proprietăților controlului MultiPage sunt simple, dar câteva merită menționate în mod special:

  • Proprietatea Style oferă fmStyleTabs (setarea implicită, care arată filele pentru navigarea între pagini), fmStyleButtons (care adaugă fiecărei pagini câte un buton dreptunghiular, cu butonul pentru pagina curentă care apare apăsat), sau fmStyleNone (care nu oferă niciun mijloc de navigarea între pagini și nici o indicație a marginilor casetei de dialog multipage). fmStyleNone poate fi util pentru crearea formularelor de utilizator care au două sau mai multe machete alternative dintre care utilizatorul va avea nevoie doar să le vadă pe rând. Prin includerea unui set de controale pe o pagină a casetei de dialog multipagini și a unui alt set de controale într-o altă pagină, puteți prezenta două căsuțe de dialog aparent diferite, nefăcând altceva decât să schimbați ce pagină a controlului MultiPage este afișată. De exemplu, puteți utiliza această tehnică pentru a crea unul dintre acei "vrăjitori" care ghidează utilizatorul printr-un proces cu mai multe etape. Trebuie doar să adăugați un buton Următorul pe care fac clic pentru a trece la următorul pas.
  • Proprietatea TabOrientation controlează unde apar filele (sau butoanele) pentru pagini pe control. Opțiunile sunt fmTabOrientationTop (setarea implicită, plasarea filelor în partea de sus a controlului), fmTabOrientationBottom, fmTabOrientationLeft și fmTabOrientationRight. Experimentați cu efectele pe care le oferă orientările de jos, stânga și dreapta, dar dacă nu oferă avantaje semnificative asupra orientării superioare mai normale, folosiți-le cu grijă - sau deloc. Utilizatorii nu vă vor mulțumi pentru abaterea inutilă de la interfața tradițională, familiară.
  • Proprietatea MultiRow controlează dacă un control MultiPage are un rând de file pentru paginile sale (False) sau mai multe rânduri (True). Când aveți setat MultiRow pe True, Editorul VBA adaugă al doilea rând sau următoarele rânduri de file când rămâneți fără spațiu pe primul rând sau pe rândul curent.

Controlul MultiPage nu trebuie să preia întreaga casetă de dialog - de fapt, majoritatea casetelor de dialog păstrează butoanele cheie de comandă, cum ar fi OK și Anulare în afara zonei multipage, astfel încât acestea să fie disponibile utilizatorului indiferent de pagina accesată de utilizator.

Acestea fiind spuse, este de obicei o idee bună să faceți un control MultiPage pe partea dominantă a unei casete de dialog. Într-o casetă de dialog complexă și aglomerată, un control MultiPage mic poate părea a fi mai mult o casetă de grup, iar utilizatorul poate omite filele, mai ales dacă acesta parcurge în grabă controalele, în căutarea unei anumite opțiuni.

Folosirea controlului TabStrip

Formularele care folosesc un TabStrip sunt substanțial diferite de căsuțele de dialog cu mai multe pagini. Un control TabStrip poate fi utilizat nu pentru a rearanja alte controale, ci doar pentru a schimba datele care apar pe măsură ce utilizatorul trece de la un set de date la altul. Cu alte cuvinte, aspectul comenzilor rămâne static. Doar valorile afișate în comenzi se schimbă de la o pagină la alta.

De exemplu, puteți utiliza o casetă de dialog cu un TabStrip pentru a vizualiza și actualiza înregistrările dintr-o sursă de date, cum ar fi un tabel Word, o foaie de calcul Excel sau o bază de date Access. Exemplul următor folosește un registru de lucru Excel în care informațiile sunt stocate pe o serie de foi de lucru.

Banda efectivă cu file dintr-un control TabStrip poate apărea mai sus, mai jos sau pe lângă controalele pe care le conține. Poziția convențională - și implicită - este în partea de sus, la fel ca la casetele de rețete și sertarele pentru fișiere reale. Dar pot exista și file verticale și în partea de jos în aplicațiile Windows excentrice. Ca și în cazul controlului MultiPage, utilizați proprietatea TabOrientation a controlului TabStrip pentru a specifica dacă TabStrip ar trebui să apară în partea de sus, jos, stânga sau dreapta a controlului său. Dar asigurați-vă că aveți un motiv destul de bun dacă vă abateți de la convenție. Poziția în partea de sus este de așteptat și are sens.

TabStrip poate conține zero, una sau mai multe file. În cele mai multe cazuri, nu prea are rost să ai o singură filă pe un TabStrip și cu atât mai puțin să nu ai deloc o filă. Dar dacă populați dinamic TabStrip cu filele din procedurile dvs. (așa cum urmează să faceți în exemplul următor) și creați o filă pentru fiecare înregistrare găsită, este posibil să vă confruntați cu o singură înregistrare și, astfel, cu o casetă de dialog. cu o singură filă - sau chiar un TabStrip fără file.

Faceți clic pe butonul TabStrip din caseta de instrumente, faceți clic în formular pentru a plasa TabStrip, apoi trageți-l la o dimensiune corespunzătoare. Rețineți că un TabStrip este doar un afișaj vizual în beneficiul utilizatorului. Spre deosebire de controlul MultiPage, stabiliți cu ajutorul codului conexiunea logică între TabStrip și celelalte controale. Puteți adăuga, redenumi, muta și șterge filele în același mod în care se lucrează cu paginile dintr-un control MultiPage.

După construirea formularului, scrieți codul care va permite TabStrip să afișeze conținutul celorlalte controale. Mai jos este prezentat codul pentru TabStrip din caseta de dialog Angajati.

Acest TabStrip se numește tabSurfer, iar codul funcționează cu evenimentul său Change - procedura evenimentului care se declanșează (este declanșat și execută codul său) atunci când utilizatorul face clic pe o nouă filă pe bandă.

1. Private Sub tabSurfer_Change()
2.   If blnInitializing = False Then
3.     With ActiveWorkbook.Sheets(tabSurfer.Value + 1)
4.     'incarca continutul foii de lucru care corespunde tab-ului ales
5.      .Activate
6.      txtFirstName.Text = .Cells(1, 2).Text
7.      txtInitial.Text = .Cells(2, 2).Text
8.      txtLastName.Text = .Cells(3, 2).Text
9.      txtAddress1.Text = .Cells(4, 2).Text
10.     txtAddress2.Text = .Cells(5, 2).Text
11.     txtCity.Text = .Cells(6, 2).Text
12.     txtState.Text = .Cells(7, 2)
13.     txtZip.Text = .Cells(8, 2).Text
14.     txtHomeArea.Text = .Cells(9, 2).Text
15.     txtHomePhone.Text = .Cells(10, 2).Text
16.     txtWorkArea.Text = .Cells(11, 2).Text
17.     txtWorkPhone.Text = .Cells(12, 2).Text
18.     txtWorkExtension.Text = .Cells(13, 2).Text
19.     txtEmail.Text = .Cells(14, 2).Text
20.    End With
21.  End If
22. End Sub

După specificarea fișei de lucru, codul de mai sus se repetă în esență pentru fiecare dintre casetele de text care apar în caseta de dialog Angajati. Această casetă de dialog funcționează cu o sursă de date preluată dintr-o foaie de calcul Excel din registrul de lucru activ.

Fiecare foaie de lucru din registrul de lucru conține o înregistrare a unui client, numele clientului apărând în fila foii de lucru și datele clientului apar în a doua coloană: prenumele în prima celulă din coloana a doua, inițiala în a doua celulă , numele din cel de-al treilea celulă și așa mai departe pentru adresă, numere de telefon (atât de acasă, cât și de la serviciu) și adresa de e-mail. Așadar, pentru a obține orice informație, trebuie să cunoașteți foaia de lucru în cauză și celula corespunzătoare.

Iată cum funcționează codul:

  • Linia 1 declară procedura tabSurfer_Change, care se execută automat de fiecare dată când se declanșează evenimentul Change al tabSurfer TabStrip. Evenimentul Change se declanșează de fiecare dată când utilizatorul face clic pe o nouă filă, astfel încât utilizați acest eveniment pentru a controla informațiile afișate în casetele de text.
  • Evenimentul Change se declanșează și atunci când o filă este adăugată (sau eliminată) din TabStrip. Deoarece formularul DataSurfer folosește procedura de eveniment Initialize pentru a adăuga file în TabStrip (cîte unul pe foaia de lucru din registrul de lucru), trebuie să împiedicați rularea procedurii de modificare inutilă în faza de inițializare a programului. Deci, formularul de utilizator declară o variabilă Booleană privată numită blnInitializing pe care procedura Initialize setează la True în timp ce rulează și la False chiar înainte de a se termina.
  • Linia 2 din procedura de modificare a evenimentului verifică pentru a se asigura că blnInitializing este False. Dacă nu, procedura Initialize a declanșat evenimentul, iar procedura Change nu trebuie să încarce informațiile în celule - deci execuția continuă la linia 21, chiar înainte de sfârșitul procedurii. Dar, odată ce procedura de inițializare s-a terminat de executat, blnInitializing va fi setată la False, iar procedura pentru evenimentul Change se va rula de fiecare dată când utilizatorul schimbă filele din TabStrip.
  • Linia 3 începe o instrucțiune With care funcționează cu foaia de lucru corespunzătoare din registrul de lucru activ: (ActiveWorkbook.Sheets (tabSurfer.Value + 1). Proprietatea Value a tabSurfer TabStrip ne spune ce filă din TabStrip este selectată. Deoarece prima filă în TabStrip este numerotată cu 0 și prima foaie de lucru din cartea de lucru este numerotată 1 cu, trebuie să adăugați 1 la Value pentru TabStrip chiar și la numere.
  • Linia 4 este un comentariu. Linia 5 utilizează metoda Activate pentru a activa foaia de lucru în cauză.
  • Liniile de la 6 până la 19 setează proprietatea Text a fiecărei casete de text din formular la conținutul celulei corespunzătoare din a doua coloană din foaia de lucru. De exemplu, linia 6 stabilește proprietatea Text a casetei de text txtFirstName (care apare sub eticheta Prenume în caseta de dialog) în conținutul primei celule din a doua coloană: .Cells(1, 2).Text.
  • Linia 20 încheie instrucțiunea With, linia 21 încheie instrucțiunea If, iar linia 22 încheie procedura.

Folosirea imaginilor în Formulare

VBA include funcții grafice extinse care permit ca formularele să arate bine. Folosind Format>Order, controalele se pot aranja unul peste altul. Controale precum butonul de comandă au proprietăți pentru imagine, la fel ca și formularele. În figura următoare este afișat un control cu o imagine care afișează o fotografie, o textură de fundal (încărcată în proprietatea Picture a formularului) și un buton de comandă care se confundă cu fundalul (deoarece proprietatea BackStyle este setată la Transparent).

Pentru a utiliza un control Image, faceți clic pe butonul Image din caseta de instrumente, apoi faceți clic în formular unde doriți să apară controlul Image.

După ce ați plasat controlul Image, puteți să măriți și să mutați poza la fel cum ați face cu orice alt control.

Asigurați-vă că imaginea pe care o alegeți pentru un control de imagine sau pentru fundalul unui formular este disponibilă pentru toate computerele care vor afișa caseta de dialog. Dacă imaginea nu este disponibilă, ea nu apare în caseta de dialog, ceea ce afectează efectul.

Pentru a alege imaginea care va apărea în controlul Image, selectați proprietatea Picture în fereastra Proprietăți și faceți clic pe butonul cu trei puncte care apare apoi în dreapta intrării. Editorul VBA afișează caseta de dialog Load Picture. Selectați fișierul imagine și alegeți butonul Open. Proprietatea Picture din fereastra Proprietăți înregistrează tipul de imagine selectat - cum ar fi Bitmap - dar nu și numele fișierului, iar imaginea apare în controlul Image, astfel încât să puteți vedea dacă are o dimensiune adecvată.

Când specificați imaginea pentru un control Image în mod programatic (imaginea este încărcată în timp ce se execută macrocomanda, în timpul rulării), trebuie să utilizați o instrucțiune LoadPicture. Comparați acest lucru cu modul în care, la programare (timpul de proiectare), puteți utiliza pur și simplu fereastra Proprietăți pentru a atribui o imagine proprietății Picture a controlului Image. LoadPicture are următoarea sintaxă:

LoadPicture filename, [WidthDesired], [HeightDesired]

filename este un argument de tip String care specifică numele fișierului de imagine care trebuie încărcat în controlul Image.

WidthDesired este un argument de tip Long opțional care specifică lățimea imaginii în twips și

HeightDesired este un argument de tip Long opțional care specifică înălțimea imaginii.

De exemplu, următoarea comandă încarcă imaginea numită Rose.jpg care se află pe partiția c:\

Image1.Picture = LoadPicture("C:\rose.jpg")

După ce ați ales poza, aveți diverse opțiuni pentru poziționarea și formatarea acesteia:

  • Dacă este necesar, setați alinierea imaginii folosind proprietatea PictureAlignment.
  • (Dacă imaginea umple complet controlul de imagine - nu se suprapune și nici nu lasă părțile goale - este posibil să nu fie necesar să setați alinierea pentru aceasta.) Tabelul următor prezintă constantele și valorile pentru proprietatea PictureAlignment.
  • Dacă este necesar, decupați, întindeți sau măriți imaginea folosind proprietatea PictureSizeMode: fmPictureSizeModeClip (0) decupează imaginea pentru a se potrivi cu controlul imaginii; fmPictureSize- ModeStretch (1) întinde sau strânge imaginea astfel încât să se potrivească cu controlul de imagine (această opțiune are adesea efecte ciudate); și fmPictureSizeModeZoom (2) mărește sau reduce imaginea astfel încât dimensiunea cea mai apropiată să se potrivească exact lățimii sau înălțimii controlului de imagine, fără a schimba proporțiile imaginii (această opțiune lasă de obicei un gol neocupat pe cealaltă latură).
  • Dacă trebuie să repetați imaginea pentru a ocupa spațiul rămas gol în control, setați proprietatea PictureTiling la True. Această opțiune este rar folosită în lucrul în baza de date.
  • Dacă trebuie să ajustați poziția imaginii în raport cu textul - caption, setați proprietatea PicturePosition din caseta de selectare, butonul de comandă, eticheta, butonul de opțiune sau butonul de comutare în cauză. Tabelul de mai jos prezintă constantele și valorile pentru PicturePosition.

Constante și valori pentru proprietatea PictureAlignment

Constante și valori pentru proprietatea PicturePosition

După ce ați plasat, dimensionat și formatat o imagine, există diverse posibilități aceea ce puteți face cu ea, cum ar fi utilizarea evenimentului Click al imaginii pentru a declanșa o acțiune. De exemplu, puteți afișa două grafice care ilustrează alegerea a două formate pentru un document. Apoi, utilizatorul ar putea face clic pe fotografia corespunzătoare pentru a semnala alegerea.

Crearea unei casete de dialog Modeless

Folosim versiunea VBA 7.1, dar începând cu versiunea 6, VBA oferă programatorului o opțiune de a crea o casetă de dialog nemodale - modeless, pe care utilizatorii o pot lăsa pe ecran în timp ce continuă să lucreze în aplicația lor. Cu alte cuvinte, la o casetă de dialog modală, utilizatorul trebuie să facă clic pe butonul OK sau Anulare sau să închidă caseta de dialog înainte de a putea să interacționeze cu aplicația sa.

Fără îndoială, sunteți familiarizați cu casetele de dialog modeless în lucrul cu aplicațiile Office. De exemplu, caseta de dialog (Find And Replace) din Access, Word și Excel este modeless, la fel și caseta de dialog Replace din PowerPoint.

Atunci când afișați una dintre aceste căsuțe de dialog modeless, aceasta preia focalizarea la fel ca orice casetă de dialog modală (orice tastați pe tastatură apare în fereastra cu focalizarea curentă).

Dar puteți face clic pe fereastra aplicației pentru a transfera focalizarea înapoi la acea fereastră. De exemplu, puteți continua să tastați într-un document Word, chiar dacă caseta de dialog Find And Replace rămâne vizibilă.

Crearea unei casete de dialog modeless se face prin setarea proprietății ShowModal a formularului la False în loc de setarea implicită True.

Există diferite situații în care s-ar putea să doriți să utilizați o casetă de dialog modeless, în loc de una modală. De exemplu, puteți crea o procedură și o casetă de dialog în Word care colectează informații de la utilizator pentru o notă sau un raport. Făcând caseta de dialog modeless, puteți permite utilizatorului să copieze informațiile dintr-un document deschis (sau să deschidă alte documente și să adune informații din acestea) și să le adauge în caseta de dialog, astfel utilizatorii nemaifiind nevoiți să copieze informațiile înainte de a deschide caseta de dialog și permițându-le să copieze cu ușurință mai multe elemente separate. De asemenea, puteți crea un formular modeless (poate avea forma unei bare de instrumente) pe care utilizatorii ar putea să-l țină pe ecran și să-l folosească pentru a introduce automat textul în secțiuni predefinite a trei sau patru alte documente, fără a-și pierde locul în documentul curent.

Puteți utiliza, de asemenea, căsuțe de dialog modeless pentru a afișa seturi complexe de formulare interrelaționate în care utilizatorul trebuie să copieze și să insereze informații dintr-un formular în altul sau cel puțin pentru a accesa diferite zone a două sau mai multe formulare afișate în același timp. Afișarea mai multor formulare simultan poate fi confuză pentru utilizator, dar uneori puteți considera că este necesar.

De cele mai multe ori, probabil că veți dori să utilizați casetele de dialog modale în procedurile VBA. Cu casetele de dialog modale, utilizatorii trebuie să se ocupe de caseta de dialog înainte de a putea continua să lucreze în aplicație și nu există riscul ca acestea să ajungă la mai multe căsuțe de dialog împrăștiate pe ecran și nefolosite.

Puteți folosi casete de dialog Seriale Modale

Nu puteți afișa în același timp atât formulare modale, cât și nemodale (modeless), dar puteți afișa o casetă de dialog modală într-o altă casetă de dialog modală. Când utilizatorii închid cea de-a doua casetă de dialog modală, VBA revine în mod implicit la prima casetă de dialog modală. Dar puteți scrie cod pentru a face ca după închiderea celei de a doua casete de dialog modale să se închidă automat și prima casetă de dialog.

Specificarea locației unui formular pe ecran

În mod implicit, VBA centrează pe cât posibil casetele de dialog pe mijlocul ferestrei aplicației, acesta fiind comportamentul normal pentru aplicațiile Windows. Dacă doriți să poziționați un formular în altă parte pe ecran (de exemplu, pentru a evita să ascundeți date importante de pe ecran), setați proprietatea StartUpPosition pentru formular. Tabelul următor explică setările pe care le puteți utiliza.

Setări pentru proprietatea StartUpPosition