Folosirea evenimentelor pentru a controla formulare

Această secțiune discută evenimentele încorporate în VBA care pot fi utilizate cu formulare și cu controale individuale pentru a oferi programatorului un control fin asupra modului în care se comportă formularele.

Până acum au fost folosite trei dintre cele mai utile evenimente:

  • Evenimentul Initialize, care adaugă elemente în casetele de listă chiar înainte de încărcarea unui formular și ajustează numărul de file de pe un tabStrip.
  • Evenimentul Click, care acționează atunci când utilizatorul face clic pe un anumit control într-un formular de utilizator. Până acum s-a folosit Clic în principal pentru butoanele de comandă, dar poate fi folosit pentru aproape orice control, inclusiv pentru formularul în sine.
  • Evenimentul Change, care controlează ce se întâmplă când utilizatorul schimbă fila afișată pe un TabStrip.

Tabelul următor prezintă evenimentele pe care le suportă VBA și obiectele și controalele cu care fiecare poate fi utilizat.

Cuvântul cheie ByVal este utilizat pentru a trece argumente între proceduri. Când este folosit cu formulare, poate returna obiecte ReturnBoolean, ReturnEffect, ReturnInteger și Returnstring.

După cum vedeți, evenimentele VBA se încadrează în mai multe categorii, care sunt discutate în secțiunile următoare în ordinea descrescătoare a utilității:

  • Evenimente care se aplică numai obiectului UserForm
  • Evenimente care se aplică obiectului UserForm și altor obiecte de container (cum ar fi controlul Frame și controlul MultiPage)
  • Evenimente care se aplică la multe sau la majoritatea controalelor, inclusiv uneori și la obiectul UserForm
  • Evenimente care se aplică numai la câteva controale.

Evenimente Unice pentru obiectul UserForm

This section discusses the events that are unique to the UserForm object. These are the Initialize, QueryClose, Activate, Deactivate, Resize, and Terminate events.

Evenimentul Initialize

Un eveniment Initialize are loc atunci când formularul de utilizator este încărcat, dar înainte să apară pe ecran.

Sintaxa VBA pentru evenimentul Initialize este următoarea, unde formularul este un obiect UserForm valid:

Private Sub userform_Initialize()

Utilizările obișnuite pentru evenimentul Initialize includ recuperarea informațiilor - dintr-o bază de date, un set de foi de lucru sau orice altceva - de care are nevoie formularul sau aplicația utilizatorului și atribuirea informațiilor pentru controalele din formularul de utilizator (în special controalele ListBox și ComboBox, cărora adeseori trebuie să le adăugați informațiile în timpul de execuție și nu la momentul proiectării).

În funcție de stilul și complexitatea formularelor, puteți dori, de asemenea, să utilizați evenimentul Initialize pentru redimensionarea formularului de utilizator, redimensionarea controalelor pe formular, afișarea sau ascunderea controalelor specifice și, în general, pentru a verifica dacă formularul corespunde cât mai mult nevoilor utilizatorului înainte de afișarea acestuia.

Evenimentul QueryClose

Evenimentul QueryClose se aplică numai la obiectul UserForm. Apare înainte de închiderea formularului.

Sintaxa pentru evenimentul QueryClose este următoarea:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

Aici, Cancel este o valoare întreagă, de obicei 0 (zero). O valoare diferită de zero împiedică declanșarea evenimentului QueryClose și oprește închiderea formularului (și aplicației).

CloseMode este o valoare sau o constantă care e cauza evenimentului QueryClose. Tabelul următor arată valorile și constantele pentru CloseMode.

La prima vedere, este posibil ca QueryClose să aibă câteva utilizări, dincolo de verificarea dublă a faptului că utilizatorii doresc cu adevărat să închidă un formular care așteaptă să fie închis. Să presupunem că utilizatorul a introdus o mulțime de date într-un formular pe care urma să îl închidă. Este posibil să doriți să verificați dacă nu au făcut din greșeală clic pe butonul Închidere sau pe butonul de anulare a formularului de utilizator, așa cum este ilustrat în următorul fragment de cod pentru Word:

Private Sub UserForm_QueryClose(Cancel As Integer, _
   CloseMode As Integer)
   'se verifică dacă utilizatorul vrea să închidă formularul 
   'dacă au introdus informații în formular 
   Select Case CloseMode 
   Case 0
   'utilizatorul a facut clic pe butonul Close sau a invocat comanda Unload 
   'dacă caseta text conține mai mult de 5 caractere, se cere salvarea lui
   If Len(txtDescription.Text) > 5 Then
   If MsgBox("Caseta text Description contine " & _
      " o cantitate semnificativă de text." & vbCr & _
      "Doriti sa salvati acest text?", vbYesNo + _ 
      vbQuestion, "Close Form") <> 0 
   Then Documents.Add
   Selection.TypeText txtDescription.Text ActiveDocument.SaveAs _
      "c:\temp\Temporary Description.docm"
   MsgBox "Continutul casetei text Description" & _
      "a fost salvat in " & _
      "c:\temp\Descriere temporara.docm.", _ 
      vbOKOnly + vbInformation, _
      "Formular Informatie Salvata"
   End If 
  End If

Cu toate acestea, evenimentul QueryClose este folosit la propriu când întreaga aplicație, nu doar formularul, se închide. Dacă formularul este modeless, este posibil ca utilizatorii să nu fie conștienți că acesta este încă deschis și sunt pe cale să piardă datele pe care le-au introdus sau opțiunile pe care le-au selectat.

Uneori este posibil să folosiți QueryClose pentru a salva informațiile dintr-un formular atunci când aplicația a încetat să mai răspundă și este închisă de Windows sau de Task Manager.

Însă înregistrarea QueryClose nu este perfectă - uneori codul nu va rula.

Pentru a opri închiderea unei aplicații, setați proprietatea Cancel a evenimentului QueryClose la True.

Evenimentul Activate

Evenimentul Activate se declanșează atunci când formularul devine fereastra activă. De obicei, aceasta înseamnă că evenimentul se declanșează atunci când este afișat formularul, care apare imediat după evenimentul Initialize, dacă formularul este încărcat de o declarație Show, în locul instrucțiunii Load.

Rețineți că, dacă formularul este încărcat folosind o declarație Load înainte de a fi afișat cu instrucțiunea Show, evenimentul Initialize se declanșează după instrucțiunea Load. Evenimentul Activate, care vine după declarația Show, se declanșează mai târziu.

Cu toate acestea, evenimentul Activate se declanșează și atunci când formularul este reactivat după ce prima dată a fost dezactivat. De exemplu, dacă creați un formular modeless cu o procedură de activare a evenimentului, codul este executat de fiecare dată când utilizatorul reactivează formularul după ce l-a dezactivat (de exemplu, lucrând în fereastra aplicației). De asemenea, dacă afișați un formular care provine din altul și apoi închideți al doilea formular, readucînd focalizarea la primul formular și reactivarea acestuia, evenimentul Activate se declanșează din nou.

Sintaxa evenimentului Activate este următoarea:

Private Sub UserForm_Activate()

ALERTA BUG: POT SĂ APARĂ PROBLEME UTILIZÂND DEACTIVATE ȘI ACTIVATE ÎN SUCESIUNEA IMEDIATĂ

