使用excel Range Find和FindNext在一个范围内迭代

使用excel Range Find和FindNext在一个范围内迭代,excel,vba,Excel,Vba,在很长一段时间之后,我回到VBA,并尝试实现一个循环来查找一个值的多个匹配项。我挣扎了一下,用拖网捕鱼。我发现了这个例子 Sub Button1_Click() With Worksheets(1).Range("a1:a50") Set c = .Find(2, LookIn:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do

在很长一段时间之后,我回到VBA,并尝试实现一个循环来查找一个值的多个匹配项。我挣扎了一下,用拖网捕鱼。我发现了这个例子

Sub Button1_Click()
    With Worksheets(1).Range("a1:a50")
        Set c = .Find(2, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 99
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
End Sub
子按钮1\u单击()
带工作表(1)。范围(“a1:a50”)
Set c=.Find(2,LookIn:=xlValues)
如果不是,那么c什么都不是
firstAddress=c.地址
做
c、 值=99
集合c=.FindNext(c)
循环而不是c为Nothing,c.Address为firstAddress
如果结束
以
端接头
这来自MSDN(),所以我倾向于认为这是一个很好的例子。我重新处理了这个以适应我的应用程序,但出现了一个错误。然后我尝试直接运行MSDN给出的示例。我得到相同的错误,如下所示。这发生在线路上

Loop While Not c Is Nothing And c.Address <> firstAddress
循环而不是c为Nothing,c.Address为firstAddress

有人能解释一下吗。我真的很惊讶MSDN示例没有起作用


期待中的感谢

你会认为会的,但他们从来没有费心去纠正它。问题是您正在删除2的所有实例,因此c最终为Nothing,代码试图检查Nothing的地址(因此出现错误)。您只需检查c是否为空

顺便说一句,您可以使用Find和Replace进行此操作

Sub Button1_Click()
    With Worksheets(1).Range("a1:a50")
        Set c = .Find(2, LookIn:=xlValues)
        If Not c Is Nothing Then
            Do
                c.Value = 99
                Set c = .FindNext(c)
            Loop While Not c Is Nothing
        End If
    End With
End Sub

当然,你说得很对。这现在起作用了。有点明显,现在你看看:-)。ThanksWorth意识到Range Find函数将结束,因此您需要在循环中添加自己的机制以防止出现这种情况。这显然是微软在他们的考试中试图做到的。