从已被删除的问题
中略微改进对于那些可以看到已删除帖子的人,可以从这里获取:https://stackoverflow.com/questions/39793322/three-dimensional-lookup-no-concatenate-or-named-ranges-excel
我试图在没有命名范围或连接的情况下进行三维查找。简化,我的数据在表格中:
Column1 Column2 Column3
Scott
P 1 2 3
M 4 5 6
N 7 8 9
George
P 10 11 12
M 13 14 15
N 16 17 18
我现在想要搜索特定的名称,然后搜索该名称表中的特定字母,然后我想要将此行号与特定列匹配。
我尝试了一个简单的INDEX / MATCH:
=INDEX(A:D,MATCH("M",A:A,0),MATCH("Column1",1:1,0))
这适用于第一个名称,但不适用于任何其他名称,因为它找到M
的第一个实例。
如何修改它以寻找其他名称?
我已在下面回答,但想看看是否有人有更好的解决方案。
答案 0 :(得分:13)
您可以在第一个MATCH中使用另外两个INDEX / MATCH来设置查找范围。然后你只需要添加MATCH()来找到名称的绝对位置。
=INDEX(A:D,MATCH($H$4,INDEX(A:A,MATCH($H$3,A:A,0)):INDEX(A:A,MATCH($H$3,A:A,0)+4),0)+MATCH($H$3,A:A,0)-1,MATCH($H$5,$1:$1,0))
答案 1 :(得分:12)
我使用了IF()
语句array
公式来查找P
行之后的George
行号...我还需要使用{{1函数获取名称后面的第一个MIN()
行号。
除此之外,它是一个简单的P
功能......让我的大脑震动了一个多小时:)。
INDEX()
别忘了!
在完成公式时使用=INDEX($A$1:$D$9,MIN(IF((ROW(A1:A9)>MATCH($F$4,A1:A9,0))*(A1:A9=$F$5),ROW(A1:A9),"")),MATCH($F$6,$A$1:$D$1,0))
,因此将其评估为Ctrl+Shift+Enter
公式。
答案 2 :(得分:6)
您只需将两个匹配的结果一起添加即可。名称的一个匹配加上一个匹配的字母等于总行数。
= INDEX(A:d,MATCH(G5,A3:A5,0)+ MATCH(G3,A:A,0),MATCH(G4,1:1,0))
换句话说:索引(所有数据,匹配(名称,名称列,完全)+匹配(字母,字母列,完全),匹配(列名称,列行,精确)
答案 3 :(得分:4)
我的回答只针对一个警告尝试了一般情况:
一个字母是单字符文字,一个名字超过1个字符。否则我觉得字母和名字之间在逻辑上没有区别,那么就不可能真正做到......
重新编辑以获得更好的功能构建:
{=INDEX($A$1:$D$17, MATCH($H$3,$A1:$A17, 0)+MATCH($H$4, INDEX($A1:$A17, MATCH($H$3,$A1:$A17, 0)):INDEX($A:$A, SMALL(IFERROR(MATCH($H$3,$A1:$A17, 0)+POWER(SQRT(IF(LEN($A$1:$A$17)>1, ROW($A$1:$A$17), 0)-MATCH($H$3,$A$1:$A$17, 0)), 2)-1, ROWS($A$1:$A$17)), 2)), 0)-1, MATCH($H$5, $A$1:$D$1, 0))}
这使用A列的数组公式,并检查长度是否> 1并将行nums抛出一个数组,字母为0。
然后从每个名称中删除匹配的唯一名称行(例如乔治)。
然后我们使用min(所有其他名称行,最后一个数据行作为最终默认值 - 带有2个参数的SMALL函数)来查找下一个名称行(如果没有以下名称,则找到最后一个数据行)。
休息是标准索引/匹配等。
如果所选名称下没有此类字母,它将正确返回#N / A
我的数据集是A1:A17,公式可以每次都使用A:A,但IF中的数组calc需要A1:A17来获得速度。
编辑以获得更好的功能构建:
如果我们想避免在数据长度发生变化时编辑公式,那么我们可以让A:A的完整列引用遍历整个构造(并且失去速度/效率),并通过ROWS计算colA中的最后一个数据行(A:A):
<强>重新编辑:强>
{=INDEX($A:$D, MATCH($H$3,$A:$A, 0)+MATCH($H$4, INDEX($A:$A, MATCH($H$3,$A:$A, 0)):INDEX($A:$A, SMALL(IFERROR(MATCH($H$3,$A:$A, 0)+POWER(SQRT(IF(LEN($A:$A)>1, ROW($A:$A), 0)-MATCH($H$3,$A:$A, 0)), 2)-1, ROWS($A:$A)), 2)), 0)-1, MATCH($H$5,1:1, 0))}
这实际上取决于设置......
再次编辑将空格作为名称分隔符的版本
如果你想使用空格作为名称的分隔符,数据结果中没有空格,但是空格出现在有名称的B到D列中,那么上述公式中的微小变化将导致:
=INDEX($A$1:$D$17, MATCH($H$3,$A$1:$A$17, 0)+MATCH($H$4, INDEX($A:$A, MATCH($H$3,$A:$A, 0)):INDEX($A:$A, SMALL(IFERROR(MATCH($H$3,$A:$A, 0)+POWER(SQRT(IF($B$1:$B$17="", ROW($A$1:$A$17), 0)-MATCH($H$3,$A$1:$A$17, 0)), 2)-1, ROWS($A$1:$A$17)), 2)), 0)-1, MATCH($H$5, $A$1:$D$1, 0))
这意味着名称和字母不必是任何指定的长度,但只有一个条件是空白出现在名称的行中。
对条件的一个小修正,找到结束范围来搜索该字母,将其替换为:SQRT(IF(LEN($A$1:$A$17)>1,
:
SQRT(IF($B$1:$B$17="",
答案 4 :(得分:2)
我会使用Index()的区域(第4个参数)。以下是测试数据的屏幕截图。此示例假定相同的列和键已排序且一致。
这可以通过使用(Range1,Range2)作为索引的第一个参数来实现。对于索引的第4个参数,使用N表示要返回的()中的哪个区域。
答案 5 :(得分:2)
我认为这可能稍微整洁一些,也许更容易修改。
=INDEX(OFFSET(INDIRECT("A"&MATCH($H$3,$A:$A,0),TRUE),0,0,4,4),MATCH($H$4,$A:$A,0),MATCH(H5,$1:$1,0))
首先使用偏移来创建范围,我们可以使用H3中的名称进行设置,然后我们就可以在新范围内进行索引。
现在,这仍然依赖于留在A栏的名字。
答案 6 :(得分:2)
假设数据的格式始终是Name
,那么P
,M
和N
此公式可以完成工作:
=INDEX($A:$D,
MATCH($H$3,$A:$A,0)
+LOOKUP($H$4,{"P",1;"M",2;"N",3}),
MATCH($H$5,$1:$1,0))
答案 7 :(得分:2)
此解决方案适用于几乎所有条件。我找到的一个限制是,其中一个主题(姓名)没有任何细节(字母)的数据,但截至目前,所有其他答案都是如此。
公式假设数据位于q::
Send asdq
Esc::ExitApp
return
(为了确保无论源范围位置如何都可以应用数据)。
公式使用Index \ Match函数:
首先,使用MATCH检索B6:F30
:
Name
使用该信息,它使用INDEX构建一个范围,用于使用第二个MATCH函数获取MATCH($H8,$B$6:$B$30,0)
(字母)的位置:
Detail
添加第一个和第二个MATCH函数的结果可获得+ MATCH($I8,INDEX($B$6:$B$30, 1 + MATCH($H8,$B$6:$B$30,0))
:INDEX($B$6:$B$30,ROWS($B$6:$B$30)),0),
`Detail`组合的位置,并在索引中将其用于整个数据。所需数据列的位置通过匹配获得:
Name
结果位于INDEX($B$6:$F$30, 1st.MATCH + 2nd.MATCH,
MATCH(J$6,$B$6:$F$6,0))
,在G6:L30
中输入此公式,然后复制到J8
:
J8:L30
答案 8 :(得分:1)
此解决方案适用于目前讨论的所有条件(让我知道它不起作用的任何条件,我将尝试覆盖它)。 我将此作为单独的答案发布,因为在先前答案中应用的公式正确地适用于它们中所述的条件,因此它们对于具有这些特定方案的用户将是有用的,因此他们不需要应用这些长公式。
此公式假设数据位于B6:E30
(为了确保无论源范围位置如何都可以应用)。
此公式使用Index \ Match函数,它是一个公式数组。
同时按 [Ctrl]
+ [Shift]
+ [Enter]
输入FormulaArrays,如果输入正确,您将在公式周围看到 {
和 }
<强>语法:强>
=IFERROR(INDEX(DataRng,
MATCH(Value1,NamesRng,0)
+IFERROR(MATCH(Value2,INDEX(NamesRng,
1+MATCH(Value1,NamesRng,0))
:INDEX(NamesRng, IFERROR(MATCH(Value1,NamesRng,0)
+MATCH("#",IF((INDEX(Col1Rng,1+MATCH(Value1,NamesRng,0))
:INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0),
ROWS(NamesRng))),0),NA()),MATCH(ValCol,DataHdr,0)),"")
<强>参数:强> 假设数据位于B6:E30。
在数据中找到 Value1
= Name
,即George,Scott等。
Value2
= Detail
,即Detail1,Detalle2等。
ValCol
= Column
,即Column1,Column2等。
DataRng
= $B$6:$E$30
DataHdr
= $B$6:$E$6
NamesRng
= $B$6:$B$30
Col1Rng
= $C$6:$C$30
1st MATCH :检索名称的位置:
MATCH(Value1,NamesRng,0)
2nd MATCH :检索名称相应详细信息的结束位置,该结果由列C
中的空白值或数据范围的结尾确定:
MATCH("#",IF((INDEX(Col1Rng, 1 + 1stMATCH)
:INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0),
构建范围(vRange):使用名称的详细信息使用第1和第2匹配函数。如果第二次匹配返回错误,则它使用数据范围的最后一行:
INDEX(NamesRng, 1 + 1stMATCH )
:INDEX(NamesRng, IFERROR( 1stMATCH + 2ndMATCH, ROWS(NamesRng)))
3rd MATCH :检索vRange中Detail
的位置。如果组合不存在,则返回#NA
。
IFERROR(MATCH(Value2, vRange,0), NA())
添加第1和第3个匹配函数的结果获取Name
`详细信息combination or
#NA if no found.
The Column index is obtained with a Match from the Header of the Data.
It then applying the INDEX function to the Data Range returns the value of the
名称\详细信息\列combination.
If the
名称\的行索引未找到Detail`组合,它返回空白。
=IFERROR( INDEX( DataRng, 1stMATCH + 3rdMATCH, MATCH(Column,DataHdr,0)),"")
结果位于H6:L37在J8中输入此公式数组然后复制到K8:L37和J9:L37:
=IFERROR( INDEX($B$6:$E$30,
MATCH($H8,$B$6:$B$30,0)
+IFERROR( MATCH($I8, INDEX($B$6:$B$30,
1+MATCH($H8,$B$6:$B$30,0))
:INDEX($B$6:$B$30, IFERROR(MATCH($H8,$B$6:$B$30,0)
+MATCH("#", IF((INDEX($C$6:$C$30,1+MATCH($H8,$B$6:$B$30,0))
:INDEX($C$6:$C$30,ROWS($B$6:$B$30)))="","#","!"),0),
ROWS($B$6:$B$30))),0),NA()),
MATCH(J$6,$B$6:$E$6,0)), "")
答案 9 :(得分:0)
我认为更简单的解决方案可能是使用偏移来获得更通用的答案。
=INDEX($A$1:$D$9, MATCH($G$3,OFFSET($A$1,MATCH($G$2,$A$1:$A$9,0),0,3,1),0)+MATCH($G$2,$A$1:$A$9,0), MATCH($G$4,$B$1:$D$1,0)+1)
要查找的唯一变量是3,即存在的M / N / P选项数,因为这会影响行数。否则,该解决方案在所有可能的场景和不同的订单中都能正常工作。
答案 10 :(得分:0)