Excel 使用索引/匹配的三维查找

Excel 使用索引/匹配的三维查找,excel,excel-formula,Excel,Excel Formula,这是一个被删除的问题,从中略作改进 对于那些可以看到已删除帖子的人,这是从这里拍摄的: 我正在尝试在没有命名范围或连接的情况下进行三维查找。简而言之,我的数据在以下表格中: Column1 Column2 Column3 Scott P 1 2 3 M 4 5 6 N 7 8 9 George P 10 11 12 M 13

这是一个被删除的问题,从中略作改进

对于那些可以看到已删除帖子的人,这是从这里拍摄的:


我正在尝试在没有命名范围或连接的情况下进行三维查找。简而言之,我的数据在以下表格中:

    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(A:D,MATCH("M",A:A,0),MATCH("Column1",1:1,0))
这适用于第一个名字,但不适用于任何其他名字,因为它找到了
M
的第一个实例

如何修改它以查找其他名称



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

您可以在第一个匹配中使用另外两个索引/匹配来设置查找范围。然后只需添加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(F4,INDEX(A:A,MATCH(F3,A:A,0)):A1040000,0)+MATCH(F3,A:A,0)-1,MATCH(F5,A1:D1,0))

我将使用Index()的面积(第四个参数)。下面是测试数据的屏幕截图。本例假设相同的列和键已排序且一致

这是通过使用(Range1,Range2)作为索引的第一个参数来实现的。对于index的第4个参数,使用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))
首先使用偏移量创建范围,我们可以使用H3中的名称来设置该范围,然后在该范围之外,我们只是在该新范围内建立索引


现在,这仍然取决于名称是否保留在A列中。

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

我的回答尝试了一般情况,但只有一个警告:

一个字母是单字符文本,一个名字不止一个字符。否则,我觉得字母和名字在逻辑上没有区别,那么就不可能真正做到

重新编辑以获得更好的功能结构:

{=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))}
=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)),"")
这将沿列A使用数组公式,并检查长度是否大于1,并将行nums抛出到数组中,字母为0

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

然后,我们使用一个min(所有其他名称行中,最后一个数据行作为最终默认值-带2个参数的小函数)来查找下一个名称行(如果没有后续名称,则使用最后一个数据行)

其余为标准索引/匹配等

如果所选名称下没有此类字母,它将正确返回N/A…

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

编辑以获得更好的功能结构:

{=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))}
=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)),"")
如果我们希望避免在数据长度发生变化时编辑公式,那么我们可以让A:A的完整列引用通过行(A:A)计算colA中的最后一个数据行来遍历整个构造(并失去速度/效率):

重新编辑:

{=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))}
=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)),"")
这真的取决于设置

再次编辑以空格作为名称分隔符的版本

如果要使用空格作为名称的分隔符,其中数据结果中没有空格,但有名称的列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,0)>

这意味着名称和字母不必是任何指定的长度,但唯一的限制条件是,名称所在行中出现空格

=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))
对搜索字母的结束范围的条件进行了一个小的修改,将其替换为:
SQRT(IF(LEN($A$1:$A$17)>1,


SQRT(如果($B$1:$B$17=“”,

您只需将两个匹配的结果相加即可完成此操作。名称的一个匹配加上字母的一个匹配等于总行

=索引(A:D,匹配(G5,A3:A5,0)+匹配(G3,A:A,0),匹配(G4,1:1,0))

换句话说:索引(所有数据,匹配(Name,In Name column,exact)+匹配(Letter,In Letter column,exact),匹配(column Name,In column row,exact)

我使用
IF()
语句
array
公式来查找
p
行号在
George
行之后是什么…我还需要使用
MIN()
函数来获取名称之后的第一个
p
行号

=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$1:$D$9,MIN)(如果((行(A1:A9)>匹配($F$4,A1:A9,0))*(A1:A9=$F$5),行(A1:A9),“”),匹配($F$6,$A$1:$D$1,0))

别忘了!
完成公式时,请使用
Ctrl+Shift+Enter
,这样它将作为
数组
公式进行计算


这个解决方案几乎适用于所有情况。我发现的一个限制是,其中一个受试者(姓名)没有任何详细信息(字母)的数据,但到目前为止,所有其他答案都是如此

该公式假设数据位于
B6:F30
(以确保无论震源范围位置如何都可以应用该数据)

公式使用索引\匹配函数:

首先,检索
名称的位置的匹配:

MATCH($H8,$B$6:$B$30,0)
利用该信息,它使用索引来构建一个范围,该范围用于使用第二个匹配函数获取
详细信息
(字母)的位置:INDEX(NamesRng, 1 + 1stMATCH )
:INDEX(NamesRng, IFERROR( 1stMATCH + 2ndMATCH, ROWS(NamesRng)))
IFERROR(MATCH(Value2, vRange,0), NA())
=IFERROR( INDEX( DataRng, 1stMATCH + 3rdMATCH, MATCH(Column,DataHdr,0)),"")
=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)), "")
=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)