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

Jak*_*ake 28 vba filesystemobject

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

谢谢您的帮助!

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

Ric*_*ich 81

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

sub sample()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "C:\"

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

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
Run Code Online (Sandbox Code Playgroud)

  • 没问题,所有程序员都会在这个或那个地方保留这个子文件夹迭代的副本,它主要是复制和粘贴.不要忘记给我的朋友写一个答案. (6认同)
  • 谢谢,我觉得这很简单! (3认同)
  • 为了完整性,下面添加了非递归方法;) (3认同)
  • 我想您仅拥有SubFolder作为变体就无法摆脱。它必须是“将子文件夹作为对象昏暗” (3认同)
  • 你忘了定义什么吗?不适合我:( (2认同)
  • @Rich您可能需要考虑将示例使用/调用代码包装在工作子中。新程序员似乎对如何处理它感到困惑...... (2认同)

Cor*_*mey 32

并补充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
Run Code Online (Sandbox Code Playgroud)

您可以使用FIFO行为(如上图所示)队列,或者您可以使用后进先出法的行为栈会以相同的顺序为递归方法处理(替换Set oFolder = queue(1)Set oFolder = queue(queue.Count)和替换queue.Remove(1)queue.Remove(queue.Count),并可能重命名变量...)

  • @Rich它会,但其他2已存储在集合中,然后我们在接下来的2个循环中处理(不要忘记`queue.Remove 1`删除第一个文件夹,所以第二个文件夹现在是第一个成员在下一次调用queue(1)时检索集合等.堆栈方法将采用相反的方式并始终对添加的最后一个文件夹进行操作(将queue(1)替换为queue(queue.Count)和queue.Remove 1 with queue.Remove queue.Count). (4认同)
  • 我想指出,如果处理顺序对你很重要,这个方法将不会提供与递归方法相同的顺序.这里的文件夹处理顺序如下:`Root`,`Root\Sub1`,`Root\Sub2`,`Root\Sub1\Sub1.1`,`Root\Sub1\Sub1.2`,`Root\Sub2\Sub2.1`,`Root\Sub2\Sub2.2` ...也就是说,文件夹是逐级处理的. (4认同)
  • 集合在VBA中非常有用,因为它们基本上是我们唯一的"列表"类型的对象(键控字典也可以从Scripting.Runtime中使用).您可以在处理某些内容时轻松添加结果,然后担心最后进入数组(节省使用Redim保留的数组复制开销会产生每个循环).您可以使用它们来查找唯一身份,映射值,快速查找大量数据以及其他许多内容. (3认同)
  • +1 这真是个坏蛋。我需要阅读更多关于收藏的内容。 (2认同)