今天我们来聊聊目前大家经常看到的文本中提取数值的通用公式是怎么进化来的,知道来龙去脉,以后你就不会再迷茫了~!算是做一期函数进化史吧!
比如下面的数据,我们先提取金额要如何写公式? 我们就按照思路,逐步来聊聊,公式是怎么写出来的!
整体思路:想要提取数值,我们就要找到数值开始的位置,和长度,这样我们就可以使用MID函数截取
获取数字开始的位置,Excel显然没有这样的函数,但是我们知道数值就是0-9,如果我们用0-9每个数值都到其中去查询一下,就可以得到每个数字首次出现的位置,然后我们取他们中最早位置就是我们数值开始的位置。①查询数值最早的位置,我们可以使用FIND函数,不要问我为什么知道要使用FIND,而不是NND~如果你是真的'全白',那么应该可以通过下面的方法摸索一下,找找大概的相近的函数,再去百度一番,基本能了解个7788了。下面再遇到函数也是同样的思路!为了说明首次出现的位置,我们在数值中再加入一个2,这样我们来看一下!结果是4,也就是我们圈起来最后一个位置的2的位置,而不是元字前面那个2!我们把0-9写到表头,这样我们公式可以修改为下面这样 这样内容中有的数值就会返回首次出现的位置,否则返回错误值!按照思路,我们需要取他们中最小的,也就是3 入后面的位置,但是这里有错误值,没有办法直接使用MIN函数! ①把错误值处理成一个较大的数值,这样我们取最小,肯定不会取到 ②我们在原内容的基础上拼接上0-9,这样就不会报错了! 我们知道FIND返回首次出现的位置,如果我们在内容的末尾加上0-9,这样所有数值都会返回首次出现的位置 这样我们即可以避免错误值干扰,也可以返回正确的结果3(数值首次出现 的位置-这里就是5首次出现的位置) 第一步其实我们就完成了,但是是通过常常的辅助列。如果我们可以把他们直接写入公式,不用辅助列就好了,想要实现这个,Excel提供了常量数组! 所谓常量数组,也只是一种给定格式存储数据的方式而已!比如这样就是一个水平常量数组,在Excel中一行中呈现那么我们把每次查询的内容,直接替换成这个,就不用辅助列,一个一个去查了,这里有几个数字结果就会有几个,一一对应!=FIND({0,1,2,3,4,5,6,7,8,9},$A$1&'0123456789') 这样我们只需要把FIND的结果,0-9首次出现的位置这一组数作为MIN的参数即可!求出最早出现的位置
=MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&'0123456789')) 那么到这里,其实我们已经解决数字最早出现位置的问题了~但是…… 这样的公式在很多高手眼里还是太长了,感觉可以简化……在他们脑中几百个函数中,很快就找到了一些合适的方式可以代替,比如ROW 结果也是0-9的一组数,只是他们是行的,但是并不影响我们想要的结果,因为最后我们要取最小的,不管你是行或者列!=MIN(FIND(ROW($1:$10)-1,$A1&'0123456789')) 同样后面还是0-9这样一串数字,但是我们不能用上面的ROW,因为我们要的不是数组,而是文本或者数值! 他们发现了一些特殊的数中包含(0-9)而且,可以写的很短,这个出现因为是当年大佬们在玩函数字符竞赛(同样的问题,谁的公式最短!)你在Excel中输入 “=1/17” 然后鼠标定位在公式中 按下F9 你就可以看到这个分数的结果!其中包含了全部的0-9这10个数字!于是他们使用1/17 这4个字符取代了那长长的12个字符(10+双引)
=MIN(FIND(ROW($1:$10)-1,$A1&1/17)) 原公式长度50,简化后34。你可以想象,字符竞赛的那会,最后都在拼一两个字符,这样的简化给大佬们带来了怎么的喜悦~第一版:=MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&'0123456789')) 简化后:=MIN(FIND(ROW($1:$10)-1,$A1&1/17)) 这样的简化,其实是损失了可读性的,所以很多同学看不懂公式很正常,要是没有人给你讲解,你想破脑袋估计都想不通,1/17到底是什么鬼?这些都是前辈们的思路结晶,向前辈致敬~数字提取通用公式发展史,由于内容太多,我们分两篇,上篇我们就见到这里!
|