好吧,实际上并不是导致错误的顺序,而是因为您没有任何结果!您使用的公式试图找到-159-
它在年龄表中根本找不到的。你真的需要一些东西来查看范围,所以如果你有 159,当你尝试匹配时它会返回一个肯定的结果139-160
。
我已经制作了一个从较小的公式构建它的公式,但是在组装时,重复单元使它令人生畏......而且,它是一个数组公式,所以你需要使用Ctrl++Shift才能Enter按预期工作。您仍然可以向下拖动公式。
=INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),
IFERROR(
MATCH(
C7,
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)*1,
0
),
MATCH(
1,
IF(
1*LEFT(
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
),
FIND(
"-",
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
),
FIND(
"-",
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
单行版本...
=INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),IFERROR(MATCH(C7,INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0))*1,0),MATCH(1,IF(1*LEFT(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))-1)<=C7,1,0)*IF(1*MID(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))+1,100)>=C7,1,0),0)))
您会注意到有一些重复的块,即:
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36")
对于工作表名称;
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
这是一个更大的块,使公式更加灵活(它会自动选择正确的列,例如,如果您将 B8 更改Exclusion
为Col1
,公式将自动调整自身)
如果我调用 firstSheet
和 second Column
,它会变得更短,也许更容易理解:
=INDEX(
Sheet,
IFERROR(
MATCH(
C7,
Column*1,
0
),
MATCH(
1,
IF(
1*LEFT(
Column,
FIND(
"-",
Column
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
Column,
FIND(
"-",
Column
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
或者
=INDEX(Sheet,IFERROR(MATCH(C7,Column*1,0),MATCH(1,IF(1*LEFT(Column,FIND("-",Column)-1)<=C7,1,0)*IF(1*MID(Column,FIND("-",Column)+1,100)>=C7,1,0),0)))
免责声明:我不确定是否有任何方法可以使它更短,但我想只要它现在可以工作^^
您可以在此处下载更新后的表格。
解释:
正如我之前提到的,该公式基于几个较小的公式和相当多的重复。
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36")
如您所知(这是您自己公式的一部分的变体),这给出了包含所有不同年龄的区域。使用它和下面的,我们得到这个:
INDEX(
INDIRECT('"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
进入:
INDEX(
'Sheet'!B6:J36,
0,
MATCH(B7,'Sheet'!B5:J5,0)
)
因此,索引将查看范围'Sheet'!B6:J36
,0
指示它将采用任何列并通过获取(在电子表格的情况下,)的值并查看它来返回MATCH(B7,'Sheet'!B5:J5,0)
第n列。因此,上面将返回 range 。让我们把它放在公式中:B7
Col1
'Sheet'!B5:J5
1
'Sheet'!B6:B36
=INDEX(
'Sheet'!A6:A36,
IFERROR(
MATCH(
C7,
'Sheet'!B6:B36*1,
0
),
MATCH(
1,
IF(
1*LEFT(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
这个公式本身就是一个巨大的INDEX
公式,以范围'Sheet'!A6:A36
和行号为大IFERROR
组。IFERROR()
首先评估的第一部分:
MATCH(
C7,
'Sheet'!B6:B36*1,
0
)
这应该很容易理解。它在我们之前获得的范围内查找原始分数(从C7
),乘以 1 以将所有内容转换为数字(您不能查找数字和文本并期望匹配)。因此,如果数字完全匹配,它将返回找到的原始分数的行号并将其提供给INDEX()
. 例如,如果返回第一行,我们得到:
=INDEX('Sheet'!A6:A36,1)
这是'Sheet'!B6
。但是,如果没有匹配项(即无法找到原始分数),MATCH
将返回错误。这就是第二部分IFERROR
发挥作用的时候:
MATCH(
1,
IF(
1*LEFT(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)+1,
100
)>=C7,
1,
0
)
,0
)
这MATCH
试图1
在似乎是两个IF
s 中找到;第一个是:
IF( 1*LEFT('Sheet'!B6:B36,FIND("-",'Sheet'!B6:B36)-1)<=C7 , 1 , 0)
FIND("-",'Sheet'!B6:B36)-1
-
获取列中前最后一个字符的位置'Sheet'!B6:B36
。
使用这些值,这FIND
将返回:
12-13 -> 2
145-155 -> 3
1567-1865 -> 4
因此IF
变成:
IF( 1*LEFT('Sheet'!B6:B36,{2,3,4})<=C7 , 1 , 0)
注意这里的大括号;它们表示一个数组,这就是为什么这是一个数组公式。LEFT
然后提取之前的所有字符-
(记住你的另一个问题,我用与此非常相似的技术回答):
12-13 -> 2 -> 12
145-155 -> 3 -> 145
1567-1865 -> 4 -> 1567
哪个是...
IF( 1*{12,145,1567}<=C7 , 1 , 0)
同样,1*
将这些转换为实际数字,因为LEFT
默认返回文本字符。这样做很重要,因为我们将使用比较器<=
,因此如果C7
(原始分数)左侧的值,那么 IF 应该返回1
,否则,它应该返回0
。假设原始分数是154
. 结果将是:
IF( {12,145,1567}<=154 , 1 , 0)
IF( {TRUE,TRUE,FALSE} , 1 , 0)
{1,1,0}
我刚刚意识到公式可以缩短一点 xD 无论如何,我们稍后会看到。下一个IF
行为类似,但检查右侧的值-
:
IF( 1*MID('Sheet'!B6:B36,FIND("-",'Sheet'!B6:B36)+1,100)>=C7 , 1 , 0)
使用...查找 MID('Sheet'!B6:B36, X, 100) 12-13 -> 4 -> 13 145-155 -> 5 -> 155 1567-1865 -> 6 -> 1865
您会注意到,如果此处的内容超过 100 个字符,则此公式将停止工作。无论如何,IF
因此变成:
IF( {13,155,1865}>=154 , 1 , 0)
IF( {FALSE,TRUE,TRUE} , 1 , 0)
{0,1,1}
现在我们有了这些,MATCH
从之前变成:
MATCH( 1 , {1,1,0}*{0,1,1} , 0)
一些简单的数学运算使它变成:
MATCH( 1 , {0,1,0} , 0)
那里的位置是什么1
?没错,就是2号位!
我们原来的公式变成:
=INDEX( 'Sheet'!A6:A36 , IFERROR( #Error! , 2 ) )
因此,如果一开始什么也没找到,它将返回一个错误(#N/A
在这种情况下),而是返回2
。=INDEX( 'Sheet'!A6:A36 , 2 )
给'Sheet'!A7
.
略短的版本是:
=INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),IFERROR(MATCH(C7,INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0))*1,0),MATCH(1,(1*LEFT(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))-1)<=C7)*(1*MID(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))+1,100)>=C7),0)))
我实际上删除了内部IF
s,因为在 excel 中乘以给定后(a>b)*(c>b)
已经返回 0 和 1 。TRUE
TRUE
1