如何使用索引查找所有大于某个值的数

4

我已经在这个网站和其他地方对我的情况进行了相当多的研究,这是最接近我的问题/解决方案:

查找所有大于或等于某个值的值

然而,在我的情况下使用该解决方案并不能给出正确的结果。我有一个包含83个名称及其对应罚款的列表。在另一个标签页中,我想显示所有有罚款的名称的输出(>0)。
我只有四种可能的罚款金额,因此如果需要在公式(匹配或查找)中引用它们,那也可以。以下是缩短和虚拟数据的示例:

+----------+---------+
|  Name    | Penalty |
+----------+---------+
| Name 1   |    0    |
| Name 2   |    0    |
| Name 3   |    5    |
| Name 4   |    0    |
| Name 5   |    0    |
| Name 6   |    10   |
| Name 7   |    0    |
| Name 8   |    0    |
| Name 9   |    0    |
| Name 10  |    20   |
+----------+---------+

使用此公式,然后拖动 CSE 单元格向下:
=INDEX($R$4:$R$13,SMALL(IF($S$4:$S$13>0,ROW($S$4:$S$13)),ROW(1:1)))

它为我提供了以下结果:
+---------+
| Name 6  |
| Name 9  |
| #REF!   |
| #NUM!   |
| #NUM!   |
| #NUM!   |
| #NUM!   |
| #NUM!   |
| #NUM!   |
| #NUM!   |
+---------+

我将使用IFERROR并使它们为空来处理错误,但仍然无法找到那些罚分>0的正确名称。

编辑:更改最后的“ROW”部分会给出不同的答案,因此我认为我的问题就在那里,但我仍然不知道该怎么做。那应该是“SMALL”函数的“k”值。

非常感谢任何帮助。谢谢!


1
只需将 INDEX 中的 $R$4:$R$13 更改为 $R:$R。这是因为您的 Small 从 ROW($S$4:$S$13) 获取值,因此第一个条目将是 4,但 INDEX($R$4:$R$13,4) 将是 R7 而不是 R4。但使用 INDEX($R:$R,4) 将输出正确的 R4 ;) - Dirk Reichel
这个解决方案可行!谢谢你! - Brian
1个回答

4

我更喜欢使用MATCH()而不是SMALL():

=INDEX($R$4:$R$13,MATCH(1,($S$4:$S$13>0)*(COUNTIF($U$3:U3,$R$4:$R$13)=0),0))

这是一个数组公式,所以需要使用Ctrl-Shift-Enter。

此外,该公式要求至少从第二行开始,因为countif需要引用上面的单元格以避免循环引用。

enter image description here


如果您真的想使用SMALL()函数,那么您需要对起始行进行调整:
=INDEX($R$4:$R$13,SMALL(IF($S$4:$S$13>0,ROW($S$4:$S$13)-ROW($S$4)+1),ROW(1:1)))

正如 @dirk 指出的那样,数组部分是 SMALL() 而不是 INDEX,因此在 INDEX 部分中使用完整列并使用 SMALL 就可以返回实际行号:

=INDEX($R:$R$,SMALL(IF($S$4:$S$13>0,ROW($S$4:$S$13)),ROW(1:1)))

这也是一个数组公式,需要使用Ctrl-Shift-Enter进行确认。

enter image description here

另一种方法是使用AGGREGATE函数,无需将其作为CSE公式输入,而是作为普通公式输入:
=INDEX($R:$R,AGGREGATE(15,6,ROW($R$4:$R$13)/($S$4:$S$13>0),ROW(1:1))

这是一个常规公式。它仍然是数组类型的公式,因此在公式的数组部分中仍需要仅使用数据集作为参考,并避免使用整列引用。
当希望在第一行返回第一个结果时,后两个特别有用,因为它们不需要COUNTIF()函数来保持唯一性返回。

1
哇,好棒的帖子。我经常使用类似的函数,会仔细研究这个!(最后一种聚合函数很有趣)您为什么喜欢使用Match而不是Small?是否有性能方面的好处,还是只是个人偏好?另外,需要注意的是,OP可以将 IfError([formula],"") 包裹在它周围以隐藏 #NUM 错误。 - BruceWayne
1
@BruceWayne我只是喜欢这样,因为我觉得更容易理解。它更像我的思维方式。我没有将IFERROR部分放入是因为OP写道,“我将使用IFERROR来处理错误并使它们为空白”,所以我认为OP可以处理它。但这对于未来的读者来说是个好注意点。 - Scott Craner
@ScottCraner 如果 OP 希望将返回列表从第一行开始列出,该怎么办? - XOR LX
1
@BruceWayne 关于IFERROR,也许在较小的范围内可以使用,但如果数据集很大,则可能极其低效:http://superuser.com/questions/812727/look-up-a-value-in-a-list-and-return-all-multiple-corresponding-values - XOR LX
非常感谢,伙计们。我会研究这些选项并做出决定,但是暂时将索引更改为$R:$R已经起作用了。另外,是的,我计划为整个内容使用IFERROR。 - Brian
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接