SUMPRODUCT() 处理 excel 中的数组
SUMPRODUCT() handling arrays in excel
我有三个数组 A、B 和 A - B = C。它们被分成列并按 excel 格式化,例如:
A, B, C, A, B, C, A, B, C... D, E
我想对所有 C>0 = D 求和,对所有 C<0 = E 求和。问题是为了便于人类阅读,C 被分解了,所以我只想每隔三列调用一次。
我的解决方案:
根据给定方法的变体 and here,以及一个简单的数据测试数组:
1 0 1 1
1 1 0 1
-1 -1 -1 1
0 -1 -1 0
-1 -1 1 0
1 1 0 1
我将取出偶数列并进行条件求和:
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)=0)*(A1:D1>0),A1:D1)
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)=0)*(A1:D1<0),A1:D1)
产生正确的结果:
1 0
2 0
1 -1
0 -1
0 -1
2 0
但我完全不明白为什么 这行得通。一方面,我没有输入双重否定 (--),所以在得到 "TRUE" 或 "FALSE" 值时,公式应该向我吐出一个错误。另一方面,即使我不是 运行 它作为 excel 中的 CSE 数组函数,它也能正常工作。我得到最少的部分是 SUMPRODUCT()
.
的论据
MOD()
只是作为我得到的条件过滤器,但我不明白它是如何处理 A1:D1 当它从 COLUMN 得到的只是一个数字时。 COLUMN(A1:D1)
只是 returns excel 中的单个标量值,范围中的第一列,在本例中为 1。如何将其转换为所需的数组 [1, 3],尤其是因为我没有使用 CSE?
SUMPRODUCT 自然是一个数组类型的公式,这就是您不需要 CSE 的原因:
=SUMPRODUCT(A1:A6,B1:B6)
这将迭代并执行 A1*B1+A2*B2+...
所以使用这个功能我们可以做:
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)))
这将遍历列和 return:2
MOD(1,2)+MOD(2,2)+...
您不需要双一元 (--
) 的原因是因为表达式中有 *
。对布尔值 (TRUE/FALSE
) 进行的任何数学运算都会将其转换为位 (1/0
)。
--
是 -1 * -1 *
的简写
如果您这样做,您将需要 --
:
=SUMPRODUCT(--(MOD(COLUMN(A1:D1),2)=0),--(A1:D1>0),A1:D1)
因此,您最终会将一系列 1 和 0 与 A1:D1 中的系列相乘。
当任何一个为假时,它将 return 0 和 0 次任何东西都是 0。
因此只有当两者都为 TRUE 或 1 时,相应单元格中的值才会添加到迭代和中。
我有三个数组 A、B 和 A - B = C。它们被分成列并按 excel 格式化,例如:
A, B, C, A, B, C, A, B, C... D, E
我想对所有 C>0 = D 求和,对所有 C<0 = E 求和。问题是为了便于人类阅读,C 被分解了,所以我只想每隔三列调用一次。
我的解决方案:
根据给定方法的变体
1 0 1 1
1 1 0 1
-1 -1 -1 1
0 -1 -1 0
-1 -1 1 0
1 1 0 1
我将取出偶数列并进行条件求和:
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)=0)*(A1:D1>0),A1:D1)
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)=0)*(A1:D1<0),A1:D1)
产生正确的结果:
1 0
2 0
1 -1
0 -1
0 -1
2 0
但我完全不明白为什么 这行得通。一方面,我没有输入双重否定 (--),所以在得到 "TRUE" 或 "FALSE" 值时,公式应该向我吐出一个错误。另一方面,即使我不是 运行 它作为 excel 中的 CSE 数组函数,它也能正常工作。我得到最少的部分是 SUMPRODUCT()
.
MOD()
只是作为我得到的条件过滤器,但我不明白它是如何处理 A1:D1 当它从 COLUMN 得到的只是一个数字时。 COLUMN(A1:D1)
只是 returns excel 中的单个标量值,范围中的第一列,在本例中为 1。如何将其转换为所需的数组 [1, 3],尤其是因为我没有使用 CSE?
SUMPRODUCT 自然是一个数组类型的公式,这就是您不需要 CSE 的原因:
=SUMPRODUCT(A1:A6,B1:B6)
这将迭代并执行 A1*B1+A2*B2+...
所以使用这个功能我们可以做:
=SUMPRODUCT((MOD(COLUMN(A1:D1),2)))
这将遍历列和 return:2
MOD(1,2)+MOD(2,2)+...
您不需要双一元 (--
) 的原因是因为表达式中有 *
。对布尔值 (TRUE/FALSE
) 进行的任何数学运算都会将其转换为位 (1/0
)。
--
是 -1 * -1 *
如果您这样做,您将需要 --
:
=SUMPRODUCT(--(MOD(COLUMN(A1:D1),2)=0),--(A1:D1>0),A1:D1)
因此,您最终会将一系列 1 和 0 与 A1:D1 中的系列相乘。
当任何一个为假时,它将 return 0 和 0 次任何东西都是 0。
因此只有当两者都为 TRUE 或 1 时,相应单元格中的值才会添加到迭代和中。