跳到主要內容跳到頁尾

INDEX 與 MATCH:先找位置,再把值拿出來

7 分鐘閱讀Lv.2 中級摘要與日期

INDEX 依列、欄位置取出儲存格的值,MATCH 找出某個值排在第幾個。從各自的用法開始,再組合成 INDEX(…, MATCH(…, 0)) 做查表,包含 VLOOKUP 做不到的往左查,以及 MATCH 預設參數的陷阱。

發布

文章目錄

今天要來聊聊 INDEX 和 MATCH。一個負責「第幾列第幾欄的值是什麼」,一個負責「這個值排在第幾個」,兩個湊在一起,就能做出查表。

先說好,這篇只打基礎:各自怎麼用、怎麼組合、哪裡會踩雷。左查右的實戰和雙向查表在 情境實戰篇,多條件、動態範圍和近似比對的陷阱在 進階陷阱篇。

先看看手動查表有多麻煩

我手上有一張飲料的商品代碼價目表,一共 7 項:

ABCD
1代碼品名單價庫存
2TE-107烏龍奶茶5837
3TE-212蘋果紅茶45112
4TE-318青茶358
5TE-424蘋果綠茶4821
6TE-530檸檬紅茶5263
7TE-641四季春4029
8TE-755熟成紅茶3814

我想知道代碼 TE-530 的單價。7 列的話眼睛掃一下就找到了,但如果這張表有幾百列,每次都要用 Ctrl + F(Mac 為 Cmd + F)找、再橫著看到單價那一欄,有點太麻煩了吧!

這件事可以拆成兩步:先找到 TE-530 在第幾列,再去單價那一欄把那一列的值拿出來。這剛好就是 MATCH 和 INDEX 各自在做的事。

INDEX

INDEX 會從一個範圍裡,依照你指定的列和欄,把那一格的值拿出來。

語法

  • 範圍:要從哪裡取值。
  • 列:選填,是範圍裡面的第幾列,不是試算表左邊的列號。
  • 欄:選填,是範圍裡面的第幾欄,不是 A、B、C 的欄名。

範例

我想拿「青茶」的單價。青茶在 A2:D8 這個範圍的第 3 列,單價是第 3 欄。

如果要用 INDEX 寫,就是:

Google 試算表公式
fx

取出範圍中第 3 列、第 3 欄的值

=INDEX(A2:D8, 3, 3)
  • A2:D8:整張價目表,不含標題列。
  • 3:第 3 列,也就是 TE-318 青茶那一列。
  • 3:第 3 欄,也就是單價。

來看看結果:35。

範圍如果只有一欄,欄可以省略。像單價 C2:C8 只有一欄,要第 4 個:

Google 試算表公式
fx

單欄範圍裡的第 4 個值

=INDEX(C2:C8, 4)

得到 48,也就是蘋果綠茶的單價。

把列或欄填 0 的話,INDEX 會把整欄或整列都回傳。舉例來說,我想知道總庫存:

Google 試算表公式
fx

列填 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 寫,就是:

Google 試算表公式
fx

找出青茶在品名欄的位置

=MATCH("青茶", B2:B8, 0)
  • "青茶":要找的值。
  • B2:B8:在品名這一欄找。
  • 0:完全相同才算。

來看看結果:3。青茶是 B2:B8 的第 3 個,跟剛剛 INDEX 用的「第 3 列」對得起來。

組合起來

好,回到一開始的題目:代碼 TE-530 的單價。

先手算一遍:TE-530 在代碼欄是第 5 個,單價欄的第 5 個是 52。

拆成兩步寫就是,先用 MATCH 找位置:

Google 試算表公式
fx

TE-530 在代碼欄排第幾個

=MATCH("TE-530", A2:A8, 0)

得到 5。再把這個 5 交給 INDEX:

Google 試算表公式
fx

單價欄的第 5 個

=INDEX(C2:C8, 5)

得到 52。兩步合併,把 MATCH 直接放進 INDEX 的「列」參數:

Google 試算表公式
fx

用代碼查單價

=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 是各自指定範圍,沒有這個限制:

Google 試算表公式
fx

用品名往左查代碼

=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 個。如果沒寫搜尋類型:

Google 試算表公式
fx

沒寫搜尋類型,預設是 1

=MATCH(40, C2:C8)

這條公式明明有 40,卻會得到 #N/A。沒排序的資料下,結果沒有保證,換一份資料可能是別的數字。加上 0 之後:

Google 試算表公式
fx

搜尋類型寫 0,完全相同才算

=MATCH(40, C2:C8, 0)

就會得到 6。

這個陷阱麻煩在於,有時候沒排序的資料剛好也能找到正確答案,你測了幾次都對,等資料一多就出錯。所以要當成規則:找位置就寫 0。

#N/A 是什麼意思?

用 0 精確比對時,如果找不到,MATCH 會回傳 #N/A,意思是「查無此值」。

Google 試算表公式
fx

價目表裡沒有的品名

=MATCH("奶蓋紅茶", B2:B8, 0)

結果是 #N/A。INDEX 套在外面,錯誤也會跟著傳出來。發生時先檢查:

  • 搜尋值有沒有多打空格,或全形半形不同。
  • 搜尋值是不是數字卻被存成文字(或相反)。
  • 範圍是不是選歪了一格,把要找的那格漏掉。

另外,如果 INDEX 的列或欄超出範圍,例如 ,範圍只有 7 格,得到的是 #NUM!(不是 #REF!),滑鼠移上去的提示是「函式 INDEX 的第 2 參數 參數的值 (9) 超出範圍。」。

那還要學 XLOOKUP 嗎?

要。XLOOKUP 一條公式就能完成查找,找不到時還可以自訂訊息,新做的表我會先用它,用法在 XLOOKUP 基礎。

我還是會用 INDEX / MATCH 的情況:INDEX 單獨用很好用,像是「取第 N 個」或「取整欄」,這個 XLOOKUP 做不到。另外也會遇到別人留下來的表,裡面本來就是這個組合,看得懂才改得動。

練習

1

用品名查庫存

用 A1:D8 的價目表,查「熟成紅茶」的庫存。要怎麼寫?

INDEX 與 MATCH 小測驗

0 / 2 題已完成
1

想用 MATCH 找「完全相同」的值,而且資料沒有排序,第三個參數該填什麼?

1 / 2

這篇先講到這邊。往左查和雙向查表的實際案例在 INDEX 與 MATCH 實戰,試試看吧!

我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。