问题描述
我在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的建议,因为该代码当前可以正常运行,并且我必须发布一个版本。如果遇到速度问题,我会回去制作一个新版本。
谢谢大家。