Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Détecter l'activation d'une instance d'excel

2 réponses
Avatar
michdenis
Bonjour,

Une question simple dans son énoncé :

Supposons que j'ai 2 instances d'excel d'ouvert (pas 2 fichiers mais 2 applications distinctes d'excel), est-ce que quelqu'un
connaît un événement qui permettrait de déceler à quel moment l'usager quitte une instance (WorkbookDeactivate n'est pas valide)et à
quel moment cette même instance est ré-activée : un événement qui me permettrait de saisir du code ...(WorkbookActivate n'est pas
valide) ! Ce doit être un événement au niveau de l'application, pas au niveau du changement de feuilles ou de sélection d'une
cellule d'une feuille de l'instance.


Merci d'avance à ceux qui se pencheront sur le sujet.


Salutations!

2 réponses

Avatar
Alain CROS
Bonjour.

Je crois que ce n'est pas faisable par les évènements d'XL.
Ce code utilise un Hook et alimente un fichier texte à chaque activation-désactivation.
Pour éviter une boite de dialogue conçernant un rapport a envoyer ...
Fermer le fichier XL avant de fermer l'application.

Alain CROS

Dans le module ThisWorkbook :

Private Declare Function FindWindow& _
Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName$, ByVal lpWindowName$)

Private Declare Function SetWindowLong& _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd&, ByVal nIndex&, ByVal dwNewLong&)

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Const GWL_WNDPROC& = -4&
'Rétablir la procédure Windows
SetWindowLong HandleXL, GWL_WNDPROC, BaseWinProc
Close #I
End Sub

Private Sub Workbook_Open()
Const GWL_WNDPROC& = -4&
HandleXL = FindWindow(vbNullString, Application.Caption)
LeFich = ThisWorkbook.Path & "Suivi.txt"
On Error Resume Next
Kill LeFich
On Error GoTo 0
I = FreeFile
Open LeFich For Output As #I
'Sauvegarde de l'adresse mémoire de la procédure Windows
'La procédure Windows est remplacée par la procédure WinProc
BaseWinProc = SetWindowLong(HandleXL, GWL_WNDPROC, AddressOf WinProc)
End Sub

Dans un module :

Private Declare Function CallWindowProc& _
Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc&, ByVal hwnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)

Public BaseWinProc&, HandleXL&, LeFich$, I%

Public Function WinProc&(ByVal hwnd&, ByVal uMsg&, ByVal wParam&, ByVal lParam&)
'Constantes envoyées à Windows que l'on veut intercepter
Const WM_ACTIVATE& = &H6, WA_INACTIVE& = 0&
If uMsg = WM_ACTIVATE Then
If wParam = WA_INACTIVE Then
Print #I, "Perte Focus " & Format(Time, "hh:mm:ss")
Else
Print #I, "Focus " & Format(Time, "hh:mm:ss")
End If
End If
'Rendre la main à Windows
WinProc = CallWindowProc(BaseWinProc, hwnd, uMsg, wParam, lParam)
End Function

"michdenis" a écrit dans le message de news:
|
| Bonjour,
|
| Une question simple dans son énoncé :
|
| Supposons que j'ai 2 instances d'excel d'ouvert (pas 2 fichiers mais 2 applications distinctes d'excel), est-ce que quelqu'un
| connaît un événement qui permettrait de déceler à quel moment l'usager quitte une instance (WorkbookDeactivate n'est pas valide)et
à
| quel moment cette même instance est ré-activée : un événement qui me permettrait de saisir du code ...(WorkbookActivate n'est pas
| valide) ! Ce doit être un événement au niveau de l'application, pas au niveau du changement de feuilles ou de sélection d'une
| cellule d'une feuille de l'instance.
|
|
| Merci d'avance à ceux qui se pencheront sur le sujet.
|
|
| Salutations!
|
|
Avatar
michdenis
Bonjour Alain,

Merci pour la solution proposée. J'y regarde de plus près au cours de la journée.

Bonne journée,


Salutations!



"Alain CROS" a écrit dans le message de news: u4B1P%
Bonjour.

Je crois que ce n'est pas faisable par les évènements d'XL.
Ce code utilise un Hook et alimente un fichier texte à chaque activation-désactivation.
Pour éviter une boite de dialogue conçernant un rapport a envoyer ...
Fermer le fichier XL avant de fermer l'application.

Alain CROS

Dans le module ThisWorkbook :

Private Declare Function FindWindow& _
Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName$, ByVal lpWindowName$)

Private Declare Function SetWindowLong& _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd&, ByVal nIndex&, ByVal dwNewLong&)

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Const GWL_WNDPROC& = -4&
'Rétablir la procédure Windows
SetWindowLong HandleXL, GWL_WNDPROC, BaseWinProc
Close #I
End Sub

Private Sub Workbook_Open()
Const GWL_WNDPROC& = -4&
HandleXL = FindWindow(vbNullString, Application.Caption)
LeFich = ThisWorkbook.Path & "Suivi.txt"
On Error Resume Next
Kill LeFich
On Error GoTo 0
I = FreeFile
Open LeFich For Output As #I
'Sauvegarde de l'adresse mémoire de la procédure Windows
'La procédure Windows est remplacée par la procédure WinProc
BaseWinProc = SetWindowLong(HandleXL, GWL_WNDPROC, AddressOf WinProc)
End Sub

Dans un module :

Private Declare Function CallWindowProc& _
Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc&, ByVal hwnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)

Public BaseWinProc&, HandleXL&, LeFich$, I%

Public Function WinProc&(ByVal hwnd&, ByVal uMsg&, ByVal wParam&, ByVal lParam&)
'Constantes envoyées à Windows que l'on veut intercepter
Const WM_ACTIVATE& = &H6, WA_INACTIVE& = 0&
If uMsg = WM_ACTIVATE Then
If wParam = WA_INACTIVE Then
Print #I, "Perte Focus " & Format(Time, "hh:mm:ss")
Else
Print #I, "Focus " & Format(Time, "hh:mm:ss")
End If
End If
'Rendre la main à Windows
WinProc = CallWindowProc(BaseWinProc, hwnd, uMsg, wParam, lParam)
End Function

"michdenis" a écrit dans le message de news:
|
| Bonjour,
|
| Une question simple dans son énoncé :
|
| Supposons que j'ai 2 instances d'excel d'ouvert (pas 2 fichiers mais 2 applications distinctes d'excel), est-ce que quelqu'un
| connaît un événement qui permettrait de déceler à quel moment l'usager quitte une instance (WorkbookDeactivate n'est pas valide)et
à
| quel moment cette même instance est ré-activée : un événement qui me permettrait de saisir du code ...(WorkbookActivate n'est pas
| valide) ! Ce doit être un événement au niveau de l'application, pas au niveau du changement de feuilles ou de sélection d'une
| cellule d'une feuille de l'instance.
|
|
| Merci d'avance à ceux qui se pencheront sur le sujet.
|
|
| Salutations!
|
|