Error 1004 avec la fonction SaveAs utilisée 2 fois de suite

Bonjour à tous

J'ai créé la macro suivant dans un Event BeforeSave. Cette petite macro sauvegarde le classeur courant sous un nom créé à partir de la valeur de certaines cellules de l'onglet "Relevé" du classeur. La macro est à la fin de ce post.

La sauvegarde marche (même si elle a tendance à fermer le classeur créé sans que je comprenne pourquoi) mais si suite à la première sauvegarde je clique à nouveau sur l'icône sauvegarder et que je sauvegarde le fichier avec le même nom, j'ai systématiquement le message d'erreur 1004 (cf pièce-jointe).

erreur 1004

Par contre, si suite à la première sauvegarde, je sauvegarde à nouveau le classeur mais sous un nouveau nom, ça fonctionne et je n'ai pas de message d'erreur.
Je pensais que le problème venait de là, c'est à dire que la fonction SaveAs n'accepte pas un nom de fichier déjà existant pour quelle que raison que ce soit.

Mais j'ai alors fait le test suivant :
1- Ouverture d'un fichier Excel contenant la macro.
2- Appui sur le bouton sauvegarder ce qui lance la macro et me permet de sauvegarder le fichier sous le nom souhaité (variable str_Workbook_Feuille_Presence).
3- Fermeture du fichier ainsi créé.
4- Réouverture du fichier crée à l'étape 2, il contient donc la macro et nouvel appui sur le bouton sauvegarder ce qui lance à nouveau la macro.
5- Comme j'utilise le même fichier qu'à l'étape 2, le nom du fichier str_Workbook_Feuille_Presence à l'étape 4 est le même. Mais là, pas de problème de sauvegarde et la fonction SaveAs m'autorise à écraser le fichier existant (j'ai d'abord une fenêtre qui me demande de confirmer que je veux bien remplacer le fichier existant).

Donc je ne comprends pas pourquoi cette macro ne m'autorise pas à sauvegarder 2 fois de suite un fichier avec le même nom sans d'abord avoir besoin de le fermer. J'ai essayé sur une sauvegarde sur un emplacement non partagé (hors OneDrive donc) et c'est le même problème.

Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim ws_Presence As Worksheet
Dim date_Debut As Date
Dim str_Workbook_Feuille_Presence, str_Workbook_Feuille_Presence_Chemin As Variant
Dim str_IDALPS, str_Prenom, str_Nom, str_Activite As String
Dim str_Mois_Court, str_Annee_Long As String

Application.EnableEvents = False
'ActiveWorkbook.AutoSaveOn = False

'VARIABLES GLOBALES ISSUES DE LA FEUILLE DE PRESENCE
'Premier jour du mois pour lequel la feuille d'heure et la feuille MEST sont créées
date_Debut = ActiveWorkbook.Worksheets("Relevé").Range("G3").Value
'Mois pour lequel la feuille d'heure et la feuille MEST sont créées, format à 2 chiffres
str_Mois_Court = Format(date_Debut, "mm")
'Année pour laquelle la feuille d'heure et la feuille MEST sont créées, format à 4 chiffres
str_Annee_Long = Format(date_Debut, "yyyy")
'Numéro Alps du collaborateur
str_IDALPS = ActiveWorkbook.Worksheets("Relevé").Cells(6, 2)
'Nom du collaborateur
str_Nom = ActiveWorkbook.Worksheets("Relevé").Cells(3, 2)

