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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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! | |
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" <michdenis@hotmail.com> a écrit dans le message de news: eYSuGDOnFHA.3300@TK2MSFTNGP15.phx.gbl...
|
| 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!
|
|
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! | |
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! | |
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" <Personne@ICI> a écrit dans le message de news: u4B1P%23OnFHA.3656@TK2MSFTNGP09.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de news: eYSuGDOnFHA.3300@TK2MSFTNGP15.phx.gbl...
|
| 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!
|
|
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! | |