VBA - évènement à l'activation d'Excel
Bonjour,
Je souhaite qu'une macro s'exécute quand la fenêtre Excel devient active, par exemple quand je bascule du navigateur à Excel ou de Word à Excel.
Comment faire ?
Merci d'avance.
Daniel
Hello,
Private Sub Workbook_Activate()
End Subnon ?
Bonjour,
Merci. Non, ça fonctionne quand tu actives un classeur dans Excel. Pas quand tu actives l'application Excel. Ce que je veux obtenir :
1. Firefox actif
2. raccourci Alt+Tab pour activer la fenêtre Excel => exécution de la macro.
Daniel
Bonjour le fil.
Daniel, c'est le serpent qui se mord la queue non ?
Pour qu'une macro fonctionne il faut que le classeur soit activé. Rien ne permet ce que tu veux faire; hormis une application externe en C# par exemple, qui écouterait les évènements Windows, puis si Excel est détectée comme application active, lancer une procédure via « COM ».
Mais ce dois être extérieur à Excel.
Hello,
@danielc ce que vous cherchez à faire n'est pas très net je trouve.
J'ai interrogé l'IA et au bout de moultes relances elle a fini par me donner un code qui a l'air fonctionnel, mais pu***naise faut vraiment insister pour avoir qqchose de fonctionnel.
je copie/colle
Pour intercepter le changement d'application Windows (de n'importe où vers Excel), il faut faire appel aux API Windows (User32.dll) avec la fonction SetWinEventHook ou surveiller le focus de l'application via un timer OnTime.Voici la méthode la plus stable et légère, basée sur une boucle de vérification du focus Windows :
1.Ajouter les déclarations d'API dans un Module standard :Dans PERSONAL.XLSB.Dans l'éditeur VBA (Alt + F11), va dans Insertion > Module (dans PERSONAL.XLSB) et colle ce code
#If VBA7 Then
Private Declare PtrSafe Function GetForegroundWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As LongPtr, lpdwProcessId As Long) As Long
Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
#Else
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
#End If
Public EstActive As Boolean
Sub DemarrerSurveillance()
Dim hwndActif As LongPtr
Dim pidActif As Long
hwndActif = GetForegroundWindow()
Call GetWindowThreadProcessId(hwndActif, pidActif)
' Vérifie si la fenêtre active appartient au processus Excel
If pidActif = GetCurrentProcessId() Then
If Not EstActive Then
EstActive = True
' --- TA MACRO ICI ---
MsgBox "Excel a repris le focus depuis Windows !"
' ---------------------
End If
Else
EstActive = False
End If
' Reboucle toutes les secondes
Application.OnTime Now + TimeValue("00:00:01"), "DemarrerSurveillance"
End Sub
Sub ArreterSurveillance()
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), "DemarrerSurveillance", , False
End Sub2.Lancer la surveillance au démarrage :Dans ThisWorkbook.Double-clique sur ThisWorkbook (dans PERSONAL.XLSB) et colle :
Private Sub Workbook_Open()
Call DemarrerSurveillance
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ArreterSurveillance
End SubComment vérifier :
Déclenche une première fois Workbook_Open (touche F5 dans le code) pour lancer la boucle.
Clique sur Firefox ou une autre application Windows.
Bascule à nouveau sur Excel : le message s'affiche immédiatement.