OVH Cloud OVH Cloud

VBA : Workbook_BeforeSave et Enregistrer sous

4 réponses
Avatar
Quetzalcoatl
Bonsoir,

Comment tester dans 'Private Sub Workbook_BeforeSave' si on y arrive par
'enregistrer sous' ?
Autrement dit, existe-t-il un indicateur que je puisse tester sous VBA pour
vérifier si la sauvegarde de mon classeur a été initiée par "enregistrer sous"
du menu "Fichier" ?
Merci pour toute piste, je n'y parviens pas.

--
Goodbye

4 réponses

Avatar
leo
Salut,
D'après une idée de John Walkenbach.

Tu gère toi même la boite de dialogue de sauvegarde ( voir ci dessous )


Private Sub Workbook_BeforeClose(Cancel As Boolean)
'
Dim Msg As String
Dim Ans As Integer
If Me.Saved Then
' Fichier déjà sauvegardé donc rien à faire
Else
' Création de la boite de dialogue de sauvegarde
'
Msg = "Voulez-vous enregistrer les modifications apportées à "
Msg = Msg & Me.Name & " ?"
Ans = MsgBox(Msg, vbExclamation + vbYesNoCancel)
Select Case Ans
Case vbYes
' Je sauvegarde
Me.Save
Case vbNo
' Le fichier ne sera pas sauvegardé.
' Je fais croire qu'il a été sauvegardé pour ne pas avoir la boite
de dialogue
' Pas de sauvegarde
Me.Saved = True
Case vbCancel
' Cancel alors retour au prog
Cancel = True
End Select
End If
End Sub

Amicalement,
leo


"Quetzalcoatl" a écrit dans le message de
news: 42ceed1b$0$22291$
Bonsoir,

Comment tester dans 'Private Sub Workbook_BeforeSave' si on y arrive par
'enregistrer sous' ?
Autrement dit, existe-t-il un indicateur que je puisse tester sous VBA
pour

vérifier si la sauvegarde de mon classeur a été initiée par "enregistrer
sous"

du menu "Fichier" ?
Merci pour toute piste, je n'y parviens pas.

--
Goodbye




Avatar
Quetzalcoatl
Bonsoir,

Merci, mais je ne vois pas que cela réponde à ce que je recherche.
Selon le choix de l'utilisateur, j'ai besoin de pouvoir 'enregistrer 'ou
'enregistrer sous', tout en gardant le contrôle par macro de ces enregistrements
(Private Sub Workbook_BeforeSave).

Voici le contexte de ma demande.
J'ai écrit le code suivant afin d'empêcher l'accès à un fichier XLS si
l'opérateur n'a pas accepté d'activer les macros à l'ouverture du fichier.
Dans ce cas, j'affiche un message à destination de l'opérateur, lui indiquant
qu'il doit accepter les macros pour pouvoir accéder au fichier.
L'idée est de gérer soi-même l'enregistrement du fichier, avec :
- désactivation des évènements et du rafraîchissement de l'écran
- mémorisation de la feuille active
- masquage de toutes les feuilles sauf la feuille comportant le message
- sauvegarde du fichier
- démasquage de toute les feuilles et masquage de la feuille comportant le
message
- activation de la feuille mémorisée
- activation des évènements et du rafraîchissement de l'écran
- inhibition de la sauvegarde du fichier
Tout fonctionne bien, sauf dans le cas où l'opérateur choisit d'activer
'Enregistrer sous' dans le menu 'Fichier'.
On obtient alors un enregistrement, mais pas la fenêtre permettant de choisir le
nom de fichier.
D'où ma question :
Comment tester dans 'Private Sub Workbook_BeforeSave' si on y est arrivé par
'enregistrer sous' ?
Autrement dit, existe-t-il un indicateur que je puisse tester sous VBA pour
vérifier si la sauvegarde de mon classeur a été initiée par "Enregistrer sous"
du menu "Fichier" ?

Voici le code actuel :

Const MessageSheetName As String = "Message"
Private Sub WorkBook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
Dim sh As Worksheet
Dim sht_dislayed As Worksheet
'disable screen updating & events
Application.ScreenUpdating = False
Application.EnableEvents = False
'memorize current sheet
Set sht_dislayed = ActiveSheet
'hide sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = True _
Else sh.Visible = xlSheetVeryHidden
Next
End With
'save file
ActiveWorkbook.Save
'show sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = xlSheetVeryHidden _
Else sh.Visible = True
Next
End With
'select memorized sheet
sht_dislayed.Select
'enable events & screen updating
Application.EnableEvents = False
Application.ScreenUpdating = False
'cancel file save
Cancel = True
End Sub
Private Sub workbook_open()
Dim sh As Worksheet
'disable screen updating & events
Application.ScreenUpdating = False
Application.EnableEvents = False
'show sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = xlSheetVeryHidden _
Else sh.Visible = True
Next
End With
'enable events & screen updating
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Merci d'avance pour toute aide !

--
Cheerio

Salut,
D'après une idée de John Walkenbach.

Tu gère toi même la boite de dialogue de sauvegarde ( voir ci dessous )


Private Sub Workbook_BeforeClose(Cancel As Boolean)
'
Dim Msg As String
Dim Ans As Integer
If Me.Saved Then
' Fichier déjà sauvegardé donc rien à faire
Else
' Création de la boite de dialogue de sauvegarde
'
Msg = "Voulez-vous enregistrer les modifications apportées à "
Msg = Msg & Me.Name & " ?"
Ans = MsgBox(Msg, vbExclamation + vbYesNoCancel)
Select Case Ans
Case vbYes
' Je sauvegarde
Me.Save
Case vbNo
' Le fichier ne sera pas sauvegardé.
' Je fais croire qu'il a été sauvegardé pour ne pas avoir la boite
de dialogue
' Pas de sauvegarde
Me.Saved = True
Case vbCancel
' Cancel alors retour au prog
Cancel = True
End Select
End If
End Sub

Amicalement,
leo


Avatar
docm
Bonjour.
Et si tu vérifie la valeur de la variable SaveAsUI, ^ca ne fonctionne pas?
If SaveAsUI = True Then

docm

"Quetzalcoatl" a écrit dans le message
news: 42cf06ef$0$900$
Bonsoir,

Merci, mais je ne vois pas que cela réponde à ce que je recherche.
Selon le choix de l'utilisateur, j'ai besoin de pouvoir 'enregistrer 'ou
'enregistrer sous', tout en gardant le contrôle par macro de ces
enregistrements

(Private Sub Workbook_BeforeSave).

Voici le contexte de ma demande.
J'ai écrit le code suivant afin d'empêcher l'accès à un fichier XLS si
l'opérateur n'a pas accepté d'activer les macros à l'ouverture du fichier.
Dans ce cas, j'affiche un message à destination de l'opérateur, lui
indiquant

qu'il doit accepter les macros pour pouvoir accéder au fichier.
L'idée est de gérer soi-même l'enregistrement du fichier, avec :
- désactivation des évènements et du rafraîchissement de l'écran
- mémorisation de la feuille active
- masquage de toutes les feuilles sauf la feuille comportant le message
- sauvegarde du fichier
- démasquage de toute les feuilles et masquage de la feuille comportant le
message
- activation de la feuille mémorisée
- activation des évènements et du rafraîchissement de l'écran
- inhibition de la sauvegarde du fichier
Tout fonctionne bien, sauf dans le cas où l'opérateur choisit d'activer
'Enregistrer sous' dans le menu 'Fichier'.
On obtient alors un enregistrement, mais pas la fenêtre permettant de
choisir le

nom de fichier.
D'où ma question :
Comment tester dans 'Private Sub Workbook_BeforeSave' si on y est arrivé
par

'enregistrer sous' ?
Autrement dit, existe-t-il un indicateur que je puisse tester sous VBA
pour

vérifier si la sauvegarde de mon classeur a été initiée par "Enregistrer
sous"

du menu "Fichier" ?

Voici le code actuel :

Const MessageSheetName As String = "Message"
Private Sub WorkBook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As
Boolean)

Dim sh As Worksheet
Dim sht_dislayed As Worksheet
'disable screen updating & events
Application.ScreenUpdating = False
Application.EnableEvents = False
'memorize current sheet
Set sht_dislayed = ActiveSheet
'hide sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = True _
Else sh.Visible = xlSheetVeryHidden
Next
End With
'save file
ActiveWorkbook.Save
'show sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = xlSheetVeryHidden
_

Else sh.Visible = True
Next
End With
'select memorized sheet
sht_dislayed.Select
'enable events & screen updating
Application.EnableEvents = False
Application.ScreenUpdating = False
'cancel file save
Cancel = True
End Sub
Private Sub workbook_open()
Dim sh As Worksheet
'disable screen updating & events
Application.ScreenUpdating = False
Application.EnableEvents = False
'show sheets, except message
With ThisWorkbook
For Each sh In .Sheets
If sh.Name = MessageSheetName Then sh.Visible = xlSheetVeryHidden
_

Else sh.Visible = True
Next
End With
'enable events & screen updating
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Merci d'avance pour toute aide !

--
Cheerio

Salut,
D'après une idée de John Walkenbach.

Tu gère toi même la boite de dialogue de sauvegarde ( voir ci dessous )


Private Sub Workbook_BeforeClose(Cancel As Boolean)
'
Dim Msg As String
Dim Ans As Integer
If Me.Saved Then
' Fichier déjà sauvegardé donc rien à faire
Else
' Création de la boite de dialogue de sauvegarde
'
Msg = "Voulez-vous enregistrer les modifications apportées à "
Msg = Msg & Me.Name & " ?"
Ans = MsgBox(Msg, vbExclamation + vbYesNoCancel)
Select Case Ans
Case vbYes
' Je sauvegarde
Me.Save
Case vbNo
' Le fichier ne sera pas sauvegardé.
' Je fais croire qu'il a été sauvegardé pour ne pas avoir la
boite


de dialogue
' Pas de sauvegarde
Me.Saved = True
Case vbCancel
' Cancel alors retour au prog
Cancel = True
End Select
End If
End Sub

Amicalement,
leo







Avatar
Quetzalcoatl
Bonjour,

Merci, c'est exactement ce que je cherchais.
J'avais bien noté l'existence de cette variable, mais j'ai trouvé l'aide en
ligne peu explicite sur son utilisation et je n'avais pas compris son intérêt.
--
Amicalement vôtre

Bonjour.
Et si tu vérifie la valeur de la variable SaveAsUI, ^ca ne fonctionne pas?
If SaveAsUI = True Then