我正在使用下面的代码来获取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)
确保应用正确的范围,但只需将其保留为一列