横向/纵向数组求和。
横向求和
=ARRAYFORMULA(MMULT(IFERROR(B1:F17 + 0, 0), TRANSPOSE(COLUMN(B1:F17) ^ 0)))
原理分析
IFERROR(B1:F17 + 0, 0)
将数据范围中的所有单元格转换成数值,如果单元格内的数据类型是非数值型将会用 0 代替,避免因为非数值类型导致计算出错。
TRANSPOSE(COLUMN(B1:F17) ^ 0)
COLUMN 函数计算包含指定范围内列号的数组,返回一个包含从 B 列到 F 列序号的数组,即 [2, 3, 4, 5, 6]
。
然后将数组的每个元素提升为 0 次幂进行运算,所有的返回结果将会是 1,也就是 [1, 1, 1, 1, 1]
。
再使用 TRANSPOSE 转置数组,把行转换为列。
使用 MMULT 函数使用矩阵乘法计算每个元素的值,最后使用 ARRAYFORMULA 数组输出。下图中 A 列是输出的结果。
纵向求和
=TRANSPOSE(ARRAYFORMULA(MMULT(IFERROR(TRANSPOSE(B1:F17) + 0, 0), ROW(B1:F17) ^ 0)))
原理分析
和上面的横向求和思路类似,先将 B1:F17
范围的内容转置,并且把数据范围中的所有单元格转换成数值类型。
使用 ROW 函数计算包含指定范围内行号数组,返回从第 1 行到第 17 行的序号数组,即 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
。
然后将数组的每个元素提升为 0 次幂进行运算,所有的返回结果将会是 1,也就是 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
。
使用 MMULT 函数使用矩阵乘法计算每个元素的值,使用 ARRAYFORMULA 数组输出。但是输出的结果是以列显示的,需要再使用 TRANSPOSE 转置数组,把行转换为列。最终结果输出在 B18 单元格。
相关推荐:
Google Excel 性能优化 - 数组输出
Google Excel LAMBDA 和 MAP 组合函数