MsgBox personnalisées (API)
Une MsgBox avec boutons personnalisés, est-ce possible ?
La MsgBox est une fonction importante de VBA, mais nous avons tous constaté un jour ou l'autre qu'elle souffre d'un gros manque en terme de personnalisation : qui d'entre nous n'a jamais souhaité pouvoir se servir d'autre chose que des 7 éternels boutons : ?
Lassé de ces boîtes sans vie, par un beau matin de recherches sur le net , j'ai eu le bonheur de découvrir les travaux de Michel Pierron ! Un travail ex-tra-or-di-nai-re sur l'API Windows que je vous recommande de consulter et notamment sur le site Excelabo (qui, au passage, mérite bien son nom !).
L'API Windows nous fourni donc un bon moyen pour personnaliser les boutons de notre MsgBox. Me basant sur le bel ouvrage de ce développeur génial, je vous propose ainsi une adaptation du code pour obtenir de façon simple une MsgBox un peu plus fun...
Une MsgBox comme celle-ci, ça vous dirait ?
La source
Quoi de plus naturel que de donner accès à la source de cet article ?
Vous pouvez télécharger le fichier original de Michel Pierron ayant servi de base au présent article (je vous y encourage même). Ce fichier se nomme mp-MsgBoxPlus et vous le trouverez à cette adresse sur le site Excelabo.
La mise en oeuvre
Au bas de cet article , vous pouvez télécharger le module de code .txt prêt à être importé dans votre projet VBA.
Une fois le module de code importé, tout est fait pour rendre l'utilisation la plus simple possible et pour rester au plus près de la syntaxe VBA habituellement appliquée pour les MsgBox « classiques ». Le développeur que vous êtes ne sera donc pas dérouté par cette mise en oeuvre VBA.
(Lire également les remarques au bas du présent ce document)
MsgBoxPerso : syntaxe et arguments
Syntaxe :
MsgBoxPerso(prompt [, title] [, icon] [, caption1] [, caption2] [, cancel])
Les arguments nommés sont décrits ci-dessous :
Arguments | Descriptions |
prompt |
|
title |
|
icon |
|
caption1 |
|
caption2 |
|
cancel |
|
Ainsi, pour obtenir la boîte de dialogue suivante :
La simple instruction ci-dessous est suffisante :
MsgBoxPerso "Elle est pas belle ma boîte ?", "mDF XLpages", vbQuestion, "Génial!!!", "Mouais. bof"
Il convient ensuite de voir comment exploiter la réponse de l'utilisateur. C'est ce que nous allons voir maintenant.
Valeur de retour
L'objectif principal pour une MsgBox à plusieurs boutons est évidemment d'être utilisée en tant que fonction pour recevoir en retour le choix de l'utilisateur (parce qu'on attend une réponse de l'utilisateur, hein ? ).
A l'instar de notre MsgBox habituelle, la MsgBoxPerso retourne une valeur numérique nous indiquant le bouton sélectionné par l'utilisateur. On notera toutefois une différence avec cette valeur retournée :
Si l'utilisateur clique sur ... | ... voici la valeur retournée. |
| 0 |
| 1 |
| 2 |
Exemple d'utilisation
Le code nécessaire pour afficher cette MsgBoxPerso et en exploiter la réponse utilisateur peut ressembler à celui-ci :
Dim MonMessage As String
Dim Rep As Byte
MonMessage = "Mes cher(e)s ami(e)s," & vbLf & vbLf & "Cet article vous a-t'il plu ?"
Rep = MsgBoxPerso(MonMessage, "mDF XLpages.com", vbQuestion, "Super !", "Aucun intérêt", True)
Select Case Rep
Case 0
' ici le traitement (éventuel) si Annulation
' ...
Case 1
' ici le traitement si réponse = "Super !"
' ...
Case 2
' ici le traitement si réponse = "Aucun intérêt"
' ...
End Select
Le module de code
Au bas de cet article , vous pouvez télécharger le module de code .txt prêt à être importé dans votre projet VBA.
Mais qu'y a t'il dans ce module de code ?
En voici le contenu :
Option Explicit
'===============================================================================================
' Module de code adapté des excellents travaux de Michel Pierron
' trouvé sur le site www.excelabo.net
'
' Didier Fourgeot (myDearFriend!) - www.mdf-xlpages.com
'===============================================================================================
'
'
' Pour obtenir une MsgBox personnalisée dans votre propre projet VBA :
' ------------------------------------------------------------------
' - Copiez (ou importez) tout d'abord le présent module de code dans votre projet VBA.
' - Puis, dans votre propre code, il suffit d'appeler la fonction MsgBox comme suit :
'
' varReponse = MsgBoxPerso(prompt [, title] [, icon] [, caption1] [, caption2] [, cancel ])
'
'
' Comme pour une MsgBox 'classique', seul l'argument message est obligatoire :
' --------------------------------------------------------------------------
' prompt : chaîne de caractères correspondant au texte à afficher
' title : [facultatif] chaîne de caractères représentant le titre
' icon : [facultatif] valeur identique que pour une MsgBox classique
' constantes : vbCritical, vbQuestion, vbExclamation ou vbInformation
' caption1 : [facultatif] chaîne de caractères correspondant au titre du bouton n°1
' caption2 : [facultatif] chaîne de caractères correspondant au titre du bouton n°2
' cancel : [facultatif] affiche un bouton Annuler dans la boîte de dialogue si = True
'
'
' Valeur de retour :
' ----------------
' Le choix de l'utilisateur est renvoyé sous forme d'une valeur (type Byte) de 0 à 2 :
'
' 0 : l'utilisateur a cliqué sur le bouton Annuler
' 1 : l'utilisateur a cliqué sur le bouton n° 1
' 2 : l'utilisateur a cliqué sur le bouton n° 2
'
'===============================================================================================
Private Declare Function SetWindowsHookEx& Lib "USER32" Alias "SetWindowsHookExA" _
(ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)
Private Declare Function GetCurrentThreadId& Lib "kernel32" ()
Private Declare Function CallNextHookEx& Lib "USER32" _
(ByVal hHook&, ByVal CodeNo&, ByVal wParam&, ByVal lParam&)
Private Declare Function GetWindow& Lib "USER32" (ByVal hWnd&, ByVal wCmd&)
Private Declare Function SetWindowText& Lib "USER32" Alias "SetWindowTextA" _
(ByVal hWnd&, ByVal lpString$)
Private Declare Function UnhookWindowsHookEx& Lib "USER32" (ByVal hHook&)
Private msgHook&
Private TitreBtn$(1 To 2)
Function MsgBoxPerso(Prompt$, Optional Title$, Optional Icon&, Optional Caption1$ = "Oui", _
Optional Caption2$ = "Non", Optional Cancel As Boolean = False) As Byte
Dim Rep%, hInstance&
TitreBtn(1) = Caption1
TitreBtn(2) = Caption2
msgHook = SetWindowsHookEx(5, AddressOf CaptionBoutons, hInstance, GetCurrentThreadId())
Rep = MsgBox(Prompt, Icon + IIf(Cancel, vbYesNoCancel, vbYesNo), Title)
MsgBoxPerso = Application.Max(Rep - 5, 0)
Erase TitreBtn
End Function
Private Function CaptionBoutons&(ByVal nCode&, ByVal wParam&, ByVal lParam&)
Dim hWndChild&
If nCode < 0 Then
CaptionBoutons = CallNextHookEx(msgHook, nCode, wParam, lParam)
Exit Function
End If
If nCode = 5 Then
hWndChild = GetWindow(wParam, 5)
Call SetWindowText(hWndChild, TitreBtn(1))
hWndChild = GetWindow(hWndChild, 2)
Call SetWindowText(hWndChild, TitreBtn(2))
UnhookWindowsHookEx msgHook
End If
CaptionBoutons = False
End Function
Remarques importantes !
Cette façon de personnaliser les boutons de MsgBox souffre de deux défauts majeurs :
- Seuls, deux boutons maximum sont personnalisables. Mise à part le bouton "Annuler", impossible d'ajouter d'autres boutons persos dans une même boîte de dialogue.
- La largeur des boutons n'est pas modifiable. Il convient donc de veiller à ne pas utiliser de titres trop longs pour vos boutons !
Pour illustrer l'utilisation du module de code téléchargeable ci-dessous , vous trouverez également en Section Téléchargements - catégorie Classeurs Exemples / API Windows, le fichier API MsgBox Perso.
Autres articles dans cette catégorie | Publié le | Vues |
---|---|---|
mDF MsgBoxPerso « le Retour » | 02-11-2008 | 18530 |
MsgBox personnalisées (API) | 18-11-2007 | 62410 |
API Windows - Introduction | 03-07-2006 | 12801 |