【问题标题】:Macro using .AutoFilter only works on first iteration--all other totals are zero使用 .AutoFilter 的宏仅适用于第一次迭代——所有其他总数为零
【发布时间】:2019-05-18 03:15:13
【问题描述】:

我在 Excel 2016 (win 10) 工作表中有两个工作表:datatemplateData 包含 CLASS 和相关数据。工作表按 CLASS 排序 (a-z)。 Template 包含每类一行的背景数据。一个类的例子可能是orangesapplesblackberries

我遍历Template 中的类列表。对于每个类,我使用 AutoFilter 在“数据”表上选择一个特定的类,然后计算带有.SpecialCells(XlCellTypeVisible).Rows.count 的条目数。我将计数保存到Template 表中。第一类被正确过滤和计数。以下所有类均已正确过滤,但计数为零。

例子:

"data" sheet
CLASS column (sorted a-z)
apples
apples
apples
apples
apples
blackberries
blackberries
blackberries
oranges
oranges

"Template" sheet
CLASS column
apples
blackberries
melons
oranges

想要的结果:

"Template" sheet
CLASS column    myCount column
apples          5
blackberries    3
melons          0
oranges         2

实际结果:

"Template" sheet
CLASS column    myCount column
apples          5
blackberries    0
melons          0
oranges         0

我的代码是:

Sub CountAll()
  Dim rng As Range
  Dim myRow As Integer     'Row number in Template
  Dim thisClass As String  'Class we are currently counting
  Dim myCount As Integer   'Number of times thisClass is in "data"
  Dim numClasses as Integer  'Set to the number of classes in "Template"
  ...
  For myRow = 1 to numClasses
    thisClass = Worksheets("template").Cells(myRow, 1).Value
    Set rng = Worksheets("data").Range("A:A")
    With rng
      .AutoFilter Field:=1, Criterial:=thisClass
    End With

    myCount = rng.SpecialCells(xlCellTypeVisible).Rows.count
    Worksheets("template").Cells(myRow,3).Value = myCount
    ActiveSheet.showAllData 'Display all data again.
  Next myRow
End Sub

在购买报告生成器之前,此代码是临时的(6-12 个月)。 VBA 不是我的选择。我更擅长汇编、c、FORTRAN 和 JAVA。任何建议将不胜感激。我花了大约 4 个小时研究这个问题。

【问题讨论】:

  • 感谢格式化帮助。
  • 您是否使用 F8 单步执行了代码?您可能会发现您的过滤器的行为不像您预期​​的那样,或者另一个工作表处于活动状态。如果你只想要一个计数,那么你也可以使用 countif。
  • 我对 F8 不熟悉,但我使用 MsgBox 暂停并显示值(见下文)。打开“数据”表后,我可以看到过滤工作正常。但是,在第一次迭代之后,所有计数都为零。
  • 明白了。很确定我有你的解决方案,并会发布一个答案。 F8 和 F9 是您的调试朋友。 F9 在暂停执行的行上放置一个断点,以便您可以评估变量和条件。 F8 执行下一行并暂停。所以在这种情况下,你可以用断点替换你的 msgbox。

标签: excel vba


【解决方案1】:

看看这个答案:Row count on the Filtered data

[Rows.Count] 只会计算自动过滤范围的第一个连续可见区域中的行数... [Cells.Count] 即使 Range 有多个区域也会为您提供准确的计数,这与 @ 不同987654324@房产

刚刚测试并可以确认这是真的。您必须注意Cells.Count,并确保您的范围得到适当处理。

  • 在链接的解决方案中,Cells.Count -1 用于 调整第一行的标题,但你不会减去 1 如果您的范围基于表格的DataBodyRange,则从计数中计算。
  • 如果您的范围包含超过 1 列,那么您的计数将为 乘以可见列的数量,您可能想要 将结果除以您的列数或设置不同的范围。

在您的示例中,您的范围被明确定义为一整列,但我可以推断您是使用标题行还是希望计算该行。假设您确实使用它并且您不想计算它,那么-1 是合适的。

总之,这是您的解决方案:myCount = rng.SpecialCells(xlCellTypeVisible).Cells.Count-1

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多