Icône de la ressource

VBA - MsgBox personnalisé - MsgBoxPerso - de 0 à 12 boutons (type MsgBox ou textuels), icône & timer V9

Le fichier à télécharger contient:
  1. Le UserForm MsgBoxPerso à importer dans le projet VBA pour utiliser ce MsgBox Personnalisé,
  2. Le Module_Test qui donne quelques exemples d'utilisation.
L'appel de la fonction:
VB:
Dim Retour As Variant
'
Retour = MsgBoxPerso.Display(...voir la description des paramètres dans le code...)

Les principales caractéristiques:
  • Office 2010+ (VBA7 sinon modifier les déclarations API comme indiqué).
  • Peut être utilisé exactement comme un MsgBox pour ses constantes de boutons de 0 à 768 (sauf paramètres helpfile & context) et pour ses constantes de retour.
  • Peut utiliser jusqu'à 12 boutons en format texte libre.
  • Peut être prépositionné (valeurs Left et Top en paramètres d'appel).
  • Peut être repositionné par une fonction utilisateur (ReposFunction en paramètre d'appel) après qu'il a pris ses dimensions définitives juste avant son affichage (voir aussi cette ressource pour le positionnement d'un UserForm sur un Objet).
  • Inclut un Timer pour limiter le temps d'affichage si besoin avec sa valeur de retour dédiée (-1).
Versions:
  • V1 - Initiale
  • V2 - Le paramètre ShowMode (vbModal ou vbModeless pas défaut) permet maintenant d'utiliser la fonction MsgBoxPerso.Display() dans un UserForm lui-même Modal. En effet, un UserForm Modal n'accepte pas qu'on affiche un UserForm non Modal "au-dessus" de lui (erreur 401).
    Cependant, avec ShowMode = vbModal, on perd le Timer.
  • V3 - Corrections pour compatibilité Office 64 bits
  • V4 - Activation de la fenêtre appelante en retour de fonction (utile si l'appel est fait dans un UserForm vbModeless).
  • V5 - Supprime le paramètre ShowMode et gère l'erreur 401 pour passer automatiquement en vbModal si la fonction est appelée par un UserForm vbModal, mode dans lequel on perd le Timer.
  • V6 - Correction d'un Bug introduit par la V5 sur les retours en Caption des boutons (quand le paramètre ReturnButtonNumber:=False).
  • V7 - Appel de la fonction utilisateur de positionnement dans l'Activate() plutôt qu'avant le Show() pour avoir la forme définitive du UserForm (avec ou sans Caption).
  • V8 - Protection appel réccurrent et mise en ForeGround si appel d'un UserForm non modal.
    Remplacement des évènements MouseDown() par MouseUp() pour ne pas interférer sur l'appelant lors du MouseUp().
  • V9 - Ajout du paramètre ShowOnAllWindows pour garder le message affiché sur toutes les fenêtres Excel.
Démo.gif


Une fonctionnalité intéressante:
Il est possible d'afficher le message en mode Interactive, c'est à dire de pouvoir interagir avec la feuille ou le classeur pendant que le message est affiché.
Ainsi un prompt MsgBoxPerso peut être utilisé pour demander à l'utilisateur de réaliser certaines actions à l'issue desquelles il fermera le prompt indiquant au code qu'il peut en exploiter le résultat.

Un exemple avec ce code:
VB:
Sub Test()
    Dim CB As OLEObject
    Dim Réponse As Variant
    Dim S As String
 
    'RAZ des CheckBoxes
    For Each CB In ActiveSheet.OLEObjects
        CB.Object.Value = False
    Next CB
 
    '------------------
    'Prompt Interactive
    '------------------
    Réponse = MsgBoxPerso.Display("Sélectionner les périodes du jour à prendre en compte." & vbCrLf & vbCrLf & _
                                   "Après avoir terminé la sélection, cliquer [Valider]", _
                                   Buttons:="Valider|Abandonner", _
                                   Title:="Périodes du jour", _
                                   Interactive:=True)
    'Abandon
    If Réponse = 2 Then
        MsgBox "Abandon"
        Exit Sub
    End If
 
    'Affichage de la sélection
    S = "Sélection:" & vbCrLf
 
    For Each CB In ActiveSheet.OLEObjects
        'Le nom de CheckBoxes est "CheckBox" + leur Caption
        If CB.Object.Value Then S = S & "- " & Mid(CB.Name, Len("CheckBox") + 1) & vbCrLf
    Next CB
 
    MsgBoxPerso.Display S
End Sub
MsgBoxPersoModeless.gif