我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务。支持我,也为自己加油!
以前写过一个案例,在字符串中提取数字,如下:
![66d6fc40ead8caab826e7a6af41f98ea.png](https://img-blog.csdnimg.cn/img_convert/66d6fc40ead8caab826e7a6af41f98ea.png)
需要把每个单元格中的数字提取出来,每个单元格中数字后面的单位不全一致,有的数字后面还没有任何汉字,有小数也有整数,总之,并没有很明显的规律。
从字符串中提取特定字符,无外乎用LEFT、MID、RIGHT这些函数,针对此案例,毫无疑问,用MID最为合适。
所以重点是怎么确定字符串中第一个数字所在的位数,最后一位数字所在的位数,一共有几位数字,这三个问题能解决的话,用MID函数就能把其中的数字提取出来。
第三个问题很容易,最后一个数字所在的位置减去第一个数字所在的位置即一共有几位数字,所以难点在于前两个问题。
接下来我们分别讨论下两个难点:
一、怎么确定首位数字所在的位置
思路1:
直接在这个字符串中查找第一个数字所在的位置,可用的函数有FIND、FINDB、SEARCH、SEARCHB,有什么区别呢?
1、FIND、SEARCH是按字符查找,FINDB、SEARCHB是按字节查找,一个汉字占两个字符,一个字母、数字、半角标点符号占用1个字节。
2、FIND查找是区分大小写的,而SEARCH查找不区分大小写。
3、FIND不支持通配符查找,SEARCH查找支持通配符(?和*)
用SEARCHB查找
?
在
西红柿6元
中的位置,它是按照字节一个个找的,?代表的是任意一个单字节字符,所以便会找到6的位置。
综上,第一个公式为:
=INT(SEARCHB("?",B7)/2)+1
思路2:
找0到9中任意一位数字在
西红柿6元
中的位置也能找到6的位置,
=FIND(ROW($1:$10)-1,B7)
结果为:
{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;4;#VALUE!;#VALUE!;#VALUE!}
如果能从中取到最小值,那也能得到第一位数字所在的位置,只是有错误值影响,所以无法取到最小值。
想个办法解决错误值,如果让字符串中保证存在0到9这10个数字,那FIND的结果肯定就不会出现错误值了,所以我们在
西红柿6元0123456789
中查找,公式如下:
=FIND(ROW($1:$10)-1,B7&"0123456789")
结果如下:
{6;7;8;9;10;11;4;13;14;15}
所以只要在其中取最小值即是第一位数字所在的位置,综上,公式如下:
=MIN(FIND(ROW($1:$10)-1,B7&"0123456789"))
B7&"0123456789",这个能不能简化下呢?
1/17正好包含了0到9这10个数字,为什么是1/17,很简单,你用1除以1,2,3…一直到20,检验下就知道了。
所以公式可以简化为:
=MIN(FIND(ROW($1:$10)-1,B7&1/17))
思路3:
把字符串中每个字符打散以后,用ISNUMBER判断其是否为数字,然后通过查找TRUE的位置就可以知道第一个数字所在的位置。
公式如下:
=MATCH(TRUE,ISNUMBER(--MID(B7,ROW($1:$20),1)),0)
非零数字的0次幂等于1,利用这个特点可以对上述公式进行简化。
打散后的字符转换为数字然后取其0次幂,此时只要找到1在数组中的位置即可找到第一位数字的位置,公式如下:
=MATCH(1,(--MID(B7,ROW($1:$20),1))^0,0)
大家看看,就这个问题,思路不同,公式写法不同,千万不要写出一种公式来就得意,每种思路都理解下,这样才能领悟到精华,用的时候才会灵光闪现
。
二、怎么确定末位数字所在的位置
思路1:
查找最后一位数字,很容易想到LOOKUP函数,先把字符串打散并转化为数字,用LOOKUP查找最后一位数字并返回对应的位置即可。
公式:
=LOOKUP(9E+307,--MID(B7,ROW($1:$20),1),ROW($1:$20))
9E+307代表一个很大的数字,其实在实际工作很少有这么大数字,9^9已经很大了,所以公式可以简化为:
=LOOKUP(9^9,--MID(B7,ROW($1:$20),1),ROW($1:$20))
思路2:
既然是查找位置,也应该想到用MATCH函数,MATCH函数也可以模糊查找,第三个参数为1即查找一个比查找值小且最接近与查找值的值,但是默认查找范围是升序排列的,所以查找一个很大的数字,还是会找到末尾数字所在的位置。
公式如下:
=MATCH(9^9,--MID(B7,ROW($1:$20),1),1)
以上就是查找最后一位数字所在位置的两种思路。
下面再分享下,能不能把字符串中的数字完整的打散为一个整体呢?
用MID函数从第一个数字所在位置开始提取,分别提取1,2,3,4,……20,20肯定超过了字符串的长度,这样提取出来的结果中肯定有一个是完整的数字,用LOOKUP直接提取这个数字即可。
公式如下:
=LOOKUP(9^9,--MID(B7,C7,ROW($1:$20)))
以上就是本节的全部内容,如果你想提升函数水平,建议学习我的函数课程,我将教会你常用的80个函数,更重要的是学会如何灵活使用这些函数解决复杂的计算问题。
本节的分享就到这里,鹏哥祝大家每天都有进步。
聚米为谷
博学宏才
更多学习内容
手机端请扫描
![d1a23e7b527a6b23158e06b630971da6.png](https://img-blog.csdnimg.cn/img_convert/d1a23e7b527a6b23158e06b630971da6.png)
电脑端请登录
www.mihong.top
![d8f527d1d232dc2beae3434fc693d49e.gif](https://img-blog.csdnimg.cn/img_convert/d8f527d1d232dc2beae3434fc693d49e.gif)
您点的每个赞,我都认真当成了喜欢