Cours VBA : les contrôles
Les contrôles sont les éléments (boutons, intitulés, zone de texte, cases à cocher, etc.) qui peuvent être insérés sur un UserForm (ou sur une feuille Excel).
Les contrôles ont également toute une panoplie de propriétés et d'événements qui diffèrent d'un contrôle à l'autre.
Pour commencer, ajoutez un UserForm et insérez les 3 contrôles suivants : un intitulé Label, une zone de texte TextBox et un bouton CommandButton :

Modifiez les propriétés de l'UserForm et des contrôles (dont les propriétés (Name) pour le nom, Caption pour le texte et Font pour la taille du texte) pour obtenir ceci :

Pour le moment, lorsque l'on entre un nombre et que l'on clique sur le bouton, il ne se passe rien.
Pour y remédier, nous allons commencer par ajouter un événement pour entrer la valeur de la zone de texte dans la cellule A1 et fermer l'UserForm.
En double-cliquant sur le bouton, un événement par défaut est ajouté dans le code de l'UserForm. Dans ce cas, il s'agit de l'événement souhaité, mais en cas de besoin, vous pouvez sélectionner un autre événement dans la liste :

L'événement Click est déclenché au clic sur le bouton :
Private Sub CommandButton_valider_Click()
'La cellule A1 (de la feuille active) obtient la valeur de la zone de texte nommée "TextBox_nombre"
Range("A1") = TextBox_nombre.Value
'Fermeture (Unload) de l'UserForm (Me)
Unload Me
End Sub
La valeur est alors entrée dans la cellule A1 avant de fermer l'UserForm.
Nous allons maintenant ajouter un événement qui s'active au changement de valeur de la zone de texte et qui va modifier la couleur de fond si la valeur n'est pas numérique :
Private Sub TextBox_nombre_Change()
If IsNumeric(TextBox_nombre.Value) Then 'Si valeur numérique
TextBox_nombre.BackColor = RGB(255, 255, 255) 'Blanc
Else 'Sinon
TextBox_nombre.BackColor = RGB(247, 205, 201) 'Rouge clair
End If
End Sub
L'événement est déclenché à chaque entrée ou suppression de caractère dans la zone de texte.
Aperçu :

Il nous reste encore à empêcher la validation du formulaire si la valeur n'est pas numérique en ajoutant une instruction If :
Private Sub CommandButton_valider_Click()
'Si valeur numérique
If IsNumeric(TextBox_nombre.Value) Then
Range("A1") = TextBox_nombre.Value
Unload Me
End If
End Sub
Le fichier : userform1.xlsm
Les cases à cocher (CheckBox)
Voici un exemple d'utilisation de cases à cocher dont l'objectif est de modifier les valeurs en colonne B en fonction des cases cochées dans l'UserForm :

L'événement Click du bouton enregistre ici les choix de l'utilisateur et ferme ensuite l'UserForm :
Private Sub CommandButton_valider_Click()
'Numéro 1
If CheckBox1.Value = True Then 'Si coché
Range("B2") = "Oui"
Else 'Si décoché
Range("B2") = "Non"
End If
'Numéro 2
If CheckBox2.Value = True Then 'Si coché
Range("B3") = "Oui"
Else 'Si décoché
Range("B3") = "Non"
End If
'Numéro 3
If CheckBox3.Value = True Then 'Si coché
Range("B4") = "Oui"
Else 'Si décoché
Range("B4") = "Non"
End If
'Fermeture
Unload Me
End Sub
Rappelez-vous qu'une condition cherche toujours à savoir si le résultat du test est True :
If CheckBox1.Value = True Then 'Si coché
Il n'est donc pas utile d'ajouter = True :
If CheckBox1.Value Then 'Si coché
Pour simplifier encore davantage l'écriture, la propriété Value est la propriété par défaut de la plupart des contrôles, il n'est donc pas nécessaire de l'ajouter (comme nous l'avions vu précédemment avec la propriété Value des cellules) :
If CheckBox1.Value Then 'Si coché
L'ajout de .Value est donc facultatif :
If CheckBox1 Then 'Si coché
Suite à ces simplifications, le code ressemble maintenant à ceci :
Private Sub CommandButton_valider_Click()
'Numéro 1
If CheckBox1 Then 'Si coché
Range("B2") = "Oui"
Else 'Si décoché
Range("B2") = "Non"
End If
'Numéro 2
If CheckBox2 Then 'Si coché
Range("B3") = "Oui"
Else 'Si décoché
Range("B3") = "Non"
End If
'Numéro 3
If CheckBox3 Then 'Si coché
Range("B4") = "Oui"
Else 'Si décoché
Range("B4") = "Non"
End If
'Fermeture
Unload Me
End Sub
Maintenant, imaginez que vous n'ayez pas 3 mais 30 cases à cocher ...
Dans ce cas, l'utilisation d'une boucle est plus que bienvenue :
Private Sub CommandButton_valider_Click()
Dim i As Integer
'Boucle des cases à cocher
For i = 1 To 3
If Controls("CheckBox" & i) Then 'Si coché
Range("B" & i + 1) = "Oui"
Else 'Si décoché
Range("B" & i + 1) = "Non"
End If
Next
'Fermeture
Unload Me
End Sub
Dans cet exemple, les cases sont toutes décochées à l'ouverture de l'UserForm.
Pour cocher les cases dont la valeur de la cellule correspondante est Oui au lancement de l'UserForm, ajoutez l'événement UserForm_Initialize et les tests suivants :
Private Sub UserForm_Initialize()
If Range("A2") = "Oui" Then
CheckBox1 = True
End If
If Range("B2") = "Oui" Then
CheckBox2 = True
End If
If Range("C2") = "Oui" Then
CheckBox3 = True
End If
End Sub
Pour simplifier ce code, vous avez la possibilité d'écrire l'instruction If sur une seule ligne et sans End If lorsqu'il n'y a qu'une seule action à effectuer :
Private Sub UserForm_Initialize()
If Range("B2") = "Oui" Then CheckBox1 = True
If Range("B3") = "Oui" Then CheckBox2 = True
If Range("B4") = "Oui" Then CheckBox3 = True
End Sub
L'utilisation d'une boucle est également possible :
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 3
If Range("B" & i + 1) = "Oui" Then Controls("CheckBox" & i) = True
Next
End Sub

Le fichier : userform2.xlsm