【问题标题】:Excel Index + Match failing for single cell range单个单元格范围的 Excel 索引 + 匹配失败
【发布时间】:2015-04-16 07:30:58
【问题描述】:

我正在寻找可以包含一个或多个值的列表中的第一个负数。我正在使用索引/匹配。当范围(或命名引用)具有两个或多个单元格时,它会正确找到该值。但是,当范围只有一个单元格时,它会失败。

例如 Excel K1 和 K2 列的数据分别为 -10.00 和 20.00

当我在下面尝试时,它按预期返回 -10.00

=INDEX(K1:K2, MATCH(TRUE,K1:K2<0,0),)

但是,当我只搜索一个单元格区域时,它会失败并显示“#N/A”。我希望它返回 -10.00。

=INDEX(K1:K1, MATCH(TRUE,K1:K1<0,0),)

使用包含单个单元格的命名引用时会出现同样的问题。

非常感谢

【问题讨论】:

  • 请看answer
  • 建议的解决方案仅适用于范围内多于一行的情况。我试图理解为什么这些公式在单行范围内失败。 =INDEX(range,MATCH(TRUE,range&lt;0,0))

标签: excel match


【解决方案1】:

这是一个非常有趣的问题,而且需要相当技术性的回答。

基本上,MATCH 要求 lookup_array 是某种“类型”。这并不是说这个数组不能只包含一个元素(它可以),而是说它的形式与 MATCH 期望为其第二个参数传递的形式兼容。

这种可接受的形式可以是值数组,也可以是对(连续)一维工作表单元格范围的引用。

当你表演时:

=INDEX(K1:K2,MATCH(TRUE,K1:K2&lt;0,0),)

这会解析为:

=INDEX(K1:K2,MATCH(TRUE,{TRUE;FALSE},0),)

等等lookup_array,即:

{TRUE;FALSE}

是一个数组,即可接受的形式。

但是,当你执行时:

=INDEX(K1:K2,MATCH(TRUE,K1:K1&lt;0,0),)

然后这会解析为:

=INDEX(K1:K2,MATCH(TRUE,TRUE,0),)

而这次lookup_array (TRUE) 是一个单一的布尔值,不满足对该参数的类型的要求。

但是,我们可以人为地强制该单个值,使其 属于正确的类型,即:

=INDEX(K1:K2,MATCH(TRUE,IF({1},K1:K1)&lt;0,0),)

这次解析为:

=INDEX(K1:K2,MATCH(TRUE,{-10})&lt;0,0),)

这是:

=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)

现在单个布尔值在技术上是数组的一部分(尽管它只包含一个值),上面的内容可以根据需要进行解析。

作为此行为的另一个示例,假设单元格 A1 包含值 1。然后:

=MATCH(1,A1,0)

正确返回 1,因为即使 lookup_array 在这里是一个 单元格,它(就像所有工作表范围一样)在技术上仍然是数组类型。

但是,如果我们做一个小改动,例如:

=MATCH(1,N(A1),0)

那么,即使这会解析为:

=MATCH(1,1,0)

所以看起来什么都没有改变,事实上,通过将范围引用 A1 “取消引用”到它的实际值,我们现在使它成为一个无效的类型,作为 lookup_array em>,因此上述导致错误。

在我看来,MATCH 的这种行为充其量是不一致的,最坏的情况是设计错误。

结果:

=INDEX(K1:K2,MATCH(TRUE,K1:K1&lt;0,0),)

应该是:

=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)

我们不必通过额外的人为手段强制它。

由于某种原因,如果被传递的数组只包含一个值,那么这个值首先被“解析”为非数组类型,这与包含多个值的数组不同,它们的数组-type 被保留。

问候

【讨论】:

  • 感谢您非常详细的解释。这是一个有趣的。
猜你喜欢
  • 2019-10-28
  • 2018-04-13
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多