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
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 :
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 SubLe 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 SubVé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 SubMais 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
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 = -1Vue 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 SubLe fichier : controles_exercice2.xls

