【Excel VBA 编程】第84讲:Dir“黑科技”——内置命令遇上数据字典,文件整理效率飙升!

上一期我们通过FSO递归法方式获取到了指定路径下的文件列表,那么还有没有其他方法呢?我们来继续探讨

前文提到过VBA提供了两种方式来操作文件和文件夹,一是使用VBA自带的内置命令和函数,二是借助功能更丰富的FileSystemObject(FSO)对象模型

那么,如果使用VBA自带的内置命令Dir能不能实现呢?一起来揭晓答案吧

Dir调用机制

一提到Dir,可能很多朋友第一反应是脑海一片空白,既熟悉又陌生的感觉——它似乎在哪里见过,却又一时想不起具体是什么;这种模糊的印象,就像偶尔在嘴边却叫不出名字的老熟人,让人既感到亲近又有些距离,所以有必要先回顾一下Dir知识

Dir函数用于返回与指定模式或属性匹配的文件名或目录名。其调用机制:首次调用时必须带参数,后续调用同一批文件时则不应带参数

这个机制是实现文件遍历的核心,但是不好理解,举个例子说明一下。

以下代码实现的主要功能:获取"D:\常用文件\VBA"路径下全部文件(*.*)名称

    Dim fileName As String    fileName = 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 String    Dim dicFolders As Object, dicFiles As Object    Dim i As Long, arrKeys As Variant    Set dicFolders = CreateObject("Scripting.Dictionary")    Set dicFiles = CreateObject("Scripting.Dictionary")    MyPath = "D:\常用文件\"  '执行前需要修改    dicFolders.Add MyPath, ""    i = 0    Do While i < dicFolders.count        arrKeys = dicFolders.Keys '        MyName = Dir(arrKeys(i), vbDirectory)        Do While MyName <> ""            If MyName <> "." And MyName <> ".." Then                If (GetAttr(arrKeys(i) & MyName) And vbDirectory) = vbDirectory Then                    dicFolders.Add arrKeys(i) & MyName & "\", ""                End If            End If            MyName = Dir()        Loop        i = i + 1    Loop    For Each arrKeys In dicFolders.Keys        MyFileName = Dir(arrKeys & "*.*")        Do While MyFileName <> ""            dicFiles.Add arrKeys & MyFileName, ""            MyFileName = Dir()        Loop    Next    Dim rng As Range    Set 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技能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wei1019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值