自动过滤器无法正常工作

时间:2013-02-26 09:31:09

标签: excel vba

我正在尝试根据列中的值过滤掉一些单元格,但我担心第一个过滤器操作会污染其余的,但我尝试通过将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我可以看到只有第一个返回任何行

1 个答案:

答案 0 :(得分:3)

这是一个非常讨厌的问题! : - )

问题在于,在应用自动过滤器和.SpecialCells(xlCellTypeVisible)后,您的新Range对象由多个组合范围组成。

E.g。在为B过滤此表时, enter image description here

你的范围对象将有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也会始终返回表格的第一个标题行,因此请相应处理!