Verzeichnis in ein Listenfeld auslesen

By , 14. Februar 2010

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

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy