【问题标题】:Excel LOOKUP matches the wrong cellExcel LOOKUP 匹配错误的单元格
【发布时间】:2019-11-06 10:18:35
【问题描述】:

我正在尝试在 Excel 中完成一项相当简单的任务,但没有得到我想要的结果。我有一个简单的时间表,通过填写一张简单的表格,我将一组教练分配给一系列比赛。这是缩小版:

  Match | John | Pete | Chris |       
 -------|------|------|-------|------- 
      1 | X    |      |       | John  
      2 |      | X    |       | Pete  
      3 | A    |      | X     | Chris 
      4 | X    |      | A     | Chris (!)
      5 |      | X    | A     | Pete  

传奇:X:将执教;答:可以。

我使用该表来注册可用性,然后将每行中的一个 A 更改为一个 X,以选择实际指导比赛的人。

为了概述,我决定添加一个列,其中将显示所选教练。我对第 2 行使用了以下公式:=LOOKUP("X"; B2:D2; B$1:D$1) 并将其复制到其他行,以便每行的行号与放置公式的行相对应。

令我惊讶的是,第 4 场比赛被分配给了 Chris,而 John 有一个 X,而 Chris 只有一个 A。

当我阅读Microsoft's documentation on LOOKUP 时,我注意到了一些事情:

  1. LOOKUP 具有向量形式和数组形式。微软建议对数组形式使用 HLOOKUP,但我使用向量形式。我不认为 HLOOKUP 对我有用,因为它只在指定数组的第一行中查找值,而我的第一行包含要返回的值。
  2. 上面写着:“一个只包含一行或一列的范围。”,还有“重要提示:lookup_vector 中的值必须按升序排列:..., -2, -1, 0, 1, 2, ..., A-Z, FALSE, TRUE;否则,LOOKUP 可能不会返回正确的值。大写和小写文本是等效的。"

我认为 2. 是导致问题的原因。我不确定如何对 A2:A4 之类的范围参数进行排序。微软记录了SORT function,但它是测试版。另外,无论如何,我认为对搜索行进行排序会弄乱匹配。

我找到的解决方法是将我的代码更改为 A:已分配和 B:备份,其中 A 和 B 被选择为按字母顺序升序。如果我更改公式以使用查找值“A”,这给了我:

  Match | John | Pete | Chris |       
 -------|------|------|-------|------- 
      1 | A    |      |       | John  
      2 |      | A    |       | Pete  
      3 | B    |      | A     | Chris 
      4 | A    |      | B     | John  
      5 |      | A    | B     | Pete  

这是我想要的结果。

谁能阐明这种完全违反直觉的行为和/或描述实现这一目标的替代方法?

注意事项:

  1. 我注意每行只放 1 个 X。
  2. 我在 Microsoft Excel for Office 365 MSO (16.0.11328.20362) 64 位和 Microsoft Excel 2016 MSO (16.0.12130.20232) 32 位中看到了这一点。

【问题讨论】:

  • 这里的诀窍是The values in lookup_vector must be placed in ascending order:A-Z,它解释了为什么当您在 A(第 4 行)之前使用 X 时,它会首先返回值 A。在第 3 行,因为它们被正确排序,所以你得到了正确的结果。这也解释了为什么在使用 A,B 而不是 A,X 时会得到结果。但是只要这 3 个单元格中的顺序是 A-Z,您就会得到正确的结果。否则,结果将是错误的。实现这一目标的最佳方法确实是@Rory 答案。

标签: excel excel-formula


【解决方案1】:

LOOKUP 完全按照文档的设计目的进行。你应该使用INDEXMATCH

=INDEX($B$1:$D$1;MATCH("X";B2:D2;0))

MATCH 的最后一个 0 参数表示您正在寻找完全匹配的数据,因此不需要对数据进行排序。

【讨论】:

  • 感谢这个正确的公式!关于设计,我不符合将 lookup_vector 中的值按升序排列的重要先决条件,是的,它说它可能不会返回正确的值,但那是一种什么样的设计?
  • 这完全合乎逻辑。要使二分搜索起作用,必须对数据进行排序。如果不是,它将无法正常工作,因此您应该使用不同的功能。
【解决方案2】:

LOOKUP 执行二进制搜索,因此它返回 A。我们在 Chandoo.org 论坛上进行了长时间的讨论,您可以在此处阅读: https://chandoo.org/forum/threads/how-vlookup-works.18378/

这里还有另一个讨论:http://www.ashishmathur.com/return-an-exact-value-via-the-lookup-function/

基本上,它一直在寻找一个相等或更低的值,然后不断地对数据进行切片,因此它需要对数据进行排序。

您仍然可以通过如下调整来使用 LOOKUP。

=LOOKUP(2;1/(B2:D2="X");B$1:D$1)

【讨论】:

  • 这在我的示例中有效,但它是使用 LOOKUP 的强制方式。使用 LOOKUP 不是我的目标,所以我接受了 Rory 的回答。
  • @R.Schreurs 这很好,也更合乎逻辑。我刚刚发布了一个强制解决方法,这样如果有人想要它就会拥有它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2017-05-07
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多