数组公式:总和

Posted

技术标签:

【中文标题】数组公式:总和【英文标题】:array formula: sum to date 【发布时间】:2022-01-21 06:03:49 【问题描述】:

我有许多发票:

invoice # start end paid on amount paid to date (hardcoded)
1 01/01/2020 30/01/2020 01/02/2020 £10.00 £10.10
2 01/02/2020 20/02/2020 01/03/2020 £7.50 £17.60
3 21/02/2020 30/02/2020 01/03/2020 £2.50 £20.10
4 01/01/2000 30/01/2000 01/03/2000 £0.10 £0.10

发票在哪里

不一定按开始和结束日期排序 不一定按付费日期排序。 可能没有实际价值。

我想添加一个名为 paid to date 的字段,它会显示到目前为止我已支付的金额,它将添加以下金额:

当前发票 在此发票的付款日期之前支付的发票。 与此发票具有相同paid-on 日期但开始日期为<= 此发票的开始日期的发票。

有效地镜像硬编码列。

这就是我使用查询的方式(这可能不是最简单/最优雅的方式)

=Index(
    query(
      A1:E10, 
      "select SUM(E)
      where D is not null
      and (
        D < date '"& TEXT( D2,"yyyy-mm-dd")&"' 
        OR (
          D = date '"& TEXT( D2,"yyyy-mm-dd")&"'
          and
          B <= date '"& TEXT( B2,"yyyy-mm-dd")&"'
        )
      )"
    ),
    2, 1
  )

这一切都很好。但我希望能够使用数组公式来完成,所以我可以为我自动生成它。

我尝试在数组公式中使用它,但该值只为第一行生成。我想这是把我传递的范围误解为查询函数的范围,即A1:E10。有没有简单的修复方法?

我需要使用 VLookup 吗?

Here 是一个示例电子表格。

【问题讨论】:

@player0给出的答案对你不起作用?我已经对其进行了测试,并且似乎可以正常工作,无论如何,您始终可以使用Custom Function 对其进行更多控制。这对你有用吗? 【参考方案1】:

尝试:

=INDEX(IFNA(VLOOKUP(A2:A, INDEX(SORT(A2:B, D2:E, 2, 1, 3, 1),,1), 
 MMULT(TRANSPOSE((ROW(E2:E)<=TRANSPOSE(ROW(E2:E)))*
 INDEX(SORT(A2:B, D2:E, 2, 1, 3, 1),,4)), SIGN(E2:E)), 2, 0)))

【讨论】:

哇不错!你介意用一两行解释一下策略是什么吗? 还有2,1,3,1等有什么意义? 在我的实际数据中,我有额外的列,我需要知道如何更改上述内容以使其正常工作。 @Mathsnoob 策略是根据日期对数据进行排序 -> 给定列 A,B,D,E 的范围,我们将第 2 列按 1(升序)排序,将第 3 列按 1(升序)排序) hance: 2,1,3,1 然后我们对数组执行运行总计(累积和)并将其与已排序的 A 列配对。接下来我们对 A 列执行 vlookup 并返回正确行的正确值 啊,抓住了你!谢谢。不幸的是,当我在我的实际桌子上尝试这个时,它不起作用。我收到“函数 ARRAY_ROW 参数 2 的行大小不匹配。预期:17379。实际:1。”【参考方案2】:

如果您有 Excel 365,则可以直接过滤。请注意,我使用的是带有结构化引用的表格。然后,您无需在表中添加/删除行时调整范围引用。

=SUM(FILTER([amount],([paid on]<[@[paid on]])+(([paid on]=[@[paid on]])*([start]<[@start])),0),[@amount])

这部分进行过滤:

...([paid on]<[@[paid on]])+(([paid on]=[@[paid on]])*([start]<[@start]))...

注意:您可以在表格中使用相同的算法:请注意,我使用的是常规寻址,并且还使用分号而不是参数分隔符的逗号

=sum(iferror(FILTER($E$2:$E$5;($D$2:$D$5<$D2)+(($D$2:$D$5=$D2)*($B$2:$B$5<$B2)));0);E2)

【讨论】:

啊看起来很酷!不幸的是,我主要对可以在谷歌表格上尝试的解决方案感兴趣。 @Mathsnoob 或许你应该考虑删除Excel标签。 请允许我纠正一下自己:Excel 和 Google 工作表有一组共同的功能。我对使用这些的解决方案感兴趣。例如,我没有用 Excel-365 标记这个问题。 @Mathsnoob 使用 FILTER 函数查看适用于 Excel 和表格的变体。 @Mathsnoob 1. 公式只会输出一个结果。在 Excel 中,使用表格,它会使用在第一个单元格中输入的公式自动填充整个列。您必须弄清楚这在表格中是否可行,否则您必须将公式复制下来。 2. 我不清楚,您的样本数据中也没有未付发票的示例。如果您最终使用我的公式,只需将其包装在 IF 中以检查付费字段是否为空白,如果不为空白则返回公式的结果,如果为空白则返回其他内容。

以上是关于数组公式:总和的主要内容,如果未能解决你的问题,请参考以下文章

Excel vba总和公式[复制]

通过组循环并添加总和公式

是否有条件格式化自定义公式,在该公式中,我可以检查两个或多个单元格(来自该范围)是否总和成一个值?

[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)

[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)

list滚动条Scroll 偏移和长度计算公式总结