co-create
บทความนี้คือส่วนหนึ่งของโครงการ ร่วมสร้าง “หนังสือคู่มือ Excel ที่เจ๋งที่สุด” ใครที่มี comment เพื่อแนะนำ ปรับปรุงหนังสือได้ คุณจะได้เครดิตในฐานะผู้ร่วมเขียน ลงในหนังสือที่จะพิมพ์จริงๆ ด้วย! อ่านรายละเอียด และดูสารบัญหนังสือ คลิ๊กที่นี่


 

การใช้ VLOOKUP เพื่อค้นหาข้อมูลจากตารางอ้างอิงที่กำหนด

VLOOKUP (Vertical Lookup) เป็นฟังก์ชั่นใน Excel ที่จัดอยู่ในประเภทการค้นหาและอ้างอิงข้อมูล เอาไว้หาข้อมูลจากตารางอ้างอิง โดยใช้คำค้นหาที่เรามีอยู่ หรือที่เรียกภาษาคนทำงานว่า “Mapping ข้อมูล” ซึ่งเป็นสิ่งที่ต้องทำเป็นประจำเวลาที่ต้องทำงานเกี่ยวกับฐานข้อมูลครับ

vlookup-concept

VLOOKUP มีการทำงานอยู่ 2 ลักษณะ ขึ้นอยู่กับข้อมูลในตารางอ้างอิงที่เราจะเข้าไปค้นหา

แบบแรก : ในตารางอ้างอิงต้องมีคำค้นหาที่เราต้องการอยู่เป๊ะๆ จึงให้ผลลัพธ์กลับมาได้

การค้นหาแบบนี้ เหมาะกับกรณีที่คำค้นหาเป็นได้ทั้งข้อความและตัวเลข เช่น ชื่อลูกค้า รหัสสินค้า แต่ว่าในตารางอ้างอิงจะต้องมีค่าตรงกับคำค้นหาเป๊ะๆ จึงจะให้ผลลัพธ์กลับมาได้

ตัวอย่างการใช้งานจริงที่เจอบ่อยๆ คือ เช่น คำค้นหาเป็น ชื่อลูกค้า รหัสสินค้า แล้วต้องการได้ค่ากลับมาจากตารางอ้างอิงว่า  ชื่อสินค้าอะไร น้ำหนักเท่าไหร่ ราคาเท่าไหร่ จัดอยู่ในกลุ่มอะไร ? เป็นต้น

ซึ่งการทำงานในลักษณะแบบนี้เราจะเรียกว่า VLOOKUP แบบ Exact Match (ต้องเจอคำค้นหาเป๊ะ) ซึ่งข้อดีคือให้ข้อมูลเป๊ะมาก ถูกต้องแน่นอน (ถ้าเขียนสูตรไม่ผิด) แต่ข้อเสียคือทำงานช้ามาก

แบบสอง : ในตารางอ้างอิงไม่จำเป็นต้องมีคำค้นหาที่เราต้องการอยู่เป๊ะๆ

ถ้าในตารางอ้างอิง ไม่ได้มีข้อมูลคำค้นหาเป๊ะๆ แต่อาจกำหนดเป็นช่วง เช่น เป็นช่วงคะแนนที่เป็นตัวเลข โดยแต่ละช่วงจะมีระยะเท่ากันหรือไม่เท่ากันก็ได้ เช่น อยากจัดกลุ่มของการให้คะแนนเป็นระดับต่างๆ กัน เช่น หากอยู่ในช่วง 0-49  ให้ขึ้นว่า “แย่” , 50-69= พอใช้, 70 ขึ้นไป =ดีมาก เป็นต้น เราเรียกว่า VLOOKUP แบบ Approximate Match หรือแบบ Range Lookup (เป็นช่วง) นั่นเอง

ข้อดีของ VLOOKUP แบบนี้คือจะทำงานเร็วมาก เพราะใช้การค้นหาแบบ Binary Search คือจะแบ่งข้อมูลในตารางอ้างอิงออกเป็นครึ่งบนครึ่งล่าง แล้วหาว่าอยู่ครึ่งไหน แล้วแบ่งครึ่งไปเรื่อยๆ ดังนั้นข้อจำกัดที่สำคัญของ VLOOKUP แบบนี้คือ ข้อมูลในตารางอ้างอิงจะต้องเรียงจากน้อยไปมากซะก่อนครับถึงจะทำงานได้แบบไม่เพี้ยน

