Function 在递归函数中使用.Find

Function 在递归函数中使用.Find,function,excel,vba,Function,Excel,Vba,我正在尝试使用递归函数中的.find函数查找工作表中的行号。 我设置了一个名为Found=.Find….的对象,它工作得很好。。。一点点。我在递归深度为1级时设置它,然后在递归深度为2级时再次设置它。然后,我的代码找到路径的末尾并开始备份,直到它返回到1级深度,但我的已找到对象没有被重新声明,并且从第2级保留其值。我的其他变量(ThisRow等)保留它们所在级别的值,这就是我希望对找到的对象执行的操作。有没有一种方法可以在本地声明find,这样它的值就不会扩展到下一个函数,也不会在更深的层次上被

我正在尝试使用递归函数中的
.find
函数查找工作表中的行号。 我设置了一个名为
Found=.Find….
的对象,它工作得很好。。。一点点。我在递归深度为1级时设置它,然后在递归深度为2级时再次设置它。然后,我的代码找到路径的末尾并开始备份,直到它返回到1级深度,但我的已找到对象没有被重新声明,并且从第2级保留其值。我的其他变量(ThisRow等)保留它们所在级别的值,这就是我希望对找到的对象执行的操作。有没有一种方法可以在本地声明find,这样它的值就不会扩展到下一个函数,也不会在更深的层次上被覆盖?你可以在下面找到我的代码以供参考

以下是我当前的代码-删除不相关的部分:

Public Function FindChildren()

ThisRow = AnswerRow 'Also declared before function call

    BeenHereCell = Cells(ThisRow, "O").Address
    If Range(BeenHereCell).Value = "Yes" Then
        Exit Function 'That means we've already been there
    End If
    Range(BeenHereCell).Value = "Yes"

    With Worksheets("MasterScore").Range("j1:j50000")
        Set Found = .Find(NextQuestionID, LookIn:=xlValues)
        If Not Found Is Nothing Then
            firstAddress = Found.Address
            NextCell = Found.Address
            Do

                AnswerRow = Range(NextCell).Row
                FindChildren 'This is where it's recursive.

                Set Found = .FindNext(Found)
                NextCell = Found.Address

           Loop While Not Found Is Nothing And Found.Address <> firstAddress
        End If
    End With
End Function
(我大约有5万行,而且计数经常达到20行左右,所以这确实需要一段时间)


如果有任何想法,我将不胜感激!目前我的代码正在运行,但它需要一天的大部分时间才能完成,我需要在某个时候再次运行它

我最终找到了一种方法来加快速度。我想这可以帮助别人,所以我会分享我的发现。 这不是最好的解决方案(我更愿意只在本地声明对象,这样我的其他函数就不会改变它的值),但至少这样,我不会在Do循环的每个迭代中循环20次左右

Set Found = Worksheets("MasterScore").Range("j1:j50000").Find(NextQuestionID, LookIn:=xlValues)
If Not Found Is Nothing Then
    NextAnswerRange = "j" & 1 & ":" & "j50000" 'The first search will be from the beginning

    Do
        Set Found = Worksheets("MasterScore").Range(NextAnswerRange).Find(NextQuestionID, LookIn:=xlValues)
        NextCell = Found.Address
        AnswerRow = Range(NextCell).Row

        NextAnswerRange = "j" & AnswerRow & ":" & "j50000"
        If LastAnswerRange = NextAnswerRange Then Exit Function 'This would mean we've reached the end.
        LastAnswerRange = NextAnswerRange

        FindChildren
    Loop
End If
端函数

所以我们知道我们已经用之前的范围覆盖了我们的基地,因为它总是找到下一个。我们只需每次更改搜索范围,它就会找到下一个值

这个解决方案的一个奇怪之处是,如果您在70->50000范围内查找一个值,并且您在第70行找到了您要查找的答案,它实际上会找到下一行(它跳过第一行)。但是,如果没有任何超过70的行有答案,它实际上将从第70行中获取值。这意味着我不能做

NextAnswerRange = "j" & AnswerRow + 1 & ":" & "j50000"
因为它会丢失一些值。如果不使用+1,则意味着在文档末尾,我将反复搜索相同的最后一个值(它永远不会返回到“查找”为“无”),因此我必须检查LastAnswerRange=NextAnswerRange

我希望这对某人有帮助。我不认为这是最优雅的解决方案,但它比我拥有的要快得多

Set Found = Worksheets("MasterScore").Range("j1:j50000").Find(NextQuestionID, LookIn:=xlValues)
If Not Found Is Nothing Then
    NextAnswerRange = "j" & 1 & ":" & "j50000" 'The first search will be from the beginning

    Do
        Set Found = Worksheets("MasterScore").Range(NextAnswerRange).Find(NextQuestionID, LookIn:=xlValues)
        NextCell = Found.Address
        AnswerRow = Range(NextCell).Row

        NextAnswerRange = "j" & AnswerRow & ":" & "j50000"
        If LastAnswerRange = NextAnswerRange Then Exit Function 'This would mean we've reached the end.
        LastAnswerRange = NextAnswerRange

        FindChildren
    Loop
End If
NextAnswerRange = "j" & AnswerRow + 1 & ":" & "j50000"