Excel VBA Range.FindNext v Range.Find-我遗漏了什么?

Excel VBA Range.FindNext v Range.Find-我遗漏了什么?,excel,vba,Excel,Vba,问题: vba Range.FindNext v Range.Find-我遗漏了什么 嗨 (我还不太熟悉这里的帖子,所以如果我有任何不太正确的地方,请道歉) 我一直在做一些VBA代码,它们都是搜索长列的变体。(通常需要连续查找多个引用,以生成所有引用的列表或选择一个或多个引用(在执行“查看零件类型”选项时)) 我不是计算机或编码专业人士,也没有那么多经验,所以我错过了什么 在做我一直在做的事情时,我希望.FindNext比使用.Find有一些优势 举一个简单的例子,我想找到两个带rOh的单词

问题: vba Range.FindNext v Range.Find-我遗漏了什么

(我还不太熟悉这里的帖子,所以如果我有任何不太正确的地方,请道歉)

我一直在做一些VBA代码,它们都是搜索长列的变体。(通常需要连续查找多个引用,以生成所有引用的列表或选择一个或多个引用(在执行“查看零件类型”选项时))

我不是计算机或编码专业人士,也没有那么多经验,所以我错过了什么

在做我一直在做的事情时,我希望.FindNext比使用.Find有一些优势

举一个简单的例子,我想找到两个带rOh的单词

    /      A       B        C
     1        
     2
     3             rOh3  
     4               
     5               
     6               
     7             rOh7  
     8               
     9               
    10              
所以我需要的是Debug.Print输出

    rOh3
    rOh7
    rOh1
    rOh2
    rOh3
    rOh7
    rOh8
    rOh9
这是我所看到的典型代码,也就是说我在互联网和教程中找到的代码:

    Sub VBAFindNext()
    Dim FirstrngFnd As Range, rngFnd As Range
     Set FirstrngFnd = Range("B1:B10").Find(What:="roh", LookAt:=xlPart)
        If FirstrngFnd Is Nothing Then Exit Sub
     Set rngFnd = FirstrngFnd
     Debug.Print FirstrngFnd.Value
        Do
         Set rngFnd = Range("B1:B10").FindNext(rngFnd)
        If Not rngFnd = FirstrngFnd Then Debug.Print rngFnd.Value
        Loop While Not rngFnd = FirstrngFnd
    End Sub
我正在编写这样的代码,看起来更简单、更灵活

    Sub FindTheNext()
    Dim rngFnd As Range
     Set rngFnd = Range("B1:B10").Find(What:="roh", LookAt:=xlPart)
        If rngFnd Is Nothing Then Exit Sub
        Do While Not rngFnd Is Nothing
         Debug.Print rngFnd.Value
         Set rngFnd = Range("B" & rngFnd.Row + 1 & ":B10").Find(What:="roh", LookAt:=xlPart)
        Loop
    End Sub
我只是想知道我是否错过了什么? 我可以这样编写后面的代码,但我看不到任何改进

    Sub TheNextVBAFindNext()
    Dim rngFnd As Range
     Set rngFnd = Range("B1:B10").Find(What:="roh", LookAt:=xlPart)
        If rngFnd Is Nothing Then Exit Sub
        Do While Not rngFnd Is Nothing
         Debug.Print rngFnd.Value
         Set rngFnd = Range("B" & rngFnd.Row + 1 & ":B10").FindNext(rngFnd.Offset(1, 0))
        Loop
    End Sub
因此,问题是: 我希望有更多经验的人或者对这些东西的工作原理有更深入了解的人能够解释可能使第一个代码更可取的任何原因。我的无知中可能遗漏了一些重要的东西。 我想具体的问题是“FindNext的意义是什么”。它只是省去了再次键入搜索条件,还是有更多的内容。 我可能天真地认为,对于一个很长的专栏,我的代码可能会更好一些,因为它每次都在一个较短的范围内出现,……但这是否属实将取决于“幕后”到底发生了什么,我不知道。还有其他人知道吗?如果可能的话,他们能用简单的语言解释一下吗

谢谢

艾伦

另外,我读到一些人认为FindNext被破坏了。但我还没有看到任何确凿的细节来证明这一点

我所拥有的实际代码通常要复杂得多,这就是为什么我试图更多地了解正在发生的事情:
好的,我现在明白你的意思了。在我看来:

查找:此方法允许您使用定义的参数开始搜索。每次调用
Find
,都会创建一个新的搜索过程

