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 :


vba excel formulaire ajout contacts controles exercice

Vous l'aurez compris, l'objectif est de remplir le tableau de la feuille à l'aide du formulaire.

Quelques points à prendre en compte :

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
excel userform ajout contacts controles exercice

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.

Même si vous avez un peu de mal avec cette dernière ligne de code, retenez-la bien car elle pourra vous servir à chaque fois que vous aurez besoin d'insérer une ligne à la suite d'un tableau (ou de connaître le numéro de la dernière ligne d'un tableau, et dans ce cas, il ne faudra pas ajouter + 1).

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