拿到一張橫著排的表,品項在第一列、價格在第二列,VLOOKUP 派不上用場,這時候該用 HLOOKUP。
另一個老函式 LOOKUP 的個性比較特別,它要求資料先排序,而且找不到完全一樣的值時,會回傳「小於等於的最後一個」。舊檔案裡還滿常看到這兩個,這篇就把它們的行為整理清楚。
我自己現在幾乎都用 XLOOKUP,不過接手別人留下的表格時,還是得看得懂這兩個。
怎麼選
| 情況 | 用這個 |
|---|---|
| 表是橫的,要用第一列的值去找 | HLOOKUP |
| 範圍已排序,要找「小於等於的最後一個」 | LOOKUP 或 HLOOKUP(第四個參數 TRUE) |
| 表是直的 | VLOOKUP,或直接用 XLOOKUP |
| 不想管方向、排序 | XLOOKUP |
HLOOKUP
HLOOKUP 就是橫著用的 VLOOKUP:在範圍的第一列找值,找到之後,往下數幾列,把那一格的值拿回來。H 是 Horizontal,「水平」的意思。
語法:
- 查找值:要找的東西。
- 範圍:整張表,查找值要放在這個範圍的第一列。
- 列號:找到之後,要回傳範圍裡的第幾列。第一列是 1。
- 已排序:選填,預設是 TRUE。TRUE 表示第一列已經由小到大排好,找不到完全一樣的值時,會用小於等於的最後一個;FALSE 表示要完全一樣才算找到。
先看一張橫向的菜單,A1:E3:
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | 品項 | 蘋果紅茶 | 烏龍奶茶 | 蘋果綠茶 | 青茶 |
| 2 | 單價 | 45 | 55 | 45 | 35 |
| 3 | 本週杯數 | 37 | 12 | 8 | 21 |
我想知道「蘋果綠茶」本週賣了幾杯。如果要用 HLOOKUP 寫,就是:
在第一列找蘋果綠茶,回傳第 3 列
=HLOOKUP("蘋果綠茶", A1:E3, 3, FALSE)來看看結果:你應該會得到 8。把列號改成 2,就是單價, 得到 55。
查不到的值會是 #N/A,例如 。
這邊要記得,名字是文字的時候,第四個參數我一律寫 FALSE。預設的 TRUE 會讓 Sheets 當作第一列已經排好序,品項順序亂的話,結果就不可靠了。
近似比對:用門檻查級距
TRUE 真正好用的地方是查級距。這張運費表,B1:F1 是「重量起」,B2:F2 是對應的運費:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 重量起(kg) | 0 | 2 | 5 | 10 | 20 |
| 2 | 運費 | 60 | 80 | 120 | 180 | 260 |
包裹 7 公斤,落在「5 公斤起」的級距:
7 公斤找不到完全一樣的值,取小於等於的最後一個 5,回傳它下面的運費
=HLOOKUP(7, B1:F2, 2, TRUE)結果是 120。剛好 5 公斤也是 120,4.9 公斤則是 80,20 公斤以上都是 260。
如果重量比第一個門檻(0)還小,例如 -1,會是 #N/A,因為找不到任何「小於等於」的值。
LOOKUP
LOOKUP 的邏輯跟上面的近似比對一模一樣,只是少了方向的限制,也少了「完全一樣」的選項。
語法:
- 查找值:要找的東西。
- 查找範圍:單列或單欄,必須由小到大排序。
- 結果範圍:選填,找到第幾個位置,就回傳這個範圍同一個位置的值。
一樣用運費表,7 公斤:
在 B1:F1 找小於等於 7 的最後一個,回傳 B2:F2 同位置的運費
=LOOKUP(7, B1:F1, B2:F2)結果是 120,跟 HLOOKUP 一樣。重量 -1 同樣會得到 #N/A。
有三件事要注意:
- 查找範圍一定要排序。沒排好的話,
LOOKUP不會報錯,只是給你一個看起來合理、其實不對的值,這種錯最難抓。 - 它只會做近似比對,沒有「完全一樣才算」的模式。查名稱時,找不到完全一樣的項目,只要不是比第一項還小,也會回傳排序上前面的那一項,不會出現
#N/A。名稱查找請用HLOOKUP、VLOOKUP的 FALSE,或XLOOKUP。 - 只給兩個參數時,它是陣列模式。 會在第一列找,回傳最後一列同位置的值,也是 120。
取欄位裡最後一個有值的儲存格
LOOKUP 有個老技巧:把「找不到的東西」故意設成一個很大的數字,它就會停在最後一個符合的位置。
假設 A1:A6 是每天的杯數,中間有空格,我想拿最後一天有填的那一筆:
用 1/(條件) 造出由 1 與錯誤組成的陣列,LOOKUP 找 2 會停在最後一個 1
=LOOKUP(2, ARRAYFORMULA(1/(A1:A6<>"")), A1:A6)A1:A6<>"" 對有值的格子是 TRUE,1/TRUE 是 1,空格的 1/FALSE 是錯誤。2 比所有 1 都大,所以停在最後一個 1,也就是最後一個有值的位置。資料是 37、8、空、21、空、16 的話,會得到 16。
這招我不太推薦新手用,讀的人要想一下才看得懂。現在可以先用 FILTER 濾掉空格,再取最後一筆,讀起來直白很多。
換成 XLOOKUP
上面兩個函式做的事,XLOOKUP 都能做,而且不用排序。細節在 XLOOKUP 入門,這邊只看和運費表有關的寫法。
用 7 公斤查運費,比對模式填 -1,意思是「找不到完全一樣的值,就取下一個比較小的」:
比對模式 -1:完全一樣,或下一個較小的值
=XLOOKUP(7, B1:F1, B2:F2, , -1)結果是 120。第四個參數留空,是不指定找不到時的顯示值;要自訂的話, 會顯示「不在表內」,比 #N/A 好讀。
最大的差別是 XLOOKUP 的近似比對不需要先排序,查找範圍橫著直著都可以,往左查也沒問題。
兩個函式的參數可以這樣對應:
| 想做的事 | HLOOKUP | XLOOKUP |
|---|---|---|
| 完全一樣才算 | 第四個參數 FALSE | 預設就是 |
| 小於等於的最後一個 | TRUE,且第一列要排序 | 比對模式 -1,不用排序 |
| 找不到時顯示文字 | 外面包 IFERROR | 第四個參數 |
| 回傳第幾列 | 數字列號 | 直接選結果範圍 |
HLOOKUP 的列號是數字,表格中間插入一列,數字不會跟著變,公式就悄悄指到錯的列。這是我最討厭它的地方。
如果檔案還要拿到 Excel 用,要注意 Excel 的 XLOOKUP 只有 Excel 365、2024、2021 才有,2019 以前的版本沒有。這也是舊檔案至今還在用 HLOOKUP、LOOKUP 的原因之一。
接手舊檔案看到這兩個函式時,先確認第一列、第一欄有沒有排序,再決定要不要改寫。
接下來可以
相關文章
查看所有文章XLOOKUP 入門:用品名查價格,也對照 VLOOKUP
XLOOKUP 的三個必填參數、找不到時自訂顯示的內容,以及可以往左查的寫法,最後和 VLOOKUP 的寫法逐項對照。
訂單補價格、兩張表對照:用 XLOOKUP 處理價目表與查不到的品項
訂單只有品名和杯數,用一條 XLOOKUP 補上代碼、單價、庫存並算出金額;查不到的品項怎麼標示與統計;用 COUNTIF 和 FILTER 找出價目表有、訂單沒有的品項;最後教你看懂舊檔裡的 VLOOKUP。
INDEX 與 MATCH:先找位置,再把值拿出來
INDEX 依列、欄位置取出儲存格的值,MATCH 找出某個值排在第幾個。從各自的用法開始,再組合成 INDEX(…, MATCH(…, 0)) 做查表,包含 VLOOKUP 做不到的往左查,以及 MATCH 預設參數的陷阱。
留言討論
共 0 則留言
