在Excel中,如何返回与描述匹配的值列表?

时间:2019-01-25 18:14:16

标签: excel list indexing

我的问题是我想从工作表2的A列中返回工作表2(或在本例中为NBA球员)中工作表2的B列中包含“ PG”值的值列表。我不仅希望它与“ PG”匹配,而且还希望该值的薪水(C列)在$ 7100(工作表1中的单元格B2)和$ 8000(工作表1中的单元格C2)之间。任何帮助将不胜感激。

(Sheet 2) I want to get the information from

(Sheet 1) I want my list to appear

1 个答案:

答案 0 :(得分:0)

您要么需要使用数组公式,要么需要使用返回数组的函数(如计算)。我建议使用AGGREGATE函数。避免在数组公式或执行数组之类的函数(例如计算)中使用完整的逗号/行引用,否则可能会因过多的计算而陷入系统瘫痪。

AGGREGATE函数由几个单独的函数组成。根据您选择的哪个,它将执行阵列操作。我将建议使用公式14。以下示例将执行以下操作:生成一个结果列表,该列表从最小到最大排序,忽略错误值,然后从列表中返回第一个值。我们将列出的内容是符合您所有条件的行的行号。因此,AGGREGATE的基础如下:

AGGREGATE(Formula #, Error/hidden handling #, Formula, parameter)

最困难的部分是提出正确的公式。在分子中放入您要查找的东西。在分母中放置TRUE / FALSE条件检查。用*分开每个条件检查。 *将充当AND函数。使这项工作起作用的是,通过数学运算发送时,TRUE / FALSE会转换为1/0。因此,您不需要的都是FALSE。并且除以FALSE的所有内容都将除以0,这反过来会产生错误。由于将AGGREGATE设置为忽略错误,因此列表中仅存在满足您条件的事物,并且由于它们被TRUE除以1,即TRUE,因此您的事物保持不变。因此,聚合函数将开始看起来像:

AGGREGATE(14,6,ROW(some range)/((Condition 1)*Condition 2)*...*(Condition N)),1)

因此,如前所述,14将AGGREGATE设置为以升序对列表进行排序。 6告诉AGGREGATE忽略错误,而1告诉AGGREGATE返回其排序列表中的第一项。如果它是2而不是1,它将返回第二个位置。如果您要求的职位大于列表中的项目数,则AGGREGATE会产生一个错误,不会被忽略。

因此,现在对AGGREGATE的功能有了一些了解,让我们看看如何将其应用于您的数据。首先,假设您的数据在2:100行中,而第1行是标题行。您将不得不调整引用以适合您的数据。

条件1

LEFT($A$2:$A$100,2)="PG"

检查前两个字符是否为PG。根据屏幕截图中的数据,PG位于/的左侧,或者是唯一的条目。还观察到A列的单元格中只有一个/。如果您还需要检查/之后是否存在,并假设它只能在一侧,而不能在同一时间,则可以使用此替代方法进行条件检查:

(LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG")

在这种情况下,+执行OR功能的任务。前面提到的警告很重要,因为如果双方都为TRUE,那么您将以TRUE + TRUE结束,该值变为1 + 1即2,我们只想除以1或0。尽管相反,您可以使用:

MIN((LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG"),1)

条件2

检查C中的薪水是否小于或等于值80000。

($C$2:$C$100<=80000)

条件3

检查C中的薪水是否大于或等于71000。

($C$2:$C$100>=71000)

现在,我们将所有这些放在一起以获得符合您条件的行号列表:

AGGREGATE(14,6,ROW($A$2:$A$100)/MIN((LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG"),1)*($C$2:$C$100<=80000)*($C$2:$C$100>=71000),ROW(A1))

现在,只要我没有在该公式中加括号,您就可以将该公式放在单元格中并复制下来,直到产生错误为止。向下复制时,唯一会改变的是ROW(A1)中的A1。它就像一个柜台。 1,2,3等,因此您将获得符合条件的行号列表。现在我们需要将这些行号转换为名称。

要查找名称,INDEX函数是您的朋友。因为它不是数组公式的一部分,也不在执行类似数组的计算的函数内部,所以可以使用全列引用。因此,我们采用生成行号的公式并将其放在INDEX函数中以给出:

INDEX(B:B,Row Number)

INDEX(B:B,AGGREGATE(14,6,ROW($A$2:$A$100)/MIN((LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG"),1)*($C$2:$C$100<=80000)*($C$2:$C$100>=71000),ROW(A1)))

现在,如果您讨厌进一步复制后再看到错误代码,则可以将整个内容放入其中,并使用IFERROR函数给出:

IFERROR(formula,What to display in case of an error)

对于空白条目:

IFERROR(INDEX(B:B,AGGREGATE(14,6,ROW($A$2:$A$100)/MIN((LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG"),1)*($C$2:$C$100<=80000)*($C$2:$C$100>=71000),ROW(A1))),"")

和自定义消息:

IFERROR(INDEX(B:B,AGGREGATE(14,6,ROW($A$2:$A$100)/MIN((LEFT($A$2:$A$100,2)="PG")+(RIGHT($A$2:$A$100,2)="PG"),1)*($C$2:$C$100<=80000)*($C$2:$C$100>=71000),ROW(A1))),"NOT FOUND")

因此,现在您只需要调整引用以适合您的数据即可。如果您的数据位于另一张工作表上,请记住包括工作表名称。对B3:C4的引用将变为:

Sheet1!B3:C4

,如果工作表名称中包含空格:

'Space Name'!B3:C4