อย่างไรก็ตาม VLOOKUP แบบ Approximate Match นี้สามารถใช้งานกับคำค้นหาที่ไม่ใช่ตัวเลขได้ด้วยนะครับแต่ต้องใช้ให้ถูกวิธี ซึ่งจะอธิบายภายหลังว่าใช้งานยังไง ไม่งั้นจะได้ค่าที่ผิด

วิธีการทำงานของ VLOOKUP

VLOOKUP จะทำงานโดยค้นหาคำที่ต้องการในแนวดิ่ง (จากบนลงล่าง) เมื่อเจอคำค้นหาแล้วจากนั้นไปหยิบข้อมูลในแถวเดียวกันจากคอลัมน์ที่กำหนดกลับมา (อาจแค่นำกลับมาแสดงค่าเฉยๆ หรือ จะเอาไปคำนวณต่อก็ได้ ขึ้นอยู่กับการผูกสูตร)

วิธีการใช้งาน

การใช้ VLOOKUP นั้นจะมี Input ที่ต้องกรอกหลายช่องหน่อยนะครับ อย่าเพิ่งตกใจ ลองค่อยๆอ่านตามไปเรื่อยๆ นะครับ จะมีตัวอย่างให้ดูที่ทำให้เห็นภาพมากขึ้นแน่นอน

= VLOOKUP(lookup_value, table_array, col_index_num,

[range_lookup])

=VLOOKUP(ค้นหาคำนี้,จากคอลัมน์แรกในตารางนี้,เมื่อเจอแล้วให้เอาค่าในคอลัมน์ที่ xx ของตารางกลับมา (นับซ้ายไปขวา), [ใช้โหมด Lookup แบบ Approximate Match หรือ Exact Match])

Concept

  1. วิ่งค้นหา lookup_value จากบนลงล่าง ในคอลัมน์ซ้ายสุดของ table_array
  2. ถ้าเจอ : จะวิ่งไปหยิบข้อมูลทางด้านขวาในลำดับคอลัมน์ (col_index_num ) กลับมา
    ถ้าไม่เจอ : จะขึ้น #N/A

vlookup-concept2

โดย [range_lookup] จะเป็นการระบุโหมดการทำงาน ซึ่ง VLOOKUP มี 2 โหมดด้วยกัน

  • Exact Match(ตั้งค่า Range Lookup เป็น FALSE หรือ 0) = ต้องค้นเจอค่า/คำที่ต้องการเป๊ะๆ จึงจะส่งค่ากลับมา
  • Approximate Match(ตั้งค่า Range Lookup เป็น TRUE หรือ 1) = แม้ไม่เจอค่าที่ต้องการหาเป๊ะๆ ก็ยังส่งค่าบางอย่างกลับมาได้ (อย่างที่บอกว่าเหมาะกับตารางอ้างอิงที่ให้ดูค่าเป็นช่วง)

การใช้งาน VLOOKUP โหมด Exact Match

จุดประสงค์หลัก : เหมาะกับการ Map ข้อมูล (ดึงค่าจาก Reference ที่กำหนด)
มันจะทำงานดังนี้

vlookup-exact

หาคำที่ต้องการจากคอลัมน์ซ้ายสุดของตารางที่กำหนด (Table Array) และทำการหาจากบนลงล่าง (Vertical Lookup)

ผลของการค้นหามี 2 กรณี

  • ถ้าเจอคำที่ต้องการ(ต้องเหมือนเป๊ะๆ) : มันจะหยุดที่บรรทัดนั้น แต่ถ้ามีค่าที่ตรงเงื่อนไขหลายค่า มันจะยึดที่เจออันแรกสุด (อันบนสุดที่เจอ)
    • เมื่อเจอแล้วจากนั้นจะวิ่งไปทางขวาตาม Col Index ที่กำหนด เริ่มนับที่คอลัมน์ซ้ายสุดเป็น 1, ถัดไปทางขวา =2, 3, 4… เพื่อเอาค่าใน Col Index ที่กำหนดกลับมาแสดงค่า
  • ไม่เจอคำที่ต้องการเป๊ะๆ : จะแสดงค่า Error กลับมาเป็น #N/A

