使用INDEX / MATCH进行三维查找

时间:2016-09-30 14:45:24

标签: excel excel-formula

从已被删除的问题

中略微改进

对于那些可以看到已删除帖子的人,可以从这里获取: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的第一个实例。

如何修改它以寻找其他名称?

我已在下面回答,但想看看是否有人有更好的解决方案。

11 个答案:

答案 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))

![enter image description here

答案 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公式。

3 Dimensional Array Function

答案 2 :(得分:6)

您只需将两个匹配的结果一起添加即可。名称的一个匹配加上一个匹配的字母等于总行数。

= INDEX(A:d,MATCH(G5,A3:A5,0)+ MATCH(G3,A:A,0),MATCH(G4,1:1,0))

换句话说:索引(所有数据,匹配(名称,名称列,完全)+匹配(字母,字母列,完全),匹配(列名称,列行,精确)

Screen capture of working sheet

答案 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

enter image description here

我的数据集是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表示要返回的()中的哪个区域。

enter image description here

答案 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,那么PMN此公式可以完成工作:

=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

enter image description here

答案 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)), "")

enter image description here

答案 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)

当我要进行两次以上的数据搜索时,我更喜欢按图所示组织数据,以便可以使用数据透视表并根据需要将其按行和列组织数据。

然后我用GETPIVOTDATA搜索一个值。

单元格G9包含以下公式:

=GETPIVOTDATA("Value";$F$3;"Name";G15;"Letter";G16;"Column";G17)

enter image description here