很多时候,我们都想要遍历文件夹中的每个文件,例如在工作表中列出所有文件名、对每个文件进行修改。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 VariantfileName =Dir("D:\excelperfect\")While fileName <> ""'插入对每个文件要执行的操作'本示例代码打印文件名到立即窗口Debug.Print fileName'设置fileName指向下一个文件fileName = DirWend
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 StringDim FSOLibrary As ObjectDim FSOFolder As ObjectDim 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.NameNext'释放内存Set FSOLibrary = NothingSet FSOFolder = NothingSet FSOFile = Nothing
End Sub
方法3:使用File System Object(FSO)早期绑定
要使用本方法,记得像本文开头那样开启对FSO库的引用。
Sub LoopFilesInFolder2()Dim folderName As StringDim FSOLibrary As FileSystemObjectDim FSOFolder As ObjectDim FSOFile As Object'将文件名赋值给变量folderName = "D:\excelperfect\"'设置对FSO库的所有引用Set FSOLibrary = New FileSystemObjectSet FSOFolder =FSOLibrary.GetFolder(folderName)Set FSOFile = FSOFolder.Files'使用For Each循环遍历文件夹中的每个文件For Each FSOFile In FSOFile'插入对每个文件要执行的操作' 本示例代码打印文件名到立即窗口Debug.Print FSOFile.NameNext'释放内存Set FSOLibrary = NothingSet FSOFolder = NothingSet FSOFile = Nothing
End Sub
遍历子文件夹中所有文件
当文件存储在子文件夹中时,可能就需要一些技巧了。现在需要找到一种方法来钻取到这些子文件夹中。我们将使用上述相同的Dir和FSO方法。为了确保这些代码可以处理任意数量的子文件夹,宏实际上会调用自身(一种称为递归的技术)。
方法1:使用Dir函数
这个示例将把完整的文件路径(文件夹路径和文件名)打印到立即窗口。
Sub loopAllSubFolderSelectStartDirectory()'调用LoopAllSubFolders过程Call LoopAllSubFolders("D:\excelperfect\")
End SubSub LoopAllSubFolders(ByVal folderPath As String)Dim fileName As StringDim fullFilePath As StringDim numFolders As LongDim folders() As StringDim i As LongIf Right(folderPath, 1) <>"\" Then folderPath = folderPath & "\"fileName = Dir(folderPath &"*.*", vbDirectory)While Len(fileName) <> 0If Left(fileName, 1) <>"." ThenfullFilePath = folderPath &fileNameIf (GetAttr(fullFilePath) And vbDirectory) = vbDirectory ThenReDim Preserve folders(0 TonumFolders) As Stringfolders(numFolders) =fullFilePathnumFolders = numFolders + 1Else'插入对每个文件要执行的操作'本示例代码打印完整文件路径和文件名到立即窗口Debug.Print folderPath &fileNameEnd IfEnd IffileName = Dir()WendFor i = 0 To numFolders - 1LoopAllSubFolders folders(i)Next i
End Sub
方法2:使用File System Object(FSO)后期绑定
运行下面的过程:
Sub loopAllSubFolderSelectStartDirectory1()Dim FSOLibrary As ObjectDim FSOFolder As ObjectDim folderName As String'将文件夹名赋值给变量folderName = "D:\excelperfect\"'设置对FSO库的引用Set FSOLibrary = CreateObject("Scripting.FileSystemObject")'调用LoopAllSubFolders1过程LoopAllSubFolders1 FSOLibrary.GetFolder(folderName)
End SubSubLoopAllSubFolders1(FSOFolder As Object)Dim FSOSubFolder As ObjectDim FSOFile As Object'遍历每个子文件夹For Each FSOSubFolder In FSOFolder.SubFoldersLoopAllSubFolders1 FSOSubFolderNext'遍历每个文件并打印名字For Each FSOFile In FSOFolder.Files'插入对每个文件要执行的操作'本示例代码打印完整文件路径和文件名到立即窗口Debug.Print FSOFile.PathNext
End Sub
方法3:使用File System Object(FSO)早期绑定
要使用本方法,记得像本文开头那样开启对FSO库的引用。
Sub loopAllSubFolderSelectStartDirectory2()Dim FSOLibrary As FileSystemObjectDim FSOFolder As ObjectDim 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 ObjectDim FSOFile As Object'遍历每个子文件夹For Each FSOSubFolder In FSOFolder.SubFoldersLoopAllSubFolders2 FSOSubFolderNext'遍历每个文件并打印名字For Each FSOFile In FSOFolder.Files'插入对每个文件要执行的操作'本示例代码打印完整文件路径和文件名到立即窗口Debug.Print FSOFile.PathNext
End Sub