ตัวอย่างในรูป ช่อง G6 เกิดจากการใช้ VLOOKUP ค้นหาทะเบียน งง5151 ว่าอยู่บรรทัดไหน ถ้าเจอให้เอาคอลัมน์ที่ 2 ของบรรทัดนั้นกลับมา (นับเฉพาะขอบเขตตาราง Table_Array ที่เลือกไว้) ซึ่งจะได้ค่า Benz

 

ทำไมใช้ VLOOKUP แล้วหาไม่เจอ (ทั้งๆ ที่น่าจะเจอ)?

คุณอาจเคยเจอปัญหา ว่าเห็น lookup_value ในตารางอ้างอิงอยู่เต็มๆ ตา ทำไม VLOOKUP แล้วกลับขึ้นมาว่าเป็น #N/A ซึ่งอาการที่พบบ่อยมีอยู่ 2 แบบ คือ 1. ประเภทข้อมูล (Data Type) ไม่ตรงกัน และ 2. Cell Reference เลื่อน

Data Type ไม่ตรงกัน

อาการนี้พบบ่อยที่สุด นั่นคือ ค่า lookup_value ที่เราระบุไว้ในฟังก์ชั่น VLOOKUP กับค่าที่อยู่ในตารางอ้างอิง ( table_array) เป็นข้อมูลคนละประเภทกันนั่นเอง ที่เจอบ่อยๆ คือ ใน Lookup_value เป็นตัวเลข ส่วนตารางอ้างอิงเป็น Text ที่มีหน้าตาเป็นตัวเลข ซึ่งมองด้วยตาเปล่าอาจมองไม่ออก ต้องใช้ฟังก์ชั่น TYPE มาช่วยตรวจถึงรู้ว่าเป็นข้อมูลประเภทไหนกันแน่ เช่น

vlookup-error

=VLOOKUP(30,ตารางอ้างอิง,2,0) จะขึ้น #N/A หากว่าในตารางอ้างอิงเป็นข้อมูลประเภท Text

ซึ่งทางแก้ คือ เราก็ต้องทำให้ Lookup_value กับตารางอ้างอิงเป็นข้อมูลประเภทเดียวกัน เช่น

  • ทำให้ Lookup_value เป็น Text ไปด้วย เช่น =VLOOKUP(“30”,ตารางอ้างอิง,2,0) หรือ
  • จะ ใช้ cell reference ที่มีข้อมูลเป็น Text เลข 30 ก็ได้ เช่น ถ้าเอา Text เลข 30 ไปไว้ใน B8 ถ้าเขียน =VLOOKUP(B8,ตารางอ้างอิง,2,0) ก็จะเจอ เช่นกัน หรือ
  • ทำให้ตารางอ้างอิงเป็นเลขไปเลย ซึ่งทำได้หลายวิธี เช่น ใช้วิธีเอาเลข 1 ไปคูณให้หมด
    คือ copy เลข 1 –> เลือกตารางอ้างอิงคอลัมน์แรก –> Paste Special –> Multiply

vlookup-error1

Cell Reference เลื่อน

vlookup-error2-add

อาการนี้มักเกิดขึ้นเวลาจะ Lookup ข้อมูลแล้วมีการ Copy สูตรลงมาข้างล่างยาวๆ ไม่ก็ Copy เปลี่ยนคอลัมน์ไปทางแนวนอน แล้วลืมกด Lock ตารางอ้างอิงไว้ ทำให้ตัวที่ถูก Copy ท้ายๆ เลื่อนการอ้างอิงตารางไปผิดตำแหน่ง ทำให้หาข้อมูลไม่เจอ เป็นต้น

ทางแก้ คือ เราควรทำการ ตรึงตำแหน่งสูตร Cell Reference ในส่วนของ ตาราง Table__array ทุกครั้ง โดยการกดปุ่ม F4 ให้มีเครื่องหมาย $ ขึ้นมาคลุม

หรือไม่ก็ใช้วิธีตั้งชื่อ Defined Name ก็ได้เช่นกัน อันนั้นมันจะ ตรึงตำแหน่งสูตร Cell Reference ด้วยการใช้ชื่อเอง เราไม่ต้องมานั่ง Lock อีกครั้ง สะดวกมาก

vlookup-error3

การใช้งาน VLOOKUP โหมด Approximate Match

จุดประสงค์หลัก : เหมาะกับการดึงค่าข้อมูลจาก Reference ที่มีการกำหนดการอ้างอิงข้อมูลเป็นช่วง ที่แต่ละช่วงไม่จำเป็นต้องเท่ากัน ซึ่ง VLOOKUP แบบนี้จะทำงานเร็วมาก ไม่เหมือนกับแบบที่แล้ว

มันจะทำงานดังนี้ (ทุกกรณีหลักการเหมือนกันหมด)

  1. ต้องเรียงค่าที่เราจะค้นหาในตารางอ้างอิงจากน้อยไปมากเสียก่อน นั่นคือ ข้อมูลในคอลัมน์ซ้ายสุดของตารางอ้างอิงจะต้องเรียงจากน้อยไปมากเท่านั้น ไม่งั้นผลการ  VLOOKUP อาจจะ Error
  2. หาคำที่ต้องการจากคอลัมน์ซ้ายสุดของตารางที่กำหนด (Table Array) โดยทำการหาจากบนลงล่าง (Vertical Lookup) จนเจอตัวที่มากกว่าค่าที่กำหนดแล้วจะเด้งกลับ 1 บรรทัด

vlookup-approx-2

ดังนั้นการค้นหาจะมี 2 กรณี

  1. ถ้าเจอค่าที่ต้องการเป๊ะๆ : ถ้ามีค่าเดียว มันจะยึดค่าบรรทัดนั้น ถ้ามี หลายค่า มันจะยึดที่เจออันล่างสุด(เจอค่าที่มากกว่าแล้วเด้งขึ้น 1 บรรทัด)
  2. ถ้าไม่เจอค่าที่ต้องการเป๊ะๆ :ขึ้นอยู่กับค่าคำค้นหาเทียบกับค่าในตารางอ้างอิง
    • อยู่ระหว่างค่าในตาราง : จะหาตัวที่มากกว่าคำค้นหาแล้วเด้งกลับ 1 ช่อง
    • มากกว่าทุกค่าในตาราง : เจอตัวล่างสุด เพราะเด้งมา 1 ช่องจากนอกตาราง
    • น้อยกว่าทุกค่าในตาราง : จะแสดงเป็น #N/A เพราะหาตัวมากกว่าคนค้นหาไม่ได้

ทั้งกรณีที่ 1 และ 2 หลังจากเจอแล้ว มันจะมองในแถวเดียวกัน แล้วนำค่ากลับมาจาก Col Index ที่กำหนด เริ่มนับที่คอลัมน์ซ้ายสุดเป็น 1, ถัดไปทางขวา =2, 3, 4…

InwTips: ทำยังไงให้ VLOOKUP แบบ Exact Match เร็วขึ้นเป็น 100 เท่า!

เราต้องเข้าใจก่อนว่า จะ VLOOKUP แบบเร็วปรื๊ดได้ จะต้องใช้ความสามารถของ VLOOKUP แบบ Approximate ที่ใช้การค้นหา Binary Search เท่านั้น ถ้าเราใช้แบบ Exact Match ตรงๆ มันจะช้ามาก แต่ Approximate Match ก็มีข้อเสียคือ มันดันให้ผลกลับมาแม้ว่าในตารางอ้างอิงไม่มีคำค้นหา

vlookup-super-fast-add

ดังนั้น เราจะต้องจัดการ 2 ประเด็นนี้ก่อน คือ

  1. เรียงคอลัมน์แรกในตารางอ้างอิงจากน้อยไปมากก่อน (รองรับแบบ Approximate)
  2. กำจัดผลลัพธ์ที่ได้กลับมาเกิน ในกรณีที่จริงๆ แล้วคำค้นหาไม่ได้อยู่ในตารางอ้างอิง

ประเด็นที่สองนี้เอง เราสามารถแก้ได้โดยใส่ IF เพื่อเช็คว่า “ถ้าเอาคอลัมน์แรก (ซึ่งก็คือคำค้นหา หรือ Lookup_value) กลับมา มันจะเท่ากับ Lookup_value รึเปล่า?” ถ้าเท่ากันแสดงว่าเป็นผลลัพธ์ที่ใช้ได้ จึงให้เอาค่าจากคอลัมน์ที่ต้องการจริงๆ กลับมาอีกที ถ้าไม่เท่ากัน ก็ให้ขึ้น Error ไป

vlookup-super-fast-concept

สรุปวิธีเขียนสูตร VLOOKUP ให้เร็วขึ้น 100 เท่า!! (แต่ต้องเรียงคอลัมน์แรกน้อยไปมากก่อน)

=IF(VLOOKUP(lookup_value, table_array, 1, TRUE)=lookup_value,VLOOKUP(lookup_value, table_array, col_index_num, TRUE),NA() )
เพียงแค่นี้ สูตร VLOOKUP ของคุณก็จะเร็วขึ้นสุดๆ จนเทียบกับของเดิมไม่ได้เลยครับ!!

การใช้ MATCH เพื่อหาลำดับตำแหน่งของค่าที่เราต้องการ

หากเราเข้าใจการทำงานของฟังก์ชั่น VLOOKUP มาก่อนแล้ว จะพบว่าฟังก์ชั่น MATCH นั้นทำงานคล้ายคลึงกันมากครับ เพราะเจ้า MATCH นี้เอาไว้หาคำที่ต้องการเหมือนกัน แต่เจ้า MATCH นี้จะส่งลำดับของผลลัพธ์คำค้นหามาให้ ว่าอยู่ลำดับที่เท่าไหร่ในแถวหรือคอลัมน์ที่กำหนด ซึ่งกำหนดทิศทางการ MATCH ได้ 2 ทิศ คือ แนวตั้งและแนวนอน

match

วิธีการใช้งาน

=MATCH(lookup_value, lookup_array, [match_type])

=MATCH(หาคำนี้,ว่าอยู่ลำดับที่เท่าไหร่ในแถวหรือคอลัมน์นี้,เลือกประเภทการ Match)
สังเกตว่า Lookup_Array จะมีได้แค่มิติเดียว คือเป็นแถวเดียว หรือ คอลัมน์เดียวเท่านั้น ไม่สามารถใส่เป็นตาราง 2 มิติได้

ประเภท MATCH แนวดิ่ง MATCH แนวนอน
วิธีการสั่งงาน กำหนด Lookup_Array เป็นคอลัมน์เดียว กำหนด Lookup_Array เป็นแถวเดียว
Concept การทำงาน วิ่งจากบนลงล่างdownเมื่อเจอคำที่ต้องการจะแสดงลำดับตำแหน่งกลับมา วิ่งจากซ้ายไปขวาright 

เมื่อเจอคำที่ต้องการจะแสดงลำดับตำแหน่งกลับมา

ประเภทการ MATCH (Match Type)

แบ่งเป็น 3 ประเภท (มีประเภทมากกว่า VLOOKUP อีกนะ)

Match Type การทำงาน หากเจอค่าที่ค้นหาหลายตัว
0 หาค่าที่เท่ากับตัวที่กำหนดเป๊ะๆ ว่าอยู่ลำดับที่เท่าไหร่ คล้าย VLOOKUP แบบ Exact Match ในคอลัมน์หรือแถวเดียวกัน มันจะยึดที่เจออันแรกสุด
1
(หรือ ไม่ใส่ค่า)
Lookup_Array ต้องเรียงน้อยไปมาก 
มันจะหาค่าที่มากกว่า Lookup_ Value แล้วเด้งกลับ 1 ช่อง (แบบเดียวกับ VLOOKUP แบบ Approximate Match)
มันจะยึดที่เจออันหลังสุดครับ 
Tips : มันจะวิ่งไล่จากบนลงล่าง /  ซ้ายไปขวา จนเจอตัวที่มากกว่าค่าที่กำหนดแล้วจะเด้งกลับ 1 ช่อง
-1 Lookup_Array ต้องเรียงมากไปน้อย
มันจะหาค่าที่น้อยกว่า Lookup_ Value แล้วเด้งกลับ 1 ช่อง
มันจะยึดที่เจออันหลังสุดครับ
Tips : มันจะวิ่งไล่จากบนลงล่าง /  ซ้ายไปขวา จนเจอตัวที่มากกว่าค่าที่กำหนดแล้วจะเด้งกลับ 1 ช่อง

แนวทางการใช้งาน

มักใช้ร่วมกับฟังก์ชั่นอื่นเช่น ใช้กับ VLOOKUP (ในส่วน Col_Index_Num)
เพื่อทำให้สามารถเลือก Column ที่ขึ้นกับ User  เลือกได้ (ทำให้ตำแหน่ง Column เป็น Dynamic)

vlookup-match

นอกจากนี้ยังช่วย เวลามีการแทรกคอลัมน์แล้วสูตร Col_Index_Num  ใน  VLOOKUP จะสามารถเลื่อนตามโดยอัตโนมัติ ทำให้ผลลัพธ์ไม่เพี้ยน