VBA 有时查找 .address returns 范围,有时查找单元格

VBA Find .address sometimes returns range and other times a cell

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

代码在第一个 sheet 上运行完美。然后,在下一个 sheet,它陷入无限循环。逐步执行代码后,似乎 Find returns an address that is in Range format ("A2:A2") 第一次是 运行 在此页面上,但随后又恢复为 Cell 格式(" A2") 之后。它不会在第一页上执行此操作,仅在第二页上执行此操作。

我可以写一些代码来检查返回的值并 trim 它下来,但我想解决这个问题,而不是打补丁。

这是中断的代码:

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 是一个数组,其中包含作品sheet 名称

findData 包含要查找的数据

提前致谢!!

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

我用 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 的建议,因为代码目前运行正常,我必须得到一个版本。如果我 运行 遇到速度问题,我会回去制作一个新版本。

谢谢大家