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, sondern Len()
  • .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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert