Microsoft Excel

Herbers Excel/VBA-Archiv

FileSystemObject


Betrifft: FileSystemObject
von: Marcel
Geschrieben am: 22.11.2016 11:14:30

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

  

Betrifft: AW: FileSystemObject
von: Rudi Maintaire
Geschrieben am: 22.11.2016 11:53:12

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


  

Betrifft: AW: FileSystemObject
von: baschti007
Geschrieben am: 22.11.2016 12:13:01

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


  

Betrifft: Wenn schon aus dem Netz, dann ohne Rekursion...
von: Michael (migre)
Geschrieben am: 22.11.2016 12:20:55

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


  

Betrifft: AW: FileSystemObject
von: Marcel
Geschrieben am: 22.11.2016 12:40:22

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