在工作中我遇到需要每隔隔n行的数值相乘求和的场景。具体如下图所示,总共有四组数据用粗黑框框起来了,每组有4个数值。数据的增删都是以一组为单位的,我现在需要计算$A2*A4+A7*A9+A12*A14+A17*A19+\ldots$的值
看到连续相乘后求和,我首先就想到了SUMPODUCT
这个函数。大概就是写成$SUMPRODUCT(\{A2,A7,A12,A17,\ldots\},\{A4,A9,A14,A19,\ldots\})$这种形式。我们观察括号内的两组数组会发现单元格行间隔都是5,因此我们可以考虑使用OFFSET
分别来构建这两个数组后进行嵌套。
在微软对OFFSET
函数的解释1也是比较浅显,举了常见的例子却无法解决我们的需求。关于如何构建固定隔行的数组,我在网上搜索学习了一番,终于在某个网站2上找到了讲清楚的方法。以我图中的几行举例,构建图中背景黄的数组,可以尝试使用=OFFSET($A$2,(ROW(A1:A4)-1)*5,0)
。我以官方的函数参数解释OFFSET(reference, rows, cols, [height], [width])
进行对照说明
reference
:意为引用,必需。我使用了$A$2
,意思就是以A2单元格为基础计算偏移。
rows
:意为行数,必需。以第一个参数reference
(A2)为基准偏移的行数。正数为向下偏移,负数为向上偏移。我用了(ROW(A1:A4)-1)*5
,这里借用A1到A4的行数也就是1到4,形成了数组${0,5,10,15}$。效果就是从A2单元格分别向下隔0、5、10、15行取值。
cols
:意为列数,必需。以第一个参数reference
(A2)为基准偏移的列数。正数为向右偏移,负数为向左偏移。我取0,也就是不作偏移。
height
:意为高度,可选。返回的是需要引用的行数,必须为正数。在第一个参数为一个区域时,可使用此参数指定返回几行。我这里没有填写,也就是默认为1。
width
:意为宽度,可选。与前一个参数类似,返回的时需要引用的列数,必须为正数。在第一个参数为一个区域时,可使用此参数指定返回几列。我这里同样没有写,也就是默认为1。
但是实际上,我们在其他任意单元格内输入公式=OFFSET($A$2,(ROW(A1:A4)-1)*5,0)
时3,会报错#N/A
4。起初我看到这个错误时猜测是因为单元格格式不对,把格式改成“数值”后,错误仍然存在。我尝试外套了一个SUM
函数,变成=SUM(OFFSET($A$2,(ROW(A1:A4)-1)*5,0))
,发现能得到正确答案。所以我猜测可能还是因为OFFSET
得到的数组格式存在问题。我在网络上高强度冲浪一番后,发现了一个很意思的函数N
5,这个函数可将单元格内容转为数值。按照正常的逻辑,我使用OFFSET
得出的结果应该是一个数组,因此完全可以将函数结果转为数值。
我在OFFSET
外嵌套了N
函数后,也就是=N(OFFSET($A$2,(ROW(A1:A4)-1)*5,0))
,能得出正确的数组。
结合前面的SUMPRODUCT
函数,最终将公式可以写成=SUMPRODUCT(N(OFFSET($A$2,(ROW(A1:A4)-1)*5,0)),N(OFFSET($A$4,(ROW(A1:A4)-1)*5,0)))
,完成后Ctrl+Shift+Enter确认即可得出正确答案