Celui qui a un jour commencé avec VBA a nécessairement très vite rencontré la fonction MsgBox qui permet d'afficher des messages à l'attention de l'utilisateur. Une des principales caractéristiques de la boîte de dialogue MsgBox est qu'elle reste affichée jusqu'à ce que l'utilisateur entreprenne une action (clique sur un bouton ou la ferme avec "la croix en haut à droite"). Pendant ce temps-là, la macro en cours est à l'arrêt et ne démarrera qu'après l'intervention de l'utilisateur.
Dans la plupart des cas, c'est exactement ce que l'on souhaite. Mais il y a de nombreuses situations où on voudrait que la MsgBox se ferme automatiquement – sans l'intervention de l'utilisateur.
Bonne nouvelle! C'est possible… Et c'est le code VBA que je vous propose dans cet article.
Sommaire
- Pourquoi utiliser MsgBox qui se ferme toute seule?
- MsgBox qui se ferme automatiquement: comment ça marche?
- Les différent codes VBA pour obtenir une boîte de dialogue MsgBox qui se ferme seule après un délai
- MsgBoxTemp: la MsgBox temporaire – fonction VBA complète!
- Conclusion de ce tutoriel
- Pour aller plus loin en VBA
Pourquoi utiliser MsgBox qui se ferme toute seule?
Imaginez une simple macro qui, à la fin, informe l'utilisateur via MsgBox si tout s'est bien passé ou pas. Rien de plus classique. Maintenant imaginez que vous avez 5 macros comme cela. Et qu'un jour, vous souhaitez écrire un autre script VBA (appelons le "macro globale") qui va lancer ces macros successivement. Ce n'est pas difficile mais vous serez bloqué car à la fin de chaque macro individuelle, votre macro globale devra attendre l'intervention de l'utilisateur. Vous avez donc le choix entre supprimer les MsgBox dans les macros individuelles (mais si l'utilisateur continue à les lancer aussi séparément, il ne verra plus les status finaux) et d'utiliser une MsgBox "temporaire" que je vous propose.
Un autre exemple: dans votre macro, vous souhaitez informer l'utilisateur de certaines informations mais l'exécution de la macro doit se passer dans un délai imparti. Vous ne pouvez donc pas vous permettre de perdre du temps si l'utilisateur ne réagit pas.
Et pour finir les exemples, sachez qu'avec le code VBA qui suit, il est possible d'ajouter une "réponse par défaut" au cas où l'utilisateur ne réagit pas. La macro peut donc demander une réponse (par exemple: Oui
/ Non
) à l'utilisateur mais si ce dernier ne répond pas, elle peut utiliser la réponse par défaut. Intéressant, non?
MsgBox qui se ferme automatiquement: comment ça marche?
Comme la fonction "normale" MsgBox en VBA ne permet pas de fermer la boîte de dialogue automatiquement, nous allons créer un Objet "Popup" via la ligne de commande (Shell
).
Ne vous inquiétez pas si cela ne vous dit rien. On peut le faire en une seule ligne VBA sans difficulté et sans de profondes connaissances techniques.
Ce code lance donc une boîte de dialogue qui a le même aspect que la MsgBox habituelle. L'utilisateur a la possibilité d'agir tout comme avec la MsgBox. Mais contrairement à la boîte de dialogue standard de VBA, l'utilisateur dispose d'un temps limité pour agir. S'il ne réagit pas dans le délai choisi, la fenêtre de dialogue se ferme automatiquement. Et la macro en cours va se poursuivre comme si l'utilisateur avait réagi.
Dans la suite de la macro, vous avez la possibilité de voir si l'utilisateur a réagit ou si la fenêtre s'est fermée toute seule. Ainsi, vous pouvez en tenir compte dans les actions à faire.
Les différent codes VBA pour obtenir une boîte de dialogue MsgBox qui se ferme seule après un délai
Assez de théorie, passons aux choses sérieuses. Voici la série des codes sources VBA, du plus simple au plus sophistiqué, qui vous permettront d'utiliser facilement une MsgBox qui se ferme automatiquement…
Simple message à l'attention de l'utilisateur – fonction purement informative
Voici donc le code de base. Comme vous voyez, il suffit d'une seule instruction et vous pouvez avoir votre boîte de dialogue grâce à une seule ligne de code.
1 |
CreateObject("WScript.Shell").Popup "Contenu de la boîte de dialogue...", 5, "Titre de la boîte de dialogue" |
L'instruction a donc 3 paramètres: le contenu (String
), la durée d'affichage en secondes (Integer
) et le titre de la fenêtre pop-up (String
).
Attention: la durée en secondes est "théorique" – c'est le temps minimum pendant lequel la boîte de dialogue restera ouverte (sauf si l'utilisateur réagit avant). Mais cette durée peut être plus longue. Cela dépend de "l'état de l'ordinateur", c'est-à-dire à quel point il est sollicité. Si vous faites tourner de nombreuses applications et qu'il ne reste que peu de mémoire disponible, cette durée peut être plus longue.
Le code VBA complet pour tester la MsgBox temporaire (elle restera affichée 10 secondes si l'utilisateur n'intervient pas avant).
1 2 3 4 5 6 |
Sub ExempleMsgBoxTemporaire() 'par Excel-Malin.com ( https://excel-malin.com ) CreateObject("WScript.Shell").Popup "Ceci est un texte. Cette fenêtre se fermera automatiquement dans 10 secondes...", 10, "Exemple" End Sub |
Déterminer si l'utilisateur a réagit ou pas
Si vous souhaitez savoir si l'utilisateur a réagi et a "répondu" à la boîte de dialogue ou si elle s'est fermé toute seule automatiquement, vous devez capter le résultat de la méthode .Popup
La règle est assez simple: si la fenêtre s'est fermée toute seule après le temps imparti, le résultat renvoyé sera "-1". Si elle s'est fermée suite à l'intervention de l'utilisateur, le résultat renvoyé correspondra à la valeur numérique des différents boutons de la fonction MsgBox (par exemple "OK" = 1, "Oui" = 6, "Non" = 7 etc.)
Voici le code VBA que vous pouvez utiliser:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub QuiAFermeLaBoite() 'par Excel-Malin.com ( https://excel-malin.com ) Dim Resultat As Integer Resultat = CreateObject("WScript.Shell").Popup("Ceci est un texte. Cette fenêtre se fermera automatiquement dans 10 secondes...", 10, "Exemple") If Resultat = -1 Then MsgBox "La boîte de dialogue s'est fermée toute seule" Else MsgBox "La boîte de dialogue a été fermée par l'utilisateur" End If End Sub |
MsgBox pour choisir une réponse
Si vous voulez utiliser la MsgBox temporaire uniquement pour afficher un message (donc avec uniquement le bouton "OK"), vous pouvez utiliser le code de base qui se trouve au début de cet article.
Si vous souhaitez pouvoir choisir les boutons à afficher (et donc les réponses à obtenir), vous devez ajouter un 4ème paramètre. Ce paramètre devra contenir la définition des boutons à afficher. Ce sont les mêmes que pour la fonction MsgBox classique.
Exemple de la boîte de dialogue temporaire avec les boutons Oui
et Non
comme possibles réponses:
1 2 3 |
x = CreateObject("WScript.Shell").Popup("Voulez-vous continuer?", 5, "Question", 4) 'ou bien y = CreateObject("WScript.Shell").Popup("Voulez-vous continuer?", 5, "Question", vbYesNo) |
Vous pouvez même utiliser les icônes de la MsgBox classique…
Exemple qui affichera une question "Oui / Non" avec une icône de "?":
1 2 3 |
x = CreateObject("WScript.Shell").Popup("Voulez-vous continuer?", 5, "Question", 4 + 32) 'ou bien y = CreateObject("WScript.Shell").Popup("Voulez-vous continuer?", 5, "Question", vbYesNo + vbQuestion) |
MsgBox temporaire avec une réponse par défaut
Ceci nous donne donc la possibilité, contrairement à la MsgBox classique, de choisir une réponse par défaut.
Donc en gros, soit l'utilisateur répond et la macro continue avec la valeur de sa réponse, soir il ne répond pas et la macro continuera avec une réponse par défaut (ou un code VBA au choix).
Comment cela marche: si la réponse renvoyé par la méthode .Popup
est différente de "-1", on utilise variante A du code qui suit, si la valeur est "-1", on utilise la variante B.
Exemple 1) MsgBox avec question "Oui / Non" – si l'utilisateur ne choisit pas, la macro continue avec la réponse par défaut "Non"
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Exemple1() 'par Excel-Malin.com ( https://excel-malin.com ) Dim Resultat As Integer Resultat = CreateObject("WScript.Shell").Popup("Tout va bien?", 5, "Exemple 1:", vbYesNo) If Resultat = -1 Then Resultat = vbNo 'la suite du code '... End Sub |
Exemple 2) MsgBox avec question "Oui / Non" – si l'utilisateur ne choisit pas, la macro fermera le Classeur…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Exemple2() 'par Excel-Malin.com ( https://excel-malin.com ) Dim Resultat As Integer Resultat = CreateObject("WScript.Shell").Popup("Tout va bien?", 5, "Exemple 1:", vbYesNo) If Resultat = -1 Then ThisWorkbook.Close SaveChanges:=False 'suite du code si la réponse de l'utilisateur était "Oui" '... End Sub |
Ceci pourrait être pratique dans la situation où vous voulez absolument éviter qu'un fichier Excel avec des données confidentielles reste ouvert aux yeux de tous pendant que l'utilisateur ait quitté son poste de travail. S'il ne répond pas "présent" dans un temps imparti, le fichier se ferme…
MsgBoxTemp: la MsgBox temporaire – fonction VBA complète!
Et pour terminer, un petit bonus pour vous faciliter la vie…
Comme il est relativement peu commode de devoir écrire CreateObject("WScript.Shell").Popup(
à chaque fois, je vous propose une fonction qui va améliorer la MsgBox classique.
En ayant le même comportement, avec la durée d'affichage en plus.
Il suffit d'ajouter la fonction suivante dans votre projet et ensuite appeler la fonction MsgBoxTemp à la place de MsgBox.
Code de la fonction MsgBoxTemp
Le code qui suit copie donc le comportement de la MsgBox classique en lui ajoutant la fonctionnalité de fermeture automatique après une durée choisie (nombre de secondes, dans le 2ème paramètre).
1 2 3 4 5 6 7 8 9 10 |
Public Function MsgBoxTemp(Contenu As String, Duree As Integer, Optional Boutons, Optional Titre As String) 'par Excel-Malin.com ( https://excel-malin.com ) On Error GoTo MsgBoxTempErreur MsgBoxTemp = CreateObject("WScript.Shell").Popup(Contenu, Duree, Titre, Boutons) Exit Function MsgBoxTempErreur: MsgBoxTemp = CVErr(xlErrValue) End Function |
Exemple d'utilisation dans une macro
Et voici comment l'utiliser en pratique… C'est tout aussi simple que la MsgBox classique…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Exemple3() '...votre code... 'test simple = la forme la plus utilisée du MsgBox classique MsgBoxTemp "Test 1", 5 'test avec titre MsgBoxTemp "Test 2", 5, , "Titre de la fenêtre" 'test avec boutons et titre MsgBoxTemp "Test 3", 5, vbYesNo + vbCritical, "Titre du Test 3" 'test avec réponse x = MsgBoxTemp("Test 4: Continuer?", 10, vbYesNo + vbQuestion, "Titre du Test 4") '... suite de votre code... End Sub |
Conclusion de ce tutoriel
Voilà, maintenant, vous avez la possibilité d'utiliser la fonction MsgBox classique si l'intervention de l'utilisateur est nécessaire, ou d'utiliser ma fonction MsgBoxTemp qui ne bloque pas la macro VBA au cas où l'utilisateur ne réagit pas.
J'espère qu'elle vous sera utile!
Pour aller plus loin en VBA
Et pour finir, voici quelques articles qui pourraient vous intéresser…
- Formation en ligne gratuite – "VBA: droit au but!"
- Liste de toutes les fonctions disponibles en VBA
- VBA: retour à la ligne, formater un MsgBox
- Utilisation de RECHERCHEV directement en VBA
- D'autres codes sources VBA prêts à l'emploi
2 commentaires sur “VBA: MsgBox qui se ferme automatiquement”
Merci pour votre code.
Le message ne disparait pas après le délai de 1 seconde. Est-ce que je dois cocher une référence (dans outils VBA) ? J'utilise déja ce code dans VBA Access et cela fonctionne. Mais pas dans Excel Merci à l'avance
Bonjour
j'ai appliqu/ le code: CreateObject("WScript.Shell").Popup "Ceci est un texte. Cette fenêtre se fermera automatiquement dans 10 secondes…", 10, "Exemple"
mais la boite message ne se ferme pas seule meme si je mets zero seconde