使用 ArrayFormula() 进行小计

Subtotals with ArrayFormula()

我创建了一个简单的 table 并尝试用小计拆分数据。

小计公式有如下视图:

=ArrayFormula(
    IF($A2:$A; MMULT(
        ($B2:$B < TRANSPOSE(ROW($A2:$A))) * (TRANSPOSE(ROW($A2:$A)) < ROW($A2:$A)); 
        IF(ISNUMBER(C2:C); C2:C; 0)
    ); )
)

问题是公式非常慢。有没有办法让它更快?

示例文件:

https://docs.google.com/spreadsheets/d/1HPGeLZfar2s6pIQMVdQ8mIPzNdw2ESqKAwZfo4IicnA/edit?usp=sharing

删除数据范围下方的空白行更容易。

可能需要维护的一个,将 $A2:$A 等开放式引用替换为封闭式引用,即 $A2:$A100

增加公式复杂性和波动性的方法,将每个打开的引用放在里面 ARRAY_CONSTRAIN,但在添加新数据行的情况下更容易维护

使用“必要”范围:

=ARRAYFORMULA(IFERROR(IF(A2:A; MMULT((
 INDIRECT("B2:B"&MAX(IF(B2:B="";;  ROW(B2:B)))) < TRANSPOSE(ROW(
 INDIRECT("A2:A"&MAX(IF(A2:A=TRUE; ROW(A2:A); )))))) * (TRANSPOSE(ROW(
 INDIRECT("A2:A"&MAX(IF(A2:A=TRUE; ROW(A2:A); ))))) < ROW(
 INDIRECT("A2:A"&MAX(IF(A2:A=TRUE; ROW(A2:A); ))))); IF(ISNUMBER(
 INDIRECT("C2:C"&MAX(IF(C2:C="";;  ROW(C2:C)+1)))); 
 INDIRECT("C2:C"&MAX(IF(C2:C="";;  ROW(C2:C)+1))); 0)); )))

这应该更快...

您也可以试试这个更简单的公式:

=ArrayFormula(
   if(B3:B="","",
         sumif(row(B3:B),"<="&row(B3:B),C3:C)-
         sumif(row(B3:B),"<="&B3:B,C3:C)
   )
)