如何使用Array Formula实现发票数据的规则化累计付款金额计算(替代Query公式)
解决ArrayFormula嵌套Query计算累计付款金额的问题
你的问题我太熟了——Query函数天生就不适合和ArrayFormula做逐行动态筛选,因为它的字符串参数没法自动遍历数组里的每个单元格值,所以你嵌套后只有第一行能拿到正确结果,完全是意料之中的事。
不用折腾VLookup,给你两个更简便的方案,和你原来的计算逻辑完全对齐:
方案一:用BYROW(新版Google Sheets推荐)
这个写法最直观,和你手动写单条公式的逻辑几乎一模一样,而且自动遍历每一行:
=BYROW(A2:E10, LAMBDA(row, LET( currentPayDate, INDEX(row, 4), // 取当前行的付款日期(D列) currentStartDate, INDEX(row, 2), // 取当前行的开始日期(B列) IF(ISBLANK(currentPayDate),, // 如果没付款日期,返回空 SUM( FILTER( E2:E10, // 所有发票金额 NOT(ISBLANK(D2:D10)), // 只统计有付款日期的发票 (D2:D10 < currentPayDate) + (D2:D10 = currentPayDate) * (B2:B10 <= currentStartDate) // 筛选条件:付款日期更早,或者同日期但开始日期≤当前行 ) ) ) ) ))
直接把这个公式放到你要生成累计金额的第一行(比如F2),它会自动填充所有行的结果。
方案二:用MMULT+ARRAYFORMULA(兼容旧版Google Sheets)
如果你的Sheet版本不支持BYROW,用矩阵乘法来实现逐行累计:
=ARRAYFORMULA( IF(ISBLANK(D2:D10),, // 无付款日期则返回空 MMULT( --( NOT(ISBLANK(D2:D10)) * // 排除无付款日期的发票 ((D2:D10 < TRANSPOSE(D2:D10)) + (D2:D10 = TRANSPOSE(D2:D10)) * (B2:B10 <= TRANSPOSE(B2:B10))) // 生成布尔矩阵:每一行i对应所有行j是否符合累计条件 ), E2:E10 // 金额列,和矩阵相乘得到每行的累计和 ) ) )
为什么你的原方案不行?
Query是一次性处理整个数据范围的函数,它的WHERE条件里的D2、B2是固定单元格引用,ArrayFormula没法把这些引用自动转成D2:D10、B2:B10的数组逐个代入到Query的字符串参数里,所以只有第一行的D2、B2生效,后面的行都用了同样的条件,结果自然不对。
内容的提问来源于stack exchange,提问作者Maths noob
相关产品推荐
相关产品推荐

