分享

一个复杂嵌套的函数公式是怎么一步一步写出来的?

 Excel办公实战 2021-06-29
经常有人问我,看你们公式写的好复杂好长,写起来好简单
是怎么写的?

我……也……不知道呀!
 
  
 其实真的不好讲,也不知道从何讲起,但是小编还是试着来说说吧!

正好今天看到一位网友的问题,算是一个不错的素材,契合我们今天的主题

核心:文本中多数值提取

下面我就来一步一步讲讲,到底怎么实现,重要的思路和分析

1、找到每个数值的起始位置

要提取多个文本,首先就需要找到每个数值开始的位置,一般方式是FIND

但是FIND方式,只能找到首个位置,这里多个,不适合,换方式。

观察特征,如果我们一次提取两位,那么第一位不是数值,第二位是数值

那么第二位的位置就是数值开始的位置,但是有小数点的影响,所以先把小数点替换成任意数字,避免干扰。

> 排除小数点干扰

公式:=SUBSTITUTE($A$1,".",1)

替换换成任意数字都可以,主要是小数点是文本,排除这个干扰

在此基础上,我们就可以按照正常截取和偏移一位截取

> 偏移截取

ROW是竖向的数值,{0,1}这是一个横向的常量数值,二者相加就是两列30行

公式 =ROW($1:$30)+{0,1}

公式:=MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1)

配合MID截取效果如下

写入多个单元格方便观察,标色就是我们要的位置

文本长度,我们偷懒,估计30足够了,那么就是从第一位,一直提取到30位,每次截取长度1,同时做的事情还是+{0,1},也是偏移以为的位置,2-31也截取1位

从上图,我们不难看出,第一位是文本,第二位是数值就是我们要的位置,

道理我们懂了,但是具体怎么做呢?

判断是否是数值,我们可以使用ISNUMBER函数,来试试

没有问题!那么如果我们让同一行的数值,第一个乘以-1,第二个乘以1,然后相加,结果是1应该就是我们要的开始位置,其他都是FALSE的肯定是0,如果第一个是TRUE肯定是-1,也就是只有1才是我们要的

来到实操部分,具体怎么做,有没有哪个函数能实现对应相乘并相加

相当于矩阵了,EXCEL似乎最合适的就是MMULT了!

从此处也可以看出,其实很多复杂的公式不仅仅要你懂公式,还是你有不错的数理逻辑。N的作用是把TRUE转为1,FALSE转为0,进行计算

公式:=MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})

MMULT这个函数难度较大,学了很多年,依然不会这个函数的不在少数,整体难度可进全部函数前10,如果暂时无法理解,可以放放,看看示意图。

成功!下一步,只要判断是否是1,如果是1,就返回对应的位置ROW(1:30)

> 成功找到起始位置

公式:=IF(MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})=1,ROW($1:$30)+1)

2、依次提取位置并截取

接下来我们只要依次按照起始位置截取,然后配置LOOKUP知道数值即可

> 取出起始位置

使用SMALL可以从小到大依次提取出,我们算好的起始位置

公式:=SMALL(IF(MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})=1,ROW($1:$30)+1),COLUMN(A1))

> 截取判断

1-30,依次截取(为了方便演示,我们临时转换一下方向),转成数值,我们要的结果已出来,就是每组的最后一个数值,那用什么函数可以实现提取最后一个数值呢?

公式:=MID($A$1,SMALL(IF(MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})=1,ROW($1:$30)+1),COLUMN(A1)),ROW($1:$30))

> 出来吧,结果……

如果你有点函数储备,那么第一个应该想到LOOKUP这个函数有此特性

忽略错误值,第二参数都是负数,所以返回最后一个数值。

公式

=-LOOKUP(1,-MID($A$1,SMALL(IF(MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})=1,ROW($1:$30)+1),COLUMN(A1)),ROW($1:$30)))

容错是必须的,超过的部分会报错,IFERROR,很轻松搞定!

最终公式:

=IFERROR(-LOOKUP(1,-MID($A$1,SMALL(IF(MMULT(N(ISNUMBER(-MID(SUBSTITUTE($A$1,".",1),ROW($1:$30)+{0,1},1))),{-1;1})=1,ROW($1:$30)+1),COLUMN(A1)),ROW($1:$30))),"")

小结:
没有所谓的高手,他们只是函数储备的多,比你练习的多,对函数参数更熟悉,可能还有一点点强的数理逻辑,仅此而已!?
这里是【易办公 早下班】的 Excel办公实战

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多