Excel VBA使用FindNext循环查找数组元素后续匹配项时的问题求助
Excel VBA使用FindNext循环查找数组元素后续匹配项时的问题求助
老哥,我看你这段代码的问题很典型,咱们先理清楚你遇到的状况:你想遍历数组arrAllYield里的元素,在工作表wksDeviation的E列中查找所有匹配项,但用FindNext的时候要么陷入无限循环,要么找到第二个匹配项就提前退出,对吧?我帮你分析下代码里的问题,再给你修正后的版本。
先贴下你的原代码方便对照:
Dim raArray as Range Dim m_strAddress as String dim wksDeviation as Worksheet dim iC as Long For iC = 1 To 51 Set raArray = wksDeviation.Range("E:E").Find(arrAllYield(1, iC - 1), LookIn:=xlFormulas, LookAt:=xlPart) If raArray Is Nothing Then Debug.Print arrAllYield(1, iC - 1) & " Nothing found" Else m_strAddress = raArray.Address If Not raArray Is Nothing Then Do Set raArray = wksDeviation.Range("E:E").FindNext(wksDeviation.Range("E:E").Find(What:=arrAllYield(1, iC - 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)) Loop While raArray.Address <> m_strAddress And Not raArray Is Nothing End If End If Next iC
核心错误分析
- FindNext的用法完全错了:你在Do循环里每次都重新调用了
Range.Find(...)来作为FindNext的参数,这相当于每次都从头开始查找,而不是基于上一次找到的结果继续往后找。这就导致要么一直找到同一个初始地址,陷入无限循环;要么地址判断逻辑混乱,提前退出。 - 循环条件顺序错误:你先判断
raArray.Address <> m_strAddress,再判断Not raArray Is Nothing——如果raArray变成Nothing了,访问它的Address属性会直接报错,逻辑顺序必须反过来。 - 循环里没处理匹配项:原代码只是在循环,但没对找到的每个匹配项做任何操作(比如打印、标记),这可能也是你觉得“没工作”的原因之一。
修正后的代码
Dim raArray As Range Dim m_strAddress As String Dim wksDeviation As Worksheet Dim iC As Long ' 先确保wksDeviation已正确赋值,比如Set wksDeviation = ThisWorkbook.Worksheets("你的工作表名") For iC = 1 To 51 ' 第一次查找当前数组元素 Set raArray = wksDeviation.Range("E:E").Find( _ What:=arrAllYield(1, iC - 1), _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=False) If raArray Is Nothing Then Debug.Print arrAllYield(1, iC - 1) & " Nothing found" Else m_strAddress = raArray.Address ' 先处理第一个找到的匹配项 Debug.Print "找到匹配项:" & arrAllYield(1, iC - 1) & ",地址:" & raArray.Address Do ' 基于上一次找到的raArray继续查找下一个 Set raArray = wksDeviation.Range("E:E").FindNext(raArray) ' 检查是否找到有效结果,且不是初始地址(避免循环回到起点) If Not raArray Is Nothing And raArray.Address <> m_strAddress Then ' 处理每个后续匹配项,这里改成你需要的操作 Debug.Print "找到下一个匹配项:" & arrAllYield(1, iC - 1) & ",地址:" & raArray.Address End If ' 循环条件:raArray不为空,且地址不等于初始地址(没回到起点) Loop While Not raArray Is Nothing And raArray.Address <> m_strAddress End If Next iC
关键改动说明
- FindNext的正确用法:
FindNext的参数是上一次找到的Range对象(也就是raArray),这样Excel才会从这个位置往后继续查找,而不是每次从头开始。 - 调整循环条件顺序:先判断
Not raArray Is Nothing,再判断地址是否不等于初始地址,避免空对象报错。 - 增加匹配项处理逻辑:在循环里加入了对每个找到的结果的处理(这里用Debug.Print示例),你可以改成自己需要的操作,比如修改单元格、记录位置等。
这样修改后,就能正确遍历当前数组元素在E列的所有匹配项,不会无限循环也不会提前退出啦~
备注:内容来源于stack exchange,提问作者user1769136
相关产品推荐
相关产品推荐

