【发布时间】:2021-05-21 12:41:14
【问题描述】:
这就是我的数据的样子。它实际上取决于 K 列。N 列和 O 列是我通过 VBA 创建的。数据有 50,000+ 行
我要做的是通过过滤器找到 E 列的唯一值,然后通过求和列 K 值来找到该值的总时间。
这是我的代码:
Sub Test()
Application.ScreenUpdating = False
Dim lRow As Long
ActiveSheet.Range("E2:E655360").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ActiveSheet.Range("N2"), Unique:=True
lRow = Cells(Rows.Count, 14).End(xlUp).Row
For i = 2 To lRow
ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=5, Criteria1:= _
Cells(i, 14).Value
ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=11, Criteria1:= _
"<1:10:00"
Cells(i, 15).Value = Application.WorksheetFunction.Subtotal(109, Range("$K$2:$K$100000"))
ActiveSheet.Range("K2:K999999").SpecialCells(xlCellTypeVisible).Copy
ActiveSheet.Cells(1, 27).PasteSpecial
'ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=11
'ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=5
Next i
End Sub
一切正常,除了小计给我的值正好是实际总和的一半。我无法使用 SUM,因为它也在计算隐藏的过滤掉的行的总和。我通过 SUM 函数和状态栏总和值对此进行了测试。有趣的是,即使没有应用过滤器,它也给了我一半的价值
为了进行测试,我检查了状态栏总和值以及 SUM(K:K) 两者都给出了小计值的两倍值
一个简单的解决方法可能是将答案乘以 2,但我想了解实际问题,因为这种快速修复可能会在以后产生问题
K列的数字格式为[h]:mm:ss
这是用于快速参考的小计第一个参数语法:
另外,如果我能以某种方式使这段代码更高效,或者改变其他任何东西以使其正常工作,请告诉我。提前非常感谢
【问题讨论】:
-
为什么你从不尝试 sumIfs 函数,它不能提供正确的结果?
-
这听起来像是使用数据透视表的最佳时机。您可以将其设置为根据 E 列自动分组,然后将 K 列设置为值字段并选择 SUM。
-
如果小计单元格包含在总和范围内,您可以获得您看到的效果......