if ifs switch

สอนใช้ฟังก์ชัน IF และผองเพื่อน (IFS, SWITCH)

หนึ่งในฟังก์ชันที่ถูกใช้บ่อยที่สุดอันนึงในการเขียนสูตร Excel ก็คือฟังก์ชันที่ชื่อว่า IF ซึ่งมีความสามารถในการเขียนสูตรแบบมีเงื่อนไข ซึ่งเวลาผมสอนมักจะบอกเสมอว่า หากในหัวเรานึกถึงคำว่า “ถ้า” ก็ให้นึกถึง IF ได้เลย ซึ่งนอดีตผมเคยเขียนบทความเกี่ยวกับ IF ไว้แล้ว แต่วันนี้จะมา Refresh ให้ใหม่ พร้อมแนะนำเพื่อนๆ ของมันคือ IFS และ SWITCH ด้วย

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

เช่น สมมติเราจะให้ขนมเป็นของรางวัลเด็ก โดยมีเงื่อนไขว่า จะให้จำนวนขนมตามอายุของเด็ก แต่ถ้าอายุเกิน 10 ปี จะได้ครึ่งนึงของอายุ (เศษปัดทิ้ง) เช่น อายุ 8 ขวบได้ขนม 8 ชิ้น แต่ถ้า 13 ขวบ จะได้ 6 ชิ้น เป็นต้น

เริ่มจากการคิด Logic ของ Decision Tree

ปัญหาของการใช้ IF สำหรับคนที่เพิ่งหัดใช้ก็คือ มักจะคิดไม่ออกว่าผลลัพธ์มันมีกรณีไหนบ้าง (ส่วนใหญ่มักจะคิดแค่ฝั่งเดียวว่าถ้าเงื่อนไขจริงแล้วจะทำอะไร แต่ไม่ได้คิดว่าถ้าเงื่อนไขไม่จริงจะทำอะไร) และบางทีก็ไม่ชัดเจนว่าเงื่อนไขที่เป็นตัวแบ่งแต่ละกรณีมันคืออะไรกันแน่ (ทั้งๆ ที่หลายๆ คนตอบปากเปล่าได้แท้ๆ)

if

ถ้ามีปัญหาเหล่านี้ สิ่งที่ผมอยากบอกคือ อย่าเพิ่งเขียนสูตร แต่ให้ลองเขียนแผนผังการตัดสินใจแบบ Decision Tree ขึ้นมาก่อน (ถ้าเรายังไม่ค่อยคล่อง) เพื่อให้เราสามารถเข้าใจภาพรวมทั้งหมด และคิดเป็นระบบมากขึ้น โดยตกผลึกความคิดได้อย่างชัดเจนก่อนว่าวิธีคิดคำตอบมันมีกี่กรณี ตัวแบ่งคืออะไร?

จะเห็นว่าผลลัพธ์ของโจทย์นี้มีอยู่ 2 กรณี คือ

  1. กรณีอายุเกิน 10 ปี : ได้ครึ่งนึงของอายุ (เศษปัดทิ้ง) ซึ่ง สูตรผลลัพธ์คือ INT(เลขอายุ/2)
  2. กรณีอายุไม่เกิน 10 ปี : ได้ตามอายุ ซึ่ง สูตรผลลัพธ์คือ เลขอายุ

พอเห็นแบบนี้ดังนั้นเงื่อนไขที่เราต้องเช็คก็คือ “อายุเกิน 10 ปีหรือไม่?” นั่นเอง

ดังนั้นสามารถเขียนสูตรได้แบบนี้

การเขียนสูตร IF

สูตร IF 1 ตัว จะแยกผลลัพธ์ได้เป็น 2 แบบ ดังนี้

=IF(logical_test,value_if_true,value_if_false)
=IF(เงื่อนไข,ถ้าเงื่อนไขจริงจะทำอะไร,ถ้าเงื่อนไขเป็นเท็จจะทำอะไร)

Tips : ตรงส่วน logical_test นั้นโดยทั่วไปเราจะใส่สูตรเพื่อให้ออกมาเป็นค่า TRUE/FALSE แต่มันยังสามารถรับค่าที่เป็นตัวเลขได้ด้วย (ถ้าเป็นเลข 0 จะเป็น FALSE ส่วนเลขอื่นๆ จะเป็นจริงทั้งหมด)

ดังนั้นในเคสนี้ สูตรจึงออกมาเป็นแบบนี้

=IF(อายุ > 10,INT(อายุ/2),อายุ)
สอนใช้ฟังก์ชัน IF และผองเพื่อน (IFS, SWITCH) 1

ถ้าปัญหาของคุณคือ คิดและเข้าใจเงื่อนไขทั้งหมด แต่ไม่รู้ว่าจะต้องเขียนสูตรใน input แต่ละตัวของ IF ยังไง ผมจะบอกว่าอย่างนี้ไม่ใช่ปัญหาของการใช้ฟังก์ชัน IF ไม่เป็นแล้วครับ แต่มันเป็นปัญหาของพื้นฐานการเขียนสูตรในเรื่องอื่นๆ ซะมากกว่า เช่น

