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 Sub

non ?

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 Sub

2.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 Sub

Comment 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.

Rechercher des sujets similaires à "vba evenement activation"