我正在使用以下代码来获取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
答案 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:
答案 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列中的总误差。