使用 Excel VBA 递归列出文件和文件夹
出版日期:
更新:
技术文章 > 使用 Excel VBA 递归列出文件和文件夹
2026 状态和安全使用
结论:递归访问每个文件夹,发出您需要的文件,并将每个子文件夹传递回同一过程。添加显式错误处理以及针对结点、符号链接、隐藏文件夹和拒绝访问路径的策略。
你将学到什么
- FileSystemObject 如何公开文件夹、子文件夹、文件、名称和路径。
- 递归如何构建完整的树以及为什么深层树或循环树需要保护措施。
- 如何将结果写入工作表,而无需大规模缓慢的逐单元格操作。
适用人群:正在清点受控 Windows 目录树的 Excel 用户。
2026年位置:该示例反映了作者原始的本地测试。验证目录结构副本上的权限和链接行为,并考虑使用 PowerShell 或用于非常大或安全敏感的树的专用清单工具。
安全注意事项:原始文章中的命令和配置示例尚未在当前生产环境中重新运行。应用之前,请在单独的测试环境中验证支持的版本、备份、访问控制和回滚步骤。
官方主要来源
概述。
本文介绍如何使用 VBA(Excel 宏)递归列出文件和文件夹,涵盖以下任务:
- 列出目录下所有文件或文件夹的完整路径。
- 你想对一个文件夹下的文件或文件夹进行循环处理。
1. 编程方法
以下是编程的参考例子。
示例将逻辑定义为 Function,可按原样复制并从 Sub 过程调用。
'Parameter Examples
'## filePath C:\Users\user\Desktop\test\
'## kind false:folder, true:file
'## list
Function getFolderOrFile(filePath As String, kind As Boolean, list As Collection) As Collection
'delete\
Dim filePathEnd As String
filePathEnd = Right(filePath, 1)
If filePathEnd = "\" Then
filePath = Left(filePath, Len(filePath) - 1)
End If
'Folder existence check
Dim result As String
result = Dir(filePath, vbDirectory)
If result = "" Then
MsgBox "File does not exist!"
Exit Function
End If
If kind Then
Dim buf As String
buf = Dir(filePath & "\*.*")
Do While buf <> ""
list.Add filePath & "\" & buf
buf = Dir()
Loop
Else
list.Add filePath
End If
Dim folder As Object
With CreateObject("Scripting.FileSystemObject")
For Each folder In .GetFolder(filePath).SubFolders
getFolderOrFile folder.Path, kind, list
Next folder
End With
End Function
要使用它,请将以下内容作为参数传递。
- filePath:目录。 例子。)C:\Users\user\Desktop\test
- kind:传真,传假。 如果为真,则返回一个文件列表。 如果是false,返回一个文件夹列表。
- list:该集合用于存储结果。 下面是一个实施的例子。
下面是一个实际函数调用的实现例子。
Sub test()
Dim list As Collection
Set list = New Collection
getFolderOrFile "C:\Users\user\Desktop\test", False, list
Dim item As Variant
For Each item In list
'------TODO------
ThisWorkbook.Worksheets(1).Cells(1, 1).Value = item
Next
End Sub
调用getFolderOrFile将在列表中存储一个文件或一个文件夹列表。 实施例是假的,所以文件夹的列表被存储。
在For语句的 "TODO "部分描述你想做的过程。 ITEM可以被视为一个字符串变量。
参考来源是在Excel中把获得的列表设置为A1的过程。 (这个过程会重复覆盖同一个单元。)
2. 代码描述。
关于如何使用该系统的说明到此为止,接下来是对代码的解释。
细节可以在代码中看到,但关键点在于getFolderOrFile方法中对getFolderOrFile的进一步调用。
在搜索文件夹的过程中,通过调用搜索文件夹的过程,进一步重复这一过程,这是一种搜索所有文件夹的机制。
通过调用自己的方法,只要找到文件夹,它就反复调用自己的方法,搜索所有的文件夹。
3. 摘要
如果你需要帮助了解如何使用VBA(Excel宏)获得文件列表和文件夹列表,包括子文件夹,请参考本节。