TOP

VBA-Lecția 12.2. Controale (Controls)

Controalele (Controls) au tot felul de proprietăți și multe evenimente asociate cu ele, dar deocamdată ne vom uita la doar câteva care sunt folosite în programare pe VBA.


Să începem prin a adăuga 3 controale - Label, TextBox și CommandButton:

Editați numele și proprietățile acestui control (folosind proprietatea Caption care conține textul) pentru a obține următorul rezultat:

Acum, când introducem numărul și facem clic pe OK, nu se întâmplă nimic.

Pentru a crea o acțiune, vom adăuga un eveniment care va scrie valoarea introdusă din caseta de text în celula A1 și va închide Formularul.

Puteți accesa opțiunile prezentate mai jos făcând dublu clic pe control:

Această listă derulantă conține diverse controale și acest Formular.

Selectați butonul (Button) și evenimentul Click:

Private Sub CommandButton_validate_Click()

     Range("A1") = Textbox_number.Value
     'Textbox_number este numele casetei de text
     'Value este o proprietate care conține valoarea casetei de text
    
     Unload Me
     'Descărcarea închide formularul (UserForm)
     'Folosim Me în loc de numele formularului (deoarece acest cod se află în mijlocul UserForm pe care vrem să-l închidem)
End Sub

Valoarea introdusă va fi deja salvată în celula A1 înainte de a închide acest formular (UserForm).

Adăugați oa doua legendă (Label) și editați următoarele proprietăți: Caption, Forecolor (culoare: roșu) și Visible (False pentru a ascunde controlul implicit) :

Acum să adăugăm un eveniment care va fi declanșat atunci când valoarea din câmpul de text este schimbată de utilizator. Evenimentul va afișa un mesaj de eroare dacă valoarea nu este numerică.

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'DACA este o valoare numerica...
         Label_error.Visible = False 'Titlul (Label) este ascuns
     Else 'IN CAZ CONTRAR...
         Label_error.Visible = True 'Numele este afișat
     End If
End Sub

Valoarea introdusă va fi testată de fiecare dată când este introdus următorul caracter.

Mai trebuie să adăugăm verificarea (validarea) valorilor introduse în formular. Vom afișa un mesaj dacă valoarea nu este un număr:

Private Sub CommandButton_validate_Click()
     If IsNumeric(Textbox_number.Value) Then 'DACA este o valoare numerica...
         Range("A1") = Textbox_number.Value 'Copiați pe A1
         Unload Me 'închid
     Else 'IN CAZ CONTRAR...
         MsgBox "Incorrect value" 'valoare invalida
     End If
End Sub

Pentru a nu lăsa partea dreaptă a formularului goală atunci când nu există niciun mesaj de eroare, putem reduce dimensiunea acestuia ajustând proprietatea Width a acestui formular:

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'DACA este o valoare numerica...
         Label_error.Visible = False 'Titlul (Label) este ascuns
         Me.Width = 156 'Lățimea formularului
     Else 'IN CAZ CONTRAR...
         Label_error.Visible = True 'Numele este afișat
         Me.Width = 244 'Lățimea formularului
     End If
End Sub

Puteți descărca fișierul Excel cu exemplu: userform1.xls

Iată rezultatul:

Checkboxes

Iată un exemplu de utilizare a CheckBox:

Când caseta de selectare este bifată/debifată, valoarea celulei asociate poate fi modificată utilizând evenimentul Click:

