Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA循环浏览所有子文件夹_Vba_Filesystemobject - Fatal编程技术网

使用VBA循环浏览所有子文件夹

使用VBA循环浏览所有子文件夹,vba,filesystemobject,Vba,Filesystemobject,我正在寻找一个VBA脚本,它将在指定文件夹的所有子文件夹中循环。当我说所有子文件夹时,我指的是指定文件夹中的每个文件夹,其中的每个文件夹,以及其中的每个文件夹…理论上可能有无限嵌套子文件夹,但实际上它可能不会超过3或4。我正在使用VBA脚本运行时对象,这样一旦我循环到文件夹中,我就可以检查一些文件的属性(但我知道如何做这一部分) 谢谢你的帮助 这个问题不同于前面包含已知目录的问题中列出的“类似”问题,而这里需要查找已知和未知目录。还需要多层子目录。你们真的应该在开始“复制”之前先阅读这个问题。只

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

谢谢你的帮助


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

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

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

为了补充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行为(如上所示),也可以使用堆栈进行后进先出行为,其处理顺序与递归方法相同(将
Set of older=queue(1)
替换为
Set of older=queue(queue.Count)
并将
queue.Remove(1)
替换为
queue.Remove(queue.Count)
,可能会重命名变量…

这里有很多例子,你试过搜索吗?可能是重复的,它与simoco发布的内容类似,但是在这个例子中似乎有一个列表,而这里的子文件夹一开始是未知的-脚本需要找到它们。谢谢。是的,我试过搜索,但没有结果。谢谢你的建议。谢谢你,我觉得很简单!没问题,所有的程序员都会在某个时刻保留这个子文件夹迭代的副本,这主要是复制和粘贴。别忘了标记答案,我的朋友。为了完整性,下面添加了非递归方法;)你忘了给什么下定义了吗?不适合我:(我想你不能仅仅把子文件夹作为变量。它必须是暗淡的子文件夹作为对象+1。这是非常糟糕的。我需要阅读更多关于集合的内容。@Rich它会的,但是其他2个已经存储在集合中,我们将在接下来的2个循环中处理它(不要忘记
queue.Remove 1
删除第一个文件夹,因此第二个文件夹现在是集合的第一个成员,因此在下一次调用queue(1)时会被检索。堆栈方法会走相反的路,并且总是对最后添加的文件夹进行操作(将queue(1)替换为queue(queue.Count)和queue.Remove 1 with queue.Remove queue.Count)。集合在VBA中非常有用,因为它们基本上是我们唯一的“列表”类型的对象(键控字典也可以从Scripting.Runtime中使用)。您可以在处理某些内容时轻松使用它们添加结果,然后担心最后进入数组(节省了使用Redim preserve时每个循环的阵列复制开销)。您可以使用它们查找唯一性、映射值、快速查找大量数据以及其他许多事情。我想指出,如果处理顺序对您很重要,则此方法不会给出与递归方法相同的顺序。此处文件夹处理顺序如下:
Root
Root\Sub1
Root\Sub2
Root\Sub1\Sub1.1
Root\Sub1\Sub1.2
Root\Sub2\Sub2.1
Root\Sub2\Sub2.2
…也就是说,文件夹是逐级处理的。@lap这是一个很好的观点。通过使用堆栈而不是队列,可以以非递归的方式获得相同的顺序(因此,而不是
x=queue(1):queue.remove 1
类似于
x=queue(queue.count):queue.remove(queue.count)