为多个不同的行(数组)创建单个公式(Google 张)

Create single formula for several different lines (array) (Google Sheets)

AD 列中,我有以下值序列:

2
3
4

这些值引用另一页上某列中的行。

AE 列的每一行中,我使用了这个公式:

=IF(AD1="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))

=IF(AD2="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD2)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD2),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))

=IF(AD3="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD3)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD3),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE))))

简而言之,此公式根据同一 sheet 的另一列中的相应单元格是否出现在另一个 sheet 中得到 运行 值的总和一组值。

当我尝试添加 ARRAYFORMULA 时,我不必在每一行上都有一个公式,只在 AE1 中留下所有行上 return 的值是完全相同的值。

测试公式失败:

=ARRAYFORMULA(IF(AD1:AD="","",IFERROR(SUM(FILTER(INDIRECT("'Registro Geral'!O2:O"&AD1:AD)/100,REGEXMATCH(INDIRECT("'Registro Geral'!H2:H"&AD1:AD),SUBSTITUTE(SUBSTITUTE(JOIN("|",$V:$V),"||",""),"|||",""))=TRUE)))))

Link 到 Spreadhseet 示例:
https://docs.google.com/spreadsheets/d/1qIv6KnLv-EwJQXRrk7ucuqY-XuJhkIHOCtih9FpAg6U/edit?usp=sharing

您正在尝试根据 H 列中的相应值是否出现在筛选值中来对 O 进行 运行 求和。

我们可以使用 lower-triangular 矩阵和列出的值进行矩阵乘法,使用 IF.

根据特定条件选择要清零的值
=ArrayFormula(MMULT(
    N(SEQUENCE(D2)>=SEQUENCE(1,D2)),
    ARRAY_CONSTRAIN(
        IF(
            ('Registro Geral'!O2:O<>"")*
                IFNA(MATCH('Registro Geral'!H2:H,V:V,0)),
            'Registro Geral'!O2:O
        )/100,
        D2,
        1
    )
))

为什么这有效

lower-triangular矩阵看起来像

1 0 0 0 0 ... up to N columns
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
1 1 1 1 1
... up to N rows

您要求和的列如下所示

Value 1
Value 2
...
Value N

所以当你将两者相乘时,你会得到一个新的 N x 1 矩阵:

Value 1
Value 1 + Value 2
...
Value 1 + ... + Value N

如果我们不想对一个值求和,那么我们可以使用条件将其清零,这样它就不会被添加。