Navigation

Dateiliste

Wie erstellt man ein Dateiauswahlformular?


Man nehme:

Das FileSearch-Objekt aus der Office Objekt Bibliothek,

Ein Kombifeld für das Verzeichnis,

Ein Textfeld für die Erweiterung,

Eine Optionsgruppe für einen Zeitraum,

Ein Listenfeld um die Dateien anzuzeigen,

Eine Tabelle um die Dateinamen zu speichern.




FileSearch-Objekt

Mit dem FileSearch-Objekt kann man einen Ordner nach Dateien durchsuchen. Im Beispiel ist es die Version 10.
Falls ihr mit einer Version kleiner als Access XP arbeitet, müsst ihr den VBA-Editor öffnen und dort auf Extras / Verweise gehen und den Verweis auf die entsprechende
Office Object Library stellen.


Verzeichnisauswahl

Für die Verzeichnisauswahl nehmen wir ein Kombifeld welches wir dynamisch mit den Unterverzeichnissen füllen.
Dafür wird die Dir()-Funktion verwendet:

'Verzeichnisse auslesen
Public Function FillPath()
Dim Start       As String
Dim Pfad        As String
Dim AllDir      As String

'Startverzeichnis
Start = IIf(Len(Nz(Me!cmbPath, "")) = 0, "C:\", Me!cmbPath)
AllDir = Chr(34) & "C:\" & Chr(34)

'Ersten Eintrag ermitteln
Pfad = Dir(Start & "*", vbDirectory)

'Schleife über alle Verzeichnisse
Do While Pfad <> ""

    'Aktuelles und übergeordnetes Verzeichnis ignorieren.
    If Pfad <> "." And Pfad <> ".." Then

        'Sicherheitsüberprüfung, ob der Eintrag ein Verzeichnis ist
        If (GetAttr(Start & Pfad) And vbDirectory) = vbDirectory Then
            AllDir = AllDir & ";" & Chr(34) & Start & Pfad & "\" & Chr(34)
        End If
    End If
	'Nächsten Eintrag abrufen.
    Pfad = Dir
Loop

'Daten zuweisen
Me!cmbPath.RowSource = AllDir
End Function

Die Chr(34) sind nichts weiter als Anführungszeichen, welche in der Datenherkunft benötigt werden. Mit Dir wird das nächste Objekt gesucht
und mit GetAttr() wird geprüft, ob es sich tatsächlich um ein Verzeichnis handelt.




Dateien einlesen

Die Dateinamen werden mit folgender Funktion eingelesen:

'//Auslesen der Daten und darstellen im Listenfeld
Public Function SearchFile()
Dim rs      As ADODB.Recordset
Dim fSearch As Office.FileSearch
Dim fNr     As Long

'Überprüfen ob ein Verzeichnis ausgewählt wurde
If IsNull(Me!cmbPath) Then
    MsgBox "Bitte wählen sie ein Verzeichnis aus!"
    Exit Function
End If

'FileSearch-Objekt der Office-Object-Bibliothek
Set fSearch = Application.FileSearch

'Suchpfad
fSearch.LookIn = Me!cmbPath
'Suchbegriff
fSearch.FileName = IIf(Len(Nz(Me!Extension, "")) = 0, "*.*", Me!Extension)
'Zeitraum
Select Case Me!optZeit
Case 1
    fSearch.LastModified = msoLastModifiedToday
Case 2
    fSearch.LastModified = msoLastModifiedYesterday
Case 3
    fSearch.LastModified = msoLastModifiedThisWeek
Case 4
    fSearch.LastModified = msoLastModifiedLastWeek
Case 5
    fSearch.LastModified = msoLastModifiedThisMonth
Case 6
    fSearch.LastModified = msoLastModifiedLastMonth
Case 7
    fSearch.LastModified = msoLastModifiedAnyTime
Case Else
    fSearch.LastModified = msoLastModifiedAnyTime
End Select


'Leeren der Daten in der Dateitabelle
DBEngine(0)(0).Execute "DELETE * FROM tblDateien"

'Füllen der Tabelle
Set rs = New ADODB.Recordset
With rs
    .LockType = adLockOptimistic
    .CursorType = adOpenDynamic
    .ActiveConnection = CurrentProject.Connection
    .Open "SELECT * FROM tblDateien"

    'In der Schleife werden die Daten an die Tabelle angefügt
    For fNr = 1 To fSearch.Execute(msoSortByFileName, msoSortOrderAscending, False)
        rs.AddNew
            rs.Fields(0) = Mid(fSearch.FoundFiles(fNr), InStrRev(fSearch.FoundFiles(fNr), "\") + 1)
            rs.Fields(1) = Left(fSearch.FoundFiles(fNr), InStrRev(fSearch.FoundFiles(fNr), "\"))
        rs.Update
    Next fNr

    .Close
End With
Set rs = Nothing

'Listenfeld befüllen
Me!lstFile.RowSource = "SELECT FileName FROM tblDateien ORDER BY FileName"
End Function

Ich verwende eine Tabelle, da eine Werteliste nur bis 2000 Zeichen geht und das ist nicht besonder viel bei Dateinamen. Die Optionsgruppe gibt also an,
für welchen Zeitraum gesucht werden soll, das Textfeld, nach welchen Endungen und das Kombifeld in welchem Verzeichnis.
Damit hat man alles und kann die Dateisuche mit einer For-Schleife starten. Die eigentliche Ausführung ist das Execute, welches man mit verschiedenen Argumenten starten kann.
Um die Funktion immer auszuführen, wird das Ereignis nach Aktualisierung jeden Feldes verwendet. Das Beispiel zum Download findet ihr
hier.