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:
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
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