TOP

VBA-Leçon 12.2. Contrôles (Controls)

Les contrôles (Controls) ont toutes sortes de propriétés et de nombreux événements qui leur sont associés, mais pour l'instant, nous n'en examinerons que quelques-uns qui sont utilisés dans la programmation sur VBA.


Commençons par ajouter 3 contrôles - Label, TextBox et CommandButton :

Modifiez le nom et les propriétés de ce contrôle (à l'aide de la propriété Caption qui contient le texte) pour obtenir le résultat suivant :

Désormais, lorsque nous entrons le numéro et cliquons sur OK, rien ne se passe.

Pour créer une action, nous ajouterons un événement qui écrira la valeur saisie dans la zone de texte dans la cellule A1 et fermera le formulaire.

Vous pouvez accéder aux options présentées ci-dessous en double-cliquant sur le contrôle :

Cette liste déroulante contient divers contrôles et ce formulaire.

Sélectionnez le bouton (Button) et l'événement Click :

Private Sub CommandButton_validate_Click()

     Range("A1") = Textbox_number.Value
     'Textbox_number est le nom de la zone de texte
     'Value est une propriété contenant la valeur de la zone de texte
    
     Unload Me
     'Unload ferme le formulaire (UserForm)
     'Nous utilisons Me à la place du nom du formulaire (car ce code est au milieu de UserForm que nous voulons fermer)
End Sub

La valeur saisie sera désormais déjà enregistrée dans la cellule A1 avant de fermer ce formulaire (UserForm).

Ajoutez une deuxième légende (Label) et éditez les propriétés suivantes : Caption, Forecolor (couleur : rouge) et Visible (False pour masquer le contrôle par défaut) :

Ajoutons maintenant un événement qui sera déclenché lorsque la valeur dans le champ de texte est modifiée par l'utilisateur. L'événement affichera un message d'erreur si la valeur n'est pas numérique.

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'SI est une valeur numérique...
         Label_error.Visible = False 'Le titre (Label) est masqué
     Else 'SINON...
         Label_error.Visible = True 'Le nom s'affiche
     End If
End Sub

La valeur saisie sera testée à chaque saisie du caractère suivant.

Il faut encore ajouter la vérification (validation) des valeurs saisies sur le formulaire. Nous afficherons un message si la valeur n'est pas un nombre :

Private Sub CommandButton_validate_Click()
     If IsNumeric(Textbox_number.Value) Then 'SI est une valeur numérique...
         Range("A1") = Textbox_number.Value 'Copier vers A1
         Unload Me 'je ferme
     Else 'SINON...
         MsgBox "Incorrect value" 'valeur invalide
     End If
End Sub

Afin de ne pas laisser le côté droit du formulaire vide lorsqu'il n'y a pas de message d'erreur, nous pouvons réduire sa taille en ajustant la propriété Width de ce formulaire :

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'SI est une valeur numérique...
         Label_error.Visible = False 'Le titre (Label) est masqué
         Me.Width = 156 'Largeur du formulaire
     Else 'SINON...
         Label_error.Visible = True 'Le nom s'affiche
         Me.Width = 244 'Largeur du formulaire
     End If
End Sub

Vous pouvez télécharger le fichier Excel avec exemple : userform1.xls

Voici le résultat :

Checkboxes

Voici un exemple d'utilisation de CheckBox :

Lorsque la case est cochée/décochée, la valeur de la cellule associée peut être modifiée en utilisant l'événement Click :

Private Sub CheckBox1_Click() 'Numéro 1
     If CheckBox1.Value = True Then 'SI sélectionné...
        Range("A2") = "Checked"
     Else 'SI non sélectionné...
        Range("A2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox2_Click() 'Numéro 2
     If CheckBox2.Value = True Then 'SI sélectionné...
        Range("B2") = "Checked"
     Else 'SI non sélectionné...
        Range("B2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox3_Click() 'Numéro 3
     If CheckBox3.Value = True Then 'SI sélectionné...
        Range("C2") = "Checked"
     Else 'SI non sélectionné...
        Range("C2") = "Unchecked"
     End If
End Sub

Dans cet exemple, les cases sont initialement décochées lorsque le formulaire est ouvert pour la première fois.

Pour cocher chaque case lorsque la valeur de la cellule correspondante est "Checked" ("Checked"), nous lancerons la vérification de l'activation du formulaire à l'aide de UserForm_Initialize :

Private Sub UserForm_Initialize() 'Si coché
     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

Ici vous pouvez voir un exemple dans le fichier Excel terminé : userform2.xls

Boutons d'option (Option Buttons)

Lors de l'utilisation des boutons d'option (Option Buttons ou, parfois, également appelés Radio Buttons), l'utilisateur ne peut sélectionner qu'une seule option par "groupe", contrairement aux cases à cocher, où l'utilisateur peut cocher plusieurs cases à la fois.

Pour créer un "groupe", insérez d'abord Frame puis OptionButton :

Ici vous pouvez voir un exemple dans le fichier Excel terminé : userform3.xls

Lors de la soumission du formulaire, les données seront saisies dans la cellule associée au nom de colonne sélectionné (column_value) et à la ligne (row_value).

Afin de savoir quelles options ont été sélectionnées, nous pourrions faire la même chose que dans l'exemple précédent (avec des cases à cocher), mais nous utiliserons une boucle pour réduire la taille du code.

Nous utiliserons la boucle For Each, qui est un type de boucle que nous n'avons pas abordé auparavant. Cette boucle permet d'exécuter des instructions pour chaque objet d'un "groupe d'objets" :

Private Sub CommandButton1_Click()
     Dim column_value As String, row_value As String
     
     'Boucle pour chaque contrôle Frame_column
     For Each column_button In Frame_column.Controls
         'Si valeur de contrôle = True (alors si sélectionné)...
         If column_button.Value Then
            'La variable "column_value" prend la valeur du texte du bouton
            column_value = column_button.Caption
         End If
     Next
     
     'Cycle pour un autre 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!"  '"Cellule sélectionnée !"
     
     'Fermer (Décharger) le formulaire (Moi)
     Unload Me
End Sub

Notre formulaire saisit désormais la valeur « Cellule sélectionnée ! » dans la cellule sélectionnée.

Pour éviter une erreur, nous devons vérifier si l'utilisateur a choisi correctement parmi deux ensembles d'options.

Dans cet exemple, lorsque le formulaire n'est pas encore complété, le bouton Confirmer ("Confirm") sera grisé (désactivé). Ce n'est pas la solution la plus simple, mais c'est un bon exemple de l'utilité des fonctions/procédures au milieu d'un formulaire (UserForm).

Modifiez le texte et la propriété Enabled pour désactiver le bouton.

Le résultat sera le suivant :

Dans le code précédent, nous avons utilisé deux boucles For Each pour obtenir les valeurs des boutons d'option (Option Buttons). Nous devons maintenant utiliser les mêmes valeurs pour le bouton Confirmer ("Confirm") et l'événement Click pour les dix options.

Pour ce faire, nous n'avons pas besoin de copier les boucles pour chaque événement, nous les appellerons via une fonction.

En repartant du code précédent et en le modifiant, nous obtiendrons ce résultat :

 Private Function column_value()
 'Fonction qui renvoie une valeur de texte pour le bouton sélectionné (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()
 'Une fonction qui renvoie une valeur de texte pour le bouton sélectionné (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() 'Action qui se produit lorsque vous cliquez sur ("Confirmez votre sélection")
     Range(column_value & row_value) = "Cell chosen!"  '"Cellule sélectionnée !"
     'column_value et row_value sont les valeurs renvoyées par ces fonctions
     Unload Me
 End Sub

Il ne nous reste plus qu'à créer une routine qui vérifie si les boutons d'option ont été correctement sélectionnés (en appelant deux fonctions) et qui active ce bouton en cas de besoin.

Là encore, la validation se fait dans une procédure distincte pour éviter de recopier le code 10 fois pour chaque événement de chaque bouton radio :

Private Sub activate_button()
 'Activation du bouton si la condition est testée avec succès
     If column_value <> "" And row_value <> "" Then
     'column_value et row_value sont les valeurs renvoyées par ces fonctions
         CommandButton1.Enabled = True
         CommandButton1.Caption = "Confirm your selection"  '"Confirmez votre choix"
     End If
End Sub

Private Sub OptionButton11_Click()
     activate_button 'On lance la procédure "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

Ici vous pouvez voir un exemple dans le fichier Excel terminé : userform3b.xls