结合Split的Reduce函数动态溢出公式实现问题
解决方案
实现动态溢出的公式
直接使用BYROW结合SUMPRODUCT(或REDUCE)即可实现逐行处理并动态向下溢出:
方案1(SUMPRODUCT版,更简洁)
=BYROW(D2:D, LAMBDA(d, IF(d="", 0, SUMPRODUCT(XLOOKUP(SPLIT(d, ", ", FALSE), B:B, C:C, 0, 0, -1)))))
方案2(REDUCE版,贴合你原有的思路)
=BYROW(D2:D, LAMBDA(d, IF(d="", 0, REDUCE(0, SPLIT(d, ", ", FALSE), LAMBDA(total, val, total + XLOOKUP(val, B:B, C:C, 0, 0, -1))))))
为什么之前的公式失效?
- 直接用
REDUCE处理D2:D时,SPLIT(D2:D, ", ", FALSE)会生成一个二维数组,REDUCE无法自动逐行遍历处理,而是会把整个二维数组当作一个输入集合,导致逻辑混乱返回错误。 Filter+SUM的组合失效,是因为SUM会对整个二维数组求和,而非逐行求和,无法匹配每行的计算需求。
公式逻辑说明
BYROW(D2:D, LAMBDA(d, ...)):遍历D2:D的每一行,将当前行的D列值传入d变量。IF(d="", 0, ...):如果当前行D列是空值,直接返回0,避免无效计算。SPLIT(d, ", ", FALSE):将当前行D列的内容按,拆分,得到需要查找的关键字数组。XLOOKUP(..., B:B, C:C, 0, 0, -1):对每个关键字,查找B列中**最新(最后出现)**的匹配项,返回对应的C列值;无匹配时返回0。SUMPRODUCT/REDUCE:将当前行所有查找结果求和,得到该行的最终计算值。
内容的提问来源于stack exchange,提问作者pgSystemTester
相关产品推荐
相关产品推荐

