使用 ArrayFormula() 进行小计
Subtotals with ArrayFormula()
我创建了一个简单的 table 并尝试用小计拆分数据。
- A表示小计行。
- B 包含上一个小计的行号。这只是用于简化公式的额外字段。
- C 包含一些金额。
- D 包含之前和当前小计行之间的金额小计。
小计公式有如下视图:
=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)
)
)
我创建了一个简单的 table 并尝试用小计拆分数据。
- A表示小计行。
- B 包含上一个小计的行号。这只是用于简化公式的额外字段。
- C 包含一些金额。
- D 包含之前和当前小计行之间的金额小计。
小计公式有如下视图:
=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)
)
)