excel 筛选数据的行数

yhxst69z  于 2023-11-20  发布在  其他
关注(0)|答案(9)|浏览(169)

我正在使用下面的代码来获取在MySQL中过滤的数据行的计数,但是在获取计数时,它给出了运行时错误:
“需要对象”。
请告诉我需要什么样的改变。

  1. Set rnData = .UsedRange
  2. With rnData
  3. .AutoFilter Field:=327, Criteria1:=Mid(provarr(q), 1, 2)
  4. .Select
  5. .AutoFilter Field:=328, Criteria1:=Mid(provarr(q), 3, 7)
  6. .Select
  7. .AutoFilter Field:=330, Criteria1:=Mid(provarr(q), 10, 2)
  8. .Select
  9. .AutoFilter Field:=331, Criteria1:=Mid(provarr(q), 12, 2)
  10. .Select
  11. Rowz = .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.count
  12. ....
  13. End With

字符串

iyfjxgzm

iyfjxgzm1#

如果您尝试像这样计算已自动筛选范围中的行数:

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

字符串
它只计算自动筛选范围的第一个连续可见区域中的行数。例如,如果自动筛选范围是第1到10行,并且筛选了第3、5、6、7和9行,则有四行可见(第2、4、8和10行),但它将返回2,因为第一个连续可见范围是第1行(标题行)和第2行。
更准确的替代方法是这样的(假设ws包含带有过滤数据的工作表):

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


我们必须减去1来移除标题行。我们需要将标题行包含在我们的计数范围中,因为如果没有找到任何单元格,SpecialCells将抛出错误,这是我们想要避免的。
Cells属性给予一个精确的计数,即使Range有多个Area,这与Rows属性不同。所以我们只需要自动筛选范围的第一列,然后计算可见单元格的数量。

kx5bkwkv

kx5bkwkv2#

在你的代码中简单地写上:

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

字符串
请确保应用正确的范围,但仅限于一列

bmvo0sr5

bmvo0sr53#

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

  1. Public Sub GetCountOfResults(WorkSheetName As String, TableName As String)
  2. Dim rnData As Range
  3. Dim rngArea As Range
  4. Dim lCount As Long
  5. Set rnData = ThisWorkbook.Worksheets(WorkSheetName).ListObjects(TableName).Range
  6. With rnData
  7. For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas
  8. lCount = lCount + rngArea.Rows.Count
  9. Next
  10. MsgBox "Autofilter " & lCount - 1 & " records"
  11. End With
  12. Set rnData = Nothing
  13. lCount = Empty
  14. End Sub

字符串
这是修改后的工作与列表对象从原来的版本,我发现在这里:
http://www.ozgrid.com/forum/showthread.php?t=81858

展开查看全部
trnvg8h3

trnvg8h34#

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

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

字符串
我对它进行了测试,它每次都能准确地显示出A列中可见行的正确数量。
希望这能帮助像我这样的网络旅行者。

kt06eoxx

kt06eoxx5#

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

字符串

a14dhokn

a14dhokn6#

我已经找到了一种方法来做到这一点,它需要2个步骤,但它的工作

  1. ' to copy out a filtered selection into a different sheet
  2. number_of_dinosaurs = WorksheetFunction.Count(Worksheets("Dinosaurs").Range("A2", "A3000"))
  3. With Worksheets("Dinosaurs")
  4. .AutoFilterMode = False
  5. With .Range("$A$4:$E$" & number_of_dinosaurs)
  6. .AutoFilter Field:=2, Criteria1:="*teeth*" ' change your criteria to whatever you like
  7. .SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets("Bad_Dinosaurs").Range("A1")
  8. End With
  9. End With
  10. ' then do a normal count on the secondary sheet
  11. number_of_dinosaurs_that_eat_humans = WorksheetFunction.Count(Worksheets("Bad_Dinosaurs").Range("A2", "A30000"))

字符串

展开查看全部
c90pui9n

c90pui9n7#

我认为现在你有了每一行的范围,你可以很容易地用偏移量来操纵这个范围(行,列)操作?对过滤的记录进行计数的意义是什么(除非你需要一个变量中的计数)?所以与其(或者在同一块中)编写代码操作,将每行移动到一个空的隐藏工作表,一旦完成,你可以从传输的范围数据中做任何你喜欢的工作?

fslejnso

fslejnso8#

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

字符串
这对我很有效

8hhllhi2

8hhllhi29#

我通过公式来实现它,假设这个表:Example table
如A2所示,公式

  1. =SUBTOTAL(3;[Alias])-SUBTOTAL(3;[@Alias]:C$5)+1

字符串
向下传播,这意味着第二个SUBTOTAL的第二个参数的开始将作为枢轴移动。
这是因为Subtotal计算所有可见的过滤结果,得到结果的数量(第一个SUBTOTAL的情况),然后我们减去当前下面的剩余行;最后我们添加偏移量(“+1”),这是我们搜索域上方的行数(在这种情况下,它只是标题)。

相关问题