Verzeichnis in ein Listenfeld auslesen
Sonntag 14. Februar 2010 von Andreas Vogt
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:
http://www.accessblog.de/?dl_id=6

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
Dieser Beitrag wurde erstellt am Sonntag 14. Februar 2010 um 16:46:00 und abgelegt unter Formulardesign, VBA Code. Kommentare zu diesen Eintrag im RSS 2.0 Feed. Sie können einen Kommentar schreiben, oder einen Trackback auf Ihrer Seite einrichten.
PDF Version