excel 中基于数组的求和公式
array based sumif in excel by formula
所以我试图在 excel 中找到一些替代 sumifs 的方法,其中每个条件都需要在 2D 范围而不是 1D 范围内检查。
例如,在下面的 table 中,我想要 A12 ("IJ") 出现在范围 A2:C8 (P)、B12 中的行的 V 列值的总和("NM") 出现在 D2:F8 (S) 范围内,C12 ("XX") 出现在 G2:I8 (A)
范围内
我正在尝试找到涉及 array-based 公式(没有 VBA)的解决方案。
例如在 below-given 公式中,
SUMPRODUCT((B2:B8'=A12)*J2:J8)
会给出一个 array-based 计算如下
SUMPRODUCT({TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE}*{22;79;45;67;43;72;52})
= SUMPRODUCT({22;0;45;0;0;72;0})
=139
当只有一个条件需要检查时很容易但是像sumifs一样,我打算检查多个条件,但是一旦我添加其他条件,数组就会变成多维并给出错误的答案。
示例:
SUMPRODUCT((A2:C8=A12)*(D2:F8=B12)*J2:J8)
分解为
=SUMPRODUCT(
{FALSE,TRUE,FALSE;FALSE,FALSE,FALSE;FALSE,TRUE,FALSE;FALSE,FALSE,FALSE;FALSE,FALSE,FALSE;FALSE,TRUE,FALSE;FALSE,FALSE,FALSE}*
{TRUE,FALSE,FALSE;FALSE,FALSE,FALSE;TRUE,FALSE,FALSE;FALSE,FALSE,FALSE;FALSE,FALSE,FALSE;TRUE,FALSE,FALSE;FALSE,FALSE,FALSE}
*J2:J8)
在后台发生的事情是(第 3 行的示例)
SUMPRODUCT( ({FALSE, TRUE ,FALSE} * {TRUE,FALSE,FALSE}) * 45 )
= SUMPRODUCT({FALSE,FALSE,FALSE} *45 )
=0
SUMPRODUCT(({FALSE,TRUE ,FALSE} + {TRUE,FALSE,FALSE}) * 45 )
= SUMPRODUCT({TRUE,TRUE,FALSE} *45 )
= 90
#expected answer =45
有人可以帮助我了解哪里出了问题或遗漏了什么吗?
如果有任何其他方式,欢迎提出建议。
请注意这是一个虚拟数据,实际数据非常大,每个header (P,S,A)分别有10列值,行数也很大。
试试这个...
=SUMPRODUCT( ((A2:A8=A12)+(B2:B8=A12)+(C2:C8=A12)) * ((D2:D8=B12)+(E2:E8=B12)+(F2:F8=B12)) * ((G2:G8=C12)+(H2:H8=C12)+(I2:I8=C12)) * J2:J8 )
要使 SUMPRODUCT 起作用,布尔数组的形状需要与您希望有条件求和的数组的形状相匹配。
J2:J8
是七行高乘一列宽。
上面的公式根据您的三个标准范围创建了一个由 1 和 0 组成的数组,并将其调整为七行高,一列宽。
此时,SUMPRODUCT 可以执行正常操作,因为条件数组与求和数组的维数相匹配 J2:J8
。
所以我试图在 excel 中找到一些替代 sumifs 的方法,其中每个条件都需要在 2D 范围而不是 1D 范围内检查。
例如,在下面的 table 中,我想要 A12 ("IJ") 出现在范围 A2:C8 (P)、B12 中的行的 V 列值的总和("NM") 出现在 D2:F8 (S) 范围内,C12 ("XX") 出现在 G2:I8 (A)
范围内我正在尝试找到涉及 array-based 公式(没有 VBA)的解决方案。
例如在 below-given 公式中,
SUMPRODUCT((B2:B8'=A12)*J2:J8)
会给出一个 array-based 计算如下
SUMPRODUCT({TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE}*{22;79;45;67;43;72;52})
= SUMPRODUCT({22;0;45;0;0;72;0})
=139
当只有一个条件需要检查时很容易但是像sumifs一样,我打算检查多个条件,但是一旦我添加其他条件,数组就会变成多维并给出错误的答案。
示例:
SUMPRODUCT((A2:C8=A12)*(D2:F8=B12)*J2:J8)
分解为
=SUMPRODUCT(
{FALSE,TRUE,FALSE;FALSE,FALSE,FALSE;FALSE,TRUE,FALSE;FALSE,FALSE,FALSE;FALSE,FALSE,FALSE;FALSE,TRUE,FALSE;FALSE,FALSE,FALSE}*
{TRUE,FALSE,FALSE;FALSE,FALSE,FALSE;TRUE,FALSE,FALSE;FALSE,FALSE,FALSE;FALSE,FALSE,FALSE;TRUE,FALSE,FALSE;FALSE,FALSE,FALSE}
*J2:J8)
在后台发生的事情是(第 3 行的示例)
SUMPRODUCT( ({FALSE, TRUE ,FALSE} * {TRUE,FALSE,FALSE}) * 45 )
= SUMPRODUCT({FALSE,FALSE,FALSE} *45 )
=0
SUMPRODUCT(({FALSE,TRUE ,FALSE} + {TRUE,FALSE,FALSE}) * 45 )
= SUMPRODUCT({TRUE,TRUE,FALSE} *45 )
= 90
#expected answer =45
有人可以帮助我了解哪里出了问题或遗漏了什么吗?
如果有任何其他方式,欢迎提出建议。
请注意这是一个虚拟数据,实际数据非常大,每个header (P,S,A)分别有10列值,行数也很大。
试试这个...
=SUMPRODUCT( ((A2:A8=A12)+(B2:B8=A12)+(C2:C8=A12)) * ((D2:D8=B12)+(E2:E8=B12)+(F2:F8=B12)) * ((G2:G8=C12)+(H2:H8=C12)+(I2:I8=C12)) * J2:J8 )
要使 SUMPRODUCT 起作用,布尔数组的形状需要与您希望有条件求和的数组的形状相匹配。
J2:J8
是七行高乘一列宽。
上面的公式根据您的三个标准范围创建了一个由 1 和 0 组成的数组,并将其调整为七行高,一列宽。
此时,SUMPRODUCT 可以执行正常操作,因为条件数组与求和数组的维数相匹配 J2:J8
。