Excel Vba方法范围。查找

Excel Vba方法范围。查找,vba,excel,methods,Vba,Excel,Methods,我遇到了一个问题和范围。找到方法应该可以解决它 在Microsoft站点()上,找到了我认为需要的代码: Set C = wsCountry.Range("G:G").Find(What:="BOSS", MatchCase:=True, LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlNext, SearchOrder:=xlByRows) If Not C Is Nothing Then firstAddre

我遇到了一个问题和范围。找到方法应该可以解决它

在Microsoft站点()上,找到了我认为需要的代码:

Set C = wsCountry.Range("G:G").Find(What:="BOSS", MatchCase:=True, LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlNext, SearchOrder:=xlByRows)
    If Not C Is Nothing Then
        firstAddress = C.Address
            Do
               If wsRep.Range("B:B").Find(What:=C.Offset(0, -5), LookIn:=xlValues) Is Nothing Then
                    wsUser.Range("SpecialPO").Find(What:="BOSS", MatchCase:=True, LookIn:=xlValues).Offset(0, 1) = wsUser.Range("SpecialPO").Find(What:="BOSS", MatchCase:=True, LookIn:=xlValues).Offset(0, 1) + 1
                End If
                Set C = wsCountry.Range("G:G").FindNext(C)

                If C Is Nothing Then Exit Do
                Loop While C.Address <> firstAddress
    End If
Set C=wsCountry.Range(“G:G”).Find(What:=“BOSS”,MatchCase:=True,LookAt:=xlother,LookIn:=xlValues,SearchDirection:=xlNext,SearchOrder:=xlByRows)
如果不是,那么C什么都不是
firstAddress=C.地址
做
如果wsRep.Range(“B:B”).Find(What:=C.Offset(0,-5),LookIn:=xlValues)为空,那么
wsUser.Range(“SpecialPO”).Find(What:=“BOSS”,MatchCase:=True,LookIn:=xlValues)。Offset(0,1)=wsUser.Range(“SpecialPO”).Find(What:=“BOSS”,MatchCase:=True,LookIn:=xlValues)。Offset(0,1)+1
如果结束
设置C=wsCountry.Range(“G:G”).FindNext(C)
如果C为Nothing,则退出Do
在C.AddressFirstAddress时循环
如果结束
问题:

当第二次尝试使用.FindNext设置变量C时,它将抛出值“Nothing”。虽然该列还有2个值作为“BOSS”

(我发现了一个数据块内容,可能我将使用年siddharthrout建议的另一个解决方案。尽管我想知道为什么这个解决方案没有按预期工作)

和往常一样,非常感谢。

回答最初的问题 问题:

以下行导致错误

Loop While Not C Is Nothing And C.Address <> firstAddress
对最新问题的答复 在范围上调用.Find时,您将创建一个查找上下文。FindNext知道下一步要查找什么。当你用第二个(不相关的)Find(例如在不相关的范围内)来“中断”Find/FindNext序列时,你会弄乱这个上下文。下次要在原始范围内继续.FindNext时,上下文将不可用,.FindNext将开始返回错误结果。请注意.Find并不是一个好用的函数;它实际上会更改用户“查找”对话框中的默认值。这也暗示了这样一个事实:Excel中只有一个Find上下文,它与用户操作的GUI共享(不太好,但您可以做些什么)

请参阅下面的代码了解其工作原理。选择一张空表,按如下方式填充:

Column A  Column B
a         d
b         e
c         f
a         d
b         e
c         f
然后运行下面的代码;它会告诉你“没有找到下一个”。现在注释掉第二个。在oSearchRangeB上查找并再次运行它;它现在将返回“Did FindNext”


您是否查看了OP提供的链接,该行直接来自MSDN网站。它会起作用的,还有其他问题。你好,卡尔,我听从了你的建议。我已经修改了代码,使用了一个IfStatement来检查是否为nothing,然后退出或保持循环。现在我知道变量的值为零。为什么会这样?它不应该检查列中的下一个“BOSS”值吗?@ScottCraner:那么MSDN文档是错误的;这不是第一次了。将我在帖子中添加的代码粘贴到VBA模块中并运行它;你自己看看。@ScottCraner:我看到这篇文章在我回复后已经被编辑过了,也许你看到了新问题的更新版本;我回复的原始内容是这样一个While语句给出了“Object variable or with block not set”错误。在
wsUser.Range(“SpecialPO”).Find(What:=“MASTER SITH”之后缺少一个“`”,MatchCase:=True
。我不知道这是否是问题所在,但这是一个打字错误。嗨,斯科特。我想剪切文本,这样你们就不需要移动侧边栏。在我的代码中,所有内容都在一行中。问题只发生在尝试执行“循环而不是…”时当循环、If语句或with块未正确结束或被另一个块拆分时,会出现问题。请仔细检查所有块的结尾是否正确,并在它们开始的块内结束。我从不使用.Find(因为它会弄乱用户在“查找”对话框中的设置),但可能必须在调用原始查找的同一范围内调用FindNext?也就是说:原始.Find创建了一个上下文,它将在最后一次点击后在其中进行换行,因此当您在创建的Find上下文之外的另一个范围内执行.FindNext时,Excel将找不到任何内容。这正是发生的情况……如果我切换到简单的c.值更改,代码就可以正常工作。尝试串联多个。在循环中查找请求会出现错误。某种程度上,excel会丢失正在发生的事情的轨迹…我一直试图找到一个解决方法,使用.Find方法并重新定位ActiveCell,但迄今为止没有成功:s
Column A  Column B
a         d
b         e
c         f
a         d
b         e
c         f
Sub x()
  Dim oSearchRangeA As Range
  Set oSearchRangeA = ActiveSheet.Range("A:A")
  Dim oSearchRangeB As Range
  Set oSearchRangeB = ActiveSheet.Range("B:B")
  Dim oFoundCell As Range
  Set oFoundCell = oSearchRangeA.Find( _
    What:="b", MatchCase:=True, LookAt:=xlWhole, LookIn:=xlValues, _
    SearchDirection:=xlNext, SearchOrder:=xlByRows _
  )
  If Not oFoundCell Is Nothing Then
    Dim oInterferingFoundCell As Range
    Set oInterferingFoundCell = _
      oSearchRangeB.Find(What:="f", LookIn:=xlValues)
    Set oFoundCell = oSearchRangeA.FindNext(oFoundCell)
    If oFoundCell Is Nothing Then
      Call MsgBox("Didn't FindNext")
    Else
      Call MsgBox("Did FindNext")
    End If
  End If
End Sub