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

Evénements...

8 réponses
Avatar
Ptit Louis
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)

8 réponses

Avatar
isabelle
bonjour Ptit Louis,

cet événement est a placer sur la page code de thisWorkbook

Private Sub Workbook_BeforeClose(Cancel As Boolean)

isabelle

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)


Avatar
isabelle
bonjour Ptit Louis,

cet événement est a placer sur la page code de thisWorkbook du classeur B

Private Sub Workbook_BeforeClose(Cancel As Boolean)

isabelle


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)


Avatar
PMO
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
Avatar
Ptit Louis
Bonjour,
Merci pour cette longue réponse qui me semble intéressante.
Je la teste en début de semaine et vous retourne dès que possible mes
impressions et résultats. J'apprécie déjà ce qui est proposé, bien que je ne
maîtrise pas bien les modules de classe... , car les classeurs de type B ne
sont pas de ma production, et par conséquent je ne puis y toucher. le Type C
est en phase de démarrage et donc très "ouvert".
Merci encore, à lundi soir...



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




Avatar
Ptit Louis
Bonjour,
J'ai copié-collé les instructions et VB me répond :
Public Evenement As New clsEventWB : "Type défini par l'utilisateur non
défini"
Quel est alors le remède ? Dans l'aide, rien n'est suffisamment clair pour
corriger l'anomalie.
Merci !



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




Avatar
MichDenis
J'ai pas suivi ce fil, mais tu as probablement oublié d'ajouter
à ton classeur un MODULE DE CLASSE... et lorsqu'il est
ajouté, tu utilise la propriété "Name" pour lui donner le nom
de "clsEventWB" . Je suppose que dans ce module on t'a
conseillé d'y ajouter du code...faudrait refaire tes devoirs !


"Ptit Louis" a écrit dans le message de news:

Bonjour,
J'ai copié-collé les instructions et VB me répond :
Public Evenement As New clsEventWB : "Type défini par l'utilisateur non
défini"
Quel est alors le remède ? Dans l'aide, rien n'est suffisamment clair pour
corriger l'anomalie.
Merci !



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




Avatar
PMO
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
Avatar
Ptit Louis
Bonsoir,
Heureusement que j'ai utilisé la méthode copier-coller afin de réduire les
erreurs ou oublis ! En effet, l'anomalie est dans ce qu'il faut copier : il y
a un clsEventWB et un clsEventsWB ;-)
Mis à part cela (une fois corrigé) cela fonctionne bien avec des classeurs B
et C vierges. Bravo !
Avec mes classeurs c'est autre chose. En pas à pas je n'ai pas trouvé
d'erreur, mais en fonctionnement normal Excel est brutalement fermé ... et il
faut alors récupérer les fichiers qui ont subi le même outrage...
SI je remplace mon vrai classeur B par un vierge, cela fonctionne aussi. Mon
vrai classeur B fait 3Mo et est beaucoup manipulé lors de la fermeture par
VBA(Sélection de feuilles pour la prochaine ouverture, Vérifications, tris
des données...).
Y a-t-il un rapport? Je continue les observations, et vous tiens au courant !
Au fait, où peut-on trouver de la littérature non réservée à des experts sur
les modules de classe (pourquoi les utiliser, comment, pour faire quoi ?...) ?
Merci du nouveau coup de pouce.


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