Google Sheets/Excel:逐行动态范围多行列值计数(排除首尾单元格)
统计每行非空单元格首尾间指定值的出现次数
先把你的数据整理成清晰的表格:
| 行号 | A | B | C | D | E |
|---|---|---|---|---|---|
| 1 | Red | Blue | Dark Green | Blue | |
| 2 | Light Blue | Red | Blue | Red | |
| 3 | Blue | Black | Dark Green | ||
| 4 | Light Blue | Light Blue | |||
| 5 | Dark Green | ||||
| 6 | Blue | Red | Green | Black | Blue |
| 7 | Dark Green | Blue |
针对你需要统计指定值(比如Blue)在每行非空首尾单元格之间的出现次数需求,这里提供两种Excel公式方案,适配不同版本:
方案1:适用于Excel 365/2021(支持LAMBDA函数)
假设你把目标值(比如Blue)放在单元格F1,在任意空白单元格输入以下公式(直接回车即可):
=SUM( BYROW(A1:E7, LAMBDA(row, LET( nonEmptyVals, FILTER(row, row<>""), totalMatches, COUNTIF(nonEmptyVals, F1), isFirstMatch, IF(INDEX(nonEmptyVals, 1) = F1, 1, 0), isLastMatch, IF(INDEX(nonEmptyVals, COUNTA(nonEmptyVals)) = F1, 1, 0), MAX(0, totalMatches - isFirstMatch - isLastMatch) ) )) )
公式逻辑拆解:
BYROW遍历每行:对A1:E7的每一行单独处理- 提取非空值:
FILTER(row, row<>"")拿到当前行所有非空单元格的内容 - 统计总匹配数:
COUNTIF统计当前行目标值的出现次数 - 判断首尾匹配:分别检查第一个和最后一个非空单元格是否等于目标值,是则记1,否则0
- 计算中间匹配数:总次数减去首尾的匹配数,用
MAX(0,...)避免出现负数(比如某行只有一个目标值时,结果为0) - 求和所有行:把每行的中间匹配数相加得到最终结果
用你的示例验证:最终结果为2,完全符合预期(行1的第2个Blue、行2的第3个Blue)。
方案2:适用于旧版Excel(不支持LAMBDA)
如果你的Excel版本不支持LAMBDA函数,可以使用以下数组公式(输入后需要按Ctrl+Shift+Enter确认):
=SUM( IF( COUNTA(A1:E7)>1, COUNTIF(A1:E7,F1) - --(INDEX(A1:E7,ROW(A1:E7),MATCH("*",A1:E7,0))=F1) - --(INDEX(A1:E7,ROW(A1:E7),MAX(IF(A1:E7<>"",COLUMN(A1:E7),0)))=F1), 0 ) )
公式逻辑拆解:
COUNTIF(A1:E7,F1):统计每行目标值的总次数INDEX(...,MATCH("*",...,0)):定位每行第一个非空单元格,判断是否等于目标值INDEX(...,MAX(IF(...)):定位每行最后一个非空单元格,判断是否等于目标值--():将布尔判断结果转为1或0IF(COUNTA(...>1),...):如果行只有1个非空单元格,直接返回0(没有中间位置)
这个公式同样会返回示例中的结果2。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

