VBA Tipp: Dateiauswahl-Dialog 1

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte den Windows-Dateiauswahl-Dialog aufrufen, um eine oder mehrere Dateien auszuwählen und den oder die Dateipfade als Rückgabewert anzuzeigen.

Lösung

Das geht ab Access 2002 über das FileDialog-Objekt mit der folgenden Enumeration und VBA-Funktion, die in einem allgemeinen (globalen) Modul gespeichert werden.
Hinweis von Microsoft: Die Konstanten msoFileDialogOpen und msoFileDialogSaveAs werden in Microsoft Access nicht unterstützt.


Argumente der Funktion:

  • Dateityp: Voreinstellung einer bestimmten Dateityp-Gruppe als Auswahlmöglichkeit. Der Standardwert ist Alle Dateien (*.*).
  • Startpfad: Vorgabe eines Start-Verzeichnisses oder eines Start-Dateipfades
  • ButtonBeschriftung: Alternative Beschriftung der Bestätigungs-Schaltfläche. Die Beschriftung wird erst dann angezeigt, wenn die unter Startpfad vorgegebene Datei existiert oder wenn eine Datei ausgewählt wurde. Der Standardwert ist Öffnen.
  • Fenstertitel: Alternativer Titel des Dateiauswahl-Dialogfensters. Der Standardwert ist Datei öffnen.
  • Mehrfachauswahl: Wenn True, können mehrere Dateien ausgewählt werden. Der Standardwert ist False.
Option Compare Database
Option Explicit
 
' Enumeration von möglichen Dateitypen
Public Enum Dateitypen
  cProgramme = 1
  cMSAccess = 2
  cMSWord = 4
  cBilder = 8
  cAlleDateien = 16
  ' Die Enumeration ist nicht komplett, und kann ggf. um weitere Dateitypen erweitert werden,
  ' z.B. cNächsterDateityp = 32 usw.
End Enum
 
Public Function Dateidialog(Optional Dateityp As Dateitypen = cAlleDateien, _
                            Optional Startpfad As String, _
                            Optional ButtonBeschriftung As String, _
                            Optional Fenstertitel As String, _
                            Optional Mehrfachauswahl As Boolean) As String
 
 ' Late Binding, kein Verweis auf 'Microsoft Office xx.x Object Library' notwendig
 ' Quelle: http://www.dbwiki.net/
 
 Dim fd         As Object   ' Office.FileDialog
 Dim i          As Long
 Dim strfilter  As String
 
 Const msoFileDialogFilePicker As Long = 3
 
 Set fd = Application.FileDialog(msoFileDialogFilePicker)
 
 ' Filter:
 fd.Filters.Clear
 
 ' Gewählte Dateitypen auslesen
 ' i legt die Reihenfolge im Kombifeld der Dateitypen (= Filterindex) fest.
 
 ' Enum Dateitypen.Programme
 If (Dateityp And Dateitypen.cProgramme) = Dateitypen.cProgramme Then
   i = i + 1
   fd.Filters.Add "Programme", "*.exe", i
 End If
 
 ' Enum Dateitypen.cMSAccess
 If (Dateityp And Dateitypen.cMSAccess) = Dateitypen.cMSAccess Then
   i = i + 1
   strfilter = "*.accdb;*.mdb;*.adp;*.mda;*.accda;*.mde;*.accde;*.ade"
   fd.Filters.Add "Microsoft Access", strfilter, i
 End If
 
 ' Enum Dateitypen.cMSWord
 If (Dateityp And Dateitypen.cMSWord) = Dateitypen.cMSWord Then
   i = i + 1
   strfilter = "*.docx;*.docm;*.dotx;*.dotm;*.doc;*.dot;"
   strfilter = strfilter & "*.htm;*.html;*.rtf;*.mht;*.mhtml;*.xml;*.odt"
   fd.Filters.Add "Microsoft Word", strfilter, i
 End If
 
 ' Enum Dateitypen.cBilder
 If (Dateityp And Dateitypen.cBilder) = Dateitypen.cBilder Then
   i = i + 1
   fd.Filters.Add "Bilddateien", "*.gif;*.jpg;*.png;*.bmp;*.pdf", i
 End If
 
 ' Enum Dateitypen.cAlleDateien
 If (Dateityp And Dateitypen.cAlleDateien) = Dateitypen.cAlleDateien Then
   i = i + 1
   fd.Filters.Add "Alle Dateien", "*.*", i
 End If
 
 ' Filterindex auf den ersten Eintrag im Kombifeld der Dateitypen setzen
 ' (0 ist nicht erlaubt)
 fd.FilterIndex = 1
 
 ' Mehrfachauswahl von Dateien
 fd.AllowMultiSelect = Mehrfachauswahl
 
 ' Fenstertitel
 fd.Title = Fenstertitel
 
 ' Beschriftung der Bestätigungs-Schaltfläche
 fd.ButtonName = ButtonBeschriftung
 
 ' Kompletter Dateipfad oder nur Ordnerpfad als Startordner
 fd.InitialFileName = Startpfad
 
 
 ' Dialog Anzeigen:
 
 ' Der Benutzer hat die Bestätigungs-Schaltfläche gedrückt
 If fd.Show Then
 
   ' Mehrere Dateien werden durch "|" getrennt zurückgegeben.
   For i = 1 To fd.SelectedItems.Count
     Dateidialog = Dateidialog & "|" & fd.SelectedItems(i)
   Next i
   Dateidialog = Mid(Dateidialog, 2)
 
 ' Der Benutzer hat 'Abbrechen' gedrückt
 Else
   Dateidialog = vbNullString
 End If
 
 Set fd = Nothing
 
