VBA代码大全010:如何用vba遍历文件夹及其子文件夹内的所有文件?

您所在的位置:网站首页 vba文件夹下所有文件都打开 VBA代码大全010:如何用vba遍历文件夹及其子文件夹内的所有文件?

VBA代码大全010:如何用vba遍历文件夹及其子文件夹内的所有文件?

2024-07-09 16:15| 来源: 网络整理| 查看: 265

VBA代码大全010:如何用vba遍历文件夹及其子文件夹内的所有文件? 2017年5月16日 作者:水星Excel 11,028 次浏览 1评论

在平时的工作中,我们经常会遇到需要处理同一文件夹下的多个文件的情况。

比如批量修改文件夹内的文件名称、批量导入文件夹内的文件内容、批量移动文件夹内的文件到另一个文件等等。

所有的这些涉及到文件夹内文件的处理,都可以归结为遍历文件夹内的文件,甚至还有需要遍历文件夹及其子文件夹内的文件。

在VBA中,我们可以通过FileSystemObject对象统一处理所有与文件夹、文件相关的操作。

FileSystemObject是封装好的统一处理文件夹、文件的对象。

在之前的文章中,我们介绍了如何遍历单层文件夹中的文件。

今天,我们介绍如何通过FileSystemObject对象遍历文件夹目录及其子文件夹目录。

遍历文件夹目录及其子文件夹目录,实际上是把每一层文件夹都作为一个新的层级,递归调用遍历单层文件夹的代码。

以下是一个通用的遍历文件夹目录及其子文件夹目录的代码:

'遍历文件夹及其子文件夹的通用过程, 'sPath参数表示要获取的文件夹的路径,bEnuSub可选参数表示是否遍历子文件夹,不提供表示不遍历子文件夹 '作者:Excel技术服务 'QQ:1722187970 '邮箱:[email protected] 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 '邮箱:[email protected] 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 其它相关文章推荐:什么是vba中的文件号(file number)?如何用vba批量设置或删除ppt中的组合图形?其它软件带分隔符的多行文本如何快速转换成Excel的一列?如何在C#中进行逻辑判断、大小比较?如何用vba把ppt文档发布转化为pdf格式文件?如何用vba拆分word表格? 分类 :  VBA , VBA代码大全 , 文件、文件夹、目录 标签 :  DateCreated , DateLastAccessed , DateLastModified , FileSystemObject , GetFolder , 子文件夹 , 文件夹 , 递归 , 遍历        

声明: 本站文章均属原创,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则视为侵权。如果想要每天都收到本站的技术文章推送,可以微信搜索公众号:水星Excel或者Excel_Office关注。其它事宜请加QQ:1722187970 或微信号:xycgenius 联系。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3