VBA查找.address有时返回范围,而其他时候返回一个单元格

问题描述

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

该代码在第一张纸上完美工作。然后,在下一张纸上,它陷入无限循环。在单步执行代码之后,Find似乎首次在此页面上运行时返回的是Range格式的地址(“ A2:A2”),但此后又恢复为Cell格式(“ 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包含要找到的数据

提前谢谢!

解决方法

这是我最终使用的代码。我仍然不知道为什么有时有时我会收到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的建议,因为该代码当前可以正常运行,并且我必须发布一个版本。如果遇到速度问题,我会回去制作一个新版本。

谢谢大家。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...