【问题标题】:Sum max value of duplicates based on date threshold根据日期阈值对重复项的最大值求和
【发布时间】:2019-05-05 11:38:23
【问题描述】:

我有以下几列数据:

 Unique ID | Value | Date
     1     |   20  | 15/10/2018
     2     |   30  | 15/10/2018
     1     |   40  | 16/10/2018
     2     |   50  | 16/10/2018

然后我需要编写一个公式来根据日期阈值对 Value 列求和,但我只想包括每个唯一 ID 的最大值。

Date Threshold | Sum Formula
16/10/2018     | =SUMIF(C:C,"<="&F2,B:B)

显然,上述公式将对所有值求和 (140)。我只需要对每个唯一 ID (40+50=90) 小于或等于阈值日期的单个 MAX 值求和。

【问题讨论】:

  • 制作一列唯一的 ID 号。有一些公式可以做到这一点。轻松谷歌搜索。与该列相邻,生成对应于适当唯一 ID 的最大值列。在未使用的单元格中取该列的总和
  • 您好转发 Ed,感谢您的回复。我可以做到这一点,但我不确定如何将日期阈值纳入其中。例如。如果我的日期阈值为 2018 年 10 月 15 日,则公式应返回 50....
  • 我承认错过了日期要求。这是一大串数字吗?列表会按日期排序吗?

标签: excel excel-formula duplicates max


【解决方案1】:

任何单个工作表公式都需要多级循环计算,这会使公式过于复杂,从而导致所需的计算时间。一个或多个“帮助”列可以大大减少这种情况。

把这个放在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

请注意,在 G2 中的工作表上使用 UDF,就像任何其他标准工作表函数一样。

【讨论】:

  • 您好 user10735198,我非常感谢您的宏 - 它很有效!我可以把它推到这里,但是有没有一种方法可以让它只对过滤后的数据/可见数据(如小计)求和?我试过自己调整宏,但没有运气。在此先感谢:)
  • 只需将And 添加到If dates.Cells(i) &lt;= thold Then 以检查该行是否隐藏。
  • 再次嗨 - 我尝试添加 xlCellTypeVisible 但它似乎没有影响它。有任何想法吗? If dates.Cells(i) &lt;= thold And xlCellTypeVisible Then再次感谢大家的帮助!
  • TBH,不应在 cmets 部分询问和回答其他问题。最好使用您从上面的代码创建的修改后的代码开始一个新问题,并在该叙述中提出您的新问题。如果某些信息是多余的,那么您可以在链接中参考这个问题。
  • OK 就可以了。再次感谢所有帮助@user10735198
【解决方案2】:

第 1 步)生成唯一的 ID 列表

创建唯一 ID 列表。有一些公式可以为您执行此操作,或者您可以输入它们。假设您的示例在 F2:F3 中编写 ID

步骤 2) 截止日期

将您的截止日期放在一个单元格中,比如说 E2。

第 3 步)找到最大值

我相信 2016 年会有一个 MAXIF 函数。使用它来根据唯一 ID 和

=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 值表示它是一个字符串,需要转换。调整范围以适合您的数据。

【讨论】:

  • 谢谢转发 Ed。您的公式是正确的,但是 user10735198 提供的宏不那么复杂。非常感谢您的宝贵时间 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多