La fonction MsgBox réserve une surprise !

La fonction MsgBox appartient au module VBA.Interaction.

Ce module est implicite puisqu'il n'est pas nécessaire d'y faire référence pour avoir accès à ses fonctionnalités.
Ainsi, la fonction MsgBox() s'appelle telle-quelle ou en précisant le module "Interaction" :

VBA.Interaction.Msgbox "Prompt"

Le Subclassing

Les fonctions du module "Interaction", peuvent être modifiés pour s'adapter aux besoins du développeur.

Il devient avec cette technique possible de supplanter les objets du module "Interaction" avec nos propres objets.

Masquer les objets du module "Interaction"

Il suffit de créer une procédure ou fonction du même nom que la fonction à masquer.

Sub MsgBox()

  frMsgBox.Show ' Affiche l'UserForm.

End Sub

Ici, la fonction MsgBox personnalisée affiche un formulaire.

Appel de la fonction MsgBox() personnalisée

On appelle notre procédure ou fonction MsgBox personnalisée comme la fonction standard.

Sub Test()

  MsgBox ' Appel de notre procédure.

End Sub

Pourquoi utiliser le module "Interaction"

Appeler la fonction standard de vba

Bien sûr, il est toujours possible dans un projet d'utiliser la fonction standard qui vient d'être subclassée.

Il faut faire explicitement appel à la fonction du module "Interaction" :

VBA.Interaction.Msgbox "Prompt"

Par cette technique je possède deux versions de la fonction MsgBox, ma version personnalisée et la version standard de vba.

Sub MsgBox(byVal argMessage As String)

  VBA.Interaction.Msgbox argMessage, vbOKOnly+vbInformation, "Alcya Informatique", "alcya.CHM", 6 ‘ Appel à MsgBox standard.

End Sub

Fonctions du module VBA.Interaction

Le module "Interaction" de VBA contient des instructions que nous utilisons tous les jours.

CLiquer ici pour afficher/masquer la liste des fonctions vba.
Liste des fonctions du module "Interaction".
Fonctions Objectifs
MsgBox Affiche un message. Vous pouvez par exemple donner des valeurs par défaut à la boite de dialogue (titre, bouton par défaut, fichier d'aide).
InputBox Demande une valeur. Vous pouvez améliorer l'InputBox pour tester par exemple le bouton cliqué.
IIf Opérateur ternaire. Peu sûr, vous pouvez l'utiliser pour écrire un IIF plus performant.
Switch Évalue une expression et retourne la valeur correspondante.
Choose Extraire une valeur d'une liste d'après son index.
Partition Retourne (String) la plage à laquelle appartient une valeur.
Beep Emettre un Bip. Vous pouvez par exemple, jouer un fichier wav, mid, mp3 dans la version modifiée.
DoEvents Rendre la main à Windows pour qu'il traite ses messages. Vous pouvez écrire un code plus complexe pour gérer un DoEvent plus efficace.
Shell Ouvre une application.
AppActivate Active une application (elle doit être ouverte).
Sendkeys Envoyer une séquence de touches à un programme. Il est possible d'écrire un code plus optimisé.
CallByName Exécuter une méthode ou définir ou renvoyer une propriété d’un objet sou forme de chaine.
CreateObject Crée et renvoie une référence à un objet ActiveX.
GetObject Ouvre un fichier (ActiveX).
Command ou Command$ Traiter les paramètres de ligne de commandes (inopérant en V.B.A.) ainsi vous pouvez l'utiliser pour ce que vous souhaitez.
Environ ou Environ$ Reprend les variables d'environnement Windows.
SaveSetting Créer une clée dans la base de registre Windows.
GetAllSettings Récupère les chaines de la base de registre créées avec SaveSetting.
GetSetting Récupère la valeur d'une clée du registre Windows.
DeleteSetting Supprime une clé de la base de registre.

Exemple

Dans l'exemple suivant, la fonction Partition() personnalisée appelle la fonction standard en donnant des valeurs par défaut.

' Retourne (String)l'intervalle dans laquelle est comprise la valeur.

Function Partition(ByVal argValue As Long) As String

  Partition = VBA.Interaction.Partition(argValue, 150, 1025, 250)

End Function

Sub SamplePartition()

  Debug.Print "Plage valeur : " & Partition(50) ' Retourne => : 149

  Debug.Print "Plage valeur : " & Partition(827) ' Retourne => 650: 899

  Debug.Print "Plage valeur : " & Partition(2080 ' Retourne => 1026:

End Sub

Conclusion

Le subclassing est intéressant pour définir des valeurs par défaut, ou rendre des fonctions V.B.A plus robustes comme Sendkeys, DoEvents, InputBox.

Comme je l'ai expliqué dans cet article, la fonction InputBox est peu sûre, et il convient de la sécuriser.

Plutôt que de le faire à chaque appel de l'InputBox autant la subclasser une fois pour toute et rien n'empêche d'utiliser la fonction InputBox standard en l'appelant explicitement avec :

VBA.Interaction.InputBox("Prompt").

Notes

Le module Interaction existe aussi en vbnet dans l’espace de nom Microsoft.VisualBasic.


Achetez mon ouvrage !

Mon PDF « Créer un planning perpétuel sur Microsoft Excel sans macro » est disponible à la vente.

Pour plus d’informations, rendez-vous sur la page dédiée.