門市回報的訂單表只寫了品名和杯數,我要補上商品代碼和單價,再算出每一筆的金額。代碼在價目表裡是品名的左邊,用 VLOOKUP 查不到,這種時候就輪到 INDEX 和 MATCH 出場。
INDEX 和 MATCH 各自的語法,在 INDEX 與 MATCH 入門 講過了,這篇直接拿來做事。
先看資料
價目表跟入門篇一樣,放在 A1:D8:
| 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 |
訂單放在旁邊的 F1:G7,只有品名和杯數。H1 到 K1 我先寫好標題「位置」「代碼」「單價」「金額」,這四欄是要補的:
| F | G | |
|---|---|---|
| 1 | 品名 | 杯數 |
| 2 | 四季春 | 12 |
| 3 | 青茶 | 9 |
| 4 | 烏龍奶茶 | 21 |
| 5 | 檸檬紅茶 | 15 |
| 6 | 蘋果紅茶 | 33 |
| 7 | 奶蓋紅茶 | 5 |
最後一筆「奶蓋紅茶」價目表裡沒有,我是故意放的,等一下看它會怎麼處理。
先用 MATCH 找位置
補代碼和補單價,找的都是同一件事:這個品名在價目表第幾列。所以我先用 H 欄把位置算出來,之後兩欄都共用它。
H2 輸入:
品名在價目表品名欄的位置
=MATCH($F2, $B$2:$B$8, 0)$F2:訂單的品名,欄固定、列不固定,往下複製時會跟著換列。$B$2:$B$8:價目表的品名欄,兩個方向都固定,複製時不會跑掉。0:完全相同才算。
往下複製到 H7,來看看結果:
| 訂單品名 | 位置 |
|---|---|
| 四季春 | 6 |
| 青茶 | 3 |
| 烏龍奶茶 | 1 |
| 檸檬紅茶 | 5 |
| 蘋果紅茶 | 2 |
| 奶蓋紅茶 | #N/A |
四季春是價目表品名欄的第 6 個,跟上面的表對得起來。奶蓋紅茶找不到,所以是 #N/A。
往左查代碼,往右查單價
位置有了,I 欄補代碼。代碼在價目表 A 欄,品名在 B 欄,也就是代碼在品名的左邊。INDEX 取值的範圍跟找位置的範圍是各自指定的,往左往右都一樣寫。
I2 輸入:
用位置從代碼欄取值,找不到顯示查無此品
=IFNA(INDEX($A$2:$A$8, $H2), "查無此品")INDEX($A$2:$A$8, $H2):從代碼欄取第H2個。IFNA(…, "查無此品"):只有碰到#N/A才換成這段文字,其他的錯誤不會被蓋掉。
J 欄的單價只差在取值的範圍,換成 C 欄:
用同一個位置從單價欄取值
=IFNA(INDEX($C$2:$C$8, $H2), "查無此品")兩欄都往下複製,來看看結果:
| 訂單品名 | 位置 | 代碼 | 單價 |
|---|---|---|---|
| 四季春 | 6 | TE-641 | 40 |
| 青茶 | 3 | TE-318 | 35 |
| 烏龍奶茶 | 1 | TE-107 | 58 |
| 檸檬紅茶 | 5 | TE-530 | 52 |
| 蘋果紅茶 | 2 | TE-212 | 45 |
| 奶蓋紅茶 | #N/A | 查無此品 | 查無此品 |
我個人喜歡把 MATCH 獨立成一欄,原因有兩個。一是同一個品名只找一次位置,代碼、單價、庫存各自 INDEX 就好,公式都很短。二是哪一筆查不到,看 H 欄就知道,不用去拆一條長公式。
要再補庫存的話,多一欄 INDEX($D$2:$D$8, $H2) 就好,MATCH 不用動。
算出金額
K 欄是杯數乘單價。奶蓋紅茶的單價是文字,直接乘會出錯,所以先確認單價真的是數字:
單價是數字才計算,否則金額算 0
=IF(ISNUMBER(J2), G2*J2, 0)先手算:四季春 12 × 40 = 480,青茶 9 × 35 = 315,烏龍奶茶 21 × 58 = 1218,檸檬紅茶 15 × 52 = 780,蘋果紅茶 33 × 45 = 1485,奶蓋紅茶 0。往下複製後,金額欄是 480、315、1218、780、1485、0。
總金額:
金額欄加總
=SUM(K2:K7)480 + 315 + 1218 + 780 + 1485 = 4278,公式也得到 4278。奶蓋紅茶算 0 只是讓總和不報錯,那一筆還是要回頭請人補進價目表,所以我會留著 I、J 欄的「查無此品」不刪。
新增訂單與價目表要改哪裡
- 訂單多一列:把 H 到 K 這幾欄往下複製一列就好。
- 價目表多一個品項:
$B$2:$B$8、$A$2:$A$8、$C$2:$C$8要一起拉長,例如全部改成到第 9 列。漏改其中一個,位置和取值就對不上,這個陷阱在 進階篇 會講。 - 價目表中間插入一欄:
INDEX和MATCH各自框的是整欄範圍,插入的欄不在它們裡面,公式不用重寫。如果用VLOOKUP,第三個參數的欄號是寫死的數字,插入欄之後就要自己檢查。
雙向查表:品項乘門市
第二個任務。上個月四間門市各賣了多少杯,我想讓人選一個品項和一間門市,就看到那一格的杯數。這張表放在新的工作表,範圍 A1:E6:
| 品項 | 信義店 | 板橋店 | 新竹店 | 台中店 |
|---|---|---|---|---|
| 烏龍奶茶 | 142 | 87 | 63 | 118 |
| 蘋果紅茶 | 96 | 134 | 41 | 77 |
| 青茶 | 58 | 72 | 105 | 29 |
| 檸檬紅茶 | 83 | 49 | 92 | 64 |
| 四季春 | 37 | 66 | 28 | 51 |
標題列是第 1 列,品項在 A 欄。A9 寫「品項」、A10 寫「門市」,B9 輸入想查的品項「蘋果紅茶」,B10 輸入門市「新竹店」。手算的話,蘋果紅茶是第 2 列,新竹店是第 3 欄,交叉的那格是 41。
INDEX 的列和欄兩個參數,剛好各給一個 MATCH:
用品項找列、用門市找欄,取出交叉的那一格
=INDEX(B2:E6, MATCH(B9, A2:A6, 0), MATCH(B10, B1:E1, 0))B2:E6:只有數字的部分,不含標題列和品項欄。MATCH(B9, A2:A6, 0):品項在 A 欄的位置,蘋果紅茶是 2,當作「列」。MATCH(B10, B1:E1, 0):門市在標題列的位置,新竹店是 3,當作「欄」。
來看看結果:41。
這邊要注意,兩個 MATCH 的範圍要跟 INDEX 的範圍對齊。找列的範圍 A2:A6 從第 2 列起,跟 B2:E6 同一列開始,找欄的範圍 B1:E1 從 B 欄起,跟 B2:E6 同一欄開始。只要有一邊多框了標題,位置就會差一格。
B9 和 B10 我會設成下拉選單,輸入就不會打錯字,做法在 資料驗證。
整列、整欄一起拿
INDEX 的列或欄填 0,會把那一整列或整欄傳回來,這時候就可以交給 SUM、MAX 這類函式。
蘋果紅茶四間門市加起來賣了多少:
列用 MATCH,欄填 0,取出整列再加總
=SUM(INDEX(B2:E6, MATCH(B9, A2:A6, 0), 0))96 + 134 + 41 + 77 = 348,公式得到 348。
新竹店所有品項合計,換成列填 0、欄用 MATCH:
列填 0,欄用 MATCH,取出整欄再加總
=SUM(INDEX(B2:E6, 0, MATCH(B10, B1:E1, 0)))63 + 41 + 105 + 92 + 28 = 329,得到 329。
這間門市賣最好的是哪一項
再多一步:先找出某間門市那一欄的最大值,再用 MATCH 找它排第幾,最後用 INDEX 把品項名稱拿出來。
信義店那一欄是 B2:B6,最大值是 142,先固定寫死:
信義店賣最多的品項
=INDEX(A2:A6, MATCH(MAX(B2:B6), B2:B6, 0))得到 烏龍奶茶。想讓門市跟著 B10 變,就把 B2:B6 換成前面那段整欄的 INDEX:
B10 選的門市,賣最多的品項
=INDEX(
A2:A6,
MATCH(
MAX(INDEX(B2:E6, 0, MATCH(B10, B1:E1, 0))),
INDEX(B2:E6, 0, MATCH(B10, B1:E1, 0)),
0
)
)B10 是新竹店,那一欄最大的是 105,對到青茶,所以得到 青茶。這條公式有點長,我自己會把整欄的 INDEX 先放進一格輔助儲存格,或用 LET 命名,之後讀起來會輕鬆很多。
這時候還要用 INDEX 和 MATCH 嗎
單純的查表,我新做的表會先用 XLOOKUP,一條就完成。上面這幾個情境我還是會用 INDEX / MATCH:位置要被多個欄共用、雙向查表、取整列整欄去加總。其中多條件和近似比對的取捨,放在進階篇。
練習
板橋店賣最多的品項
用 A1:E6 的銷量表,寫出板橋店(C 欄)賣最多的品項名稱。要怎麼寫?
青茶四間門市的平均
青茶在四間門市的平均杯數是多少?請用 MATCH 找出青茶那一列,不要直接框 B4:E4。
多把位置獨立出來、多用整列整欄,你的查表就會越來越好維護,試試看吧!
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章留言討論
共 0 則留言
