XL 2016 VBA - Question complexe ! Activer la Feuille ou le UserForm selon la position du curseur de la souris

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

  • Raison de ce développement ?
    Lorsqu'on affiche un UserForm vbModeless c'est pour pouvoir gérer à la fois les objets du UserForm et les Objets de la feuille.
    L'ennui, c'est qu'avant de pouvoir disposer des objets de l'un ou l'autre il faut l'activer, c'est à dire cliquer "dedans".
    Et ça, c'est vraiment nul d'un point de vue ergonomique.

  • Que fait la fonction ?
    La fonction UserFormWithActivationManagement(UserForm) permet:
    - d'afficher un UserForm en vbModeless
    - de gérer l'activation de la feuille ou du UserForm selon la position de la souris

  • Comment ?
    S'il existe un évènement UserForm_MouseMove qui pourrait régler le problème pour l'activation du UserForm,
    il n'existe pas d'évènement Worksheet_MouseMove (à moins que quelqu'un sache faire un équivalent) ?

    La fonction scanne régulièrement la position du curseur de la souris pour activer l'un ou l'autre.
    La boucle de scanne est faite avec l'API SetTimer car toute autre méthode (Sleep, boucle Doevents) ne permet pas l'exécution d'un code par ailleurs, sauf Application.OnTime qui ne descend pas en dessous de la seconde (trop long) et qui pose problème si on descend en dessous de la seconde.

  • Problème ?
    Le SetTimer est ultra-violent et se déclenche quelque soit le code en cours par ailleurs.
    J'ai donc utilisé Application.Ready pour protéger le traitement. Ça fonctionne.
    SAUF en cas de MsgBox ou prompt géré par UserForm, Application.Ready = True et ça plante grave.

  • La question ?
    Comment détecter la présence d'un MsgBox ?
    OU
    Comment générer un évènement sur un Worksheet_MouseMove ?
 

Pièces jointes

  • UserFormWithActivationManagement Timer.xlsm
    42.1 KB · Affichages: 3
Solution
En effet ce n'est pas utile de réactiver le UserForm en l'état présenté du code.
Sauf quand on veut réactiver le Control actif avant la désactivation du UserForm.

C'est ce que j'avais dans une ancienne version basée uniquement sur le UserForm_MouseMove() qui donc n'activait pas la feuille et que j'ai tenté de reproduire ici en n'utilisant que la position curseur ce qui permet aussi de rendre la fonction indépendante du code du UserForm.

Par exemple ici avec une TextBox.
activation2.gif

Dranreb

XLDnaute Barbatruc
Bonsoir.
Je ne comprends pas trop ou est le problème. Le fait que ce soit la fenêtre de l'application qui soit active n'empêche pas la prise en compte des évènements de contrôles d'un UserForm affiché non modal.
Il y a des chances que mon CouleursCls.xlsm disponible en téléchargement vous donne des idées.
Il a des UserForm pour choisir certains paramètres de la couleur définie par une ligne, et même un UserForm de capture d'un pixel qui suit à bonne distance le curseur de la souris.
 

Dudu2

XLDnaute Barbatruc
Merci @Dranreb pour ton retour.
En fait, c'est en conduisant que j'ai trouvé une solution toute bête.
Lorsque le MsgBox ou un UserForm est en cours d'affichage, la Foreground Window n'est ni l'application Excel ni le UserForm. Donc dans ce cas, il faut passer son chemin.

activation.gif
 

Pièces jointes

  • UserFormWithActivationManagement.xlsm
    42.6 KB · Affichages: 0

Dranreb

XLDnaute Barbatruc
Je ne comprend toujours pas à quoi ça sert d'activer l'UserForm. Il s'active de lui même par un clic sur le CommandButton1, non ? Et d'ailleurs je ne sais même pas à quoi ça sert qu'il s'active. Il me semble que l'essentiel c'est seulement que le code du CommandButton s'exécute !
 

Dudu2

XLDnaute Barbatruc
En effet ce n'est pas utile de réactiver le UserForm en l'état présenté du code.
Sauf quand on veut réactiver le Control actif avant la désactivation du UserForm.

C'est ce que j'avais dans une ancienne version basée uniquement sur le UserForm_MouseMove() qui donc n'activait pas la feuille et que j'ai tenté de reproduire ici en n'utilisant que la position curseur ce qui permet aussi de rendre la fonction indépendante du code du UserForm.

Par exemple ici avec une TextBox.
activation2.gif
 

Pièces jointes

  • UserFormWithActivationManagement.xlsm
    41.2 KB · Affichages: 0
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
313 271
Messages
2 096 724
Membres
106 720
dernier inscrit
Alain EDZOA