2017-10-09 139 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