过滤数据的行数

时间:2013-06-24 22:02:59

标签: excel-vba vba excel

我正在使用以下代码来获取VBA中已过滤数据行的计数,但在获取计数时,它会显示运行时错误:

  

“需要对象”。

有些人可以告诉我需要哪些更改吗?

Set rnData = .UsedRange

With rnData
    .AutoFilter Field:=327, Criteria1:=Mid(provarr(q), 1, 2)
    .Select
    .AutoFilter Field:=328, Criteria1:=Mid(provarr(q), 3, 7)
    .Select
    .AutoFilter Field:=330, Criteria1:=Mid(provarr(q), 10, 2)
    .Select
    .AutoFilter Field:=331, Criteria1:=Mid(provarr(q), 12, 2)
    .Select

     Rowz = .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.count

     ....
End With

9 个答案:

答案 0 :(得分:41)

如果您尝试计算已经自动过滤的范围内的行数,请执行以下操作:

Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count

它只计算自动过滤范围的第一个连续可见区域中的行数。例如。如果自动过滤器范围是行1到10并且行3,5,6,7和9被过滤,则可以看到四行(第2,4,8和10行),但它将返回2,因为第一个连续可见范围是第1行(标题行)和第2行。

这是一个更准确的替代方案(假设ws包含带有过滤数据的工作表):

Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1

我们必须减去1才能删除标题行。我们需要在我们的计数范围中包含标题行,因为如果没有找到单元格,SpecialCells将抛出错误,我们要避免这种情况。

Cells属性将为您提供准确的计数,即使范围有多个区域,与Rows属性不同。因此,我们只需获取自动过滤器范围的第一列并计算可见单元的数量。

答案 1 :(得分:19)

只需将其放入您的代码中:

Application.WorksheetFunction.Subtotal(3, Range("A2:A500000"))

确保应用正确的范围,但只需将其保留为一列

答案 2 :(得分:2)

虽然我同意给出的结果,但它们并不适合我。如果您的表有一个名称,这将起作用:

Public Sub GetCountOfResults(WorkSheetName As String, TableName As String)
    Dim rnData As Range
    Dim rngArea As Range
    Dim lCount As Long
        Set rnData = ThisWorkbook.Worksheets(WorkSheetName).ListObjects(TableName).Range
    With rnData
        For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas
            lCount = lCount + rngArea.Rows.Count
        Next
        MsgBox "Autofilter " & lCount - 1 & " records"
    End With
    Set rnData = Nothing
    lCount = Empty      
End Sub

这被修改为使用我在这里找到的原始版本的ListObjects:

http://www.ozgrid.com/forum/showthread.php?t=81858

答案 3 :(得分:1)

我知道这是一个旧线程,但我发现在VBA中使用Subtotal方法也能准确地呈现行数。我找到的公式是this article,看起来像这样:

Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row))

我测试了它,每次都准确出来,在A列中呈现正确数量的可见行。

希望这有助于像我这样的'网络的其他方式。

答案 4 :(得分:1)

我找到了一种方法来执行此操作,它需要2个步骤,但它可以正常工作

' to copy out a filtered selection into a different sheet


number_of_dinosaurs = WorksheetFunction.Count(Worksheets("Dinosaurs").Range("A2", "A3000"))

With Worksheets("Dinosaurs")
    .AutoFilterMode = False
    With .Range("$A$4:$E$" & number_of_dinosaurs)
        .AutoFilter Field:=2, Criteria1:="*teeth*" ' change your criteria to whatever you like
        .SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets("Bad_Dinosaurs").Range("A1")
    End With
End With


' then do a normal count on the secondary sheet  

number_of_dinosaurs_that_eat_humans = WorksheetFunction.Count(Worksheets("Bad_Dinosaurs").Range("A2", "A30000"))

答案 5 :(得分:1)

Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" & Rows(Rows.Count).End(xlUp).Row))

答案 6 :(得分:0)

我认为现在你有每行的范围,你可以用偏移(行,列)动作轻松操作该范围? 计算过滤的记录有什么意义(除非你需要在变量中计算)? 因此,不是(或在同一个块中)编写代码操作来将每行移动到空的隐藏工作表中,一旦完成所有操作,您可以从传输的范围数据中执行您喜欢的任何工作吗?

答案 7 :(得分:0)

Rowz = Application.WorksheetFunction.Subtotal(2,Range(“ A2:A”&Rows(Rows.Count).End(xlUp).Row))

这对我很有效

答案 8 :(得分:-1)

=COUNTIF(H2:H5000,"Your value to be count")

例如:

=COUNTIF(H2:H5000,"FALSE")

这将计算H列中的总误差。