VBA nu poate executa întotdeauna procedurile evenimentului Deactivate pentru un formular și ale evenimentului Activate pentru un alt formular în succesiune imediată. Rareori lucrurile funcționează așa cum ar trebui.

De exemplu, să spunem că aveți două formulare, numite Unu și Doi, fiecare cu câte o procedură pentru evenimentele Activate și Deactivate. Dacă afișați formularul Doi prin activarea acestuia folosind codul în formularul Unu, codul evenimentului Deactivate ar trebui să fie transmis de la Unu, urmat de codul Activate din Doi. Acest lucru nu se întâmplă de obicei: adesea, va rula codul Deactivate pentru Unu, dar nu va rula și Activate pentru Doi. Rulați-l din nou și puteți obține codul Activate din Doi pentru a fi rulat, dar nu și Deactivate pentru Unu. Cu toate acestea, dacă eliminați sau comentați procedura de dezactivare a evenimentului de la Unu și încercați din nou, codul de activare Doi va rula constant de fiecare dată când Unu afișează Doi, indicând că evenimentul Activate este declanșat, dar codul procedurii evenimentului Activate nu se execută atunci când este prezentă procedura evenimentului Deactivate.

Evenimentul Deactivate

Evenimentul Deactivate este declanșat când formularul pierde focalizarea după ce fereastra a fost activă, dar nu se declanșează atunci când formularul este ascuns sau descărcat. De exemplu, dacă afișați un formular care conține o procedură de dezactivare a evenimentului și apoi închideți formularul, evenimentul Deactivate nu se declanșează. Cu toate acestea, dacă afișați un alt formular, evenimentul Deactivate pentru primul formular se declanșează pe măsură ce focalizarea este transferată la al doilea formular. Cu formularele modeless, evenimentul Deactivate este declanșat de fiecare dată când utilizatorul lasă un formular făcând clic pe un altul.

Sintaxa pentru evenimentul Deactivate este următoarea:

Private Sub UserForm_Deactivate()

Evenimentul Resize

Evenimentul Resize se declanșează atunci când un formular este redimensionat manual de către utilizator sau de către programator, folosind comenzi.

Sintaxa pentru redimensionarea evenimentului este următoarea:

Private Sub UserForm_Resize()

Utilizarea principală pentru evenimentul Resize este mutarea, redimensionarea, afișarea sau ascunderea controalelor pentru a răspunde la un formular redimensionat. De exemplu, pentru a redimensiona o casetă de text (din figura următoare), astfel încât să ocupe cea mai mare parte a lățimii formularului pe care se află, se folosește codul de mai jos.

Redimensionarea formularului folosind cod

1. Private Sub cmdWidenForm_Click()
2.    With frmResize
3.       If .Width < 451 Then
4.       .Width = .Width + 50
5.          If cmdNarrowForm.Enabled = False Then
        cmdNarrowForm.Enabled = True
6.          If .Width > 451 Then _
        cmdWidenForm.Enabled = False
7.          End If
8.    End With
9. End Sub
10. 
11. Private Sub cmdNarrowForm_Click()
12.    With frmResize
13.       If .Width > 240 Then
14.          .Width = .Width - 50
15.          If cmdWidenForm.Enabled = False Then
        cmdWidenForm.Enabled = True
16.          If .Width < 270   Then _
        cmdNarrowForm.Enabled = False
17.          End If
18.    End With
19. End Sub
20.
21. Private Sub cmdClose_Click()
22.   Unload Me
23. End Sub
24.
25. Private Sub UserForm_Resize()
26.    txt1.Width = frmResize.Width - 30
27. End Sub

Codul de mai sus conține patru proceduri scurte: una pentru evenimentul Click al butonului de comandă cmdWidenForm, una pentru evenimentul Click al butonului de comandă cmdNarrowForm, una pentru evenimentul Click al butonului cmdClose și una pentru evenimentul Resize din formular.

Procedura cmdWidenForm_Click de pe liniile de la 1 până la 9 cresc lățimea formularului de la 50 points (1 point este egal cu 1/72 inch) când utilizatorul face clic pe butonul Widen Form, atâta timp cât valoarea proprietății Width a formularului este mai mică decât 451 points. Linia 5 activează butonul de comandă cmd NarrowForm dacă nu este deja activat. (Butonul de comandă cmdNarrowForm este dezactivat dacă formularul are lățimea inițială.) Linia 6 dezactivează butonul de comandă cmdWidenForm dacă valoarea pentru proprietatea Width a formularului este mai mare decât 451 points.

Procedura cmdNarrowForm_Click prezentată în liniile 11 până la 19 îngustează formularul cu 50 de puncte atâta timp cât Width – lățimea formularului este mai mare decât 240 points (lățimea inițială), reactivând butonul cmdWidenForm dacă este dezactivat și dezactivând butonul cmdNarrowForm dacă lățimea formularului este mai mică de 270 points.

Procedura cmdClose_Click de pe liniile 21-23 descarcă pur și simplu formularul. Cuvântul cheie Me se referă întotdeauna la formularul curent, formularul în care se află comanda Me. Așadar, codul Unload Me spune pur și simplu formularului să se închidă.

Procedura evenimentului UserForm_Resize din liniile 25-27 stabilește proprietatea Width din txt1, caseta de text din formular, cu 30 de puncte mai mică decât Lățimea formularului. Dacă parcurgeți codul (apăsând în mod repetat F8) în formular, veți observa că evenimentul Resize se declanșează atunci când se modifică dimensiunea formularului. De exemplu, atunci când este executată linia 4 a procedurii cmdWidenForm_ Click, execuția se ramifică la procedura evenimentului Resize din linia 25 și această procedură este executată înainte de codul din linia 5.

Evenimentul Terminate

Evenimentul Terminate este declanșat când formularul a fost descărcat sau, mai precis, când toate referințele la o instanță a formularului au fost șterse din memorie sau au ieșit din sfera de aplicare.

Sintaxa pentru evenimentul Terminate este următoarea:

Private Sub UserForm_Terminate()

Evenimente care se aplică deopotrivă la UserForms și controale din Container

Această secțiune descrie evenimentele care se aplică obiectului UserForm și controalelor din container - controlul MultiPage și controlul Frame. Controalele din container pot avea alte controale plasate în interiorul lor. (Evenimentul Scroll se aplică controlului ScrollBar, precum și MultiPage, Frame și UserForm.) Aceste evenimente sunt Scroll, Zoom, Resize, Layout, AddControl și RemoveControl.

Evenimentul Scroll

Evenimentul Scroll se aplică controalelor Frame, MultiPage, ScrollBar și obiectului UserForm. Acest eveniment se produce atunci când utilizatorul mută caseta de defilare (dreptunghiul de pe bara de defilare) pe bara de defilare dintr-un cadru, un control MultiPage, bara de defilare sau formular.

Sintaxa pentru evenimentul Scroll variază pentru cele trei controale și obiectul UserForm.

Sintaxa pentru evenimentul Scroll cu obiectul UserForm este următoarea:

Private Sub UserForm_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY
As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)

Sintaxa evenimentului Scroll pentru controlul ScrollBar este următoarea:

