【发布时间】:2019-06-19 14:42:51
【问题描述】:
我的问题是,我想从表 2 的 A 列返回表 2(或在本例中为 NBA 球员)的 B 列中的值列表,其中包含表 1 的单元格 A3 中的值“PG”。我不仅希望它与“PG”匹配,而且我还希望该值的薪水(C 列)介于 7100 美元(表 1 中的单元格 B2)和表 1 中的 8000 美元(单元格 C2)之间)。任何帮助将不胜感激。
【问题讨论】:
我的问题是,我想从表 2 的 A 列返回表 2(或在本例中为 NBA 球员)的 B 列中的值列表,其中包含表 1 的单元格 A3 中的值“PG”。我不仅希望它与“PG”匹配,而且我还希望该值的薪水(C 列)介于 7100 美元(表 1 中的单元格 B2)和表 1 中的 8000 美元(单元格 C2)之间)。任何帮助将不胜感激。
【问题讨论】:
您将需要使用数组公式或返回类似计算的数组的函数。我会建议使用 AGGREGATE 函数。避免在数组公式或执行类似数组计算的函数中使用完整的 comm/row 引用,否则您可能会因过多的计算而使系统陷入困境。
AGGREGATE 函数由几个单独的函数组成。根据您选择的哪一个,它将执行数组操作。我将建议公式 14。以下示例将生成一个从最小到最大排序的结果列表,忽略错误值,然后返回列表中的第一个值。我们将列出的内容是符合您所有条件的行的行号。所以 AGGREGATE 的基础是这样的:
AGGREGATE(Formula #, Error/hidden handling #, Formula, parameter)
其中最困难的部分是提出正确的公式。在分子中你输入你要找的东西。在分母中放置 TRUE/FALSE 条件检查。用 * 分隔每个条件检查。 * 将充当 AND 函数。使这项工作有效的原因是 TRUE/FALSE 在通过数学运算发送时转换为 1/0。所以你不想要的任何东西都是假的。并且除以 FALSE 的任何内容都会除以 0,这反过来会产生错误。由于 AGGREGATE 设置为忽略错误,因此只有满足您条件的事物才会存在于列表中,并且由于它们被 TRUE 除以 1,因此您的事物保持不变。所以聚合函数开始看起来像:
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
【讨论】: