【问题标题】:Excel: need help with unusual lookup function (sorted column is different from lookup column)Excel:需要异常查找功能的帮助(排序列与查找列不同)
【发布时间】:2009-12-15 14:36:21
【问题描述】:

我在 Excel 中构建不寻常的查找公式时遇到问题。

通常,我会使用 VLOOKUP(),但缺陷是我想从按另一个列排序的表中查找列中的数字。 Vlookup 只能在排好序的列本身上查找内容。

场景如下:

  • 表格按 B 列升序排序。
  • 对于给定的参数 P,我现在想找到第一个 A 值,从上到下,大于或等于该参数 P。
  • 然后该函数应返回相应的 B 值。

表格(部分关闭,完整的表格要大得多):

    A      B
1  640    4.5
2  1600   7.0
3  640    7.5
4  1280   12.0
5  1920   16.5
6  2560   21.0
7  1600   19.8
8  3200   26.8
9  4800   33.8

例如,假设我的参数是1100,那么我希望我的公式返回7.0,因为在A列中向下搜索时大于或等于1100的第一个条目是1600,即对应的 B 值为 7.0

我用Array Formula's(也称为“ctrl-shift-enter 公式”)尝试了我的运气,并构造了这样的东西:

{=INDEX(table;
        MATCH(MIN(IF(columnA-$C1>=0;columnA;FALSE));
              IF(columnA-$C1>=0;columnA;FALSE);
              0);
        2)}

C1 包含我的参数,table 范围 A1:B9,columnA 范围 B1:B9

但这不起作用(在上面的示例中,它返回 12.0,因为 MIN() 函数选择了 1280)。

我不想使用的解决方案: 我可以写一些 VBA 来遍历表格,但我不想这样做(因为烦人的“宏警告”,而且 Mac 上的 Excel 不再支持 VBA)

谁有线索?

【问题讨论】:

  • 如果是我,我可能会尝试使用数据透视表或使用 MS Access 来查询数据,因为它们可以更好地处理“查询内容”和数据聚合。但是,也许这不是您正在寻找的解决方案类型。
  • @Ben:确实没有。数据透视表非常有用,但是当您不每天使用它们时,我发现它们有点棘手(对我来说就是这种情况)。而且我想将解决方案/问题保留在一个程序中,不需要访问 :-)

标签: excel lookup excel-formula worksheet-function


【解决方案1】:

你可以使用

{=INDEX(B1:B9,MIN(IF(A1:A9>C1,ROW(A1:A9),FALSE)))}

请注意,我使用的是英国英语语言设置 - 您必须更改公式以匹配您的语言环境,将逗号替换为分号等。

【讨论】:

  • 谢谢!你的解决方案让我走了。我不得不添加小的修正来支持我的表格不是从第一行开始。我将其更改为 {=INDEX(B1:B9,MIN(IF(A1:A9>C1,ROW(A1:A9),FALSE))-ROW(A1:A9)+1)} 现在工作正常。再次感谢!
【解决方案2】:

如果您不想要数组公式,您可以尝试 =OFFSET($C$5,MATCH($A$17,B5:B13),0) 其中 C5 是 B 列的开头,B5:B13 是您A 列和 A17 是您要匹配的值。

Ninja 编辑:这是一个适用于规范中小于或 等于 位的版本。 =OFFSET($C$5,IF(ISNA(MATCH($A$17,B5:B13,0)), IF(ISNA(MATCH($A$17,B5:B13)),0,MATCH($A$17,B5 :B13)), MIN(MATCH($A$17,B5:B13,0)-1,MATCH($A$17,B5:B13))),0)

【讨论】:

  • 如果可能的话,我确实宁愿不使用数组公式。但不幸的是,由于 MATCH() 的工作方式,该公式不起作用。两个问题:(a)它没有给出低于列表中第一个 A 值的值,(b)当一个值与 A 列中的项目匹配时,它给出下一个值。感谢您的努力!
  • 哇,更新快。但是,我已经采用了 AdamRalph 的解决方案。没有检查你的 ninja-edit,因为它需要大量的大脑锻炼 :-)
【解决方案3】:

假设数据表在 A2:B10 范围内,并且您在单元格 B1 中搜索的值,以下似乎有效:

 =IF(B1<A2,B2,IF(ISNA(VLOOKUP(B1,$A$2:$B$10,2,FALSE)),INDEX(B2:B10,MATCH(B1,A2:A10)+1),VLOOKUP(B1,$A$2:$B$10,2,FALSE)))

我对此进行了编辑以说明查找值何时小于列表中的任何值。

【讨论】:

  • 感谢您的努力!正如我在 avid 的帖子中所解释的,这确实是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2011-05-27
  • 2017-12-01
  • 2014-11-23
  • 2020-10-11
  • 2019-12-29
相关资源
最近更新 更多