หาว่ามีไหม...ใช้สูตรอะไรดี Match vs CountIF vs VLookup

ถ้ามองในแง่ความเร็ว ตามตำราบอกว่า สูตร Match เร็วกว่า CountIF หลายสิบเท่าทีเดียว ทำไมจึงเป็นเช่นนี้


Download คู่มือสูตรติดไม้ติดมือได้จาก

https://www.excelexperttraining.com/download/ExpertGuide.pdf

.
สาเหตุที่สูตร Match ทำงานได้เร็วมาก เพราะในการทำงานของสูตรนี้ ไม่จำเป็นต้องหาค่าทั้งหมดที่มี แต่พอนำค่าที่ใช้หาไปเทียบกับพื้นที่ตารางที่เก็บค่าแล้ว พอไล่เทียบค่าไปเรื่อยๆจากบนลงล่างแล้ว พอพบว่ามีค่าตรงกับค่าที่ใช้หาแล้วสูตรก็หยุดทำงาน คืนค่าออกมาเป็นลำดับที่ว่าอยู่ที่รายการที่เท่าไร
.
ส่วนสูตร CountIF จะเสียเวลาทำงานนานกว่าเพราะต้องตรวจสอบข้อมูลทั้งหมดที่มีตั้งแต่รายการแรกจนถึงรายการสุดท้าย จากนั้นจึงคืนค่าออกมาเป็นจำนวนนวนนับว่ามีจำนวนค่าที่ตรงกับค่าที่ใช้หาอยู่ทั้งหมดกี่ค่า
.
แต่นี่เป็นผลการทดสอบตามตำราที่ใช้ค่า Random สุ่มค่าไปเรื่อยๆ ถ้าบังเอิญค่าที่ใช้หามาอยู่รายการแรกๆก็จะตรวจพบได้เร็วขึ้นอีก ยังไม่ได้เทียบกันให้ชัดเจนว่าถ้าค่าที่ใช้หาไปอยู่รายการสุดท้ายเหมือนกัน สูตรไหนจะเร็วกว่ากัน ... ใครที่อยากลองเทียบความเร็วก็เชิญลองได้เองโดยใช้รหัส VBA จากลิงก์นี้ https://stackoverflow.com/questions/29972016/is-there-a-faster-countif
.
แต่อย่างไรก็ตาม ไม่ว่าสูตร Match จะทำงานเร็วกว่าแค่ไหนก็ตาม ผมยังชอบใช้สูตร CountIF แทน Match อยู่ดี
.
1. สูตร CountIF คืนค่าออกมาเป็นตัวเลขจำนวนนับ ถ้าหาแล้วพบว่าไม่มีจะคืนค่าเป็นเลข 0 ซึ่งนำไปใช้ต่อได้ทันที ส่วนสูตร Match หรือ Lookup ใดๆจะคืนค่าออกมาเป็น error N/A ซึ่งต้องเสียเวลาแก้ error ก่อนโดยใช้สูตร ISError หรือ IFError จึงจะลิงก์ค่าไปใช้ต่อได้
.
2. สูตร CountIF จะนับจำนวนค่าทั้งหมดว่ามีค่าซ้ำกี่รายการ ซึ่งถ้ามีซ้ำ >1 ก็ไม่ควรใช้ VLookup หรือ XLookup ไปค้นหาให้เสียเวลาอีก และช่วยให้ไม่ต้องเสียเวลาไปแก้ error N/A ที่เกิดจากสูตรพวก Lookup แม้ว่าสูตร XLookup จะมี option ให้แก้ error ได้ในตัวก็ตามแต่ก็เสียเวลาค้นหาไปแล้ว
.
3. สูตร CountIF สามารถนำไปใช้กับตารางแนวตั้ง แนวนอน หรือมีขนาดใดก็ได้ ต่างจากสูตร Match ที่จำกัดว่าต้องใช้กับตารางตามแนวตั้งโดดๆหรือแนวนอนโดดๆเท่านั้น
.

อยากแนะนำว่าอย่าไปยึดติดกับความเร็วนักเลยครับ ควรมองเรื่องประโยชน์ด้านอื่นๆที่ช่วยทำให้นำไปใช้งานได้อย่างยืดหยุ่นมากขึ้นด้วย แค่หาเครื่องคอมรุ่นใหม่มาใช้แทนก็แก้ปัญหาความเร็วได้แล้ว 

สูตรที่จะตรวจสอบว่ามีหรือไม่มี 

=IF( CountIF( DataRange, รหัส)>0, "มี","ไม่มี")
=IF( IsNumber( Match( รหัส, DataRange,0)), "มี","ไม่มี")
=IF( Not( IsError( Vlookup( รหัส, DataRange,1))), "มี","ไม่มี")
 

ความคิดเห็น