Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 06/06/2026
En bref — MsgBox affiche un court message et quelques boutons à l'utilisateur, puis vous indique le bouton cliqué. Deux usages — annoncer quelque chose, et poser une question oui/non :
Sub MsgBoxBases()
' 1. Annoncer — afficher et oublier (une instruction, PAS de parenthèses)
MsgBox "Import terminé.", vbInformation, "Terminé"
' 2. Demander — récupérer la réponse (une fonction, parenthèses OBLIGATOIRES)
Dim reponse As VbMsgBoxResult
reponse = MsgBox("Supprimer la ligne sélectionnée ?", vbYesNo + vbQuestion, "Confirmer")
If reponse = vbYes Then
Selection.EntireRow.Delete
End If
End Sub
Cette seule différence — parenthèses ou non — est à l'origine de presque tous les « Expected: end of statement » rencontrés avec MsgBox. Tout ce guide tourne autour d'elle.
Le modèle mental : MsgBox est un interphone, pas un clavier
Imaginez un interphone au mur. Vous pouvez diffuser une phrase à qui écoute et lui offrir un petit jeu de boutons pour répondre — Oui, Non, Annuler, Réessayer. Ce que vous ne pouvez pas faire : l'entendre taper une phrase. Dès que vous avez besoin d'une saisie libre — un nom de fichier, un nombre, une date — vous avez dépassé MsgBox et il vous faut InputBox ou un UserForm.
MsgBox fait donc bien exactement deux choses : dire quelque chose à l'utilisateur, ou poser une question fermée et brancher selon le clic. Tenez-vous-en là, et il ne vous résistera jamais.
La seule règle : forme instruction contre forme fonction
MsgBox a deux visages, et celui que vous utilisez décide si les parenthèses sont permises.
Forme instruction — vous voulez seulement afficher le message sans vous soucier du clic :
MsgBox "Enregistré !" ' ✅
MsgBox "Enregistré !", vbInformation, "État" ' ✅ arguments séparés par des virgules, PAS de parenthèses
MsgBox ("Enregistré !", vbInformation) ' ❌ Expected: end of statement
Cette dernière ligne échoue parce que VBA lit ( … ) après une instruction comme « évalue cette seule expression », et "Enregistré !", vbInformation n'est pas une expression unique — c'est une liste d'arguments. Les parenthèses ne vont que sur un appel de fonction.
Forme fonction — vous voulez la valeur de retour, donc vous l'affectez, et maintenant les parenthèses sont obligatoires :
Dim r As VbMsgBoxResult
r = MsgBox("Écraser le fichier ?", vbYesNo) ' ✅ valeur de retour utilisée → parenthèses requises
La règle en une phrase : valeur de retour utilisée → parenthèses ; ignorée → pas de parenthèses. Intégrez ceci et l'erreur disparaît pour de bon.
Lire la réponse par son nom, jamais par son numéro
MsgBox renvoie un entier, mais ne le comparez jamais à un nombre brut. vbYes vaut par hasard 6 — écrivez vbYes, pas 6. Les constantes nommées se lisent comme du français et survivent à quiconque relit la macro (vous compris, plus tard) :
Select Case MsgBox("Enregistrer avant de fermer ?", vbYesNoCancel + vbExclamation)
Case vbYes: ThisWorkbook.Save
Case vbNo: ' fermer sans enregistrer — ne rien faire
Case vbCancel: Exit Sub ' l'utilisateur se ravise → tout arrêter
End Select
Ce vbYesNoCancel à trois branches est le motif à mémoriser : Annuler = « j'ai changé d'avis, arrête tout ». Honorez-le avec Exit Sub, et vos utilisateurs feront confiance à la macro.
Boutons et icônes se combinent avec +
Le deuxième argument réunit deux choix indépendants — quels boutons et quelle icône — dans un seul nombre, donc on les additionne :
MsgBox "Disque presque plein.", vbOKOnly + vbCritical ' icône ✖ rouge
MsgBox "Lancer le traitement de nuit ?", vbYesNo + vbQuestion ' icône ? bleue
MsgBox "Coupure réseau — réessayer ?", vbRetryCancel + vbExclamation ' icône ! jaune
Ils occupent des « cases » différentes du nombre, c'est pourquoi + fonctionne proprement. Mettre en avant un bouton autre que celui par défaut (pour qu'une Entrée distraite ne supprime rien) ? Ajoutez vbDefaultButton2 pour faire du deuxième bouton le bouton par défaut.
Insérer une variable dans le message
Un texte constant est rare dans les vraies macros — vous voulez presque toujours rapporter un nombre, un nom, un résultat. Concaténez avec &, et vbNewLine pour passer à la ligne :
Dim n As Long
n = WorksheetFunction.CountA(Range("A:A")) - 1
MsgBox "Traité : " & n & " lignes." & vbNewLine & _
"Terminé à " & Format(Now, "hh:mm:ss"), vbInformation, "Rapport"
Ce & (et non +) pour joindre du texte, et vbNewLine pour le saut de ligne, sont les deux choses qu'on oublie le plus.
Ne pas utiliser MsgBox pour déboguer
Le mauvais usage le plus courant : parsemer MsgBox x dans une boucle pour « voir la valeur ». Sur 500 lignes, c'est 500 clics — et la macro se fige à chacun. MsgBox est modal : il bloque jusqu'au clic, par conception, car il existe pour faire s'arrêter et décider un humain.
Pour surveiller des valeurs en développant, utilisez plutôt la fenêtre Exécution :
Debug.Print "ligne " & i & " = " & cellule.Value ' Ctrl+G pour lire, zéro clic, aucun blocage
Règle générale : MsgBox est une porte de décision pour l'utilisateur final ; Debug.Print est l'outil d'affichage du développeur. Les confondre, c'est rendre les macros pénibles.
Erreurs fréquentes avec MsgBox (et la correction)
| Symptôme | Cause | Correction |
|---|---|---|
| « Expected: end of statement » | Parenthèses sur la forme instruction : MsgBox ("Salut", vbYesNo) |
Retirer les parenthèses, ou affecter le résultat : r = MsgBox("Salut", vbYesNo) |
| La réponse ne correspond jamais | Comparaison aux nombres magiques 6 / 7 |
Comparer aux constantes vbYes / vbNo |
| La macro continue après Annuler | Seul vbYes testé, vbCancel ignoré |
Ajouter Case vbCancel: Exit Sub |
| Le titre apparaît au mauvais endroit | L'ordre est prompt, boutons, titre |
Le titre est le troisième argument : MsgBox "Texte", vbOKOnly, "Titre" |
| Texte et nombre collés | Joints avec +, qui additionne ou échoue |
Joindre avec & : "Total " & n |
| Boutons + icône n'apparaissent pas ensemble | Une virgule entre les deux | Combiner avec + : vbYesNo + vbQuestion |
Sautez la plomberie du dialogue — décrivez simplement la règle
Une confirmation par MsgBox convient pour une décision. Mais quand la logique derrière la décision devient le vrai travail — « avant de supprimer, vérifier que la colonne D est vide et que la date est passée » —, c'est là qu'est l'effort. ExcelMaster Agent vous laisse énoncer la règle en français courant — « supprime les lignes dont le statut est vide et dont l'échéance est passée, mais demande-moi d'abord » — et écrit le garde-fou, la confirmation et la suppression pour vous. Essayer gratuitement →
Autres guides
- VBA InputBox dans Excel — les deux InputBox & quand utiliser chacune
- VBA UserForm dans Excel — construire un vrai formulaire de saisie
- VBA If Then Else dans Excel — les conditions bien faites
- VBA Boucle For dans Excel — 8 exemples concrets
FAQ
Qu'est-ce que MsgBox en VBA ?
MsgBox est une fonction VBA intégrée qui affiche une petite boîte de dialogue avec un message et un ou plusieurs boutons, puis renvoie une valeur indiquant le bouton cliqué. Utilisez-la pour informer l'utilisateur ou poser une simple question oui/non.
Pourquoi ai-je « Expected: end of statement » avec MsgBox ?
Parce que vous avez mis les arguments entre parenthèses tout en utilisant MsgBox comme instruction, p. ex. MsgBox ("Salut", vbYesNo). Les parenthèses ne sont permises que si vous récupérez la valeur de retour : reponse = MsgBox("Salut", vbYesNo). Sans valeur de retour, retirez les parenthèses : MsgBox "Salut", vbYesNo.
Comment créer une boîte de message Oui/Non en VBA ?
Appelez MsgBox comme une fonction avec la constante vbYesNo et lisez le résultat : If MsgBox("Continuer ?", vbYesNo) = vbYes Then …. Ajoutez vbQuestion pour l'icône point d'interrogation : vbYesNo + vbQuestion.
Comment afficher une icône dans une MsgBox VBA ?
Ajoutez une constante d'icône avec + à l'argument des boutons : vbCritical (✖ rouge), vbExclamation (! jaune), vbQuestion (? bleu) ou vbInformation (i bleu). Exemple : MsgBox "Terminé", vbOKOnly + vbInformation.
Comment insérer une variable dans une MsgBox ?
Joignez le texte et la variable avec & : MsgBox "Total : " & total. Utilisez vbNewLine pour commencer une nouvelle ligne dans le message.
Quelle est la différence entre MsgBox et InputBox ?
MsgBox ne fait qu'afficher un message et renvoie le bouton cliqué — il ne peut pas accepter de texte tapé. InputBox invite l'utilisateur à saisir une valeur et renvoie ce qu'il a tapé. Utilisez MsgBox pour informer ou confirmer, InputBox pour collecter une saisie.
