TL;DR —
Application.GetSaveAsFilenameaffiche la boîte de dialogue Enregistrer sous et renvoie le chemin choisi par l'utilisateur sous forme de chaîne — elle n'enregistre rien. Pour écrire réellement le fichier, vous devez encore appelerSaveAs. En cas d'annulation, elle renvoie le booléenFalse; déclarez donc la variableAs Variantet testezIf path = False Then Exit Sub. Et le vrai format du fichier vient duFileFormatque vous passez àSaveAs, pas de l'extension affichée dans la boîte de dialogue.
Sub AskThenSave()
Dim path As Variant ' Variant, pour que l'annulation puisse renvoyer False
path = Application.GetSaveAsFilename( _
InitialFileName:="Report " & Format(Date, "yyyy-mm-dd"), _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
If path = False Then Exit Sub ' l'utilisateur a annule
ActiveWorkbook.SaveAs Filename:=path, FileFormat:=xlOpenXMLWorkbook ' c'est VOUS qui enregistrez
End Sub
GetSaveAsFilename est le miroir exact de GetOpenFilename : l'une demande quel
fichier ouvrir, l'autre demande où enregistrer. Et elle partage la même surprise de premier plan — elle renvoie un
chemin, elle n'enregistre pas de fichier — plus un piège bien à elle concernant les formats de fichier, qui produit des fichiers
d'apparence corrompue si vous l'ignorez. Si vous avez lu le guide GetOpenFilename, la plus grande partie vous semblera familière ; c'est dans les deux
dernières sections que se trouvent les différences.
Ce que vous allez apprendre
- Le modèle mental qui relie
GetSaveAsFilename,GetOpenFilenameetFileDialog - Pourquoi elle renvoie un chemin, et non un fichier enregistré — et la ligne
SaveAsque vous devez encore écrire - Le piège de l'annulation, encore : elle renvoie
False, la variable doit donc êtreAs Variant - Suggérer un nom et un dossier par défaut avec
InitialFileName - Le piège du format : l'extension que voit l'utilisateur n'est pas ce qui décide du type de fichier
- Quand l'utiliser plutôt que le type SaveAs de
FileDialog
Le modèle mental : un pense-bête qui demande « enregistrer où ? »
Comme sa jumelle, GetSaveAsFilename tend un pense-bête à l'utilisateur — celui-ci demande « enregistrer où, et sous
quel nom ? » L'utilisateur navigue, saisit un nom, clique sur Enregistrer, et vous récupérez le chemin qu'il a choisi. Rien n'est
écrit sur le disque :
path = Application.GetSaveAsFilename(...) ' renvoie une chaine de CHEMIN
ActiveWorkbook.SaveAs Filename:=path ' c'est VOUS qui ecrivez le fichier
Le signalement « GetSaveAsFilename n'a pas créé de fichier » est le même malentendu que celui de sa jumelle, inversé :
la fonction ne fait que recueillir la destination. L'enregistrement proprement dit — ActiveWorkbook.SaveAs,
Workbook.SaveCopyAs, ou l'écriture de texte avec un FileSystemObject — est la
ligne suivante. Demander où enregistrer et enregistrer sont deux étapes.
Le piège de l'annulation, encore une fois : Dim As Variant
L'annulation se comporte exactement comme dans GetOpenFilename : la fonction renvoie le
booléen False, la variable doit donc pouvoir contenir soit un chemin, soit un booléen :
Dim path As Variant ' CORRECT - un chemin String OU le booleen False
' Dim path As String ' FAUX - False devient le texte "False", donc SaveAs ecrit un fichier nomme False
Avec As String, le False d'annulation est converti en le texte "False", If path = False ne se déclenche jamais,
et SaveAs écrit allègrement un classeur littéralement nommé False dans le répertoire courant. Déclarer path As Variant et tester If path = False Then Exit Sub constitue tout le remède.
Suggérer un nom par défaut avec InitialFileName
Les meilleures boîtes de dialogue d'enregistrement s'ouvrent avec un nom pertinent déjà renseigné. C'est le rôle de l'argument InitialFileName —
et il peut aussi porter un dossier, pour que la boîte de dialogue s'ouvre là où vous le souhaitez :
' Preremplir un nom date dans un dossier precis
path = Application.GetSaveAsFilename( _
InitialFileName:="C:\Reports\Sales " & Format(Date, "yyyy-mm-dd") & ".xlsx", _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
Utiliser des arguments nommés (InitialFileName:=, FileFilter:=) garde l'appel lisible, car
GetSaveAsFilename possède plusieurs paramètres facultatifs et les virgules positionnelles deviennent difficiles à compter. Un nom daté
prérempli est une petite touche qui donne à une macro un air abouti.
Le piège du format : l'extension n'est pas le format
C'est le piège propre à l'enregistrement, et il attrape ceux qui supposent que l'extension de la boîte de dialogue commande le
type de fichier. Il n'en est rien. GetSaveAsFilename renvoie une chaîne ; le vrai format du fichier est décidé par l'argument
FileFormat que vous passez à SaveAs :
' INCOHERENCE - le chemin finit en .xlsx mais vous dites a SaveAs d'ecrire l'ancien format binaire
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlExcel8 ' -> un fichier qui ne s'ouvrira pas correctement
' COHERENT - l'extension et FileFormat concordent
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlOpenXMLWorkbook ' .xlsx
ActiveWorkbook.SaveAs Filename:="Book.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' .xlsm
Si l'extension du chemin et la constante FileFormat divergent, Excel écrit des octets dans un format sous
un nom qui en annonce un autre — et le fichier déclenche une erreur quand quelqu'un double-clique dessus. Décidez donc du
format dans votre code et passez le FileFormat correspondant ; ne supposez pas que le .xlsx que l'utilisateur a vu dans la
boîte de dialogue ait changé quoi que ce soit. Si vous proposez plusieurs filtres, lisez celui que l'utilisateur a choisi (via le FilterIndex
sur lequel il quitte la boîte de dialogue) et choisissez le FileFormat correspondant.
GetSaveAsFilename ou FileDialog SaveAs ? Choisissez selon le contrôle
Pour « demander où enregistrer et me donner le chemin », GetSaveAsFilename est l'outil direct, en une ligne. Tournez-vous vers
FileDialog avec msoFileDialogSaveAs quand vous voulez l'objet boîte de dialogue — pour sa
méthode .Execute, ou pour conserver le même style de lecture via .SelectedItems que vous utilisez ailleurs. Pour demander quoi
ouvrir au lieu d'où enregistrer, le miroir est GetOpenFilename. Les trois
renvoient un chemin et vous laissent le soin d'agir.
Comment ExcelMaster vous aide
Les erreurs ici sont celles qui ne se manifestent que plus tard : un classeur nommé False à cause d'une annulation non protégée,
et un fichier qui ne s'ouvre pas parce que l'extension et le FileFormat divergeaient. Ni l'une ni l'autre ne déclenche d'erreur
au moment où la macro s'exécute — elles font surface quand quelqu'un tente d'utiliser le fichier.
ExcelMaster vous laisse décrire
le résultat — « laisse-moi choisir où enregistrer cette feuille sous forme de CSV daté » — et il écrit l'appel
GetSaveAsFilename avec la protection Variant contre l'annulation, un nom par défaut pertinent, et un SaveAs dont
le FileFormat correspond à l'extension. Vous conservez le classeur et le code.
Questions fréquentes
Comment utiliser GetSaveAsFilename en VBA Excel ?
Appelez path = Application.GetSaveAsFilename(InitialFileName, FileFilter, FilterIndex, Title). Déclarez path As Variant, testez If path = False Then Exit Sub pour intercepter une annulation, puis enregistrez avec
ActiveWorkbook.SaveAs Filename:=path, FileFormat:=.... La fonction ne renvoie que le chemin choisi — elle
n'enregistre pas le fichier elle-même.
Pourquoi GetSaveAsFilename n'enregistre-t-il pas le fichier ?
Parce qu'elle est seulement censée recueillir le chemin de destination, pas écrire quoi que ce soit. Elle affiche la boîte de dialogue Enregistrer
sous et renvoie le chemin que l'utilisateur a choisi. Vous effectuez l'enregistrement réel à la ligne suivante —
ActiveWorkbook.SaveAs Filename:=path pour un classeur, ou un
FileSystemObject pour du texte. Demander où enregistrer et enregistrer sont deux étapes
distinctes.
Comment définir un nom de fichier par défaut dans la boîte de dialogue Enregistrer sous ?
Passez l'argument InitialFileName : Application.GetSaveAsFilename(InitialFileName:="Report.xlsx"). Il peut
inclure un dossier en plus d'un nom, si bien que "C:\Reports\Report " & Format(Date, "yyyy-mm-dd") & ".xlsx" ouvre
la boîte de dialogue dans ce dossier avec un nom daté prérempli, prêt à être accepté ou modifié.
Comment détecter l'annulation dans GetSaveAsFilename ?
Déclarez la variable As Variant et testez If path = False Then Exit Sub. En cas d'annulation, la fonction renvoie
le booléen False ; en cas de succès, elle renvoie une chaîne de chemin. Avec une variable As String, le False est
converti en le texte "False", la vérification ne se déclenche jamais, et SaveAs écrit un fichier littéralement nommé False.
Pourquoi mon fichier enregistré ne s'ouvre-t-il pas après avoir utilisé GetSaveAsFilename ?
Presque toujours parce que l'extension du chemin et le FileFormat que vous avez passé à SaveAs divergent — par
exemple un nom en .xlsx enregistré avec FileFormat:=xlExcel8. Excel écrit un format sous un nom qui en annonce
un autre, et le fichier déclenche une erreur à l'ouverture. Décidez du format dans le code et passez la constante
FileFormat correspondante (xlOpenXMLWorkbook pour .xlsx, xlOpenXMLWorkbookMacroEnabled pour .xlsm).
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 26/09/2026.
Guides associés : VBA GetOpenFilename · VBA FileDialog · VBA Save Workbook · VBA InputBox · VBA FileSystemObject · VBA Workbook
