单个单元格范围的Excel索引+匹配失败

时间:2015-04-16 07:30:58

标签: excel match

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

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

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

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

然而,当我只搜索一个单元格范围时,它会失败,并且#N; A&#34;。我希望它能返回-10.00。

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

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

非常感谢

1 个答案:

答案 0 :(得分:4)

这是一个非常有趣的问题,需要一个技术性答案。

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

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

执行时:

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

这解决了:

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

所以 lookup_array ,即:

{TRUE;FALSE}

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

但是,执行时:

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

然后这解决了:

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

这次 lookup_array (TRUE)是一个布尔值,不符合对此参数类型的要求。

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

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

这次解决了:

=INDEX(K1:K2,MATCH(TRUE,{-10})<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传递的无效类型,上面因此导致错误。

在我看来,MATCH的这种行为最多是不一致的,最糟糕的是设计错误。

结果:

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

应该

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

没有我们不得不通过额外的人工手段强迫它。

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

此致