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 :

vba inserer commandbutton controles

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 :

num controles
Pour positionner les contrôles de manière plus précise qu'avec un déplacement manuel, modifiez les propriétés Left et Top du contrôle. De même, pour redimensionner les contrôles de manière plus précise qu'avec un redimensionnement manuel, modifiez les propriétés Width et Height.

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 :

evenements controles

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 :

vba userform champ erreur rouge controles

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 :

vba userform cases cocher controles

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
Controls("CheckBox1") est l'équivalent du contrôle CheckBox1 et permet d'accéder à un contrôle en fonction de son nom, ce qui peut être très pratique notamment dans une boucle.

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("B2") = "Oui" Then
        CheckBox1 = True
    End If
    
    If Range("B3") = "Oui" Then
        CheckBox2 = True
    End If
    
    If Range("B4") = "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
vba userform cases cochees controles

Le fichier : userform2.xlsm