vba - Range.Find 在隐藏且属于过滤器的范围上失败

标签 vba excel

我在 Excel 2003 中遇到一个特殊问题,即在隐藏且属于筛选范围的单元格中搜索值时,Range.Find 方法失​​败。

需要明确的是,这是有问题的方法调用:

Cells.Find(SearchString, LookIn:=xlFormulas, LookAt:=xlWhole)
  • 如果仅隐藏包含 SearchString 的单元格,则 Range.Find 可以工作。
  • 如果包含 SearchString 的单元格只是过滤范围的一部分(但未隐藏),则 Range.Find 有效。
  • 如果包含 SearchString 的单元格既被隐藏(通过过滤器或其他方式),又是过滤范围的一部分,则 Range.Find 会失败。

各种 Excel 网站和论坛上的许多来源声称指定“LookIn:=xlFormulas”将强制 Range.Find 在隐藏单元格内搜索。虽然荒谬,但如果 SearchString 位于仅仅隐藏的单元格中,这似乎是正确的。如果单元格隐藏并且属于过滤范围的一部分,则会失败。

请注意,单元格是否被过滤器隐藏并不重要。例如,您可以搜索过滤范围的标题(过滤器本身永远不会隐藏该标题),但如果该标题恰好位于您隐藏的列中,则 Range.Find将会失败。

是否有任何 Excel 方法可以可靠地搜索单元格,而不管它们是否恰好隐藏和/或属于过滤器?

最佳答案

更多细节会有所帮助

  • 对于一维范围,您可以使用Match
  • 对于 2D 变体数组,可以查看数组的每个元素,或者对数组的每一列应用 MATCH

示例如下 一维

Sub D1()

Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Range("C5:C100")
Dim StrTest As String
Dim X As Variant

StrTest = "Filtered"

X = Application.Match(StrTest, rng1, 0)
If IsError(X) Then
    MsgBox "no match"
Else
    MsgBox "Found in position " & X
    Set rng2 = rng1.Cells(X)
End If
End Sub

Sub D2()

二维

Dim X
Dim lngRow As Long
Dim lngCol As Long
Dim StrTest As String


X = Range("C5:D100").Value2
StrTest = "Filtered"

For lngRow = 1 To UBound(X, 1)
    For lngCol = 1 To UBound(X, 2)
        If X(lngRow, lngCol) = StrTest Then
         Set rng1 = [c5].Offset(lngRow - 1, lngCol - 1)
         MsgBox "Found in position " & rng1.Address
        End If
    Next
Next

End Sub

关于vba - Range.Find 在隐藏且属于过滤器的范围上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29550841/

相关文章:

sql - 哪个更好实践: complex SQL statements or Recordset manipulation in Access VBA?

vba - 刷新 Excel 连接

arrays - 如何使用算术运算符获取单元格位置

excel - 系统集合数组列表

excel - 运行时错误 '438' : Object does't support this property or method

excel - 有什么方法可以加快 VBScript 中的 excel 比较速度?

vba - 使用 VBA 将多个 xls 文件数据复制到单个文件

vba - 有没有办法测试 Excel 中的图表是否堆叠了其系列

一次结束宏的VBA代码

python - 如何使用 Pandas ExcelWriter 将空工作表添加到现有工作簿中