Code VBA pour vérifier si un fichier existe avant sauvegarde
Bonjour le forum,
En me servant de spots similaires j'ai écrit un code pour copier dans un nouveau classeur des feuilles d'un autre classeur.
Je voudrais ouvrir une boîte de dialogue, pour avertir si le nom donné pour la sauvegarde du nouveau classeur existe déjà.
Le choix du répertoire où se fait la sauvegarde n'est pas imposé.
Voici le code que j'ai utilisé pour créer et sauvegarder le nouveau classeur :
Sub Extraire_Sortie()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim a, e, Rep As Integer, Repertoire As String, Nomsortie As String
If Range("M6") = 0 And Range("M6") = "" Then[attachment=0]Exemple.xlsm[/attachment]
Rep = MsgBox(" Le nom du fichier pour la sauvegarde du fichier Excel joint au compte-rendu de la sortie n'a pas été saisi dans la cellule M6. ")
Else
MsgBox ("Indiquer le repertoire ou sera enregistré le fichier")
Repertoire = ChoixDossier
Application.DisplayAlerts = False
Nomsortie = Sheets("Sortie").Range("M6")
a = Array("Partenaires des Postulants", "Sorties 2018", "Partenaires")
With Workbooks.Add(xlWBATWorksheet)
For Each e In a
ThisWorkbook.Sheets(e).Copy After:=.Sheets(.Sheets.Count)
Next
.Sheets(1).Delete
.Sheets(1).Select
.SaveAs Repertoire & "\" & Nomsortie
.Close
End With
End If
Application.ScreenUpdating = True
End SubEt le code pour le choix du répertoire :
Function ChoixDossier()
If Val(Application.Version) >= 10 Then
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count = 1 Then
ChoixDossier = .SelectedItems(1)
Else
ChoixDossier = ""
End If
End With
Else
ChoixDossier = InputBox("Répertoire?")
End If
End FunctionCe que je cherche, c'est qu'avant de faire la sauvegarde, il y ait un message indiquant que le fichier existe déjà, et si on veut écraser le fichier existant.
Merci d'avance pour votre aide.
bonjour,
une proposition
Sub Extraire_Sortie()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim a, e, Rep As Integer, Repertoire As String, Nomsortie As String
If Range("M6") = 0 And Range("M6") = "" Then
Rep = MsgBox(" Le nom du fichier pour la sauvegarde du fichier Excel joint au compte-rendu de la sortie n'a pas été saisi dans la cellule M6. ")
Else
MsgBox ("Indiquer le repertoire ou sera enregistré le fichier")
Repertoire = ChoixDossier
Application.DisplayAlerts = False
Nomsortie = Sheets("Sortie").Range("M6")
If Dir(Repertoire & "\" & Nomsortie) <> "" Then
Rep = MsgBox("ce fichier existe déjà, ok pour le remplacer ?", vbYesNo)
If Rep = vbYes Then
a = Array("Partenaires des Postulants", "Sorties 2018", "Partenaires")
With Workbooks.Add(xlWBATWorksheet)
For Each e In a
ThisWorkbook.Sheets(e).Copy After:=.Sheets(.Sheets.Count)
Next
.Sheets(1).Delete
.Sheets(1).Select
.SaveAs Repertoire & "\" & Nomsortie
.Close
End With
End If
End If
End If
Application.ScreenUpdating = True
End SubUne autre proposition:
Sub Extraire_Sortie()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim a, e, Rep As Integer, Repertoire As String, Nomsortie As String
If Range("M6") = 0 And Range("M6") = "" Then
Rep = MsgBox(" Le nom du fichier pour la sauvegarde du fichier Excel joint au compte-rendu de la sortie n'a pas été saisi dans la cellule M6. ")
Else
MsgBox ("Indiquer le repertoire ou sera enregistré le fichier")
Repertoire = ChoixDossier
Application.DisplayAlerts = False
Nomsortie = Sheets("Sortie").Range("M6")
a = Array("Partenaires des Postulants", "Sorties 2018", "Partenaires")
With Workbooks.Add(xlWBATWorksheet)
For Each e In a
ThisWorkbook.Sheets(e).Copy After:=.Sheets(.Sheets.Count)
Next
.Sheets(1).Delete
.Sheets(1).Select
Dim sFile As String
Dim lRep As Long
Dim saveOK As Boolean
sFile = Repertoire & "\" & Nomsortie
If ExistsEXCEL(sFile) Then
lRep = MsgBox("Le fichier '" & sFile & "' existe déjà!" & vbCrLf & vbCrLf _
& "Voulez-vous le remplacer?", vbExclamation + vbYesNo, "FICHIER EXISTANT")
If lRep = vbYes Then
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
oFS.DeleteFile sFile, True
saveOK = True
Else
saveOK = False
End If
Else
saveOK = True
End If
If saveOK Then
.SaveAs Repertoire & "\" & Nomsortie
End If
.Close
End With
End If
Application.ScreenUpdating = True
End SubAvec la fonction :
Function ExistsEXCEL(zFile As String) As Boolean
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
If oFS.FileExists(zFile) Then
ExistsEXCEL = True
Else
ExistsEXCEL = False
End If
Set oFS = Nothing
End FunctionBonsoir GVIALLES,
Merci pour tes 2 réponses. J'ai collé des codes dans mon fichier, mais cela ne fonctionne pas.
Je pense que cela vient du code de la fonction concernant le choix du dossier :
Function ChoixDossier()
If Val(Application.Version) >= 10 Then
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count = 1 Then
ChoixDossier = .SelectedItems(1)
Else
ChoixDossier = ""
End If
End With
Else
ChoixDossier = InputBox("Répertoire?")
End If
End FunctionMais mes connaissances en VBA sont très limitées et je ne trouve pas où est l'erreur.
as-tu une idée ?
Merci
bonsoir h2so4,
Désolé de t'avoir oublié dans ma réponse.
Comme indiqué, dans mon message précédent, je pense avoir une erreur au niveau de la fonction ChoixDossier.
As-tu une idée.
Merci.
rebonsoir,
je n'ai pas testé la proposition que j'avais faite, j'aurais dû le faire.
voici une correction
Sub Extraire_Sortie()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim a, e, Rep As Integer, Repertoire As String, Nomsortie As String
If Range("M6") = 0 Or Range("M6") = "" Then
Rep = MsgBox(" Le nom du fichier pour la sauvegarde du fichier Excel joint au compte-rendu de la sortie n'a pas été saisi dans la cellule M6. ")
Else
MsgBox ("Indiquer le repertoire ou sera enregistré le fichier")
Repertoire = ChoixDossier
Application.DisplayAlerts = False
Nomsortie = Sheets("Sortie").Range("M6")
Rep = vbYes
If Dir(Repertoire & "\" & Nomsortie) <> "" Then
Rep = MsgBox("ce fichier existe déjà, ok pour le remplacer ?", vbYesNo)
End If
If Rep = vbYes Then
a = Array("Partenaires des Postulants", "Sorties 2018", "Partenaires")
With Workbooks.Add(xlWBATWorksheet)
For Each e In a
ThisWorkbook.Sheets(e).Copy After:=.Sheets(.Sheets.Count)
Next
.Sheets(1).Delete
.Sheets(1).Select
.SaveAs Repertoire & "\" & Nomsortie
.Close
End With
End If
End If
Application.ScreenUpdating = True
End SubBonsoir Sergio,
J'ai testé l'ensemble du code et n'ai pas trouvé l'erreur.
Peux-tu être plus précis sur l'erreur que tu rencontres? Code de l'erreur et ligne sur laquelle elle se produit...
Bonjour,
Voici ta fonction un peu modifié afin de ne pas avoir à utiliser l'InputBox pour les anciennes versions :
Function ChoixDossier()
Dim Sh, Dos
If Val(Application.Version) >= 10 Then
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ActiveWorkbook.Path & "\"
ChoixDossier = IIf(.Show = -1, .SelectedItems(1), "")
End With
Else
Set Sh = CreateObject("Shell.Application")
Set Dos = Sh.BrowseForFolder(&H0&, "Répertoire.", &H4000)
ChoixDossier = Dos.ParentFolder.ParseName(Dos.Title).Path & "\"
End If
End FunctionBonsoir à tous,
Merci pour vos réponses, mais j'ai toujours un problème. Lorsque j'exécute la macro si un fichier créé porte le même nom qu'un fichier existant, je n'ai pas de message d'alerte et le fichier existant est écrasé.
Avez-vous une idée ?
Merci encore pour votre aide
Bonjour,
j'ai omis l'extension .xls* dans mon contrôle d'existence du fichier.
Sub Extraire_Sortie()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim a, e, Rep As Integer, Repertoire As String, Nomsortie As String
If Range("M6") = 0 Or Range("M6") = "" Then
Rep = MsgBox(" Le nom du fichier pour la sauvegarde du fichier Excel joint au compte-rendu de la sortie n'a pas été saisi dans la cellule M6. ")
Else
MsgBox ("Indiquer le repertoire ou sera enregistré le fichier")
Repertoire = ChoixDossier
Application.DisplayAlerts = False
Nomsortie = Sheets("Sortie").Range("M6")
Rep = vbYes
Dim f
If Dir(Repertoire & "\" & Nomsortie & ".xls*") <> "" Then
Rep = MsgBox("ce fichier existe déjà, ok pour le remplacer ?", vbYesNo)
End If
If Rep = vbYes Then
a = Array("Partenaires des Postulants", "Sorties 2018", "Partenaires")
With Workbooks.Add(xlWBATWorksheet)
For Each e In a
ThisWorkbook.Sheets(e).Copy After:=.Sheets(.Sheets.Count)
Next
.Sheets(1).Delete
.Sheets(1).Select
.SaveAs Repertoire & "\" & Nomsortie
.Close
End With
End If
End If
Application.ScreenUpdating = True
End SubBonjour h2so4,
Merci beaucoup pour ton aide.
Cela fonctionne très bien.
Très bonne journée.