VBA: MsgBox qui se ferme automatiquement


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.

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…

VBA: MsgBox qui se ferme automatiquement après un délai même sans intervention de l'utilisateur
VBA: MsgBox qui se ferme automatiquement après un délai même sans intervention de l'utilisateur

 

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.

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.

Exemple des temps d'affichage sur un PC tournant à plein régime:

J’ai fait un test de la durée d’affichage sur une machine quelque peu surchargée (plusieurs sessions de Chrome ouvertes avec une centaine de sites ouverts, environ 15 documents PDF ouverts, etc.). Et voici les résultats:

Durée demandée (s)Durée réelle (hh:mm:ss)
100:00:03
200:00:02
300:00:03
400:00:04
500:00:07
600:00:06
700:00:26
800:00:08
900:00:09
1000:00:10
1100:00:15
1200:00:12
1300:00:17
1400:00:14
1500:00:15
1600:00:18
1700:00:27
1800:00:34
1900:02:00
2000:00:23

Comme vous voyez, dans la plupart de cas, la durée d’affichage corresponde plus ou moins. Mais il se peut qu’à un certain moment, un autre procès ralentit l’ordinateur et la durée d’affichage est plus longue que demandé.

Et si vous voulez le tester par vous-mêmes, voici le code VBA qui va le faire. Les résultats seront affichés dans la fenêtre “Exécution” de l’éditeur VBA.

Sub TestDureeAffichage()
'par Excel-Malin.com ( https://excel-malin.com )

For i = 1 To 20
    TimeStart = Time
        CreateObject("WScript.Shell").Popup "Contenu de la boîte de dialogue...", i, "Titre de la boîte de dialogue"
    TimeEnd = Time
    
    Debug.Print i & ": " & Format(TimeEnd - TimeStart, "hh:mm:ss")
Next i

End Sub

Le code VBA complet pour tester la MsgBox temporaire (elle restera affichée 10 secondes si l'utilisateur n'intervient pas avant).

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:

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:

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 "?":

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"

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…

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).

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

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

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…

 

7 0

Laissez un commentaire

Votre adresse e-mail ne sera pas publiée.

Commentaire sur “VBA: MsgBox qui se ferme automatiquement”