你能不能在不用filter、tocol这类需要OFfice365或office2021、wps最新版本才能用的函数,写一个能实现“少做,多得”的公式啊?
我的这条微头条已经发出来好几天了,友友们有出主意的,也有发表情的。
今天我就来解决这个问题来了。
这里有一个核心函数就是这个AGGREGATE函数。
AGGREGATE函数真是一个宝藏,我找了好久才找到它!
先看看,我是否实现了微头条中所说的内容:
不错,我已经实现了那个让人头疼的功能。朋友的脸也是被打了。打脸现场好下:
这个就只能借助一下罗老师的现场情况来说一下当时朋友的现场情况。
现场的情况基本和这类似了,有点不受控制。
公式中核心知识点
以下是我实现上述功能的公式:
=INDEX(B1:E16,
AGGREGATE(14,7,
ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16))),
ROW(INDIRECT("1:"&COUNT(ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16))))))),
{1,2,3,4})
这个公式有几处要点:
1、这两部分公式:
a、ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16)))
b、ROW(INDIRECT("1:"&COUNT(ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16)))))))
以上两部份公式中所含的知识点在前两期的内容中有详细讲解《巧用逻辑值,为SUMPRODUCT赋能,提高生产力!》以及《这些技巧Excel老玩家都会,你会吗?》,本文将会做简短说明,不再详细阐述原理。
2、AGGREGATE函数,这个函数是我们今天的主角。
3、index函数,这个函数是位老司了。
知识点讲解:
1、第一部分公式:
ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16))):在上面的公式中,这部分公式的作用就是将我们输入的值与表格中的B1:B16列进的搜索,如果有就将其行号显示出来,如果没有,这个公式将会返回除数是0的错误(#DIV/0!)
Row(B1:B16)将会返回B1到B16这16个单元格所在的所有行号。
NOT(ISERROR(SEARCH(H2,B1:B16)))则是将SEARCH(H2,B1:B16))的搜索结果转换成布尔值。只不过因为外层加了一个not,所以是将所有true转成false,所有false转成true。
Search函数,大家已经不陌生了,意思是查找到我们输入的内容就返回一个数字,否则返回错误。
iserror函数则是判断其中的参数是否是错误,如果是错误,返回true,如果不是错误,则返回false。
2、第二部分公式:
ROW(INDIRECT("1:"&COUNT(ROW(B1:B16)/NOT(ISERROR(SEARCH(H2,B1:B16)))))))这部分公式就是生成从1到符合条件的结果个数的连续自然数。
3、AGGREGATE函数:这个函数是excel2010版本之后才有的,到目前为止,也算是一个老函数了,其语法:
//引用形式
AGGREGATE(function_num, options, ref1, [ref2], …)
//数组形式
AGGREGATE(function_num, options, array, [k])
与subtotal类似,这个function_num,是有19种函数比subtotal还要多,因此这个函数的功能强大。
而function_num具体是哪19种函数,可参见下表,小编直接从微软官方截图了。
这个函数的另一个重点是其第二个参数:options,第二个参数所代表的具体含义(截图来自微软官方):
第二个参数可以忽略错误值、隐藏行、空值、以及subtotal、aggregate函数的嵌套。
也意味着可以改变返回值数组的大小。函数的这个功能才是小编让朋友打脸的关键所在。
AGGREGATE函数因为聚合了19个函数,因此说它功能强大一点都不为过。
函数后面的参数,就是各数组、引用之类的数据源了。
小编在实现前文所述的内容的时候就是采用AGGREGATE函数中的large函数功能实现的,其实将其换成small也是可以的。因为是用large实现的,所以得到的结果与数据源中的结果的顺序是颠倒的。如果用small就与数据源中的顺序相一致。
好了,以上公式就是小编关于
https://www.toutiao.com/w/1801183604250633/这篇文章的解决方案。友友们如果还有其他方案可以留言告知,我们一起探讨。