如果你真的想学习,静下心来,内容较长,听我慢慢道来!全部看完,你必定有所收获~!
友情提醒:全文4000字,24个图+动画,预计阅读10分钟!
案例很简单:提取其中的金额数值
方法有很多,本篇的主题是使用公式的思路讲解!
1、这种从文本中提取数字。那么我们第一步就要找到我们要提取数字开始的位置!2、怎么找呢?数字0-9共10个,只有这10种情况,那么我们就一个一个去查找这10个数字,找出10个数字首次出现的位置,然后获取最小的就是开始的位置!3、那么查找用什么呢?如果你懂一点基础,应该会知道有FIND这个函数!FIND函数比较简单,使用第一参数在第二参数中查找,如果找到就返回对应的首次位置!比如案例中有一个0,分别是第4和第5位!但是结果只返回4!因为 A2单元格中并没有1,所以返回一个错误值#VALUE!有了以上基础知识,那么我们就可以去查找了!一般新手可能会考虑分别查找然后取最小!就像这样,在上面他添加辅助列0-9,然后可以拖动公式逐个查找!但是这里有错误值怎么办?按照正常思路,你可能想把错误值转成其他数值,但是我们要取最小出现的位置,所以可以使用IFERROR容错处理换成一个足够大的,这样就不影响我们取小了!=IFERROR(FIND(C$1,$A2),99)
但是其实这个数字不太好确定,我们不知道什么位置会出现数字,但是有一点,就是只要数字无关的数字出现在内容的最后,那么肯定不会影响我取最小!比如 房租900元 ,0-9出现在元后面,肯定不影响我们查找数值首次出现的位置!转成这样 房租900元0123456789,我们再来查找看看这样的话,既不会影响我们查找首次出现数字的位置,也不会因为查找不多而报错!由于FIND返回首次的位置,所以就算后面出现了其他数值也不影响先出现数字的位置!但是我们不能去直接修改单元格的内容,所有我们应该把0-9拼接到公式中去=FIND(C$1,$A2&"0123456789")
4、按照一般思路,所有的数值位置都找到了,下面取最小值就可以了!结果是3,也就是首次出现数字位置是第三个位置,也就是9对应的位置!你以为这样就结束了吗?其实这只是开始,我们说了是一般思路!但是总是有一些数理逻辑比较好的同学,他们觉得0-9这10个数字,使用辅助列太麻烦了,要是可以直接写在公式中就好了,这个直接一次性写在公式中,也就是写入一组数,也就是大家初期认识的数组了!他说一组大括号包裹着的 {0,1,2,3,4,5,6,7,8,9}=FIND({0,1,2,3,4,5,6,7,8,9},$A2&"0123456789")
以上公式结果会是10个数字,分别对应0-9这个10个数字首次出现的位置!但是这样的长度,还是无法让他们满意的,这样的数值,都是连续的就好像序号一样,那么Excel是否有函数可以生成序号的,当然有,你稍微找找应该发现ROW,他可以返回你说给定单元格的行号!给多个就返回多个,'就是返回A1:a10单元格的行号对应1到10,可以我们要0-9,但是由于我们不关注列,所有可以直接写行号即可!=FIND(ROW($1:$10)-1,$A2&"0123456789")
如果你是你,看到上面的简化,你肯定也看第二参数不爽,觉得应该也可以进一步简化!当然同样是数理逻辑好的同学出现了,他们想只要一个数值包好0-9就好了,但是还不能太长,那么最好的就是分数,还要除不尽或者除得尽,这个10个数字都有,其实这样的数值有很多,但是后续延续下来常用的就是1/17=0.0588235294117647 0-9都在其中!当然你也可有可能看到5^19=19073486328125 这个数,和上面不同的是这里没有小数点,如果你提取的数值中有小数,那么推荐1/17,没有则可以使用5^19次方!有了上面的特殊数值,那么第二参数也就可以进一步简化了!▼这就是目前最流行查找数值首次出现数字位置的经典公式了!=FIND(ROW($1:$10)-1,$A2&1/17)
一个经典公式,现在大家都在用,但是他背后真的经历了很多,感谢那位数理逻辑好的同学,感谢这些开荒者!一个数学好的不一定是函数高手,但是函数高手必定是数理逻辑好的!查找到了开始的位置,下面其实就比较简单了,直接从这个位置截取,截取的长度有数值的个数确定!到底有多少个数字呢,我们可以采用第一种思路,查找0-9,统计结果是数值的个数!
=SUM(--ISNUMBER(-MID(A2,ROW($1:$99),1)))
判断是否是数值,我一位一位拿出来,用ISNUMBER判断一下不就知道了吗?只要要截取多少,不确定,我们就给一个足够大的数值就行!你可能看到了两个符号,经常也好奇干嘛用的,其实MID是文本截取函数,截取的结果都是文本型的,ISNUMBER识别不了,想要识别必须转成数值型!而文本型数值经过四则运算就可以转成数值型,这里的﹣ 其实就是让文本型数值转成数字,但是其他汉字文本就会变成错误值,当然并不是影响ISNUMBER!最后是外面的--,其实也是类似的作用,这是这次是把逻辑值转成数字,--TRUE=1,--FASLE=0,这个就是Excel的逻辑约定!如果我们截取9个长度,看一下内容计算后的结果,中间三个1,对应这900这里其实还不够严谨,那就是如果是小数的问题,所以还要把小数点考虑进去
=SUM(--ISNUMBER(-MID(A4,ROW($1:$9),1)))+ISNUMBER(FIND(".",A4))
我能修改了一个数值,加入了小数点,可以发现结果是4,完全OK!开始位置和截取的长度都有了,其实就简单了,只要把他们带入MID函数即可!所以在没简化截取长度公式的时候,你的公式应该是这样!
=MID(A2,MIN(FIND(ROW($1:$10)-1,$A2&1/17)),SUM(--ISNUMBER(-MID(A2,ROW($1:$99),1)))+ISNUMBER(FIND(".",A2)))
实在是太长了,这一次不需要数值逻辑好的,我们只需要知道一个函数即可,那就是COUNT,他就是统计数组或者区域中数值个数的
=SUM(--ISNUMBER(-MID(A4,ROW($1:$9),1)))+ISNUMBER(FIND(".",A4))
COUNT(-MID(A4,ROW($1:$99),1))+ISNUMBER(FIND(".",A4))
计算按照这个思路,还是长的!继续简化,这次就是数理逻辑简化了!考虑小数点,要是能放到公式中就好了,由于Excel认识 “.5” ,会将其 识别成0.5所以我们可以考虑截取两位,这样小数点问题就不用担心了!=COUNT(-MID(A2,ROW($1:$99),2))+1
=MID(A2,MIN(FIND(ROW($1:$10)-1,$A2&1/17)),COUNT(-MID(A2,ROW($1:$99),2))+1)
其实到这里,基本简化结束了,但是还有一种情况没有考虑,那就是负数情况如果也考虑进去,那么首先开始位置的公式要稍微调整一下
=MID(A2,MIN(FIND({"","-"}&ROW($1:$10)-1,$A2&"-"&1-ROW($1:$10))),COUNT(-MID(A2,ROW($1:$99),2))+1)
{"","-"} 拼接上主要考虑有或者没有符号两种情况,同样被查的数据也要同时考虑,这里我们就不再进一步展开了!F9看一下应该就能明白!以上比较通用的数值提取常规的思路演化!希望你能从中学习到或者聊到到一些思路!总是有朋友让我推荐Excel学习书籍!今天我就推荐基本自己读过的,算的上国内目前比较不错的几本!第一本:Excel2016应用大全,EH出版,函数覆盖比较全面,也有一定的套路分享!适合函数新手和进阶的同学!如果你想学习表格设计,需要补充一点基本设计理论,我推荐这本也是我目前比较喜欢的一本,适合新手!其中虽然有一些小编不敢苟同,但是整体还是非常不错的!第三本:关于Excel开发的,比较适中中高阶段的VBA用户!目前没知道上架的资源,有需要的可以到我的知识星球下载!从2013版本添加了快速填充这个智能填充功能,我们很多数值提取都可以Ctrl+E 轻松搞定,如果有个别发现提取不正确,只要稍微调整一下即可!看到这里很多人可能说,有这么好用的功能,我还学公式干什么?重要的从来都不是什么公式,而是处理的问题的思路!当然大家也可以使用我开发的正则表达式自定义函数处理: