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