今天要來聊聊 INDEX 和 MATCH。一個負責「第幾列第幾欄的值是什麼」,一個負責「這個值排在第幾個」,兩個湊在一起,就能做出查表。
先說好,這篇只打基礎:各自怎麼用、怎麼組合、哪裡會踩雷。左查右的實戰和雙向查表在 情境實戰篇,多條件、動態範圍和近似比對的陷阱在 進階陷阱篇。
先看看手動查表有多麻煩
我手上有一張飲料的商品代碼價目表,一共 7 項:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 代碼 | 品名 | 單價 | 庫存 |
| 2 | TE-107 | 烏龍奶茶 | 58 | 37 |
| 3 | TE-212 | 蘋果紅茶 | 45 | 112 |
| 4 | TE-318 | 青茶 | 35 | 8 |
| 5 | TE-424 | 蘋果綠茶 | 48 | 21 |
| 6 | TE-530 | 檸檬紅茶 | 52 | 63 |
| 7 | TE-641 | 四季春 | 40 | 29 |
| 8 | TE-755 | 熟成紅茶 | 38 | 14 |
我想知道代碼 TE-530 的單價。7 列的話眼睛掃一下就找到了,但如果這張表有幾百列,每次都要用 Ctrl + F(Mac 為 Cmd + F)找、再橫著看到單價那一欄,有點太麻煩了吧!
這件事可以拆成兩步:先找到 TE-530 在第幾列,再去單價那一欄把那一列的值拿出來。這剛好就是 MATCH 和 INDEX 各自在做的事。
INDEX
INDEX 會從一個範圍裡,依照你指定的列和欄,把那一格的值拿出來。
語法
- 範圍:要從哪裡取值。
- 列:選填,是範圍裡面的第幾列,不是試算表左邊的列號。
- 欄:選填,是範圍裡面的第幾欄,不是 A、B、C 的欄名。
範例
我想拿「青茶」的單價。青茶在 A2:D8 這個範圍的第 3 列,單價是第 3 欄。
如果要用 INDEX 寫,就是:
取出範圍中第 3 列、第 3 欄的值
=INDEX(A2:D8, 3, 3)A2:D8:整張價目表,不含標題列。3:第 3 列,也就是 TE-318 青茶那一列。3:第 3 欄,也就是單價。
來看看結果:35。
範圍如果只有一欄,欄可以省略。像單價 C2:C8 只有一欄,要第 4 個:
單欄範圍裡的第 4 個值
=INDEX(C2:C8, 4)得到 48,也就是蘋果綠茶的單價。
把列或欄填 0 的話,INDEX 會把整欄或整列都回傳。舉例來說,我想知道總庫存:
列填 0,取出第 4 欄的所有值再加總
=SUM(INDEX(A2:D8, 0, 4))37 + 112 + 8 + 21 + 63 + 29 + 14 = 284,公式也會得到 284。這個用法比較少用,知道有這回事就好。
MATCH
MATCH 會在一欄或一列裡找某個值,告訴你它排在第幾個。注意它回傳的是位置,不是那個值本身。
語法
- 搜尋值:要找的東西,可以是文字、數字或儲存格。
- 範圍:只能是單獨一欄或單獨一列。如果範圍又有多列又有多欄,會得到
#N/A。 - 搜尋類型:選填,
0、1、-1三種,預設是1。
三種搜尋類型的意思:
0:找完全相同的值,資料不用排序。1:預設值。假設範圍由小到大排好,找小於或等於搜尋值的最大值。-1:假設範圍由大到小排好,找大於或等於搜尋值的最小值。
我的習慣很簡單:只要是在「找這個東西在哪」,一律寫 0。1 和 -1 是給「落在哪個級距」這類有排序的資料用的,後面會講為什麼不能放著不填。
範例
我想知道「青茶」在品名那一欄排第幾個。
如果要用 MATCH 寫,就是:
找出青茶在品名欄的位置
=MATCH("青茶", B2:B8, 0)"青茶":要找的值。B2:B8:在品名這一欄找。0:完全相同才算。
來看看結果:3。青茶是 B2:B8 的第 3 個,跟剛剛 INDEX 用的「第 3 列」對得起來。
組合起來
好,回到一開始的題目:代碼 TE-530 的單價。
先手算一遍:TE-530 在代碼欄是第 5 個,單價欄的第 5 個是 52。
拆成兩步寫就是,先用 MATCH 找位置:
TE-530 在代碼欄排第幾個
=MATCH("TE-530", A2:A8, 0)得到 5。再把這個 5 交給 INDEX:
單價欄的第 5 個
=INDEX(C2:C8, 5)得到 52。兩步合併,把 MATCH 直接放進 INDEX 的「列」參數:
用代碼查單價
=INDEX(C2:C8, MATCH("TE-530", A2:A8, 0))C2:C8:要取值的欄,單價。MATCH("TE-530", A2:A8, 0):在代碼欄找TE-530的位置,也就是 5。
來看看結果:52。
實際使用時,我會把 "TE-530" 換成儲存格參照,例如 F1 輸入代碼、公式寫 MATCH(F1, A2:A8, 0),換代碼就不用改公式。
想改查庫存的話,只要把取值的範圍從 C2:C8 換成 D2:D8,MATCH 的部分完全不用動。
往左查:VLOOKUP 做不到的事
如果我反過來,知道品名「四季春」,想查它的代碼,代碼在品名的左邊。
VLOOKUP 只會在你框的範圍的第一欄找,然後往右回傳,所以代碼在左邊它就拿不到。INDEX 和 MATCH 是各自指定範圍,沒有這個限制:
用品名往左查代碼
=INDEX(A2:A8, MATCH("四季春", B2:B8, 0))A2:A8:要取值的欄,代碼。MATCH("四季春", B2:B8, 0):在品名欄找四季春,位置是 6。
來看看結果:TE-641。
找的欄和取的欄是兩個獨立的參數,這就是 INDEX / MATCH 比 VLOOKUP 靈活的地方。更多這類的組合會在實戰篇繼續。
搜尋類型沒寫的陷阱
MATCH 的第三個參數省略時,預設是 1,而 1 會假設資料已經由小到大排好。如果資料其實沒排序,它也不會報錯,而是在這個假設下給你一個可能是錯的結果。
單價欄 C2:C8 沒有排序,是 58、45、35、48、52、40、38。我想知道單價 40 在第幾個,明明有,在第 6 個。如果沒寫搜尋類型:
沒寫搜尋類型,預設是 1
=MATCH(40, C2:C8)這條公式明明有 40,卻會得到 #N/A。沒排序的資料下,結果沒有保證,換一份資料可能是別的數字。加上 0 之後:
搜尋類型寫 0,完全相同才算
=MATCH(40, C2:C8, 0)就會得到 6。
這個陷阱麻煩在於,有時候沒排序的資料剛好也能找到正確答案,你測了幾次都對,等資料一多就出錯。所以要當成規則:找位置就寫 0。
#N/A 是什麼意思?
用 0 精確比對時,如果找不到,MATCH 會回傳 #N/A,意思是「查無此值」。
價目表裡沒有的品名
=MATCH("奶蓋紅茶", B2:B8, 0)結果是 #N/A。INDEX 套在外面,錯誤也會跟著傳出來。發生時先檢查:
- 搜尋值有沒有多打空格,或全形半形不同。
- 搜尋值是不是數字卻被存成文字(或相反)。
- 範圍是不是選歪了一格,把要找的那格漏掉。
另外,如果 INDEX 的列或欄超出範圍,例如 ,範圍只有 7 格,得到的是 #NUM!(不是 #REF!),滑鼠移上去的提示是「函式 INDEX 的第 2 參數 參數的值 (9) 超出範圍。」。
那還要學 XLOOKUP 嗎?
要。XLOOKUP 一條公式就能完成查找,找不到時還可以自訂訊息,新做的表我會先用它,用法在 XLOOKUP 基礎。
我還是會用 INDEX / MATCH 的情況:INDEX 單獨用很好用,像是「取第 N 個」或「取整欄」,這個 XLOOKUP 做不到。另外也會遇到別人留下來的表,裡面本來就是這個組合,看得懂才改得動。
練習
用品名查庫存
用 A1:D8 的價目表,查「熟成紅茶」的庫存。要怎麼寫?
INDEX 與 MATCH 小測驗
想用 MATCH 找「完全相同」的值,而且資料沒有排序,第三個參數該填什麼?
這篇先講到這邊。往左查和雙向查表的實際案例在 INDEX 與 MATCH 實戰,試試看吧!
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章留言討論
共 0 則留言
