上一期我们通过FSO递归法方式获取到了指定路径下的文件列表,那么还有没有其他方法呢?我们来继续探讨
前文提到过VBA提供了两种方式来操作文件和文件夹,一是使用VBA自带的内置命令和函数,二是借助功能更丰富的FileSystemObject(FSO)对象模型
那么,如果使用VBA自带的内置命令Dir能不能实现呢?一起来揭晓答案吧

Dir调用机制
一提到Dir,可能很多朋友第一反应是脑海一片空白,既熟悉又陌生的感觉——它似乎在哪里见过,却又一时想不起具体是什么;这种模糊的印象,就像偶尔在嘴边却叫不出名字的老熟人,让人既感到亲近又有些距离,所以有必要先回顾一下Dir知识
Dir函数用于返回与指定模式或属性匹配的文件名或目录名。其调用机制:首次调用时必须带参数,后续调用同一批文件时则不应带参数
这个机制是实现文件遍历的核心,但是不好理解,举个例子说明一下。
以下代码实现的主要功能:获取"D:\常用文件\VBA"路径下全部文件(*.*)名称
Dim fileName As StringfileName = Dir("D:\常用文件\VBA\*.*") '首次调用,必须带参Do While fileName <> "" '当返回值不是空字符串时继续循环'在此处处理文件,例如打印文件名Debug.Print fileName'关键:后续调用不带参数,以获取下一个文件fileName = Dir()Loop
以上代码是如何做到的呢?就是遵循了Dir的调用机制:
-
第2行代码是首次调用Dir,需要提供路径和匹配模式参数,此时Dir会在内部初始化一个指针,指向该路径中的第一个文件

-
第7行代码再次调用Dir时,就无需传入参数,因为每次无参数调用都会自动将内部指针移动到下一个匹配文件,这个过程由系统自动处理

-
当所有符合条件的文件都遍历完毕后,Dir会返回一个空字符串(""),标志着本次遍历结束
以上规则理解后,最大的拦路虎就清除掉了,那么咱们继续

Dir+字典
那么如何使用Dir函数结合循环(或字典)的方法来遍历文件夹及其子文件夹呢?这次先给出示例代码:
Sub DirAndDictionary()Dim MyPath As String, MyName As String, MyFileName As StringDim dicFolders As Object, dicFiles As ObjectDim i As Long, arrKeys As VariantSet dicFolders = CreateObject("Scripting.Dictionary")Set dicFiles = CreateObject("Scripting.Dictionary")MyPath = "D:\常用文件\" '执行前需要修改dicFolders.Add MyPath, ""i = 0Do While i < dicFolders.countarrKeys = dicFolders.Keys 'MyName = Dir(arrKeys(i), vbDirectory)Do While MyName <> ""If MyName <> "." And MyName <> ".." ThenIf (GetAttr(arrKeys(i) & MyName) And vbDirectory) = vbDirectory ThendicFolders.Add arrKeys(i) & MyName & "\", ""End IfEnd IfMyName = Dir()Loopi = i + 1LoopFor Each arrKeys In dicFolders.KeysMyFileName = Dir(arrKeys & "*.*")Do While MyFileName <> ""dicFiles.Add arrKeys & MyFileName, ""MyFileName = Dir()LoopNextDim rng As RangeSet rng = ThisWorkbook.Worksheets("sheet6").Range("B2")rng.Resize(dicFiles.count, 1).Value = WorksheetFunction.Transpose(dicFiles.Keys)MsgBox "遍历完成,共找到 " & dicFiles.count & " 个文件。"End Sub
在以上代码中:
-
数据字典主要用于存储和管理待遍历的文件夹路径和最终找到的文件路径
-
Dir函数作为“前线侦察兵”,负责深入文件系统,逐个识别出文件夹和文件
代码执行过程中,我们可以通过调试和添加监视,查看数据字典中的内容,如dicFolders字典:

dicFiles字典:

Dir+数据字典组合摒弃了递归的复杂性,通过清晰的循环逻辑和高效的数据结构,实现了快速、稳定且能处理任意深度文件夹结构的文件遍历

结束语
今天的分享就到这里了,咱们下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色”,解锁更多的VBA技能

823

被折叠的 条评论
为什么被折叠?



