XL 2021 VBA - Comment activer l'Application après avoir affiché un UserForm vbModeless

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

La question est dans le titre.
Je le fais actuellement avec l'API SetForegroundWindow() ou SetActiveWindow() et j'aimerais une autre méthode en évitant un clic souris simulé.

Edit: Il y a bien la solution de changer de Activewindow.WindowState et de le restorer mais ça fait un effet visuel malgré l'Application.ScreenUpdating = False.
 

Pièces jointes

Dernière édition:
Solution
Ne laissez que le Show dans la Sub a et essayez ça dans l'UserForm :
VB:
Option Explicit
Private Sub UserForm_Activate()
   Application.Visible = False
   End Sub
Private Sub UserForm_Click()
   Unload Me
   End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   Application.Visible = True
   End Sub
En fait, c'est compliqué !
J'ai pris l'exemple du UserForm pour voir comment on peut activer une Window sans API (problème des Window d'autres instances où l'API détruit des éléments de contexte).
Ceci dit, j'ai aussi le cas réel de réactivation d'une Window après un affichage de UserForm vbModeless pour certaines raisons.
 
Bonjour
avec ce @Dudu2 il nous trouve toujours des trucs bizarre a faire
voir si j'ai bien compris
afficher le userform vbmodeless et remettre la feuille du classeur en tant que fenêtre active est ce bien cela ?
l'userform doit disparaitre?
si oui quand? quand on click sur une cell?

c'est quoi l'intention en fait ?

si ta solution (Window.WindowState et l'Application.Visible.) fonctionne mais que le scintillement de l’écran te gène
oserais je te rappeler l'homonyme de screenupdating mais en api pour l’écran faut il te redonner son nom?

ensuite
@Dranreb te dit que tu pourrais éventuellement gérer les event application a l’intérieur de l'userform
a qui tu reponds :
Faire une classe Application et gérer tous les évènements utiles, je sais faire, mais je vois pas comment, lors d'un affichage de UserForm, je peux reprendre la main pour activer l'Application et comment l'activer car c'est là tout le problème.
Bon c'est pas grave, merci pour ton aide.
Pour une activation au sein de la même instance, je peux rester sur l'API et sinon j'ai 2 solutions un peu "bidouille" mais qui fonctionnent, le Window.WindowState et l'Application.Visible.
il n'est pas question ici d'instancier une classe mais un event

pour cela c'est très simple
en haut du module userform
Public WithEvents myApP as application
parti de la tu a tout les events possible de l'app et par conséquent de tout ses descendant workbook et tout et tout
démonstration :
demo3.gif
 
sérieux !!!!!!?
on en a déjà parlé tout les deux pourtant 😉
VB:
Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hwnd As LongPtr) As Long
ca fait exactement la même chose que screenupdating sauf que tu choisi le handle a ne pas rafraichir y compris le destop par le getdesktopwindow
 
bon a force de testé j'ai trouver une solution sans jouer avec les etat
avec api mais simple
testé chez moi ok
le titilage est indispensable ; sans: même avec le showwindow ca ne fonctionne pas
VB:
Option Explicit
'argument nCmdShow pour showwindow
'SW_NORMAL              1   Identique à SW_SHOWNORMAL.
'SW_SHOWMINIMIZED       2   Affiche la fenêtre minimisée.
'SW_SHOWMAXIMIZED       3   Affiche la fenêtre maximisée.
'SW_MAXIMIZE            3   Identique à SW_SHOWMAXIMIZED.
'SW_SHOWNOACTIVATE      4   Affiche dans l'état actuel sans activer la fenêtre.
'SW_SHOW                5   Affiche la fenêtre dans son dernier état et l’active.
'SW_MINIMIZE            6   Réduit la fenêtre et active la suivante.
'SW_SHOWMINNOACTIVE     7   Affiche la fenêtre minimisée sans l’activer.
'SW_SHOWNA              8   Affiche la fenêtre dans son état actuel sans l’activer.
'SW_RESTORE             9   Restaure une fenêtre minimisée ou maximisée dans son état normal.
'SW_SHOWDEFAULT         10  L’état d'affichage est déterminé par le programme qui la lance.
#If VBA7 Then
    Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
    Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
    Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#Else
    Declare Function GetActiveWindow Lib "user32" () As Long
    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
    Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
#End If

Sub a()
    Dim HactiF As LongPtr, param As Long
    [b1:b3].ClearContents
    param = &H1 + &H2 + &H20 + &H40 + &H200 'les paramètre de position et Flag c'est la totale in firstplan (indémontable)
    UserForm1.Show vbModeless
   DoEvents
   [b3] = GetActiveWindow
 
    'on titille la fenêtre  successivement au premier plan et juste en dessous
    SetWindowPos Application.hwnd, -1, 0&, 0&, 0&, 0&, param 'pemier plan
    SetWindowPos Application.hwnd, 1, 0&, 0&, 0&, 0&, param 'on redescend d'un cran
   
    ShowWindow Application.hwnd, 5 'pas d'ambiguité showWindow hwnd,5 affiche et active!!!!! la fenêtre (voir les options en haut de module en commentaire )
     HactiF = GetActiveWindow 'recuperation de la fenêtre active
   
   'MsgBox HactiF & vbCrLf & Application.hwnd 'le message de verdict
    [b1] = GetActiveWindow
    [b2] = Application.hwnd
End Sub
pas de scintillement
patrick
 
à essayer :
Code:
 Private Declare PtrSafe Function IUnknown_GetWindow Lib "shlwapi" Alias "#172" (ByVal pIUnk As IUnknown, hWnd As LongPtr) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal uCmd As Long) As Boolean
       
Sub a()
Dim h As LongPtr
   IUnknown_GetWindow UserForm1, h
   ShowWindow h, 4
End Sub
@Rheeem
normalement ça ne devrait avoir aucun effet puisque le userform est déjà actif (ShowWindow ne déactive pas )
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour