在工作中我遇到需要每隔隔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/A4。起初我看到这个错误时猜测是因为单元格格式不对,把格式改成“数值”后,错误仍然存在。我尝试外套了一个SUM函数,变成=SUM(OFFSET($A$2,(ROW(A1:A4)-1)*5,0)),发现能得到正确答案。所以我猜测可能还是因为OFFSET得到的数组格式存在问题。我在网络上高强度冲浪一番后,发现了一个很意思的函数N5,这个函数可将单元格内容转为数值。按照正常的逻辑,我使用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确认即可得出正确答案

修订历史

2025-02-07: 优化公式显示,修正错别字

  1. 官方介绍:OFFSET 函数 ↩︎

  2. 由于时间有点久了,不记得是哪个网站了。等我找到后再写上链接 ↩︎

  3. 数组公式须使用Ctrl+Shift+Enter确认 ↩︎

  4. 在Excel 2016版本上运行未报错,但是在嵌套SUMPRODUCT后的计算值会变为0 ↩︎

  5. 官方介绍:N函数 ↩︎