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
N'est ce pas plutôt votre instruction inutile qui plante ? Un Show rend d'office active la fenêtre de l'UserForm et déclenche l'évènement UserForm_Activate. Sa prise en charge peut être une occasion de récupérer son Hwnd par GetForegroundWindow dans une variable Private à toutes fins utiles …
 
Bon, ça diverge...

Tu me parles d'abord de:
Pourquoi ne pas simplement tout faire par Application.Visible ?

Je te réponds que ça plante (voir ci-dessous)
1750948784772.png


Tu me parles ensuite d'une instruction inutile (sans préciser laquelle, bien sûr, ce serait trop facile !)
N'est ce pas plutôt votre instruction inutile qui plante ?
Ensuite qu'est-ce que tu veux que je fasse du Handle du UserForm ? Je veux ré-activer l'Application.
une occasion de récupérer son Hwnd par GetForegroundWindow

@Dranreb, ça ne me dérange pas que tu me vouvoies (à l'ancienne) mais STP propose des réponses moins sibyllines.
 
Oui c'est normal, je pense que ActiveWindow ne peut être qu'une fenêtre Excel, et qu'il n'est pas défini si c'est une autre sorte de fenêtre qui est active. Je ne comprends pas bien le besoin non plus. Il me semble qu'à la fermeture de l'UserForm c'est toujours l'application Excel qui est active sauf si l'UserForm a activé une autre application. Dans ce cas essayer peut être au UserForm_QueryClose Application.windows(1).Activate …
 
En fait, j'ai eu des soucis majeurs en utilisant SetForegroundWindow() quand la Window n'est pas de l'instance qui invoque l'API.
Je crois me souvenir que c'était pareil avec SetActiveWindow().
On perd tous les OnKeys des AddIns des 2 instances et je ne sais pas quoi d'autre. J'ai résolu le problème avec des changements de WindowState qui ont pour effet d'activer la Window avec l'inconvénient de l'effet visuel, moins grave que de bouziller du contexte Excel.
 
J'ai trouvé pour Visible, mais ça ne fonctionne pas, le UserForm reste devant.
VB:
Sub a()
    Dim Window As Window
    
    UserForm1.Show vbModeless
    'Call SetForegroundWindow(ActiveWindow.hwnd)
    'Call SetActiveWindow(ActiveWindow.hwnd)
    Set Window = ActiveWindow
    Window.Visible = False
    Window.Visible = True
End Sub
 
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
 
Et non car c'est le contraire que je veux faire:
- Montrer le UserForm
- Réactiver la feuille Excel (ce qui doit désactiver le UserForm)

Mais tu as trouvé quand même une solution puisque ce n'est pas sur le .Visible de l'ActiveWindow qu'il faut jouer mais sur celui de l'Application.
VB:
Sub a()
    UserForm1.Show vbModeless
    'Call SetForegroundWindow(ActiveWindow.hwnd)
    'Call SetActiveWindow(ActiveWindow.hwnd)
    Application.Visible = False
    Application.Visible = True
End Sub

Il y a un léger effet visuel, mais c'est moins long que le changement de WindowState car pour passer de minimiser à maximiser, Excel prend son temps pour montrer un effet de remplissage d'écran.
 

Pièces jointes

Dernière édition:
On peut même gérer tous les évènements de niveau application avec un Private WithEvents AppXL As Application.
Pour qu'il soit actif, faire dans l'UserForm_Initialize : Set AppXL = Application.
Utiliser les listes déroulantes surmontant la fenêtre de code pour implanter les procédures de prise en charge des évènements de votre objet AppXL.
Ils ressemblent beaucoup à ceux de l'objet Workbook.
 
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.
 
- 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