Cours VBA : les contrôles (exercice)
Exercice pratique
Il est temps de mettre en pratique l'utilisation des contrôles avec un petit exercice.
Le fichier : controles_exercice.xlsm
Voici le point de départ de l'exercice :

Vous l'aurez compris, l'objectif est de remplir le tableau de la feuille à l'aide du formulaire.
Quelques points à prendre en compte :
- Lister les pays en fonction de la liste de la seconde feuille
- Vérifier si tous les champs ont été renseignés avant d'ajouter un nouveau contact
- Après ajout d'un contact, réinitialiser le formulaire sans le fermer
Prenez un moment pour réaliser cet exercice avant de passer à la solution ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Voici une solution parmi d'autres pour réaliser cet exercice.
Le bouton "Fermer"
Evénement Click du bouton Fermer :
Private Sub CommandButton_fermer_Click()
Unload Me
End Sub
Le contenu de la liste déroulante
Evénement Initialize de l'UserForm :
Private Sub UserForm_Initialize()
Dim i As Integer
'Boucle pour ajouter les pays dans la liste déroulante
For i = 1 To 231
ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub
Vérification des contrôles
Une solution simple pour s'assurer qu'un bouton d'option soit sélectionné est d'ajouter un choix par défaut (propriété Value à True à l'un des boutons).
Mais pour l'exercice, ces contrôles seront testés comme les autres.
Une solution possible consiste à afficher une boîte de dialogue si n'importe lequel des champs a été oublié :
Private Sub CommandButton_ajouter_Click()
'Si formulaire complet
If (OptionButton_1 Or OptionButton_2 Or OptionButton_3) And TextBox_nom <> "" And TextBox_prenom <> "" And TextBox_adresse <> "" And TextBox_lieu <> "" And ComboBox_pays.ListIndex >= 0 Then
'Instructions pour insérer le contact ici ...
'Si formulaire incomplet
Else
MsgBox "Formulaire incomplet"
End If
End Sub
Mais pour compliquer un peu les choses, chaque champ sera testé individuellement, et si l'un d'entre eux n'a pas été renseigné, son intitulé sera coloré en rouge :
Private Sub CommandButton_ajouter_Click()
'Coloration des Labels en noir (&H80000012 = couleur de base de la propriété ForeColor)
Label_civilite.ForeColor = &H80000012
Label_nom.ForeColor = &H80000012
Label_prenom.ForeColor = &H80000012
Label_adresse.ForeColor = &H80000012
Label_lieu.ForeColor = &H80000012
Label_pays.ForeColor = &H80000012
'Contrôles des champs
If OptionButton_1 = False And OptionButton_2 = False And OptionButton_3 = False Then 'Si pas de civilité
Label_civilite.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_nom = "" Then 'Si pas de nom
Label_nom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_prenom = "" Then 'Si pas de prénom
Label_prenom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_adresse = "" Then 'Si pas d'adresse
Label_adresse.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_lieu = "" Then 'Si pas de lieu
Label_lieu.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_pays.ListIndex = -1 Then 'Si pas de pays
Label_pays.ForeColor = RGB(255, 0, 0)
Else
'Instructions pour insérer le contact ici ...
End If
End Sub

Insertion des données
Le code suivant a été inséré à l'emplacement indiqué sur le code précédent (sous forme de commentaire) :
Dim ligne As Integer
'Numéro de ligne de la première cellule vide de la colonne 1 en partant du bas de la feuille
ligne = Cells(Rows.Count, 1).End(xlUp).Row + 1
'Choix de civilité
If OptionButton_1 Then
Cells(ligne, 1) = OptionButton_1.Caption
ElseIf OptionButton_2 Then
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
End If
'Insertion des valeurs sur la feuille
Cells(ligne, 2) = TextBox_nom
Cells(ligne, 3) = TextBox_prenom
Cells(ligne, 4) = TextBox_adresse
Cells(ligne, 5) = TextBox_lieu
Cells(ligne, 6) = ComboBox_pays
'Après insertion, réinitialisation du formulaire
OptionButton_1 = False
OptionButton_2 = False
OptionButton_3 = False
TextBox_nom = ""
TextBox_prenom = ""
TextBox_adresse = ""
TextBox_lieu = ""
ComboBox_pays.ListIndex = -1
Dans ce code, le numéro de la ligne d'insertion est obtenu grâce à :
ligne = Cells(Rows.Count, 1).End(xlUp).Row + 1
Rows.Count retourne ici le nombre de ligne de la feuille, Cells(Rows.Count, 1) correspond donc à la dernière cellule de la colonne 1.
En partant de cette dernière cellule et en recherchant vers le haut (xlUp), Excel va retourner le numéro de ligne de la première cellule non vide de cette colonne (qui sera ici la dernière ligne complétée du tableau). Et puisque l'on ne recherche pas la dernière ligne complétée du tableau mais celle juste au-dessous, il faut encore ajouter + 1 à ce numéro.
Vue d'ensemble
Pour terminer, voici le code complet ainsi que le fichier :
'Ouverture de l'UserForm
Private Sub UserForm_Initialize()
Dim i As Integer
'Boucle pour ajouter les pays dans la liste déroulante
For i = 1 To 231
ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub
'Bouton Ajouter
Private Sub CommandButton_ajouter_Click()
'Coloration des Labels en noir (&H80000012 = couleur de base de la propriété ForeColor)
Label_civilite.ForeColor = &H80000012
Label_nom.ForeColor = &H80000012
Label_prenom.ForeColor = &H80000012
Label_adresse.ForeColor = &H80000012
Label_lieu.ForeColor = &H80000012
Label_pays.ForeColor = &H80000012
'Contrôles des champs
If OptionButton_1 = False And OptionButton_2 = False And OptionButton_3 = False Then 'Si pas de civilité
Label_civilite.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_nom = "" Then 'Si pas de nom
Label_nom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_prenom = "" Then 'Si pas de prénom
Label_prenom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_adresse = "" Then 'Si pas d'adresse
Label_adresse.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_lieu = "" Then 'Si pas de lieu
Label_lieu.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_pays.ListIndex = -1 Then 'Si pas de pays
Label_pays.ForeColor = RGB(255, 0, 0)
Else
Dim ligne As Integer
'Numéro de ligne de la première cellule vide de la colonne 1 en partant du bas de la feuille
ligne = Cells(Rows.Count, 1).End(xlUp).Row + 1
'Choix de civilité
If OptionButton_1 Then
Cells(ligne, 1) = OptionButton_1.Caption
ElseIf OptionButton_2 Then
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
End If
'Insertion des valeurs sur la feuille
Cells(ligne, 2) = TextBox_nom
Cells(ligne, 3) = TextBox_prenom
Cells(ligne, 4) = TextBox_adresse
Cells(ligne, 5) = TextBox_lieu
Cells(ligne, 6) = ComboBox_pays
'Après insertion, réinitialisation du formulaire
OptionButton_1 = False
OptionButton_2 = False
OptionButton_3 = False
TextBox_nom = ""
TextBox_prenom = ""
TextBox_adresse = ""
TextBox_lieu = ""
ComboBox_pays.ListIndex = -1
End If
End Sub
'Bouton Fermer
Private Sub CommandButton_fermer_Click()
Unload Me
End Sub
Le fichier complété : controles_exercice2.xlsm