Microsoft Lab
全部软件
Excel工作簿与工作表对象(Workbook and Worksheet Object)约 7 分钟

Files in a Directory 遍历目录下的文件

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


事前准备

下载 Book1.xlsx 到 Book5.xlsx 五个范例文件,放进 C:\test\ 资料夹。


完整代码

Sub Files_In_A_Directory()
    ' 第1步:声明变量
    Dim directory As String, fileName As String, sheet As Worksheet, i As Integer, j As Integer

    ' 第2步:关闭屏幕更新,加快执行速度
    Application.ScreenUpdating = False

    ' 第3步:初始化目录变量,用 Dir 函数找第一个符合条件的文件
    directory = "c:\test\"
    fileName = Dir(directory & "\*.xl??")

    ' 第4步:建立 Do While 循环,只要还找得到文件就继续
    Do While fileName <> ""

        ' 第5步:记录第几个文件,把文件名写进 A 列
        i = i + 1
        j = 2
        Cells(i, 1) = fileName

        ' 第6步:打开这个 Excel 文件
        Workbooks.Open (directory & fileName)

        ' 第7步:把这个文件里每张工作表的名称写进对应行
        For Each sheet In Workbooks(fileName).Worksheets
            Workbooks("files-in-a-directory.xlsm").Worksheets(1).Cells(i, j).Value = sheet.Name
            j = j + 1
        Next sheet

        ' 第8步:关闭这个文件
        Workbooks(fileName).Close

        ' 第9步:找下一个符合条件的文件
        fileName = Dir()

    Loop

    ' 第10步:恢复屏幕更新
    Application.ScreenUpdating = True
End Sub

代码逻辑说明

  • Dir(directory & "\*.xl??"):Dir 函数配合通配符 * 和 ?,可以搜出 .xls / .xlsx / .xlsm 等各种 Excel 文件
  • Do While fileName <> "":Dir 函数每次调用会返回下一个符合条件的文件名,如果没有更多文件了就返回空字符串,循环靠这个条件自动结束
  • fileName = Dir():在循环最后不带参数调用 Dir(),代表"继续找下一个",不是重新开始搜索
  • 从关闭状态的 Excel 文件读取工作表名称,必须先用 Workbooks.Open 把它打开才能读取,读完记得 Close 释放掉,避免开一堆文件占内存

代码怎么运行

  1. Alt+F11 打开 VBA 编辑器,Insert›Module,贴入代码
  2. 把当前工作簿另存为 files-in-a-directory.xlsm
  3. 回到工作表放命令按钮,绑定 Files_In_A_Directory
  4. 点击按钮,A 列会列出资料夹里每个文件名,后面的列会列出该文件包含的工作表名称
📷 画面提示

宏运行完成后的工作表,A 列是各个文件名,右边几列是每个文件底下的工作表名称


学完你会

常见错误

  • 代码里 Workbooks("files-in-a-directory.xlsm") 这段写死了文件名,如果把工作簿另存成别的名字,代码要跟着改,否则会报"找不到工作簿"的错误
  • 忘记在最后把 Application.ScreenUpdating 改回 True,会导致后续操作画面一直不刷新
  • Dir 函数一次只能维持一个搜索状态,如果在循环中间又调用了另一个 Dir(...) 搜索别的条件,会打断原本这个循环的搜索进度

Sources

Blog / Website:

  1. Files in a Directory
只记在你的浏览器里,换设备不会同步。