VBA遍历文件夹常用有三种方法

  1. 这三种方法中,filesearch不适合2007和2010版本,而且速度比较慢,递归法速度也慢。只有用DIR加循环的方法,速度飞快。下面是三种方法的代码:

  2. 1、filesearch法

  3. Sub test3()

  4. Dim wb As Workbook

  5. Dim i As Long

  6. Dim t

  7. t = Timer

  8. With Application.FileSearch '调用fileserch对象

  9. .NewSearch '开始新的搜索

  10. .LookIn = ThisWorkbook.path  '设置搜索的路径

  11. .SearchSubFolders = True '搜索范围包括 LookIn 属性指定的文件夹中的所有子文件夹

  12. .Filename = "*.xls" '设置搜索的文件类型

  13. ' .FileType = msoFileTypeExcelWorkbooks

  14. If .Execute() > 0 Then '如果找到文件

  15. For i = 1 To .FoundFiles.Count

  16. 'On Error Resume Next

  17. Cells(i, 1) = .FoundFiles(i) '把找到的文件放在单元格里

  18. Next i

  19. Else

  20. MsgBox "没找到文件"

  21. End If

  22. End With

  23. MsgBox Timer - t

  24. End Sub

  25. 2、递归法

  26. Sub Test()

  27. Dim iPath As String, i As Long

  28. Dim t

  29. t = Timer

  30. With Application.FileDialog(msoFileDialogFolderPicker)

  31. .Title = "请选择要查找的文件夹"

  32. If .Show Then

  33. iPath = .SelectedItems(1)

  34. End If

  35. End With

  36. If iPath = "False" Or Len(iPath) = 0 Then Exit Sub

  37. i = 1

  38. Call GetFolderFile(iPath, i)

  39. MsgBox Timer - t

  40. MsgBox "文件名链接获取完毕。", vbOKOnly, "提示"

  41. End Sub

  42. Private Sub GetFolderFile(ByVal nPath As String, ByRef iCount As Long)

  43. Dim iFileSys

  44. 'Dim iFile As Files, gFile As File

  45. 'Dim iFolder As Folder, sFolder As Folders, nFolder As Folder

  46. Set iFileSys = CreateObject("Scripting.FileSystemObject")

  47. Set iFolder = iFileSys.GetFolder(nPath)

  48. Set sFolder = iFolder.SubFolders

  49. Set iFile = iFolder.Files

  50. With ActiveSheet

  51. For Each gFile In iFile

  52. ' .Hyperlinks.Add anchor:=.Cells(iCount, 1), Address:=gFile.path, TextToDisplay:=gFile.Name

  53. iCount = iCount + 1

  54. Next

  55. End With

  56. '递归遍历所有子文件夹

  57. For Each nFolder In sFolder

  58. Call GetFolderFile(nFolder.path, iCount)

  59. Next

  60. End Sub

  61. 3、dir循环法

  62. Sub Test() '使用双字典,旨在提高速度

  63. Dim MyName, Dic, Did, i, t, F, TT, MyFileName

  64. 'On Error Resume Next

  65. Set objShell = CreateObject("Shell.Application")

  66. Set objFolder = objShell.BrowseForFolder(0, "选择文件夹", 0, 0)

  67. If Not objFolder Is Nothing Then lj = objFolder.self.path & "\"

  68. Set objFolder = Nothing

  69. Set objShell = Nothing

  70. t = Time

  71. Set Dic = CreateObject("Scripting.Dictionary")    '创建一个字典对象

  72. Set Did = CreateObject("Scripting.Dictionary")

  73. Dic.Add (lj), ""

  74. i = 0

  75. Do While i < Dic.Count

  76. Ke = Dic.keys   '开始遍历字典

  77. MyName = Dir(Ke(i), vbDirectory)    '查找目录

  78. Do While MyName <> ""

  79. If MyName <> "." And MyName <> ".." Then

  80. If (GetAttr(Ke(i) & MyName) And vbDirectory) = vbDirectory Then    '如果是次级目录

  81. Dic.Add (Ke(i) & MyName & "\"), ""  '就往字典中添加这个次级目录名作为一个条目

  82. End If

  83. End If

  84. MyName = Dir    '继续遍历寻找

  85. Loop

  86. i = i + 1

  87. Loop

  88. Did.Add ("文件清单"), ""    '以查找D盘下所有EXCEL文件为例

  89. For Each Ke In Dic.keys

  90. MyFileName = Dir(Ke & "*.xls")

  91. Do While MyFileName <> ""

  92. Did.Add (Ke & MyFileName), ""

  93. MyFileName = Dir

  94. Loop

  95. Next

  96. For Each Sh In ThisWorkbook.Worksheets

  97. If Sh.Name = "XLS文件清单" Then

  98. Sheets("XLS文件清单").Cells.Delete

  99. F = True

  100. Exit For

  101. Else

  102. F = False

  103. End If

  104. Next

  105. If Not F Then

  106. Sheets.Add.Name = "XLS文件清单"

  107. End If

  108. Sheets("XLS文件清单").[A1].Resize(Did.Count, 1) = WorksheetFunction.Transpose(Did.keys)

  109. TT = Time - t

  110. MsgBox Minute(TT) & "分" & Second(TT) & "秒"

  111. End Sub

(0)

相关推荐