excel - 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 包含要查找的数据
提前致谢!!
解决方案
这是我最终使用的代码。我仍然不知道为什么有时我会得到一个地址,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 的建议,因为代码当前运行正常,我必须得到一个版本。如果我遇到速度问题,我会回去制作一个新版本。
谢谢大家。
推荐阅读
- android - cmake 和为 64 位项目构建 android
- c++ - 如何在 C++ 代码中连接 sql server 数据库?
- javascript - 有没有办法使用 node.js 知道 mysql 表中是否存在一行?
- javascript - 根据文本具体化调整的选项卡指示器
- c# - 如何访问泛型类中数组中的项目?
- node.js - 来自 Slack 的用于按钮交互的 POST 正文为空
- node.js - 我收到警告:组件正在更改要控制的文本类型的不受控制的输入
- sql-server - 在 Always On 中将文件移动到新的 SQL Server 版本/实例
- nativescript - 如何通过 *ngIf 显示
- javascript - 如何绘制多个 d3js 可缩放树形图