之前有个人问了我一个问题,我们一般是使用lookup,vlookup以及hlookup从使用lookup,vlookup以及hlookup从数组提取符合条件的单个值,那如何提取数组中符合条件的多个值呢?当时我还不知道,所以我知耻而后勇到网上和论坛上去找,找来找去找到一个相对比较简答容易理解的方法,下面就让我推荐大家使用这一种方法,利用small,index以及if组成一个数组公式即可。

比如下面这张表:




两者中的最小值函数hive excel最小的两个值_最小值


如何一条公式将部门为M78的员工的姓名罗列出来?下面就让我来揭晓答案哈哈哈~

IFERROR(INDEX(C:C,SMALL(IF(A$2:A$8=$E$2,ROW($2:$8),4^100),ROW(A1))),"")


两者中的最小值函数hive excel最小的两个值_数组_02


记得因为是一个数组公式所以最后不要之间enter,而是要ctrl+shift+enter,这样在键入第一个姓名然后下拉时才会陆续显示出其他M78部门员工的姓名。下面就让我来对这个公式进行一个解析。

IFERROR(INDEX(C:C,SMALL(IF(A$2:A$8=$E$2,ROW($2:$8),4^100),ROW(A1))),"")

我们先忽略这些最外面的东西,从里向外一层一层的解析,我们可以看到最里面是一个if函数IF(A$2:A$8=$E$2,ROW($2:$8),4^100),它的意思是,如果部门那列A$2到A$8中的值等于$E$2,即M78,那么就返回对应的后面ROW($2:$8)的值,ROW($2:$8)是一个数组,代表数字2-8,如果不等于M78,那么就返回4的100次方,我也不知道是多少反正是一个连Excel都hold不住的数,最后结果返回错误值,我结合公式求值模块让你们好理解一点,看下下面这些图


两者中的最小值函数hive excel最小的两个值_c++ 编写函数返回两个值最小值_03

待计算的公式

两者中的最小值函数hive excel最小的两个值_数组_04

A$2:A$8分别对应着"M78","M78","M78","L77","M78","M78","L77"

两者中的最小值函数hive excel最小的两个值_两者中的最小值函数hive_05

等号判断公式会将数组值转换成布尔值TRUE或者FALSE

两者中的最小值函数hive excel最小的两个值_最小值_06


两者中的最小值函数hive excel最小的两个值_最小值_07


所以if函数最后返回的一个数组是{2,3,4,4^100,6,7,4^10},计算后也就变成了以下公式

IFERROR(INDEX(C:C,SMALL({2,3,4,4^100,6,7,4^10},ROW(A1))),"")

我们再来看看small,这是个简单又好用的公式,小块头有大智慧,它作用于一个数组,比如本例中的{2,3,4,4^100,6,7,4^10},然后数组后面会跟一个参数,这个参数是一个数字,如果数字是1,便返回数组中的最小值,2的话就是返回第二小的值,依次类推,再插一句嘴它有个兄弟叫large函数,和它的功能正相反,是从最大值开始取的,这个英文稍微可以的同学应该都能理解的哈,好了言归正传,我们知道row(a1)是等于1的(这个如果不知道的话罪该万死哦),所以,它就会返回数组中的最小值,我们看下这个数组的最小值是。。。。。。。2,对吧,{2,3,4,4^100,6,7,4^10},很明显最小值是2,所以经过small计算的公式变成了IFERROR(INDEX(C:C,2),"")。

那我们再来看看IFERROR(INDEX(C:C,2),"")里的(INDEX(C:C,2),这个相信大家不陌生吧,我之前也讲过index和match的,即返回C列中第2个值咯,我们看下。。。。。。不就是“佐菲”么哈哈哈,然后这并不是一个错误值,所以最后这个公式的结果就是“佐菲”,我们看下,不就对应上了么,再把公式下拉


两者中的最小值函数hive excel最小的两个值_两者中的最小值函数hive_08


其他都不变就是row(a1)变成了row(a2),row(a3),反正原理都是一样的。最外面iferror的作用就是如果返回了错误值,就用""代替(本例),所以到“泰罗”之后,因为C列压根就没有4^100这一行,所以系统便会返回错误值

另外我真的建议大家,如果觉得一个公式很复杂的话,我建议你们就打开公式模块里面的公式求值功能,它基本上会一步一步的把系统如何计算的步骤呈现给你,相当有用处。