Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: FileSystemObject

FileSystemObject
22.11.2016 11:14:30
Marcel
Hallo,
Set FS = CreateObject("Scripting.FileSystemObject")
Ich weiß, dass ich mit
Set Folder = FS.GetFolder(path)
For Each file In Folder.directories ...
alle DATEIEN eines Ordners durchlaufen kann.
Gibt es eine ähnliche Methode wie GetFolder, die sowohl Dateien, als auch Ordner zurückliefert?
Ich möchte also mit For Each nicht nur die Files, sondern auch Ordner berücksichtigt haben.
Danke!
VG
Marcel
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: FileSystemObject
22.11.2016 11:53:12
Rudi
Hallo,
For Each file In Folder.directories
nie und nimmer!!!
Benenne nie Variable wie VBA Schlüsselwörter!!!! Folder und File sind Objektbezeichnungen.
Besser objFolder und objFile.
For Each objFile In objFolder.Files listet die Dateien auf.
Ordner mit
For Each objSubFolder In objFolder.SubFolders
SubFolders können aber wieder SubFolders enthalten. Da kommst du um rekursive Prozeduren kaum drum rum.
Gruß
Rudi
Anzeige
AW: FileSystemObject
22.11.2016 12:13:01
baschti007
Hey Marcel
Dazu gibt es schon was im netz
Hier

Sub ListFiles()
'Declare the variables
Dim objFSO As Scripting.FileSystemObject
Dim objTopFolder As Scripting.Folder
Dim strTopFolderName As String
'Insert the headers for Columns A through F
Range("A1").Value = "Folder"
Range("B1").Value = "File Name"
Range("C1").Value = "File Size"
Range("D1").Value = "File Type"
Range("E1").Value = "Date Created"
Range("F1").Value = "Date Last Accessed"
Range("G1").Value = "Date Last Modified"
'Assign the top folder to a variable
strTopFolderName = "C:\Bastian"
'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the top folder
Set objTopFolder = objFSO.GetFolder(strTopFolderName)
'Call the RecursiveFolder routine
Call RecursiveFolder(objTopFolder, True)
'Change the width of the columns to achieve the best fit
Columns.AutoFit
End Sub
Sub RecursiveFolder(objFolder As Scripting.Folder, _
IncludeSubFolders As Boolean)
'Declare the variables
Dim objFile As Scripting.file
Dim objSubFolder As Scripting.Folder
Dim NextRow As Long
'Find the next available row
NextRow = Cells(Rows.Count, "A").End(xlUp).Row + 1
'Loop through each file in the folder
For Each objFile In objFolder.Files
Cells(NextRow, "A").Value = objFolder.Path
Cells(NextRow, "B").Value = objFile.Name
Cells(NextRow, "C").Value = objFile.Size
Cells(NextRow, "D").Value = objFile.Type
Cells(NextRow, "E").Value = objFile.DateCreated
Cells(NextRow, "F").Value = objFile.DateLastAccessed
Cells(NextRow, "G").Value = objFile.DateLastModified
NextRow = NextRow + 1
Next objFile
'Loop through files in the subfolders
If IncludeSubFolders Then
For Each objSubFolder In objFolder.SubFolders
Call RecursiveFolder(objSubFolder, True)
Next objSubFolder
End If
End Sub
Gruß Basti
Anzeige
Wenn schon aus dem Netz, dann ohne Rekursion...
22.11.2016 12:20:55
Michael
Hallo!
Eine wunderschöne Lösung ohne Rekursion von Cor_Blimey auf Stackoverflow:
Public Sub NonRecursiveMethod()
Dim fso, oFolder, oSubfolder, oFile, queue As Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set queue = New Collection
queue.Add fso.GetFolder("C:\DeinHauptPfad\") 'ersetzen
Do While queue.Count > 0
Set oFolder = queue(1)
queue.Remove 1
'Aktionen mit dem Ordner/Vereichnis
For Each oSubfolder In oFolder.SubFolders
queue.Add oSubfolder
Next oSubfolder
For Each oFile In oFolder.Files
'Aktionen mit der/den Datei(en)
Next oFile
Loop
End Sub
Gern geschehen ;-)
Michael
Anzeige
AW: FileSystemObject
22.11.2016 12:40:22
Marcel
Richtig - habe auch die Rekursion schon fertig programmiert, nur in einer anderen Programmiersprache, in der es den Aufruf isDirectory() gibt und True/False zurückliefert.
Schaue mir eure Vorschläge nachher mal an, danke
;
Anzeige

