Passer un USF ouvert d'un fichier à l'autre

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,
j'ai crée usf que j'ouvre sur le fichier 1.
Lorsque je passe sur le fichier 2 le usf n'apparait plus alors qu'il y a 2 ou 3 ans cela était possible.
J'ai pourtant mis: USF1.show 0.
Avez vous une réponse à me proposer?
Merci
Carlos
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Moi aussi je trouve ça très pénible. Avant un UserForm était une fenêtre à part entière, indépendante de toute application pour ce qui était de la gestion de son affichage, et c'était très bien comme ça. Maintenant c'est presque impossible de faire des UserForm non modaux indépendants.
Il y a à la rigueur possibilité avec des API de faire en sorte qu'il reste affiché, mais même alors, en cliquant dessus ça rappelle par derrière la fenêtre à partir de laquelle il avait été ouvert, et je n'ai pas trouvé comment éviter ça.
VB:
Private Declare Function GetForegroundWindow Lib "user32" () As Long
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 Sub UserForm_Activate()
   SetWindowPos GetForegroundWindow, -1, 0, 0, 0, 0, 3: End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
En tout cas je mets ce code dans les UserForm concernés :
VB:
Option Explicit
         #If VBA7 Then
Private Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long
Private Declare PtrSafe 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 PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
         #Else
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare PtrSafe 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" _
   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
            #End If
Private hWnd As Long
Private Sub UserForm_Activate()
   hWnd = GetForegroundWindow
   SetWindowPos hWnd, -1, 0, 0, 0, 0, &H43 ' Pour le forcer à rester affiché.
'   SetWindowPos hWnd, -2, 0, 0, 0, 0, &H43 ' Au dessus seulement des fenêtres qui ne sont pas en -1 mais sous celles ci.
   SetWindowLong hWnd, -8, 0 ' Pour le rendre indépendant de toute autre fenêtre.
   End Sub
 

Dranreb

XLDnaute Barbatruc
Non, il faut le faire dans la Sub UserForm_Activate() pour être à peu près sûr que c'est la fenêtre en avant plan dont on récupère le hWnd (Il y a en effet une exception si plusieurs UserForm sont affichés par la même procédure, parce que leur évènement Activate est traité après son exécution, alors que pour tous c'est le dernier affiché qui est en avant plan)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour @Dranreb
le rajouter dans le déactive au cas ou
et chez moi si je veux qu'il reste par dessus n'importe quelle fenêtre
SetWindowPos hwnd , -1 , 0, 0, 0, 0, (&H1 Or &H2)
l'autre api ne m'est pas nécessaire
c'est quoi la denomination de constante de la valeur &H43???
demo.gif
 

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour l,
J'ai mis le code de Dranreb dans le userform1. C'est bien cela ?
J'ouvre bien mon USF dans mon fichier1 mais il ne reste pas apparent lorsque j'ouvre le second fichier.
Il y a qq chose que je n'ai pas compris je pense.
Merci à tout le monde de s'interesser à ce sujet.
1668240526487.png
 

Pièces jointes

  • 1668240461059.png
    1668240461059.png
    86.5 KB · Affichages: 5

Discussions similaires

Réponses
2
Affichages
236
Réponses
3
Affichages
473
Compte Supprimé 979
C

Statistiques des forums

Discussions
311 729
Messages
2 081 966
Membres
101 852
dernier inscrit
dthi16088