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函数条件不成立时返回的结果。