Google Sheets动态命名区域非空单元格累计计数数组公式实现
动态范围非空单元格累计计数数组公式实现方案
针对逐行粘贴=COUNTIF($B$3:B3,"<>")无法适配动态长度范围的问题,以下数组公式可实现单次输入、自动匹配范围长度完成非空单元格累计计数,兼容通过INDIRECT()调用第2行存储的文本型动态范围的规则。
注意:公式中
存储动态范围文本的单元格地址需替换为第2行实际保存范围文本的单元格引用,例如动态范围文本存在B2单元格,直接将该部分替换为B2即可。
支持动态数组的Excel版本(365/2021及以上)
直接在累计计数列的起始单元格(与动态范围首行对齐,如动态范围从B3开始则写在C3)输入以下公式,结果会自动向下溢出匹配动态范围长度,无需手动拖拽填充:
=SCAN(0,INDIRECT(存储动态范围文本的单元格地址),LAMBDA(acc,cur,acc+(cur<>"")))
公式逻辑说明
SCAN函数从初始累计值0开始,逐一遍历动态范围内的所有单元格- 每遍历一个单元格,判断当前值是否非空:非空则累计值+1,为空则保持上一个累计值
- 动态范围随D列输入内容变化长度时,溢出的计数结果会自动同步增减,不需要提前预设填充行数
- 如果需要排除公式返回的假空值(如
=""生成的空文本),可将判断条件cur<>""替换为LEN(cur)>0,计数精度更高
旧版Excel(无LAMBDA、无动态数组功能)兼容方案
如果使用不支持SCAN函数的旧版本,可通过MMULT构造矩阵运算实现累计计数,选中与动态范围长度匹配的输出区域后输入公式,按Ctrl+Shift+Enter确认数组运算即可:
=MMULT(--(ROW(INDIRECT(存储动态范围文本的单元格地址))>=TRANSPOSE(ROW(INDIRECT(存储动态范围文本的单元格地址)))),--(INDIRECT(存储动态范围文本的单元格地址)<>""))
公式逻辑说明
- 首先生成与动态范围行数一致的下三角矩阵,矩阵中当前行号大于等于列号的位置值为1,其余位置为0
- 再将动态范围的非空判断结果转换为1(非空)/0(空)的一维数组
- 两个数组做矩阵乘法后,直接输出逐行累计的非空计数结果
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

