TL;DR —
Application.GetOpenFilenamezeigt den Öffnen-Dialog und gibt den Pfad, den der Benutzer gewählt hat, als Zeichenfolge zurück — es öffnet die Datei nicht. Um sie tatsächlich zu öffnen, rufen Sie immer nochWorkbooks.Openauf. Klickt der Benutzer auf Abbrechen, gibt es den WahrheitswertFalsezurück, deklarieren Sie die Variable alsoAs Variant(nieAs String) und prüfen SieIf fname = False Then Exit Sub, bevor Sie sie verwenden.
Sub AskThenOpen()
Dim fname As Variant ' Variant, damit Abbrechen False zurueckgeben kann
fname = Application.GetOpenFilename( _
"Excel Files (*.xlsx;*.xlsm), *.xlsx;*.xlsm", , "Choose a workbook")
If fname = False Then Exit Sub ' Benutzer hat abgebrochen
Workbooks.Open fname ' GetOpenFilename lieferte nur den Pfad
End Sub
GetOpenFilename ist der kürzeste Weg, um mit dem Fest-Verdrahten von Pfaden aufzuhören. Es zeigt den
vertrauten Öffnen-Dialog, lässt den Benutzer stöbern und reicht Ihnen zurück, was er gewählt hat. Aber
zwei Tatsachen darüber verursachen die meisten Fragen im Netz, und beide entspringen demselben
Missverständnis: Diese Funktion gibt einen Pfad zurück — sie öffnet die Datei nicht, und sie scheitert
nicht lautstark, wenn der Benutzer abbricht. Bringen Sie diese beiden gerade, und es ist ein Einzeiler,
zu dem Sie ständig greifen werden.
Was Sie lernen
- Das mentale Modell, das
GetOpenFilename,GetSaveAsFilenameundFileDialogverbindet - Warum es einen Pfad zurückgibt, keine geöffnete Arbeitsmappe — und die eine Zeile, die Sie noch schulden
- Die Abbrechen-Falle: Es gibt
Falsezurück, die Variable muss alsoAs Variantsein - Die
FileFilter-Syntax, mit mehreren Erweiterungen und mehreren Filtergruppen - Mehrere Pfade auf einmal mit
MultiSelect:=Truezurückgeben (ein 1-basiertes Array) - Wann
GetOpenFilenamegenügt und wann Sie zuFileDialogaufsteigen
Das mentale Modell: eine Haftnotiz mit der Frage „welche Datei?“
Stellen Sie sich GetOpenFilename so vor, als reichten Sie dem Benutzer eine Haftnotiz mit der Frage
„welche Datei?“ — er schreibt einen Pfad auf und gibt sie zurück. Mehr tut es nicht. Es geht nicht zum
Aktenschrank und zieht die Datei heraus:
fname = Application.GetOpenFilename(...) ' gibt eine PFAD-Zeichenfolge zurueck, z. B. "C:\Data\Jan.xlsx"
Workbooks.Open fname ' SIE uebernehmen das Oeffnen
Die mit Abstand häufigste Meldung „GetOpenFilename funktioniert nicht“ heißt in Wahrheit „Ich habe es aufgerufen, und meine Datei ging nicht auf.“ Natürlich nicht — Sie haben den Pfad bekommen; ihn zu öffnen ist eine eigene Zeile. Sobald Sie verinnerlicht haben, dass nach einem Pfad fragen und auf dem Pfad handeln zwei Schritte sind, wird die Funktion einfach und vorhersehbar.
Die Abbrechen-Falle: Rückgabe False, also Dim As Variant
Das ist die Falle, die am härtesten zubeißt. Wenn der Benutzer auf Abbrechen klickt, gibt
GetOpenFilename den Wahrheitswert False zurück. Das zwingt Sie bei der Deklaration der Variablen zu
einer Entscheidung:
Dim fname As Variant ' RICHTIG - kann einen Pfad-String ODER den Wahrheitswert False halten
' Dim fname As String ' FALSCH - False wird zum Text "False" umgewandelt
Wenn Sie fname As String deklarieren, wandelt VBA das zurückgegebene False stillschweigend in die
Zeichenfolge "False" um, sodass If fname = False nie auslöst und Ihr Code mit einem Müll-„Pfad“
namens False weitermarschiert. Es As Variant zu deklarieren belässt den Wahrheitswert ein
Wahrheitswert, sodass If fname = False Then Exit Sub den Abbruch tatsächlich abfängt. Das ist genau
dieselbe Falle wie beim Auslesen einer abgebrochenen InputBox — und die Lösung
ist dieselbe: Halten Sie das Ergebnis in einer Variant und prüfen Sie die Art der Antwort, die Sie
erhalten haben, bevor Sie ihr vertrauen.
Der FileFilter: Beschreibung, Komma, Muster
Das erste Argument steuert, welche Dateien der Dialog anzeigt. Seine Form ist eine Beschreibung, ein Komma, dann das Muster — und Sie können mehrere Gruppen aneinanderreihen:
' Eine Gruppe: Label, dann das/die Muster
fname = Application.GetOpenFilename("Text Files (*.txt), *.txt")
' Mehrere Erweiterungen in einer Gruppe: Muster mit einem Semikolon trennen
fname = Application.GetOpenFilename("Excel Files (*.xlsx;*.xlsm), *.xlsx;*.xlsm")
' Mehrere Gruppen, zwischen denen der Benutzer wechseln kann: Label/Muster-Paare mit Komma trennen
fname = Application.GetOpenFilename( _
"Excel Files, *.xlsx;*.xlsm, CSV Files, *.csv, All Files, *.*")
Innerhalb eines Filters werden mehrere Erweiterungen mit Semikola verbunden (*.xlsx;*.xlsm). Um
mehrere Filter anzubieten, zwischen denen der Benutzer im Dropdown umschalten kann, trennen Sie die
Label/Muster-Paare mit Komma. Das optionale zweite Argument, FilterIndex, bestimmt, welche Gruppe
standardmäßig ausgewählt ist; das dritte, Title, setzt die Titelleiste des Dialogs. Die Regel
Komma-gegen-Semikolon richtig zu treffen ist es, was einen funktionierenden Filter von einem
unterscheidet, der nichts anzeigt.
Mehrere Dateien: MultiSelect gibt ein 1-basiertes Array zurück
Übergeben Sie MultiSelect:=True, und der Rückgabetyp ändert sich: Statt einer Pfad-Zeichenfolge
erhalten Sie ein Array von Pfaden — oder weiterhin False, wenn der Benutzer abgebrochen hat:
Sub OpenSeveral()
Dim files As Variant, i As Long
files = Application.GetOpenFilename( _
"Excel Files, *.xlsx;*.xlsm", , , , True) ' letztes Argument = MultiSelect
If Not IsArray(files) Then Exit Sub ' False (Abbruch) ist kein Array
For i = LBound(files) To UBound(files) ' das Array ist 1-basiert
Workbooks.Open files(i)
Next i
End Sub
Zwei Details zählen. Prüfen Sie IsArray(files) statt = False, denn im Erfolgsfall halten Sie jetzt
ein Array, keine Zeichenfolge. Und iterieren Sie mit LBound bis UBound — das
Array, das GetOpenFilename zurückgibt, beginnt bei 1, und For i = 1 To ... fest zu verdrahten
funktioniert hier zwar zufällig, aber LBound/UBound ist die Gewohnheit, die nie bricht. Jedes Element
ist ein vollständiger Pfad, bereit für Workbooks.Open.
GetOpenFilename oder FileDialog? Wählen Sie nach Ihrem Bedarf
Für die Alltagsaufgabe — nach einer Datei zum Lesen fragen — gewinnt GetOpenFilename durch
Einfachheit: eine Zeile, der Pfad kommt direkt zurück, kein Objekt zu konfigurieren. Steigen Sie zu
FileDialog auf, wenn Sie einen Ordner brauchen (GetOpenFilename kann
keinen wählen), wenn Sie die umfangreichere Kontrolle des Dialog-Objekts wollen oder wenn Sie das
Auslesen aus .SelectedItems bevorzugen. Um zu fragen, wohin gespeichert werden soll, statt was
geöffnet werden soll, ist die Spiegelfunktion GetSaveAsFilename. Alle
drei teilen die Regel: Sie geben einen Pfad zurück, und das Öffnen oder Speichern ist Ihre nächste Zeile.
Wie ExcelMaster hilft
Die beiden Fehler hier sind die leisen: das Ergebnis As String zu deklarieren (sodass der Abbruch als
Text "False" durchrutscht) und zu erwarten, dass die Datei sich öffnet, obwohl Sie nur einen Pfad
erhalten haben. Beide kompilieren einwandfrei und scheitern zur Laufzeit auf dem Rechner eines anderen.
ExcelMaster lässt Sie sagen,
was Sie wollen — „frag mich nach einer CSV und importiere sie dann in ein neues Blatt“ — und schreibt den
GetOpenFilename-Aufruf mit dem richtigen Filter, der Variant-Absicherung gegen Abbruch und dem
Workbooks.Open (oder Import), das tatsächlich auf dem Pfad handelt. Sie behalten die Arbeitsmappe und
den Code.
Häufig gestellte Fragen
Wie verwende ich GetOpenFilename in Excel VBA?
Rufen Sie fname = Application.GetOpenFilename(fileFilter, filterIndex, title) auf. Deklarieren Sie
fname As Variant und prüfen Sie If fname = False Then Exit Sub, um einen Abbruch abzufangen. Im
Erfolgsfall hält fname den gewählten Pfad als Zeichenfolge — übergeben Sie ihn an
Workbooks.Open, um sie zu öffnen. GetOpenFilename selbst gibt nur den
Pfad zurück; es öffnet nichts.
Warum öffnet GetOpenFilename die Datei nicht?
Weil es das nicht soll — es gibt den Pfad zurück, den der Benutzer ausgewählt hat, und hört dort auf.
Die Datei zu öffnen ist ein eigener Schritt: Workbooks.Open fname für eine Arbeitsmappe oder ein
FileSystemObject / Dir für andere Dateien. Der
Dialog fragt nur „welche Datei?“; auf die Antwort zu handeln ist Ihr Code.
Wie prüfe ich, ob der Benutzer in GetOpenFilename auf Abbrechen geklickt hat?
Deklarieren Sie die Variable As Variant und prüfen Sie If fname = False Then Exit Sub. Bei Abbruch
gibt die Funktion den Wahrheitswert False zurück; im Erfolgsfall gibt sie eine Pfad-Zeichenfolge
zurück. Wenn Sie die Variable stattdessen As String deklarieren, wird False in den Text "False"
umgewandelt, die Prüfung greift nie, und das Makro läuft mit einem ungültigen Pfad weiter.
Wie wähle ich mit GetOpenFilename mehrere Dateien aus?
Übergeben Sie MultiSelect:=True (das fünfte Argument). Der Rückgabewert wird zu einem Array von
Pfad-Zeichenfolgen, oder False bei Abbruch. Prüfen Sie zuerst IsArray(result), iterieren Sie dann mit
For i = LBound(result) To UBound(result) und öffnen Sie jedes result(i). Da sich der Rückgabetyp zu
einem Array ändert, prüfen Sie für den Abbruch nicht = False — verwenden Sie IsArray.
Wie lautet die FileFilter-Syntax in GetOpenFilename?
Jeder Filter ist eine Beschreibung, gefolgt von einem Komma und einem Muster:
"Excel Files (*.xlsx), *.xlsx". Verbinden Sie mehrere Erweiterungen in einem Filter mit Semikola:
"*.xlsx;*.xlsm". Bieten Sie mehrere Filter an, indem Sie die Label/Muster-Paare mit Komma trennen:
"Excel, *.xlsx, CSV, *.csv, All, *.*". Das optionale Argument FilterIndex bestimmt, welcher
standardmäßig ausgewählt ist.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 26.09.2026.
Verwandte Anleitungen: VBA FileDialog · VBA GetSaveAsFilename · VBA Open Workbook · VBA InputBox · VBA Dir · VBA UBound