Private Sub scrollbar_Scroll()

Sintaxa evenimentului Scroll pentru controlul MultiPage este următoarea:

Private Sub multipage_Scroll(index As Long, ActionX As fmScrollAction, ActionY As fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)

Sintaxa evenimentului Scroll pentru controlul Frame este următoarea:

Private Sub frame_Scroll(ActionX As fmScrollAction, ActionY As fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms .Return Single, ByVal ActualDy As MSForms.ReturnSingle)

În ultimele trei comenzi, scrollbar este un obiect valid ScrollBar, multipage este un obiect valid MultiPage, iar frame este un obiect valid de tip Frame.

Iată argumentele pentru evenimentul Scroll:

Index Un argument obligatoriu care specifică pagina MultiPage cu care va fi asociată procedura evenimentului.

ActionX și ActionY Argumente obliigatorii care determină acțiunile pe orizontală și verticală ale utilizatorului, descrise în tabelul de mai jos.

RequestDx Distanța cu care se mută caseta de derulare pe orizontală, specificată în points.

RequestDy Distanța cu care se mută caseta de derulare pe verticală, specificată în points.

ActualDx Distanța cu care s-a mișcat pe orizontală caseta de defilare, măsurată în points.

ActualDy Distanța cu care s-a mișcat pe verticală caseta de defilare, măsurată în points.

Evenimentul Zoom

Modificarea proprietății Zoom este ca și cum s-ar folosi o lupă. Controalele formularului cresc dacă valoarea Zoom este mai mare decât 100 și scad în dimensiuni dacă valoarea este mai mică decât 100. Cu toate acestea, formularul în sine nu își schimbă dimensiunea. Pentru a modifica dimensiunea formularului, trebuie să ajustați proprietățile sale Height și Width.

Evenimentul Zoom se declanșează atunci când proprietatea Zoom a obiectului se schimbă în timpul execuției procedurii. Proprietatea Zoom poate fi modificată automat prin cod sau prin manipularea utilizatorului - de exemplu, glisând caseta dreptunghiulară a barei de defilare - un control care își schimbă proprietatea, deoarece a fost scris cod care răspunde în acest mod.

Proprietatea Zoom utilizează această sintaxă pentru control și pentru obiectul UserForm:

Private Sub object_Zoom(Percent As Integer)

Aici, object este un control Frame sau un obiect UserForm. Percent este un argument întreg folosit pentru a specifica procentul (de la 10 la sută la 400 la sută) cu care va fi redimensionat formularul. În mod implicit, formularele și controalele sunt afișate la un factor de mărire de 100 % - dimensiunea completă.

Proprietatea Zoom utilizează această sintaxă pentru controlul MultiPage:

Private Sub multipage_Zoom(ByVal Index As Long, Percent As Integer)

Index este indexul (nume sau număr) pentru obiectul Page din controlul MultiPage cu care evenimentul Zoom este asociat.

Zoomul unui formular mărește toate controalele care sunt pe acesta. De exemplu, să spunem că un formular numit frmEventsDemo include o casetă combo numită cmbZoom care are o selecție de procente de zoom. Când utilizatorul selectează un element din caseta combo, evenimentul Change pentru cmbZoom aplică proprietatea Value a casetei combo proprietății Zoom a formularului, mărind-o la procentul selectat. Zoom din formular declanșează evenimentul Zoom, a cărui procedură în acest exemplu stabilește Lățimea și Înălțimea formularului de utilizator la noi valori potrivite pentru noul procent de zoom:

Private Sub cmbZoom_Change()
  'schimba marimea contralelor:
   frmEventsDemo.Zoom = cmbZoom.Value 
End Sub
Private Sub UserForm_Zoom(Percent As Integer)
  'schimba marimea formularului:
   frmEventsDemo.Width = 300 * cmbZoom.Value / 100 
   frmEventsDemo.Height = 350 * cmbZoom.Value / 100 
End Sub

Evenimentul Layout

Evenimentul Layout este declanșat când mărimea cadrului, controlul MultiPage sau un formular sunt modificate, fie de utilizator, fie de programator, în cod (se redimensionează automat printr-un control).

Implicit, evenimentul Layout calculează automat noua poziție pentru orice control care a fost mutat și în consecință reafișează ecranul. Cu toate acestea, puteți utiliza, de asemenea, evenimentul Layout în scopuri proprii dacă doriți

Sintaxa pentru evenimentul Layout cu un control Frame sau un obiect UserForm este următoarea:

Private Sub object_Layout()

Iată, object este un control Frame sau un obiect UserForm.

Sintaxa pentru folosirea evenimentului Layout cu un control MultiPage este următoarea:

Private Sub multipage_Layout(index As Long)

Aici, multipage este un control MultiPage și index este obiectul Page din controlul MultiPage.

VBA salvează automat proprietățile Height și Width

Când un control este redimensionat, VBA stochează automat valorile pentru înălțime și lățime din vechile proprietăți OldHeight și OldWidth, iar proprietățile Height și Width preiau noile valori pentru înălțime și lățime. Astfel se permite restaurarea valorilor unui control la mărimile anterioare prin preluarea valorilor din proprietățile OldHeight și OldWidth și atribuirea lor la proprietățile Height și Width.

Evenimentul AddControl

Evenimentul AddControl este declanșat atunci când un control este adăugat prin program la un control Frame, un control MultiPage sau la formular în timpul execuției - runtime; nu este declanșat atunci când adăugați un control manual la momentul proiectării. Evenimentul nu este declanșat atunci când formularul este inițializat, decât dacă evenimentul Initialize adaugă un control la formular.

Sintaxa pentru evenimentul AddControl variază în funcție de obiect sau control. Sintaxa pentru obiectul UserForm și controlul Frame este următoarea:

Private Sub object_AddControl(ByVal Control As MSForms.Control)

Aici, object este un obiect UserForm sau un control Frame, și Control este controlul care va fi adăugat.

Sintaxa pentru controlul MultiPage este următoarea:

Private Sub multipage_AddControl(ByVal Index As Long, ByVal Control As MSForms .Control)

Aici, Index este numărul index sau numele pentru obiectul Page care va primi controlul.

De exemplu, următoarea procedură cmdAddControl_Click adaugă trei butoane de opțiune (opt1, opt2 și, respectiv, opt3) la cadrul fraOptions și setează proprietățile pentru primul buton radio. (Un comentariu indică unde ar merge codul pentru a seta proprietățile pentru al doilea și al treilea buton radio.) Procedura pentru evenimentul fraOptions_AddControl afișează o casetă de mesaj care oferă numărul de controale pe care le conține acum cadrul. Deoarece procedura cmdAddControl_Click adaugă trei controale, evenimentul AddControl se declanșează de trei ori, iar procedura fraOptions_AddControl rulează de trei ori:

Private Sub cmdAddControl_click()
Dim opt1 As OptionButton 
Dim opt2 As OptionButton 
Dim opt3 As OptionButton
Set opt1 = fraOptions.Controls.Add("Forms.OptionButton.1") 
Set opt2 = fraOptions.Controls.Add("Forms.OptionButton.1") 
Set opt3 = fraOptions.Controls.Add("Forms.OptionButton.1") 
With opt1
.Left = 10 .Top = 10
.Name = "optDomestic"
.Caption = "Domestic"
.AutoSize = True .Accelerator = "D"
End With
 'aici setare proprietati pentru opt2 si opt3
