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。地址是";A2:A2";并存储在StrtAdd中。然后,当代码到达.FindNext(rng(rng时。地址更改为";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的建议,因为代码目前运行正常,我必须发布一个版本。如果我遇到速度问题,我会回去做一个新版本。

谢谢大家。

最新更新