如何在ARRAYFORMULA计算中生成随行变化的动态范围?
解决ARRAYFORMULA中动态范围累积求和的问题
你需要实现的是累积求和(逐行计算从K2到当前行的总和),之前用ARRAY_CONSTRAIN和INDIRECT失败的核心原因是:这两个函数不支持在ARRAYFORMULA内逐行处理ROW()返回的数组值,只会取数组的第一个元素计算,无法生成动态变化的范围。
下面提供两种可行的解决方案:
方法1:用MMULT实现兼容旧版本的累积求和
适用于所有版本的Google Sheets,公式如下:
=ARRAYFORMULA(IF(K2:K="",,MMULT(N(ROW(K2:K)>=TRANSPOSE(ROW(K2:K))),K2:K)))
原理说明:
ROW(K2:K)>=TRANSPOSE(ROW(K2:K))生成一个布尔矩阵,矩阵中第i行第j列的元素为TRUE当且仅当i≥j(即当前行号大于等于目标行号)N()函数将布尔值转换为1(TRUE)和0(FALSE),得到一个下三角全1的矩阵MMULT()通过矩阵乘法,将这个矩阵与K列数值相乘,最终得到每一行的累积求和结果
方法2:用SCAN实现简洁的累积求和
Google Sheets新版本支持SCAN函数,写法更直观:
=ARRAYFORMULA(SCAN(0,K2:K,LAMBDA(a,v,a+v)))
原理说明:
SCAN是专门的扫描累加函数,第一个参数0是初始累加值LAMBDA(a,v,a+v)定义累加规则:a是之前的累加结果,v是当前行的K列值,每次将两者相加并返回结果- 如果需要忽略空行(空行保留之前的累加值),可以调整为:
=ARRAYFORMULA(SCAN(0,K2:K,LAMBDA(a,v,IF(v="",a,a+v))))
验证示例
当K2:K9的数值为2 6 4 8 5 4 2 3时,上述两个公式都会返回你期望的结果:
2 8 12 20 25 29 31 34
内容的提问来源于stack exchange,提问作者Jgon
相关产品推荐
相关产品推荐

