簡單學習MATCH與INDEX的組合
在VLOOKUP向左轉的系列文章中,介紹了如何破解VLOOKUP函數在查詢資料後,僅能由左往右擷取資料的限制,其實,透過MATCH函數與INDEX函數的組合,往右、往左擷取資料也都是可以輕鬆達陣的喔!先來看看MATCH函數的特性吧!MATCH函數的語法為:
=MATCH(查詢值,比對表,查詢選項)
此函數的特性是將第1個參數「查詢值」與第2個參數「查詢陣列(比對表)」裡的資料進行比對,至於「比對類型」,也就是比對選項(比對邏輯),到底是大於、小於、還是等於才算查找到資料,就由第3個參數來決定囉!若有查找到符合的資料,則傳回該資料位於陣列裡的相對位置。也就是說,若是查找到符合的資料,並不是將該資料回傳,而是傳回該資料的所在位置。例如:要在[工號]欄位裡查找「Q3330」,透過MATCH函數進行完全比對的查詢,便可以傳回「6」,這個查詢結果便表示「Q3330」正位於[工號]欄位裡的第6個元素。
所以,以下圖所示為例,若是查找「Q2114」,透過MATCH函數進行完全比對的查詢,便可以傳回「3」,這個查詢結果便表示「Q2114」正位於[工號]欄位裡的第3個元素。
如果是進行完全符合的比對,而且輸入了一個實際上並不存在的工號,則MATCH函數便會傳回「#N/A」的訊息。
所以,MATCH函數是用來查找、比對所要查詢的資料是否存不存在的函數,並不是直接將查找到的資料傳回儲存格裡。因此,若MATCH函數所傳回的是一個整數值,那麼便意味著有找到符合需求的資料,若是傳回「#N/A」訊息,便代表找不到資料囉!
至於使用MATCH查找到資料後,所傳回的相對位置是個整數值,而這個數值有什麼意義?有什麼用呢?其實,看看資料表裡各個資料欄位的相對位置,如果,工號「Q3330」是位於[工號]欄位裡的第「6」個位置,那麼,[姓名]欄位裡的第「6」個元素不正就是工號「Q3330」的姓名嗎?同理,[年資]欄位裡的第「6」個元素不正就是工號「Q3330」的年資嗎?
依此類推,我們若將MATCH函數所傳回的整數值,當作範圍(陣列)的座標,以索引資料的概念,來擷取該範圍(陣列)第某個元素內容不就好了嗎?沒錯,這個索引指定範圍(陣列)內容的函數,就叫做INDEX函數。說得更白話一點,INDEX函數就是用來取得某指定範圍裡第幾個儲存格內容的函數。其語法為:
=INDEX(陣列, 列索引值, [欄索引值])
以下圖所示的範例為例,若是以一維陣列的概念來說:
=INDEX(A2:A8,6)
便是傳回「台中」
=INDEX(B3:E3,3)
便是傳回「105」
當然,若給予錯誤的索引值,則無法順利索引到資料,例如:
=INDEX(D2:D8,8)
便會傳回「#REF!」
表示參照錯誤之意~
若是以二維陣列的角度來說:
=INDEX(A1:E8,5,4)
便是傳回「62」
=INDEX(B2:E8,5,3)
便是傳回「103」
當然,若給予錯誤的索引值,則無法順利索引到資料,例如:
=INDEX(B2:E8,3,6)
便會傳回「#REF!」
表示參照錯誤之意~
對照到我們先前所提的範例,若要取得姓名欄位裡的第9個名字,則INDEX(姓名,9)便可以如願以償。若要取得年資欄位裡的第3個年資,則INDEX(年資,3)也是蛋糕一塊!
想想,MATCH函數可以傳回查找符合資料的相對位置,INDEX函數可以憑藉相對位置擷取陣列裡的內容,這兩函數的組合不正是天作之合嗎?例如下圖所示,透過MATCH($C$3,工號,0)函數可以傳回$C$3裡的工號,位於工號欄位裡的的幾個相對位置 (MATCH函數裡的最後一個參數「0」代表查詢比對的邏輯是完全符合的查找)。如此,就可以透過INDEX函數,憑藉此相對位置,到年資欄位裡索引取得該工號的年資囉!
舉一反三,在此範例中,若是將INDEX函數裡的第一個參數由[年資]改成[組別],不就可以取得該工號的組別!若是改成[地區],即可傳回該工號的地區!那麼,VLOOKUP不就可以放一邊了嗎?呵呵呵~
(開玩笑的!VLOOKUP也是很重要的!)