VBA实用小程序72:遍历文件夹(和子文件夹)中的文件

2021-04-21 16:38:22 浏览数 (1)

很多时候,我们都想要遍历文件夹中的每个文件,例如在工作表中列出所有文件名、对每个文件进行修改。VBA给我们提供了一些方式:(1)Dir函数;(2)File System Object。

使用Dir函数

Dir函数是一个内置的VBA函数,可用于可使用VBA的任何应用程序。

使用File System Object(FSO)

File System Object(FSO)是一个单独的操作库,我们可以在VBA代码中使用它。有两种方法可以打开FSO库,即早期绑定或后期绑定。如果你不确定要使用哪个,建议使用后期绑定。它可能会导致代码速度变慢,但运行时的错误应该更少。

早期绑定

在VBE编辑器中,单击“工具——引用”。在“引用”对话框中,找到并选取“MicrosoftScripting Runtime”,单击“确定”按钮。

图1

后期绑定

后期绑定不需要任何特定操作来启用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

注:本文整理自exceloffthegrid.com,供有兴趣的朋友学习参考。

0 人点赞