End Sub
Private Sub fraOptions_
 AddControl(ByVal Control As MSForms.Control) MsgBox "The frame now contains " & _
   fraOptions.Controls.Count & " controls."
End Sub

Evenimentul REMOVECONTROL

Evenimentul RemoveControl se declanșează atunci când un control este șters de pe un control de tip cadru, un control MultiPage sau un formular, fie prin program, fie manual în timpul rulării programului. (Pentru a elimina manual un control, de obicei utilizatorul ar utiliza în acest scop un control integrat în formular. În acest caz, trebuie să existe programare - utilizatorii nu pot șterge pur și simplu controalele.)

Sintaxa pentru evenimentul RemoveControl este următoarea pentru toate controalele, cu excepția controlului MultiPage:

   Private Sub object_RemoveControl(ByVal Control As MSForms.Control)

Aici, obiect este un obiect valid, iar control este un control valid.

Sintaxa pentru evenimentul RemoveControl care se folosește la controlul MultiPage este următoarea:

Private Sub multipage_RemoveControl(ByVal Index As Long, ByVal Control As MSForms.Control)

Aici, multipage este un obiect MultiPage. Pentru un control MultiPage, Index specifică obiectul Page din controlul MultiPage care conține controlul care va fi șters.

Evenimente care se aplică la majoritatea controalelor

Această secțiune descrie evenimentele care se aplică la majoritatea controalelor. Unele din aceste evenimente se aplică și la obiectul UserForm. Aceste evenimente sunt Click; Change; Enter și Exit; BeforeUpdate și AfterUpdate; KeyDown, KeyUp și KeyPress; MouseDown, MouseUp și MouseMove; BeforeDragOver; BeforeDropOrPaste; DblClick; și Error.

Evenimentul Click

Cel mai folosit eveniment din VBA, evenimentul Click poate fi folosit de controalele CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, TabStrip și ToggleButton. Nu poate fi folosit de controalele TextBox, ScrollBar sau SpinButton, dar este membru al obiectului UserForm.

Un eveniment Click apare când utilizatorul face clic pe un control cu butonul stânga al mouse-ului sau când utilizatorul selectează o valoare pentru un control care are mai mult de o valoare posibilă. Pentru majoritatea controalelor, acest lucru înseamnă că evenimentul se declanșează de fiecare dată când utilizatorul face clic pe control. Există însă câteva excepții:

  • Clic pe un control dezactivat, declanșează evenimentul Click al formularului (ca și cum acesta ar face clic pe formular prin intermediul controlului).
  • Evenimentul Click al unui control OptionButton se declanșează atunci când utilizatorul face clic pe butonul de opțiune pentru a-l selecta. Dacă butonul de opțiune este deja selectat, un clic pe acesta nu are efect. (Pe de altă parte, evenimentul Click al unui control CheckBox se declanșează de fiecare dată când utilizatorul face clic pe caseta de selectare - fie pentru a o bifa, fie pentru a o debifa.)
  • Evenimentul Click al unui control ListBox sau ComboBox control se declanșează atunci când utilizatorul face clic pentru a selecta un element din listă (nu atunci când utilizatorul face clic pe săgeata derulantă sau în porțiunea nederulată a casetei combo). Dacă utilizatorul face clic pe un element deja selectat, evenimentul Click nu se va mai declanșa.
  • Evenimentul Click al unui control ToggleButton are loc ori de câte ori se face clic pe butonul de comutare și când proprietatea Value este modificată. Aceasta înseamnă că nu este o idee bună să folosiți evenimentul Click al controlului ToggleButton pentru a comuta valoarea sa - Value.
  • Evenimentul Click al unui control CommandButton selectat se declanșează când apăsați bara de spațiu.
  • Evenimentul Click al butonului de comandă implicit (butonul cu proprietatea sa Default setat la True) se declanșează atunci când utilizatorul apasă Enter cu niciun alt buton de comandă selectat.
  • Evenimentul Click al butonului de comandă cu proprietatea Cancel este setat la True se declanșează atunci când utilizatorul apasă Esc. Evenimentul Click pentru un control cu ​​un set de taste rapide se declanșează și atunci când utilizatorul apasă tasta rapidă.

Pentru toate controalele cu excepția controalelor TabStrip și MultiPage, evenimentul Click nu are nevoie de argumente, ca mai jos:

Private Sub object_Click()

Pentru controalele TabStrip sau MultiPage, codul trebuie să reacționeze la argumentul Index, de tip Long (tip de dată) pe care VBA îl preia pentru a indica tabul afectat sau pagina controlului:

Private Sub object_Click(ByVal Index As Long)

Aici, object este un control MultiPage sau TabStrip valid.

Secvență de evenimente: ce se întâmplă atunci când utilizatorul face clic (apoi mai face un clic)

Ordinea în care se declanșează evenimentele poate fi uneori importantă pentru programator. Dacă nu înțelegeți ordinea în care au loc evenimentele, puteți scrie cod care determină conflict de evenimente sau evenimente care să se declanșeze reciproc.

Când utilizatorul face clic pe un buton de comandă, evenimentul Enter pentru acest buton are loc înainte de evenimentul Click, dacă clicul transferă focalizarea pe butonul de comandă. Când se declanșează evenimentul Enter pentru butonul de comandă, de obicei, împiedică declanșarea evenimentului Click.

Când utilizatorul face clic pe un control, primul eveniment declanșat este evenimentul MouseDown, care se declanșează atunci când utilizatorul apasă butonul mouse-ului. Apoi, evenimentul MouseUp se declanșează atunci când utilizatorul eliberează butonul mouse-ului. Un eveniment Click apare după un eveniment MouseUp. Dacă utilizatorul face clic din nou în intervalul de timp dublu-clic setat în Windows, se declanșează evenimentul DblClick, urmat de un alt eveniment MouseUp.

Evenimentul Change

Evenimentul Change se aplică controalelor CheckBox, ComboBox, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton. Acest eveniment se declanșează atunci când se modifică proprietatea valorică a unui control. Această modificare poate apărea fie printr-o acțiune a utilizatorului (cum ar fi tastarea textului într-o casetă de text, selectarea unui buton de opțiune, selectarea sau ștergerea unei casete de selectare, clic pe butonul de comutare sau schimbarea paginii afișate pe un control MultiPage) sau prin o acțiune întreprinsă de program în timpul execuției lui - runtime.

Rețineți că atunci când evenimentul Change este declanșat de o acțiune a utilizatorului, această acțiune poate declanșa și un eveniment Click. (Chiar și atunci când se întâmplă acest lucru, Change este considerată o modalitate mai bună de a determina noua valoare a controlului decât Clic - deși pentru multe scopuri, Clic va funcționa și satisfăcător.) Modificarea manuală a proprietății Value a unui control la momentul proiectării nu declanșează un eveniment Change.

Sintaxa pentru evenimentul Change este următoarea:

Private Sub object_Change()

