Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
J'utilise des classeurs de trois types :
A : classeur sans code VBA
B : classeur avec son code VBA qui gère son ouverture et sa fermeture
C : nouveau type avec événements (dé)activate des feuilles et classeur pour
afficher (ou non) des barres de menus (selon les feuilles actives).
Lorsque je passe d'un classeur A ou B vers C, ou C vers A ou B les
événements se produisent bien et le menu correspondant à la feuille active
est bien visible ou non.
Si j'ai LE classeur C ouvert et que j'ouvre un B, l'événement déactivate se
produit bien, le menu est masqué, mais lorsque je ferme, via son menu
spécifique, le classeur B, l'affichage à l'écran du classeur C (alors seul
ouvert) ne génère pas d'événement workbookActivate et le menu n'est pas
affiché.
Quel est l'événement qu'il faut piéger pour voir apparaître les menus de C
lors de la fermeture de B par VBA?
Nota : les classeurs sont tous autonomes et doivent le rester (pas de liens).
Merci de vo(s)tre réponse(s)
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
Malheureusement, il ne semble pas y avoir de solution simple avec un
évènement adéquat. Si on ne peut pas faire simple, faisons compliqué.
Une piste, bien tortueuse, avec ce qui suit :
J'ai utilisé
1) des fonctions API (timers) pour capturer le nom du classeur actif
après la fermeture du classeur que vous appelez "B"
2) un module de classe pour avoir les évènements au niveau application
3) la procédure Workbook_Open dans ThisWorkbook pour initialiser la classe
4) une fabrication de menu à adapter selon votre usage
POUR FAIRE UN TEST
Créez 2 classeurs respectivement nommés C.xls et B.xls
DANS B.xls
Copiez le code suivant dans un module standard
*************
Sub fermeB()
ThisWorkbook.Close
End Sub
*************
Enregistrez le classeur avec le nom B.xls et fermez le.
Attention, cela se corse
DANS C.xls
1) Créez un module de classe. Faites F4 et changez la
propriété (Name) par clsEventsWB
Copiez y le code suivant
*************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
*************
2) Dans un module standard, copiez le code suivant
*************
'### Constantes à adapter ###
Public Const WB_AVEC_MENU As String = "C.xls"
Public Const WB_CLOSE As String = "B.xls"
Const NOM_MENU As String = "menu_PMO"
'############################
Public Evenement As New clsEventWB
Public OnTimer&
Private Declare Function SetTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Sub Relance()
Dim A$
A$ = ActiveWorkbook.Name
If OnTimer& > 100 Then
Call OffTimer
If A$ = WB_AVEC_MENU Then Call AddMenu
End If
End Sub
Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf Relance)
End Sub
Sub OffTimer(Optional dummy As Byte)
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'==== Le menu personnalisé (à adapter) === > Sub AddMenu(Optional dummy As Byte)
Dim CB As CommandBar
Dim MB As CommandBarControl
For Each MB In Application _
.CommandBars("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then Exit Sub
Next MB
Set CB = Application.CommandBars("Worksheet menu bar")
Set MB = CB.Controls.Add _
(Type:=msoControlPopup, before:Ë.Controls.Count)
With MB
.Caption = NOM_MENU
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "sous menu2"
End With
End With
End Sub
Sub DelMenu(Optional dummy As Byte)
Dim MB As CommandBarControl
For Each MB In Application.CommandBars _
("Worksheet menu bar").Controls
If MB.Caption = NOM_MENU Then
MB.Delete
Exit For
End If
Next MB
End Sub
*************
Les constantes et les procédures menu pourront être adaptées
par la suite mais ne changez rien tant qu'on fait un test.
3) Dans ThisWorkbook, copiez le code suivant
*************
Private Sub Workbook_Open()
Set Evenement.EventWB = Application
End Sub
'--- superflu : relance la classe ---
'--- lors des essais dans le VBE ---
Private Sub Workbook_Activate()
Set Evenement.EventWB = Application
End Sub
*************
J'espère ne rien avoir oublié. Sauvez le classeur avec le nom C.xls
Fermez le et rouvrez le. Ceci pour initialiser la classe au moyen
du Workbook_Open
Maintenant, essayez les différents cas de figure tels que vous
les avez exposés dans votre demande.
Cela marche très bien chez moi et, si c'est le cas chez vous,
il n'y a plus qu'à adapter à votre usage. Bon courage.
Cordialement.
PMO
Patrick Morange
Bonjour,
A première vue, soit vous n'avez pas, préalablement, fabriqué le module de
classe, soit il a été mal renommé.
(CAS 1) FABRICATION DU MODULE DE CLASSE
1) Dans le VBE, faites menu Insertion/Module de classe
2) Cliquez, pour le sélectionner, sur le module de classe qui a du
apparaître dans la fenêtre "Projet - VBAProjet" et qui, par défaut, doit se
nommer "Classe1"
3) Appuyez sur F4 pour afficher la fenêtre de propriété "Propriétés - Classe1"
4) La lecture de la valeur de la propriété (Name) est Classe1
5) CHANGEZ cette valeur (Classe1) par clsEventsWB
6) Dans la fenêtre "Projet - VBAProjet", double cliquez sur le module
de classe "clsEventsWB" pour afficher sa page de code
7) Copiez-y le code suivant
**************************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
**************************
(CAS 2) MODULE DE CLASSE MAL RENOMME
Renommez le module de classe clsEventsWB
en faisant attention à la casse (respect des minuscules et des majuscules)
En principe, ne doit plus apparaître le message
Public Evenement As New clsEventWB : "Type défini par l'utilisateur non
défini"
Est-ce que cela va mieux ?
Cordialement.
PMO
Patrick Morange
Bonjour,
A première vue, soit vous n'avez pas, préalablement, fabriqué le module de
classe, soit il a été mal renommé.
(CAS 1) FABRICATION DU MODULE DE CLASSE
1) Dans le VBE, faites menu Insertion/Module de classe
2) Cliquez, pour le sélectionner, sur le module de classe qui a du
apparaître dans la fenêtre "Projet - VBAProjet" et qui, par défaut, doit se
nommer "Classe1"
3) Appuyez sur F4 pour afficher la fenêtre de propriété "Propriétés - Classe1"
4) La lecture de la valeur de la propriété (Name) est Classe1
5) CHANGEZ cette valeur (Classe1) par clsEventsWB
6) Dans la fenêtre "Projet - VBAProjet", double cliquez sur le module
de classe "clsEventsWB" pour afficher sa page de code
7) Copiez-y le code suivant
**************************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
**************************
(CAS 2) MODULE DE CLASSE MAL RENOMME
Renommez le module de classe clsEventsWB
en faisant attention à la casse (respect des minuscules et des majuscules)
En principe, ne doit plus apparaître le message
Public Evenement As New clsEventWB : "Type défini par l'utilisateur non
défini"
Est-ce que cela va mieux ?
Cordialement.
PMO
Patrick Morange
Bonjour,
A première vue, soit vous n'avez pas, préalablement, fabriqué le module de
classe, soit il a été mal renommé.
(CAS 1) FABRICATION DU MODULE DE CLASSE
1) Dans le VBE, faites menu Insertion/Module de classe
2) Cliquez, pour le sélectionner, sur le module de classe qui a du
apparaître dans la fenêtre "Projet - VBAProjet" et qui, par défaut, doit se
nommer "Classe1"
3) Appuyez sur F4 pour afficher la fenêtre de propriété "Propriétés - Classe1"
4) La lecture de la valeur de la propriété (Name) est Classe1
5) CHANGEZ cette valeur (Classe1) par clsEventsWB
6) Dans la fenêtre "Projet - VBAProjet", double cliquez sur le module
de classe "clsEventsWB" pour afficher sa page de code
7) Copiez-y le code suivant
**************************
Public WithEvents EventWB As Application
Private Sub EventWB_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then
Call AddMenu
Else
Call DelMenu
End If
End Sub
Private Sub EventWB_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = WB_AVEC_MENU Then Call DelMenu
End Sub
Private Sub EventWB_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As
Boolean)
If Wb.Name = WB_CLOSE Then
OnTimer& = 0
Call RunTimer(Delai:=0)
End If
End Sub
**************************
(CAS 2) MODULE DE CLASSE MAL RENOMME
Renommez le module de classe clsEventsWB
en faisant attention à la casse (respect des minuscules et des majuscules)
En principe, ne doit plus apparaître le message
Public Evenement As New clsEventWB : "Type défini par l'utilisateur non
défini"
Est-ce que cela va mieux ?
Cordialement.
PMO
Patrick Morange