In letzter Zeit programmiere ich gern Standardlösungen, die ich dann ohne großen Programmieraufwand in weitere Anwendungen übernehmen kann. In diesem Fall ging es um ein Textfeld zur Eingabe eines Dateinamens beziehungsweise um eine Schaltfläche zum Öffnen eines Datei öffnen-Dialogs. Die Kombination brauche ich immer wieder, sei es, um eine Datei für den Import von Daten auszuwählen oder den Pfad zum Backend der aktuellen Datenbank zu aktualisieren. Dieser Beitrag zeigt, wie Sie alles in eine Klasse packen und Ihre Formulare blitzschnell damit ausstatten.
Spätestens, wenn Sie eine Frontend-Backend-Lösung auf Basis von Access erstellen, wobei das Backend zumindest theoretisch seinen Speicherplatz wechseln kann, müssen Sie dem Anwender des Frontends die Möglichkeit bieten, manuell das Backend auszuwählen.
Die gleiche Situation tritt immer dann ein, wenn Ihre Anwendung Daten aus beliebigen anderen Dateien wie etwa Excel-, XML-, Text- oder Worddokumenten importieren soll. Auch dann wird normalerweise der Benutzer aufgefordert, die gewünschte Datei auszuwählen.
Dabei gibt es unterschiedliche Ausprägungen: Mal soll der Benutzer nur einen Dialog zum Auswählen der Datei öffnen können, woraufhin der die Datei betreffende Vorgang direkt beginnt, mal soll die ausgewählte Datei in einem Textfeld angezeigt werden, bevor der Benutzer die entsprechende Aktion mit einer zweiten Schaltfläche startet.
Traurige Tatsache ist, dass man den betroffenen Code jeweils von einer Datenbankdatei zur nächsten kopiert und teilweise der gleiche Code gleich mehrfach in einer einzigen Datei auftaucht – und dies auch noch in unterschiedlichen Ausprägungen.
Dateiauswahl mit Klasse
Die in diesem Beitrag vorgestellte Lösung soll die komplette Funktionalität in einer einzigen Klasse liefern. Diese wird im betroffenen Formular deklariert und instanziert und stellt dann nicht nur die üblichen Funktionen zum Auswählen von Datei, Speicherort und Verzeichnis bereit, sondern bestückt auch Schaltflächen mit den entsprechenden Funktionen.
Einfache Dateiauswahl-Schaltfläche
Im Detail bedeutet dies, dass Sie sich noch nicht einmal mehr um die Ereignisprozedur kümmern müssen, die etwa eine Schaltfläche zum Auswählen einer Datei für die Dateiauswahl auslösen müsste.
Nehmen wir an, Sie wollen ein Formular mit einem Textfeld namens txtVerzeichnisUndDateiname und einer Schaltfläche namens cmdAuswaehlen bestücken. Die Schaltfläche soll einen Datei öffnen-Dialog anzeigen und im Anschluss die ausgewählte Datei in das Textfeld schreiben.
Das Formular sieht dann im Entwurf etwa so wie in Bild 1 aus. Das Anlegen, Benennen und Ausrichten der Steuerelemente war auch schon fast der größte Teil der Arbeit – Sie müssen nun nur noch die Klasse clsFiles aus der Beispieldatenbank in die betroffene Datenbank importieren und ein paar Zeilen Code in das Beim Öffnen-Ereignis des Formulars schreiben.
Bild 1: Beispiel für die Auswahl einer Datei per Textfeld und Schaltfläche
Im Kopf des Klassenmoduls des Formulars landet die Objektvariable, welche einen Verweis auf die noch zu erzeugende Instanz der Klasse clsFiles speichert:
Dim objFiles As clsFiles
In der Ereignisprozedur Form_Open wird dann zunächst die Instanz der Klasse clsFiles erzeugt und der Variablen objFiles zugewiesen.
Die beiden folgenden Anweisungen füllen zwei Eigenschaften des Objekts objFiles mit Verweisen auf die Schaltfläche, die den Datei auswählen-Dialog aktivieren soll, sowie auf das Textfeld, in dem der Pfad und der Dateiname der ausgewählten Datei landen sollen.
Private Sub Form_Open(Cancel As Integer) Set objFiles = New clsFiles With objFiles Set .Commandbutton_ChooseDocument = _ Me!cmdAuswaehlen Set .Textbox_FolderAndFile = Me!txtVerzeichnisUndDateiname End With End Sub
Danach können Sie bereits in die Formularansicht wechseln und auf die Schaltfläche Datei auswählen klicken. Es erscheint ein Datei auswählen-Dialog wie in Bild 2. Die damit ausgewählte Datei landet samt Pfad im Textfeld txtVerzeichnisUndDateiname.
Bild 2: Der Datei auswählen-Dialog
Und es kommt noch besser: Fügen Sie eine weitere Schaltfläche namens cmdOeffnen hinzu und betiteln Sie diese mit Öffnen. Erweitern Sie die Prozedur von oben um die folgende Zeile:
Set .CommandButton_OpenDocument = Me!cmdOeffnen
Wenn Sie nun das Formular öffnen, finden Sie weitere Funktionalität vor: Solange kein gültiger Dateiname im Textfeld steht, bleibt die Öffnen-Schaltfläche deaktiviert.
Erst, wenn Sie mit dem Datei auswählen-Dialog eine Datei ausgewählt haben, wird die Öffnen-Schaltfläche aktiviert. ändern Sie jedoch auch nur einen Buchstaben des Dateinamens, sodass diese nicht mehr im Dateisystem gefunden werden kann, wird die Öffnen-Schaltfläche wieder deaktiviert.
Ein Klick auf die Öffnen-Schaltfläche startet schließlich die Standardanwendung für die ausgewählte Datei und öffnet diese.
Ordner und Verzeichnis getrennt
Das funktioniert auch, wenn Sie Ordner und Verzeichnis in zwei Textfeldern anzeigen. Das Beispielformular für diesen Fall sieht im Entwurf wie in Bild 3 aus.
Bild 3: Beispielformular mit separaten Textfeldern für Pfad und Dateiname
Im Beispielcode haben wir zur besseren Unterscheidbarkeit den Objektnamen objFiles2 gewählt (auch deshalb, weil Sie in der Beispieldatenbank mehrere Beispiele in einem Formular finden).
Wir deklarieren wieder die Objektvariable für clsFiles:
Dim objFiles2 As clsFiles
In der Beim Öffnen-Prozedur sieht der Code nur unwesentlich anders aus. Der einzige Unterschied ist, dass wir nun Verweise auf zwei Textfelder an die beiden Eigenschaften Textbox_File und Textbox_Folder des Objekts objFiles2 übergeben:
Private Sub Form_Open(Cancel As Integer) Set objFiles2 = New clsFiles With objFiles2 Set .CommandButton_OpenDocument = _ Me!cmdOeffnen2 Set .Commandbutton_ChooseDocument = _ Me!cmdAuswaehlen2 Set .Textbox_File = Me!txtDateiname Set .Textbox_Folder = Me!txtVerzeichnis End With End Sub
Der Klick auf die Schaltfläche Auswählen öffnet wiederum den Datei auswählen-Dialog, allerdings werden Pfad und Datei diesmal gleich auf die entsprechenden Textfelder aufgeteilt (s. Bild 4). Die übrige Funktionalität bleibt gleich.
Bild 4: Frisch eingelesener Pfad und Dateiname
Dateiangaben in gebundenen Formularen
Gelegentlich kommt es vor, dass man Pfadangaben in Tabellen speichert – beispielsweise, um den Pfad zu einem Bild eines Mitarbeiters anzugeben, das man nicht in der Datenbank speichern möchte.
Auch hier funktionieren die Textfelder für die Angabe von Pfad und/oder Dateiname und die entsprechenden Schaltflächen. Dies bezieht sich explizit auf die Öffnen-Schaltfläche, die ja nur aktiviert sein soll, wenn die angegebene Datei tatsächlich vorhanden ist.
Zwei Beispiele finden Sie in den Formularen frmDateienGebunden und frmDateienGebunden_PfadUndDatei.
Feinheiten einstellen
In der Basiseinstellung zeigt die Klasse die Dialoge zum Auswählen von Dateien mit dem Titel Datei auswählen, dem aktuellen Datenbankverzeichnis als Startverzeichnis sowie einem auf Datenbankdateien fixierten Filter an.
All diese Eigenschaften können Sie je nach Anwendungsfall individuell einstellen. Das Startverzeichnis, das der Datei auswählen-Dialog anzeigen soll, stellen Sie beispielsweise mit der Eigenschaft StartDir ein:
objFiles.StartDir = "c:\"
Auch der Filter lässt sich manuell einstellen. Die folgende Zuweisung zeigt etwa nur Access-Datenbanken mit der Dateiendung .mdb oder .accdb an:
objFiles.Filter = "Access-Dateien (*.accdb,*.mdb)"
Schließlich können Sie noch den Titel des jeweiligen Dialogs beeinflussen:
objFiles.Title = "Access-Datei auswählen"
Integration in VBA-Code
Die Klasse liefert auch die üblichen Funktionen für den Einbau in Ihren VBA-Code:
- Datei auswählen-Dialog (ein oder mehrere Dateien)
- Verzeichnis auswählen-Dialog
- Speicherort auswählen-Dialog
Einfache Datei auswählen
Wenn Sie eine einzelne Datei auswählen und den Namen in einer Variablen speichern möchten, gehen Sie wie folgt vor:
Public Sub Einfachauswahl() Dim objFiles As clsFiles Dim strFile As String Set objFiles = New clsFiles With objFiles .StartDir = "c:\" .Title = "Einzelne Datei auswählen" .Filter = "Alle Dateien (*.*)" strFile = .OpenFileName End With Debug.Print strFile End Sub
Sie erstellen also wie in den vorherigen Beispielen ein Objekt auf Basis der Klasse clsFiles, stellen die Eigenschaften für die Erscheinungsweise des Dialogs ein und zeigen diesen dann an.
Mehrfachauswahl
Auch eine Mehrfachauswahl wie in Bild 5 lässt sich mit dieser Klasse realisieren. Die Auswahl mehrerer Dateien erfolgt dabei genau wie im Windows Explorer: Entweder Sie drücken die Umschalttaste, um alle Dateien zwischen zwei markierten Einträgen auszuwählen, oder Sie drücken die Strg-Taste und wählen gezielt Dateien aus.
Bild 5: Mehrfachauswahl im Datei auswählen-Dialog
Dazu stellen Sie zusätzlich zu den Eigenschaften des vorherigen Beispiels die Option MultipleFiles auf True ein. Die OpenFileName-Methode liefert eine Zeichenkette zurück, bei der die ausgewählten Dateinamen durch das Tabulatorzeichen voneinander getrennt werden.
Dieses Ergebnis wandelt die folgende Beispielprozedur mit der Split-Funktion in ein Array mit den einzelnen Dateinamen um und gibt die enthaltenen Einträge dann innerhalb einer Schleife im Direktfenster aus:
Public Sub Mehrfachauswahl() Dim objFiles As clsFiles Dim strFiles() As String Dim i As Integer Set objFiles = New clsFiles With objFiles .StartDir = "c:\" .MultipleFiles = True .Title = "Einzelne Datei auswählen" .Filter = "Alle Dateien (*.*)" strFiles = Split(.OpenFileName, vbTab) End With For i = LBound(strFiles) To UBound(strFiles) Debug.Print strFiles(i) Next i End Sub
Verzeichnisauswahl
Die Verzeichnisauswahl erledigt die Methode GetPath. Auch hier verwenden Sie die üblichen Eigenschaften, um das Aussehen des Dialogs zu beeinflussen sowie das Startverzeichnis festzulegen.
Public Sub Verzeichnisauswahl() Dim objFiles As clsFiles Set objFiles = New clsFiles With objFiles .Title = "Verzeichnis auswählen" .StartDir = "c:\" Debug.Print .GetPath End With End Sub
Der Dialog liefert immer das Verzeichnis zurück, das beim Schließen im Textfeld Ordner zu sehen ist (s. Bild 6).
Bild 6: Auswahl eines Verzeichnisses
Datei öffnen
Die Funktion OpenFile öffnet die als Parameter angegebene Datei. Sie erwartet schlicht den Dateinamen als Parameter und sieht wie in Listing 1 aus. Die Funktion verwendet eine API-Funktion namens OpenDocument, deren Deklaration Sie in der Beispieldatenbank finden.
Listing 1: Öffnen eines Dokuments mit der dafür vorgesehenen Anwendung
Public Function OpenDocument(DocumentFile As String) As Long Dim ret As Long If Len(DocumentFile) > 0 Then ret = ShellExecute(Application.hWndAccessApp, "open", DocumentFile, vbNullChar, "", 1) If Err Then OpenDocument = 0 ElseIf ret > 32 Then OpenDocument = -1 Else OpenDocument = ret End If Else OpenDocument = 0 End If End Function
Wie funktioniert das
Die Klasse clsFiles enthält eine ganze Menge Property-, Sub– und Function-Prozeduren und zusätzlich einige Ereignisprozeduren, die auf das Betätigen der festgelegten Schaltflächen oder änderungen der Dateiangaben in den Textfeldern reagieren.
Schauen wir uns zunächst die Techniken an, die zum Realisieren der Anzeige der einfachen Dialoge nötig sind.
Datei auswählen-Dialog in clsFiles
Für den Datei auswählen-Dialog brauchen Sie prinzipiell nur die Methode OpenFileName aus Listing 2. Diese zeigt den Dialog der nicht dokumentierten WizHook-Klasse an.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo