在用vba编写自动化解决方案时,最常见的需求就是遍历文件夹内的文件,然后进行相对应的处理。

在vba中,内置了Dir?redirectedfrom=MSDN)函数可以返回模糊查找匹配的文件夹或文件名称。在vba中使用Dir函数可以实现遍历文件夹和文件的需求。

今天就让我们一起来学习下如何用dir函数遍历文件夹和文件,今天的主要内容有以下几个:

  1. Dir函数的使用说明
  2. 用Dir函数判断文件夹或文件是否存在
  3. 用Dir函数遍历文件夹下的所有文件

一、Dir函数的使用说明

Dir函数可以返回一个字符串,这个字符串表示的是文件夹的名称或文件的名称。

Dir函数的语法如下:

Dir[(pathname[, attributes])]

其中pathname参数表示要返回的文件或文件夹所在的路径,该参数可以使用*和?作为通配符进行模糊查找。

attributes参数表示指定要返回的文件或文件夹的属性。

attributes参数可以选择以下值或者以下值的和:

常量 说明
vbNormal 0 默认值,表示指定返回没有任何属性的文件
vbReadOnly 1 表示指定返回没有任何属性和具有只读属性的文件
vbHidden 2 表示指定返回没有任何属性和具有隐藏属性的文件
VbSystem 4 表示指定返回没有任何属性和具有系统属性的文件,该参数在苹果系统上无效。
vbVolume 8 表示指定返回指定路径的磁盘卷标,该参数在苹果系统上无效。
vbDirectory 16 表示指定返回没有任何属性的文件和文件夹
vbAlias 64 表示要查找的文件名是一个别名,该参数只在苹果系统上有效。

当attributes参数不指定时,表示返回没有任何属性的文件。

pathname参数指定的文件或文件夹找不到时,Dir函数返回一个0长度的空字符串””。

二、用Dir函数判断文件夹或文件是否存在

学习了Dir函数的使用说明,接下来让我们看看如何用Dir函数判断文件夹或文件是否存在。

1.判断文件夹是否存在

如下图所示:

如何在vba中用dir函数遍历文件夹和文件? - VBA - ExcelOffice【微信公众号:水星Excel】 - 图1

D盘的数据文件夹下有很多文件和文件夹。

用如下的vba代码可以判断D盘的数据文件夹下是否有”2018年”文件夹存在。

Sub QQ1722187970()
Dim sName As String
‘返回文件夹的名称
sName = Dir(“d:\数据\2018年”, vbDirectory)
Debug.Print sName
If Len(sName) Then
MsgBox “存在”
Else
MsgBox “不存在”
End If
End Sub

2.判断文件是否存在

如下的vba代码可以判断D盘的数据文件夹下是否有”12月”的文件存在:

Sub QQ1722187970()
Dim sName As String
‘返回文件的名称
sName = Dir(“d:\数据*12月*”)
Debug.Print sName
If Len(sName) Then
MsgBox “存在”
Else
MsgBox “不存在”
End If
End Sub

3.通用的判断文件或文件夹是否存在的自定义函数

根据上述两个判断文件夹和文件是否存在的代码,可以编写一个通用的自定义函数用于判断文件或文件夹是否存在,代码如下:

Sub QQ1722187970()
Dim sPath As String
sPath = “d:\数据\2018年”
If FileOrFolderExists(sPath, 16) Then
MsgBox “存在”
Else
MsgBox “不存在”
End If
Dim sName As String
sName = “d:\数据*12月*”
If FileOrFolderExists(sName) Then
MsgBox “存在”
Else
MsgBox “不存在”
End If
End Sub
Function FileOrFolderExists(ByVal sText As String, Optional iFlag As Integer = 0) As Boolean
‘默认判断文件是否存在,iFlag参数指定为16表示判断文件夹是否存
Dim sName As String
If iFlag = 16 Then
‘判断某个文件夹是否存在
sName = Dir(sText, iFlag)
Else
‘判断文件是否存在
sName = Dir(sText)
End If
FileOrFolderExists = Len(sName) > 0
End Function

三、用Dir函数遍历文件夹下的所有文件

上文中我们介绍了如何用Dir函数获取单个文件夹或文件的名称,在更多的需求中,我们需要的是遍历所有的文件夹或文件。

Dir函数遍历文件夹下的所有文件的关键是多次使用dir函数。

第一次使用dir函数时需要提供pathname参数,如果找到了满足条件的文件,则返回文件名。

如果要继续查找下一个满足条件的文件,再次使用dir函数,此时不需要提供pathname参数和attributes参数。

循环使用,直到返回的字符串为空字符串时,表示没有满足条件的文件存在,遍历完毕。

比如用Dir函数遍历D盘的数据文件夹下的所有excel文件,可以使用如下的代码:

Sub QQ1722187970()
Dim sPath As String
sPath = “d:\数据\”
If FileOrFolderExists(sPath, 16) Then
Dim sResult As String
‘查找第一个文件,第一次使用dir函数
sResult = Dir(sPath & “.xls“)
If Len(sResult) Then
Debug.Print sResult
Do
‘重复使用dir函数,此时不用输入任何参数
sResult = Dir
Debug.Print sResult
‘直到返回的字符串为空字符串,表示遍历结束
Loop Until Len(sResult) = 0
End If
Else
MsgBox “不存在”
End If
End Sub
Function FileOrFolderExists(ByVal sText As String, Optional iFlag As Integer = 0) As Boolean
‘默认判断文件是否存在,iFlag参数指定为16表示判断文件夹是否存
Dim sName As String
If iFlag = 16 Then
‘判断某个文件夹是否存在
sName = Dir(sText, iFlag)
Else
‘判断文件是否存在
sName = Dir(sText)
End If
FileOrFolderExists = Len(sName) > 0
End Function

运行上述代码后返回的结果如下图所示:

如何在vba中用dir函数遍历文件夹和文件? - VBA - ExcelOffice【微信公众号:水星Excel】 - 图2

四、总结

上文中我们分别从Dir函数的使用说明开始,介绍了dir函数的语法、以及如何用dir函数判断文件夹或文件是否存在,最后介绍了如何使用dir函数遍历某个文件夹下的所有文件。

但是没有介绍了如何遍历文件夹及其子文件夹下的所有文件

如果要遍历文件夹及其子文件中的文件,可以参考如何用vba遍历所有文件夹及其子文件夹?一文。

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