我有以下几列数据:
Unique ID | Value | Date
1 | 20 | 15/10/2018
2 | 30 | 15/10/2018
1 | 40 | 16/10/2018
2 | 50 | 16/10/2018
然后我需要编写一个公式以基于日期阈值对“值”列求和,但是我只想包括每个唯一ID的最大值。
Date Threshold | Sum Formula
16/10/2018 | =SUMIF(C:C,"<="&F2,B:B)
很显然,上面的公式将求和所有值(140)。我只需要将单个MAX值的总和小于或等于每个唯一ID的阈值日期(40 + 50 = 90)。
答案 0 :(得分:0)
第1步)生成唯一的ID列表
创建唯一ID列表。有一些公式可以为您完成此操作,也可以将其键入。假设您在示例中将ID写入F2:F3
第2步)截止日期
将日期截止日期放到一个单元格中,比如说E2。
第3步)找到最大值
我相信2016年会有MAXIF函数。使用它根据唯一ID和<=截止日期提取最大值。 MAXIF是更好的公式,但是很遗憾,我无法使用它,也无法为您提供更多的指导。如果您没有2016年或无法使用MAXIF,则可以使用聚合。聚合可以是执行类似数组操作的函数。因此,请勿在其功能内使用完整的列引用,否则将进行过多的计算,这将使您的系统陷入困境甚至更糟。
=AGGREGATE(14,6,$B$2:$B$5/(($A$2:$A$5=$F2)*($C$2:$C$5<=$E$2)),1)
将该公式放置在G2中,然后在每个唯一ID旁边复制下来。然后它将提供该日期之前或等于截止日期的最大值。
第4步)将最大值合计
在未使用的列中,将上一个公式的结果求和
=SUM(G2:G3)
这假设您的第一个表是A:C列。它还假定您的日期为excel序列日期格式,而不是伪装为excel日期的字符串。您可以使用=ISNUMBER(A1)
测试后面的内容,其中A1是带有日期的单元格。值为false表示它是一个字符串,需要转换。调整范围以适合您的数据。
答案 1 :(得分:0)
任何单个工作表公式都将需要多个级别的循环计算,这将使公式以及随后的计算时间变得过于复杂。一个或多个“帮助”列可以大大减少这一点。
将其放入D2并填写。
=IF(COUNTIF(A$2:A2, A2)=1, AGGREGATE(14, 7, B:B/((C$1:C$9<=F$2)*(A$1:A$9=A2)), 1), "")
您要查找的已过滤最大值的总和只是D列的总和(例如=sum(D:D)
)。
请注意,我已添加到您的原始样本数据中,以更清楚地证明其他条件。
可以简化和限制所需步骤的用户定义功能可能是最好的选择。
使用Alt + F11打开VBE,使用Alt + I,M插入模块代码表,然后将此代码粘贴到新打开的代码窗格中。像其他任何标准工作表功能一样,使用新的自定义功能。
Option Explicit
Function maxUniqueWithThreshold(ids As Range, vals As Range, _
dates As Range, thold As Long)
Static d As Object, i As Long
'create a dictionary for unique ids only if not previously created
If d Is Nothing Then Set d = CreateObject("scripting.dictionary")
d.RemoveAll
'limit the processing ranges
Set ids = Intersect(ids, ids.Parent.UsedRange)
Set vals = vals.Resize(ids.Rows.Count, ids.Columns.Count)
Set dates = dates.Resize(ids.Rows.Count, ids.Columns.Count)
'cycle through the processing ranges
For i = 1 To ids.Cells.Count
'is date within threshold?
If dates.Cells(i) <= thold Then
'collect the maximum value for each unique id into dictionary Items
d.Item(ids.Cells(i).Value2) = _
Application.Max(d.Item(ids.Cells(i).Value2), vals.Cells(i).Value2)
End If
Next i
maxUniqueWithThreshold = Application.Sum(d.items)
End Function
请注意,与其他任何标准工作表功能一样,UDF正在G2中的工作表上使用。