VBA 实现:递归遍历指定文件夹及其子文件夹内所有文件和文件夹 Sub FSOtest() '遍历目标文件夹内所有文件、以及所有子文件夹中的所有文件 Dim myPath As String '声明变量myPath用于存储选择的文件夹路径 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "请选择文件夹" '设置对话框标题,可根据需求修改 If .Show Then '显示文件夹选择对话框,如果用户选择了文件夹 myPath = .SelectedItems(1) '获取用户选择的文件夹路径 Else Exit Sub '如果用户取消选择,退出当前子过程 End If End With If Right(myPath, 1) "\" Then '检查路径末尾是否缺少路径分隔符 myPath = myPath & "\" '如果缺少,添加路径分隔符 End If [a:a] = "" '清空A列数据 Call ListAllFso(myPath) '调用ListAllFso过程,传入选择的文件夹路径,开始遍历 End Sub Function ListAllFso(myPath As String) '用FSO方法遍历并列出所有文件和文件夹 Dim fld As Object '声明对象变量fld用于存储文件夹对象 Set fld = CreateObject("Scripting.FileSystemObject").GetFolder(myPath) '用FSO方法得到当前路径的文件夹对象实例 注意这里的【当前路径myPath是个递归变量】 Dim f As Object '声明对象变量f用于遍历文件 For Each f In fld.Files '遍历当前文件夹内所有【文件.Files】 Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = f.Name '在A列逐个列出文件名 Next f Dim fd As Object '声明对象变量fd用于遍历子文件夹 For Each fd In fld.SubFolders '遍历当前文件夹内所有【子文件夹.SubFolders】 Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = " " & fd.Name & "\" '在A列逐个列出子文件夹名 Call ListAllFso(fd.Path) '传入当前子文件夹的路径fd.Path,继续向下递归调用 '注意重点在这里: 继续向下调用递归过程【遍历子文件夹内所有文件文件夹对象】 Next fd End Function 说明: 在Sub ListFilesTest2()中,补充了变量声明,使代码结构更清晰。同时对Application.FileDialog对话框添加了标题设置示例。 在Function ListAllFso()中,明确声明了遍历用的对象变量,并将[a65536].End(3).Offset(1)这种相对模糊的写法改为更规范的Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) ,这是 Excel VBA 中常用的获取最后一行非空单元格并向下偏移的写法。