Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 06/06/2026
En bref — Un UserForm est une boîte de dialogue personnalisée que vous concevez une fois et pilotez avec du code d'événement. Ajoutez des contrôles, écrivez ce que fait chaque bouton, puis affichez-la. Le tout en trois morceaux :
' 1. Dans le module du formulaire — code qui s'exécute au clic sur OK :
Private Sub btnOK_Click()
If txtName.Value = "" Then
MsgBox "Le nom est obligatoire.", vbExclamation
Exit Sub
End If
Me.Hide ' masquer, mais GARDER les valeurs lisibles par l'appelant
End Sub
' 2. Dans le module du formulaire — Annuler ne fait que fermer :
Private Sub btnCancel_Click()
Me.Tag = "cancel"
Me.Hide
End Sub
' 3. Dans un module standard — afficher et lire ce qui a été tapé :
Sub AjouterEnregistrement()
With frmEntry
.Show ' s'arrête ici jusqu'au masquage du formulaire
If .Tag = "cancel" Then Unload frmEntry: Exit Sub
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = .txtName.Value
End With
Unload frmEntry ' ne le détruire qu'après la lecture
End Sub
Vous vous êtes déjà demandé « pourquoi la zone de texte est vide alors que l'utilisateur l'a remplie ? » — c'est la règle Hide-contre-Unload, et c'est le cœur de ce guide.
Le modèle mental : vous lâchez le volant, le formulaire conduit
MsgBox et InputBox sont synchrones : une ligne s'exécute, vous obtenez une valeur, la ligne suivante s'exécute. Un UserForm rompt ce rythme. Quand vous appelez .Show, votre code passe le volant au formulaire et fait une pause. Ce qui se passe ensuite n'est pas décidé par la ligne suivante de votre macro — mais par le contrôle sur lequel l'utilisateur clique, et chacun exécute son propre petit bloc de code.
La question que pose tout débutant — « où est passé mon code après UserForm1.Show ? » — a donc une réponse nette : il attend. Le vrai travail a migré dans les procédures d'événement des contrôles, comme btnOK_Click. Un UserForm, c'est trois choses collées ensemble :
- La conception — les contrôles que vous y glissez (TextBox, ComboBox, CommandButton), configurés une fois au moment du design.
- Le code d'événement — des procédures
Private Subdans le module du formulaire, une par action possible de l'utilisateur. - L'appel —
frmEntry.Showdepuis un module standard.
Dès que vous le voyez comme « un objet qui exécute du code quand on le sollicite », et non comme « une fonction qui renvoie une valeur », les UserForms cessent d'être mystérieux.
En construire un en trois étapes
- Dans l'éditeur VBA (Alt+F11), Insertion ▸ UserForm. Dans Propriétés, mettez
(Name)àfrmEntry— nommer formulaires et contrôles maintenant vous évite le chaosTextBox1,TextBox2plus tard. - Depuis la Boîte à outils, glissez : deux TextBox (
txtName,txtQty), une ComboBox (cboDept) et deux CommandButton (btnOK,btnCancel). Ajoutez des étiquettes à côté. - Double-cliquez sur un bouton — l'éditeur vous dépose directement dans son événement
_Click. C'est là que vit son comportement.
La seule règle : Me.Hide garde les valeurs, Unload Me les détruit
Cette règle décide si votre formulaire fonctionne comme outil de saisie.
Unload Meretire le formulaire de la mémoire et réinitialise chaque contrôle à vide. LiseztxtName.Valueaprès un Unload et vous obtenez""— les données ont disparu.Me.Hiderend le formulaire invisible mais le laisse vivre en mémoire, valeurs intactes. L'exécution revient à la ligne après.Show, et l'appelant peut encore lirefrmEntry.txtName.Value.
Le motif pour tout formulaire qui renvoie des données est donc : OK appelle Me.Hide, l'appelant lit les contrôles, et seulement ensuite l'appelant fait Unload. Un Unload Me dans btnOK_Click est la raison la plus fréquente du « le formulaire perd ce que j'ai tapé ».
Private Sub btnOK_Click()
' valider d'abord, puis MASQUER (pas de Unload ici)
If Not IsNumeric(txtQty.Value) Then
MsgBox "La quantité doit être un nombre.", vbExclamation
txtQty.SetFocus
Exit Sub
End If
Me.Hide
End Sub
Configurer le formulaire dans UserForm_Initialize
Tout ce dont le formulaire a besoin avant que l'utilisateur ne le voie — les choix de liste, les valeurs par défaut, la date du jour — appartient à l'événement UserForm_Initialize, pas à la macro appelante. Le formulaire reste ainsi autonome : il est correct à chaque ouverture, peu importe qui l'affiche.
Private Sub UserForm_Initialize()
cboDept.List = Array("Ventes", "Finances", "Opérations") ' remplir la liste
txtQty.Value = "1" ' valeur par défaut sensée
txtName.SetFocus ' le curseur démarre ici
End Sub
Modale ou non modale — choisir exprès
.Show est modal par défaut (vbModal) : l'utilisateur doit traiter le formulaire avant de toucher la feuille, et votre code appelant attend. C'est ce que vous voulez pour la saisie. N'utilisez .Show vbModeless que pour une palette flottante que l'utilisateur garde ouverte en travaillant — et sachez que votre macro appelante continue alors sans attendre.
frmEntry.Show ' modale — l'appelant fait une pause (le cas habituel)
frmTools.Show vbModeless ' non modale — l'appelant continue, le formulaire flotte
Ne pas trop câbler
Un piège tentant : disséminer des événements _Change sur chaque contrôle pour une validation « en direct ». Ils se déclenchent sans cesse, s'appellent les uns les autres et transforment le débogage en jeu de taupes. Validez une fois, dans btnOK_Click, puis masquez. Gardez chaque procédure d'événement courte et à but unique.
Et sachez quand un UserForm est carrément la mauvaise réponse : si vous disposez plus de 10 champs et que ça déborde d'un écran, c'est le signal de répartir sur un MultiPage — ou d'admettre que les données vont vraiment dans un simple tableau Excel où l'utilisateur tape directement. Un UserForm se justifie autour de 3 à 8 champs avec une vraie validation ; en dessous, une chaîne d'InputBox est plus légère, au-dessus, une feuille de calcul bat souvent le formulaire.
Erreurs fréquentes avec UserForm (et la correction)
| Symptôme | Cause | Correction |
|---|---|---|
| Zone de texte vide après remplissage | Unload Me dans btnOK_Click a effacé les valeurs |
Utiliser Me.Hide ; laisser l'appelant lire, puis Unload |
| La liste déroulante est vide | Remplie dans la macro appelante, pas dans le formulaire | La peupler dans UserForm_Initialize |
| « Objet requis » sur le nom du formulaire | Contrôle référencé avant le chargement | Afficher le formulaire d'abord, ou lire via la variable de formulaire |
Le code après .Show s'exécute trop tôt |
Formulaire affiché vbModeless par erreur |
Utiliser .Show simple (modal) pour la saisie |
| Impossible de distinguer OK d'Annuler | Aucun drapeau posé sur Annuler | Poser Me.Tag = "cancel" (ou un booléen public) avant de masquer |
| La ✕ rouge se comporte comme OK | QueryClose non géré |
Traiter la ✕ comme Annuler dans UserForm_QueryClose |
Un formulaire, c'est beaucoup de plomberie pour « demande-moi trois choses »
Les UserForms sont le bon outil pour une vraie saisie — mais les contrôles, l'Initialize, la danse Hide-contre-Unload et la validation, c'est beaucoup de câblage avant d'enregistrer une seule ligne. Quand l'objectif est juste « collecter un nom, une quantité et un service, puis les ajouter en ligne », ExcelMaster Agent vous laisse le décrire en français courant et construit le flux de saisie et l'écriture pour vous — aucun module de formulaire à maintenir. Essayer gratuitement →
Autres guides
- VBA MsgBox dans Excel — Oui/Non, boutons & la règle des parenthèses
- VBA InputBox dans Excel — les deux InputBox & quand utiliser chacune
- VBA Range dans Excel — référencer, lire & écrire des cellules
- VBA Boucle For dans Excel — 8 exemples concrets
FAQ
Qu'est-ce qu'un UserForm en VBA ?
Un UserForm est une boîte de dialogue personnalisée que vous concevez dans l'éditeur VBA et pilotez avec du code d'événement. Vous y glissez des contrôles (zones de texte, listes déroulantes, boutons), écrivez une procédure pour chaque action possible de l'utilisateur, puis l'affichez avec .Show. C'est ainsi que VBA collecte plusieurs saisies à la fois, au-delà de ce que MsgBox ou InputBox permettent.
Comment créer un UserForm dans Excel VBA ?
Appuyez sur Alt+F11, puis Insertion ▸ UserForm. Glissez des contrôles depuis la Boîte à outils, nommez-les dans la fenêtre Propriétés et double-cliquez sur un bouton pour écrire son événement _Click. Affichez le formulaire depuis un module standard avec frmNom.Show.
Pourquoi ma zone de texte de UserForm est-elle vide après la saisie de l'utilisateur ?
Parce que vous avez appelé Unload Me dans le bouton OK, ce qui détruit le formulaire et vide tous les contrôles. Utilisez plutôt Me.Hide dans l'événement OK — il garde le formulaire (et ses valeurs) en mémoire pour que le code appelant puisse lire frmNom.txtName.Value, puis Unload ensuite.
Quelle est la différence entre Unload Me et Me.Hide ?
Me.Hide rend le formulaire invisible mais le garde chargé, donc ses valeurs restent lisibles. Unload Me retire le formulaire de la mémoire et réinitialise tous les contrôles. Utilisez Hide quand vous devez lire les saisies après la fermeture ; Unload quand vous avez vraiment terminé.
Comment remplir une ComboBox dans un UserForm ?
Peuplez-la dans l'événement UserForm_Initialize pour qu'elle soit prête avant l'affichage : cboDept.List = Array("Ventes", "Finances", "Opérations"), ou définissez cboDept.RowSource = "Feuil1!A1:A10" pour la lier à une plage de cellules.
Le formulaire doit-il être modal ou non modal ?
Utilisez le mode modal (le .Show par défaut) pour la saisie — l'utilisateur doit terminer le formulaire avant toute autre action, et votre code attend le résultat. N'utilisez .Show vbModeless que pour un formulaire flottant de type barre d'outils que l'utilisateur garde ouvert en travaillant sur la feuille.
