在用vba编写自动化解决方案时,最常见的需求就是遍历文件夹内的文件,然后进行相对应的处理。
在vba中,内置了Dir函数可以返回模糊查找匹配的文件夹或文件名称。在vba中使用Dir函数可以实现遍历文件夹和文件的需求。
今天就让我们一起来学习下如何用dir函数遍历文件夹和文件,今天的主要内容有以下几个:
- Dir函数的使用说明
- 用Dir函数判断文件夹或文件是否存在
- 用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.判断文件夹是否存在
如下图所示:
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
运行上述代码后返回的结果如下图所示:
四、总结
上文中我们分别从Dir函数的使用说明开始,介绍了dir函数的语法、以及如何用dir函数判断文件夹或文件是否存在,最后介绍了如何使用dir函数遍历某个文件夹下的所有文件。
但是没有介绍了如何遍历文件夹及其子文件夹下的所有文件
如果要遍历文件夹及其子文件中的文件,可以参考如何用vba遍历所有文件夹及其子文件夹?一文。
Pingback引用通告: VBA每日一练(13) 用dir 查找文件夹,特定文件名,文件类型,遍历等 – 小飞侠 /
dir(path,16)既可以判断目录也可以判断文件