Fonction MsgBox VBA
- il y a 6 jours
- 5 min de lecture
La fonction MsgBox affiche une boîte de dialogue contenant un message, un titre, une icône et un ou plusieurs boutons, puis met le code en pause jusqu’à ce que l’utilisateur réponde.
Selon la façon dont on l’écrit, MsgBox se comporte de deux manières : comme une simple instruction qui affiche un message, ou comme une fonction qui renvoie le bouton cliqué afin d’orienter la suite du programme.
Dans ce guide, nous couvrons la syntaxe, des exemples concrets, la récupération de la réponse dans une variable, les boutons Oui/Non, le retour à la ligne, puis les cas plus délicats : boutons personnalisés, choix multiples et message sans bouton.
Syntaxe générale
MsgBox(Prompt, [Buttons], [Title], [HelpFile], [Context])
Seul l’argument Prompt (le message) est obligatoire ; les autres sont facultatifs. Voici le rôle de chacun :
Argument | Rôle |
Prompt | Texte affiché dans la boîte de dialogue (obligatoire). |
Buttons | Combinaison de constantes définissant les boutons, l’icône et le bouton par défaut. |
Title | Texte de la barre de titre. Par défaut, le nom de l’application. |
HelpFile | Fichier d’aide associé (rarement utilisé). |
Context | Numéro de rubrique d’aide (rarement utilisé). |
L’argument Buttons permet aussi d’ajouter une icône. Les quatre icônes disponibles :
Constante | Valeur | Icône affichée |
vbCritical | 16 | Erreur critique (croix rouge) |
vbQuestion | 32 | Point d’interrogation |
vbExclamation | 48 | Avertissement |
vbInformation | 64 | Information |
MsgBox VBA exemple
L’exemple le plus simple affiche un message avec un unique bouton OK :
Sub ExempleSimple()
MsgBox "Bonjour, il fait beau aujourd'hui !"
End Sub
On peut enrichir la boîte avec une icône et un titre en renseignant les deuxième et troisième arguments :
Sub ExempleComplet()
MsgBox "Le traitement est terminé.", vbInformation, "Kronoscope"
End Sub
Ici, vbInformation ajoute l’icône d’information et "Kronoscope" s’affiche dans la barre de titre. Utilisée ainsi, en simple instruction, MsgBox ne renvoie aucune valeur : elle se contente d’afficher le message.
MsgBox VBA variable
Dès que la boîte comporte plusieurs boutons, on veut généralement savoir lequel a été cliqué. Pour cela, on récupère la valeur renvoyée par MsgBox dans une variable. Point crucial : quand on récupère une valeur, les arguments doivent être placés entre parenthèses, sinon VBA renvoie l’erreur « Expected end of statement ».
Sub ExempleVariable()
Dim reponse As Integer
reponse = MsgBox("Voulez-vous continuer ?", vbYesNo, "Confirmation")
If reponse = vbYes Then
MsgBox "Vous avez cliqué sur Oui."
Else
MsgBox "Vous avez cliqué sur Non."
End If
End Sub
On peut aussi stocker le message lui-même dans une variable, ce qui est pratique pour construire un texte dynamique avant de l’afficher :
Sub MessageDynamique()
Dim message As String
message = "Bonjour et bienvenue dans ce classeur."
MsgBox message
End Sub
VBA MsgBox option Oui Non
La boîte Oui/Non sert à poser une question fermée et à agir selon la réponse. On l’obtient avec la constante vbYesNo. La valeur renvoyée indique le bouton cliqué, qu’il est plus lisible de comparer aux constantes vbYes (valeur 6) et vbNo (valeur 7) plutôt qu’aux nombres bruts.
Constante | Valeur | Bouton cliqué |
vbOK | 1 | OK |
vbCancel | 2 | Annuler |
vbAbort | 3 | Abandonner |
vbRetry | 4 | Réessayer |
vbIgnore | 5 | Ignorer |
vbYes | 6 | Oui |
vbNo | 7 | Non |
Exemple typique : vider une feuille uniquement si l’utilisateur confirme.
Sub ViderFeuille()
Dim reponse As Integer
reponse = MsgBox("Voulez-vous vraiment vider la feuille ?", _
vbYesNo + vbQuestion, "Attention")
If reponse = vbYes Then
Cells.ClearContents
End If
End Sub
MsgBox vbYesNo
La constante vbYesNo vaut 4 et affiche exactement deux boutons : Oui et Non. On la combine librement avec une icône et un bouton par défaut à l’aide de l’opérateur +. Par exemple, vbYesNo + vbQuestion + vbDefaultButton2 affiche une question dont le bouton Non est présélectionné (utile pour les actions sensibles).
Sub ExempleVbYesNo()
Dim reponse As VbMsgBoxResult
reponse = MsgBox("Enregistrer avant de fermer ?", _
vbYesNo + vbQuestion + vbDefaultButton2, "Fermeture")
If reponse = vbYes Then
End If
End Sub
Astuce : le type VbMsgBoxResult décrit précisément le retour de MsgBox et rend le code plus lisible que Integer. Ne confondez pas vbYesNo (deux boutons) avec vbYesNoCancel (trois boutons : Oui, Non, Annuler), abordé plus bas.
MsgBox VBA et retour à la ligne
Pour afficher un message sur plusieurs lignes, on ne tape pas une touche Entrée : on concatène le texte avec une constante de saut de ligne à l’aide de l’opérateur &. Plusieurs constantes existent :
Constante | Équivalent | Description |
vbNewLine | selon l’OS | S’adapte à la plateforme — recommandé |
vbCrLf | Chr(13) & Chr(10) | Retour chariot + saut de ligne (Windows) |
vbCr | Chr(13) | Retour chariot |
vbLf | Chr(10) | Saut de ligne |
En pratique, on structure ainsi un message récapitulatif :
Sub MessageMultiLigne()
MsgBox "Import terminé avec succès." & vbCrLf & _
"Lignes traitées : 250" & vbCrLf & _
"Cliquez sur OK pour continuer."
End Sub
Pour insérer une véritable ligne vide entre deux blocs (comme un paragraphe), doublez la constante : vbCrLf & vbCrLf. Si vos classeurs sont susceptibles d’être ouverts sur Mac, privilégiez vbNewLine, qui choisit automatiquement la bonne séquence selon le système.
MsgBox et bouton personnalisé
C’est une limite importante à connaître : le texte des boutons de MsgBox est figé. On ne peut pas afficher un bouton nommé « Enregistrer » ou « Supprimer » directement avec MsgBox. On choisit seulement parmi six jeux de boutons prédéfinis :
Constante | Valeur | Boutons affichés |
vbOKOnly | 0 | OK |
vbOKCancel | 1 | OK, Annuler |
vbAbortRetryIgnore | 2 | Abandonner, Réessayer, Ignorer |
vbYesNoCancel | 3 | Oui, Non, Annuler |
vbYesNo | 4 | Oui, Non |
vbRetryCancel | 5 | Réessayer, Annuler |
Si vous avez réellement besoin de boutons au texte sur mesure (par exemple « Continuer » / « Revenir »), la seule solution native est de créer un UserForm : un formulaire personnalisé sur lequel vous placez vos propres boutons de commande, avec le libellé, la couleur et le comportement de votre choix. C’est un peu plus de travail qu’une simple MsgBox, mais cela offre une liberté totale sur l’apparence et sur les valeurs renvoyées.
VBA MsgBox choix multiple
Lorsque plusieurs réponses sont possibles (trois boutons ou plus), la structure Select Case est bien plus lisible qu’une cascade de If. Elle traite chaque bouton dans un bloc distinct. Exemple classique avec vbYesNoCancel :
Sub ExempleChoixMultiple()
Dim reponse As VbMsgBoxResult
reponse = MsgBox("Sauvegarder les modifications ?", _
vbYesNoCancel + vbQuestion, "Enregistrer")
Select Case reponse
Case vbYes
MsgBox "Enregistrement en cours..."
Case vbNo
MsgBox "Modifications abandonnées."
Case vbCancel
MsgBox "Opération annulée."
End Select
End Sub
Le même principe s’applique au jeu vbAbortRetryIgnore, très pratique pour gérer une erreur : Abandonner arrête, Réessayer relance l’opération, Ignorer passe à la suite.
VBA MsgBox sans bouton
Autre limite native : une MsgBox affiche toujours au moins un bouton (au minimum OK) et bloque le code tant que l’utilisateur n’a pas cliqué. Il n’existe pas d’option « sans bouton » à proprement parler. Ce que l’on cherche en général, c’est plutôt un message d’information qui se ferme tout seul après quelques secondes. Pour cela, on utilise l’objet WScript.Shell et sa méthode Popup, qui accepte un délai en secondes :
Sub MessageAutoFerme()
Dim shell As Object
Set shell = CreateObject("WScript.Shell")
' Le 5 = fermeture automatique après 5 secondes
shell.Popup "Traitement en cours, merci de patienter...", 5, "Kronoscope"
End Sub
Si l’utilisateur ne clique pas et que le délai expire, Popup renvoie -1 ; sinon, elle renvoie les mêmes valeurs que MsgBox (6 pour Oui, 7 pour Non, etc.). C’est la méthode la plus simple pour afficher une notification non bloquante depuis Excel VBA.
En résumé
La fonction MsgBox couvre l’immense majorité des besoins d’interaction : afficher un message, poser une question Oui/Non, récupérer la réponse dans une variable et présenter un texte sur plusieurs lignes. Ses deux limites — l’impossibilité de renommer les boutons et l’absence de mode « sans bouton » — se contournent respectivement avec un UserForm et avec WScript.Shell. En maîtrisant ces quelques constantes et structures, vos macros gagnent aussitôt en clarté et en professionnalisme.





