TL;DR —
Application.GetSaveAsFilenamezeigt den Speichern-unter-Dialog und gibt den Pfad, den der Benutzer gewählt hat, als Zeichenfolge zurück — es speichert nichts. Um die Datei tatsächlich zu schreiben, rufen Sie immer nochSaveAsauf. Bei Abbrechen gibt es den WahrheitswertFalsezurück, deklarieren Sie die Variable alsoAs Variantund prüfen SieIf path = False Then Exit Sub. Und das echte Format der Datei kommt aus demFileFormat, das Sie anSaveAsübergeben, nicht aus der Erweiterung im Dialog.
Sub AskThenSave()
Dim path As Variant ' Variant, damit Abbrechen False zurueckgeben kann
path = Application.GetSaveAsFilename( _
InitialFileName:="Report " & Format(Date, "yyyy-mm-dd"), _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
If path = False Then Exit Sub ' Benutzer hat abgebrochen
ActiveWorkbook.SaveAs Filename:=path, FileFormat:=xlOpenXMLWorkbook ' SIE speichern
End Sub
GetSaveAsFilename ist das exakte Spiegelbild von GetOpenFilename: Das
eine fragt, welche Datei geöffnet werden soll, dieses fragt, wohin gespeichert werden soll. Und es
teilt dieselbe Hauptüberraschung — es gibt einen Pfad zurück, es speichert keine Datei — plus eine
eigene Tücke rund um Dateiformate, die scheinbar beschädigte Dateien erzeugt, wenn Sie sie übersehen.
Wenn Sie die GetOpenFilename-Anleitung gelesen haben, wird Ihnen das meiste davon vertraut vorkommen; die
letzten beiden Abschnitte sind der Ort, an dem die Unterschiede wohnen.
Was Sie lernen
- Das mentale Modell, das
GetSaveAsFilename,GetOpenFilenameundFileDialogverbindet - Warum es einen Pfad zurückgibt, keine gespeicherte Datei — und die
SaveAs-Zeile, die Sie noch schulden - Wieder die Abbrechen-Falle: Es gibt
Falsezurück, die Variable muss alsoAs Variantsein - Einen Standardnamen und -ordner mit
InitialFileNamevorschlagen - Die Format-Falle: Die Erweiterung, die der Benutzer sieht, entscheidet nicht über den Dateityp
- Wann Sie es statt des
FileDialog-Typs SaveAs verwenden
Das mentale Modell: eine Haftnotiz mit der Frage „wohin speichern?“
Wie sein Geschwister reicht GetSaveAsFilename dem Benutzer eine Haftnotiz — diese fragt „wohin
speichern, und unter welchem Namen?“ Der Benutzer stöbert, tippt einen Namen, klickt auf Speichern, und
Sie bekommen den Pfad zurück, den er gewählt hat. Nichts wird auf die Festplatte geschrieben:
path = Application.GetSaveAsFilename(...) ' gibt eine PFAD-Zeichenfolge zurueck
ActiveWorkbook.SaveAs Filename:=path ' SIE schreiben die Datei
Die Meldung „GetSaveAsFilename hat keine Datei erstellt“ ist dasselbe Missverständnis wie beim
Geschwister, nur umgedreht: Die Funktion sammelt nur das Ziel ein. Das eigentliche Speichern —
ActiveWorkbook.SaveAs, Workbook.SaveCopyAs oder das Schreiben von Text mit einem
FileSystemObject — ist Ihre nächste Zeile. Nach dem Speicherort fragen
und speichern sind zwei Schritte.
Die Abbrechen-Falle, noch einmal: Dim As Variant
Abbrechen verhält sich genau wie in GetOpenFilename: Die Funktion gibt
den Wahrheitswert False zurück, die Variable muss also entweder einen Pfad oder einen Wahrheitswert
halten können:
Dim path As Variant ' RICHTIG - ein Pfad-String ODER der Wahrheitswert False
' Dim path As String ' FALSCH - False wird zum Text "False", also schreibt SaveAs eine Datei namens False
Mit As String wird das abgebrochene False in den Text "False" umgewandelt, If path = False greift
nie, und SaveAs schreibt fröhlich eine Arbeitsmappe, die wörtlich False heißt, in das aktuelle
Verzeichnis. path As Variant zu deklarieren und If path = False Then Exit Sub zu prüfen ist die ganze
Lösung.
Einen Standardnamen mit InitialFileName vorschlagen
Die besten Speichern-Dialoge öffnen sich mit einem sinnvollen Namen, der bereits eingetragen ist. Das ist
das Argument InitialFileName — und es kann auch einen Ordner tragen, sodass sich der Dialog dort öffnet,
wo Sie wollen:
' Einen datierten Namen in einem bestimmten Ordner vorbelegen
path = Application.GetSaveAsFilename( _
InitialFileName:="C:\Reports\Sales " & Format(Date, "yyyy-mm-dd") & ".xlsx", _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
Benannte Argumente zu verwenden (InitialFileName:=, FileFilter:=) hält den Aufruf lesbar, denn
GetSaveAsFilename hat mehrere optionale Parameter, und positionsbezogene Kommas werden schwer zu zählen.
Ein vorbelegter, datierter Name ist eine kleine Feinheit, die ein Makro fertig wirken lässt.
Die Format-Falle: Die Erweiterung ist nicht das Format
Das ist die Tücke, die nur beim Speichern auftritt, und sie erwischt alle, die annehmen, die Erweiterung
des Dialogs steuere den Dateityp. Tut sie nicht. GetSaveAsFilename gibt eine Zeichenfolge zurück; das
echte Dateiformat entscheidet das Argument FileFormat, das Sie an SaveAs
übergeben:
' NICHTUeBEREINSTIMMUNG - Pfad endet auf .xlsx, aber Sie weisen SaveAs an, das alte Binaerformat zu schreiben
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlExcel8 ' -> eine Datei, die sich nicht sauber oeffnen laesst
' UeBEREINSTIMMUNG - Erweiterung und FileFormat stimmen ueberein
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlOpenXMLWorkbook ' .xlsx
ActiveWorkbook.SaveAs Filename:="Book.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' .xlsm
Wenn die Erweiterung im Pfad und die FileFormat-Konstante nicht übereinstimmen, schreibt Excel Bytes in
einem Format unter einem Namen, der ein anderes behauptet — und die Datei wirft einen Fehler, wenn jemand
darauf doppelklickt. Entscheiden Sie das Format also in Ihrem Code und übergeben Sie das passende
FileFormat; nehmen Sie nicht an, dass das .xlsx, das der Benutzer im Dialog gesehen hat, irgendetwas
bewirkt hätte. Wenn Sie mehrere Filter anbieten, lesen Sie aus, welchen der Benutzer gewählt hat (über den
FilterIndex, auf dem er den Dialog verlässt), und wählen Sie das passende FileFormat.
GetSaveAsFilename oder FileDialog SaveAs? Nach der Kontrolle wählen
Für „frag, wohin gespeichert werden soll, und gib mir den Pfad“ ist GetSaveAsFilename das direkte,
einzeilige Werkzeug. Greifen Sie zu FileDialog mit msoFileDialogSaveAs,
wenn Sie das Dialog-Objekt wollen — für seine .Execute-Methode oder um denselben
.SelectedItems-Auslesestil beizubehalten, den Sie anderswo verwenden. Um zu fragen, was geöffnet
werden soll, statt wohin gespeichert werden soll, ist das Spiegelbild
GetOpenFilename. Alle drei geben einen Pfad zurück und überlassen das
Handeln Ihnen.
Wie ExcelMaster hilft
Die Fehler hier sind die, die sich erst später zeigen: eine Arbeitsmappe namens False aus einem nicht
abgesicherten Abbruch und eine Datei, die sich nicht öffnen lässt, weil Erweiterung und FileFormat nicht
übereinstimmten. Keiner löst einen Fehler aus, während das Makro läuft — sie treten zutage, wenn jemand
versucht, die Datei zu verwenden.
ExcelMaster lässt Sie das
Ergebnis beschreiben — „lass mich wählen, wohin ich dieses Blatt als datierte CSV speichere“ — und
schreibt den GetSaveAsFilename-Aufruf mit der Variant-Absicherung gegen Abbruch, einem sinnvollen
Standardnamen und einem SaveAs, dessen FileFormat zur Erweiterung passt. Sie behalten die
Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie verwende ich GetSaveAsFilename in Excel VBA?
Rufen Sie path = Application.GetSaveAsFilename(InitialFileName, FileFilter, FilterIndex, Title) auf.
Deklarieren Sie path As Variant, prüfen Sie If path = False Then Exit Sub, um einen Abbruch
abzufangen, und speichern Sie dann mit ActiveWorkbook.SaveAs Filename:=path, FileFormat:=.... Die
Funktion gibt nur den gewählten Pfad zurück — sie speichert die Datei nicht selbst.
Warum speichert GetSaveAsFilename die Datei nicht?
Weil es nur den Zielpfad einsammeln soll, nicht etwas schreiben. Es zeigt den Speichern-unter-Dialog und
gibt den Pfad zurück, den der Benutzer gewählt hat. Das eigentliche Speichern führen Sie in der nächsten
Zeile aus — ActiveWorkbook.SaveAs Filename:=path für eine Arbeitsmappe oder ein
FileSystemObject für Text. Nach dem Speicherort fragen und speichern
sind getrennte Schritte.
Wie setze ich einen Standard-Dateinamen im Speichern-unter-Dialog?
Übergeben Sie das Argument InitialFileName: Application.GetSaveAsFilename(InitialFileName:="Report.xlsx").
Es kann neben einem Namen auch einen Ordner enthalten, sodass
"C:\Reports\Report " & Format(Date, "yyyy-mm-dd") & ".xlsx" den Dialog in jenem Ordner öffnet, mit einem
datierten Namen vorbelegt und bereit zum Übernehmen oder Bearbeiten.
Wie erkenne ich Abbrechen in GetSaveAsFilename?
Deklarieren Sie die Variable As Variant und prüfen Sie If path = False Then Exit Sub. Bei Abbruch gibt
die Funktion den Wahrheitswert False zurück; im Erfolgsfall gibt sie eine Pfad-Zeichenfolge zurück. Mit
einer As String-Variablen wird das False in den Text "False" umgewandelt, die Prüfung greift nie, und
SaveAs schreibt eine Datei, die wörtlich False heißt.
Warum lässt sich meine gespeicherte Datei nach der Verwendung von GetSaveAsFilename nicht öffnen?
Fast immer, weil die Erweiterung im Pfad und das FileFormat, das Sie an SaveAs übergeben haben, nicht
übereinstimmen — zum Beispiel ein .xlsx-Name, gespeichert mit FileFormat:=xlExcel8. Excel schreibt ein
Format unter einem Namen, der ein anderes behauptet, und die Datei wirft beim Öffnen einen Fehler.
Entscheiden Sie das Format im Code und übergeben Sie die passende FileFormat-Konstante
(xlOpenXMLWorkbook für .xlsx, xlOpenXMLWorkbookMacroEnabled für .xlsm).
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 26.09.2026.
Verwandte Anleitungen: VBA GetOpenFilename · VBA FileDialog · VBA Save Workbook · VBA InputBox · VBA FileSystemObject · VBA Workbook