If IsEmpty(date_Debut) Or IsEmpty(str_IDALPS) Or IsEmpty(str_Nom) Then
MsgBox "Sur la feuille de présence, vous devez entrer votre nom, votre matricule (ID Alps) et le mois (01/MM/AAAA)"
Else
'On créé le nom de la feuille de présence correspondant au mois de la feuille d'heures IDALPS_NOM-EMPLOYE_MEST_AAAA-MM
' et on demande à l'utilisaeur de choisir le chemin d'accès complet de ce nouveau fichier
str_Workbook_Feuille_Presence = str_IDALPS & "_" & UCase(str_Nom) & "_PRESENCE_" & str_Annee_Long & "-" & str_Mois_Court & ".xlsm"
Do
str_Workbook_Feuille_Presence_Chemin = Application.GetSaveAsFilename(Title:="Sélection du dossier de sauvegarde de la feuille de présence", InitialFileName:=str_Workbook_Feuille_Presence, FileFilter:="Excel Files (*.xlsm), *xlsm")
Loop While str_Workbook_Feuille_Presence_Chemin = False
'On sauvegarde la feuille de présence ouverte sous son nouveau chemin d'accès + nom
ActiveWorkbook.SaveAs Filename:=str_Workbook_Feuille_Presence_Chemin, FileFormat:=xlOpenXMLWorkbookMacroEnabled, AddToMru:=True, ConflictResolution:=xlLocalSessionChanges
End If

Application.EnableEvents = True
'ActiveWorkbook.AutoSaveOn = True

End Sub

Bonjour Gaegouli,

Une suggestion : avant de sauvegarder, ajoutes le test :

If Not ActiveWorkbook.Saved Then
    'On sauvegarde la feuille de présence ouverte sous son nouveau chemin d'accès + nom
    ActiveWorkbook.SaveAs Filename:=str_Workbook_Feuille_Presence_Chemin, FileFormat:=xlOpenXMLWorkbookMacroEnabled, AddToMru:=True, ConflictResolution:=xlLocalSessionChanges
End If

Bonjour Gérard

Tout d'abord, mille excuses de ne pas avoir répondu plus tôt car j'étais certain de recevoir un mail me notifiant que quelqu'un avait répondu à mon post, mais je n'ai jamais reçu un tel mail et je ne vois donc votre réponse que parce que je me suis connecté pour relancer le sujet (ou alors le mail est arrivé dans mes spams que je ne consulte jamais).

J'ai essayé ce que vous proposez de deux manières différentes, en laissant l'option AutoSave ou en la passant temporairement à False. Mais dans les deux cas, lors de la deuxième sauvegarde du classeur avec le même nom, j'ai toujours le message d'erreur 1004...

Cordialement

Gaegouli

Gérard

Votre solution seule ne résolvait pas le problème, mais m'a permis d'avancer. J'ai en effet aussi ajouté une option AccessMode:=xlExclusive lors de la sauvegardz du classeur sous un nouveau nom et cela résout le problème. Mais je dois garder votre modif également car si j'enlève la ligne de vérification que vous m'avez demandé d'ajouter, j'ai à nouveau l'erreur 1004, donc il faut les 2 modifs pour que cela fonctionne).

J'ai l'impression que l'event SaveAs et les fichiers partagés (SharePoint ou OneDrive) ne font pas bon ménage car je ne comprends pas pourquoi il faut en passer par ces contorsions pour pouvoir faire deux sauvegardes de suite sans erreur 1004. Je pense que VBA est quand même une accumulation de rustines (je parle vraiment sans preuve) pour maintenir VBA malgré les évolutions d'Excel. D'ailleurs, existe-t-il des alternatives à VBA mais toujours fournies par Microsoft (je ne parle pas de code python avec des API tierces qui permettent de manipuler des fichiers Excel) ?

En tout cas, je vous remercie grandement et chaleureusement d'avoir pris le temps de regarder mon problème.

Cordialement

Grégory Gilbert

Bonjour Grégory,

Concernant ta question sur une alternative au VBA, depuis la version Office 365 Microsoft propose Office Script pour les plateformes WEB.

Tu trouveras ici une introduction : https://excellons.org/bienvenue/excel-online-bureau/

D'autre part,

Bonsoir Gérard

J'avais mis un tick vert sur la première de vos réponses avant-hier et il n'y est plus. Je viens donc de remettre un tick vert sur chacune de vos deux réponses.

Je suis allé voir le lien que vous avez envoyé sur Office Script. Mais le fait qu'il ne s'exécute que dans excel web et surtout le fait qu'il ne supporte pas les évènements ou les interactions utilisateurs le rend malheureusement inutilisable pour moi.

En tout cas encore merci de votre aide.

Cordialement

Gaegouli

Rechercher des sujets similaires à "error 1004 fonction saveas utilisee fois suite"