Evenimentul Change este util pentru actualizarea altor controale după ce utilizatorul modifică un control. De exemplu, dacă utilizatorul introduce numele pentru un raport nou într-o casetă de text (aici, txtReportName), puteți utiliza evenimentul Change pentru a insera automat într-o altă casetă de text (aici numită txtFileName) numele fișierului în care pentru a salva raportul:

Private Sub txtReportName_Change()
   txtFileName.Text = txtReportName.Text & ".txt"
End Sub

Evenimentele Enter și Exit

Evenimentele Enter și Exit se aplică controalelor CheckBox, ComboBox, CommandButton, Frame, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton.

Evenimentul Enter se declanșează atunci când, pe un formular, focalizarea este mutată de la un control la un alt control. Evenimentul se declanșează chiar înainte ca al doilea control să primească focalizarea.

Ca și evenimentul Enter, evenimentul Exit se declanșează atunci când pe un formular focalizarea este mutată de la un control la un alt control. Cu toate acestea, evenimentul Exit se declanșează chiar înainte ca primul eveniment să piardă focalizarea.

Sintaxa pentru evenimentul Enter este următoarea:

Private Sub object_Enter()

Sintaxa pentru evenimentul Exit este puțin mai complexă:

Private Sub object_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Aici, Cancel este un argument obligatoriu care specifică starea evenimentului. Setarea implicită este False, care specifică faptul că acel control ar trebui să se ocupe de eveniment și că focalizarea va trece la următorul control; setarea True specifică faptul că aplicația gestionează evenimentul, care menține focalizarea pe controlul curent.

Folosind evenimentele Enter și Exit, puteți urmări progresul utilizatorului prin controalele de pe formular.

Evenimentul Exit este util pentru verificare pentru a vedea dacă utilizatorul a făcut o selecție adecvată în control sau a introdus o valoare adecvată. De exemplu, puteți verifica intrarea utilizatorului în control și, dacă vi se pare necorespunzător, afișați o casetă de mesaje care avertizează utilizatorul asupra problemei și apoi întoarceți focalizarea asupra controlului, astfel încât utilizatorul să poată încerca din nou.

Alte evenimente pe care le puteți utiliza pentru verificarea conținutului unui control după ce utilizatorul l-a vizitat includ AfterUpdate și LostFocus. În mod similar, puteți utiliza evenimentele BeforeUpdate și GotFocus în locul evenimentului Enter. O diferență semnificativă între Enter și GotFocus și între Exit și LostFocus este că GotFocus și LostFocus se declanșează atunci când formularul primește sau pierde focalizarea, respectiv, dar Enter și Exit nu se declanșează.

Evenimentul BeforeUpdate

Evenimentul BeforeUpdate se aplică la controalele CheckBox, ComboBox, ListBox, OptionButton, ScrollBar, SpinButton, TextBox și ToggleButton. Acest eveniment se produce pe măsură ce valoarea sau datele din controlul specificat sunt modificate; puteți utiliza evenimentul pentru a evalua schimbarea și pentru a decide dacă să o implementați.

Sintaxa pentru evenimentul BeforeUpdate este următoarea:

Private Sub object_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

Aici, object este un obiect valid, iar Cancel este un argument obligatoriu care indică starea evenimentului. Setarea implicită False face ca controlul să se ocupe de eveniment; True împiedică executarea actualizării și face ca aplicația să gestioneze evenimentul.

Iată secvența în care evenimentele se declanșează pe măsură ce mutați focalizarea către un control, îl actualizați și continuați:

  1. Evenimentul Enter pentru control se declanșează când mutați focalizarea pe control.
  2. Evenimentul BeforeUpdate pentru control declanșează după ce ați introdus informațiile pentru actualizare (de exemplu, după ce ați apăsat o tastă într-o casetă de text), dar înainte de executarea actualizării. Setând Cancel la True, puteți împiedica ca actualizarea să aibă loc. (Dacă nu setați Cancel pe True, actualizarea apare și evenimentul AfterUpdate nu o poate împiedica să apară.)
  3. Evenimentul AfterUpdate pentru control se declanșează după ce ați introdus informațiile din control și actualizarea a fost executată. Dacă setați argumentul Cancel pentru BeforeUpdate la True, evenimentul AfterUpdate nu se declanșează.
  4. Evenimentul Exit pentru control se declanșează atunci când treceți de la acest control la un alt control. (După ce evenimentul Exit se declanșează pentru controlul părăsit, evenimentul Enter se declanșează pentru controlul pe care ați mutat focalizarea.)

Evenimentul AfterUpdate

Evenimentul AfterUpdate se aplică controalelor CheckBox, ComboBox, ListBox, OptionButton, ScrollBar, SpinButton, TextBox și ToggleButton. Acest eveniment se declanșează după ce utilizatorul schimbă informațiile într-un control și după ce actualizarea a fost executată.

Sintaxa pentru evenimentul AfterUpdate este aceeași ca pentru toate controalele și obiectele pe care se aplică:

Private Sub object_AfterUpdate()

Evenimentele KeyDown și KeyUp

Evenimentele KeyDown și KeyUp funcționează cu controalele CheckBox, ComboBox, CommandButton, Frame, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton și cu obiectul UserForm. Aceste evenimente nu sunt disponibile controalelor Image și Label.

Evenimentul KeyDown se declanșează atunci când utilizatorul apasă o tastă de pe tastatură. Evenimentul KeyUp se declanșează atunci când utilizatorul eliberează tasta. Evenimentele KeyDown și KeyUp apar, de asemenea, atunci când o tastă este trimisă la formular sau la control prin program folosind instrucțiunea SendKeys. Aceste evenimente nu apar atunci când utilizatorul apasă Enter și formularul conține un control CommandButton cu proprietatea sa implicită setată la True și nici atunci când utilizatorul apasă Esc și formularul conține un control CommandButton cu proprietatea sa Cancel setată la True.

Când apăsarea tastei mută focalizarea către un alt control, evenimentul KeyDown se declanșează pentru controlul inițial, în timp ce evenimentele KeyPress și KeyDown se declanșează pentru controlul la care este mutat focalizarea.

Evenimentul KeyPress declanșează înainte evenimentul KeyDown și după evenimentul KeyUp.

Sintaxa pentru evenimentul KeyDown este următoarea:

Private Sub object_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Sintaxa pentru evenimentul KeyUp este următoarea:

Private Sub object_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Aici, object este un nume de obiect și este obligatoriu. KeyCode este un argument obligatoriu de tip Integer care specifică codul tastei apăsată. De exemplu, codul cheie pentru tasta t este 84. Codul cheie nu este o valoare ANSI - este un număr special care identifică tasta de pe tastatură.

Shift este un argument obligatoriu care specifică dacă a fost apăsată tasta Shift, Ctrl sau Alt. Folosiți constantele sau valorile prezentate în tabelul de mai jos.

Evenimentul KeyPress

Evenimentul KeyPress este membru al controalelor CheckBox, ComboBox, CommandButton, Frame, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton. De asemenea, este un membru al obiectului UserForm. Controlul Label nu are niciun eveniment KeyPress.