FINDNEXT:此方法将继续使用以前的
Find
方法开始的搜索,节省再次键入参数和更新搜索范围的时间(实际上,在第二个和第三个代码中,您使用
range(“B”&rngFnd.Row+1&“:B10”)更新正在搜索的范围)
。使用
FindNext
,搜索范围始终相同(在您的示例中,搜索范围是
B1:B10
),但VBA会记住最后一个位置,并从最后一个位置继续搜索。

那么重点是什么呢?除非设置断点,否则这两种方法都会创建一个无限循环。在第一个代码中,断点位于
行循环中,而不是rngFnd=FirstrngFnd
。VBA会记住它搜索的第一个范围,以及当循环再次进入该范围时,它会打断循环并恢复代码。第二个和第二个ird代码是无限循环。它们永远不会停止执行。试试看

如果在第二个和第三个代码中设置了类似的断点,它们将不起作用,因为您一直在更新要搜索的范围,因此它不可能在使用条件找到的第一个范围中搜索,它将是一个无限循环(实际上,无限循环将永远在
B10:B10
中搜索)

要设置一个有效的断点,您需要两种方法。为什么?因为正如我在帖子的开头所说,
Find
将在每次调用它时启动一个新的搜索,所以它不会移动,您将再次创建一个无限循环。要确保您的搜索转到满足定义的条件的下一个范围,您需要使用e> FindNext

我希望这个答案能让你了解这两种方法是如何协同工作的。无论如何,你可以在这里阅读更多信息:


好的,我现在明白你的观点了。从我的观点来看:

FIND:此方法允许您使用定义的参数启动搜索。每次调用
FIND
,您都在创建新的搜索过程

FINDNEXT:此方法将继续使用以前的
Find
方法开始的搜索,节省再次键入参数和更新搜索范围的时间(实际上,在第二个和第三个代码中,您使用
range(“B”&rngFnd.Row+1&“:B10”)更新正在搜索的范围)
。使用
FindNext
,搜索范围始终相同(在您的示例中,搜索范围是
B1:B10
),但VBA会记住最后一个位置,并从最后一个位置继续搜索。

那么重点是什么呢?除非设置断点,否则这两种方法都会创建一个无限循环。在第一个代码中,断点位于
行循环中,而不是rngFnd=FirstrngFnd
。VBA会记住它搜索的第一个范围,以及当循环再次进入该范围时,它会打断循环并恢复代码。第二个和第二个ird代码是无限循环。它们永远不会停止执行。试试看

如果在第二个和第三个代码中设置了类似的断点,它们将不起作用,因为您一直在更新要搜索的范围,因此它不可能在使用条件找到的第一个范围中搜索,它将是一个无限循环(实际上,无限循环将永远在
B10:B10
中搜索)

要设置有效的断点,
    rOh2
    rOh7
    rOh9
    rOh2
    rOh3
    rOh7
    rOh8
    rOh9
    rOh1
    rOh1
    rOh2
    rOh3
    rOh7
    rOh8
    rOh9
    Sub FindTheNext2()
    Dim rngFnd As Range
     Set rngFnd = Range("B1:B10").Find(What:="roh", after:=Range("B10"), LookAt:=xlPart)
        If rngFnd Is Nothing Then Exit Sub
        Do While Not rngFnd Is Nothing
         Debug.Print rngFnd.Value ' Do anything you wanna do                                                                                         http://www.youtuberepeater.com/watch?v=8GoN-y9irn4&name=Eddie+and+the+Hot+Rods+Do+anything+you+wanna
         Set rngFnd = Range("B" & rngFnd.Row + 1 & ":B10").Find(What:="roh", after:=Range("B10"), LookAt:=xlPart)
        Loop
    End Sub
    Sub FindTheNext3()
    Dim rngFnd As Range
     Set rngFnd = Range("B1:B10").Find(What:="roh", after:=Range("B10"), LookAt:=xlPart)
        Do While Not rngFnd Is Nothing
         Debug.Print rngFnd.Value ' Do anything you wanna do                                                                                         http://www.youtuberepeater.com/watch?v=8GoN-y9irn4&name=Eddie+and+the+Hot+Rods+Do+anything+you+wanna
            If rngFnd = Range("B10") Then Exit Sub
         Set rngFnd = Range("B" & rngFnd.Row + 1 & ":B10").Find(What:="roh", after:=Range("B10"), LookAt:=xlPart)
        Loop
    End Sub