|
excelhome论坛川香裙子的递归简化版,我把所有用不到的东西都删掉了:
Sub ListFilesTest()
With Application.FileDialog(msoFileDialogFolderPicker) '文件对话框选择文件路径
If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
End With
If Right(myPath, 1) <> "" Then myPath = myPath & ""
If [a100000].End(3).Row > 10 Then '清除原有文件列表,要根据自己要求修改。我测试时是从第11行开始存放文件,所以起始是cells(11,1)
Range(Cells(11, 1), Cells([a100000].End(3).Row, 2)).ClearContents
End If
Call GetAllFolderList(myPath) '调用递归函数,参数只有一个:路径
End Sub
Function GetAllFolderList(myPath As String) '递归函数
Set myFolder = CreateObject("Scripting.FileSystemObject").GetFolder(myPath) '创建文件检索系统
For Each mySubFolder In myFolder.Subfolders '遍历子目录
Cells([a1000000].End(xlUp).Row + 1, 1) = "【" & mySubFolder.Name & "】" '所有的目录都用【】括起来,以示与文件的区别
Cells([a1000000].End(xlUp).Row, 2) = mySubFolder.Path '完整路径。如果不需要子目录,这段代码是不需要的
Call GetAllFolderList(mySubFolder.Path) '调用递归检索子目录
Next
For Each mySubFile In myFolder.Files '遍历文件
Cells([a1000000].End(xlUp).Row + 1, 1) = mySubFile.Name '显示文件
Cells([a1000000].End(xlUp).Row, 2) = myPath '文件所在的完整路径
Next
End Function
1、递归检索是最简洁的文件检索代码,可以用双循环替代;
2、这段代码并不能对系统盘进行全盘检索,因为系统盘会有特殊用途的隐藏目录,这些目录具有很特殊格式,需要特别处理。普通目录都是可以的;
3、要具有实用性,不能把目录定义的太大,会很花时间。如果对一个以T容量为单位的数据盘进行全盘检索,可能需要十几分钟或更长,你在资源管理器里试一下就知道了。因为是递归,或许还会出现堆栈溢出。递归虽然简洁,但数据量过大,出问题的概率也大。当然这并不常见;
4、关于双击打开文件,百度上就有答案,我测试了可以用:CreateObject("Wscript.Shell").Run ("pdf文件路径+名称")
|
|