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"