Evenimentul KeyPress se declanșează atunci când utilizatorul apasă un caracter imprimabil, Ctrl plus un caracter alfabetic, Ctrl plus un caracter special (simboluri), tasta Esc sau tasta Backspace în timp ce controlul sau obiectul în cauză se concentrează. Apăsând tasta Tab, tasta Enter sau o tastă săgeată nu provoacă activarea evenimentului KeyPress și nici o apăsare a tastei care mută focalizarea către un alt control din controlul curent.

Tehnic, numai tastele ANSI activează evenimentul KeyPress. Tasta Delete nu este o tastă ANSI, prin urmare, apăsarea tastei Delete pentru a șterge, să zicem, textul dintr-o casetă de text nu declanșează evenimentul KeyPress. Ștergerea aceluiași text din aceeași casetă de text folosind tasta Backspace îl declanșează, deoarece Backspace este o tastă ANSI.

Evenimentul KeyPress se declanșează după evenimentul KeyDown și înainte de evenimentul KeyUp. De asemenea, se declanșează atunci când utilizați SendKeys pentru a trimite apăsări de taste la un formular prin program.

Sintaxa pentru evenimentul KeyPress este următoarea:

Private Sub object_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Aici, object este un argument necesar specificând un obiect valid, iar KeyAscii este un argument de tip Integer necesar care specifică un cod de tastă ANSI. Pentru a obține codul pentru tastă ANSI, utilizați funcția Asc. De exemplu, Asc ("t") returnează codul ANSI pentru litera t (codul este 116).

În mod implicit, evenimentul KeyPress procesează codul pentru tasta apăsată – altfel zis, ceea ce apăsați este ceea ce obțineți. De exemplu, dacă apăsați tasta t, obțineți un t; dacă apăsați tasta Delete, primiți acțiunea de Ștergere; și asa mai departe. Utilizând o procedură de eveniment KeyPress, puteți efectua verificări, cum ar fi filtrarea tuturor tastelor nenumerice atunci când utilizatorul trebuie să introducă o valoare numerică.

Evenimentele Mousedown și MouseUp

Evenimentele MouseDown și MouseUp se aplică controalelor CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton și la obiectul UserForm. Evenimentul MouseDown se declanșează atunci când utilizatorul apasă un buton pe mouse și un eveniment MouseUp are loc atunci când utilizatorul eliberează butonul respectiv.

Un eveniment Click se declanșează după ce apare un eveniment MouseUp.

Sintaxa pentru evenimentele MouseDown și MouseUp este următoarea pentru toate controalele, cu excepția MultiPage și TabStrip:

Private Sub object_MouseDown(ByVal Button As Integer, ByVal Shift As Integer,
ByVal X As Single, ByVal Y As Single)
Private Sub object_MouseUp(ByVal Button As Integer, ByVal Shift As Integer,
ByVal X As Single, ByVal Y As Single)

Sintaxa pentru evenimentele MouseDown și MouseUp la controalele MultiPage și TabStrip adaugă un argument Index pentru a specifica indexul paginii sau filei alese:

Private Sub object_MouseUp(ByVal Index As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Private Sub object_MouseDown(ByVal Index As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Aici, object este un obiect valid pentru instrucțiune.

Index returnează -1 dacă utilizatorul face clic în afara paginii sau a zonei file a controlului, dar încă în interiorul controlului (de exemplu, în partea dreaptă a filei din partea superioară a tab-ului TabStrip).

Button este un argument obligatoriu de tip Integer care specifică butonu de maus care a declanșat evenimentul. Tabelul de mai jos listează valorile posibile pentru Button.

Shift este un argument obligatoriu care specifică dacă au fost apăsate tastele Shift, Ctrl sau Alt. Tabelul următor afișează valorile pentru Shift.

De asemenea, puteți detecta o singură tastă utilizând măștile de chei, descrise mai sus (fmShiftMask, fmCtrlMask și fmAltMask).

X este un argument necesar de tip Single care specifică poziția pe orizontală în puncte din marginea stângă a formularului, a cadrului sau a paginii utilizatorului. Y este un argument necesar de tip Single care specifică poziția pe verticală în puncte de la marginea superioară a formularului, cadrului sau paginii utilizatorului.

Evenimentul MouseMove

Evenimentul MouseMove este disponibil pentru controalele CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, TabStrip, TextBox și ToggleButton și pentru obiectul UserForm. Acest eveniment se declanșează atunci când utilizatorul mută indicatorul mouse-ului peste controlul sau obiectul respectiv.

Sintaxa pentru evenimentul MouseMove este diferită pentru controalele MultiPage și TabStrip decât pentru celelalte controale și pentru obiectul UserForm. Sintaxa pentru celelalte controale este următoarea:

Private Sub object_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Sintaxa pentru controalele MultiPage și TabStrip este următoarea:

Private Sub object_MouseMove(ByVal Index As Long, ByVal Button As Integer,
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Aici, object este un argument obligatoriu care specifică un obiect valid.

Pentru controalele MultiPage și TabStrip, Index este un argument obligatoriu care returnează indexul pentru obiectul Page din controlul MultiPage sau pentru obiectul Tab din controlul TabStrip asociat cu evenimentul din procedură.

Button este un argument obligatoriu de tip Integer care returnează care buton de maus a fost apăsat (dacă a fost apăsat) de utilizator. Tabelul următor afișează valorile pentru Button.

Shift este un argument obligatoriu de tip Integer care returnează o valoare ce indică dacă utilizatorul a apăsat tastele Shift, Alt, și/sau Ctrl.

X este un argument obligatoriu de tip Single care returnează o valoare ce specifică poziția pe orizontală în puncte din marginea din stânga a formularului, cadrului sau paginii utilizatorului.

Y este un argument obligatoriu de tip Single ce specifică poziția pe verticală în puncte de la marginea superioară a formularului, cadrului sau paginii utilizatorului.

La fel ca în cazul evenimentelor MouseDown și MouseUp, puteți detecta, de asemenea, o singură tastă utilizând măștile de taste enumerate mai sus.

La fel ca majoritatea ferestrelor din sistemul de operare Windows, formularele trăiesc în mare parte ca o secvență non-stop de evenimentelor de mouse. Evenimentele MouseMove monitorizează locul unde se află indicatorul mouse-ului pe ecran și ce control l-a capturat. Evenimentele MouseMove se declanșează chiar dacă utilizați tastatura pentru a muta un formular de sub pointerul mouse-ului, deoarece indicatorul mouse-ului se termină într-un loc diferit în raport cu formularul, chiar dacă nu s-a mișcat în sensul convențional.

O utilizare pentru evenimentul MouseMove este afișarea unui text sau a unei imagini corespunzătoare pentru un control către care se indică utilizatorul. De exemplu, să presupunem că un formular furnizează o listă de produse disponibile, titlul fiecărui produs apare într-o etichetă. Când utilizatorul poziționează indicatorul mouse-ului peste un titlu din etichetă, puteți utiliza evenimentul MouseMove pentru a încărca o imagine a produsului într-un control Image și o scurtă descriere într-o altă etichetă.

Evenimentele MouseMove ar putea să nu declanșeze între controalele Close

Formularul de utilizator surprinde evenimentele MouseMove atunci când indicatorul mouse-ului nu este peste niciun control. Cu toate acestea, dacă utilizatorul mișcă rapid indicatorul mouse-ului de la un control la altul foarte aproape de acesta, formularul poate să nu capteze mișcarea pe un spațiu scurt.

Evenimentul BeforeDragOver

Evenimentul BeforeDragOver se aplică obiectului UserForm în sine și la următoarele controale: CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton. Un eveniment BeforeDragOver este declanșat atunci când utilizatorul efectuează o operație de drag-and-drop.

Sintaxa pentru evenimentul BeforeDragOver depinde de obiectul sau controlul în cauză. Sintaxa de bază pentru obiectul UserForm și toate controalele, cu excepția Frame, TabStrip și MultiPage, sunt următoarele, unde object este un UserForm valid sau un control:

Private Sub object_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Control As MSForms.Control, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal State As MSForms.fmDragState, ByVal Effect As MSForms. ReturnEffect, ByVal Shift As Integer)

Sintaxa pentru evenimentul BeforeDragOver cu controlul Frame este următoarea, unde frame este un control al controlului Frame valid:

Private Sub frame_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Control As MSForms.Control, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal State As MSForms.fmDragState, ByVal Effect As MSForms. ReturnEffect, ByVal Shift As Integer)

Sintaxa pentru evenimentul BeforeDragOver cu controlul MultiPage este următoarea, unde multipage este un control MultiPage valid:

Private Sub multipage_BeforeDragOver(ByVal Index As Long, ByVal Cancel As MSForms
ReturnBoolean, ByVal Control As MSForms.Control, ByVal Data As MSForms. DataObject, ByVal X As Single, ByVal Y As Single, ByVal State As MSForms. fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)

Sintaxa pentru evenimentul BeforeDragOver cu controlul TabStrip este următoarea, unde tabstrip este un control TabStrip valid:

Private Sub tabstrip_BeforeDragOver(ByVal Index As Long, ByVal Cancel As MSForms .ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms .ReturnEffect, ByVal Shift As Integer)

Acestea sunt părți diferite ale comenzilor:

  • Index este indexul obiectului Page din controlul MultiPage (sau al obiectului Tab din controlul TabStrip) care este afectat de drag-and-drop.
  • Cancel este un argument obligatoriu care preia starea evenimentului BeforeDragOver. Setarea implicită este False, care face ca controlul să manevreze evenimentul. Când setarea este True, aplicația manevrează evenimentul.
  • Control este un argument obligatoriu care specifică controlul care va fi tras peste (drag over).
  • Data este un argument obligatoriu care specifică informația care va fi trasă.
  • X este un argument obligatoriu care specifică distanța pe orizontală în puncte de la marginea din stânga a controlului. Y este un argument obligatoriu care specifică distanța pe verticală în puncte de la marginea de sus a controlului.
  • DragState este un argument obligatoriu care specifică locul unde se află cursorul de maus care este în relație cu ținta (locul unde poate fi tras). Tabelul următor afișează constantele și valorile pentru DragState.
  • Effect este un argument obligatoriu care specifică operațiile care pot fi suportate de sursa care este trasă.
  • Shift este un argument obligatoriu care specifică dacă sunt apăsate și tastele Shift, Ctrl sau Alt în timpul operației de tragere.

Tabel cu constante și valori pentru starea de tragere

Tabel cu constante și valori pentru efectul tragerii

Utilizați evenimentul BeforeDragOver pentru a controla acțiunile de drag-and-drop pe care le realizează utilizatorul. Utilizați argumentul DragState pentru a vă asigura că indicatorul mouse-ului se află în raza de acțiune a unei ținte.

Evenimentul BeforeDropOrPaste

Evenimentul BeforeDropOrPaste se aplică la controalele CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton și la obiectul UserForm.

Evenimentul BeforeDropOrPaste este declanșat înainte ca utilizatorul să tragă sau să adauge (cu paste) informații peste un obiect.

Sintaxa pentru evenimentul BeforeDropOrPaste diferă la controalele MultiPage și TabStrip, obiectul UserForm și celelalte controale. Sintaxa de bază este următoarea:

Private Sub object_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Control As MSForms.Control, ByVal Action As MSForms.fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)

