VBA - before save et save as - crash Excel
Bonjour à tous,
Afin d'avoir des noms de fichiers cohérents, je souhaite que l'utilisateur ne puisse pas choisir le nom du fichier excel partie fixe + auto incrémentation.
Pour ce faire j’utilise l’événement before save et la méthode save as cependant au moment du exit excel crash. Je précise que le nouveau fichier est quand même créé et la version incrémentée dans celui-ci
Je ne comprends pas pourquoi excel crash, pourriez me prêter main forte s'il vous plait ?
Je joins un fichier qui réalise les mêmes typologies d'action.
Merci d'avance,
Florian
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim folder As String
Dim version As String
Dim chemin As String
folder = Application.ThisWorkbook.Path
With Worksheets("Feuil1")
version = CStr(.Cells(1, 1).Value + 0.1)
End With
chemin = folder & "\" & "toto" & version & ".xlsm"
On Error GoTo Jump
ActiveWorkbook.SaveAs Filename:=chemin, FileFormat:=52, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False, AccessMode:=1, ConflictResolution:=1
With Worksheets("Feuil1")
If ThisWorkbook.Saved Then
.Cells(1, 1) = CDbl(version)
End If
End With
Exit Sub
Jump:
If Err.Number <> 0 Then
MsgBox "Le fichier n'a pas été sauvegardé", vbInformation + vbOKOnly, "Sauvegarde du fichier"
ThisWorkbook.Saved = False
Err.Clear
Exit Sub
End If
End SubBonsoir,
Mets Cancel à True !
Bonsoir,
Merci pour cette réponse.
J'ai ajouté cancel = true dans la partie gestion d'erreur.
Malgré cela le problème persiste.
Florian,
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim folder As String
Dim version As String
Dim chemin As String
folder = Application.ThisWorkbook.Path
With Worksheets("Feuil1")
version = CStr(.Cells(1, 1).Value + 0.1)
End With
chemin = folder & "\" & "toto" & version & ".xlsm"
On Error GoTo Jump
ActiveWorkbook.SaveAs Filename:=chemin, FileFormat:=52, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False, AccessMode:=1, ConflictResolution:=1
With Worksheets("Feuil1")
If ThisWorkbook.Saved Then
.Cells(1, 1) = CDbl(version)
End If
End With
Exit Sub
Jump:
If Err.Number <> 0 Then
MsgBox "Le fichier n'a pas été sauvegardé", vbInformation + vbOKOnly, "Sauvegarde du fichier"
ThisWorkbook.Saved = False
Err.Clear
Cancel = True
Exit Sub
End If
End SubC'est pas là qu'il faut le mettre c'est avant !
Tu lances une procédure qui intervient sur une commande de sauvegarde, qui modifie la situation, si tu n'annules pas la finalisation de la sauvegarde, elle plante, les conditions ont changé !
L'erreur n'intervient pas dans la procédure, elle intervient après l'exécution...
Cordialement.
Merci pour ces indications.
En fait si je le mets en amont après la déclaration des variables par exemple :
- le save as ne fonctionne plus (idem pour enregistrer)
- l'instruction cancel =true n'est alors pas persistée à sa nouvelle position
Petit plus par contre pas de sauvegarde ==> pas de crash
Bonne journée
Bonjour,
Avec logique :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
[...]
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:=chemin, FileFormat:=52, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False, AccessMode:=1, ConflictResolution:=1
With Worksheets("Feuil1")
If ThisWorkbook.Saved Then
.Cells(1, 1) = CDbl(version)
End If
End With
Application.EnableEvents = True
Cancel = True
[...]
End SubTu détournes un enregistrement demandé, pour enregistrer mais à ta façon.
Tant que tu définis des paramètres à utiliser, aucun problème.
Mais quand tu vas enregistrer, tu déclenches une interception de cette nouvelle demande !
Tu interrompts l'interception des évènements le temps d'enregistrer.
Tu annules la finalisation du premier enregistrement demandé et intercepté.
Et là tu peux en principe sortir tranquille !
Cordialement.
Bonjour,
Merci pour les corrections, tout fonctionne parfaitement!!
Merci aussi pour les explications^^
bonne soirée