Icône de la ressource

VBA - UserForm vbModeless - MsgBox dans un UserForm affiché en vbModeless V2b

Le fichier à télécharger contient:
  1. Le Module_MsgBoxInModelessUserForm à importer dans le projet VBA.
  2. Le UserForm1 comme exemple de mise en œuvre.
Note: Voir toutes mes ressources -> https://excel-downloads.com/resources/?creator_id=268468

Les principales caractéristiques:
  • Permet d'afficher efficacement un MsgBox dans un UserForm affiché en vbModeless.
    En effet, dans ce cas, contrairement au UserForm affiché en vbModal, le simple MsgBox ne sait pas réactiver le curseur et la saisie en Control du UserForm sur lequel travaillait l'utilisateur avant le MsgBox, ce qui l'oblige à repérer et cliquer à nouveau dans ce Control pour continuer l'édition.

    Note: Il s'agit bien de faire réapparaître le curseur et permettre la saisie à suivre sans clic souris dans le Control qui, au sens VBA, reste quand même le UserForm.ActiveactiveControl au retour du MsgBox sans pourtant qu'une saisie y soit directement possible.

  • La fonction MsgBoxInModelessUserForm remédie à ce problème et, pour simplifier, possède exactement les mêmes paramètres que le MsgBox classique et les mêmes valeurs de retour. Il n'y a donc que le nom de la fonction qui change.

  • Cette fonction est aussi utilisable avec un UserForm Modal mais n'est pas nécessaire dans ce cas puisque le problème de "réactivation" du Control ne se pose pas avec un MsgBox classique.

  • Au passage, pour des affichages de messages aux multiples possibilités, je ne saurais trop recommander cette Ressource du même auteur :cool:: VBA - MsgBox personnalisé - MsgBoxPerso avec 0 à 12 boutons (type MsgBox ou textuels), icône & timer qui, à partir de la V18, gère ce problème particulier.
Remarque:
  • Le code inclut 2 fonctions qui peuvent être intéressantes dans d'autres contextes:
    - Pour trouver l'Objet UserForm actif: Function GetActiveUserForm() As Object
    - Pour trouver les coordonnées Pixels d'un Control de UserForm: Function GetUserFormControlRECT() as RECT
Mise en œuvre très simple:
  • Placer le Module_MsgBoxInModelessUserForm dans la projet VBA.

  • Dans le code VBA, utiliser la fonction MsgBoxInModelessUserForm() avec les paramètres et les valeurs de retour identiques à ceux d'un MsgBox classique.
    VB:
    .../...
    Call MsgBoxInModelessUserForm("La saisie du numéro de compte est incorrecte !")
    .../...
Versions:
  • V1 - Initiale
  • V2 - Change la méthode de réactivation du Control pour éviter de déclencher les évènemente Control_Exit() et Control_Enter().
    V2b - Met en Private Sub et Fonctions internes du Module

MsgBoxInModelessUserForm.gif