gpt4 book ai didi

function - 在递归函数中使用 .Find

转载 作者:行者123 更新时间:2023-12-02 14:11:32 24 4
gpt4 key购买 nike

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

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

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

现在我已经通过激活单元格解决了这个问题,但这使我的代码变慢了很多。目前我正在使用这个:

Set Found = Worksheets("MasterScore").Range("j1:j50000").Find(NextQuestionID, LookIn:=xlValues)
If Not Found Is Nothing Then
Count = 1
Do
Columns("J:J").Select
FirstFoundRow = Selection.Find(What:=NextQuestionID, After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Row
For i = 1 To Count
Selection.FindNext(After:=ActiveCell).Activate
Next i
AnswerRow = ActiveCell.Row
If AnswerRow = FirstFoundRow And Count <> 1 Then Exit Do

FindChildren
Count = Count + 1
Loop
End If
这样,我不必再次设置对象的值,但我必须迭代它。FindNext 相当多次,每次运行该行时,它也会激活该行。我真的只是想要类似的东西。

AnswerRow = .Find(nth instance of NextQuestionID).Row 

(我有大约 50k 行,计数经常达到大约 20 行,所以确实需要一段时间)。

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

最佳答案

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

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 -> 50,000 范围内的值,并且您在第 70 行找到了答案,它实际上会找到下一行(它会跳过第一行) 。但是,如果 70 行之后没有任何行有答案,它实际上会从第 70 行获取值。这意味着我不能这样做

NextAnswerRange = "j" & AnswerRow + 1 & ":" & "j50000"

因为它会丢失一些值。在没有 + 1 的情况下执行此操作意味着在文档末尾我最终会一遍又一遍地搜索相同的最后一个值(它永远不会回到“Found Is Nothing”),因此我必须进行检查以查看 LastAnswerRange =下一个答案范围。

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

关于function - 在递归函数中使用 .Find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com