是否可以使用 Lambda 函数遍历一行数据并对每个第 n 个单元格求和?

Is it possible to step through a row of data and sum every n-th cell using a Lambda function?

我有一个模型可以生成一个值数组,该值数组可以有几百列宽。每第 25 列包含一个我需要添加到总数中的数字。

我认为最干净的解决方案是创建一个 LAMBDA 函数,该函数将从用户的输入中获取起始单元格,然后在第 25 行单元格中偏移,将那里的值添加到 运行总计,并继续偏移步进,直到它到达一个空单元格。

可能吗?怎么做?

我不认为在 Excel 中使用正常功能可以按照您的意愿进行循环(您可以使用 VBA 来做到这一点)。但是您可能会受益于 DESREF 和 SUMPRODUCT 来计算每 n-th 列的值。

例如,我制作了一个假数据集:

从第 1 列到第 30 列(A 到 AD)获得了值。我想每 5 列(1、5、10、15 等)汇总值。带边框的单元格是手动计算的结果以理解逻辑,但您可以在一个公式中完成:

=SUMPRODUCT(--(COLUMN(OFFSET(A4;0;0;1;COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)))/5=INT(COLUMN(OFFSET(A4;0;0;1;COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)))/5))*A4:AD4)+A4

这是它的工作原理:

  1. COUNTA(A4:AD4)+COUNTBLANK(A4:AD4) 这将 return 有多少列(包括空白)得到您的数据
  2. OFFSET 将创建从第一列到第 n 列的范围(上一步的结果)
  3. SUMPRODUCT 将对该行的每个第 n 个值求和(在我的示例中,每 5 列)
  4. 我们在公式末尾手动添加第一个输入,第 1 列

如果您想要每 25 列,只需将 /5 替换为 /25

你应该可以用递归 LAMBDA 来做到这一点。

StridingSum = LAMBDA(cell, step, [start],
    LET(
        colOffset, IF(ISOMITTED(start), -1, start) + step,
        value, OFFSET(cell, 0, colOffset),
        IF(
            value = "", 
            0,
            value + StridingSum(cell, step, colOffset)
        )
    )
);

您称之为 =StridingSum(A2, 25)(假设您的数据从 A1 开始)

在允许您select第一个数据单元格而不是第二个数据单元格方面,这可能比 Paul 的稍微好一些。

StridingSum = LAMBDA(cell, step, [start],
LET(
    colOffset, IF(ISOMITTED(start), 0, start + step),
    value, OFFSET(cell, 0, colOffset),
    IF(
        value = "", 
        0,
        value + StridingSum(cell, step, colOffset)
    )
)