Ziel: Sauberer Dateiauswahldialog – ohne hässliche API-Bastelei
Die klassischen GetOpenFilename
-Dialoge wirken wie aus Windows 95.
Aber: Mit der FileDialog
-Klasse aus der Office-Bibliothek geht’s heute schicker und strukturierter.
Und Du brauchst keine API-Calls mehr.
Variante 1: Datei öffnen – moderner OpenFileDialog
Public Function DateiAuswaehlen(Optional dateityp As String = "*.*") As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = False
.Title = "Wähle eine Datei"
.Filters.Clear
.Filters.Add "Alle Dateien", dateityp
If .Show = -1 Then
DateiAuswaehlen = .SelectedItems(1)
Else
DateiAuswaehlen = ""
End If
End With
End Function
Aufruf:
Dim pfad As String
pfad = DateiAuswaehlen("Excel-Dateien (*.xlsx), *.xlsx")
If Len(pfad) > 0 Then
MsgBox "Du hast ausgewählt: " & pfad
End If
Variante 2: Ordner auswählen
Public Function OrdnerWaehlen() As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = "Wähle einen Ordner"
If .Show = -1 Then
OrdnerWaehlen = .SelectedItems(1)
Else
OrdnerWaehlen = ""
End If
End With
End Function
Kein zusätzlicher Code nötig – funktioniert sauber mit Netzlaufwerken, UNC, OneDrive (meistens).
Variante 3: Mehrere Dateien auswählen
Public Function MehrereDateienAuswaehlen() As Collection
Dim fd As FileDialog
Dim dateien As New Collection
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = True
.Title = "Wähle mehrere Dateien"
If .Show = -1 Then
Dim i As Integer
For i = 1 To .SelectedItems.Count
dateien.Add .SelectedItems(i)
Next i
End If
End With
Set MehrereDateienAuswaehlen = dateien
End Function
Anwendung:
Dim f As Variant
For Each f In MehrereDateienAuswaehlen()
Debug.Print f
Next
Variante 4: Filter sinnvoll setzen
.Filters.Add "PDF-Dateien", "*.pdf"
.Filters.Add "Word-Dokumente", "*.docx"
.Filters.Add "Alle Dateien", "*.*"
Du kannst mehrere Filter anbieten. Der Nutzer kann umschalten.
Der erste wird standardmäßig ausgewählt.
Variante 5: Datei speichern lassen (SaveAs)
Public Function DateinameSpeichern(Optional vorschlag As String = "Export.xlsx") As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogSaveAs)
With fd
.Title = "Datei speichern unter"
.InitialFileName = vorschlag
If .Show = -1 Then
DateinameSpeichern = .SelectedItems(1)
Else
DateinameSpeichern = ""
End If
End With
End Function
Achtung: .InitialFileName
muss mit gültiger Dateiendung gesetzt werden – sonst kommt beim Speichern nichts.
Best Practices
- Immer
.Show = -1
prüfen → Nutzer kann abbrechen - Bei Pfaden nie mit
Dir()
prüfen, sondernLen()
.Filters.Clear
setzen vor.Filters.Add
- Bei Multiselect: Collection oder Array verwenden
- UNC-Pfade werden unterstützt – wenn Rechte stimmen
Was Access mit FileDialog nicht kann
- keine Vorschauanzeige
- kein File-Tagging oder Metadaten
- keine Integration mit Windows 11 „Modern Explorer UI“
- kein Fortschrittsbalken bei Dateioperationen
- kein native „Open with“ oder Standardprogramme
Aber: Für 95 % der Fälle reicht es völlig.
Fazit für Entwickler
Die FileDialog
-Klasse ist Dein Werkzeug für moderne Dateiinteraktion.
Einfach zu bedienen. Stabil. Ohne Altlasten.
Kein Grund mehr, sich mit GetOpenFilename
oder Shell32 herumzuquälen.
No responses yet