Vous avez apprécié ?
Partagez ;-)

Cours VBA : les contrôles (exercice)

Pour mettre en pratique l'utilisation des contrôles, rien de tel qu'un petit exercice ...

Voici le point de départ de l'exercice :

Le fichier : controles_exercice.xls

depart - controles exercice

Vous l'aurez compris, l'objectif est de remplir le tableau via le formulaire.

Quelques points à prendre en compte :

  • Lister les pays en fonction de la liste de la seconde feuille
  • Vérifier le contenu des contrôles avant d'ajouter un nouveau contact
  • Après insertion, réinitialiser les valeurs des contrôles sans fermer le formulaire

Prenez un moment pour réaliser cet exercice avant de passer à la solution ...

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Voici une solution pour réaliser cet exercice

La première action effectuée a été d'augmenter la propriété Zoom de l'UserForm à 120 pour plus de confort à l'utilisation du formulaire :

1 - controles exercice

Les tests des boutons d'option ont déjà été vus à la première page des contrôles, c'est pour cela qu'une solution plus simple a été utilisée ici.

Le bouton "Mme" a été choisi par défaut (propriété Value : True), cela implique qu'il ne sera pas nécessaire de vérifier si le choix de la civilité a été effectué.

Le bouton "Fermer"

Private Sub CommandButton_Fermer_Click()
    Unload Me
End Sub

Le contenu de la liste déroulante

Private Sub UserForm_Initialize() 'Chargement de la liste au lancement de l'UserForm
   For i = 1 To 231 'Liste des 231 pays de la feuille "Pays"
      ComboBox_Pays.AddItem Sheets("Pays").Cells(i, 1)
   Next
End Sub

Vérification des contrôles

Une solution simple consiste à afficher une boîte de dialogue si l'un des contrôles est vide :

Private Sub CommandButton_Ajouter_Click()
    If TextBox_Nom.Value = "" Or TextBox_Prenom.Value = "" Or TextBox_Adresse.Value = "" Or TextBox_Lieu.Value = "" Or ComboBox_Pays.Value = "" Then
        MsgBox "Formulaire incomplet"
    Else
        'Instructions pour insérer le contact ici ...
    End If
End Sub

Mais pour compliquer un peu les choses, chaque contrôle sera testé individuellement, et si l'un d'eux n'est pas rempli, son intitulé (Label) sera coloré en rouge :

Private Sub CommandButton_Ajouter_Click()
    'Coloration des Labels en noir
    Label_Nom.ForeColor = RGB(0, 0, 0)
    Label_Prenom.ForeColor = RGB(0, 0, 0)
    Label_Adresse.ForeColor = RGB(0, 0, 0)
    Label_Lieu.ForeColor = RGB(0, 0, 0)
    Label_Pays.ForeColor = RGB(0, 0, 0)

    'Contrôles de contenu
    If TextBox_Nom.Value = "" Then 'SI pas de "nom" ...
        Label_Nom.ForeColor = RGB(255, 0, 0) 'Label "nom" en rouge
    ElseIf TextBox_Prenom.Value = "" Then
        Label_Prenom.ForeColor = RGB(255, 0, 0)
    ElseIf TextBox_Adresse.Value = "" Then
        Label_Adresse.ForeColor = RGB(255, 0, 0)
    ElseIf TextBox_Lieu.Value = "" Then
        Label_Lieu.ForeColor = RGB(255, 0, 0)
    ElseIf ComboBox_Pays.Value = "" Then
        Label_Pays.ForeColor = RGB(255, 0, 0)
    Else
        'Instructions pour insérer le contact ici ...
    End If
End Sub
2 - controles exercice

Insertion des données

Le code suivant a été inséré à l'emplacement indiqué sur la code précédent (sous forme de commentaire) :

Dim no_ligne As Integer, civilite As String

'Choix de civilité
For Each bouton_civilite In Frame_Civilite.Controls
    If bouton_civilite.Value Then
        civilite = bouton_civilite.Caption 'Civilité choisie
    End If
Next

'no_ligne = N° de ligne de la dernière cellule non vide de la colonne +1
no_ligne = Range("A65536").End(xlUp).Row + 1

'Insertion des valeurs sur la feuille
Cells(no_ligne, 1) = civilite
Cells(no_ligne, 2) = TextBox_Nom.Value
Cells(no_ligne, 3) = TextBox_Prenom.Value
Cells(no_ligne, 4) = TextBox_Adresse.Value
Cells(no_ligne, 5) = TextBox_Lieu.Value
Cells(no_ligne, 6) = ComboBox_Pays.Value

'Après insertion, on remet les valeurs initiales
OptionButton1.Value = True
TextBox_Nom.Value = ""
TextBox_Prenom.Value = ""
TextBox_Adresse.Value = ""
TextBox_Lieu.Value = ""
ComboBox_Pays.ListIndex = -1

Vue d'ensemble

Pour terminer, voici le code complet ainsi que le fichier :

Private Sub CommandButton_Fermer_Click()
    Unload Me
End Sub

Private Sub UserForm_Initialize() 'Liste des 231 pays de la feuille "Pays"
   For i = 1 To 231
       ComboBox_Pays.AddItem Sheets("Pays").Cells(i, 1)
   Next
End Sub

Private Sub CommandButton_Ajouter_Click()
    'Coloration des Labels en noir
    Label_Nom.ForeColor = RGB(0, 0, 0)
    Label_Prenom.ForeColor = RGB(0, 0, 0)
    Label_Adresse.ForeColor = RGB(0, 0, 0)
    Label_Lieu.ForeColor = RGB(0, 0, 0)
    Label_Pays.ForeColor = RGB(0, 0, 0)

    'Contrôles de contenu
    If TextBox_Nom.Value = "" Then 'SI pas de "nom" ...
        Label_Nom.ForeColor = RGB(255, 0, 0) 'Label "nom" en rouge
    ElseIf TextBox_Prenom.Value = "" Then
        Label_Prenom.ForeColor = RGB(255, 0, 0)
    ElseIf TextBox_Adresse.Value = "" Then
        Label_Adresse.ForeColor = RGB(255, 0, 0)
    ElseIf TextBox_Lieu.Value = "" Then
        Label_Lieu.ForeColor = RGB(255, 0, 0)
    ElseIf ComboBox_Pays.Value = "" Then
        Label_Pays.ForeColor = RGB(255, 0, 0)
    Else
        'Si le formulaire est complet, on insère les valeurs sur la feuille
        Dim no_ligne As Integer, civilite As String
       
        'Choix de civilité
        For Each bouton_civilite In Frame_Civilite.Controls
            If bouton_civilite.Value Then
                civilite = bouton_civilite.Caption
            End If
        Next

        'no_ligne = N° de ligne de la dernière cellule non vide de la colonne +1
        no_ligne = Range("A65536").End(xlUp).Row + 1

        'Insertion des valeurs sur la feuille
        Cells(no_ligne, 1) = civilite
        Cells(no_ligne, 2) = TextBox_Nom.Value
        Cells(no_ligne, 3) = TextBox_Prenom.Value
        Cells(no_ligne, 4) = TextBox_Adresse.Value
        Cells(no_ligne, 5) = TextBox_Lieu.Value
        Cells(no_ligne, 6) = ComboBox_Pays.Value
       
        'Après insertion, on remet les valeurs initiales
        OptionButton1.Value = True
        TextBox_Nom.Value = ""
        TextBox_Prenom.Value = ""
        TextBox_Adresse.Value = ""
        TextBox_Lieu.Value = ""
        ComboBox_Pays.ListIndex = -1
    End If
End Sub

Le fichier : controles_exercice2.xls