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

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

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

当我在下面尝试时,如预期的那样返回-10.00

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

但是,当我只search一个单元格区域时,它会以“#N / A”失败。 我期望它会返回-10.00。

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

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

非常感谢

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

基本上,MATCH要求lookup_array是一个“types”。 这并不是说这个数组不能只包含一个单独的元素(它可以),而是它的forms与MATCH期望被传递的第二个参数兼容。

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

当你执行:

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

这解决了:

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

所以lookup_array ,即:

{TRUE;FALSE}

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

但是,当你执行:

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

那么这解决了:

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

这次lookup_array (TRUE)是一个单一的布尔值,它不符合这个参数types的要求。

但是,我们可以人为地强制这个单一的价值,以便它正确的types,即:

=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),)

现在单个布尔值在技术上是数组的一部分(尽pipe只包含一个值),上面的解决方法是根据需要的。

作为此行为的另一个示例,想象单元格A1包含值1.然后:

=MATCH(1,A1,0)

正确地返回1,因为即使lookup_array在这里是一个单元格,它仍然是技术上的数组types。

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

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

那么,即使这解决为:

=MATCH(1,1,0)

所以看起来根本没有任何变化,实际上,通过将范围引用A1“取消引用”到它的实际值,我们现在已经把它作为lookup_array传递给了一个无效types,因此导致了错误。

在我看来,MATCH的这种行为在最坏情况下是不一致的,并且是最差的devise错误。

的结果:

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

应该是:

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

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

出于某种原因,如果被传递的数组只包含一个值,那么这个值首先被“parsing”成一个非数组types,与那些由多个值组成的数组不同,它们的数组types是保留。

问候