Private Sub CheckBox1_Click() 'Numărul 1
     If CheckBox1.Value = True Then 'DACĂ este selectat...
        Range("A2") = "Checked"
     Else 'DACĂ nu este selectat...
        Range("A2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox2_Click() 'Numarul 2
     If CheckBox2.Value = True Then 'DACĂ este selectat...
        Range("B2") = "Checked"
     Else 'DACĂ nu este selectat...
        Range("B2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox3_Click() 'Numărul 3
     If CheckBox3.Value = True Then 'DACĂ este selectat...
        Range("C2") = "Checked"
     Else 'DACĂ nu este selectat...
        Range("C2") = "Unchecked"
     End If
End Sub

În acest exemplu, casetele de selectare sunt inițial debifate când Formularul este deschis pentru prima dată.

Pentru a bifa fiecare casetă de selectare când valoarea celulei corespunzătoare este „Bifată” (“Checked”), vom rula verificarea activării formularului folosind UserForm_Initialize:

Private Sub UserForm_Initialize() 'Dacă se verifică
     If Range("A2") = "Checked" Then
         CheckBox1.Value = True
     End If
     
     If Range("B2") = "Checked" Then
         CheckBox2.Value = True
     End If
     
     If Range("C2") = "Checked" Then
         CheckBox3.Value = True
     End If
End Sub

Aici puteți vedea un exemplu în fișierul Excel terminat: userform2.xls

Butoane de opțiuni (Option Buttons)

Când folosește butoanele de opțiune (Option Buttons sau, uneori, numite și Radio Buttons) utilizatorul poate selecta o singură opțiune per „grup”, spre deosebire de casetele de selectare, în care utilizatorul poate bifa mai multe căsuțe deodată.

Pentru a crea un „grup”, mai întâi inserați Frame și apoi OptionButton:

Aici puteți vedea un exemplu în fișierul Excel terminat: userform3.xls

La trimiterea formularului, datele vor fi introduse în celula asociată cu numele coloanei selectate (column_value) și rândul (row_value).

Pentru a ști ce opțiuni au fost selectate, am putea face la fel ca în exemplul anterior (cu casete de selectare), dar vom folosi o buclă pentru a reduce dimensiunea codului.

Vom folosi For Fiecare buclă, care este un tip de buclă pe care nu l-am acoperit înainte. Această buclă vă permite să executați instrucțiuni pentru fiecare obiect dintr-un „grup de obiecte”:

Private Sub CommandButton1_Click()
     Dim column_value As String, row_value As String
     
     'Buclă pentru fiecare control Frame_column
     For Each column_button In Frame_column.Controls
         'Dacă valoarea de control = True (atunci dacă este selectată)...
         If column_button.Value Then
            'Variabila „column_value” preia valoarea textului butonului
            column_value = column_button.Caption
         End If
     Next
     
     'Ciclu pentru un alt bloc
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next

     Range(column_value & row_value) = "Cell chosen!"  '„Celula selectată!”
     
     'Închideți (descărcați) formularul (eu)
     Unload Me
End Sub

Formularul nostru introduce acum valoarea „Celula selectată!” în celula selectată.

Pentru a evita o eroare, trebuie să verificăm dacă utilizatorul a ales corect dintre două seturi de opțiuni.

În acest exemplu, atunci când formularul nu este încă completat, butonul Confirmare ("Confirm") va fi dezactivat (dezactivat). Nu este cea mai ușoară soluție, dar este un exemplu bun de ce funcțiile/procedurile sunt utile în mijlocul unui formular (UserForm).

Editați textul și proprietatea Enabled pentru a dezactiva butonul.

Rezultatul va fi următorul:

În codul anterior, am folosit două bucle For Fiecare pentru a obține valorile butoanelor de opțiuni (Option Buttons). Acum trebuie să folosim aceleași valori pentru butonul de confirmare ("Confirm") și evenimentul Click pentru cele zece opțiuni.

Pentru a face acest lucru, nu este nevoie să copiem buclele pentru fiecare eveniment, le vom apela printr-o funcție.

Începând cu codul anterior și modificându-l, vom obține acest rezultat:

 Private Function column_value()
 'Funcție care returnează o valoare text pentru butonul selectat (column_value)
     For Each column_button In Frame_column.Controls
         If column_button.Value Then
             column_value = column_button.Caption
         End If
     Next
 End Function

 Private Function row_value()
 'O funcție care returnează o valoare text pentru butonul selectat (row_value)
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next
 End Function

 Private Sub CommandButton1_Click() 'Acțiune care are loc când faceți clic pe ("Confirmați selecția")
     Range(column_value & row_value) = "Cell chosen!"  '„Celula selectată!”
     'column_value și row_value sunt valorile returnate de aceste funcții
     Unload Me
 End Sub

Tot ce ne rămâne de făcut este să creăm o procedură care să verifice dacă butoanele de opțiune au fost selectate corect (prin apelarea a două funcții) și care să activeze acel buton atunci când este necesar.

Din nou, validarea se face într-o procedură separată pentru a evita copierea codului de 10 ori pentru fiecare eveniment al fiecărui buton radio:

Private Sub activate_button()
 'Activarea butonului dacă starea este testată cu succes
     If column_value <> "" And row_value <> "" Then
     'column_value și row_value sunt valorile returnate de aceste funcții
         CommandButton1.Enabled = True
         CommandButton1.Caption = "Confirm your selection"  '„Confirmați alegerea”
     End If
End Sub

Private Sub OptionButton11_Click()
     activate_button 'Începem procedura „activate_button”.
End Sub
Private Sub OptionButton12_Click()
     activate_button
End Sub
Private Sub OptionButton13_Click()
     activate_button
End Sub
Private Sub OptionButton14_Click()
     activate_button
End Sub
Private Sub OptionButton15_Click()
     activate_button
End Sub
Private Sub OptionButton16_Click()
     activate_button
End Sub
Private Sub OptionButton17_Click()
     activate_button
End Sub
Private Sub OptionButton18_Click()
     activate_button
End Sub
Private Sub OptionButton19_Click()
     activate_button
End Sub
Private Sub OptionButton20_Click()
     activate_button
End Sub

Aici puteți vedea un exemplu în fișierul Excel terminat: userform3b.xls