VBA实战技巧精粹012:查找指定目录下的指定文件及Dir函数用法

来源:互联网 发布:大连中车待遇 知乎 编辑:程序博客网 时间:2024/06/06 02:40
 

Dir 函数

返回一个String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。

语法

Dir[(pathname[,attributes])]

Dir 函数的语法具有以下几个部分:

部分描述pathname可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到pathname,则会返回零长度字符串 ("")。attributes可选参数。常数数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配pathname 但不包含属性的文件。


设置值

attributes参数的设置可为:

常数描述vbNormal0(缺省) 指定没有属性的文件。vbReadOnly1指定无属性的只读文件vbHidden2指定无属性的隐藏文件VbSystem4指定无属性的系统文件 在Macintosh中不可用。vbVolume8指定卷标文件;如果指定了其它属性,则忽略vbVolume 在Macintosh中不可用。vbDirectory16指定无属性文件及其路径和文件夹。vbAlias64指定的文件名是别名,只在Macintosh上可用。


注意 这些常数是由 VBA 所指定的,在程序代码中的任何位置,可以使用这些常数来替换真正的数值。

说明

在 Microsoft Windows 中,Dir 支持多字符 (*) 和单字符 (?) 的通配符来指定多重文件。

在第一次调用Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname

Dir 会返回匹配pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用Dir 不能连续地返回子目录。

提示由于文件名并不会以特别的次序来返回,所以可以将文件名存储在一个数组中,然后再对这个数组排序。

Dir 函数示例

本示例使用 Dir 函数来检查某些文件或目录是否存在。

Dim MyFile, MyPath, MyName

'
返回“WIN.INI(Microsoft Windows) (如果该文件存在)。
MyFile = Dir("C:\WINDOWS\WIN.ini")   

' 返回带指定扩展名的文件名。如果超过一个 *.ini 文件存在,
' 函数将返回按条件第一个找到的文件名。
MyFile = Dir("C:\WINDOWS\*.ini")

' 若第二次调用 Dir 函数,但不带任何参数,则函数将返回同一目录下的下一个 *.ini 文件。
MyFile = Dir

' 返回找到的第一个隐式 *.TXT 文件。
MyFile = Dir("*.TXT", vbHidden)

' 显示 C:\ 目录下的名称。
MyPath = "c:\"    ' 指定路径。
MyName = Dir(MyPath, vbDirectory)    ' 找寻第一项。
Do While MyName <> ""    ' 开始循环。
    ' 跳过当前的目录及上层目录。
    If MyName <> "." And MyName <> ".." Then
        ' 使用位比较来确定 MyName 代表一目录。
        If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
            Debug.Print MyName    ' 如果它是一个目录,将其名称显示出来。
        End If
    End If
    MyName = Dir    ' 查找下一个目录。
Loop

从上的帮助文件可以看出:Dir主要用来查找文件,并且可以直接得到文件名,而不包括路径.

 '只需要文件名不要路径可以用这个
 Sub 利用Dir函数搜索指定目录下所有指定文件()
     Dim MyFile As String, MyPath As String, i As Integer
     MyPath = "C:\windows\"
     i = 0
     MyFile = Dir(MyPath & "*.ini")
     '如果上行未找到,则下行的条件肯定不满足了:Dir函数未找到符合条件的结果时,返回一个空字符串,长度为0
     Do While Len(MyFile) > 0
        MyFile = Dir           '只需对Dir进行循环操作即可,因为上面已经有一行查找命令了.
        Debug.Print MyFile     '只输出文件名,而不显示路径,用处很大.
        i = i + 1
     Loop
     Debug.Print "共找到" & i & "个文件"
 End Sub

输出结果:

win.ini
msdfmap.ini
ODBCINST.INI
vb.ini
vbaddin.ini
desktop.ini
...


'需要完整路径的文件名可以用这个
Sub 利用FileSearch对象搜索指定目录下的所有文件()
    Dim i As Integer, xls() As String
    Dim sr As FileSearch '定义一个文件搜索对象
    Set sr = Application.FileSearch
    sr.LookIn = "c:\windows\" '注意路径,换成你实际的路径
    sr.Filename = "*.ini" '搜索所有文件
    sr.Execute '执行搜索
    ReDim xls(sr.FoundFiles.Count)
    For i = 1 To sr.FoundFiles.Count
        xls(i) = sr.FoundFiles(i) '因为下面需要打开指定路径下的文件,故就不需再去掉路径名了,直接将完整路径输入即可.
        Debug.Print xls(i)
    Next
End Sub

输出结果:

C:\WINDOWS\ApabiMaker.INI
C:\WINDOWS\callInfo.ini
C:\WINDOWS\capture.ini
C:\WINDOWS\control.ini
C:\WINDOWS\desktop.ini
...

下面是一个将指定目录下所有指定文件类型提取至工作表并进行排序且更名的代码:

Sub 将指定目录下的指定文件类型提取至工作表并排序且进行更名()
    Dim MyFile As String, MyPath As String, i As Integer, arr() As String
    MyPath = "e:\temp\"
    i = 0
    MyFile = Dir(MyPath & "*.txt")
    Do While Len(MyFile) > 0
        i = i + 1
        ReDim Preserve arr(i)
        arr(i) = MyFile
        MyFile = Dir
    Loop
    With Worksheets("sheet6")
        .Cells(1, 1).Value = "文件名"
        .Range("A2:A" & UBound(arr) + 1).Value = Application.WorksheetFunction.Transpose(arr)
'        本来想去掉扩展名,现在想想不需要去掉扩展名,直接带着就可以.
'        For i = 1 To UBound(arr)
'            .Cells(i + 1, 1).Value = Replace(LCase(.Cells(i + 1, 1).Value), ".txt", "")
'        Next i
        .Range("A1").Sort Key1:=.Range("A1"), Order1:=xlAscending, header:=xlYes
        '如果只是改名的话,那新旧文件名都要带上完整路径,不然就移到当前工作簿所在文件夹了.
        For i = 1 To UBound(arr)
            Name MyPath & .Cells(i + 1, 1).Value As MyPath & Worksheets("sheet4").Cells(i + 1, 1).Value & ".txt"
        Next i
    End With
End Sub