您的位置:首页 > 文旅 > 美景 > VBA学习(21):遍历文件夹(和子文件夹)中的文件

VBA学习(21):遍历文件夹(和子文件夹)中的文件

2024/12/22 20:51:52 来源:https://blog.csdn.net/nianfen/article/details/140465657  浏览:    关键词:VBA学习(21):遍历文件夹(和子文件夹)中的文件

很多时候,我们都想要遍历文件夹中的每个文件,例如在工作表中列出所有文件名、对每个文件进行修改。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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com