Excel 单个单元格范围的索引 + 匹配失败
Excel Index + Match failing for single cell range
我想尝试在可以包含一个或多个值的列表中找到第一个负数。我正在使用 Index/Match。当范围(或命名引用)有两个或多个单元格时,它会正确找到值。但是,当范围只有一个单元格时,它会失败。
例如
ExcelK1列和K2列的数据分别为-10.00和20.00
当我在下面尝试时,它 returns -10.00 正如预期的那样
=INDEX(K1:K2, MATCH(TRUE,K1:K2<0,0),)
但是,当我只搜索一个单元格范围时,它会失败并显示“#N/A”。我希望它 return -10.00.
=INDEX(K1:K1, MATCH(TRUE,K1:K1<0,0),)
使用包含单个单元格的命名引用时会出现同样的问题。
非常感谢
这是一个非常有趣的问题,也是一个需要相当技术性回答的问题。
基本上,MATCH 要求lookup_array 是某个"type"。这并不是说这个数组不能只包含一个元素(它可以),而是说它的形式与 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)
正确地 returns 1,因为,即使 lookup_array 这里是单个
单元格,它(因为所有工作表范围)在技术上仍然是数组类型。
但是,如果我们做一个小改动,例如:
=MATCH(1,N(A1),0)
然后,即使这解析为:
=MATCH(1,1,0)
所以看起来什么都没有改变,事实上,通过 "dereferencing" 范围引用 A1 到它的实际值,我们现在已经使它成为一个无效类型以作为 lookup_array,上面这样就报错了。
在我看来,MATCH 的这种行为往好里说是不一致,往坏里说是设计错误。
结果:
=INDEX(K1:K2,MATCH(TRUE,K1:K1<0,0),)
应该是:
=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)
无需我们通过额外的人为手段强制执行。
出于某种原因,如果传递的数组仅包含一个值,则该值首先 "resolved" 转换为非数组类型,这与那些包含多个值的数组不同,保留其数组类型。
此致
我想尝试在可以包含一个或多个值的列表中找到第一个负数。我正在使用 Index/Match。当范围(或命名引用)有两个或多个单元格时,它会正确找到值。但是,当范围只有一个单元格时,它会失败。
例如 ExcelK1列和K2列的数据分别为-10.00和20.00
当我在下面尝试时,它 returns -10.00 正如预期的那样
=INDEX(K1:K2, MATCH(TRUE,K1:K2<0,0),)
但是,当我只搜索一个单元格范围时,它会失败并显示“#N/A”。我希望它 return -10.00.
=INDEX(K1:K1, MATCH(TRUE,K1:K1<0,0),)
使用包含单个单元格的命名引用时会出现同样的问题。
非常感谢
这是一个非常有趣的问题,也是一个需要相当技术性回答的问题。
基本上,MATCH 要求lookup_array 是某个"type"。这并不是说这个数组不能只包含一个元素(它可以),而是说它的形式与 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)
正确地 returns 1,因为,即使 lookup_array 这里是单个 单元格,它(因为所有工作表范围)在技术上仍然是数组类型。
但是,如果我们做一个小改动,例如:
=MATCH(1,N(A1),0)
然后,即使这解析为:
=MATCH(1,1,0)
所以看起来什么都没有改变,事实上,通过 "dereferencing" 范围引用 A1 到它的实际值,我们现在已经使它成为一个无效类型以作为 lookup_array,上面这样就报错了。
在我看来,MATCH 的这种行为往好里说是不一致,往坏里说是设计错误。
结果:
=INDEX(K1:K2,MATCH(TRUE,K1:K1<0,0),)
应该是:
=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)
无需我们通过额外的人为手段强制执行。
出于某种原因,如果传递的数组仅包含一个值,则该值首先 "resolved" 转换为非数组类型,这与那些包含多个值的数组不同,保留其数组类型。
此致