ส่วน logical_test

การจะเขียนสูตรในส่วนของ logical_test ได้ จะต้องเข้าใจเรื่องดังนี้มาก่อน

  • การจะได้ค่า TRUE/FALSE เกิดได้จาก 2 กรณีหลักๆ คือ
    • การใช้เครื่องหมายเปรียบเทียบ เช่น =, >, <, >=, <=, <> (ไม่เท่ากับ) เช่น ในเคสนี้มีการเทียบว่า อายุ >10 หรือไม่?
    • การฟังก์ชันพวกกลุ่ม IS… เช่น ISNUMBER, ISERROR
  • ฟังก์ชันตรรกศาสตร์เพื่อรวบเงื่อนไขหลายๆ อันเข้าด้วยกัน
    • AND เงื่อนไขย่อยๆ ทุกอันต้องเป็นจริงทั้งหมด จึงจะให้ผลลัพธ์เป็นจริง เขียนในรูปแบบ AND(เงื่อนไข1,เงื่อนไข2)
    • OR เงื่อนไขย่อยๆ อย่างน้อยอันใดอันหนึ่งเป็นจริง จึงจะให้ผลลัพธ์เป็นจริง เขียนในรูปแบบ OR(เงื่อนไข1,เงื่อนไข2)
    • NOT กลับจริงเป็นเท็จ เท็จเป็นจริง เขียนในรูปแบบ NOT(เงื่อนไข)

Tips : ตรงส่วน logical_test นั้นโดยทั่วไปเราจะใส่สูตรเพื่อให้ออกมาเป็นค่า TRUE/FALSE แต่มันยังสามารถรับค่าที่เป็นตัวเลขได้ด้วย (ถ้าเป็นเลข 0 จะเป็น FALSE ส่วนเลขอื่นๆ จะเป็นจริงทั้งหมด) ดังนั้นมันจึงเหมาะกับการใช้ Boolean Logic แทนการใช้ AND, OR ใน Array Formula มากๆ ซึ่งถ้าใครสนใจลองอ่านได้ที่นี่

ส่วนของ value_if_true, value_if_false

ถ้าถามว่าสูตรในส่วนนี้เขียนยังไง ผมจะบอกว่าอันนี้เป็นเรื่องอื่นที่ไม่เกี่ยวกับ IF โดยสิ้นเชิงเลย ถ้าคุณไม่มีความรู้เรื่องการเขียนสูตรอื่นๆ ก็จะทำ Part นี้ไม่ได้ครับ ดังนั้นให้ไปฝึกฝนเรื่องอื่นๆ ด้วย เช่น ในตัวอย่างนี้มีการใช้ INT หรือจะใช้ ROUNDDOWN ก็ได้ แต่ถ้าไม่รู้จักเลยก็จะทำโจทย์นี้ไม่ได้นั่นเอง ซึ่งจะเห็นว่าไม่ได้เกี่ยวกับ IF เลยนะครับ

แล้วถ้าผลลัพธ์มีมากกว่า 2 กรณีล่ะ?

อย่างที่ผมบอกไปก่อนหน้านี้ว่า IF สามารถแสดงผลลัพธ์ได้ 2 กรณี หลายคนอาจะสงสัยว่า แล้วถ้าผลลัพธ์มีมากกว่า 2 กรณีล่ะ? จะทำไง?

ผมจะขอแนะนำแบบนี้ครับ

ถ้าผลลัพธ์ของแต่ละกรณี สามารถใช้การ Lookup ได้ ให้ Lookup

พูดง่ายๆ มันถ้าสิ่งที่เราต้องการ สามารถใช้การสร้างตารางอ้างอิงแล้วดึงค่ากลับมาได้ เช่น การดึงชื่อพนักงานจากรหัสพนักงาน ประเภทสินค้าจากรหัสสินค้า หรือแม้แต่การตัดเกรดจากคะแนนที่ได้ พวกนี้ควรใช้สูตรพวก Lookup/Reference เช่น VLOOKUP, INDEX+MATCH, XLOOKUP แทนการใช้ IF ครับ เพราะจะเขียนสูตรง่ายกว่า แถมยืดหยุ่นและแก้เงื่อนไขได้ง่ายกว่าการใช้ IF เยอะเลย

สอนใช้ฟังก์ชัน IF และผองเพื่อน (IFS, SWITCH) 2

ถ้าผลลัพธ์ของแต่ละกรณี Lookup ไม่ได้

สอนใช้ฟังก์ชัน IF และผองเพื่อน (IFS, SWITCH) 3

เช่น จากข้อมูลข้างต้น เรามีเงื่อนไขการลดราคาว่า

  • ถ้าซื้อเกิน 3 ชิ้น ลด 10%
  • ถ้าซื้อตั้งแต่ 5 ชิ้นขึ้นไป และชำระเงินเป็นเงินสด ถึงจะลด 15%

