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 ?