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

Evenement Fermeture d'un Classeur

8 réponses
Avatar
LANIMAL
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci

8 réponses

Avatar
MichDenis
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci
Avatar
LANIMAL
Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci



Avatar
MichDenis
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci



Avatar
LANIMAL
Bonjour MichDenis
Encore merci car tu m'as décoincé, et j'ai progressé.
Simplement pour t'informer de la suite...
car j'ai rencontré un Pb :
Après avoir travaillé, si je lance une sauvegarde directement (Ctrl + S)
Et que ensuite je ferme le classeur, la procedure que tu me proposes
n'est pas activée, et donc "FinIntervention" ne s'exécute pas.

Alors j'ai utiliséPrivate Sub Workbook_BeforeSave(ByVal ....)
qui s'exécute systématiquement avant toute sauvegarde,
demandée directement ou par Excel, avant fermeture.
J'avais bien pensé à un tel évènement (BeforeSave), et j'étais étonné de
ne pas le trouver dans la liste déroulante des procédures de Workbook,
juste... j'avais pas assez déroulé ! ! !
Merci encore de m'avoir mis sur la route.


MichDenis a écrit :
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci





Avatar
MichDenis
Tu as raison, tu aurais pu modifier la procédure comme ceci :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
Else
FinIntervention
End If

End Sub




"LANIMAL" a écrit dans le message de groupe de discussion :

Bonjour MichDenis
Encore merci car tu m'as décoincé, et j'ai progressé.
Simplement pour t'informer de la suite...
car j'ai rencontré un Pb :
Après avoir travaillé, si je lance une sauvegarde directement (Ctrl + S)
Et que ensuite je ferme le classeur, la procedure que tu me proposes
n'est pas activée, et donc "FinIntervention" ne s'exécute pas.

Alors j'ai utiliséPrivate Sub Workbook_BeforeSave(ByVal ....)
qui s'exécute systématiquement avant toute sauvegarde,
demandée directement ou par Excel, avant fermeture.
J'avais bien pensé à un tel évènement (BeforeSave), et j'étais étonné de
ne pas le trouver dans la liste déroulante des procédures de Workbook,
juste... j'avais pas assez déroulé ! ! !
Merci encore de m'avoir mis sur la route.


MichDenis a écrit :
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci





Avatar
LANIMAL
Excuse-moi, tu vas penser que je suis casse-pied...
Non, juste un peu pointilleux, et j'aime bien comprendre.
Alors, y a-t-il un intérêt que je ne verrais pas à écrire la procédure
que tu me conseilles, plutôt que :
----------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As
Boolean)
Call FinIntervention
End Sub
------------------------------
qui fait le job avec 3 lignes de code.
De toute façon, merci, j'ai appris des choses avec ta proposition.

MichDenis a écrit :
Tu as raison, tu aurais pu modifier la procédure comme ceci :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
Else
FinIntervention
End If

End Sub




"LANIMAL" a écrit dans le message de groupe de discussion :

Bonjour MichDenis
Encore merci car tu m'as décoincé, et j'ai progressé.
Simplement pour t'informer de la suite...
car j'ai rencontré un Pb :
Après avoir travaillé, si je lance une sauvegarde directement (Ctrl + S)
Et que ensuite je ferme le classeur, la procedure que tu me proposes
n'est pas activée, et donc "FinIntervention" ne s'exécute pas.

Alors j'ai utiliséPrivate Sub Workbook_BeforeSave(ByVal ....)
qui s'exécute systématiquement avant toute sauvegarde,
demandée directement ou par Excel, avant fermeture.
J'avais bien pensé à un tel évènement (BeforeSave), et j'étais étonné de
ne pas le trouver dans la liste déroulante des procédures de Workbook,
juste... j'avais pas assez déroulé ! ! !
Merci encore de m'avoir mis sur la route.


MichDenis a écrit :
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci







Avatar
MichDenis
Ta procédure fait le travail seulement si tu sauvegardes les modifications de ta feuille.
A ) tu dois t'assurer que cela soit fait !
B ) Est-ce qu'à chaque fois que tu enregistres ton fichier tu veux déclencher la procédure
?

Enregistrer le fichier n'est pas l'équivalent de le fermer!




"LANIMAL" a écrit dans le message de groupe de discussion :

Excuse-moi, tu vas penser que je suis casse-pied...
Non, juste un peu pointilleux, et j'aime bien comprendre.
Alors, y a-t-il un intérêt que je ne verrais pas à écrire la procédure
que tu me conseilles, plutôt que :
----------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As
Boolean)
Call FinIntervention
End Sub
------------------------------
qui fait le job avec 3 lignes de code.
De toute façon, merci, j'ai appris des choses avec ta proposition.

MichDenis a écrit :
Tu as raison, tu aurais pu modifier la procédure comme ceci :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
Else
FinIntervention
End If

End Sub




"LANIMAL" a écrit dans le message de groupe de discussion :

Bonjour MichDenis
Encore merci car tu m'as décoincé, et j'ai progressé.
Simplement pour t'informer de la suite...
car j'ai rencontré un Pb :
Après avoir travaillé, si je lance une sauvegarde directement (Ctrl + S)
Et que ensuite je ferme le classeur, la procedure que tu me proposes
n'est pas activée, et donc "FinIntervention" ne s'exécute pas.