Sintaxa pentru controlul MultiPage este următoarea, unde multipage este un control valid MultiPage:

Private Sub multipage_BeforeDropOrPaste(ByVal Index As Long, ByVal Cancel As MSForms.ReturnBoolean, ByVal Control As MSForms.Control, ByVal Action As MSForms. fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)

Sintaxa pentru controlul TabStrip este următoarea, unde tabstrip este un control valid TabStrip:

Private Sub tabstrip_BeforeDropOrPaste(ByVal Index As Long, ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, ByVal Data As MSForms. DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms. ReturnEffect, ByVal Shift As Integer)

Iată părțile sintaxei:

  • object este un obiect obligatoriu care specifică un obiect valid.
  • pentru controlul MultiPage, Index este un argument obligatoriu care specifică obiectul Page implicat.
  • Cancel este un argument obligatoriu care arată starea evenimentului. Setarea implicită este False și permite controlului să manevreze evenimentul; dacă este True, aplicația manevrează evenimentul.
  • Control este un argument obligatoriu care specifică controlul țintă.
  • Action este un argument obligatoriu care specifică rezultatul operației de drag-and-drop.

Tabelul de mai jos conține constantele și valorile pentru Action.

  • Data este un argument obligatoriu care specifică informația (conținută în DataObject) care este supusă operației de drag-and-drop.
  • X este un argument obligatoriu care specifică distanța pe orizontală în puncte de la marginea din stânga a controlului pentru tragere (drop). Y este un argument obligatoriu care specifică distanța pe verticală în puncte de la marginea de sus a controlului.
  • Effect este un argument obligatoriu care specifică dacă operațiunea de drag-and-drop copie informația sau o mută, descris mai sus.
  • Shift este un argument obligatoriu care specifică dacă utilizatorul a apăsat tastele Shift, Ctrl și/sau Alt, descris mai sus.

Tabel cu constante și valori pentru acțiune

Evenimentul BeforeDropOrPaste este declanșat când un obiect cu informații (data object) este transferat la un control MultiPage sau TabStrip și înainte ca operația drop sau paste să apară la alte controale.

Evenimentul DblClick

Evenimentul DblClick funcționează la controalele CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, TabStrip, TextBox și ToggleButton, dar și la obiectul UserForm.

Evenimentul DblClick are loc când utilizatorul face dublu clic pe un control sau obiect cu butonul stânga al mausului. Clicul dublu trebuie să fie suficient de rapid pentru a fi înregistrat ca dublu clic în Windows (această viteză este controlată de setarea din fila Buttons din caseta de dialog Mouse Properties din Control Panel) și apare după evenimentul MouseDown, evenimentul MouseUp, și evenimentul Click (pentru controale care acceptă evenimentul Click).

Evenimentul DblClick are o sintaxă diferită pentru controalele MultiPage și TabStrip față de celelalte controale sau de formular.

Pentru controalele MultiPage și TabStrip, sintaxa este următoarea:

Private Sub object_DblClick(ByVal Index As Long, ByVal Cancel As MSForms .ReturnBoolean)

Sintaxa evenimentului DblClick pentru celelalte controale este următoarea:

