Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 过滤数据上的行计数_Excel_Vba - Fatal编程技术网

Excel 过滤数据上的行计数

Excel 过滤数据上的行计数,excel,vba,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) .Selec

我使用下面的代码来获取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

如果尝试按如下方式计算已自动筛选范围中的行数:

Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row))
它将只计算自动筛选范围的第一个连续可见区域中的行数。例如,如果自动筛选范围是第1行到第10行,并且筛选了第3、5、6、7和9行,则有四行可见(第2、4、8和10行),但它将返回2,因为第一个连续可见范围是第1行(标题行)和第2行

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

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


属性不同,即使范围有多个区域,
单元格
属性也会为您提供准确的计数。因此,我们只需获取自动筛选范围的第一列,并计算可见单元格的数量。

我认为现在您拥有了每一行的范围,您可以通过偏移(行,列)操作轻松地操纵该范围了吗? 对过滤的记录进行计数有什么意义(除非在变量中需要该计数)?
因此,您不必(或者在同一块中)编写代码操作,将每一行移动到一个空的隐藏表中,并且在完成所有操作后,您可以从传输的范围数据中执行任何您喜欢的操作?

我知道这是一个旧线程,但我发现使用VBA中的小计方法也可以准确地呈现行数。我在中找到的公式如下所示:

Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row))
我对它进行了测试,每次测试结果都非常准确,在A列中显示了正确数量的可见行


希望这能帮助像我这样的网络旅行者。

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

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而修改的:


只需在代码中添加以下内容:

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

确保应用了正确的范围,但只需将其保留在一列中即可

我找到了一种方法,它需要两个步骤,但可以工作

' 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"))

这对我很有效

谢谢你的回复。我正在使用Excel2007。在上面的代码中,它将错误消息显示为“对象不支持此属性或方法”。我想我刚刚得到它。我使用了下面的代码来计算行数,它成功了。这只计算第一个连续范围内的行数。我将更新答案,使其更加准确。我一直在寻找“细胞”解决方案。谢谢:-)感谢您提供有关“单元格与行”属性的更多信息,我们已经使用了多年,这解释了一些重复出现的问题。这!!!谢谢,我花了几个小时试图找到如何从已筛选的ListObject中获取行数。如果有多个区域,这将不起作用。简单地说,一个命名区域可以有一个或多个区域,并且可以重复计算行数。我建议获得区域数的计数并使用最后一个区域范围,因为这是可见列表中所有行的真实计数。完美。上面提到的解决方案可能会在表等中出现空行的情况下提供不正确的结果。此解决方案就像一个符咒:)对于需要查找它的人,第一个参数指定要使用的聚合函数;3是“CountA”,是一列中非空的单元格数。正确。您必须向后计数。总的方法2是“计数”,它只计算包含数字的单元格数
Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" & Rows(Rows.Count).End(xlUp).Row))