TL;DR —
Application.FileDialogöffnet den Standard-Windows-Auswahldialog, damit der Benutzer eine Datei oder einen Ordner wählt, statt dass Sie einen Pfad fest verdrahten. Wählen Sie einen Typ —msoFileDialogFilePicker,msoFileDialogFolderPicker,msoFileDialogSaveAsodermsoFileDialogOpen. Rufen Sie.Showauf: Es gibt-1zurück, wenn der Benutzer etwas gewählt hat, und0, wenn er abgebrochen hat — nicht den Pfad. Der Pfad steht in.SelectedItems(1), einer 1-basierten Auflistung.FileDialoggibt Ihnen einen Pfad; öffnen oder speichern müssen Sie ihn immer noch selbst.
Sub PickAFile()
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "Choose a workbook"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xlsx;*.xlsm"
If .Show <> -1 Then Exit Sub ' -1 = gewaehlt, 0 = abgebrochen
MsgBox "You picked: " & .SelectedItems(1) ' 1-basierte Auflistung
End With
End Sub
"C:\Users\Me\Reports\Jan.xlsx" fest in ein Makro zu verdrahten ist der schnellste Weg, es in dem
Moment zu zerbrechen, in dem jemand anderes es ausführt. Die professionelle Gewohnheit ist zu fragen.
VBA gibt Ihnen dafür drei Werkzeuge, und die eine Idee hinter allen dreien sollten Sie sich zuerst
klarmachen: Diese Werkzeuge geben eine Pfad-Zeichenfolge zurück — sie öffnen, speichern oder berühren
keine Datei. Den Pfad zu bekommen und auf dem Pfad zu handeln sind zwei getrennte Schritte.
FileDialog ist das leistungsfähigste der drei, weil es als einziges auch nach einem Ordner fragen
kann.
Was Sie lernen
- Das mentale Modell, das
FileDialog,GetOpenFilenameundGetSaveAsFilenameverbindet - Die vier Dialogtypen und wofür jeder gedacht ist
- Warum
.Show-1und0zurückgibt stattTrue/False, und wie Sie es abfragen - Wie Sie das Ergebnis aus
.SelectedItemsauslesen, einer 1-basierten Auflistung - Einen Ordner mit
FolderPickerwählen — das, was die einfacheren Funktionen nicht können - Mehrfachauswahl zulassen, Filter hinzufügen und die Reset-Falle des gemeinsam genutzten Objekts
Das mentale Modell: ein konfigurierbarer Auswahldialog, den Sie danach auslesen
Application.FileDialog ist keine Funktion, die einen Pfad zurückgibt. Es ist ein Objekt, das Sie
konfigurieren, anzeigen und dann auslesen. Der Ablauf besteht immer aus denselben drei Takten:
Set fd = Application.FileDialog(msoFileDialogFilePicker) ' 1. den TYP waehlen
' ... .Title, .Filters, .AllowMultiSelect setzen ... ' 2. konfigurieren
If fd.Show = -1 Then answer = fd.SelectedItems(1) ' 3. anzeigen, dann die Auswahl auslesen
.Show blockiert, bis der Benutzer auf eine Schaltfläche klickt, und liefert einen Status zurück,
nicht den Pfad. Der Pfad — oder die Pfade — landen in .SelectedItems. Halten Sie diese beiden Ideen
auseinander, und das ganze Objekt ergibt Sinn: den Dialog anzeigen und die Auswahl auslesen sind
verschiedene Zeilen. Alles Weitere auf dieser Seite ist die Frage, welchen Typ Sie wählen und wie Sie
das Ergebnis auslesen.
Die vier Dialogtypen
Die Aufgabe des Dialogs bestimmen Sie über die Konstante, die Sie an Application.FileDialog(...)
übergeben:
Application.FileDialog(msoFileDialogFilePicker) ' eine oder mehrere vorhandene Dateien waehlen
Application.FileDialog(msoFileDialogFolderPicker) ' einen Ordner waehlen (keine Datei)
Application.FileDialog(msoFileDialogOpen) ' wie FilePicker, plus ein .Execute, das oeffnet
Application.FileDialog(msoFileDialogSaveAs) ' einen Speicherpfad und -namen waehlen
Für 90 % der Makros wollen Sie msoFileDialogFilePicker (eine Datei zum Lesen holen) oder
msoFileDialogFolderPicker (einen Ordner, über den Sie iterieren). Die Typen Open und SaveAs
bringen eine zusätzliche .Execute-Methode mit, die das Öffnen oder Speichern tatsächlich ausführt,
aber Sie brauchen sie selten — den Pfad auszulesen und Workbooks.Open
oder SaveAs selbst aufzurufen ist klarer und gibt Ihnen die Kontrolle
darüber, was als Nächstes geschieht.
Warum .Show -1 und 0 zurückgibt
Das ist das Detail, über das alle stolpern, die von .Show den gewählten Pfad erwarten. Es gibt einen
ganzzahligen Status zurück:
If fd.Show = -1 Then
' Benutzer hat OK / Oeffnen / Speichern geklickt - eine Auswahl existiert
Else
' Benutzer hat Abbrechen geklickt - .SelectedItems ist leer, NICHT auslesen
End If
-1 bedeutet, dass eine Auswahl getroffen wurde; 0 bedeutet, dass der Benutzer abgebrochen hat.
Zufällig ist -1 das, was VBA True nennt, sodass sowohl If fd.Show = -1 als auch If fd.Show
funktionieren — schreiben Sie aber = -1, weil es sagt, was die Zahl bedeutet. Die wichtigere Hälfte
ist das Else: Hat der Benutzer abgebrochen, ist .SelectedItems leer, und SelectedItems(1) löst
einen Laufzeitfehler aus. Sichern Sie den Abbruch immer ab, bevor Sie auslesen.
Das Ergebnis auslesen: SelectedItems ist 1-basiert
Die Auswahl des Benutzers ist eine Auflistung, .SelectedItems, und wie jede VBA-Auflistung zählt sie
ab 1, nicht ab 0:
If fd.Show = -1 Then
Dim i As Long
For i = 1 To fd.SelectedItems.Count ' Auflistungen sind 1-basiert
Debug.Print fd.SelectedItems(i) ' jedes Element ist eine vollstaendige Pfad-Zeichenfolge
Next i
End If
Bei der Auswahl einer einzelnen Datei ist .SelectedItems(1) schon alles. Die Schleife
For i = 1 To .Count zählt erst, wenn Sie die Mehrfachauswahl einschalten — und diese Schleife bei 0
zu beginnen ist der klassische Off-by-one-Fehler, der „Index außerhalb des gültigen Bereichs“ auslöst.
Jedes Element ist ein vollständiger Pfad, den Sie direkt an Workbooks.Open,
Dir oder ein FileSystemObject übergeben können.
Einen Ordner wählen — das, was nur FileDialog kann
Hier ist der Grund, warum sich FileDialog seinen Platz neben den einfacheren Funktionen verdient:
GetOpenFilename kann nur eine Datei zurückgeben. Wenn Sie einen
Ordner brauchen — etwa um über jede darin enthaltene Arbeitsmappe zu iterieren —, ist FolderPicker
das Werkzeug:
Sub PickAFolder()
Dim fd As FileDialog, folderPath As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
If fd.Show <> -1 Then Exit Sub
folderPath = fd.SelectedItems(1)
If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\" ' normalisieren
MsgBox "Chosen folder: " & folderPath
End Sub
Der Ordner kommt ohne abschließenden Backslash zurück, wenn Sie also gleich einen Dateinamen anhängen
(folderPath & "Report.xlsx"), fügen Sie den \ selbst hinzu — ihn zu vergessen ist der häufigste Bug
in Ordnerschleifen-Makros. Von hier aus läuft Dir(folderPath & "*.xlsx") durch jede Arbeitsmappe im
Ordner.
Mehrfachauswahl, Filter und die Reset-Falle
Zwei Einstellungen decken den größten Teil des Rests ab. AllowMultiSelect = True lässt den Benutzer
mehrere Dateien wählen, und genau dann zahlt sich die obige Schleife For i = 1 To .Count aus. Filter
schränken ein, was der Dialog anzeigt:
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = True
.Filters.Clear ' zuerst ZURUeCKSETZEN - siehe unten
.Filters.Add "Spreadsheets", "*.xlsx;*.xlsm;*.xls"
.Filters.Add "All Files", "*.*"
If .Show = -1 Then MsgBox .SelectedItems.Count & " file(s) chosen"
End With
Die Falle, die einen Namen verdient: Application.FileDialog ist ein einziges, gemeinsam genutztes
Objekt. Filter und Einstellungen aus einem früheren Aufruf können noch darin stecken. Rufen Sie immer
.Filters.Clear auf, bevor Sie Ihre eigenen hinzufügen, und setzen Sie .AllowMultiSelect jedes Mal
explizit, sonst sickert eine versprengte Einstellung von früher in der Sitzung in Ihren Dialog. Das
Objekt als frisch zu behandeln, obwohl es in Wahrheit geteilt wird, ist ein stiller, schwer
reproduzierbarer Bug.
FileDialog oder GetOpenFilename? Wählen Sie nach dem, was Sie zurückbekommen
Wenn Sie einen Ordner brauchen oder den umfangreichsten Dialog wollen (Mehrfachauswahl plus
feingranulare Filter), ist FileDialog die Antwort. Wenn Sie nur einen Dateipfad zum Lesen
brauchen, ist GetOpenFilename eine einzige Zeile und gibt den Pfad
direkt zurück — kein Objekt, kein .SelectedItems. Wenn Sie einen Pfad zum Speichern brauchen, ist
das GetSaveAsFilename. Alle drei folgen derselben Regel: Sie geben
Ihnen einen Pfad, und das Öffnen oder Speichern ist immer noch Ihre nächste Zeile.
Wie ExcelMaster hilft
Die beiden Fehler auf dieser Seite sind stille: .SelectedItems auszulesen, nachdem der Benutzer
abgebrochen hat (ein Laufzeitfehler), und den abschließenden Backslash zu vergessen, wenn Sie aus einem
gewählten Ordner einen Pfad aufbauen (eine Datei, die am falschen Ort landet). Beide sind leicht
geschrieben und mühsam nachzuvollziehen.
ExcelMaster lässt Sie den Schritt
in klaren Worten beschreiben — „lass mich einen Ordner wählen und dann jede Arbeitsmappe darin öffnen“ —
und schreibt den FileDialog-Code, der den Abbruch absichert, den Pfad normalisiert und korrekt über die
Dateien iteriert. Sie behalten die Arbeitsmappe und den Code und ersparen sich den Off-by-one-Fehler.
Häufig gestellte Fragen
Wie öffne ich in Excel VBA einen Dateidialog?
Erstellen Sie das Objekt mit Set fd = Application.FileDialog(msoFileDialogFilePicker), konfigurieren
Sie es (.Title, .Filters, .AllowMultiSelect) und rufen Sie dann fd.Show auf. .Show gibt -1
zurück, wenn der Benutzer etwas gewählt hat, und 0, wenn er abgebrochen hat. Lesen Sie den gewählten
Pfad aus fd.SelectedItems(1). Beachten Sie, dass dies nur den Pfad zurückgibt — zum Öffnen rufen Sie
immer noch Workbooks.Open auf.
Wie lasse ich den Benutzer in VBA einen Ordner wählen?
Verwenden Sie Application.FileDialog(msoFileDialogFolderPicker). Das ist der einzige Dateidialog, der
einen Ordner statt einer Datei zurückgibt — GetOpenFilename kann das
nicht. Lesen Sie nach If fd.Show = -1 Then den Ordnerpfad aus fd.SelectedItems(1) und hängen Sie
einen Backslash an, bevor Sie einen Dateinamen ergänzen, denn der Ordner kommt ohne abschließenden \
zurück.
Warum gibt FileDialog.Show -1 zurück statt des Dateipfads?
Weil .Show einen Status zurückgibt, nicht den Pfad: -1 bedeutet, dass der Benutzer eine Auswahl
getroffen hat, 0 bedeutet, dass er abgebrochen hat. Der ausgewählte Pfad (oder die Pfade) leben in der
Auflistung .SelectedItems. Prüfen Sie zuerst If fd.Show = -1 Then und lesen Sie .SelectedItems(1)
nur dann aus, wenn es -1 ist, denn nach einem Abbruch ist diese Auflistung leer, und sie zu indizieren
löst einen Fehler aus.
Wie wähle ich mit FileDialog mehrere Dateien aus?
Setzen Sie .AllowMultiSelect = True, bevor Sie .Show aufrufen. Wenn der Benutzer mehrere Dateien
wählt, iterieren Sie mit For i = 1 To fd.SelectedItems.Count und lesen jeden Pfad mit
fd.SelectedItems(i) aus. Die Auflistung ist 1-basiert, beginnen Sie die Schleife also bei 1, nicht
bei 0 — bei 0 zu beginnen löst „Index außerhalb des gültigen Bereichs“ aus.
Was ist der Unterschied zwischen FileDialog und GetOpenFilename?
GetOpenFilename ist eine einzeilige Funktion, die eine
Dateipfad-Zeichenfolge zurückgibt (oder False bei Abbruch) — am einfachsten, wenn Sie nur eine Datei
zum Lesen brauchen. FileDialog ist ein konfigurierbares Objekt, das auch Ordner wählen, eine
umfangreichere Mehrfachauswahl bieten und (über .Execute) direkt öffnen oder speichern kann. Nehmen
Sie GetOpenFilename für den Normalfall, FileDialog, wenn Sie einen Ordner oder die zusätzliche
Kontrolle brauchen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 26.09.2026.
Verwandte Anleitungen: VBA GetOpenFilename · VBA GetSaveAsFilename · VBA Open Workbook · VBA Dir · VBA FileSystemObject · VBA For Each