End Function

Aufruf

Hinweis:
Um die über den Dateiauswahl-Dialog ausgewählte Datei anschließend gleich zu öffnen, kann die Funktion ShellExecute verwendet werden.

 Dim strPfad  As String
 Dim varelem  As Variant
 Dim arr()    As String
 
 ' Beispiel 1: Dateiauswahldialog mit Standardwerten öffnen
 strPfad = Dateidialog
 
 ' Beispiel 2: Dateiauswahldialog mit Argumenten öffnen
 ' Argumente: Dateitypen, Startordner, Schaltflächenbeschriftung
 strPfad = Dateidialog(cAlleDateien + cMSAccess, _
                       CurrentProject.Path & "\MeineDatenbank.mdb", "OK")
 
 ' Beispiel 3: Dateiauswahldialog mit Argumenten öffnen
 ' Argumente: Dateitypen, Startordner, Schaltflächenbeschriftung
 '            Fenstertitel, Mehrfachauswahl von Dateien möglich
 strPfad = Dateidialog(cProgramme + cAlleDateien, _
                       Environ("ProgramFiles"), "Übernehmen", "Dateien auswählen", True)
 
 
 ' Auswertung des Rückgabewerts
 If Len(strPfad) Then
   MsgBox strPfad
 Else
   ' Abbrechen gedrückt
 End If
 
 ' Falls mehrere Dateien ausgewählt wurden, Dateien im Direktfenster auflisten
 arr() = Split(strPfad, "|")
 For Each varelem In arr()
   Debug.Print varelem
 Next varelem

Aufruf

Hinweis:
Um die über den Dateiauswahl-Dialog ausgewählte Datei anschließend gleich zu öffnen, kann die Funktion ShellExecute verwendet werden.

 Dim strPfad  As String
 Dim varelem  As Variant
 Dim arr()    As String
 
 ' Beispiel 1: Dateiauswahldialog mit Standardwerten öffnen
 strPfad = Dateidialog
 
 ' Beispiel 2: Dateiauswahldialog mit Argumenten öffnen
 ' Argumente: Dateitypen, Start-Dateipfad, Schaltflächenbeschriftung
 strPfad = Dateidialog(cAlleDateien + cMSAccess, _
                       CurrentProject.Path & "\MeineDatenbank.mdb", "OK")
 
 ' Beispiel 3: Dateiauswahldialog mit Argumenten öffnen
 ' Argumente: Dateitypen, Startordner, Schaltflächenbeschriftung
 '            Fenstertitel, Mehrfachauswahl von Dateien möglich
 strPfad = Dateidialog(cProgramme + cAlleDateien, _
                       Environ("ProgramFiles"), "Übernehmen", "Dateien auswählen", True)
 
 
 ' Auswertung des Rückgabewerts
 If Len(strPfad) Then
   MsgBox strPfad
 Else
   ' Abbrechen gedrückt
 End If
 
 ' Falls mehrere Dateien ausgewählt wurden, Dateien im Direktfenster auflisten
 arr() = Split(strPfad, "|")
 For Each varelem In arr()
   Debug.Print varelem
 Next varelem

Wikilinks

Weblinks