如何在vba中用dir函数遍历文件夹和文件?

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

在vba中,内置了Dir函数可以返回模糊查找匹配的文件夹或文件名称。在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.判断文件夹是否存在

如下图所示:

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遍历所有文件夹及其子文件夹?一文。

 

       

仅有1条评论 发表评论

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

  2. 匿名 /

    dir(path,16)既可以判断目录也可以判断文件

发表评论