使用INDEX / MATCH进行三维查找

这个问题已经被删除,并从已经被删除的问题中略有改进

对于那些可以看到删除post,这是从这里采取: 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 

我现在想search一个特定的名称,然后在该名称表中的特定字母,然后我想匹配此行号与特定的列。

我尝试了一个简单的INDEX / MATCH:

 =INDEX(A:D,MATCH("M",A:A,0),MATCH("Column1",1:1,0)) 

这对于拳头的名字是有效的,但是对于M的第一个例子来说却没有其他的效果。

如何修改它以查找不同的名称?


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

我使用了一个IF()语句array公式来查找P行号是在George行之后的…我还需要使用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 ,所以它被评估为一个array公式。

三维数组函数

您可以在第一个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)) 

![在这里输入图片描述

只需将两个匹配的结果相加即可。 一个匹配的名字加上一个匹配的字母等于总行。

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

换句话说:索引(所有数据,匹配(姓名,姓名列,精确)+匹配(字母,字母列,精确),匹配(列名,在列行中,确切)

工作表的屏幕截图

我的答案只是一个警告,

一个字母是单个字符的文本,一个名字是多于一个字符。 否则我觉得在字母和名字之间逻辑上没有什么区别,那么真的不可能做到…

重新编辑更好的functionbuild设:

 {=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,并将行num放入数组中,并给出0的字母。

然后匹配行的唯一名称(例如George)从每个中减去。

然后,我们使用min(所有其他名称行,最后一个数据行作为最后一个默认值 – 具有2个参数的SMALL函数)来查找下一个名称行(如果没有以下名称,则为最后一个数据行)。

其余是标准指数/比赛等

如果在所选名称下没有这样的字母,它将正确地返回#N / A …

在这里输入图像描述

我的数据集是A1:A17,公式可以每次都使用A:A,但是IF中的数组需要A1:A17来提高速度。

编辑更好的functionbuild设:

如果我们想避免在数据长度变化时编辑公式,那么我们可以让A:A的全列参考遍历整个构造(并且失去速度/效率),通过ROWS(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,的条件,find结束范围来search该信件的一个小修改:

SQRT(IF($B$1:$B$17="",

我将使用Index()的区域(第四个参数)。 以下是testing数据的截图。 这个例子假定相同的列和键被sorting和一致。

这通过使用(Range1,Range2)作为索引的第一个参数来工作。 对于索引的第四个参数,使用N代表你想索引返回的()中的哪个区域。

在这里输入图像说明

我认为这可能会稍微更整洁一点,也可能稍微修改一下。

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

首先使用偏移量来创build范围,我们可以使用H3中的名称来设置,然后超出这个范围,我们只是在这个新的范围内索引。

现在这个名字仍然停留在A列。

假设数据的格式总是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)) 

该解决scheme几乎适用于所有情况。 我发现的一个限制是,当一个主题(名称)没有任何细节(字母)的数据时,但是到现在为止所有其他答案都是一样的。

该公式假定数据位于B6:F30 (为了确保它可以应用,无论源范围位置如何)。

该公式使用Index \ Match函数:

首先,一个MATCH来检索Name的位置:

 MATCH($H8,$B$6:$B$30,0) 

有了这个信息,它使用INDEX来build立一个范围,用来获取Detail (字母)的位置使用第二个MATCHfunction:

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

添加第一个和第二个MATCH函数的结果,获得Name “Detail”组合的位置并将其用于整个数据的索引。 所需数据列的位置是通过匹配获得的:

 INDEX($B$6:$F$30, 1st.MATCH + 2nd.MATCH, MATCH(J$6,$B$6:$F$6,0)) 

结果位于G6:L30J8input此公式,然后复制到J8:L30

 = INDEX( $B$6:$F$30, MATCH( $H8, $B$6:$B$30, 0) +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), MATCH( J$6, $B$6:$F$6, 0)),"") 

在这里输入图像说明

这个解决scheme适用于目前为止所讨论的所有条件(让我知道任何条件,它不起作用,我会尽力掩盖它) 。 我把这个作为一个单独的答案发布,因为在先前的答案中使用的公式正确地适用于他们所陈述的条件,因此这些对于具有这些特定情况的用户是有用的,所以他们不需要应用这些长的公式。

该公式假设数据位于B6:E30 (为了确保它可以应用,不pipe源范围位置如何)

此公式使用Index \ Match函数,它是一个公式数组。

同时按下 [Ctrl] + [Shift] + [Enter] [Shift] inputFormulaArra 如果input正确,则会在公式周围 看到 { }

句法:

 =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 =在Data中可以find的细节,例如Detail1,Detalle2等

ValCol =在数据中find的ColumnColumn 1, Column 2等

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) 

第二次匹配 :检索名称的相应详细信息的结束位置,由列C的空白值或数据范围的结尾确定:

 MATCH("#",IF((INDEX(Col1Rng, 1 + 1stMATCH) :INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0), 

构build一个范围(vRange) :使用第一个和第二个匹配函数的名称的详细信息。 如果2nd Match返回错误,则使用Data范围的最后一行:

 INDEX(NamesRng, 1 + 1stMATCH ) :INDEX(NamesRng, IFERROR( 1stMATCH + 2ndMATCH, ROWS(NamesRng))) 

3rd MATCH :检索vRange中Detail的位置。 如果组合不存在,则返回#NA

 IFERROR(MATCH(Value2, vRange,0), 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 ,则获得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 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 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 Name \ Detail \ Column combination. If the combination. If the Name \ Detail组合未find,则返回空白。

 =IFERROR( INDEX( DataRng, 1stMATCH + 3rdMATCH, MATCH(Column,DataHdr,0)),"") 

结果位于H6:L37在J8中input此公式数组,然后复制到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)), "") 

在这里输入图像描述

哇…已经有很多解决scheme了。

我认为一个更简单的解决scheme可以使用偏移来获得更通用的答案。

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

唯一要查找的variables是3,这是M / N / P选项的数量,因为这会影响行数。 否则,解决scheme在所有可能的情况下和不同的订单中工作正常。