Dateidialog-Klasse

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.

pic001.png

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.

pic002.png

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.

pic003.png

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.

pic004.png

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.

pic005.png

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).

pic006.png

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

Schreibe einen Kommentar