我正在尝试根据列中的值过滤掉一些单元格,但我担心第一个过滤器操作会污染其余的,但我尝试通过将filtermode设置为false来取消设置过滤器。
我的选择方法如下所示:
Function GetRowRange(sheetRange, column, value) As Range
'check for a valid section column
sheetRange.AutoFilterMode = False
sheetRange.UsedRange.AutoFilter Field:=column, Criteria1:=value
Set GetRowRange = sheetRange.UsedRange.SpecialCells(xlCellTypeVisible)
MsgBox ("col:" & column & " val: " & value & " rows:" & GetRowRange.Rows.Count)
sheetRange.AutoFilterMode = False
End Function
从msgbox我可以看到只有第一个返回任何行
答案 0 :(得分:3)
这是一个非常讨厌的问题! : - )
问题在于,在应用自动过滤器和.SpecialCells(xlCellTypeVisible)
后,您的新Range对象由多个组合范围组成。
E.g。在为B
过滤此表时,
你的范围对象将有3个区域,每个1x2个单元格。出于某些奇怪的原因,Rows.Count
没有考虑这些区域,因此Selection.Rows.Count
为1,尽管它应该是3.但是,如果循环遍历Rows枚举,它将按预期工作:< / p>
lngCount = 0
For Each r In Selection.Rows
lngCount = lngCount + 1
Next
这将返回3.
因此,GetRowRange
将返回正确的范围,但.Rows.Count
例程会传递错误的结果。请改用此功能:
Function RowCount(rngAreas As Range) As Long
Dim lngCount As Long
Dim rng As Range
For Each rng In rngAreas.Areas
lngCount = lngCount + rng.Rows.Count
Next
RowCount = lngCount
End Function
只是旁注:请注意,您的GetRowRange
也会始终返回表格的第一个标题行,因此请相应处理!