是否可以使用 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
这是它的工作原理:
COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)
这将 return 有多少列(包括空白)得到您的数据
OFFSET
将创建从第一列到第 n 列的范围(上一步的结果)
SUMPRODUCT
将对该行的每个第 n 个值求和(在我的示例中,每 5 列)
- 我们在公式末尾手动添加第一个输入,第 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)
)
)
我有一个模型可以生成一个值数组,该值数组可以有几百列宽。每第 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
这是它的工作原理:
COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)
这将 return 有多少列(包括空白)得到您的数据OFFSET
将创建从第一列到第 n 列的范围(上一步的结果)SUMPRODUCT
将对该行的每个第 n 个值求和(在我的示例中,每 5 列)- 我们在公式末尾手动添加第一个输入,第 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)
)
)