Un "Custom MsgBox": -> qui s'appelle exactement comme un MsgBox (mêmes arguments), -> qui s'affiche exactement comme un MsgBox (même look, par défaut peu plus grand pour une meilleure lisibilité), -> qui se comporte exactement comme un MsgBox (même ergonomie, mêmes valeurs de retour), Et... -> dont on peut facilement personnaliser le texte, les boutons et la position. Remplacer partout Msgbox par Msg.Box et le tour est joué ! |
Le fichier à télécharger Custom MsgBox.xlsm contient:
- Le UserForm Msg à importer dans le projet VBA.
- Le Module_Test comme exemple de mise en œuvre.
Les principales caractéristiques:
- Permet d'afficher l'équivalent d'un MsgBox() avec les mêmes paramètres d'appel et valeurs de retour que le MsgBox() standard.
Cela permet donc de remplacer purement et simplement le MsgBox() standard dans le code sans autre modification (voir les restrictions) !
Avec un avantage immédiat: la taille par défaut du texte est plus grande pour une meilleure lisibilité.
Voir https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/msgbox-function
Restrictions:- Toutes les valeurs de boutons de 0 à 768 du MsgBox() sont traitées, pas les valeurs au-delà.
- Les paramètres helpfile & context du MsgBox() ne sont pas traités.
- Les touches <Control + Pause> arrêtent le code juste après un MsgBox() ce qui n'est possible avec le Custom MsgBox qu'en utilisant un paramètre spécial ajouté en V3.
…
- De plus des fonctions indépendantes permettent, préalablement à l'appel de la fonction d'affichage, de personnaliser les valeurs par défaut définies en constantes dans le code relatives au nom, à la taille et la couleur de la police, la couleur de fond et les tailles minimales et maximales de la fenêtre de texte.
- Par défaut, le UserForm est centré sur l'écran comme le MsgBox standard et dimensionné pour rester 100% visible dans l'écran (Workarea) quelles que soient les dimensions du texte. En largeur, le texte est replié si besoin et en hauteur, une Scroll Bar verticale est ajoutée si besoin.
<> 2 fonctions sont disponibles pour positionner le UserForm Msg
- soit en coordonnées absolues X et Y en points,
- soit par rapport à un objet de la feuille (cellule, forme, ...).
<> 1 fonction est disponible pour désactiver le traitement de dimensionnement automatique pour rester visible à l'écran (Workarea).
- 1 fonction permet de changer le mode d'affichage de Modal (par défaut) en non Modal pour, par exemple, solliciter une action de l'utilisateur (ex. une sélection, une correction de valeur, ...) avant de répondre au message.
- Placer le UserForm Msg dans la projet VBA.
- Dans le code VBA, utiliser la fonction Msg.Box() avec les paramètres habituels d'un MsgBox() standard et ses valeurs de retour (sauf valeurs de boutons au-delà de 768 et paramètres helpfile & context).
- Pour personnaliser certaines valeurs (taille, couleur, position), utiliser préalablement à l'appel de la fonction d'affichage Msg.Box() concernée, les fonctions définies à cet effet. Ces personnalisations sont volatiles et ne s'appliquent qu'à l'appel de la fonction Msg.Box() qui les suit.
With Msg- .SetPromptFontName()
- .SetPromptFontSize()
- .SetPromptFontStyle()
- .SetPromptFontColor()
- .SetPromptBackColor()
- .SetPromptTextAlign()
- .SetButtonMinWidth()
- .SetButtonMinHeight()
- .SetButtonFontName()
- .SetButtonFontSize
- .SetButtonFontStyle()
- .SetButtonFontColor()
- .SetButtontBackColor()
- .SetPositionXY()
- .SetOnWorksheetObject()
- .SetFitToScreen()
- SetShowMode()
End With
- L'animation ci-dessous est obtenue avec le code suivant (voir le Module_Test)
VB:'------------------------------------------------------------------- ReturnValue = Msg.Box(Message & " standard", Buttons, Title) '------------------------------------------------------------------- With Msg .SetPromptFontForeColor vbRed .SetPromptBackColor vbYellow .SetPromptFontStyle "Italic" .SetPromptFontSize 20 .SetButtonBackColor vbGreen, vbYes .SetOnWorksheetObject [G2] ReturnValue = .Box(Message & " customized", Buttons, Title) End With '------------------------------------------------------------------- .../... Msg.Box "ReturnValue = " & S
- Depuis la V8, les fonctions de positionnement .SetPositionXY() et .SetOnWorksheetObject() bénéficient pour leurs paramètres HorizontalShiftPoints et VerticalShiftPoints de la possibilité de faire référence à la taille finale du message grâce aux fonctions Msg.FinalWidth et Msg.FinalHeight. qui acceptent un ratio (positif ou négatif) de décalage.
- Le code suivant décalera la position initiale X = 100 et Y = 200 d'une demi-largeur vers la gauche et d'une demi-hauteur vers le haut (largeur et hauteur du message tel que finalement dimensionné pour affichage).
VB:Msg.SetPositionXY 100, 200, HorizontalShiftPoints:=Msg.FinalWidth(-0.5), VerticalShiftPoints:=Msg.FinalHeight(-0.5)
- Le code suivant positionnera le message à gauche de la cellule H10.
VB:Msg.SetPositionOnWorksheetObject ActiveSheet.[H10], HorizontalShiftPoints:=Msg.FinalWidth(-1)
- Le code suivant positionnera le message au centre d'un moniteur dont le RECT est la variable RM.
Les X et Y représentent le centre du moniteur, les décalages centrent le message sur ce point X, Y.
VB:Msg.SetPositionXY (RM.Left + (RM.Right - RM.Left) / 2) * PixelToPoint, _ (RM.Top + (RM.Bottom - RM.Top) / 2) * PixelToPoint, _ HorizontalShiftPoints:=Msg.FinalWidth(-0.5), _ VerticalShiftPoints:=Msg.FinalHeight(-0.5)
- V1 - Initiale.
- V2 - Correction pour configuration multi-moniteurs.
- V3 - Ajout du paramètre optionnel ReturnBreak pour retourner la valeur -1 si Control + Pause a été entré sur le UserForm dans un but de debug.
- V4 - Correction du Handle permettant de calculer les coordonnées du moniteur.
- V5 - Correction d'un bug en récupération du Handle d'un Workbook multi-fenêtré.
- V6 - Ajout des déclarations API pour 32 bits.
- V7 - Supprime la fonction .SetPromptMaxWidth() et ajoute la fonction .SetFitIntoTheScreen() qui garantit la visibilité complète du message
- V8 - Ajout de la possibilité de positionner le message par décalage horizontal et/ou vertical par rapport à un ratio de ses propres dimensions avec les fonction .FinalWidth et .FinalHeight.
- V9 - Supprime la fonction .SetFitIntoTheScreen() qui intègre le code et ajoute la fonction .SetShowMode() pour afficher le prompt en Modal (par défaut) ou en non Modal.
- V10 - Suppression de l'API GetDpiForWindow() non supporté par les anciennes versions de Windows.
- V11 - Remplacement d'une instruction qui plante en Office 2010 et ajout de la fonction Msg.SetFitToScreen().
- V11B - Ajout commentaire de la valeur par défaut de FitToScreen.
- V12 - Correction bug positionnement multi-moniteurs.
- Version
- V1