繁体   English   中英

ArrayFormula 计算前几行

[英]ArrayFormula to calculate previous rows

我有 3 张纸:

  • Sheet1 - 交易清单(账户、贷方、借方、日期)
  • Sheet2 - 交易清单(账户、贷方、借方、日期)
  • Sheet3(我打算锁定它) - 按日期排序的交易组合列表

Sheet3 看起来像: 在此处输入图像描述

我需要在 Sheet3 中再添加 1 列来计算某些行的当前余额,如下所示: 在此处输入图像描述

我可以用公式做到这一点:

=SUM(FILTER($B$2:$B$8, ROW($A$2:$A$8) <= ROW($A2), A$2:A$8=$A2)) - SUM(FILTER($C$2:$C$8, ROW($A$2:$A$8) <= ROW($A2), A$2:A$8=$A2))

但是这个我需要不断地拖下去。

问题:有没有办法将此公式转换为 ArrayFormula,以避免拖动

实时示例: https ://docs.google.com/spreadsheets/d/1e3IJaiOSlkia6ce9UGgIL_sNR6FK5TOp-BNrSYwS8Lg/edit?usp=sharing

在第 3 页的 G2 中,我输入了

=ArrayFormula(if(A2:A="",,mmult((A2:A=transpose(A2:A))*(row(A2:A)>= TRANSPOSE(row(A2:A)))*(transpose(B2:B)-transpose(C2:C)),row(A2:A)^0)))

看看这对你有用吗?

在 Sheet3 第 1 行中,放置您的标题。

Sheet3!A2中,放

=sort({filter(Sheet1!A2:D,not(isblank(Sheet1!A2:A)));filter(Sheet2!A2:D,not(isblank(Sheet2!A2:A))),4,true)

Sheet3!E2中,放

=mmult(transpose(arrayformula(arrayformula(array_constrain(A2:A,counta(A2:A),1)=transpose(array_constrain(A2:A,counta(A2:A),1)))
                              *arrayformula(array_constrain(row(A2:A),counta(A2:A),1)<=transpose(array_constrain(row(A2:A),counta(A2:A),1))))),
       arrayformula(array_constrain(B2:B,counta(A2:A),1)-array_constrain(C2:C,counta(A2:A),1))

要了解原因,让我们暂时删除array_constrain(...,counta(...),1)包装,它旨在自动检测最后一个数据行:

=mmult(transpose(arrayformula(arrayformula(A2:A9=transpose(A2:A9))
                 *arrayformula(row(A2:A9)<=transpose(row(A2:A9))))),
       arrayformula(B2:B9-C2:C9))

arrayformula(B2:B9-C2:C9)是 B 列 - C 列的运行总和(即贷方 - 借方)。 它是一个列向量,具有数据大小的长度。

对于每一行,我们希望 1) 通过与 A 列(即帐户名称)的比较来过滤此向量,以及 2) 通过运行总和是否低于或高于相关行来过滤此向量。

arrayformula(A2:A9=transpose(A2:A9))执行 1)。 arrayformula(row(A2:A9)<=transpose(row(A2:A9)))做 2)。

我们想要两个矩阵之间的元素乘积以组成过滤器。 因此, arrayformula(...*...)

我们过滤器的列旨在应用于运行总和。 要使用矩阵乘法,我们可以保留运行和的列向量作为后乘数; 并将滤波器矩阵转置为预乘数,以便将转置矩阵的行乘以(即应用)到运行总和。 因此, mmult(transpose(...),...)

添加回array_constrain技巧。 我们完成了。

随意尝试arrayformula的替代放置。 但请记住,在您省略arrayformula的任何地方都保留()括号。 例子:

=arrayformula(mmult(transpose(((array_constrain(A2:A,counta(A2:A),1)=transpose(array_constrain(A2:A,counta(A2:A),1)))
                                *(array_constrain(row(A2:A),counta(A2:A),1)<=transpose(array_constrain(row(A2:A),counta(A2:A),1))))),
                    (array_constrain(B2:B,counta(A2:A),1)-array_constrain(C2:C,counta(A2:A),1))))

尽管如此,与每个单元格单独传播的公式相比 1 公式解决方案的计算效率更高。 这是因为,在不改变每行公式的情况下,我们被迫将过滤器计算为完整的 n×n 矩阵,其中 n 是您的数据大小。

然而,如果在 E2 中我们=sum(filter(B$2:B2-C$2:C2,A$2:A2=A2))并在选择 E2 时通过双击右下角的方块将其展开到末尾,该公式每行都会发生变化,完全保存行索引比较,并以对数方式将比较切割到 A 列。

当然,我们可能不应该依赖 Google 表格来获取大型数据库(例如 >100k 条目)。 但是,即使对于数千个条目,如果您将所需的计算量平方,在浏览器中获取结果也会变得非常慢,远远超出人们的预期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM