VLOOKUP เป็นฟังก์ชันค้นหาแนวตั้งที่ได้รับความนิยมสูงสุดใน Excel โดยค้นหาค่าที่ต้องการในคอลัมน์ซ้ายสุดของตาราง จากนั้นดึงข้อมูลจากคอลัมน์ที่ระบุในแถวเดียวกัน รองรับทั้งการค้นหาแบบตรงทุกตัวอักษร (Exact Match) และแบบประมาณค่า (Approximate Match) สำหรับข้อมูลที่เรียงลำดับ ข้อจำกัดหลักคือต้องค้นหาจากคอลัมน์ซ้ายสุดเท่านั้น ไม่สามารถดึงข้อมูลจากด้านซ้ายของคอลัมน์ค้นหาได้
=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| lookup_value | any | Yes | ค่าที่ต้องการค้นหาในคอลัมน์ซ้ายสุดของ table_array สามารถเป็นตัวเลข ข้อความ วันที่ หรือ cell reference ต้องมีค่านี้อยู่ในคอลัมน์แรกของตารางเพื่อให้หาเจอ | |
| table_array | range | Yes | ช่วงตารางที่ใช้ค้นหาข้อมูล คอลัมน์แรกของช่วงนี้จะถูกใช้เป็นคอลัมน์ค้นหา และสามารถดึงข้อมูลจากคอลัมน์อื่นๆ ภายในช่วงนี้ ควรใช้ Absolute Reference ($A$1:$D$100) เพื่อป้องกันปัญหาเมื่อ copy สูตร | |
| col_index_num | number | Yes | หมายเลขคอลัมน์ใน table_array ที่ต้องการดึงข้อมูล เริ่มนับที่ 1 สำหรับคอลัมน์ซ้ายสุด ตัวอย่าง: ถ้า table_array คือ A1:D10 แล้วต้องการดึงค่าจากคอลัมน์ C ให้ใส่ 3 ห้ามใส่เลขที่เกินจำนวนคอลัมน์ใน table_array จะเกิด Error #REF! | |
| range_lookup | logical | Optional | TRUE | กำหนดประเภทการค้นหา: FALSE หรือ 0 = Exact Match (ตรงทุกตัวอักษร) เหมาะกับ ID รหัสสินค้า, TRUE หรือ 1 = Approximate Match (หาค่าที่ใกล้เคียงที่สุด) ต้องเรียงข้อมูลจากน้อยไปมาก ใช้กับช่วงคะแนน ช่วงราคา ถ้าไม่ระบุจะเป็น TRUE ซึ่งเป็นสาเหตุหลักของความผิดพลาด |
ใช้รหัสสินค้าในคอลัมน์ซ้ายสุดของตาราง Product Catalog แล้วดึงราคา ชื่อสินค้า หรือรายละเอียดอื่นๆ จากคอลัมน์ถัดไป เหมาะสำหรับงานใบเสนอราคา ใบสั่งซื้อ
ใช้ Approximate Match (TRUE) กับตารางเกรดที่เรียงคะแนนจากน้อยไปมาก เพื่อหาเกรดที่ตรงกับคะแนนที่ได้ เช่น 0-49=F, 50-59=D, 60-69=C
สร้างตารางอัตราคอมมิชชั่นตามช่วงยอดขาย (0-10000=3%, 10001-50000=5%, 50001+=7%) ใช้ VLOOKUP แบบ Approximate Match เพื่อหาอัตราที่เหมาะสม
ค้นหารหัสพนักงานในฐานข้อมูล HR แล้วดึงชื่อ แผนก เบอร์โทร อีเมล หรือตำแหน่งงานมาแสดงในฟอร์มหรือรายงาน
ใช้รหัสไปรษณีย์ค้นหาชื่อจังหวัด อำเภอ หรือภูมิภาค เพื่อเติมข้อมูลที่อยู่อัตโนมัติในระบบจัดส่งสินค้า
VLOOKUP("P001", ProductTable, 3, FALSE)=VLOOKUP("P001", ProductTable, 3, FALSE)
1250
VLOOKUP(A2, ProductCatalog, 4, 0)=VLOOKUP(A2, ProductCatalog, 4, 0)
Electronics
VLOOKUP(85, GradeTable, 2, TRUE)=VLOOKUP(85, GradeTable, 2, TRUE)
B
VLOOKUP("Samsung*", InventoryTable, 2, FALSE)=VLOOKUP("Samsung*", InventoryTable, 2, FALSE)
Samsung Galaxy S24
IFERROR(VLOOKUP("P999", ProductTable, 3, FALSE), "สินค้าไม่พบในระบบ")=IFERROR(VLOOKUP("P999", ProductTable, 3, FALSE), "สินค้าไม่พบในระบบ")
สินค้าไม่พบในระบบ
IFERROR(VLOOKUP("P001", PriceList2025, 2, 0), VLOOKUP("P001", PriceList2024, 2, 0))=IFERROR(VLOOKUP("P001", PriceList2025, 2, 0), VLOOKUP("P001", PriceList2024, 2, 0))
1450
VLOOKUP("P001", ProductData, MATCH("Price", ProductData[#Headers], 0), FALSE)=VLOOKUP("P001", ProductData, MATCH("Price", ProductData[#Headers], 0), FALSE)
1250
VLOOKUP(EmployeeID, SalaryTable, MATCH(MonthName, SalaryTable[#Headers], 0), FALSE)=VLOOKUP(EmployeeID, SalaryTable, MATCH(MonthName, SalaryTable[#Headers], 0), FALSE)
45000
ปัญหานี้เจอบ่อยมากครับ 😅 สาเหตุหลักๆ มี 5 ข้อ:
.
1. **ใช้ range_lookup ผิด**: ใช้ TRUE (หรือไม่ใส่ argument ที่ 4) โดยไม่ได้เรียงข้อมูล ทำให้ได้ผลผิดแต่ดูเหมือนถูก → แก้: ใส่ FALSE เสมอสำหรับ Exact Match
.
2. **ข้อมูลไม่ตรงชนิด**: เช่น ค้นหาเลข 001 แต่ในตารางเก็บเป็นข้อความ “001” → แก้: ใช้ TEXT() หรือ VALUE() แปลงให้ชนิดเดียวกัน
.
3. **มีช่องว่างซ่อน**: ข้อมูลมีเว้นวรรคหน้าหรือหลังที่มองไม่เห็น (เจอบ่อยมากถ้าดึงจาก CSV) → แก้: ใช้ TRIM() กำจัดช่องว่าง
.
4. **col_index_num นับผิด**: เริ่มนับที่ 1 ไม่ใช่ 0 และต้องนับจากคอลัมน์แรกของ table_array ไม่ใช่คอลัมน์ A นะครับ → แก้: นับใหม่ให้ถูกต้อง
.
5. **คอลัมน์ค้นหาไม่ใช่คอลัมน์ซ้ายสุด**: VLOOKUP ค้นหาจากคอลัมน์ซ้ายสุดเท่านั้น → แก้: จัดเรียงคอลัมน์ใหม่ หรือใช้ INDEX/MATCH
คำถามนี้ถามกันเยอะมากครับ 😊
.
**ข้อจำกัดของ VLOOKUP:**
– ต้องค้นหาจากคอลัมน์ซ้ายสุดเท่านั้น (ไม่สามารถค้นหาย้อนกลับ)
– col_index_num เป็นตัวเลขคงที่ เปราะเมื่อเพิ่ม/ลบคอลัมน์
– Default เป็น Approximate Match (อันตรายมาก)
– ช้ากว่าเมื่อข้อมูลเยอะ
.
**ข้อดีของ XLOOKUP:**
– ค้นหาได้จากคอลัมน์ใดก็ได้ ดึงข้อมูลจากด้านไหนก็ได้
– ระบุช่วงค้นหาและช่วงผลลัพธ์แยกกัน ไม่ต้องนับคอลัมน์
– Default เป็น Exact Match (ปลอดภัยกว่า)
– รองรับการค้นหาย้อนกลับ (จากล่างขึ้นบน)
– มี built-in error handling
– เร็วกว่าเยอะ (Binary Search)
.
**คำแนะนำจากผม:**
– มี Excel 365/2021+ → ใช้ XLOOKUP เลยครับ
– Excel เวอร์ชันเก่า → ใช้ VLOOKUP หรือ INDEX/MATCH
– ต้องส่งไฟล์ให้คนอื่น (Backward Compatible) → ใช้ VLOOKUP
**ใช้ FALSE (Exact Match) เมื่อ:**
– ค้นหา Unique ID (รหัสพนักงาน, รหัสสินค้า)
– ค้นหาชื่อ, ข้อความ
– ต้องการผลลัพธ์ที่ตรงทุกตัวอักษรเท่านั้น
– ข้อมูลไม่ได้เรียงลำดับ
– ใช้ Wildcard (* หรือ ?)
.
**ใช้ TRUE (Approximate Match) เมื่อ:**
– ตัดเกรดจากคะแนน (0-49=F, 50-59=D, 60-69=C…)
– หาอัตราส่วนลดตามยอดซื้อ (0-1000=0%, 1001-5000=5%…)
– คำนวณค่าคอมมิชชั่นตามช่วงยอดขาย
– ข้อมูลเรียงจากน้อยไปมากและต้องการหาค่าช่วง
.
⚠️ **อันตรายที่เจอบ่อยมาก:**
ผู้ใช้ส่วนใหญ่ไม่รู้ว่าถ้าไม่ใส่ argument ที่ 4 จะเป็น TRUE อัตโนมัติ ทำให้ได้ผลผิดโดยไม่รู้ตัว 😭
.
💡 **ส่วนตัวผมแนะนำ:** ใส่ FALSE เสมอเมื่อไม่แน่ใจ เพราะ Exact Match ปลอดภัยกว่าเยอะครับ
Error #N/A แปลว่า “Not Available” – ไม่พบข้อมูลที่ค้นหาครับ
.
**สาเหตุที่เจอบ่อยมาก:**
.
1. **ค่าที่ค้นหาไม่มีจริงในคอลัมน์แรก**
– ตรวจสอบ: เปิด Find (Ctrl+F) ค้นหาในคอลัมน์แรกของ table_array
– แก้: ตรวจสอบการสะกดคำ, ช่องว่าง, ตัวพิมพ์ใหญ่เล็ก (แม้ว่า VLOOKUP ไม่สน Case)
.
2. **ใช้ TRUE แต่ lookup_value น้อยกว่าค่าต่ำสุดในตาราง**
– ตัวอย่าง: ค้นหาคะแนน 45 แต่ตารางเริ่มที่ 50 → จบเลย
– แก้: เพิ่มแถว 0 หรือใช้ FALSE แทน
.
3. **มีช่องว่างหรือตัวอักษรพิเศษซ่อน** (เจอบ่อยมากถ้าดึงจากระบบอื่น)
– แก้: =VLOOKUP(TRIM(A2), …)
.
4. **Data Type ไม่ตรงกัน** (ตัวเลขกับข้อความ)
– แก้: =VLOOKUP(TEXT(A2,”0″), …) หรือ =VLOOKUP(VALUE(A2), …)
.
**วิธีจัดการ Error:**
“`
=IFERROR(VLOOKUP(…), “ไม่พบข้อมูล”)
=IFNA(VLOOKUP(…), 0)
=IF(ISNA(VLOOKUP(…)), “สินค้าหมด”, VLOOKUP(…))
“`
.
ส่วนตัวผมชอบใช้ IFERROR มากที่สุดครับ เพราะสั้นและอ่านง่าย
นี่คือข้อจำกัดที่หลายคนติดครับ 😅
.
**VLOOKUP มีข้อจำกัดโดยออกแบบ:** คอลัมน์ค้นหาต้องอยู่ซ้ายสุดของ table_array เสมอ และดึงข้อมูลจากด้านขวาเท่านั้น
.
**ตัวอย่างปัญหา:**
ตาราง: ชื่อสินค้า | รหัสสินค้า | ราคา
ต้องการ: ค้นหาจากรหัส แล้วดึงชื่อสินค้า (ซึ่งอยู่ด้านซ้าย) → ทำไม่ได้ด้วย VLOOKUP
.
**วิธีแก้ 3 วิธี:**
.
**1. จัดเรียงคอลัมน์ใหม่** (วิธีง่ายที่สุด)
– เปลี่ยนเป็น: รหัสสินค้า | ชื่อสินค้า | ราคา
– =VLOOKUP(“P001”, A:C, 2, FALSE)
.
**2. ใช้ INDEX + MATCH** (ส่วนตัวผมแนะนำวิธีนี้)
“`
=INDEX(A:A, MATCH(“P001”, B:B, 0))
“`
– INDEX ดึงค่าจากคอลัมน์ A (ชื่อสินค้า)
– MATCH หาตำแหน่งแถวที่รหัส “P001” อยู่ในคอลัมน์ B
– ไม่จำกัดทิศทาง ยืดหยุ่นสูง
.
**3. ใช้ XLOOKUP** (Excel 365 เท่านั้น)
“`
=XLOOKUP(“P001”, B:B, A:A)
“`
– ง่ายที่สุด ค้นหาได้จากทิศทางใดก็ได้
– ถ้ามี Excel 365 ใช้อันนี้เลยครับ
ใช่ครับ นี่คือข้อจำกัดอีกอันของ VLOOKUP 😅
.
**พฤติกรรมของ VLOOKUP:** เมื่อมีข้อมูลซ้ำหลายแถว จะคืนค่าจากแถวแรกที่เจอเท่านั้น ไม่มีทางดึงค่าที่ 2, 3, 4… ได้ด้วย VLOOKUP
.
**ตัวอย่างปัญหา:**
รหัสพนักงาน | วันที่ขาย | ยอดขาย
E001 | 01/01/2024 | 10,000
E001 | 02/01/2024 | 15,000
E001 | 03/01/2024 | 20,000
.
=VLOOKUP(“E001”, A:C, 3, FALSE) → จะได้ 10,000 เท่านั้น (แถวแรก)
.
**วิธีแก้ตามสถานการณ์:**
.
**1. รวมข้อมูลทั้งหมด** (ถ้าต้องการผลรวม)
“`
=SUMIF(A:A, “E001”, C:C) → 45,000
“`
.
**2. ดึงทุกค่าที่ตรง** (Excel 365)
“`
=FILTER(C:C, A:A=”E001″)
“`
→ คืนค่า Array: {10000; 15000; 20000}
.
**3. ดึงค่าที่ N** (แถวที่ 2, 3…)
“`
=INDEX(C:C, SMALL(IF(A:A=”E001″, ROW(A:A)), 2))
“`
→ Array Formula ดึงค่าการขายครั้งที่ 2 ของ E001
.
**4. ใช้ Helper Column**
– เพิ่มคอลัมน์: รหัส + ลำดับ (E001-1, E001-2, E001-3)
– VLOOKUP ค้นหา “E001-2” แทน
.
💡 ส่วนตัวผมแนะนำให้ใช้ FILTER ใน Excel 365 ครับ เพราะออกแบบมาสำหรับเรื่องนี้โดยเฉพาะ
**Error #REF! = Invalid Reference (อ้างอิงผิด)**
**สาเหตุหลัก:**
**1. col_index_num เกินจำนวนคอลัมน์ใน table_array**
– ตัวอย่าง: table_array คือ A1:C10 (3 คอลัมน์) แต่ใส่ col_index_num = 5
– แก้: เปลี่ยนเป็น 1, 2, หรือ 3
**2. ลบคอลัมน์ใน table_array จนเกิน col_index_num**
– เดิมมี 5 คอลัมน์ ใช้ col_index_num = 5
– ลบคอลัมน์ 2 คอลัมน์ เหลือ 3 คอลัมน์
– col_index_num = 5 เกินจำนวนคอลัมน์ → #REF!
– แก้: ใช้ MATCH แทนตัวเลขคงที่
**3. table_array อ้างอิงคอลัมน์ที่ถูกลบไปแล้ว**
– สูตรเดิม: =VLOOKUP(A2, B2:E10, 3, 0)
– ลบคอลัมน์ D → table_array เหลือ B2:D10 แต่ Excel ไม่ Adjust
– แก้: ใช้ Named Range หรือ Table Reference
**วิธีป้องกัน Error #REF!:**
**1. ใช้ Excel Table** (แนะนำที่สุด)
“`
=VLOOKUP(A2, ProductTable, 3, 0)
“`
– ถ้าลบ/เพิ่มคอลัมน์ Table จะ Adjust อัตโนมัติ
**2. ใช้ MATCH หา col_index_num**
“`
=VLOOKUP(A2, B:E, MATCH(“Price”, B1:E1, 0), 0)
“`
– ลบคอลัมน์ไปกี่คอลัมน์ MATCH ก็หาใหม่
**3. ใช้ Named Range**
– สร้าง Named Range = “ProductData”
– =VLOOKUP(A2, ProductData, 3, 0)
– ปรับช่วง Named Range เมื่อมีการเปลี่ยนแปลง
**ปัญหา:** VLOOKUP ใช้ Linear Search (ค้นหาทีละแถวจนเจอ) ทำให้ช้าเมื่อข้อมูลหลักหมื่น-แสนแถว
**เทคนิคเร่งความเร็ว 8 วิธี:**
**1. ใช้ Exact Match (FALSE) แทน Approximate (TRUE)**
– FALSE เร็วกว่าเพราะหยุดทันทีที่เจอ
– TRUE ต้องเช็คทุกแถวจนเจอค่าที่ใหญ่กว่า
**2. เรียงข้อมูล + ใช้ TRUE**
– ถ้าเรียงแล้ว TRUE จะใช้ Binary Search (เร็วมาก)
– แต่ต้องแน่ใจว่าเรียงถูกต้อง
**3. จำกัด table_array ให้เล็กที่สุด**
– ❌ =VLOOKUP(A2, A:Z, 3, 0) → ช้า (ค้นหา 1 ล้านแถว)
– ✅ =VLOOKUP(A2, A2:C5000, 3, 0) → เร็ว (ค้นหา 5000 แถว)
**4. ใช้ INDEX + MATCH แทน VLOOKUP**
“`
=INDEX(C:C, MATCH(A2, B:B, 0))
“`
– เร็วกว่า 10-20% ในข้อมูลขนาดใหญ่
**5. ใช้ XLOOKUP (Excel 365)**
“`
=XLOOKUP(A2, B:B, C:C)
“`
– ใช้ Binary Search โดยอัตโนมัติ เร็วกว่า VLOOKUP มาก
**6. แปลงเป็น Excel Table**
– Table มี Indexing ทำให้ค้นหาเร็วขึ้น
– =VLOOKUP(A2, ProductTable, 3, 0)
**7. ใช้ Helper Column แทน Nested Function**
– ❌ =VLOOKUP(TRIM(A2), …, UPPER(…), 0) → ช้า
– ✅ แยกทำ Helper Column ก่อน แล้วค้นหา Column นั้น
**8. ใช้ Power Query (ข้อมูลเกิน 100,000 แถว)**
– Merge Queries ทำงานเร็วกว่าสูตรมาก
– โหลดผลลัพธ์เป็น Table ไม่ต้องคำนวณซ้ำ
💡 **Benchmark (100,000 แถว):**
– VLOOKUP: ~5 วินาที
– INDEX/MATCH: ~4 วินาที
– XLOOKUP: ~2 วินาที
– Power Query: ~0.5 วินาที
VLOOKUP เป็นฟังก์ชันที่ได้รับความนิยมสูงสุดใน Excel มากว่า 20 ปีแล้วครับ 😊
.
มันทำงานแบบง่ายๆ คือ ค้นหาข้อมูลแนวตั้ง (Vertical Lookup) โดยหาค่าในคอลัมน์ซ้ายสุดของตาราง แล้วดึงข้อมูลจากคอลัมน์อื่นในแถวเดียวกันมาแสดง เหมาะมากสำหรับงานแบบ:
.
แต่… VLOOKUP มีข้อจำกัดสำคัญที่ต้องระวังนะครับ 😅 คือต้องค้นหาจากคอลัมน์ซ้ายสุดของตารางเท่านั้น และไม่สามารถดึงข้อมูลจากด้านซ้ายของคอลัมน์ค้นหาได้ (ซึ่งเป็นปัญหาที่หลายคนติดมาก)
.
ถ้ามี Excel 365 หรือ 2021 ส่วนตัวผมแนะนำให้ลองเรียนรู้ XLOOKUP แทนนะครับ เพราะทำงานได้ทุกอย่างที่ VLOOKUP ทำได้ แถมยืดหยุ่นและเร็วกว่าด้วย 🚀