Bonjour,
je cherche a figer un Userform constamment au premier plan.
Je veux dire par ca que s'il perd le focus qu'il reste au premier plan.
Quelqu'un sait il si c'est possible?
J'ai essayé avec setwindowpos mais cela ne fonctionne pas....
Merci
Bonjour,
je cherche a figer un Userform constamment au premier plan.
Je veux dire par ca que s'il perd le focus qu'il reste au premier plan.
Quelqu'un sait il si c'est possible?
J'ai essayé avec setwindowpos mais cela ne fonctionne pas....
Merci
bonjou
voir les api windows
setwindowpos de la librairie user(32)
tu a moulte exemple sur le forum
c'est la seule api qui te permet non seulement de mettre ton userform au premier plan et qu'elle le reste
il y en a d'autre qui mettent seulement le userform en premier plan mais ne fige pas cet etat
comme showWindow,BringWindowToTop,setforeagroundwindow ,etc......
bonne recherche elle ne devrait pas durer longtemps
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Bonjour et merci
J'ai cherché mais je dois faire une connerie....
Avec ce code l'Userform passe bien au premier plan mais un clic sur une autre fenêtre et c'est terminé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Public Declare PtrSafe Function SetWindowPos Lib "User32" _ (ByVal Hwnd As LongPtr, _ ByVal hWndInsertAfter As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long) As Long Public Declare PtrSafe Function FindWindow2 Lib "User32" _ Alias "FindWindowA" (ByVal IpClassName As Any, _ ByVal IpWindowName As Any) As Long Public Const HWND_TOPMOST = -1 Public Const SWP_NOSIZE As Long = &H2 Sub Epingle() Dim Hwnd_Userform As LongPtr Hwnd_Userform = FindWindow(vbNullString, UserForm1.Caption) Call SetWindowPos(Hwnd_Userform, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE) End Sub
Yes.....
ByVal hWndInsertAfter As LongPtr
merci !!!!
re
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetWindowPos handle_useform, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Bonjour
Je rappelle modestement que toute nouvelle fenêtre qui s'imposerait au premier plan "volerait" de toutes manières le premier plan TopMost de toute fenêtre qui en disposerait.
S'il n'en allait pas ainsi, la fenêtre que l'on souhaite mettre au topmost ne pourrait alors pas s'y imposer à coup certain.
Dans ce genre de démarche, c'est comme avec Louis XVI : c'est le dernier qui "parle" qui a raison.
Conclusion : pour aller dans le sens de l'adverbe "constamment" utilisé tant dans le titre que dans l'exposé de la demande : --->> va falloir installer un timer (quelle qu'en soit la forme) si l'on veut récupérer à coup sûr un "topmost" qu'aurait volé une fenêtre tierce demandant elle aussi à être au "topmost".
Et je préfère ne pas parler de la situation vicieuse qui surgirait si l'application gérant cette fenêtre tierce utilisait elle également (de son côté, donc) un timer pour rester elle aussi CONSTAMMENT au "topmost"
Je vais faire ma sieste.
Tu ne testes pas les bonnes choses. Donc ça ne saurait pas fonctionner.
Fais le test avec un userform et ton code dans Excel. Ton usf est à l'avant plan. Pas de soucis. Tu peux ouvrir toutes les applis que tu veux, elles seront derrière. OK. Pourquoi ok? Parce qu'elles ne demandent pas d'être à l'avant-plan comme la tienne le demande....
Maintenant, avec ton beau usf Excel à l'avant-plan... Crée un usf similaire dans Word, et lance-le... Qui est à l'avant-plan? Celui de Word. Donc, celui d'Excel ne sait pas être constamment à l'avant-plan... CQFD.
Et, comme déjà dit, si tu réalises le test avec deux usf non modaux au sein d'Excel (avec ton code deactivate) puis que par une proc standard, tu lances le 1 puis le 2, ça devient rigolo (d'où mon conseil d'enregistrer tes travaux Excel)... Pourquoi? Parce que tu pars dans une boucle infinie... (et l'infini, c'est long, surtout vers la fin - Jean Yanne, je crois)
Maintenant, je vais te dire pourquoi ça se passe comme cela, et ça n'a rien à a voir avec l'informatique. C'est juste un raisonnement logique.
Ton usf peut demander de rester à l'avant-plan, mais il n'est pas le seul à pouvoir faire cela. D'autres fenêtres peuvent le faire aussi. Et pour ne pas qu'une appli puisse bloquer l'avant-plan ad vitam aeternam (t'imagines? Tu lances ta fenêtre, tu lui donnes la taille de l'écran et elle constamment à l'avant-plan... Tu comprends le problème?), c'est la dernière qui demande l'avant-plan qui l'obtient. Donc, ta fenêtre ne peut pas rester constamment à l'avant-plan. Tous tes tests et démos n'y changeront strictement rien...![]()
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
@pierre je viens de tester ton test word/excel j'etait curieux et quoi que c'a fait tellement longtemps que j'utilise ces deux lignes de code que je connaissais le resultat
j'ai donc créer un fichier word avec un userform
nommé "userformword"
dans son activate j'ai mis exactement pareil que dans le activate du userform1 dans excel
c'est a dire
dans le open du document j'ai mis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub UserForm_Activate() 'a l 'ouverture le userform prends le dessus Handle = FindWindow(vbNullString, UserFormword.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub
on est bien d'accords que des que je lance ce fichier le userformword va s'afficher et c'est bien le lui dernier qui aura parler !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Document_Open() UserFormword.Show 0 End Sub
enregistrer le fichier sur le bureau
je reviens dans excel
dans son userform1 j'ai le activate et déactivate je le remontre
voila maintenant je vais cliquer sur le bouton sur le sheets et afficher le userform1 dans excel c'est lui qui parle le premier on est d'accords????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 [Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub UserForm_Activate() 'a l 'ouverture le userform prends le dessus Handle = FindWindow(vbNullString, UserForm1.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub Private Sub UserForm_Deactivate() 'si il est deactivé par l'ouverture d'une new fenetre quel quelle soit il reprend le dessus Handle = FindWindow(vbNullString, UserForm1.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub
ensuite je vais ouvrir le fichier word en double cliquant dessus sur le bureau le userformword va s'ouvrir on est d'accords
et donc prendre le dessus puisque c'est lui le dernier a avoir parler on est d'accords
et bien une demo parle plus que les mots
tout les resultat que tu pretends sont faux ou alors tu t'explique mal
preuve
comme on dit chez nous t'a raison j'ai pas tords
et la tu peux pas dire que je m'arrange avec les resultat la demo est parlante
par contre effectivement les deux userforms(excel/word) seront au dessus de tout le reste c'est la mon astuce
sauf le window de excel réactivé la oui le userformword disparaitra mais le userform1 excel sera toujours dessus tu peux faire tout ce que tu veux
a moins que la encore tu me dise que ca n'est valable que pour 2007 ce dont je doute fortement
je te donne les deux fichiers si tu veux il n'y a pas de soucis
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Bonjour,
Retrouver le handle d'un userform à partir de son caption est hasardeux, surtout si les deux userform ont le même caption...
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL
Blog Office Mon Site DVP
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Patrick,
chez moi, le second userform prend le pas sur le premier (Word et Excel maximisés à l'écran, les deux userforms de taille identique se superposent), et je répète que c'est le comportement normal de Windows pour les raisons que j'ai expliquées dans un message précédent.
Imagine simplement les conséquences si ton premier userform prend tout l'écran. Tu bloques alors toute possibilité de de travailler avec une autre application que la tienne. Je ne sais pas comment tu as procédé (je n'ai pas pris le temps de tester ton mode opératoire), mais je garantis que le second userform passe devant le premier.
Autre situation dont je parlais plus haut: Fais le test avec deux userforms dans Excel (ou word, mais les deux dans la même appli), affiche-les en non modal avec le code suivant dans un module standard:
Tu peux me faire un gif du résultat que tu as? Tu vois bien qu'il y a bagarre entre tes deux userforms pour être à l'avant plan...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 sub test() userform1.show 0 userform2.show 0
J'essaierai d'ici ce soir de faire un gif de mon test Excel/word pour te montrer que le second usf passe bien devant le premier.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
J'ajoute ceci :
extrait de l'aide interne VBA
J'avais suggéré (cela aurait mis un terme à cette discussion, mais mon message a "disparu") de lancer l'une quelconque des applications qui, elles également, sont "candidates au topmost". Parmi elles, celle que je signalais (magnify.exe).Les événements Activate et Deactivate ne se produisent que lorsque vous déplacez le focus à l'intérieur d'une application. Placer ou déplacer le focus sur ou hors d'un objet depuis une autre application ne déclenche ni l'un ni l'autre de ces événements.
Bonne journée à tous.
Bonjour,
Je confirme les dires de Jacques par un test que je viens de réaliser.
Pré-requis :
- Fichier Word :
- 1 userform avec sa propriété Caption = "userformWORD"
Dans le module de cet Userform, le code donné par Patrick :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub UserForm_Activate() 'a l 'ouverture le userform prends le dessus Handle = FindWindow(vbNullString, UserFormWORD.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub- Dans le module ThisDocument, le code (toujours celui de Patrick) :
ATTENTION : le 0 est ici très important. Le comportement serait tout autre sans, j'en ferais l'observation après.****
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Document_Open() UserFormWORD.Show 0 End Sub- Fichier Excel :
- Un bouton dans la feuille avec ce code :
ATTENTION : le 0 est ici très important. Le comportement serait tout autre sans, j'en ferais l'observation après. ****
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub CommandButton1_Click() UserForm1.Show 0 ouvre End Sub- Un Userform dont la propriété Caption = UserformEXCEL
Placer le code de Patrick dans le module de l'Userform :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub UserForm_Activate() 'a l 'ouverture le userform prends le dessus Handle = FindWindow(vbNullString, UserForm1.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub Private Sub UserForm_Deactivate() 'si il est deactivé par l'ouverture d'une new fenetre quel quelle soit il reprend le dessus Handle = FindWindow(vbNullString, UserForm1.Caption) SetWindowPos Handle, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2) 'force l'userform au premier plan End Sub- Dans un module standard, le code d'ouverture du fichier Word :
ATTENTION : nécessite de cocher la référence à Microsoft Word 14.0 Object Library
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Option Explicit Sub ouvre() Dim NomFic As String, Wrd As New Word.Application NomFic = "C:\Users\" & Environ("username") & "\Desktop\Doc1.docm" Wrd.Documents.Open NomFic Wrd.Visible = True End Sub
Note à Patrick : tu ne déclares jamais tes variables??
J'enregistre le fichier Word et le ferme.
Ici, peu importe que l'une ou l'autre des applications (ou les deux) soit Maximisée ou pas.
Au clic sur le bouton, l'userform Excel s'affiche suivi par Word.
Le résultat est que l'Userform d'Excel est bien devant celui de Word :
Au clic sur l'userform de Word, celui-ci passe devant ET y reste (ce que disait Jacques précédemment à propos de l'événement Deactivate...) :
On voit, en plus, que l'application Word passe devant Excel, mais reste derrière l'Userform Excel.
Comportement tout à fait "normal".
Les 0...
- ****L'userform Word est affiché en mode Modal (sans le 0), celui d'Excel est en "Non Modal" (avec le 0) :
- Positionnements :
- L'userform Word est au premier-plan
- L'userform Excel est au second plan
- L'application Excel est au troisième plan
- L'application Word n'est pas visible
- L'userform Excel a le focus.
S'il le perd (clic sur l'userform Word), il ne le retrouvera jamais, le focus, tant que l'userform Word est affiché.- L'application Word devient visible à la fermeture de l'userform Word, au troisième plan (derrière l'userform Excel et l'application Excel).
- **** L'userform Word est affiché en mode "Non Modal" (avec le 0), celui d'Excel est en Modal (sans le 0) :
Très simple.
Le code de la Sub ouvre() s'arrête à l'affichage de l'userform Excel et ne reprends (ouverture de Word) que lorsque l'Userform Excel est fermé par l'utilisateur.
Comportement on ne peut plus normal.
Notez que l'application Word passe au second plan, derrière l'userform Word. L'application Excel se contente alors du troisième plan.- Ce même comportement est observé si les deux Userforms sont en mode Modal (sans le 0).
Notez qu'ici l'application Word ne sera visible que lors de la fermeture de l'userform Word.
Ce ne sont que des observations, je me suis bien gardé de tirer des conclusions, conclusions bien connues en relisant les réponses de Pierre et Jacques.
Ma réponse personnelle donc à Jean-Philippe44 :
Cela semble, en effet, bien impossible.je cherche a figer un Userform constamment au premier plan.
Je veux dire par ca que s'il perd le focus qu'il reste au premier plan.
Quelqu'un sait il si c'est possible?
EDIT : Mais, au juste, qu'elle est la finalité de tout ceci?
Pourquoi vouloir conserver un Userform au premier plan?
Partager