基础不扎实者,慎入!会受打击的!

你好,我是刘卓。欢迎来到我的公号,excel函数解析。今天再来分享一个案例,此案例的思路不难,但是公式有点长,希望各位小伙伴做好准备。看不懂也没关系,慢慢积累,时间终会给你回馈。
下图左表是数据源,现在要根据E列和F列的数据在左表中查找,并返回C列的数据,结果如G列所示。其中E列对应A列,F列对应B列。比如E3和F3分别对应A2和B4,所以返回C4的1520。再比如E5和F5分别对应A15和B15,所以返回C15的1080。

这个题A列是合并单元格,B列又是区间范围,这么看来还是有点难度的咯。其实你能看到这些,就已经完成一大半了。思路还是不难的:

首先将A列的合并单元格用数组的方式填充满,然后将B列的区间范围按短横线拆分为左右两列,这样就相当于有3列数组了。

接下来看E3单元格是否等于A列的数组;并且判断F3单元格是否大于等于B列左侧的数组,同时小于等于B列右侧的数组。这3个条件同时满足的就返回C列相应的值。

下面给出3种方法:

-01-
在G3单元格输入下面的公式,下拉填充。

=LOOKUP(,0/((F3>=IMREAL(B$2:B$17&"j"))*(F3<=-IMAGINARY(0&B$2:B$17&"j"))*(LOOKUP(ROW($2:$17),ROW($2:$17)/(A$2:A$17>0),A$2:A$17)=E3)),C$2:C$17)

LOOKUP(ROW($2:$17),ROW($2:$17)/(A$2:A$17>0),A$2:A$17)这部分用来填充A列的合并单元格,返回的结果为{14;14;14;14;20;20;20;20;20;20;20;20;20;27;30;40}。

lookup填充合并单元格的用法不了解的小伙伴,可以看《用lookup填充满合并单元格》这篇文章。

IMREAL(B$2:B$17&"j")这部分是用复数函数提取B列短横线左侧的数据,返回的结果为{2.5;3.01;3.51;4.76;1.5;3.26;3.46;3.66;3.96;4.11;4.41;4.61;4.76;0;0;0}。

同样地,-IMAGINARY(0&B$2:B$17&"j")这部分是提取B列短横线右侧的数据,返回的结果为{3;3.5;4.75;5.5;3.25;3.45;3.65;3.95;4.1;4.4;4.6;4.75;5.5;0;0;0}。

对复数函数不了解的小伙伴也可以看《对文本型的数字求和,我发现了一个新函数》这篇文章。

把这3个条件相乘,同时满足的返回1,否则返回0。最后用lookup查找到满足条件的,并返回C列的值。


-02-

在G3单元格输入下面的公式,下拉填充。

=LOOKUP(,0/((MMULT(SIGN(IMREAL(IMDIV(0&B$2:B$17&"j",{1,"-j"}))-F3),{1;1})^2<=1)*(LOOKUP(ROW($2:$17),ROW($2:$17)/(A$2:A$17>0),A$2:A$17)=E3)),C$2:C$17)

LOOKUP(ROW($2:$17),ROW($2:$17)/(A$2:A$17>0),A$2:A$17)这部分还是不变的,用来填充A列的合并单元格。

IMREAL(IMDIV(0&B$2:B$17&"j",{1,"-j"}))这部分将B列的区间拆分为一个多行2列的数组,然后再对其处理。后续处理的方法我也说不清了,感兴趣的自己研究一下公式的,主要用到mmult。

第1种方法是将B列拆分为单独的2列,现在是拆分为1个多行2列的数组,难度肯定是提高了。但是思路还是一样的,只是处理的方法有所不同。最后还是用lookup查找符合条件的,并返回C列的值。


-03-
在G3单元格输入下面的公式,按ctrl+shift+enter三键,下拉填充。

=LOOKUP(,-FILTERXML("<a>0"&F3&"</a>",T(IF(1,"a[.>="&SUBSTITUTE(B$2:B$17,"-","][.<=")&"0]")))/(LOOKUP(ROW($2:$17),ROW($2:$17)/(A$2:A$17>0),A$2:A$17)=E3),C$2:C$17)

此公式用的是filterxml,也是从海鲜老师那里学来的套路。这里就当我练习一下了,而且由于B列正好是小数,我还取巧了下。如果是整数,公式会出错。

链接:

https://pan.baidu.com/s/17NUlekgE4e-MqiaYlP9Kyg

提取码:zc1g
(0)

相关推荐