Absolument !
Pour aller plus loin dans la conception de UserForms avec VBA Excel, voici des
exercices supplémentaires qui abordent des concepts plus avancés et des scénarios plus
réalistes.
Document d'Exercices d'Application : Conception de
UserForms avec VBA Excel (Suite)
Ces exercices complémentaires vous aideront à explorer des fonctionnalités plus complexes et
à améliorer l'interactivité de vos UserForms.
Prérequis : Avoir terminé les exercices précédents.
Exercice 6 : UserForm avec Contrôles Dépendants et Formatage
Objectif : Créer un formulaire où la sélection d'un contrôle affecte le contenu ou la visibilité d'un
autre, et appliquer des formats spécifiques.
Étapes :
1. Créer un nouveau UserForm :
○ Renommez-le frmFacturation.
○ Changez son Caption en "Génération de Factures Simples".
2. Préparer les données dans Excel :
○ Feuille "Articles" (par exemple, en Feuil2):
■ A1: Nom Article | B1: Prix Unitaire | C1: Stock
■ A2: Ordinateur | B2: 850 | C2: 10
■ A3: Écran | B3: 150 | C3: 25
■ A4: Souris | B4: 15 | C4: 100
■ A5: Clavier | B5: 30 | C5: 50
○ Feuille "Factures" (par exemple, en Feuil3):
■ A1: Num Facture | B1: Date | C1: Article | D1: Quantité | E1: Prix Unitaire |
F1: Total Article | G1: Client
3. Ajouter les contrôles sur frmFacturation :
○ Label : "Numéro de Facture :"
○ TextBox : txtNumFacture (Désactivé, sera rempli automatiquement)
■ Enabled = False
○ Label : "Date :"
○ TextBox : txtDateFacture (Rempli automatiquement avec la date du jour)
○ Label : "Client :"
○ TextBox : txtClient
○ Label : "Sélectionnez l'article :"
○ ComboBox : cboArticle
○ Label : "Prix Unitaire :"
○ TextBox : txtPrixUnitaire (Désactivé, rempli par cboArticle)
■ Enabled = False
○ Label : "Quantité :"
○ TextBox : txtQuantite
○ Label : "Total Article :"
○ TextBox : txtTotalArticle (Désactivé, calculé automatiquement)
■ Enabled = False
○ CommandButton : Caption = "Ajouter à la Facture", cmdAjouterLigne
○ ListBox : lstLignesFacture (Pour afficher les articles ajoutés)
■ ColumnCount = 4 (Article, Quantité, Prix Unit., Total)
■ ColumnWidths = "100;50;50;60"
○ Label : "Total Général :"
○ TextBox : txtTotalGeneral (Désactivé, calculé automatiquement)
■ Enabled = False
○ CommandButton : Caption = "Enregistrer Facture", cmdEnregistrerFacture
○ CommandButton : Caption = "Nouvelle Facture", cmdNouvelleFacture
○ CommandButton : Caption = "Fermer", cmdFermerFacture
4. Écrire le code VBA :
○ Dans UserForm_Initialize :
Private Sub UserForm_Initialize()
Dim wsArticles As Worksheet
Set wsArticles = [Link]("Articles") '
Assurez-vous que le nom correspond
[Link] = Format(Date, "dd/mm/yyyy")
[Link] = GetNextFactureNumber ' Appel à
une fonction pour le numéro de facture
[Link] = Format(0, "#,##0.00 €") '
Initialise le total général
' Remplir la ComboBox cboArticle
With [Link]
.Clear
Dim i As Long
For i = 2 To [Link]([Link],
1).End(xlUp).Row
.AddItem [Link](i, 1).Value ' Ajoute le
nom de l'article
Next i
End With
' Initialiser la ListBox
With [Link]
.Clear
.ColumnCount = 4
.ColumnWidths = "100;50;50;60"
End With
Call cmdNouvelleFacture_Click ' Réinitialise les champs
de saisie d'article
End Sub
' Fonction pour générer le prochain numéro de facture (à
placer dans un module standard)
Function GetNextFactureNumber() As String
Dim wsFactures As Worksheet
Set wsFactures = [Link]("Factures") '
Assurez-vous que le nom correspond
Dim lastRow As Long
lastRow = [Link]([Link], 1).End(xlUp).Row
Dim lastFactNum As String
If lastRow = 1 Then ' Si seulement l'en-tête existe
lastFactNum = "FAC-0000"
Else
lastFactNum = [Link](lastRow, 1).Value
End If
Dim numPart As Long
numPart = CLng(Right(lastFactNum, 4)) ' Récupère la
partie numérique
numPart = numPart + 1
GetNextFactureNumber = "FAC-" & Format(numPart, "0000")
End Function
○ Dans cboArticle_Change : (Se déclenche lorsque l'article sélectionné change)
Private Sub cboArticle_Change()
Dim wsArticles As Worksheet
Set wsArticles = [Link]("Articles")
Dim nomArticle As String
nomArticle = [Link]
Dim rFind As Range
Set rFind = [Link](1).Find(What:=nomArticle,
LookIn:=xlValues, LookAt:=xlWhole)
If Not rFind Is Nothing Then
[Link] = Format([Link](0,
1).Value, "#,##0.00 €") ' Affiche le prix
[Link] = "1" ' Définit la quantité par
défaut à 1
CalculateTotalArticle ' Recalcule le total de
l'article
Else
[Link] = ""
[Link] = ""
[Link] = ""
End If
End Sub
○ Dans txtQuantite_Change : (Se déclenche lorsque la quantité est modifiée)
Private Sub txtQuantite_Change()
CalculateTotalArticle
End Sub
Private Sub CalculateTotalArticle()
Dim prix As Double
Dim quantite As Long
Dim total As Double
' Supprime le symbole monétaire et les espaces pour la
conversion
Dim sPrix As String
sPrix = Replace([Link], "€", "")
sPrix = Replace(sPrix, " ", "")
sPrix = Replace(sPrix, ",", ".") ' S'assurer que le
séparateur décimal est un point
If IsNumeric(sPrix) Then
prix = CDbl(sPrix)
Else
prix = 0
End If
If IsNumeric([Link]) And [Link]
<> "" Then
quantite = CLng([Link])
Else
quantite = 0
End If
total = prix * quantite
[Link] = Format(total, "#,##0.00 €")
End Sub
○ Dans cmdAjouterLigne_Click :
Private Sub cmdAjouterLigne_Click()
' Validations
If [Link] = "" Then
MsgBox "Veuillez sélectionner un article.",
vbExclamation, "Erreur"
Exit Sub
End If
If Not IsNumeric([Link]) Or
CLng([Link]) <= 0 Then
MsgBox "La quantité doit être un nombre entier
positif.", vbExclamation, "Erreur"
[Link]
Exit Sub
End If
' Ajouter la ligne à la ListBox
With [Link]
.AddItem
.List(.ListCount - 1, 0) = [Link]
.List(.ListCount - 1, 1) = [Link]
.List(.ListCount - 1, 2) = [Link]
.List(.ListCount - 1, 3) = [Link]
End With
' Mettre à jour le total général
UpdateTotalGeneral
' Réinitialiser les champs de saisie d'article pour la
prochaine ligne
[Link] = -1 ' Désélectionne l'article
[Link] = ""
[Link] = ""
[Link] = ""
[Link]
End Sub
Private Sub UpdateTotalGeneral()
Dim totalGeneral As Double
totalGeneral = 0
Dim i As Long
With [Link]
For i = 0 To .ListCount - 1
Dim sTotalLigne As String
sTotalLigne = Replace(.List(i, 3), "€", "")
sTotalLigne = Replace(sTotalLligne, " ", "")
sTotalLigne = Replace(sTotalLigne, ",", ".")
If IsNumeric(sTotalLigne) Then
totalGeneral = totalGeneral +
CDbl(sTotalLigne)
End If
Next i
End With
[Link] = Format(totalGeneral, "#,##0.00
€")
End Sub
○ Dans cmdEnregistrerFacture_Click :
Private Sub cmdEnregistrerFacture_Click()
If [Link] = "" Then
MsgBox "Veuillez entrer le nom du client.",
vbExclamation, "Erreur"
[Link]
Exit Sub
End If
If [Link] = 0 Then
MsgBox "Veuillez ajouter au moins un article à la
facture.", vbExclamation, "Erreur"
Exit Sub
End If
Dim wsFactures As Worksheet
Set wsFactures = [Link]("Factures")
Dim numFacture As String
numFacture = [Link]
Dim dateFacture As Date
dateFacture = CDate([Link])
Dim client As String
client = [Link]
Dim i As Long
Dim derniereLigne As Long
' Enregistrer chaque ligne de la ListBox dans la feuille
Factures
With [Link]
For i = 0 To .ListCount - 1
derniereLigne = [Link]([Link],
1).End(xlUp).Row + 1
[Link](derniereLigne, 1).Value =
numFacture
[Link](derniereLigne, 2).Value =
dateFacture
[Link](derniereLigne, 3).Value =
.List(i, 0) ' Article
[Link](derniereLigne, 4).Value =
CLng(.List(i, 1)) ' Quantité
[Link](derniereLigne, 5).Value =
CDbl(Replace(Replace(.List(i, 2), "€", ""), " ", "")),
"#,##0.00" ' Prix Unitaire
[Link](derniereLigne, 6).Value =
CDbl(Replace(Replace(.List(i, 3), "€", ""), " ", "")),
"#,##0.00" ' Total Article
[Link](derniereLigne, 7).Value = client
Next i
End With
MsgBox "Facture " & numFacture & " enregistrée avec
succès !", vbInformation, "Confirmation"
Call cmdNouvelleFacture_Click ' Prépare pour une nouvelle
facture
Call UserForm_Initialize ' Réinitialise le numéro de
facture et la date
End Sub
○ Dans cmdNouvelleFacture_Click :
Private Sub cmdNouvelleFacture_Click()
[Link] = ""
[Link] = -1 ' Désélectionne l'article
[Link] = ""
[Link] = ""
[Link] = ""
[Link] ' Efface les lignes de la
ListBox
[Link] = Format(0, "#,##0.00 €") '
Réinitialise le total général
[Link]
End Sub
○ Dans cmdFermerFacture_Click :
Private Sub cmdFermerFacture_Click()
Unload Me
End Sub
5. Créer une macro pour afficher frmFacturation :
Sub GenererFacture()
[Link]
End Sub
6. Tester : Exécutez la macro, testez la sélection d'articles, la saisie de quantités, l'ajout de
lignes, et l'enregistrement de la facture.
Exercice 7 : Modification de Données via UserForm
Objectif : Créer un UserForm pour rechercher, afficher et permettre la modification de données
existantes dans une feuille Excel.
Étapes :
1. Reprendre l'Exercice 2 (frmSaisieDonnees) et modifier la feuille Excel :
○ Assurez-vous que votre feuille "Feuil1" a des données avec les en-têtes : Nom,
Prénom, Âge.
2. Créer un nouveau UserForm :
○ Renommez-le frmModifierDonnees.
○ Caption = "Modifier Données Personnelles".
3. Ajouter les contrôles :
○ Label : "Rechercher par Nom :"
○ TextBox : txtRechercheNom
○ CommandButton : Caption = "Rechercher", cmdRechercher
○ ListBox : lstResultats (Affichera les résultats de la recherche)
■ ColumnCount = 3
■ ColumnWidths = "80;80;40"
○ Frame : Caption = "Détails de la Personne"
■ Label : "Nom :"
■ TextBox : txtNomModif
■ Label : "Prénom :"
■ TextBox : txtPrenomModif
■ Label : "Âge :"
■ TextBox : txtAgeModif
■ CommandButton : Caption = "Enregistrer Modifications",
cmdEnregistrerModif
■ CommandButton : Caption = "Annuler", cmdAnnulerModif
○ CommandButton : Caption = "Fermer", cmdFermerModif
4. Écrire le code VBA :
○ Dans UserForm_Initialize :
Private Sub UserForm_Initialize()
' Initialiser la ListBox
With [Link]
.Clear
.ColumnCount = 3
.ColumnWidths = "80;80;40"
End With
' Masquer le cadre de modification au démarrage
[Link] = False
End Sub
○ Dans cmdRechercher_Click :
Private Sub cmdRechercher_Click()
Dim ws As Worksheet
Set ws = [Link]("Feuil1") ' Assurez-vous que
le nom correspond
Dim nomRecherche As String
nomRecherche = "*" & [Link] & "*" '
Recherche partielle
[Link]
[Link] = False ' Masque le cadre de détails
Dim i As Long
For i = 2 To [Link]([Link], 1).End(xlUp).Row '
Commence à la ligne 2 pour les données
If LCase([Link](i, 1).Value) Like
LCase(nomRecherche) Then
With [Link]
.AddItem
.List(.ListCount - 1, 0) = [Link](i,
1).Value ' Nom
.List(.ListCount - 1, 1) = [Link](i,
2).Value ' Prénom
.List(.ListCount - 1, 2) = [Link](i,
3).Value ' Âge
End With
End If
Next i
If [Link] = 0 Then
MsgBox "Aucun résultat trouvé pour '" &
[Link] & "'", vbInformation, "Recherche"
End If
End Sub
○ Dans lstResultats_Click : (Quand un élément de la ListBox est cliqué)
Private Sub lstResultats_Click()
If [Link] = -1 Then Exit Sub ' Pas de
sélection
' Afficher les détails de la personne sélectionnée
[Link] =
[Link]([Link], 0)
[Link] =
[Link]([Link], 1)
[Link] =
[Link]([Link], 2)
[Link] = True ' Rendre le cadre de
modification visible
End Sub
○ Dans cmdEnregistrerModif_Click :
Private Sub cmdEnregistrerModif_Click()
If [Link] = -1 Then
MsgBox "Veuillez sélectionner une personne à
modifier.", vbExclamation, "Erreur"
Exit Sub
End If
If Not IsNumeric([Link]) Then
MsgBox "L'âge doit être un nombre.", vbExclamation,
"Validation"
[Link]
Exit Sub
End If
Dim ws As Worksheet
Set ws = [Link]("Feuil1")
Dim nomOriginal As String
nomOriginal =
[Link]([Link], 0) ' Nom
d'origine pour retrouver la ligne
Dim rFind As Range
Set rFind = [Link](1).Find(What:=nomOriginal,
LookIn:=xlValues, LookAt:=xlWhole)
If Not rFind Is Nothing Then
' Mettre à jour les données dans la feuille
[Link](0, 0).Value = [Link] ' Nom
[Link](0, 1).Value = [Link] '
Prénom
[Link](0, 2).Value = CLng([Link])
' Âge
MsgBox "Données mises à jour avec succès !",
vbInformation, "Confirmation"
' Rafraîchir la ListBox et masquer le cadre de
modification
Call cmdRechercher_Click ' Re-exécuter la recherche
pour mettre à jour la ListBox
[Link] = False
Else
MsgBox "Erreur : La ligne sélectionnée n'a pas été
trouvée dans la feuille.", vbCritical, "Erreur"
End If
End Sub
○ Dans cmdAnnulerModif_Click :
Private Sub cmdAnnulerModif_Click()
[Link] = False
[Link] = -1 ' Désélectionne l'élément
dans la ListBox
End Sub
○ Dans cmdFermerModif_Click :
Private Sub cmdFermerModif_Click()
Unload Me
End Sub
5. Créer une macro pour afficher frmModifierDonnees :
Sub ModifierDonnees()
[Link]
End Sub
6. Tester : Exécutez la macro, recherchez des noms, sélectionnez un résultat, modifiez-le et
enregistrez.
Exercice 8 : UserForm avec Gestion de Multiples Enregistrements
(Ajout/Suppression)
Objectif : Créer un UserForm pour ajouter et supprimer des enregistrements dans une feuille
Excel, en utilisant une ListBox pour visualiser les données et un bouton de confirmation pour les
suppressions.
Étapes :
1. Créer un nouveau UserForm :
○ Renommez-le frmGestionClients.
○ Caption = "Gestion des Clients".
2. Préparer la feuille Excel :
○ Dans une feuille (ex: "Clients"), mettez les en-têtes : ID Client, Nom, Ville, Email.
○ Ajoutez quelques clients factices.
3. Ajouter les contrôles sur frmGestionClients :
○ Label : "ID Client :"
○ TextBox : txtIDClient
○ Label : "Nom :"
○ TextBox : txtNomClient
○ Label : "Ville :"
○ TextBox : txtVilleClient
○ Label : "Email :"
○ TextBox : txtEmailClient
○ CommandButton : Caption = "Ajouter Client", cmdAjouterClient
○ ListBox : lstClients (Affichera tous les clients)
■ ColumnCount = 4
■ ColumnWidths = "50;100;80;120"
○ CommandButton : Caption = "Supprimer Client Sélectionné",
cmdSupprimerClient
○ CommandButton : Caption = "Vider Champs", cmdViderChamps
○ CommandButton : Caption = "Fermer", cmdFermerClients
4. Écrire le code VBA :
○ Dans UserForm_Initialize :
Private Sub UserForm_Initialize()
LoadClientsIntoListBox
Call cmdViderChamps_Click ' Vide les champs de saisie
End Sub
Private Sub LoadClientsIntoListBox()
Dim ws As Worksheet
Set ws = [Link]("Clients")
With [Link]
.Clear
.ColumnCount = 4
.ColumnWidths = "50;100;80;120"
' Optionnel: Ajouter les en-têtes si vous le
souhaitez
' .AddItem
' .List(.ListCount - 1, 0) = [Link](1, 1).Value
' .List(.ListCount - 1, 1) = [Link](1, 2).Value
' .List(.ListCount - 1, 2) = [Link](1, 3).Value
' .List(.ListCount - 1, 3) = [Link](1, 4).Value
Dim i As Long
For i = 2 To [Link]([Link], 1).End(xlUp).Row
.AddItem
.List(.ListCount - 1, 0) = [Link](i, 1).Value
.List(.ListCount - 1, 1) = [Link](i, 2).Value
.List(.ListCount - 1, 2) = [Link](i, 3).Value
.List(.ListCount - 1, 3) = [Link](i, 4).Value
Next i
End With
End Sub
○ Dans cmdAjouterClient_Click :
Private Sub cmdAjouterClient_Click()
Dim ws As Worksheet
Set ws = [Link]("Clients")
' Validations simples
If [Link] = "" Or [Link] = ""
Then
MsgBox "ID Client et Nom sont obligatoires.",
vbExclamation, "Validation"
Exit Sub
End If
' Vérifier si l'ID client existe déjà
Dim rFind As Range
Set rFind = [Link](1).Find(What:=[Link],
LookIn:=xlValues, LookAt:=xlWhole)
If Not rFind Is Nothing Then
MsgBox "Cet ID Client existe déjà. Veuillez en
choisir un autre ou modifier le client existant.",
vbExclamation, "Doublon"
Exit Sub
End If
Dim derniereLigne As Long
derniereLigne = [Link]([Link], 1).End(xlUp).Row + 1
[Link](derniereLigne, 1).Value = [Link]
[Link](derniereLigne, 2).Value = [Link]
[Link](derniereLigne, 3).Value = [Link]
[Link](derniereLigne, 4).Value = [Link]
MsgBox "Client ajouté avec succès !", vbInformation,
"Confirmation"
LoadClientsIntoListBox ' Rafraîchir la ListBox
Call cmdViderChamps_Click ' Vider les champs pour une
nouvelle saisie
End Sub
○ Dans cmdSupprimerClient_Click :
Private Sub cmdSupprimerClient_Click()
If [Link] = -1 Then
MsgBox "Veuillez sélectionner un client à
supprimer.", vbExclamation, "Aucune Sélection"
Exit Sub
End If
Dim reponse As VbMsgBoxResult
reponse = MsgBox("Êtes-vous sûr de vouloir supprimer le
client '" & [Link]([Link], 1) &
"' ?", vbYesNo + vbQuestion, "Confirmation de Suppression")
If reponse = vbYes Then
Dim ws As Worksheet
Set ws = [Link]("Clients")
Dim idClientASupprimer As String
idClientASupprimer =
[Link]([Link], 0) ' Récupère
l'ID client sélectionné
Dim rFind As Range
Set rFind =
[Link](1).Find(What:=idClientASupprimer,
LookIn:=xlValues, LookAt:=xlWhole)
If Not rFind Is Nothing Then
[Link] xlUp ' Supprime la ligne
entière
MsgBox "Client supprimé avec succès !",
vbInformation, "Confirmation"
LoadClientsIntoListBox ' Rafraîchir la ListBox
Call cmdViderChamps_Click
Else
MsgBox "Erreur : Client non trouvé dans la
feuille.", vbCritical, "Erreur"
End If
End If
End Sub
○ Dans cmdViderChamps_Click :
Private Sub cmdViderChamps_Click()
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link]
End Sub
○ Dans cmdFermerClients_Click :
Private Sub cmdFermerClients_Click()
Unload Me
End Sub
5. Créer une macro pour afficher frmGestionClients :
Sub GererClients()
[Link]
End Sub
6. Tester : Exécutez la macro, ajoutez de nouveaux clients, supprimez des clients, et
observez la mise à jour de la ListBox.
Exercice 9 : Utilisation du Contrôle Image et SpinButton
Objectif : Intégrer un contrôle Image pour afficher une image et un SpinButton pour ajuster une
valeur numérique.
Étapes :
1. Créer un nouveau UserForm :
○ Renommez-le frmQuantiteProduit.
○ Caption = "Détail Produit et Quantité".
2. Préparer une image :
○ Ayez un fichier image (.jpg, .png, .bmp) sur votre ordinateur (ex: [Link]).
3. Ajouter les contrôles sur frmQuantiteProduit :
○ Label : "Produit : Ordinateur Portable" (ou tout autre nom de produit)
○ Image : imgProduit
■ Dans les propriétés de imgProduit, cliquez sur Picture et choisissez votre
fichier image.
■ PictureSizeMode = 2 - fmPictureSizeModeZoom (pour ajuster l'image à la
taille du contrôle).
○ Label : "Description :"
○ TextBox : txtDescription (Mettez une description longue par défaut, par exemple :
"Puissant ordinateur portable, idéal pour le travail et le divertissement. Écran Full
HD, processeur rapide.")
■ MultiLine = True
■ ScrollBars = 2 - fmScrollBarsVertical
○ Label : "Prix : 1200 €"
○ Label : "Quantité :"
○ TextBox : txtQuantite (Pour afficher la quantité sélectionnée)
○ SpinButton : spnQuantite
■ Min = 1
■ Max = 10 (ou plus)
■ Value = 1 (Valeur initiale)
○ CommandButton : Caption = "Ajouter au Panier", cmdAjouterPanier
○ CommandButton : Caption = "Fermer", cmdFermerProduit
4. Écrire le code VBA :
○ Dans UserForm_Initialize :
Private Sub UserForm_Initialize()
[Link] = [Link] ' Initialise
la TextBox avec la valeur du SpinButton
End Sub
○ Dans spnQuantite_SpinDown et spnQuantite_SpinUp :
Private Sub spnQuantite_SpinDown()
[Link] = [Link]
End Sub
Private Sub spnQuantite_SpinUp()
[Link] = [Link]
End Sub
Alternative plus simple et robuste pour SpinButton (utilise l'événement Change):
Private Sub spnQuantite_Change()
' S'assure que la valeur du TextBox est mise à jour avec
la valeur du SpinButton
[Link] = [Link]
End Sub
(Note : Si vous utilisez spnQuantite_Change, vous n'avez pas besoin de SpinDown
et SpinUp séparément, car Change se déclenche dans les deux cas.)
○ Dans txtQuantite_Change : (Pour permettre la saisie manuelle et la synchroniser
avec le SpinButton)
Private Sub txtQuantite_Change()
' Si l'utilisateur saisit manuellement, met à jour le
SpinButton
If IsNumeric([Link]) And [Link]
<> "" Then
Dim val As Long
val = CLng([Link])
If val >= [Link] And val <=
[Link] Then
[Link] = val
ElseIf val < [Link] Then
[Link] = [Link]
[Link] = [Link]
ElseIf val > [Link] Then
[Link] = [Link]
[Link] = [Link]
End If
End If
End Sub
Private Sub txtQuantite_Exit(ByVal Cancel As
[Link])
' Validation si l'utilisateur quitte le champ sans saisir
un nombre valide
If Not IsNumeric([Link]) Or
CLng([Link]) <= 0 Then
MsgBox "Veuillez entrer une quantité numérique
positive.", vbExclamation
Cancel = True ' Empêche de quitter le champ
End If
End Sub
○ Dans cmdAjouterPanier_Click :
Private Sub cmdAjouterPanier_Click()
Dim quantite As Long
If IsNumeric([Link]) Then
quantite = CLng([Link])
Else
quantite = 0
End If
MsgBox "Vous avez ajouté " & quantite & " " &
[Link] & " au panier (virtuel).", vbInformation,
"Panier"
' Ici, vous pourriez ajouter du code pour enregistrer
dans une feuille de "panier"
End Sub
○ Dans cmdFermerProduit_Click :
Private Sub cmdFermerProduit_Click()
Unload Me
End Sub
5. Créer une macro pour afficher frmQuantiteProduit :
Sub AfficherProduit()
[Link]
End Sub
6. Tester : Exécutez la macro, utilisez le SpinButton et saisissez manuellement la quantité.
Exercice 10 : Utilisation de ProgressBar pour une Opération Longue
(Simulation)
Objectif : Simuler une opération longue et afficher une barre de progression pour informer
l'utilisateur.
Étapes :
1. Créer un nouveau UserForm :
○ Renommez-le frmProgression.
○ Caption = "Traitement des Données...".
○ Supprimez les boutons de fermeture et de minimisation/maximisation du
UserForm (propriétés ShowCloseButton, ShowMinimizeButton,
ShowMaximizeButton à False si disponibles, ou gérez-les via QueryClose).
2. Ajouter les contrôles sur frmProgression :
○ Label : Caption = "Chargement en cours...", lblMessage
○ Label : Caption = "0%", lblPourcentage
○ Frame : FrameProgress (Servira de conteneur pour la barre de progression)
○ Label : lblProgressBar (Ce sera la barre de progression elle-même, un simple
Label dont la largeur sera ajustée)
■ BackColor = Une couleur distincte (ex: bleu clair)
■ SpecialEffect = 1 - fmSpecialEffectRaised (optionnel)
■ Placez lblProgressBar à l'intérieur de FrameProgress et alignez-le sur le
bord gauche.
3. Écrire le code VBA :
○ Dans frmProgression :
Private Sub UserForm_Activate()
' Utilise UserForm_Activate pour lancer la tâche après
l'affichage du formulaire
' Cela permet au formulaire d'être dessiné avant de
lancer le traitement
Call SimulerTraitementLong
Unload Me ' Ferme le formulaire une fois le traitement
terminé
End Sub
Public Sub SimulerTraitementLong()
Dim i As Long
Dim totalEtapes As Long
totalEtapes = 100 ' Nombre total d'étapes pour la
simulation
[Link] = "Initialisation..."
[Link] = "0%"
Dim largeurFrame As Double
largeurFrame = [Link] ' Largeur totale du
cadre de la barre
For i = 1 To totalEtapes
' Simuler un travail
DoEvents ' Permet à l'interface utilisateur de se
rafraîchir
[Link] (Now + TimeValue("[Link].01")) '
Petite pause pour visualiser la progression
' Mettre à jour la barre de progression
Dim pourcentage As Integer
pourcentage = Int((i / totalEtapes) * 100)
[Link] = (largeurFrame /
totalEtapes) * i ' Ajuste la largeur du label
[Link] = pourcentage & "%"
' Mettre à jour le message
Select Case pourcentage
Case Is < 25
[Link] = "Chargement des
données..."
Case Is < 50
[Link] = "Traitement des
calculs..."
Case Is < 75
[Link] = "Génération des
rapports..."
Case Else
[Link] = "Finalisation..."
End Select
Next i
[Link] = "Traitement terminé !"
[Link] = "100%"
DoEvents ' S'assurer que le dernier état est affiché
[Link] (Now + TimeValue("[Link]")) ' Laisse
le temps à l'utilisateur de voir le 100%
End Sub
' Empêcher la fermeture du formulaire avec le bouton X
pendant le traitement
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode
As Integer)
If CloseMode = [Link] Then
MsgBox "Le traitement est en cours. Veuillez
patienter.", vbInformation, "Action Impossible"
Cancel = True ' Annule la fermeture
End If
End Sub
4. Créer une macro pour afficher frmProgression :
Sub LancerTraitementAvecProgression()
[Link]
End Sub
5. Tester : Exécutez la macro et observez la barre de progression. Essayez de fermer le
formulaire avec le bouton "X" pendant le traitement.
Projets et Idées d'Extension Avancées :
● UserForm de connexion/authentification : Créez un UserForm avec des champs de
nom d'utilisateur et mot de passe, vérifiant ces informations par rapport à une feuille Excel
ou une base de données simple.
● UserForm de configuration : Un formulaire pour que l'utilisateur puisse définir des
chemins de fichiers, des paramètres d'impression, ou d'autres préférences de votre
application VBA.
● Graphiques dynamiques via UserForm : Un UserForm qui permet à l'utilisateur de
sélectionner des données, puis de générer ou de mettre à jour un graphique sur une
feuille Excel.
● Intégration de contrôles ActiveX externes : Explorez l'ajout de contrôles qui ne sont
pas par défaut dans la boîte à outils (ex: un calendrier pour la sélection de dates).
● Interaction avec des bases de données externes (ADO) : Si vous avez des
connaissances en SQL, créez un UserForm qui interagit avec une base de données
Access, SQL Server, etc., pour lire, ajouter, modifier ou supprimer des enregistrements.
N'oubliez pas que la pratique est la clé. N'hésitez pas à jouer avec les propriétés des contrôles,
à expérimenter différentes logiques de code et à consulter la documentation VBA dès que vous
rencontrez des difficultés.
Bonne continuation dans votre apprentissage des UserForms !