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

Fermeture (vba)

4 réponses
Avatar
j-pascal
Bonsoir,

Je suis fâché avec la fermeture des classeurs ...

J'ai un bouton de la boîte à outils de contrôles sur toutes les
feuilles du classeur :

'--
Private Sub Fermer_Click()
ThisWorkbook.Close 'savechanges:=False
End Sub
'--

Dans le module "ThisWorkbook", j'ai :

'--
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)

If SaveAsUI Then
MsgBox "Désolé, l'option Enregistrer sous... est impossible !",
_
vbExclamation, " Veuillez utiliser fichier / fermer "
Cancel = True
Else
With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " &
.Name
End With
End If
End Sub
'--

Problème :

Toutes les feuilles sont en plein écran (sans aucune barre de menu) ;
j'ai donc pensé au bouton "Private Sub Fermer_Click()" pour fermer le
classeur.

Au début, j'avais mis :

'--
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call AnnulePleinEcran
End Sub
'--

... ça enregistrait bien le classeur, mais sans faire les copies (comme
le fait la procédure plus haut).

Donc pour rejoindre "Private Sub Workbook_BeforeSave (...)", j'ai
ajouté ceci :

'--
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call AnnulePleinEcran
Call Workbook_BeforeSave(False, False)
End Sub
'--

... mais ça ne m'enregistre toujours pas les copies, comme si je
fermais avec Fichier/Fermer !

Je suis perdu !

Merci pour votre aide,

JP

PS : peut-on lancer ""Private Sub Workbook_BeforeSave (...)" depuis un
bouton de feuille ?

4 réponses

Avatar
FFO
Salut Pascal

Dans le VBA de ton bouton je mettrais :

Private Sub Fermer_Click()
Call AnnulePleinEcran
ThisWorkbook.Close 'savechanges:úlse
End Sub

et dans le ThisWorkbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " &
..Name
End With
End If
End Sub

A la fermeture le code du bouton déclenche l'exécution de la macro
"AnnulePleinEcran" puis ferme le classeur qui déclenche le code lié à sa
fermeture "Private Sub Workbook_BeforeClose(Cancel As Boolean)"


L'évennement : Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,
Cancel As
Boolean)

n'intervient qu'à la sauvegarde de ce classeur pour en faire une copie

Fais des essais et dis moi !!!!!
Avatar
j-pascal
Bonsoir FFO,

Merci pour ta réponse. J'ai fait les modifs que tu préconises.

Si je déroule le code pas à pas depuis "Private Sub Fermer_Click()" :

- Je passe par "Private Sub Workbook_BeforeClose"
Le "Path" est bien défini mais le ".SaveCopyAs" reste sans effet bien
que la ligne passe en surbrillance (je veux dire qu'aucune copie n'est
effectuée).

- (Si je clique sur "Sauvegarder")
Je passe par "Private Sub Workbook_BeforeSave"
Et là, idem, il n'y a pas de copie de fichier !

Question :

Puisque je prévois la copie du fichier dans le "Private Sub
Workbook_BeforeSave", pourquoi faut-il que j'ajoute :

'--
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " & .Name


'--

... dans "Private Sub Workbook_BeforeClose" ?

Par ailleurs si je crée une copie dès la "Private Sub
Workbook_BeforeClose", sauf erreur de ma part, les modifications ne
sont pas enregistrées !?

Faut-il ajouter un DoEvents quelque part, un application.EnableEvents
??

Pas très clair pour moi, tout ça !

@+

jp

Salut Pascal

Dans le VBA de ton bouton je mettrais :

Private Sub Fermer_Click()
Call AnnulePleinEcran
ThisWorkbook.Close 'savechanges:úlse
End Sub

et dans le ThisWorkbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " &
..Name
End With
End If
End Sub

A la fermeture le code du bouton déclenche l'exécution de la macro
"AnnulePleinEcran" puis ferme le classeur qui déclenche le code lié à sa
fermeture "Private Sub Workbook_BeforeClose(Cancel As Boolean)"


L'évennement : Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,
Cancel As
Boolean)

n'intervient qu'à la sauvegarde de ce classeur pour en faire une copie

Fais des essais et dis moi !!!!!


Avatar
FFO
Rebonjour à toi

Si tu souhaites réaliser une copie de ton document à sa fermeture il faut
passer par l'évennement :

Workbook_BeforeClose

Si tu souhaites la réaliser à l'enregistrement il faut passer par
l'évennement :

Workbook_BeforeSave

L'instruction de copie doit être dans l'évennement approprié

Si tu la met dans l'évennement de sauvegarde la copie à la fermeture de ce
document si celle-ci est réalisée sans sauvegarde ne se fera pas

Et inversement

A toi de voir avec quel évennement tu souhaites réaliser la copie

Tu peux aussi utiliser les 2 évennements auquel cas il faudra pour couvrir
toutes les situations mettre le code de la copie dans les 2 évennements

Concernant le code aprés essai celui-ci corrigé doit fonctionner :

With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " & .Name
End With

Il doit être intégré dans le classeur dont on réalise la copie

Le lecteur entre les lignes :

ChDrive "C"
ChDir .Path


doit être identique

ChDir .Path est l'adresse du répertoire du classeur dont on réalise la copie

Il doit donc faire mention obligatoirement du lecteur "C"


Fais des essais et dis moi !!!!!
Avatar
j-pascal
Bonsoir,

Comprends pas un truc :

J'ai fait l'essai en pas à pas :

Si je fais Fichier/Fermer,

Je passe par :

'--
Private Sub Workbook_BeforeSave(Cancel As Boolean)

With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " &
.Name
End With
End Sub
'--

(J'ai simplifié le contenu juste pour l'exemple).

J'obtiens donc une copie de mon fichier.

Puis je clique sur oui à la question "voulez-vous sauvegarder ...", je
passe par :

'--
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)
With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " &
.Name
End With
End Sub
'--

et j'obtiens donc une 2nd sauvegarde de mon fichier.

Problème, si je clique sur le bouton d'une feuille :

'--
Private Sub Fermer_Click()
ThisWorkbook.Close 'savechanges:úlse
End Sub
'--

je passe également par toutes les lignes de :
Private Sub Workbook_BeforeClose
et de
Private Sub Workbook_BeforeSave

(comme dans l'exemple précédent), mais ça ne crée aucune sauvegarde !!!

Les deux procédures semblent se dérouler de façon identique, mais n'ont
pas du tout le même effet suivant qu'elles sont lancées d'un bouton, ou
de Fichier/Fermer !

Je ne comprends rien.

A bientôt,

jp

Rebonjour à toi

Si tu souhaites réaliser une copie de ton document à sa fermeture il faut
passer par l'évennement :

Workbook_BeforeClose

Si tu souhaites la réaliser à l'enregistrement il faut passer par
l'évennement :

Workbook_BeforeSave

L'instruction de copie doit être dans l'évennement approprié

Si tu la met dans l'évennement de sauvegarde la copie à la fermeture de ce
document si celle-ci est réalisée sans sauvegarde ne se fera pas

Et inversement

A toi de voir avec quel évennement tu souhaites réaliser la copie

Tu peux aussi utiliser les 2 évennements auquel cas il faudra pour couvrir
toutes les situations mettre le code de la copie dans les 2 évennements

Concernant le code aprés essai celui-ci corrigé doit fonctionner :

With ThisWorkbook
ChDrive "C"
ChDir .Path
.SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " & .Name
End With

Il doit être intégré dans le classeur dont on réalise la copie

Le lecteur entre les lignes :

ChDrive "C"
ChDir .Path


doit être identique

ChDir .Path est l'adresse du répertoire du classeur dont on réalise la copie

Il doit donc faire mention obligatoirement du lecteur "C"


Fais des essais et dis moi !!!!!