使用VBA循环遍历所有子文件夹

时间:2014-03-25 20:16:13

标签: vba filesystemobject

我正在寻找一个循环遍历指定文件夹的所有子文件夹的VBA脚本。当我说所有子文件夹时,我指的是指定文件夹中的每个文件夹,以及其中的每个文件夹,以及其中的每个文件夹...理论上可能存在无限的嵌套子文件夹,但实际上它可能不会超过3或者4.我使用VBA Scripting Runtime对象,这样一旦我循环进入文件夹,我就可以检查一些文件的属性(但我知道如何做这部分)。

感谢您的帮助!

这个问题与列出的"类似的"不同。前面问题中的问题包含已知目录,而这里需要查找已知和未知目录。还需要多层子目录。你们真的应该在你解雇之前阅读这个问题"复制"。

2 个答案:

答案 0 :(得分:75)

只需一个简单的文件夹向下钻取。

Dim FileSystem As Object
Dim HostFolder As String

HostFolder = "C:\"

Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem.GetFolder(HostFolder)

Sub DoFolder(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
        ' Operate on each file
    Next
End Sub

答案 1 :(得分:29)

补充Rich的递归答案,一种非递归方法。

Public Sub NonRecursiveMethod()
    Dim fso, oFolder, oSubfolder, oFile, queue As Collection

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set queue = New Collection
    queue.Add fso.GetFolder("your folder path variable") 'obviously replace

    Do While queue.Count > 0
        Set oFolder = queue(1)
        queue.Remove 1 'dequeue
        '...insert any folder processing code here...
        For Each oSubfolder In oFolder.SubFolders
            queue.Add oSubfolder 'enqueue
        Next oSubfolder
        For Each oFile In oFolder.Files
            '...insert any file processing code here...
        Next oFile
    Loop

End Sub

您可以将队列用于FIFO行为(如上所示),或者您可以将堆栈用于LIFO行为,该行为将以与递归方法相同的顺序处理(将Set oFolder = queue(1)替换为Set oFolder = queue(queue.Count)并且将queue.Remove(1)替换为queue.Remove(queue.Count),并可能重命名变量...)