问题描述
我正在尝试创建一个简单的 arrayformula
以在现金簿中保持运行记录。很简单,但让我难住了。这是一个基本表格:
A | B | C | |
---|---|---|---|
1 | 输入 | 退出 | 总计 |
2 | |||
3 | 10 | 10 | |
4 | 1 | 9 | |
5 | 7 | 16 | |
6 | 5 | 21 | |
7 | 4 | 17 |
因此,例如要在单元格 C3 中生成总数,我使用公式 offset(C3,-1,0)-B3+A3
但我想我可以将它包装在 arrayformula
中,因此它变成了 arrayformula(offset(C3:C,0)-B3:B+A3:A)
但它错误并且需要一个无休止的额外行。
任何帮助都会很棒。
解决方法
-
使用两个总计:
IN
和OUT
并从OUT
中减去IN
-
创建运行总计的经典 arrayformula 解决方案是将 SUMIF 与变量字符串(相对于
range
参数)用作criterion
=ARRAYFORMULA(SUMIF(ROW(A2:A7),"<="&ROW(A2:A7),A2:A7)-SUMIF(ROW(A2:A7),B2:B7))
-
开放范围版本:
=ARRAY_CONSTRAIN(ARRAYFORMULA(SUMIF(ROW(A2:A),"<="&ROW(A2:A),A2:A)-SUMIF(ROW(A2:A),B2:B)),ARRAYFORMULA(LOOKUP(2,1/(A2:A<>""),ROW(A2:A))),1)
使用:
=ARRAYFORMULA(IF((A2:A<>"")+(B2:B<>""),MMULT(TRANSPOSE((ROW(B2:B)<=
TRANSPOSE(ROW(B2:B)))*IF(A2:A="",-B2:B,A2:A)),SIGN(IF(A2:A="",A2:A))^0),))
或:
=ARRAYFORMULA(IF((A2:A<>"")+(B2:B<>""),MMULT(TRANSPOSE((ROW(B2:B)<=TRANSPOSE(ROW(B2:B)))*
IF(A2:A="",A2:A-B2:B,A2:A-B2:B)),B2:B,))
更新:
=ARRAYFORMULA(IF(A2:A="",MMULT(
TRANSPOSE((ROW(INDIRECT("2:"&MAX((A2:A<>"")*ROW(A2:A))))<=
TRANSPOSE( ROW(INDIRECT("2:"&MAX((A2:A<>"")*ROW(A2:A))))))*
(INDIRECT("C2:C"&MAX((A2:A<>"")*ROW(A2:A)))-
INDIRECT("D2:D"&MAX((A2:A<>"")*ROW(A2:A))))),SEQUENCE(MAX((A2:A<>"")*ROW(A2:A))-1)^0)))
,
谢谢各位。我尝试了@player0 方法并得到了一个关于数组变大的错误。出于某种原因,@TheMaster 版本卡在了进度条上。无论如何在谷歌帮助论坛上找到了这个
=ArrayFormula(if(len(A4:A),(SUMIF(ROW(D4:D),"<="&ROW(D4:D),D4:D)+SUMIF(ROW(C4:C),"<="&ROW(C4:C),C4:C)),))
而且似乎有效(我现在在 A4:A 中有约会)。但如果您发现任何潜在问题,请告诉我
,更新: 我看到我从@MattKing 改编的答案与@TheMaster 之前的答案非常相似,只是我们如何强制数组公式在单元格中循环的变化。
答案: 除了 player0 的解决方案,我还找到了 a related question(player0 也有答案!),并改编了 @MattKing 的公式答案。在 C1 中尝试以下操作。
{value}
由于它最初设计为对多列求和,我不确定我是否已为您的单列实现尽可能地减少它。