Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用良好的ol'终止递归目录搜索;FSO_Vba_Search_Recursion_Vb6_Filesystemobject - Fatal编程技术网

Vba 使用良好的ol'终止递归目录搜索;FSO

Vba 使用良好的ol'终止递归目录搜索;FSO,vba,search,recursion,vb6,filesystemobject,Vba,Search,Recursion,Vb6,Filesystemobject,此处交叉张贴: 在我的办公室里,我们经常遇到文件夹移动的问题,我想要一种简单的方法来跟踪它们。我有以下功能,它的性能与预期的一样,只是我不知道如何让它在找到文件夹后终止。它是在递归目录搜索的基础上建模的,递归目录搜索会查找所有实例。问题是我想找到一个实例,然后终止 有没有可能让这个东西停止自己的调用,而不加入类模块并连接到事件和状态监视器?如果是这样,我如何才能做到这一点 Function FindFolder(CurrentDirectory As Scripting.Folder, Fol

此处交叉张贴:

在我的办公室里,我们经常遇到文件夹移动的问题,我想要一种简单的方法来跟踪它们。我有以下功能,它的性能与预期的一样,只是我不知道如何让它在找到文件夹后终止。它是在递归目录搜索的基础上建模的,递归目录搜索会查找所有实例。问题是我想找到一个实例,然后终止

有没有可能让这个东西停止自己的调用,而不加入类模块并连接到事件和状态监视器?如果是这样,我如何才能做到这一点

Function FindFolder(CurrentDirectory As Scripting.Folder, FolderName As String) As Scripting.Folder

On Error GoTo errHandler

Dim fold As Scripting.Folder

If CurrentDirectory.SubFolders.Count > 0 Then
For Each fold In CurrentDirectory.SubFolders
    Debug.Print fold.Path
    If fold.Name = FolderName Then
        Set FindFolder = fold: Exit Function
    Else
        Set FindFolder = FindFolder(fold, FolderName)
    End If
Next fold
End If


Exit Function

errHandler:

If Err.Number = 70 Then Resume Next 'Dont have permission to check this directory

End Function
下面是一个示例用法

Sub FindEm()

Dim FSO As Scripting.FileSystemObject
Set FSO = New Scripting.FileSystemObject

Dim startFold As Scripting.Folder
Set startFold = FSO.GetFolder("C:\")

Dim searchFold As Scripting.Folder
Set searchFold = FindFolder(startFold, "SomeExactFolderName")

Debug.Print searchFold.Path


End Sub

有什么想法吗?

修改您的功能,只测试当前文件夹:

Function FindFolder(CurrentDirectory As Scripting.Folder, FolderName As String) As Scripting.Folder

On Error GoTo errHandler

If CurrentDirectory .Name = FolderName Then _
   Set FindFolder = CurrentDirectory : Exit Function

Set FindFolder = Nothing

Dim fold As Scripting.Folder

If CurrentDirectory.SubFolders.Count > 0 Then
For Each fold In CurrentDirectory.SubFolders
    Debug.Print fold.Path
    Set FindFolder = FindFolder(fold, FolderName)
    If not(FindFolder Is Nothing) Then
      Exit For ' this one
    End If
Next fold
End If

这个答案很好!对于那些感兴趣的人来说,有一种在交叉贴帖中描述的替代方法。我认为Rob的比我最初的设计效率高一点。。。这是因为调试将在我的版本上爆炸到一个旋转的轮子,直到完成,但是Rob的打印结果没有内存问题。我还没有对此进行广泛的测试,但是。。。