🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA GetSaveAsFilename in Excel — nach dem Speicherort fragen, ohne zu speichern

|

VBA GetSaveAsFilename in Excel — nach dem Speicherort fragen, ohne zu speichern

TL;DR — Application.GetSaveAsFilename zeigt 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 noch SaveAs auf. Bei Abbrechen gibt es den Wahrheitswert False zurück, deklarieren Sie die Variable also As Variant und prüfen Sie If path = False Then Exit Sub. Und das echte Format der Datei kommt aus dem FileFormat, das Sie an SaveAs ü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, GetOpenFilename und FileDialog verbindet
  • Warum es einen Pfad zurückgibt, keine gespeicherte Datei — und die SaveAs-Zeile, die Sie noch schulden
  • Wieder die Abbrechen-Falle: Es gibt False zurück, die Variable muss also As Variant sein
  • Einen Standardnamen und -ordner mit InitialFileName vorschlagen
  • 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