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