Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Taux de recouvrement d'un RECT par un autre RECT

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Le point de départ de ce problème est la question "doit-on changer le OWNER d'un UserForm" ?
Parce que s'il est placé ou déplacé sur l'une des fenêtres d'un classeur qui n'est pas son OWNER, on le sait grâce à l'évènement UserForm_Layoit(), il sera masqué totalement ou partiellement par cette fenêtre dès lors qu'elle sera active. Et dans ce cas, il faut changer son OWNER par le Handle de la fenêtre en question.

D'où la question... Quel est le taux de recouvrement du UserForm RECT par un Window RECT.

La fonction PourcentageUserFormSurfaceCouverteParWindow dans ce fichier est à écrire !
 

Pièces jointes

  • Classeur5.xlsm
    29.9 KB · Affichages: 1
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
click show
reduit
regarde B2
récupere le dans la barre des tache pour le ré afficher
regarde B2
terminé ton userform est en first plan tout le temps et est réductible en barre des tache
dans l'event resize on test le getwindowslong du Gw_exstyle
terminé

 

Pièces jointes

  • usf premier plan reductible.xlsm
    20.6 KB · Affichages: 3

Dudu2

XLDnaute Barbatruc
Autre déception...
Lorsque le Owner = 0 (UserForm indépendant des Workbook Windows), la minimisation se fait en UserForm.Left -19200 et UserForm.Top = -19200. Ça je le savais.
Ce que je ne savais pas c'est qu'Excel refuse de faire le UserForm.Move pour le replacer en zone visible.
Ce qu'il accepte de faire avec un Owner # 0.
Donc ça met en échec mon approche de minimisation avec Owner = 0.
Faut que je trouve une parade.
 

Dudu2

XLDnaute Barbatruc
Une parade qui semble fonctionner, c'est juste avant le UserForm.Move de changer son Owner à l'ActiveWorbook.Windows(1).hWnd et de le repasser à 0 après.
Ça c'est de la bidouille grandiose !
 

Dudu2

XLDnaute Barbatruc
Décidément, le Owner = 0 (UserForm indépendant des Workbook Windows) a des conséquences inattendues, mais logiques.

Le problème réside dans la fermeture du classeur initialement Owner.

Exemple 1: OK
Avec la Classeur A je créé un UserForm.
Owner initial = Classeur A
Détachement Owner = 0
Fermeture Classeur A => fermeture UserForm (même si détaché)

Exemple 2: KO
Avec la Classeur A (ou un Complément) j'active un Classeur B et je créé un UserForm.
Owner initial = Classeur B
Détachement Owner = 0
Fermeture Classeur B => UserForm reste présent !

La question est donc où est la différence ?
Il n'est pas suffisant de mettre le Owner = 0, il faut aussi rattacher le UserForm à son Classeur propriétaire réel (le Classeur B en l'exemple 2).
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
en même temps c'est évident
sachant que le userform est avant tout une classe si tu detache l'object userform forcement plus attachée a la classe donc le terminate bye bye

pour le A c'est normal ca ferme excel
 

Dudu2

XLDnaute Barbatruc
Le lien qui reste présent entre le Classeur créateur et le UserForm même détaché n'est ni le Parent ni le Owner. Je pense (supposition) que c'est un lien système propre à Excel qui n'est pas accessible par une API.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Ne confondez pas fenêtre parente et Projet VBA gestionnaire. Quand on ferme un classeur son projet VBA disparaît et sa collection UserForms avec. Et surtout le code de l'UserForm ! Il ne fait absolument pas partie de sa fenêtre !
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonsoir @Dranreb,
Oui, je comprends qu'un UserForm détaché ne peut se fermer qu'avec le classeur qui contient son instance et tout l'environnement du Projet. Ceci dit un UserForm (non détaché) disparait aussi lorsque sa fenêtre parente ou plutôt Owner est fermée ce qui est une fonctionnalité Excel.
Ce que j'ai dit à propos du lien système est l'une des projections fantasmées des suppositions qui viennent à l'esprit à une heure tardive.
 

Dudu2

XLDnaute Barbatruc
D'ailleurs, en parlant de Complément, ça fonctionne juste un peu mieux parce que s'il n'y a qu'un seul classeur ouvert, la fermeture de ce classeur va provoquer la fermeture du Complément et donc la disparition du UserForm détaché dont le Complément contient l'instance et le reste.

Mais s'il y a juste un autre classeur ouvert, le Complément ne se fermera pas et donc le UserForm détaché ne disparaitra pas avant la fermeture du dernier classeur ouvert.
 

Dudu2

XLDnaute Barbatruc
Il est juste dommage que le Owner d'un UserForm soit une fenêtre d'un classeur.
Ça devrait être le classeur car ça n'a pas de sens de fermer un UserForm quand on ferme sa fenêtre de création, alors qu'on peut très bien avoir créé des fenêtres pour un confort de travail (surtout en multi-moniteurs) et les fermer selon les besoins tout en souhaitant continuer à bénéficier de la présence du UserForm quelque soient les fenêtres fermées.
 

Dudu2

XLDnaute Barbatruc
J'ai essayé un truc...
Sur le UserForm_QueryClose() en CloseMode = 5 (fermeture de la Window Owner) , faire un changement d'Owner sur l'ActiveWindow qui reste et un Cancel = True.
Mais ça bloque ensuite. dommage !
 

Pièces jointes

  • Classeur3.xlsm
    28.4 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re:
perso je ne te comprends pas
j'ai essayé ton fichier post #51
et je ne vois pas ou est ton problème ou alors le fichier n'est pas représentatif du problème post #50
ton fichier "classeur3" ouvre son userform et ouvre un nouveau classeur que l'on va appeler B
chez moi je ferme le B le userform reste (je vois pas ce qui te gène)
je ferme le A donc le classeur3.xlsm le userform se ferme

maintenant si c'est un complément (addins)
je ne vois pas ce qui te gène là aussi
un addins est attaché à l'application excel donc tant que excel est ouvert un userform issu d'un addins restera ouvert je ne vois pas ou est ton soucis
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…