过滤数据的行数

use*_*403 16 excel vba

我正在使用下面的代码来获取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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ell 46

如果您尝试计算已经自动过滤的范围中的行数,如下所示:

Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
Run Code Online (Sandbox Code Playgroud)

它仅计算自动过滤范围的第一个连续可见区域中的行数.例如,如果自动过滤器范围是行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
Run Code Online (Sandbox Code Playgroud)

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

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


小智 20

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

Application.WorksheetFunction.Subtotal(3, Range("A2:A500000"))
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些需要查找的人,第一个参数指定要使用的聚合函数; 3是"CountA",是列中非空的单元格数. (3认同)
  • 完善.上面提到的解决方案可能会在表等空行的情况下提供不正确的结果.这个工作就像一个魅力:) (2认同)