2017-10-09 137 views
1

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

来自不同的来源,我可以建立一个脚本(给出波纹管)与递归子程序。该脚本可以工作,但只要层次结构有点复杂,脚本就会很慢。

有没有办法让搜索更快?

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 
+1

阅读Norie说的[这里](https://www.mrexcel.com/forum/excel-questions/449193-vba-fastest-most-reliable-way-list-files.html)。 '你可以编写一个小批处理文件,使用管道将所有文件名和其他信息发送到文本文件。 当我说小我的意思是小 - 它可能是一行代码。 生成的文本文件可以很容易地在Excel中打开。或者写在那里的代码。 – danieltakeshi

+0

@danieltakeshi那么问题就出现在我将不得不创建临时文件和它们随附的所有问题,或者你知道一种方法来简单地处理vba中的临时文件吗? – Jonathan

+1

嗯,我不知道。我要做的是在每次搜索工作簿打开时获取所有目录的数据库列表,然后您可以在Excel内进行尽可能多的搜索。 – danieltakeshi

回答

2

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

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 

运行它时代码结束时得到的数字是多少?

+0

对于响应缓慢感到抱歉:我正在通过6637文件夹进行恢复,这需要大约20秒。 – Jonathan

+0

@Jonathan - 如果你删除了'Debug.Print Folder&sf',它会更快。再试:) – Vityata

+0

我删除了它,但它仍然需要大约20秒... – Jonathan