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

VBA GetOpenFilename in Excel — einen Dateipfad holen und dann selbst öffnen

|

VBA GetOpenFilename in Excel — einen Dateipfad holen und dann selbst öffnen

TL;DR — Application.GetOpenFilename zeigt 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 noch Workbooks.Open auf. Klickt der Benutzer auf Abbrechen, gibt es den Wahrheitswert False zurück, deklarieren Sie die Variable also As Variant (nie As String) und prüfen Sie If 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, GetSaveAsFilename und FileDialog verbindet
  • Warum es einen Pfad zurückgibt, keine geöffnete Arbeitsmappe — und die eine Zeile, die Sie noch schulden
  • Die Abbrechen-Falle: Es gibt False zurück, die Variable muss also As Variant sein
  • Die FileFilter-Syntax, mit mehreren Erweiterungen und mehreren Filtergruppen
  • Mehrere Pfade auf einmal mit MultiSelect:=True zurückgeben (ein 1-basiertes Array)
  • Wann GetOpenFilename genügt und wann Sie zu FileDialog aufsteigen

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