首页 > 解决方案 > VBA Find .address 有时返回范围,有时返回单元格

问题描述

我遇到了 VBA Range.Find 方法的问题。代码所做的是查看工作簿中的所有工作表,查找与数组中数据的任何匹配项,并更改具有与该数据相同值的单元格的颜色。

该代码在第一张纸上完美运行。然后,在下一张纸上,它陷入无限循环。单步执行代码后,Find 似乎在第一次在此页面上运行时返回一个范围格式(“A2:A2”)的地址,但之后又恢复为单元格格式(“A2”)。它不会在第一页上这样做,只是在第二页上。

我可以编写一些代码来检查返回的值并将其修整,但我想解决这个问题,而不是在上面打补丁。

这是中断的代码:

For x = 1 To UBound(wksSheets)
    For y = 0 To (UBound(findData) - 1)
        With wkb.Worksheets(x)
            Set rng = .Range(DataRange).Find(findData(y), LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
                If Not rng Is Nothing Then
                    StrtAdd = rng.Address
                    Do
                        .Range(rng.Address).Interior.ColorIndex = 3
                        Set rng = .Range(DataRange).FindNext(rng)
                    Loop While Not rng Is Nothing And Not rng.Address = StrtAdd
                End If
        End With
    Next y
Next x

第一次通过第二页时,rng.Address 是“A2:A2”并存储在 StrtAdd 中。然后,当代码点击 .FindNext(rng) 时,rng.Address 更改为“A2”。因此, rng.Address 永远不会等于 StrtAdd,即使它们谈论的是完全相同的单元格。这就是无限循环。

有关解决此问题的最佳方法的任何想法?

wksSheets 是一个包含工作表名称的数组

findData 包含要查找的数据

提前致谢!!

标签: excelvbafindrangevba7

解决方案


这是我最终使用的代码。我仍然不知道为什么有时我会得到一个地址,A2:A2A1它确实解决了这个问题。

我用 InStr 找到了: ,然后Left把多余的东西敲掉了。

我还采纳了人们留下的关于清理代码的建议。

For x = 1 To UBound(wksSheets)
        For y = 0 To UBound(findData) - 1
            With wkb.Worksheets(x)
                Set rng = .Range(DataRange).Find(findData(y), LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
                    If Not rng Is Nothing Then
                        z = InStr(rng.Address, ":")
                        If z > 1 Then
                            StrtAdd = Left(rng.Address, (z - 1))
                        Else:
                            StrtAdd = rng.Address
                        End If
                        Do
                            rng.Interior.ColorIndex = 3
                            Set rng = .Range(DataRange).FindNext(rng)
                        Loop While Not rng Is Nothing And Not rng.Address = StrtAdd
                    End If
            End With
        Next y
    Next x

虽然它是一个补丁,但它是一个工作补丁。

我没有使用@VBasic2008 对 Application.Union 的建议,因为代码当前运行正常,我必须得到一个版本。如果我遇到速度问题,我会回去制作一个新版本。

谢谢大家。


推荐阅读