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

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

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

谢谢你的帮助!

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


慕侠2389804
浏览 1940回答 3
3回答

慕容森

只是一个简单的文件夹向下钻。Dim FileSystem As ObjectDim HostFolder As StringHostFolder = "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     NextEnd Sub

婷婷同学_

并补充里奇的递归答案,一种非递归的方法。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    LoopEnd Sub您可以为FIFO行为使用队列(如上文所示),也可以为LIFO行为使用堆栈,该堆栈的处理顺序与递归方法相同(替换Set oFolder = queue(1)带着Set oFolder = queue(queue.Count)替换queue.Remove(1)带着queue.Remove(queue.Count),并且可能将变量重命名为.)

月关宝盒

其他两个已经存储在集合中,然后我们将在接下来的2个循环中处理该集合(请不要忘记queue.Remove 1移除第一个文件夹,因此第二个文件夹现在是集合的第一个成员,并在下一个对Queue(1)的调用中检索。堆栈方法则相反,总是对添加的最后一个文件夹进行操作(用Queue(Quee.Count)替换Queue(1),用Quee.Remove Quee.Count替换Quee.Remove 1)。
打开App,查看更多内容
随时随地看视频慕课网APP