Private Sub object_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Aici, object este un argument obligatoriu care specifică un obiect valid. Pentru controalele MultiPage și TabStrip, Index este un argument obligatoriu care specifică obiectul Page din controlul MultiPage sau obiectul Tab din controlul TabStrip care va fi asociat cu procedura evenimentului.

Cancel este un argument obligatoriu care specifică starea evenimentului. Starea implicită False face ca acel control să manevreze evenimentul; True face ca aplicația să manevreze evenimentul și controlul va ignora cel de al doilea clic.

În controalele care acceptă atât evenimentul Click cât și evenimentul DblClick, evenimentul Click apare înainte de evenimentul DblClick. Dacă întreprindeți o acțiune de interfață (cum ar fi afișarea unei căsuțe de mesaje) cu procedura de eveniment Click, aceasta blochează procedura DblClick evenimentului. În următorul exemplu, procedura evenimentului DblClick nu se execută:

Private Sub CommandButton1_Click()
MsgBox "Eveniment clic"
End Sub
Private Sub CommandButton1_DblClick _
(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "Eveniment dublu clic"
End Sub

Cu toate acestea, puteți executa instrucțiuni non-interfață în procedura evenimentului Click fără a bloca procedura evenimentului DblClick. Următorul exemplu declară o variabilă String privată numită strMessage în porțiunea de declarații a foii de cod pentru formular. Procedura evenimentului Click pentru butonul de comandă CommandButton1 atribuie text pentru strMessage. Procedura evenimentului DblClick alocă mai mult text pentru strMess și apoi afișează o casetă de mesaje care conține strMessage, astfel încât să puteți vedea că ambele evenimente au fost declanșate. Nu rulați acest cod apăsând tasta F8 în editorul VBA - ci apăsați tasta F5 pentru a-l rula, altfel nu va funcționa:

Private strMess As String 
Private Sub CommandButton1_Click() 
  strMess = "Eveniment clic" & vbCr 
End Sub
Private Sub CommandButton1_DblClick _
(ByVal Cancel As MSForms.ReturnBoolean) 
  strMessage = strMessage & "Eveniment dublu clic"
  MsgBox strMessage 
End Sub

Pentru majoritatea controalelor care nu vor folosi procedura de eveniment Click, cât și procedura de eveniment DblClick - veți alege una sau alta, după cum este potrivit scopului controlului.

Evenimentul Error

Evenimentul Error se aplică la controalele CheckBox, ComboBox, CommandButton, Frame, Image, Label, ListBox, MultiPage, OptionButton, ScrollBar, SpinButton, TabStrip, TextBox și ToggleButton. Se aplică și obiectului UserForm. Evenimentul Error se declanșează atunci când un control întâlnește o eroare și nu este în măsură să returneze informații despre eroare programului care a apelat controlul.

Sintaxa evenimentului Error pentru obiectul UserForm și pentru toate controalele, cu excepția controlului MultiPage, este următoarea:

Private Sub object_Error(ByVal Number As Integer, ByVal Description As MSForms. Returnstring, ByVal SCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)

Sintaxa evenimentului Error pentru controlul MultiPage este următoarea, unde multi page este un control valid MultiPage:

Private Sub multipage_Error(ByVal Index As Long, ByVal Number As Integer, ByVal Description As MSForms.ReturnString, ByVal SCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)

Acestea sunt componentele sintaxei:

  • object este numele obiectului valid.
  • pentru un control MultiPage, Index este indexul obictului Page din controlul MultiPage asociat cu evenimetul.
  • Number este un argument obligatoriu care returnează valoarea folosită de control pentru a identifica eroare.
  • Description este un argument obligatoriu de tip String, care descrie eroarea.
  • SCode este un argument obligatoriu care arată starea codului OLE (Object Linking and Embedding) pentru aeca eroare.
  • Source este un argument obligatoriu de tip String care conține identificarea stringului pentru controlul implicat.
  • HelpFile este un argument obligatoriu de tip String care conține calea completă până la fișierul Help care conține Descrierea - Description.
  • HelpContext este un argument obligatoriu de tip Long care conține ID-ul contextual pentru Description din fișierul Help.
  • CancelDisplay este un argument obligatoriu de tip Boolean care controlează dacă VBA va afișa mesajul de eroare într-o casetă de mesaj.

Evenimente care se aplică doar la câteva controale

Această secțiune descrie cele trei evenimente care se aplică numai la unul sau două controale. Primul dintre cele trei este evenimentul DropButtonClick, care se aplică numai comenzilor ComboBox și TextBox; al doilea și al treilea sunt evenimentele SpinUp și SpinDown, care se aplică numai controlului SpinButton.

Evenimentul DROPBUTTONCLICK

Evenimentul DropButtonClick se declanșează atunci când utilizatorul afișează sau ascunde o listă derulantă pe un ComboBox făcând clic pe butonul derulant sau apăsând tasta F4 atunci când controlul ComboBox este focalizat (este selectat). DropButtonClick se declanșează și atunci când utilizatorul apasă tasta F4 cu un control TextBox selectat, deși această manifestare a evenimentului este rar întâlnită și inutilă. De asemenea, se declanșează atunci când metoda DropDown este executată în VBA pentru a afișa lista derulantă și se declanșează din nou când metoda DropDown este executată din nou pentru a ascunde lista verticală.

Sintaxa pentru evenimentul DropButtonClick este următoarea:

Private Sub object_DropButtonClick( )

Aici, object este un control valid ComboBox sau TextBox.

O utilizare pentru evenimentul DropButtonClick este adăugarea de elemente la un control ComboBox, în loc să fie adăugate la încărcare prin evenimentul Initialize. Adăugând aceste articole numai la cerere (presupunând că utilizatorul ar putea să nu utilizeze deloc controlul ComboBox sau să poată introduce informații în zona casetei sale de text), se reduce timpul de încărcare pentru formular. De asemenea, puteți încărca ComboBox cu date relevante pentru celelalte alegeri pe care le-a făcut utilizatorul în caseta de dialog, permițând informații mai direcționate decât ar putea să le furnizeze încărcarea ComboBox cu evenimentul Initialize.

Evenimentele SPINDOWN și SPINUP

Evenimentele SpinDown și SpinUp se aplică numai controlului SpinButton. SpinDown și SpinUp sunt utilizate pentru a controla ce se întâmplă atunci când utilizatorul face clic fie pe butonul săgeată în jos, fie pe butonul săgeată în sus (din controlul SpinButton vertical) sau al butonului săgeată dreapta și al butonului săgeată stânga (din controlul spinButton orizontal). Evenimentul SpinDown se declanșează atunci când utilizatorul face clic pe săgeata în jos sau pe săgeata dreapta, iar evenimentul SpinUp se declanșează atunci când utilizatorul face clic pe săgeata sus sau pe săgeata stângă.

Sintaxa pentru evenimentul SpinUp și evenimentul SpinDown este următoarea:

Private Sub spinbutton_SpinDown()
Private Sub spinbutton_SpinUp()

Aici, spinbutton este un control SpinButton.

Implicit, evenimentul SpinDown descrește, iar evenimentul SpinUp crește proprietatea Value a butonului SpinButton cu incrementarea SmallChange.