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.
'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.
'//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.