在平时的工作中,我们经常会遇到需要处理同一文件夹下的多个文件的情况。
比如批量修改文件夹内的文件名称、批量导入文件夹内的文件内容、批量移动文件夹内的文件到另一个文件等等。
所有的这些涉及到文件夹内文件的处理,都可以归结为遍历文件夹内的文件,甚至还有需要遍历文件夹及其子文件夹内的文件。
在VBA中,我们可以通过FileSystemObject对象统一处理所有与文件夹、文件相关的操作。
FileSystemObject是封装好的统一处理文件夹、文件的对象。
在之前的文章中,我们介绍了如何遍历单层文件夹中的文件。
今天,我们介绍如何通过FileSystemObject对象遍历文件夹目录及其子文件夹目录。
遍历文件夹目录及其子文件夹目录,实际上是把每一层文件夹都作为一个新的层级,递归调用遍历单层文件夹的代码。
以下是一个通用的遍历文件夹目录及其子文件夹目录的代码:
'遍历文件夹及其子文件夹的通用过程,
'sPath参数表示要获取的文件夹的路径,bEnuSub可选参数表示是否遍历子文件夹,不提供表示不遍历子文件夹
'作者:Excel技术服务
'QQ:1722187970
'邮箱:1722187970@qq.com
Sub EnuAllFiles(ByVal sPath As String, Optional bEnuSub As Boolean = False)
'定义文件系统对象
Dim oFso As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
'定义文件夹对象
Dim oFolder As Object
Set oFolder = oFso.GetFolder(sPath)
'定义文件对象
Dim oFile As Object
'如果指定的文件夹含有文件
If oFolder.Files.Count Then
For Each oFile In oFolder.Files
With oFile
'输出文件所在的盘符
Dim sDrive As String
sDrive = .Drive
'输出文件的类型
Dim sType As String
sType = .Type
'输出含后缀名的文件名称
Dim sName As String
sName = .Name
'输出含文件名的完整路径
Dim sFilePath As String
sFilePath = .Path
'输出文件的上次修改时间
Dim dDLM
dDLM = .DateLastModified
'输出文件的上次访问时间
Dim dDLA
dDLA = .DateLastAccessed
'输出文件的创建时间
Dim dDC
dDC = .DateCreated
'输出文件的属性
Dim sATT
sATT = .Attributes
'如果文件是Word文件
If sType Like "*ord*" Then
'以下是对每个文件进行处理的代码
'*********************************
Debug.Print sFilePath
Else
End If
End With
Next
'如果指定的文件夹不含有文件
Else
End If
'如果要遍历子文件夹
If bEnuSub = True Then
'定义子文件夹集合对象
Dim oSubFolders As Object
Set oSubFolders = oFolder.SubFolders
If oSubFolders.Count > 0 Then
For Each oTempFolder In oSubFolders
sTempPath = oTempFolder.Path
Call EnuAllFiles(sTempPath, True)
Next
End If
Set oSubFolders = Nothing
End If
Set oFile = Nothing
Set oFolder = Nothing
Set oFso = Nothing
End Sub
以上代码可以作为一个通用代码,随时导入到标准模块中,如果要使用以上通用代码,只需要在子过程中调用即可,如下所示:
Sub QQ1722187970()
Call EnuAllFiles("F:\百度网盘接收的文件\练习\初级经济法", True)
End Sub
在编写VBA遍历文件夹目录及其子文件夹目录的解决方案时,还经常需要提供可以人机交互选择文件或文件夹的对话框,这时候可以通过添加选择文件夹的对话框代码。
以下是一个通用的从选择文件夹到遍历文件夹内的所有文件的通用代码:
Sub QQ1722187970()
Excel.Application.ScreenUpdating = False
Excel.Application.DisplayAlerts = False
Excel.Application.Calculation = xlCalculationManual
Dim sPath As String
'选择要操作的文件夹
sPath = GetPath()
If Len(sPath) Then
'开始遍历选中的文件夹中的所有文件
EnuAllFiles sPath, False
MsgBox "操作完成!!!"
End If
Excel.Application.Calculation = xlCalculationAutomatic
Excel.Application.DisplayAlerts = True
Excel.Application.ScreenUpdating = True
End Sub
'遍历文件夹及其子文件夹的通用过程,
'sPath参数表示要遍历的文件夹的路径,bEnuSub可选参数表示是否遍历子文件夹,不提供表示不遍历子文件夹
'作者:Excel技术服务
'QQ:1722187970
'邮箱:1722187970@qq.com
Sub EnuAllFiles(ByVal sPath As String, Optional bEnuSub As Boolean = False)
'定义文件系统对象
Dim oFso As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
'定义文件夹对象
Dim oFolder As Object
Set oFolder = oFso.GetFolder(sPath)
'定义文件对象
Dim oFile As Object
Dim oWB As Workbook
Dim oWK As Worksheet
Dim oWB1 As Workbook
Dim oWK1 As Worksheet
Set oWB = Excel.ThisWorkbook
Set oWK = oWB.Worksheets(1)
iRow = oWK.Range("A65536").End(xlUp).Row
'如果指定的文件夹含有文件
If oFolder.Files.Count Then
For Each oFile In oFolder.Files
With oFile
'输出文件所在的盘符
Dim sDrive As String
sDrive = .Drive
'输出文件的类型
Dim sType As String
sType = .Type
'输出含后缀名的文件名称
Dim sName As String
sName = .Name
'输出含文件名的完整路径
Dim sFilePath As String
sFilePath = .Path
'输出文件的上次修改时间
Dim dDLM
dDLM = .DateLastModified
'输出文件的上次访问时间
Dim dDLA
dDLA = .DateLastAccessed
'输出文件的创建时间
Dim dDC
dDC = .DateCreated
'输出文件的属性
Dim sATT
sATT = .Attributes
'如果文件是Excel文件且不是隐藏文件
If sType Like "*Excel*" And Not (sName Like "*~$*") Then
Set oWB1 = Excel.Workbooks.Open(sFilePath)
With oWB1
Set oWK1 = .Worksheets(1)
With oWK1
iRow = .Range("a65536").End(xlUp).Row
'***********************************
'其它操作代码
'***********************************
End With
Excel.Application.Calculation = xlCalculationAutomatic
.Close
End With
Else
End If
End With
Next
'如果指定的文件夹不含有文件
Else
End If
'如果要遍历子文件夹
If bEnuSub = True Then
'定义子文件夹集合对象
Dim oSubFolders As Object
Set oSubFolders = oFolder.SubFolders
If oSubFolders.Count > 0 Then
For Each oTempFolder In oSubFolders
sTempPath = oTempFolder.Path
Call EnuAllFiles(sTempPath, True)
Next
End If
Set oSubFolders = Nothing
End If
Set oFile = Nothing
Set oFolder = Nothing
Set oFso = Nothing
End Sub
Function GetPath() As String
'声明一个FileDialog对象变量
Dim oFD As FileDialog
' '创建一个选择文件对话框
' Set oFD = Application.FileDialog(msoFileDialogFilePicker)
'创建一个选择文件夹对话框
Set oFD = Application.FileDialog(msoFileDialogFolderPicker)
'声明一个变量用来存储选择的文件名或者文件夹名称
Dim vrtSelectedItem As Variant
With oFD
'允许选择多个文件
.AllowMultiSelect = True
'使用Show方法显示对话框,如果单击了确定按钮则返回-1。
If .Show = -1 Then
'遍历所有选择的文件
For Each vrtSelectedItem In .SelectedItems
'获取所有选择的文件的完整路径,用于各种操作
GetPath = vrtSelectedItem
Next
'如果单击了取消按钮则返回0
Else
End If
End With
'释放对象变量
Set oFD = Nothing
End Function
Function GetFileName(ByVal sName As String)
'获取不含后缀符的纯文件名的自定义函数
Dim sTemp As String
sTemp = sName
'判断后缀名分隔符.的位置
iPos = Len(sTemp) - VBA.InStr(1, VBA.StrReverse(sTemp), ".")
If iPos <> 0 Then
sTemp = Mid(sTemp, 1, iPos)
End If
'判断路径分隔符\的位置
iPos = VBA.InStr(1, sTemp, "\")
If iPos <> 0 Then
'反转后好取字符
iPos = VBA.InStr(1, VBA.StrReverse(sTemp), "\")
sTemp = Mid(VBA.StrReverse(sTemp), 1, iPos - 1)
sTemp = VBA.StrReverse(sTemp)
End If
GetFileName = sTemp
End Function


Pingback引用通告: VBA每日一练(13) 用dir 查找文件夹,特定文件名,文件类型,遍历等 – 小飞侠 /