【发布时间】:2019-05-18 03:15:13
【问题描述】:
我在 Excel 2016 (win 10) 工作表中有两个工作表:data 和 template。 Data 包含 CLASS 和相关数据。工作表按 CLASS 排序 (a-z)。 Template 包含每类一行的背景数据。一个类的例子可能是oranges、apples、blackberries。
我遍历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。