Excel VBA:搜索目录

Excel VBA:搜索目录,vba,excel,Vba,Excel,在vba中,我想在目录中搜索特定的目录名。理想情况下,搜索时间会很快(类似于windows搜索) 从不同的来源,我可以用递归子程序构建一个脚本(如下所示)。该脚本可以工作,但只要层次结构有点复杂,它就会非常慢 有没有办法加快搜索速度 Sub GetFolder(Folder As String, searchF As String, colFolder As Collection) Dim SubFolder, subF As New Collection, sf As String If Ri

在vba中,我想在目录中搜索特定的目录名。理想情况下,搜索时间会很快(类似于windows搜索)

从不同的来源,我可以用递归子程序构建一个脚本(如下所示)。该脚本可以工作,但只要层次结构有点复杂,它就会非常慢

有没有办法加快搜索速度

Sub GetFolder(Folder As String, searchF As String, colFolder As Collection)
Dim SubFolder, subF As New Collection, sf As String
If Right(Folder, 1) <> "\" Then Folder = Folder & "\"

If Dir(Folder & searchF, vbDirectory) <> "" Then colFolder.Add Folder & searchF & "\"

sf = Dir(Folder, vbDirectory)
Do While Len(sf) > 0
    If sf <> "." And sf <> ".." Then
        If (GetAttr(Folder & sf) And vbDirectory) <> 0 Then
                subF.Add Folder & sf
        End If
    End If
    sf = Dir()
Loop

For Each SubFolder In subF
    GetFolder CStr(SubFolder), searchF, colFolder
Next
End Sub
Sub-GetFolder(文件夹作为字符串,searchF作为字符串,colFolder作为集合)
Dim子文件夹,SUFF作为新集合,sf作为字符串
如果正确(文件夹,1)“\”则文件夹=文件夹&“\”
如果Dir(Folder&searchF,vbDirectory)“,”则为colFolder.Add Folder&searchF&“\”
sf=Dir(文件夹,vbDirectory)
当Len(sf)>0时执行
如果sf“.”和sf“.”那么
如果(GetAttr(文件夹&sf)和vbDirectory)为0,则
子文件夹添加文件夹(&sf)
如果结束
如果结束
sf=Dir()
环
对于subF中的每个子文件夹
GetFolder CStr(子文件夹)、searchF、colFolder
下一个
端接头

我认为您低估了层次结构的大小。将您的代码更改为此代码,以查看您正在递归的文件夹数量

Option Explicit

Sub GetFolder(Folder As String, searchF As String, colFolder As Collection, ByRef counter As Long)

    Dim SubFolder, subF As New Collection, sf As String
    If Right(Folder, 1) <> "\" Then Folder = Folder & "\"

    If Dir(Folder & searchF, vbDirectory) <> "" Then colFolder.Add Folder & searchF & "\"

    sf = Dir(Folder, vbDirectory)

    Do While Len(sf) > 0
        If sf <> "." And sf <> ".." Then
            If (GetAttr(Folder & sf) And vbDirectory) <> 0 Then
                Debug.Print Folder & sf
                counter = counter + 1
                subF.Add Folder & sf
            End If
        End If
        sf = Dir()
    Loop

    For Each SubFolder In subF
        GetFolder CStr(SubFolder), searchF, colFolder, counter
    Next

End Sub

Public Sub TestMe()

    Dim newC        As New Collection
    Dim colChecked  As New Collection
    Dim counter     As Long

    GetFolder "C:\Users\<username>\Desktop\BA Tools", "v", newC, counter
    Debug.Print counter

End Sub
选项显式
子GetFolder(文件夹为字符串,searchF为字符串,colFolder为集合,ByRef计数器为长)
Dim子文件夹,SUFF作为新集合,sf作为字符串
如果正确(文件夹,1)“\”则文件夹=文件夹&“\”
如果Dir(Folder&searchF,vbDirectory)“,”则为colFolder.Add Folder&searchF&“\”
sf=Dir(文件夹,vbDirectory)
当Len(sf)>0时执行
如果sf“.”和sf“.”那么
如果(GetAttr(文件夹&sf)和vbDirectory)为0,则
Debug.Print文件夹&sf
计数器=计数器+1
子文件夹添加文件夹(&sf)
如果结束
如果结束
sf=Dir()
环
对于subF中的每个子文件夹
GetFolder CStr(子文件夹)、searchF、colFolder、计数器
下一个
端接头
公共子TestMe()
Dim newC作为新集合
已检查为新集合
昏暗的柜台一样长
GetFolder“C:\Users\\Desktop\BA Tools”、“v”、newC、counter
调试。打印计数器
端接头

运行代码时,代码末尾的数字是多少?

请阅读Norie所说的内容<代码>您可以编写一个小的批处理文件,使用管道将所有文件名和其他信息发送到文本文件。当我说small时,我的意思是small——它可能是一行代码。生成的文本文件可以很容易地在Excel中打开。或在Excel中编写的代码。@danieltakeshi然后问题是,我必须创建临时文件及其附带的所有问题,或者你知道用vba简单处理临时文件的方法吗?嗯,我不知道。我要做的是在每次打开搜索工作簿时获取所有目录的数据库列表,然后您可以在Excel中进行尽可能多的搜索。@danieltakeshi这是一个非常好的主意,它并不真正适合我的情况,因为文件夹是动态的,可以更新,但我会记住这一点。很抱歉反应太慢:我正在浏览6637个文件夹,这大约需要20秒。@Jonathan-如果你删除
Debug.Print文件夹&sf
,速度会更快。再试一次:)@Jonathan-根据您需要它做什么,您可以稍微更改逻辑-您可以在所有文件夹中循环一次,并将结果保存到集合中。这将需要20秒,但下次您要查找内容时,您将查看此集合,而不是文件夹。这确实是一个好主意,不幸的是,它并不真正适合我的情况,因为文件夹是动态的,它们可以获得一些更新,但我会记住这一想法。谢谢你的指点!