0

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

4

1 回答 1

3

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

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

例如,当过滤此表时B在此处输入图像描述

您的范围对象将有 3 个区域,每个 1x2 单元格。出于某种奇怪的原因,Rows.Count没有考虑这些区域,所以Selection.Rows.Count1 虽然应该是 3。但是,如果您遍历 Rows 枚举,它将按预期工作:

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

于 2013-02-26T10:05:58.687 回答