
Excel字符串处理经典案例

开始之前,我们先来看一下数组,如何用函数来生成。一般来说我们生成数据最常用的是两个:ROW和COLUMN
可以生成从1到指定整数的一维数组。例如:
=ROW(1:3) 生成 {1;2;3}
=COLUMN(1:3) 生成 {1,2,3}
有了以上基础知识,我们再开始今天的案例:
一.lookup函数提取文字中的数字
公式:=-LOOKUP(9999,-LEFT(A2,ROW($1:$8)))
效果:

解析:
①ROW($1:$8),这是生成了一个一维数组,它的值是{1;2;3;4;5;6;7;8}
②LEFT(A2,ROW($1:$8)),这是分截取了目标值,值如下图所示:

③-LEFT(A2,ROW($1:$8),前边加一个负号,是什么意思呢?如果是数字加一个负数 就成了负数,那些非数字就成了#VALUE!,如下图所示:

④LOOKUP(9999,-LEFT(A2,ROW($1:$8))),因为LOOKUP找不到lookup_value的值,它会使用数组中小于或等于lookup_value的最大值。这时候就会返回-1
⑤在整个公共前面再加一个负号,负负得正,就得到我们想要的值了。
二.取得字符串的第一个和最后一个数字的位置
公式:=MIN(FIND(ROW(1:10)-1,A2&5^19)),=LOOKUP(1,0/MID(A2,ROW(1:99),1),ROW(1:99))
上面的公式,记着Ctrl+Shift+Enter组合键,使公式生效。
效果:

解析:先来解释一下5^19是个什么鬼。其实就是字面的意思,是5的19次方,这个数据值是19073486328125,它包含了0到9的所有数字,其实上面用“0123456789”也是可以的,但这样公式会比较长,用5^19这样显的比较高大上。
第一个数字的位置对应的公式解析
①ROW(1:10)-1,这生成了一个数据,是0到9,ROW(1:10)身生成的是1到10,减去1之后就是0到9了。
②A2&5^19,这个公式中就包含了0到9所有的数字,这样写的原因,就是避免find查找时查找不到报错。
③FIND(ROW(1:10)-1,A2&5^19)返回的数组值是{12;16;15;5;21;29;23;4;6;13},返回值就是0到9在目标字符串中的位置。
④数组中最小值也就是字符串中第一个数字出现的位置
最后数字位置对应的公式解析:
①ROW(1:99)是生成了1到99的一维数组,不做过多解释
②MID(A2,ROW(1:99),1)这一步相当于把字符串切分成一个一人字符放在数组里,如下图所示:

③0/MID(A2,ROW(1:99),1)用0除对应的数组,数组就变成了如下图所示:

④LOOKUP(1,0/MID(A2,ROW(1:99),1),ROW(1:99)),官方文档中记录,LOOKUP 始终选择行或列中的最后一个值。那就取得了整个字符串中最后一个数字的位置。
三.取出字符串中所有数字进行求和
公式:=SUM(IFERROR(1*MID(A2,ROW(1:15),1),0)),需要Ctrl+Shift+Enter组合键,使公式生效。
效果:

解析:
①MID(A1,ROW(1:15),1),这一步就是把字符串切成一个一个的字符
②1*第一步的结果,就是把数字提取出来,非数字显示错误,如下图所示

③IFERROR,用这个函数,把错误都设置成0,如下图所示

④用sum求和就搞定了。
四.取得字符串中数字的另一种方式
公式:=1*MID(A2,MATCH(FALSE,ISERROR(1MID(A2,ROW(1:10),1)),0),255),需要Ctrl+Shift+Enter组合键,使公式生效。
效果:

解析:这个不做过多解释了,大家自己理解一下,过段时间,我会在评论中解析一下。
五,取得字符串中的数字,有多种方式。在上述第一种方式,它有一个缺陷。我们来看下面的例子:
说明,只是为了说明第一种方式的缺陷,来引出其它的解决方案,下例中如果只是单纯取身份证号,可以使用left函数更简单。
公式:=-LOOKUP(9999,-LEFT(A2,ROW($2:$21))),=MID(A2,MIN(FIND(ROW(1:10)-1,A2&5^19)),18)
上述公式,需要Ctrl+Shift+Enter组合键,使公式生效。
效果:

解析:lookup的方式,身份证号没有显示全,是因为第一种方式需要把字符串的数字转换成真正的数字,在excel中超过15位的话,就变成了科学计数法,后几位的精度就丢失了。第二种试,并没有进行转化,就可以正常的显示了。