如何让Excel中带LET函数的公式支持Spill溢出功能?
LET函数实现溢出滚动计算的问题
我当前使用以下公式计算C列连续5天数据的和与B列对应单元格的比值:
=LET( rad, ROW(C2), sumArea, SUM(INDIRECT(ADDRESS(rad,3)):INDIRECT(ADDRESS(rad+5,3))), result, sumArea/INDIRECT(ADDRESS(rad+6,2)), result )
当参数为ROW(C2)时公式可正常运行,但C列是通过Spill溢出得到的数组,我希望公式也支持溢出功能。将参数改为ROW(C2#)后,公式虽会溢出,但每个结果都返回值错误。
请问LET函数无法以此方式实现溢出吗?或是可修改哪些内容使其生效?
示例数据说明
示例中第一个计算结果-28.6%,是通过SUM(-2,2,2,-5,-1)/14得到的,对应C列前5行数据的和除以B列第7行的数值14。
问题原因
原公式中使用的INDIRECT和ADDRESS属于单值函数,不支持数组/溢出输入。当rad是ROW(C2#)生成的数组时,这两个函数无法正确生成对应的区域引用数组,因此返回错误。
修改方案
使用支持数组运算的函数替代INDIRECT和ADDRESS,实现滚动求和并溢出输出结果:
方案1:利用INDEX+BYROW实现滚动求和
=LET( c_data, C2#, row_total, ROWS(c_data), // 生成有效计算的行序号(需保证C列至少有5行数据) valid_rows, SEQUENCE(row_total - 5), // 逐行计算连续5行的和 rolling_sums, BYROW(valid_rows, LAMBDA(r, SUM(INDEX(c_data, r):INDEX(c_data, r+4)))), // 除以B列对应位置的数值并输出 rolling_sums / INDEX(B2#, valid_rows + 5) )
方案2:用MMULT实现高效数组滚动求和
=LET( c_data, C2#, row_count, ROWS(c_data), window_size, 5, // 生成掩码矩阵,标记每组连续5行的位置 mask, N(SEQUENCE(row_count - window_size + 1, row_count, 0) <= SEQUENCE(row_count)-1) * N(SEQUENCE(row_count)-1 < SEQUENCE(row_count - window_size + 1, row_count, window_size)), // 通过矩阵乘法批量计算滚动和 rolling_sums, MMULT(mask, c_data), // 匹配B列对应数值并计算比值 rolling_sums / INDEX(B2#, SEQUENCE(row_count - window_size + 1, 1, window_size + 1)) )
这两个方案都能支持溢出功能,自动根据C列的溢出范围生成对应计算结果。
内容的提问来源于stack exchange,提问作者thestarwarsnerd
相关产品推荐
相关产品推荐

