此解决方案适用于迄今为止讨论的所有条件(如果有任何不适用的条件,请告诉我,我会尝试覆盖它)。
我将此作为单独的答案发布,因为先前答案中应用的公式正确地适用于其中所述的条件,因此它们将对具有这些特定场景的用户有用,因此他们不需要应用这些长公式。
此公式假设数据位于B6:E30(以确保无论源范围位置如何都可以应用它)。
这个公式使用 Index\Match 函数,它是一个公式数组。
FormulaArrays 输入按下 [Ctrl] + [Shift] + [Enter] 同时,你会看到 { 和 } 如果输入正确,则在公式周围
语法:
=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 可以在 Data 中找到,即 George、Scott 等。
Value2= Detail 可在 Data 中找到,即 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:检索Name对应Details的结束位置,由C列中的空白值或数据范围的结束决定:
MATCH("#",IF((INDEX(Col1Rng, 1 + 1stMATCH)
:INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0),
构建一个范围 (vRange):使用第一个和第二个匹配函数包含名称的详细信息。如果 2nd Match 返回错误,则它使用数据范围的最后一行:
INDEX(NamesRng, 1 + 1stMATCH )
:INDEX(NamesRng, IFERROR( 1stMATCH + 2ndMATCH, ROWS(NamesRng)))
3rd MATCH:检索Detail 在 vRange 中的位置。如果组合不存在,则返回 #NA。
IFERROR(MATCH(Value2, vRange,0), NA())
将第1个和第3个匹配函数的结果相加得到Name`Detailcombination or#NAif 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 theName\Detail\Columncombination.
If theName\Detail`组合的Row index没有找到它返回空白的。
=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)), "")