UserForm Excel VBA
- 28 juil.
- 7 min de lecture
Un UserForm est une boîte de dialogue personnalisée : une véritable fenêtre sur laquelle on place des contrôles (zones de texte, listes déroulantes, boutons, cases à cocher…) et à laquelle on associe du code VBA. Là où MsgBox et InputBox restent limités, le UserForm offre une interface complète et professionnelle pour saisir des données, guider l’utilisateur ou construire un menu d’accueil.
Pour crée un UserForm vous devez faire un clic droit dans votre Interface VBE puis crée puis UserForm
Vous devriez avoir l'image ci dessous

Les événements du UserForm
Le fonctionnement d'un userform est événementiel : chaque action (ouverture du formulaire, clic, changement de valeur) déclenche une procédure.
Les évènements permettent l'interaction entre votre programme et l'utilisateur.
Il s'agit de procédures qui se déclenchent automatiquement lorsqu'une action prédéfinie survient dans
L'application Excel
Le classeur (Workbook)
La feuille de calcul (Worksheet)
Les graphiques
Les UserForm
Les contrôles
Un formulaire réagit à plusieurs événements, écrits dans son propre module de code. Les plus utiles :
Événement | Quand il se déclenche |
UserForm_Initialize | Avant l’affichage — idéal pour préparer valeurs et listes |
UserForm_Activate | Quand le formulaire prend le focus |
UserForm_Click | Au clic sur le fond du formulaire |
UserForm_QueryClose | À la fermeture — annulable via Cancel |
UserForm_Terminate | Tout dernier événement, fermeture non annulable |
L’événement Initialize est le plus important : il s’exécute avant l’affichage, c’est donc là qu’on prépare le formulaire (titre, champs vides, remplissage des listes).
Pour trouver l'événement, vous devez aller dans la code de votre Userform, puis à droite selectionnez INITIALIZE.
Un code va apparaitre, dans votre userForm (et non dans votre module)

Exemple UserForm_Initialize
Private Sub UserForm_Initialize() ' Se déclenche AVANT l'affichage
' Endroit idéal pour les valeurs par défaut et les listes
Me.Caption = "Saisie d'un client" ' Titre de la fenêtre
Me.TextBox1.Value = "" ' Champ vidé au démarrage
End Sub
Exemple UserForm_QueryClose
QueryClose permet, lui, de contrôler la fermeture — par exemple pour forcer l’utilisateur à passer par un bouton plutôt que par la croix :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' CloseMode = 0 signifie une fermeture via la croix
If CloseMode = vbFormControlMenu Then
Cancel = True ' Annule la fermeture
MsgBox "Merci d'utiliser le bouton Quitter."
End If
End Sub
UserForm VBA exemple
On crée un formulaire dans l’éditeur VBA (VBE) via Insertion > UserForm. La fenêtre Propriétés (touche F4) permet de régler l’essentiel : Name (nom interne), Caption (titre affiché), Height et Width (dimensions). On dépose ensuite depuis la boîte à outils une zone de texte et un bouton, puis on double-clique sur le bouton pour écrire son code. Exemple : recopier la saisie dans la cellule A1, puis fermer le formulaire.
Private Sub CommandButton1_Click() ' Au clic sur le bouton Valider
' On copie le contenu de la zone de texte dans la cellule A1
Range("A1").Value = TextBox1.Value
Unload Me ' Ferme et décharge le formulaire
End Sub
Pour afficher le formulaire depuis un module ou un bouton de la feuille, on utilise la méthode Show :
Sub AfficherFormulaire()
UserForm1.Show ' Mode modal par défaut : la feuille est bloquée
End Sub
Par défaut, le formulaire s’affiche en mode modal : l’utilisateur ne peut pas toucher aux feuilles tant qu’il ne l’a pas fermé. Pour le rendre non modal (feuille accessible en parallèle), on ajoute vbModeless. Enfin, Unload Me ferme et libère le formulaire de la mémoire, tandis que Me.Hide le masque en conservant ses données.
UserForm1.Show vbModeless ' Non modal : on garde l'accès à la feuille
UserForm VBA liste déroulante
Deux contrôles servent à proposer une liste de choix : la ComboBox (liste déroulante) et la ListBox (zone de liste). Leurs propriétés sont quasiment identiques ; on les remplit avec AddItem (élément par élément), avec List (depuis une plage) ou avec RowSource. Un point à retenir : les éléments sont indexés à partir de 0, et ListIndex vaut -1 lorsqu’aucune valeur n’est sélectionnée.
La ComboBox
La ComboBox affiche une liste déroulante d’où l’utilisateur choisit une seule valeur. On la remplit typiquement dans l’événement Initialize :
Private Sub UserForm_Initialize()
' Remplissage élément par élément avec AddItem
Me.ComboBox1.AddItem "Paris"
Me.ComboBox1.AddItem "Lyon"
Me.ComboBox1.AddItem "Marseille"
Me.ComboBox1.ListIndex = 0 ' Présélectionne le 1er élément (index 0)
End Sub
Pour une liste issue d’une plage de cellules, deux raccourcis évitent la boucle :
Me.ComboBox1.List = Range("A1:A20").Value ' Alimente depuis une plage
Me.ComboBox1.RowSource = "Feuil1!A1:A20" ' Ou lie la source directement
On récupère ensuite le choix de l’utilisateur au clic sur un bouton, en vérifiant qu’une valeur a bien été sélectionnée :
Private Sub CommandButton1_Click()
' ListIndex = -1 signifie qu'aucune valeur n'est choisie
If Me.ComboBox1.ListIndex = -1 Then
MsgBox "Veuillez choisir une ville."
Else
MsgBox "Ville choisie : " & Me.ComboBox1.Value
End If
End Sub
La ListBox
La ListBox ressemble à la ComboBox mais affiche plusieurs lignes en permanence et — surtout — autorise la multisélection via la propriété MultiSelect. On l’alimente exactement de la même façon :
Private Sub UserForm_Initialize()
' Une ListBox affiche plusieurs lignes visibles en même temps
Me.ListBox1.List = Range("A1:A10").Value
Me.ListBox1.MultiSelect = fmMultiSelectMulti ' Autorise la multisélection
End Sub
Pour lire une multisélection, on parcourt les lignes et on teste la propriété Selected de chacune :
Private Sub CommandButton1_Click()
Dim i As Integer
' On parcourt chaque ligne (index 0 à ListCount - 1)
For i = 0 To Me.ListBox1.ListCount - 1
' Selected(i) renvoie True si la ligne est cochée
If Me.ListBox1.Selected(i) Then
MsgBox "Sélectionné : " & Me.ListBox1.List(i)
End If
Next i
End Sub
UserForm VBA design
Un formulaire efficace est d’abord un formulaire lisible. Quelques principes de design font toute la différence.
Nommer ses contrôles — Renommez systématiquement vos contrôles avec un préfixe clair (via la propriété Name). Un code où l’on lit cmbVille ou txtNom est bien plus maintenable que ComboBox1 et TextBox3. Convention courante :
Préfixe | Contrôle | Préfixe | Contrôle |
txt | TextBox | lbl | Label |
cmb | ComboBox | chk | CheckBox |
lst | ListBox | opt | OptionButton |
cmd / btn | CommandButton | fra | Frame |
Organiser et aligner — Regroupez les champs liés dans des cadres (Frame), alignez les contrôles et espacez-les régulièrement. Réglez l’ordre de tabulation avec la propriété TabIndex pour que la touche Tab suive un parcours logique. Enfin, préfixez toujours vos contrôles par Me. dans le code : c’est plus lisible et l’éditeur propose l’autocomplétion.
Ne pas surcharger — Un formulaire lisible vaut mieux qu’un formulaire exhaustif : limitez le nombre de contrôles visibles, quitte à répartir sur plusieurs onglets (contrôle MultiPage). On peut aussi poser une image de fond avec LoadPicture. Astuce pratique : un bouton « Réinitialiser » qui vide tous les contrôles en une seule boucle.
Private Sub btnReset_Click()
Dim ctrl As Control
' Remet tous les contrôles à zéro en une seule boucle
For Each ctrl In Me.Controls
Select Case TypeName(ctrl) ' Traite chaque type de contrôle
Case "TextBox"
ctrl.Value = ""
Case "ComboBox", "ListBox"
ctrl.ListIndex = -1 ' -1 = aucune sélection
End Select
Next ctrl
End Sub
Afficher un UserForm à l’ouverture d’Excel
Pour qu’un formulaire s’affiche automatiquement dès l’ouverture du classeur, on utilise l’événement Workbook_Open. Point crucial, souvent source d’erreur : ce code doit être placé dans le module ThisWorkbook (et non dans un module standard).
' À placer dans le module "ThisWorkbook", pas un module standard
Private Sub Workbook_Open()
UserForm1.Show ' S'affiche automatiquement à l'ouverture
End Sub
Pour un véritable écran d’accueil qui masque Excel derrière le formulaire, on peut rendre l’application invisible — à condition de la réafficher à la fermeture (dans QueryClose et via une gestion d’erreurs), sous peine de laisser l’utilisateur avec un Excel invisible :
Private Sub Workbook_Open()
Application.Visible = False ' Masque la fenêtre Excel...
UserForm1.Show ' ...pour ne montrer que le formulaire
End Sub
Bon à savoir : maintenir la touche Maj enfoncée pendant l’ouverture du fichier empêche l’exécution de Workbook_Open — pratique en phase de développement.
Les événements du Workbook
Les événements du classeur vivent tous dans le module ThisWorkbook. Ils permettent de déclencher du code aux moments clés de la vie du fichier :
Événement | Déclenchement |
Workbook_Open | À l’ouverture du classeur |
Workbook_BeforeClose | Avant la fermeture — annulable via Cancel |
Workbook_BeforeSave | Avant l’enregistrement |
Workbook_BeforePrint | Avant l’impression |
Workbook_SheetActivate | Au changement de feuille active |
Certains événements (ceux préfixés Before) disposent d’un paramètre Cancel. En lui affectant True, on annule l’action associée — par exemple empêcher la fermeture du fichier tant qu’une saisie n’est pas complète :
' Dans le module "ThisWorkbook"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim reponse As Integer
reponse = MsgBox("Enregistrer avant de quitter ?", vbYesNo)
If reponse = vbYes Then
ThisWorkbook.Save ' Sauvegarde juste avant la fermeture
End If
End Sub
Les événements du Worksheet
Les événements de feuille s’écrivent dans le module de la feuille concernée (et non dans ThisWorkbook). Ils réagissent aux actions de l’utilisateur sur cette feuille :
Événement | Déclenchement |
Worksheet_Change | Quand le contenu d’une cellule est modifié |
Worksheet_SelectionChange | Quand la sélection change |
Worksheet_BeforeDoubleClick | Au double-clic sur une cellule |
Worksheet_Activate | Quand la feuille devient active |
L’événement Change reçoit un paramètre Target : la cellule qui vient d’être modifiée. Attention à un piège classique : modifier une cellule à l’intérieur de Change relance l’événement, créant une boucle infinie. On la désamorce en désactivant temporairement les événements avec
Application.EnableEvents :
' Dans le module de la feuille (ex : "Feuil1")
Private Sub Worksheet_Change(ByVal Target As Range)
' Target = la cellule qui vient d'être modifiée
If Target.Column = 1 Then
Application.EnableEvents = False ' Évite de relancer l'événement
Target.Value = UCase(Target.Value) ' Passe la saisie en majuscules
Application.EnableEvents = True ' Réactive les événements
End If
End Sub
En résumé
Le UserForm transforme une macro en une petite application : on crée le formulaire, on prépare ses contrôles dans Initialize, on remplit ComboBox et ListBox, on récupère les choix au clic, puis on l’affiche à l’ouverture via Workbook_Open. En articulant les événements du formulaire, du classeur et des feuilles, vous obtenez une interface fluide et robuste — le vrai saut qualitatif entre une macro utilitaire et un outil que vos utilisateurs prennent plaisir à utiliser.




![Comptabilité sur Excel : modèle gratuit + 7 exercices [2026]](https://static.wixstatic.com/media/f85934_97522b00e3874e2ca1afa00e963bc926~mv2.png/v1/fill/w_333,h_250,fp_0.50_0.50,q_35,blur_30,enc_avif,quality_auto/f85934_97522b00e3874e2ca1afa00e963bc926~mv2.webp)
![Comptabilité sur Excel : modèle gratuit + 7 exercices [2026]](https://static.wixstatic.com/media/f85934_97522b00e3874e2ca1afa00e963bc926~mv2.png/v1/fill/w_318,h_239,fp_0.50_0.50,q_95,enc_avif,quality_auto/f85934_97522b00e3874e2ca1afa00e963bc926~mv2.webp)