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