函数技巧10:excel将汉字中间的数字批量+1
这里都是前面两个汉字+两位数字+级的格式,如果都是这样的话那直接用字符处理函数就比较简单。
但如果前面的汉字不一定是几个,而数字也不知道是1位数、两位数还是3位数,只用字符处理函数就不好弄了。
思路就是在初始列中把数字单独拎出来,然后再加1,最后把数字和文字拼起来就成了结果列。
最关键的部分就在于如何把数字取出来,因为没啥规律,数字可能出现在单元格中的任何位置,它本身也可能有好几种情况比如示例的17、10、5、180等等。
那么其实可以把g列也就是初始列,每个单元格的内容全部拆开,然后把数字再拼起来就ok了。
就用专管17级为例,看看这个17是如何被提取出来的,单元格是g2
第一步:生成一个从1到文本长度的序列
这是最关键的准备工作。
这里会用到len()函数和sequence()函数
Len函数把单元格的长度求出来,而sequence()函数返回一个数字序列
把他俩组合起来就可以把生成一个和g2单元格长度一样的数字序列了。
专、管、1、7、级,所以是生成1-5的数组。
第二步:判断每个字符是否为数字
这是逻辑判断的核心。
这一步会用到mid函数、isnumber函数和--
Isnumber函数可以判断一个值是否为数值,是的话返回true,不是的话返回false
前面已经生成数组了,这里用mid函数然后把数组套进去,就可以把g2单元格中的每个数字和汉字取出来。
两个负号--是Excel中一种将文本型数字强制转换为真正数值的常用技巧,上面是用mid函数来拆分的,所以生成的数组都是由文本组成,mid函数本身就是文本处理函数。
所以在mid函数前加两个负号--,就把1和7这两个文本型数字转换成了数值。最后再用isnumber来判断这个数组中的每个元素是否为数值,如果是就赋值true,如果不是就赋值false
第三步:根据判断结果,组建新数组,并且拼接起来
这是最后的部分了
最后一步比较简单,就是要用到if函数和concat函数。
前面已经有了分解公式a:MID(G4,SEQUENCE(LEN(G4)),1)
也有了判断是不是数字的公式b:ISNUMBER(--MID(G4,SEQUENCE(LEN(G4)),1))
那么只要使用if判断,如果b是数字,a就把那个数字显示出来,因为有着同样的数组SEQUENCE(LEN(G4))。如果不是数字,就用空格来替代。
最后再用concat函数拼起来就行了
向下填充,取数就完成了。
把取出来的数值+1,是我们要的每年加一。虽然它们是文本形式,但是用公式加1后会自动变成数值。
最终结果是把汉字再弄回来,这里的话后面接个“级”字就行。前面的职务,还是用mid和find函数。
先用find函数来定位我们取数的位置比如17,在g2单元格里是3,因为17的1在前面,所以相当于用了1进行定位。
然后再用mid函数:= MID(G2,1,FIND(J2,G2)-1)
意思就是说从g2单元格的第一个字符串开始截取,截取的长度是我们用find定位到的长度,但是要减1。
最后把汉字、数字、级拼起来就是了
总结一下,想要实现这个需求分为三步就是取数、+1、再拼接。
关键在于取数,也是分为三步:生成数组序列、判断每个元素是否为数字、把数字连起来。
取数公式:
=CONCAT(IF(ISNUMBER(--MID(G2,SEQUENCE(LEN(G2)),1)),MID(G2,SEQUENCE(LEN(G2)),1),""))
最终结果可以用一个函数实现,不过我这里为了看的方便搞了两个辅助列。