Wenn Du mit VBA programmierst, wirst Du immer wieder mit Dateien arbeiten. Eine der Hauptaufgaben dabei ist, zu öffnende Dateien auszuwählen, Verzeichnisse zu selektieren oder einen Namen für eine zu speichernde Datei festzulegen. Alles drei lässt sich mit verschiedenen Methoden erledigen, aber es gibt eine Klasse, die alles gleichzeitig anbietet – und zwar die FileDialog-Klasse der Office-Bibliothek. In diesem Artikel schauen wir uns an, wie Du Dateidialoge für die verschiedenen Anwendungszwecke öffnen und auswerten kannst.
Beispielumgebung
Wie immer benötigen wir eine Office-Anwendung oder Entwicklungsumgebung, um mit den Objekten, Eigenschaften und Methoden der Klasse FileDialog zu experimentieren. In diesem Fall wollen wir einmal ein Excel-Workbook nutzen, das wir logischerweise als .xlsm-Datei speichern. Das Worksheet dieser Exceldatei nutzen wir zur Ausgabe der mit der FileDialog-Klasse ermittelten Dateien und dort bringen wir auch die zum Aufruf notwendigen Schaltflächen unter.
Die FileDialog-Klasse verfügbar machen
Um auf die FileDialog-Klasse und ihre Methoden und Eigenschaften zugreifen zu können, benötigen wir entweder einen Verweis auf die Bibliothek Microsoft Office x.0 Object Library oder wir referenzieren diese per Late Binding. Da wir die Vorzüge von IntelliSense zu schätzen wissen, nutzen wir hier die Bibliothek, die wir im VBA-Editor einbinden können.
Von der Excel-Benutzeroberfläche wechseln wir dazu mit der Tastenkombination Alt + F11 zum VBA-Editor. Hier wählen wir den Menüeintrag Extras|Verweise aus. Im nun erscheinenden Verweise-Dialog finden wir gegebenenfalls bereits den markierten Eintrag aus Bild 1 vor. Anderenfalls suchen Sie diesen in der alphabetisch sortieren Liste und fügen ihn durch Setzen eines Hakens in das entsprechende Kästchen hinzu.
Bild 1: Verweis auf die Objektbibliothek Microsoft Office 16.0 Object Li-brary
Einen Dateidialog anzeigen
Grundsätzlich zeigt man einen FileDialog wie folgt an:
Dim objFiledialog As Office.FileDialog Set objFiledialog = _ Application.FileDialog(msoFileDialogFilePicker) objFiledialog.Show
Wir benötigen also eine Objektvariable, die den Typ Office.FileDialog aufweist und füllen diese mit einem Verweis auf die FileDialog-Klasse unter Angabe des Typs, den wir benötigen – in diesem Fall msoFileDialogPicker.
Dann zeigen wir den Dialog mit der Methode Show an. Das Ergebnis dieses einfachen Aufrufs finden wir in Bild 2.
Bild 2: Ein erster Dateidialog zur Auswahl einer Datei
Auswahl im Dateidialog auswerten
Nun können wir nach der Auswahl wie im oben angegebenen Beispiel mit dem Ergebnis noch nichts anfangen. Das erledigen wir, indem wir das Ergebnis des Aufrufs prüfen und dann die selektierten Daten auswerten. Die ersten beiden Zeilen bleiben gleich:
Dim objFiledialog As Office.FileDialog Set objFiledialog = _ Application.FileDialog(msoFileDialogFilePicker)
Danach rufen wir die Show-Methode jedoch als Teil einer If…Then-Bedingung auf und prüfen in dieser das Ergebnis.
Dieses kann True oder False lauten. Es lautet True, wenn der Benutzer die Eingabe mit der OK-Schaltfläche abgeschlossen hat, und False, wenn er die Abbrechen-Schaltfläche wählt. Die OK-Schaltfläche kann der Benutzer übrigens erst betätigen, wenn er eine Datei ausgewählt hat.
Im ersten Fall, also wenn der Benutzer eine Datei ausgewählt und auf die OK-Schaltfläche gedrückt hat, greifen wir mit objFileDialog.SelectedItems(1) auf den ersten ausgewählten Eintrag zu und geben diesen im Direktbereich des VBA-Editors aus.
Im zweiten Fall, also wenn der Benutzer die Abbrechen-Schaltfläche betätigt hat, zeigen wir den Text Keine Datei ausgewählt an:
If objFiledialog.Show = True Then Debug.Print objFiledialog.SelectedItems(1) Else Debug.Print "Keine Datei ausgewählt" End If
Verschiedene Dialogtypen
Wir können verschiedene Dialogtypen nutzen. Dazu gibst Du unterschiedliche Werte beim Zuweisen des FileDialog-Objekts an. Diese lauten:
- msoFileDialogFilePicker: Zeigt einen Dialog zum Auswählen einer oder mehrerer Dateien an.
- msoFileDialogFolderPicker: Zeigt einen Dialog zum Auswählen eines Verzeichnisses an.
- msoFileDialogOpen: Zeigt den gleichen Dialog an wie msoFileDialogFilePicker, jedoch mit dem Titel Öffnen. Ist für Office-Anwendungen wie Word oder Excel geeignet, wo Dokumente so direkt geöffnet werden können.
- msoFileDialogSaveAs: Zeigt einen Dialog zum Angeben einer zu speichernden Datei an. Es kann eine vorhandene Datei ausgewählt werden oder auch ein neuer Dateiname angegeben werden. Die Schaltfläche zum Bestätigen der Eingabe ist hier mit Speichern beschriftet.
Mehrfachauswahl erlauben
Mit der Eigenschaft AllowMultiSelect können Sie festlegen, ob der Benutzer nur einen Eintrag (False) oder mehrere Einträge auswählen kann (True). Diese Eigenschaft stellen wir nach dem Zuweisen der FileDialog-Klasse an die Variable objFileDialog ein:
objFiledialog.AllowMultiSelect = True
Wenn Du so einen msoFileDialogFilePicker-Dialog öffnest, kannst Du beispielsweise bei gedrückter Strg-Taste mehrere Dateien wie in Bild 3 auswählen.
Bild 3: Mehrfachauswahl per FileDialog-Objekt
Danach ist allerdings eine andere Auswertung erforderlich als bei der einfachen Auswahl, denn wir erhalten ja nicht nur einen, sondern gegebenenfalls auch mehrere Einträge zurück. Im Beispiel aus Listing 1 durchlaufen wir in einer Schleife alle Einträge der Auflistung SelectedItems und geben diese im Direktbereich aus. Dabei muss die als Laufvariable verwendete Variable den Typ Variant aufweisen, auch wenn diese lediglich String-Werte zugewiesen bekommt.
Public Sub Mehrfachauswahl() Dim objFiledialog As Office.FileDialog Dim varFilename As Variant Set objFiledialog = Application.FileDialog(msoFileDialogFilePicker) objFiledialog.AllowMultiSelect = True If objFiledialog.Show = True Then For Each varFilename In objFiledialog.SelectedItems Debug.Print varFilename Next varFilename Else Debug.Print "Keine Datei ausgewählt" End If End Sub
Listing 1: Anzeigen und Auswerten einer Mehrfachauswahl
Beschriftung der Schaltfläche zum Auswählen ändern
Mit der Eigenschaft ButtonName können wir die sichtbare Bezeichnung der Schaltfläche zum Auswählen der gewählten Dateien oder Verzeichnisse ändern. Das gelingt allerdings nicht bei allen FileDialog-Typen auf Anhieb, sondern bei manchen erst nach der Auswahl eines Eintrags. Bei den Dialogen der Typen msoFileDialogFolderPicker und msoFileDialogSaveAs erscheint der gewünschte Text sofort. Das sieht beispielsweise wie folgt aus:
Public Sub Schaltflaechenbeschriftung() Dim objFiledialog As Office.FileDialog Set objFiledialog = _ Application.FileDialog(msoFileDialogFolderPicker) objFiledialog.ButtonName = "Ordner auswählen" If objFiledialog.Show = True Then Debug.Print objFiledialog.SelectedItems(1) Else Debug.Print "Keine Datei ausgewählt" End If End Sub
Das Ergebnis sieht wie in Bild 4 aus. Statt der Beschriftung Öffnen erscheint hier also nun der Text Ordner auswählen.
Bild 4: Angepasste Schaltflächenbeschriftung beim Auswählen eines Ordners
Bei den anderen Einstellungen wird der gewünschte Text erst für den Standardtext angezeigt, wenn der Benutzer mindestens eine Datei ausgewählt hat.
Eigenschaften werden beibehalten
Wenn wir diese und die nachfolgend beschriebenen Eigenschaften nutzen, werden die Einstellungen beim erneuten Öffnen eines FileDialog-Fensters aus der gleichen Anwendung heraus beibehalten, wenn wir nicht explizit neue Werte für die Eigenschaften angeben. Um eine Eigenschaft wie beispielsweise die Schaltflächenbeschriftung zurückzusetzen, stellen wir diese einmalig auf eine leere Zeichenkette ein:
... objFiledialog.ButtonName = "" ...
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: