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

77toto1-3.xlsm (15.91 Ko)
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 Sub

Bonsoir,

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,

82toto1-5.xlsm (15.90 Ko)
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 Sub

C'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 Sub

Tu 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

Rechercher des sujets similaires à "vba before save crash"