簡體   English   中英

使用 INDEX/MATCH 進行三維查找

[英]Three Dimensional Lookup Using INDEX/MATCH

這是從已被刪除的問題中采取並略有改進的

對於那些可以看到已刪除帖子的人,它來自這里: 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(A:D,MATCH("M",A:A,0),MATCH("Column1",1:1,0))

這適用於拳頭名稱,但不適用於其他任何名稱,因為它找到了M的第一個實例。

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


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

您可以在第一個 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(F4,INDEX(A:A,MATCH(F3,A:A,0)):A1040000,0)+MATCH(F3,A:A,0)-1,MATCH(F5,A1:D1,0))

在此處輸入圖片說明

我使用IF()語句array公式來查找George行之后的P行號……我還需要使用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公式。

3維數組函數

您只需將兩個匹配項的結果相加即可。 名稱的一項匹配加上字母的一項匹配等於總行。

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

換句話說:索引(所有數據,匹配(名稱,名稱列,精確)+匹配(字母,字母列,精確),匹配(列名稱,列行中,精確)

工作表的屏幕截圖

我的回答嘗試了一般情況,只有一個警告:

一個字母是單字符文本,而一個名字是超過 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(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, with this:

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

我會使用 Index() 的區域(第 4 個參數)。 下面是測試數據的截圖。 此示例假定相同的列和鍵已排序且一致。

這是通過使用 (Range1,Range2) 作為索引的第一個參數來實現的。 對於index的第4個參數,對於()中你希望Index返回的區域使用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然后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))

此解決方案適用於幾乎所有條件。 我發現的一個限制是當其中一個主題(姓名)沒有任何細節(字母)的數據時,但截至目前,所有其他答案都會發生同樣的情況。

該公式假定數據位於B6:F30 (以確保無論源范圍位置如何都可以應用它)。

該公式使用 Index\\Match 函數:

首先,一個 MATCH 來檢索Name的位置:

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

有了這些信息,它使用 INDEX 來構建一個范圍,該范圍用於使用第二個 MATCH 函數獲取Detail (字母)的位置:

+ 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:L30的結果在J8輸入此公式,然后復制到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)),"")

在此處輸入圖片說明

此解決方案適用於迄今為止討論的所有條件(讓我知道它不起作用的任何條件,我將嘗試涵蓋它) 我將此作為單獨的答案發布,因為先前答案中應用的公式正確適用於其中所述的條件,因此它們對具有這些特定場景的用戶很有用,因此他們不需要應用這些長公式。

此公式假定數據位於B6:E30 (以確保無論源范圍位置如何都可以應用它)

此公式使用 Index\\Match 函數,它是一個公式數組。

同時按[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 = 要在 Data 中找到的Name ,即 George、Scott 等。

Value2 = 要在 Data 中找到的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

第一場比賽:檢索姓名的位置:

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 `Detail 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 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` 組合,則返回空白。

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

在此處輸入圖片說明

哇...已經有這么多解決方案了。

我認為一個更簡單的解決方案可能是使用偏移量來獲得更通用的答案。

=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 選項的數量,因為這會影響行數。 否則,該解決方案在所有可能的場景和不同的順序中都能正常工作。

當我有兩個以上的數據搜索輸入時,我更喜歡按圖中所示組織數據,這樣我就可以使用數據透視表並讓它按照我喜歡的方式組織行和列中的數據。

然后我使用GETPIVOTDATA來搜索一個值。

單元格G9包含以下公式:

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

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM