基于另一列值变化实现序号递增(含非连续重复值)的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得到当前序号
- 更新映射关系并返回当前序号,实现非连续重复字母的计数延续
内容的提问来源于stack exchange,提问作者Statto
相关产品推荐
相关产品推荐

