Range.Find在既是隐藏的又是filter的一部分的范围上失败

我在Excel 2003中遇到了一个奇怪的问题,当在一个既是隐藏的,又是过滤范围的一部分的单元格中search值时,Range.Find方法失败。

要清楚的是,这是有问题的方法调用:

Cells.Find(SearchString, LookIn:=xlFormulas, LookAt:=xlWhole) 
  • 如果包含SearchString的单元格仅仅隐藏,则Range.Find起作用。
  • 如果包含SearchString的单元格只是过滤范围的一部分(但不隐藏),则Range.Find将起作用。
  • 如果包含SearchString的单元格被隐藏(通过filter或其他方式),则AND是过滤范围的一部分,则Range.Find将失败。

各种Excel网站和论坛上的许多消息都声称指定“LookIn:= xlFormulas”会强制Range.Find在隐藏的单元格中进行search。 虽然无意义,但如果SearchString位于仅仅隐藏的单元格中,那么这似乎是正确的。 如果单元既是隐藏的,也是已过滤范围的一部分,则失败。

请注意,如果单元格被filter隐藏,则无关紧要。 例如,您可以search已过滤范围的标题 (filter本身永远不会隐藏该标题),但如果该标题碰巧位于已隐藏的列中,则Range.Find将失败。

有什么Excel方法可以可靠地search单元而不用考虑它们是否隐藏和/或是filter的一部分?

你总是可以做你自己的查找function:

 Private Function FindAnywhere(target As Range, search As Variant) As Range Dim values() As Variant Dim row As Long Dim col As Long values = target.Value For row = LBound(values, 1) To UBound(values, 1) For col = LBound(values, 2) To UBound(values, 2) If values(row, col) = search Then Set FindAnywhere = target.Cells(row, col) Exit Function End If Next col Next row End Function 

唯一的警告是,如果您正在使用(或打算使用)FindPrevious或FindNext,您将不得不跟踪您已经search的范围的区域。

更多细节将会有所帮助

  • 对于一个范围,你可以使用Match
  • 对于2D来说,可以查看数组的每个元素,或者将MATCH应用到数组的每一列

1D以下的样品

 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() 

2D

 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