XLOOKUP คือฟังก์ชันที่เข้ามาปฏิวัติการค้นหาข้อมูลใน Excel โดยทำงานบนพื้นฐานของ Dynamic Array Engine บทความนี้จะเจาะลึกเทคนิคขั้นสูงที่ VLOOKUP ทำไม่ได้ โดยเฉพาะการค้นหาแบบหลายเงื่อนไข (Multiple Criteria) โดยใช้หลักการ Boolean Logic และการจัดการ Error โดยไม่ต้องพึ่ง IFERROR
1. Data Structure Setup (โครงสร้างข้อมูลตัวอย่าง)
เพื่อให้เห็นภาพการทำงานของสูตร เราจะอ้างอิงข้อมูลจากตาราง [Source_Data] นี้ตลอดบทความ:
| Row | A (Product) | B (Size) | C (Price) |
|---|---|---|---|
| 2 | Hoodie | L | 1,200 |
| 3 | T-Shirt | M | 450 |
| 4 | Hoodie | M | 1,100 |
| 5 | Jeans | 32 | 1,800 |
2. Multiple Criteria: การค้นหาซ้อนเงื่อนไขด้วย Boolean Logic
โจทย์: ต้องการหาราคา (Price) ของ “Hoodie” ไซซ์ “M”
ในอดีตเราต้องสร้าง Helper Column เพื่อนำ Text มาต่อกัน แต่ใน XLOOKUP เราจะใช้เทคนิคการคูณ Array (Array Multiplication) แทน
The Formula (สูตร)
=XLOOKUP(1, (A2:A5="Hoodie") * (B2:B5="M"), C2:C5)
Logic Deep Dive: ทำไมต้อง lookup_value เป็น 1?
เบื้องหลังการทำงานของ Excel ใน Memory จะเกิดกระบวนการเปรียบเทียบตรรกะทีละบรรทัด ดังนี้:
Step 1: Evaluation (ตรวจสอบเงื่อนไขแยกกัน)
Array 1 (Product="Hoodie"): {TRUE; FALSE; TRUE; FALSE}
Array 2 (Size="M"): {FALSE; TRUE; TRUE; FALSE}
Step 2: Boolean Math (การคูณตรรกะ)
ใน Excel: TRUE = 1 และ FALSE = 0 เมื่อนำมาคูณกันจะเป็นการทำ AND Operation:
Row 2: TRUE * FALSE = 1 * 0 = 0
Row 3: FALSE * TRUE = 0 * 1 = 0
Row 4: TRUE * TRUE = 1 * 1 = 1 <-- (Match!)
Row 5: FALSE * FALSE = 0 * 0 = 0
Step 3: Final Lookup Array
สูตรจะแปลงสภาพเป็น:
=XLOOKUP(1, {0; 0; 1; 0}, C2:C5)
XLOOKUP จะวิ่งหาเลข 1 ตัวแรกที่เจอ ซึ่งตรงกับตำแหน่ง Row 4 (Hoodie, M) และคืนค่า 1,100 ออกมา
3. Native Error Handling: เลิกใช้ IFERROR ซ้อนสูตร
การใช้ IFERROR(VLOOKUP(...), "Not Found") เป็นการสิ้นเปลืองทรัพยากรคำนวณ (Computational Cost) เพราะ Excel ต้องรันสูตรหลักให้ Error ก่อนถึงจะทำงานส่วน Error Handler
XLOOKUP มี Argument ที่ 4 ชื่อ [if_not_found] มาให้ในตัว ซึ่งทำงานเร็วกว่าและเขียนสูตรสั้นกว่า
เปรียบเทียบ Syntax
แบบเก่า (VLOOKUP):
=IFERROR(VLOOKUP("Hat", A2:C5, 3, 0), "Out of Stock")
แบบใหม่ (XLOOKUP):
=XLOOKUP("Hat", A2:A5, C2:C5, "Out of Stock")
Advanced: Nested XLOOKUP (การค้นหาข้าม Table)
กรณีมีข้อมูลอยู่ 2 Table (Table_New และ Table_Old) เราสามารถซ้อน XLOOKUP ลงไปในช่อง [if_not_found] ได้เลย:
=XLOOKUP(
lookup_val,
Table_New[ID],
Table_New[Price],
XLOOKUP(lookup_val, Table_Old[ID], Table_Old[Price], "Not in both tables")
)
4. Two-Way Lookup: การค้นหาแบบตัดแกน (Matrix Lookup)
โจทย์: ต้องการหาค่าจากตารางที่มี Header เป็น “เดือน” (แนวนอน) และ Row เป็น “สินค้า” (แนวตั้ง)
โครงสร้างข้อมูล (Matrix):
[A] [B] [C] [D]
[1] Product Jan Feb Mar
[2] Item_X 100 120 150
[3] Item_Y 200 210 230
ต้องการหา: ยอดขายของ Item_Y ในเดือน Feb
The Formula (สูตรซ้อนสูตร)
=XLOOKUP("Item_Y", A2:A3, XLOOKUP("Feb", B1:D1, B2:D3))
Logic Breakdown
- Inner XLOOKUP (ตัวใน):
XLOOKUP("Feb", B1:D1, B2:D3)- ค้นหา “Feb” ใน Header แนวนอน
- คืนค่ากลับมาเป็น Vertical Array ของเดือนนั้นทั้งคอลัมน์:
{120; 210}
- Outer XLOOKUP (ตัวนอก):
XLOOKUP("Item_Y", A2:A3, {120; 210})- ค้นหา “Item_Y” ในคอลัมน์ Product
- ดึงค่าจาก Array ผลลัพธ์ที่ได้จากข้อ 1
- Result: 210
Summary Cheat Sheet
| Scenario | Pattern / Syntax |
|---|---|
| Multiple Criteria | =XLOOKUP(1, (Range1=Crit1)*(Range2=Crit2), Return) |
| Handle Missing | =XLOOKUP(Val, Look, Ret, "Not Found") |
| Wildcard (*) | =XLOOKUP("*Txt*", Look, Ret, , 2)(ต้องใส่ match_mode = 2) |
| Last to First | =XLOOKUP(Val, Look, Ret, , , -1)(ค้นหาจากล่างขึ้นบน) |