很多时候,我们都想要遍历文件夹中的每个文件,例如在工作表中列出所有文件名、对每个文件进行修改。VBA给我们提供了一些方式:(1)Dir函数;(2)File System Object。
使用Dir函数
Dir函数是一个内置的VBA函数,可用于可使用VBA的任何应用程序。
使用File System Object(FSO)
File System Object(FSO)是一个单独的操作库,我们可以在VBA代码中使用它。有两种方法可以打开FSO库,即早期绑定或后期绑定。如果你不确定要使用哪个,建议使用后期绑定。它可能会导致代码速度变慢,但运行时的错误应该更少。
早期绑定
在VBE编辑器中,单击“工具——引用”。在“引用”对话框中,找到并选取“MicrosoftScripting Runtime”,单击“确定”按钮。
后期绑定
后期绑定不需要任何特定操作来启用FSO库,确保在VBA代码中需要时打开库。
遍历文件夹中所有文件
下面的示例代码将文件名打印到立即窗口,很容易修改这些代码以更适合你的具体情况。
方法1:使用Dir函数
Sub LoopAllFilesInAFolder()
'遍历文件夹中的所有文件
Dim fileName As Variant
fileName =Dir("D:\excelperfect\")
While fileName <> ""
'插入对每个文件要执行的操作
'本示例代码打印文件名到立即窗口
Debug.Print fileName
'设置fileName指向下一个文件
fileName = Dir
Wend
End Sub
上面的代码可以很容易地通过使用通配符进行调整。例如:
‘遍历带有扩展名”.xlsx”的每个文件
filename =Dir(“D:\excelperfect\*.xlsx”)
‘遍历文件名中包含单词”January”的每个文件
filename =Dir(“D:\excelperfect\*January*”)
‘遍历文件夹中的每个文本文件
filename =Dir(“D:\excelperfect\*.txt”)
方法2:使用File System Object(FSO)后期绑定
Sub LoopAllFilesInFolder1()
Dim folderName As String
Dim FSOLibrary As Object
Dim FSOFolder As Object
Dim FSOFile As Object
'将文件名赋值给变量
folderName = "D:\excelperfect\"
'设置对FSO库的所有引用
Set FSOLibrary =CreateObject("Scripting.FileSystemObject")
Set FSOFolder =FSOLibrary.GetFolder(folderName)
Set FSOFile = FSOFolder.Files
'使用For Each循环遍历文件夹中的每个文件
For Each FSOFile In FSOFile
'插入对每个文件要执行的操作
' 本示例代码打印文件名到立即窗口
Debug.Print FSOFile.Name
Next
'释放内存
Set FSOLibrary = Nothing
Set FSOFolder = Nothing
Set FSOFile = Nothing
End Sub
方法3:使用File System Object(FSO)早期绑定
要使用本方法,记得像本文开头那样开启对FSO库的引用。
Sub LoopFilesInFolder2()
Dim folderName As String
Dim FSOLibrary As FileSystemObject
Dim FSOFolder As Object
Dim FSOFile As Object
'将文件名赋值给变量
folderName = "D:\excelperfect\"
'设置对FSO库的所有引用
Set FSOLibrary = New FileSystemObject
Set FSOFolder =FSOLibrary.GetFolder(folderName)
Set FSOFile = FSOFolder.Files
'使用For Each循环遍历文件夹中的每个文件
For Each FSOFile In FSOFile
'插入对每个文件要执行的操作
' 本示例代码打印文件名到立即窗口
Debug.Print FSOFile.Name
Next
'释放内存
Set FSOLibrary = Nothing
Set FSOFolder = Nothing
Set FSOFile = Nothing
End Sub
遍历子文件夹中所有文件
当文件存储在子文件夹中时,可能就需要一些技巧了。现在需要找到一种方法来钻取到这些子文件夹中。我们将使用上述相同的Dir和FSO方法。为了确保这些代码可以处理任意数量的子文件夹,宏实际上会调用自身(一种称为递归的技术)。
方法1:使用Dir函数
这个示例将把完整的文件路径(文件夹路径和文件名)打印到立即窗口。
Sub loopAllSubFolderSelectStartDirectory()
'调用LoopAllSubFolders过程
Call LoopAllSubFolders("D:\excelperfect\")
End Sub
Sub LoopAllSubFolders(ByVal folderPath As String)
Dim fileName As String
Dim fullFilePath As String
Dim numFolders As Long
Dim folders() As String
Dim i As Long
If Right(folderPath, 1) <>"\" Then folderPath = folderPath & "\"
fileName = Dir(folderPath &"*.*", vbDirectory)
While Len(fileName) <> 0
If Left(fileName, 1) <>"." Then
fullFilePath = folderPath &fileName
If (GetAttr(fullFilePath) And vbDirectory) = vbDirectory Then
ReDim Preserve folders(0 TonumFolders) As String
folders(numFolders) =fullFilePath
numFolders = numFolders + 1
Else
'插入对每个文件要执行的操作
'本示例代码打印完整文件路径和文件名到立即窗口
Debug.Print folderPath &fileName
End If
End If
fileName = Dir()
Wend
For i = 0 To numFolders - 1
LoopAllSubFolders folders(i)
Next i
End Sub
方法2:使用File System Object(FSO)后期绑定
运行下面的过程:
Sub loopAllSubFolderSelectStartDirectory1()
Dim FSOLibrary As Object
Dim FSOFolder As Object
Dim folderName As String
'将文件夹名赋值给变量
folderName = "D:\excelperfect\"
'设置对FSO库的引用
Set FSOLibrary = CreateObject("Scripting.FileSystemObject")
'调用LoopAllSubFolders1过程
LoopAllSubFolders1 FSOLibrary.GetFolder(folderName)
End Sub
SubLoopAllSubFolders1(FSOFolder As Object)
Dim FSOSubFolder As Object
Dim FSOFile As Object
'遍历每个子文件夹
For Each FSOSubFolder In FSOFolder.SubFolders
LoopAllSubFolders1 FSOSubFolder
Next
'遍历每个文件并打印名字
For Each FSOFile In FSOFolder.Files
'插入对每个文件要执行的操作
'本示例代码打印完整文件路径和文件名到立即窗口
Debug.Print FSOFile.Path
Next
End Sub
方法3:使用File System Object(FSO)早期绑定
要使用本方法,记得像本文开头那样开启对FSO库的引用。
Sub loopAllSubFolderSelectStartDirectory2()
Dim FSOLibrary As FileSystemObject
Dim FSOFolder As Object
Dim folderName As String
'将文件夹名赋值给变量
folderName = "D:\excelperfect\"
'设置对FSO库的引用
Set FSOLibrary = New FileSystemObject
'调用LoopAllSubFolders2过程
LoopAllSubFolders2 FSOLibrary.GetFolder(folderName)
End Sub
Sub LoopAllSubFolders2(FSOFolder As Object)
Dim FSOSubFolder As Object
Dim FSOFile As Object
'遍历每个子文件夹
For Each FSOSubFolder In FSOFolder.SubFolders
LoopAllSubFolders2 FSOSubFolder
Next
'遍历每个文件并打印名字
For Each FSOFile In FSOFolder.Files
'插入对每个文件要执行的操作
'本示例代码打印完整文件路径和文件名到立即窗口
Debug.Print FSOFile.Path
Next
End Sub