Tutoriels > Tutoriels & Astuces Excel > L'API Windows > MsgBox personnalisées (API)

MsgBox personnalisées (API)

Publié par myDearFriend! le 18-11-2007 (60753 lectures)

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 : OK Annuler Abandonner Recommencer Ignorer Oui Non ?


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



MsgBox personnalisée

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

Me basant donc sur l'excellente source citée ci-dessus, je vous propose un simple module de code à copier ou importer dans votre projet VBA, module qui vous permettra d'obtenir aisément des MsgBox originales et plus parlantes qu'à l'accoutumée.

Télécharger 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.

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

       

L'appel de la fonction MsgBoxPerso reste assez proche de ce que vous connaissez déjà.


Syntaxe :

MsgBoxPerso(prompt [, title] [, icon] [, caption1] [, caption2] [, cancel])


Les arguments nommés sont décrits ci-dessous :

ArgumentsDescriptions
 prompt
  • Chaîne de caractères représentant le texte de la boîte de dialogue.
 title
  • Facultatif. Chaîne de caractères valant titre de la boîte de dialogue.
    (à défaut, aucun titre pour la MsgBox)
 icon
  • Facultatif. Peut être une des constantes VBA suivantes : vbCritical  , vbQuestion  , vbExclamation  ou vbInformation  .
    Bien sûr, l'effet est le même en utilisant leur valeur respective : 16, 32, 48 ou 64.
    (à défaut, pas d'icone dans la MsgBox)
 caption1
  • Facultatif. Chaîne de caractères représentant le texte que vous voulez attribuer au premier bouton.
    (à défaut, le texte sera "Oui")
 caption2
  • Facultatif. Chaîne de caractères représentant le texte que vous voulez attribuer au deuxième bouton.
    (à défaut, le texte sera "Non")
 cancel
  • Facultatif. Valeur boolean. Un bouton Annuler sera affiché si vous définissez cet argument sur True.
    (la valeur par défaut est False)

Ainsi, pour obtenir la boîte de dialogue suivante :

MsgBox personnalisée

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.
Annuler
0
Bouton perso n° 1
1
Bouton perso n° 2
2




Exemple d'utilisation

MsgBox personnalisée

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

Télécharger 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 :

Le module de code nécessaire à l'utilisation de MsgBoxPerso
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 !

Curieusement, les tests de cette procédure à base d'API Windows ne fonctionnent pas lorsqu'on lance le code directement depuis l'éditeur VBE. Dans ce cas, les boutons afficheront invariablement leur valeur par défaut (c'est à dire "Oui" et "Non"). Il convient donc de lancer vos tests depuis l'interface Excel (comme le fera l'utilisateur de votre projet) et non depuis l'éditeur de code VBA.

Cette façon de personnaliser les boutons de MsgBox souffre de deux défauts majeurs :
  1. 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.
  2. 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.

API MsgBox Perso






Pour toutes vos questions ou si vous rencontrez des difficultés, n'hésitez pas à rejoindre nos Forums de Discussions !

Tags VBA   Bouton   API   MsgBox   MsgBoxPerso   Personnalisé  

 

Autres articles dans cette catégorie Publié le Vues
mDF MsgBoxPerso « le Retour » 02-11-2008 17112
MsgBox personnalisées (API) 18-11-2007 60754
API Windows - Introduction 03-07-2006 12337