Verzeichnis in ein Listenfeld auslesen
Kürzlich hatte ich ein Projekt bei dem XML-Dateien importiert wurden. Zur Auswahl der Dateien mussten diese zuvor aus einem Verzeichnis in ein Listenfeld ausgelesen werden.
Um das zu bewerkstelligen bedienen wir uns wieder einmal der „Microsoft Scripting Runtime“ Bibliothek. Diese wird seit Office 2000 mit dem Office-Paket ausgeliefert und beinhaltet verschiedene Objekte die Dateizugriff möglich machen, u.a. auch das aus einem anderen Artikel bekannte FileSystemObject, kurz FSO genannt. Des weiteren werden die Objekte Files() und Folder() im Beispiel verwendet.
Das FileSystemObject hat verschiedene Methoden zum Datei- und Verzeichniszugriff. Wir verwenden im unteren Beispiel die Methoden GetFolder() und FolderExists(). Die Methode Files des Folder-Objektes liefert eine Collection von Dateiobjekten zurück. Diese Objekte kann man über die „Name“ Eigenschaft überprüfen, ob es sich auch um den gewünschten Dateityp handelt, also z.B. „XML“.
Soweit erst mal die graue Theorie, kommen wir zum VBA-Code.
Zuerst die Deklaration der benötigten Objektvariablen. Benötigt wird dazu der Verweis auf Microsoft Scripting Runtime.
Dim oFSO As Scripting.FileSystemObject Dim oFolder As Scripting.Folder Dim oFile As Scripting.FILE Dim cFile As String
Dann die Zuweisung von oFSO und oFolder:
Set oFSO = New Scripting.FileSystemObject If oFSO.FolderExists(Me!Folder) Then Set oFolder = oFSO.GetFolder(Me!Folder)
In einer Schleife über oFolder.Files, welches eine Collection aller Dateiobjekte ist, erfolgt das Auslesen der Dateinamen im Verzeichnis:
For Each oFile In oFolder.Files DoEvents cFile = oFile.NAME If Right(cFile, 3) = "xml" Then ReDim Preserve aFiles(i) aFiles(i) = cFile i = i + 1 End If Next
Zuletzt noch die Zuweisung der Dateinamen an das Listenfeld:
Me!Listenfeld1.RowSource = Join(aFiles, ";")
Und nun die komplette Funktion:
Private Sub fillList() Dim oFSO As Scripting.FileSystemObject Dim oFolder As Scripting.Folder Dim oFile As Scripting.FILE Dim cFile As String Dim i As Long Set oFSO = New Scripting.FileSystemObject i = 0 ReDim aFiles(0) If oFSO.FolderExists(Me!Folder) Then Set oFolder = oFSO.GetFolder(Me!Folder) For Each oFile In oFolder.Files DoEvents cFile = oFile.NAME If Right(cFile, 3) = "xml" Then ReDim Preserve aFiles(i) aFiles(i) = cFile i = i + 1 End If Next If i >= 0 Then Me!Listenfeld1.RowSource = Join(aFiles, ";") Me!FileCount.Caption = i Else Me!Listenfeld1.RowSource = "" Me!FileCount.Caption = 0 End If Else Me!Listenfeld1.RowSource = "" Me!FileCount.Caption = 0 MsgBox "Das angebene Verzeichnis existiert nicht!", vbInformation + vbOKOnly End If Set oFSO = Nothing Set oFolder = Nothing Set oFile = Nothing End Sub
Im Formulardesigner benötigt man ein Listenfeld (Listenfeld1), ein Textfeld (Folder) und ein Bezeichnungsfeld (FileCount).
Ich hab mal für euch ein Beispiel erstellt, das ein wenig ausführlicher noch ist. Das Beispiel könnt ihr auch herunterladen, hier ist der Link:
{filelink=1}
Dass man statt Listenfeld auch ein Kombinationsfeld nehmen kann sollte klar sein. Wichtig ist noch dass ihr den Herkunftstyp des Listenfeldes auf Werteliste stellt.
AV 2010