Alors j'ai utiliséPrivate Sub Workbook_BeforeSave(ByVal ....)
qui s'exécute systématiquement avant toute sauvegarde,
demandée directement ou par Excel, avant fermeture.
J'avais bien pensé à un tel évènement (BeforeSave), et j'étais étonné de
ne pas le trouver dans la liste déroulante des procédures de Workbook,
juste... j'avais pas assez déroulé ! ! !
Merci encore de m'avoir mis sur la route.


MichDenis a écrit :
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci







Avatar
LANIMAL
OK, je vois la nuance.

MichDenis a écrit :
Ta procédure fait le travail seulement si tu sauvegardes les modifications de ta feuille.
A ) tu dois t'assurer que cela soit fait !


Oui, effectivement c'est un réflex que nos avonsde sauvegarder
avant de fermer (sur invite d'Excel). Quand on oublie, on n'a plus qu'à
reprendre les saisies ! ! ! :-(
B ) Est-ce qu'à chaque fois que tu enregistres ton fichier tu veux déclencher la procédure
?


Oui, c'est absolument essentiel, notamment pour re-masquer des données
confidentielles "dé-masquées" par ceux qui sont habilités à les voir,
mais qui ne doivent pas être vues par tous les utilisateurs.

Enregistrer le fichier n'est pas l'équivalent de le fermer!


OK

Merci encore pour ton aide.




"LANIMAL" a écrit dans le message de groupe de discussion :

Excuse-moi, tu vas penser que je suis casse-pied...
Non, juste un peu pointilleux, et j'aime bien comprendre.
Alors, y a-t-il un intérêt que je ne verrais pas à écrire la procédure
que tu me conseilles, plutôt que :
----------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As
Boolean)
Call FinIntervention
End Sub
------------------------------
qui fait le job avec 3 lignes de code.
De toute façon, merci, j'ai appris des choses avec ta proposition.

MichDenis a écrit :
Tu as raison, tu aurais pu modifier la procédure comme ceci :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
Else
FinIntervention
End If

End Sub




"LANIMAL" a écrit dans le message de groupe de discussion :

Bonjour MichDenis
Encore merci car tu m'as décoincé, et j'ai progressé.
Simplement pour t'informer de la suite...
car j'ai rencontré un Pb :
Après avoir travaillé, si je lance une sauvegarde directement (Ctrl + S)
Et que ensuite je ferme le classeur, la procedure que tu me proposes
n'est pas activée, et donc "FinIntervention" ne s'exécute pas.

Alors j'ai utiliséPrivate Sub Workbook_BeforeSave(ByVal ....)
qui s'exécute systématiquement avant toute sauvegarde,
demandée directement ou par Excel, avant fermeture.
J'avais bien pensé à un tel évènement (BeforeSave), et j'étais étonné de
ne pas le trouver dans la liste déroulante des procédures de Workbook,
juste... j'avais pas assez déroulé ! ! !
Merci encore de m'avoir mis sur la route.


MichDenis a écrit :
Me : représente le module de classe où l'expression est utilisée.
Dans ce cas ci, il remplace (incarne) le classeur lui-même...
ou Thisworkbook.Save ou saved



"LANIMAL" a écrit dans le message de groupe de discussion :

Merci MichDenis, je ne te ferai pas l'affront de te dire que ça marche.
Mais, je ne suis pas clair sur les lignes "Me.Save" et "Me.Saved"
OK pour Save et Saved, mais "Me", c'est quoi ?
Excuse mon ignorance.
Merci encore.


MichDenis a écrit :
Bonjour Lanimal,

Tu devrais utiliser ce type de procédure dans le ThisWorkbook

Il faut se rappeler qu'à la fermeture d'un classeur, Excel demande
à l'usager si ce dernier désire sauvegarder les modifications apportées.

il faut s'assurer de ne pas supprimer de ne pas modifier l'environnement
avant que l'usager ait répondu à cette question. Une façon de faire est de
créer une petite procédure qui va se substituer à la place de l'intervention
d'excel.

'------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim X As VbMsgBoxResult

If Me.Saved = False Then
X = MsgBox("Voulez-vous enregistrer les " & _
"modifications apportées à " & _
ThisWorkbook.Name & ".", vbInformation + _
vbYesNoCancel, "Attention")
Select Case X
Case vbYes
FinIntervention
Me.Save
Cancel = False
Case vbNo
FinIntervention
Me.Saved = True
Cancel = False
Case vbCancel
Cancel = True
End Select
End If

End Sub
'------------------------------------------------




"LANIMAL" a écrit dans le message de groupe de discussion :
#
Bonsoir,
J'ai écrit une procédure "FinIntervention" destinée à remettre toutes
choses en ordre lors de chaque fermeture du classeur toto.xls
et j'ai inclu "FinIntervention" dans le code ci-après :
---------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call FinIntervention
End Sub
-----------------
Mais, évidemment, ça marche pas car lors de la demande de fermeture de
toto.xls les tâches s'exécutent dans l'ordre suivant :
1 - Demande de fermeture
2 - Proposition de sauvegarde par Excel - Réponse = OUI
3 - Sauvegarde
4 - Exécution de la Sub "FinIntervention"
5 - Fermeture du classeur
PROBLEME : Les choses ne sont pas remises en ordre dans la sauvegarde.

Comment faire pour que "FinIntervention" s'exécute AVANT la sauvegarde ?
Merci