EXCEL太刁钻:一列数据,一级分类与二级明细分别同时填充序号

粉丝求助SOS一列数据,一级分类与二级明细分别填充序号,要求是不同的一级分类用中文数字顺序填充,每组二级明细分别用阿拉伯数字顺序填充?


我们一同看一下具体的数据源

A列为已知的数据源,有一级的汉字类型的分类标题,与所属的二级的“字母+数字”类型的明细内容构成。


我们想要在B列生成一列序号,不同的一级汉字类型序号用中文数字表示,由“一”开始顺序递增。


相同一级分类下的二级字母+数字名称的序号由阿拉伯数字1开始顺序递增。不同分类下循环重复。




小编想说,这个问题还真挺刁钻,足足考验大家的智商


不过有规律的数据一定可以找到解决的方法,我将分四个层次详细讲解公式,每层解释一个部分,逐步深入。为了清晰,我将公式拆解为以下结构:


①整体IF函数结构:判断当前行是一级分类还是二级明细。

②条件部分:区分汉字和字母数字字符串的原理。

③真值部分(一级分类处理):生成中文数字序号。

④假值部分(二级明细处理):生成阿拉伯数字序号。



第一步:确定一级编码


使用REGEXP正则表达式函数:

=REGEXP($A$2:A2,"[一-龟]",1)


[一-龟]:表示任意的汉字。


重点在于对第一参数$A$2:A2的处理上,参数起始位置$A$2绝对固定,结束位置A2相对引用,所以随着公式的下拉填充,会形成起始位置不变,结束位置逐步扩展的动态范围。


第3参数设置为1表示判断模式


在这个动态扩展的$A$2:A2范围内,我们判断范围内单元格内容是否为汉字。




再上一步公式基础上乘以数字1:

=REGEXP($A$2:A2,"[一-龟]",1)*1


可以将判断出来的由逻辑值TRUE和FALSE组成的数组溢出结果,转换为可以被运算的数字1和0。




上面公式我们之所以没有立即下拉填充公式的原因,是因为会形成垂直方向的遮挡,产生 #SPILL! 这样的错误值。


我们可以运用转置函数TRANSPOSE函数:

=TRANSPOSE(REGEXP($A$2:A2,"[一-龟]",1)*1)


将纵向数组遮挡溢出结果,转置为横向显示,便于我们观察理解。


在这个动态扩展的$A$2:A2范围内,我们随着范围的不断扩大:($A$2:A2~$A$2:A10)

判断出了:每个范围内的汉字分布情况:数字1(TRUE)代表是汉字,数字0(FALSE)代表非汉字。


这一步不是必须的,却可以帮助我们可视化理解,我们可以将此步骤省略。




用SUM函数对每个扩展区域的结果相加:

=SUM(REGEXP($A$2:A2,"[一-龟]",1)*1)




然后利用NUMBERSTRING函数:

=NUMBERSTRING(SUM(REGEXP($A$2:A2,"[一-龟]",1)*1),1)


第2参数设置为模式“1”,可以将阿拉伯数字转换为中文数字。




那么,我们会总结出这样一个规律:

A列每个汉字分类右侧得到对应的中文数字便是由“一”开始,顺序递增的




第二步:确定IF函数判断条件


条件部分:区分A列是汉字和非汉字(字母+数字字符串)


所以我们运用REGEXP正则表达式函数做一个判断:

=REGEXP(A2,"[一-龟]",1)


[一-龟]:代表任意的汉字。


判断A列每个单元格是否为汉字,如果是汉字会返回TRUE,如果不是汉字会返回FALSE。




第三步:确定IF真值中文数字编码


完善IF函数第一、第二参数:

=IF(REGEXP(A2,"[一-龟]",1),NUMBERSTRING(SUM(REGEXP($A$2:A2,"[一-龟]",1)*1),1),)


如果判断条件为TRUE时,返回第一步的“一级编码”(中文编码部分),如果判断条件为FALSE时,暂时默认返回0。




第四步:确定IF假值阿拉伯数字编码


完善IF函数的第三参数:

=IF(REGEXP(A3,"[一-龟]",1),NUMBERSTRING(SUM(REGEXP($A$2:A3,"[一-龟]",1)*1),1),N(B2)+1)


如果判断条件为FALSE时,返回公式:N(B2)+1 的返回结果“二级编码”(阿拉伯数字编码部分)


N函数的作用原理

如果给定的值已经是数字,N函数将直接返回该数字。

如果给定的是文本,且该文本可以转换为数字,如"123",N函数也会尝试进行转换并返回对应的数字。

但如果给定的是无法转换为数字的文本或错误值,N函数将返回0。


所以N函数的的运用过程:

B2→N(B1)+1→0+1=1

B3→N(B2)+1→0+1=1

B4→N(B3)+1→1+1=2

B5→N(B4)+1→2+1=3

B6→N(B5)+1→3+1=4

B7→N(B6)+1→4+1=5

B8→N(B7)+1→0+1=1

B9→N(B8)+1→1+1=2

B10→N(B9)+1→2+1=3


即B3~B6与B8~B10部分为我们IF函数条件不成立时返回的结果。