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 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

技术交流,软件开发,欢迎微信沟通:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwLink1996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值