2013-02-26 40 views
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我可以看到,只有第一个返回任何行

+0

不知何故,这个代码看起来很熟悉! ;-) – 2013-02-26 09:32:29

+0

@PeterAlbert我想我会创建一个新的线程,而不是利用你的帮助:) – Jakob 2013-02-26 09:33:45

回答

3

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

的问题是,应用自动筛选和.SpecialCells(xlCellTypeVisible)后,新的Range对象是由多个的,合并范围。

E.g.当过滤此表为B, enter image description here

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

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也将随时返回你的表的第一标题行,所以相应地处理这个!

+0

什么奇怪的问题,再次 – Jakob 2013-02-26 10:33:34

+0

感谢你作为一个侧面说明,你知道,如果像.CountiF Excel的功能受此 - 我有这个奇怪的错误,当我这样做对一列,场:= 2它工作正常,但是当现场:= 3这是行不通的,而我只得到像2个或3行返回如果我跑.Count如果列 – Jakob 2013-02-26 12:35:02

+0

不知道。 :-(也许尝试'.Subtotal'替代? – 2013-02-26 12:38:04