แบบนี้เราจะใช้พวกสูตรกลุ่ม Lookup ไม่ได้แล้วครับ แต่จะต้องใช้ IF ซ้อนกัน/IFS/SWITCH มาช่วยแทน

และเราก็ควรคิดให้ดีก่อนว่า ควรพิจารณาเงื่อนไขไหนก่อนดี ซึ่งถ้าไล่ให้ครบจริงๆ ต้องเขียนให้มีผลลัพธ์ 3 แบบดังนี้

  • ถ้าซื้อตั้งแต่ 5 ชิ้นขึ้นไป และชำระเงินเป็นเงินสด ถึงจะลด 15%
    (เราต้องคิดอันนี้ก่อนเรื่องซื้อเกิน 3 ชิ้น ไม่งั้นจะไม่มีทางมาตกเงื่อนไขตัวนี้เลย)
  • ถ้าซื้อเกิน 3 ชิ้น ลด 10%
  • นอกนั้น ลด 0%

IF ซ้อนกัน

โดยที่ผมจะขอเริ่มจากตัวที่เป็นพื้นฐานที่ใช้ได้ทุก version นั่นก็คือ IF ซ้อนกัน ซึ่งวิธีทำก็คือใส่ IF ลงไปอีกชุดนึงเลยในส่วนที่เป็น value_if_true หรือ value_if_false ก็ได้ (หรือทั้งคู่ก็ได้)

สอนใช้ฟังก์ชัน IF และผองเพื่อน (IFS, SWITCH) 4

ซึ่งถ้าเขียนเป็นโครงสร้างสูตร จะเป็นดังนี้

=IF(logical_test1,value_if_true1,IF(logical_test2,value_if_true2,value_if_false2))

ถ้าใช้กับโจทย์ที่ให้ไปก็จะเป็นแบบนี้

=IF(AND([@จำนวนชิ้น]>=5,[@วิธีการชำระเงิน]="เงินสด"),0.15,IF([@จำนวนชิ้น]>3,0.1,0))

ซึ่งสูตรข้างบน สามารถใช้ IFS แทนได้ ก็จะไม่ต้องใช้หลายฟังก์ชันซ้อนกัน

IFS

สามารถใช้ฟังก์ชัน IFS ตัวเดียว แล้วเขียนเงื่อนไขคู่ไปกับ value_if_true ไปได้เรื่อยๆ ทีละคู่ได้เลย

ifs
=IFS(logical_test1,value_if_true1,logical_test2,value_if_true2,...)

ซึ่งถ้าอยากจะแสดงค่ากรณีที่ไม่ตรงกับเงื่อนไขใดๆ เลย สามารถใช้ TRUE มาช่วยได้ตอนจบดังนี้

ifs
=IFS(logical_test1,value_if_true1,logical_test2,value_if_true2,TRUE(),value_else)

ถ้าใช้กับโจทย์ข้างบนจะเป็นแบบนี้

=IFS(AND([@จำนวนชิ้น]>=5,[@วิธีการชำระเงิน]="เงินสด"),0.15,[@จำนวนชิ้น]>3,0.1,TRUE,0)

ลองดูตัวอย่างอื่นๆ ได้จากคลิปนี้

SWITCH

ถ้าเราไม่มี IFS ให้ใช้ แต่มี SWITCH ก็สามารถใช้ได้เหมือนกัน (เช่นใน DAX จะ ไม่มี IFS แต่มี SWITCH)

ตามปกติแล้ว SWITCH คือจะคล้ายๆ กับ CHOOSE คือเลือกว่า ถ้าค่าที่เราสนใจเป็นแบบนี้ๆ จะทำอะไร แต่ SWITCH ดีกว่า CHOOSE ตรงที่ว่าค่าที่สนใจสามารถเป็นอะไรก็ได้ ในขณะที่ CHOOSE ค่าที่สนใจต้องเป็นตัวเลข 1,2,3,4,… ไปเรื่อยๆ เท่านั้น

switch
=SWITCH(expression,value1,result1,value2,result2,...,default)

แต่ถ้าเรานำ SWITCH มาพลิกแพลงโดยใส่ TRUE ลงไปใน expression หรือค่าที่จะเช็ค มันจะทำตัวแบบ IFS ได้เลย เพราะเมื่อไหร่ที่ value เป็นจริง มันจะแสดง result ของ value นั้นทันที ดังนี้

switch
=SWITCH(TRUE(),logical_test1,value_if_true1,logical_test2,value_if_true2,value_else)

ถ้าใช้กับโจทย์ข้างบนจะเป็นแบบนี้

=SWITCH(TRUE,AND([@จำนวนชิ้น]>=5,[@วิธีการชำระเงิน]="เงินสด"),0.15,[@จำนวนชิ้น]>3,0.1,0)

จบแล้ว

เช่นเคย ใครอ่านแล้วสงสัยอะไรตรงไหนก็ถามได้เลยนะครับ หากชอบก็ฝากแชร์ให้เพื่อนๆ ด้วยนะ ^^