You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一列值变化实现序号递增(含非连续重复值)的SCAN函数方案

用单一SCAN函数实现非连续重复字母的序号递增

需求

  • 连续出现的字母,对应序号递加1
  • 非连续重复出现的字母,序号延续该字母之前的累计计数(而非重置为1)
    B2:B11列包含字母数据,需用单一SCAN函数实现上述需求,结果匹配D2:D11列。

原公式局限

原公式仅能处理连续字母块的计数,非连续重复字母会被错误重置为1:

=SCAN(0,B2:B11,
LAMBDA(a,b,
IF(OFFSET(b,-1,0)=b,
a+1,1)
)
)

问题点:仅对比当前单元格与上一单元格内容,若当前字母与上一不同(哪怕该字母之前出现过),直接将序号重置为1,无法延续非连续重复字母的计数。

解决方案公式

方案1:支持HASHMAP的Excel版本

用HASHMAP作为SCAN累加器跟踪每个字母的累计计数:

=SCAN(HASHMAP(), B2:B11, LAMBDA(map, val, 
    LET(
        prev_val, INDEX(B:B, ROW(val)-1),
        current_count, IF(prev_val=val, XLOOKUP(val, KEYS(map), VALUES(map))+1, IFERROR(XLOOKUP(val, KEYS(map), VALUES(map))+1, 1)),
        HASHMAP(KEYS(map), VALUES(map), val, current_count),
        current_count
    )
))

方案2:兼容旧版Excel(无HASHMAP)

用数组模拟字母-计数的映射关系:

=SCAN({"",0}, B2:B11, LAMBDA(arr, val, 
    LET(
        prev_val, INDEX(B:B, ROW(val)-1),
        val_pos, XMATCH(val, INDEX(arr,0,1), 0, -1),
        prev_count, IFNA(INDEX(arr, val_pos, 2), 0),
        current_count, prev_count + 1,
        new_arr, IF(val_pos>0, VSTACK(DROP(arr,val_pos), HSTACK(val, current_count)), VSTACK(arr, HSTACK(val, current_count))),
        current_count
    )
))

核心逻辑

SCAN的累加器存储已出现字母及其累计计数的映射关系,每次迭代时:

  1. 判断当前字母与上一单元格字母是否相同
  2. 基于映射关系获取该字母的历史累计计数,加1得到当前序号
  3. 更新映射关系并返回当前序号,实现非连续重复字母的计数延续

内容的提问来源于stack exchange,提问作者Statto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:11:01