Icône de la ressource

VBA - UserForm vbModeless - Réactiver le UserForm sans clic souris, sur un simple Mouse Over V2c

Le fichier à télécharger contient:
  1. Le Module_ReactivateUserForm à importer dans le projet VBA.
  2. Le Module_Test et le UserForm1 comme exemple de mise en œuvre.
Les principales caractéristiques:
  • Permet, sur simple "MouseOver" (évènement UserForm_MouseMove), de réactiver un UserForm affiché en vbModeless et accessoirement de réactiver le Control actif (ou le Control passé en argument optionnel) au moment où le UserForm a perdu le focus au profit de la (d'une) feuille.
Remarque:
  • Tout ça pour éviter un clic souris ?! Franchement...

  • Attention:
    La méthode de réactivation du Control utilise la propriété Control.Visible mise à False puis à True pour "réveiller" le Control.
    Cette méthode présente l'inconvénient de déclencher les évènements:
    - Control_Exit() sur le Control.Visible = False
    - Control_Enter() sur le Control.Visible = True
    Les commentaires indiquent un moyen de se protéger de cet effet secondaire si ces évènements sont gérés par le code du UserForm.

    Cependant, une autre méthode sans effet secondaire est possible en utilisant un clic souris simulé dans le Control pour le "réveiller".
    Le fichier correspondant est ici -> https://cjoint.com/c/MEuigNNQlpJ
Mise en œuvre très simple:
  • Placer le Module_ReactivateUserForm dans la projet VBA.

  • Dans le code de la feuille ou du UserForm, sur l'évènement UserForm_MouseMove appeler la fonction ReactivateModelessUserForm() avec les paramètres ad hoc.
    VB:
    '------------------
    'UserForm MouseMove
    '------------------
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        'If not the Foreground Window, the Modeless UserForm will be re-activated and the Focus set on its Active Control
        Call ReactivateModelessUserForm(Me)
    
        'If not the Foreground Window, the Modeless UserForm will be re-activated and the Focus set on TextBox1
        'Call ReactivateModelessUserForm(Me, Me.TextBox1)
    End Sub
Versions:
  • V1 - Initiale
  • V2 - Simplification drastique et ajout du choix optionel du Control sur lequel faire Focus après ré-activation du UserForm.
    V2b - Micro-modification pour supprimer un TextBox.SelStart inutile.
    V2c - Ajout de commentaires sur le fait que les évènements Control_Exit() et Control_Enter() de l'ActiveControl vont être déclenchés et que s'ils sont codés, il faut gérer un Flag dans le UserForm pour les ignorer en cas de réactivation.
MouseOver.gif