Infobox / Tutorial

Arbeiten mit FileSystemObject in Excel VBA


Schritt-für-Schritt-Anleitung

Um mit dem FileSystemObject (FSO) in Excel VBA zu arbeiten, folge diesen Schritten:

  1. Objekt erstellen: Du benötigst ein FileSystemObject, um auf Dateien und Ordner zuzugreifen.

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
  2. Ordner abrufen: Um einen bestimmten Ordner zu erhalten, benutze die GetFolder-Methode.

    Dim objFolder As Object
    Set objFolder = fso.GetFolder("C:\DeinPfad")
  3. Dateien und Unterordner durchlaufen:

    Dim objFile As Object
    Dim objSubFolder As Object
    
    For Each objFile In objFolder.Files
       Debug.Print objFile.Name
    Next objFile
    
    For Each objSubFolder In objFolder.SubFolders
       Debug.Print objSubFolder.Name
    Next objSubFolder
  4. Optional: Rekursive Durchläufe: Wenn Du alle Unterordner und deren Dateien durchlaufen möchtest, erstelle eine rekursive Funktion.


Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden"
    Ursache: Der angegebene Pfad ist falsch oder der Ordner existiert nicht.
    Lösung: Überprüfe den Pfad auf Tippfehler.

  • Fehler: "Typ nicht definiert"
    Ursache: Du hast die richtige Referenz zu Microsoft Scripting Runtime nicht aktiviert.
    Lösung: Gehe zu Extras > Verweise und aktiviere Microsoft Scripting Runtime.

  • Variable mit Schlüsselwörtern benennen: Vermeide die Benennung von Variablen wie Folder oder File, da dies Konflikte mit den VBA-Schlüsselwörtern verursachen kann.


Alternative Methoden

Wenn Du keine Rekursion verwenden möchtest, kannst Du eine Warteschlange verwenden, um die Ordnerstruktur iterativ zu durchlaufen. Hier ist ein Beispiel:

Public Sub NonRecursiveMethod()
    Dim fso As Object, oFolder As Object, oSubfolder As Object, oFile As Object, queue As Collection
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set queue = New Collection
    queue.Add fso.GetFolder("C:\DeinHauptPfad\")

    Do While queue.Count > 0
        Set oFolder = queue(1)
        queue.Remove 1

        For Each oSubfolder In oFolder.SubFolders
            queue.Add oSubfolder
        Next oSubfolder

        For Each oFile In oFolder.Files
            ' Aktionen mit den Dateien
        Next oFile
    Loop
End Sub

Praktische Beispiele

Hier ist ein Beispiel, um alle Dateien eines Ordners und seiner Unterordner aufzulisten:

Sub ListAllFiles()
    Dim fso As Object
    Dim mainFolder As Object
    Dim subFolder As Object
    Dim file As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set mainFolder = fso.GetFolder("C:\DeinPfad")

    For Each file In mainFolder.Files
        Debug.Print file.Name
    Next file

    For Each subFolder In mainFolder.SubFolders
        For Each file In subFolder.Files
            Debug.Print file.Name
        Next file
    Next subFolder
End Sub

Tipps für Profis

  • Verwende Option Explicit: Dies hilft, Fehler durch nicht deklarierte Variablen zu vermeiden.

  • Fehlerbehandlung: Implementiere Fehlerbehandlung, um unerwartete Situationen abzufangen:

    On Error Resume Next
    ' Dein Code hier
    On Error GoTo 0
  • Verwende With-Anweisungen: Dies kann Deinen Code übersichtlicher machen:

    With fso
      ' Dein Code hier
    End With

FAQ: Häufige Fragen

1. Kann ich mit dem FileSystemObject auch Ordner erstellen?
Ja, Du kannst mit der CreateFolder-Methode neue Ordner erstellen:

fso.CreateFolder("C:\NeuerOrdner")

2. Wie kann ich die Größe einer Datei ermitteln?
Du kannst die Size-Eigenschaft des File-Objekts verwenden:

Debug.Print objFile.Size

3. Was ist der Unterschied zwischen Set fso = CreateObject("Scripting.FileSystemObject") und Set fso = New FileSystemObject?
Beide Methoden erstellen ein FileSystemObject, aber die erste Methode ist flexibler, da sie auch in Umgebungen funktioniert, in denen die Scripting Runtime nicht referenziert ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige