IFS ทดสอบหลายเงื่อนไขตามลำดับที่กำหนด และคืนค่าของเงื่อนไขแรกที่เป็น TRUE แล้วหยุดทำงานทันที โครงสร้างเป็นคู่ (เงื่อนไข, ผลลัพธ์) ซ้ำได้สูงสุด 127 คู่ ทำให้อ่านและเขียนง่ายกว่า Nested IF แบบซ้อนชั้น ควรใส่ TRUE เป็นเงื่อนไขสุดท้ายเพื่อกำหนดค่า default ป้องกัน #N/A error มีตั้งแต่ Excel 2019 และ Microsoft 365 เท่านั้น
=IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], ...)
=IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], ...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| logical_test1 | Logical | Yes | เงื่อนไขแรกที่ต้องการทดสอบ ต้องให้ผลลัพธ์เป็น TRUE หรือ FALSE เท่านั้น ถ้าเป็น TRUE จะคืนค่า value_if_true1 ทันทีและหยุดการตรวจสอบเงื่อนไขที่เหลือ ใช้ตัวดำเนินการเปรียบเทียบ (>=, <=, =, , ) หรือฟังก์ชันที่คืนค่า logical เช่น AND, OR, ISBLANK, ISNUMBER | |
| value_if_true1 | Any | Yes | ค่าที่จะคืนกลับมาเมื่อ logical_test1 เป็น TRUE สามารถเป็นตัวเลข ข้อความ วันที่ ค่า Boolean สูตรคำนวณ หรือ cell reference ก็ได้ อนุญาตให้เป็นค่าว่าง (empty) ได้ด้วย | |
| logical_test2 | Logical | Optional | เงื่อนไขที่ 2 ที่จะทดสอบต่อ ถ้า logical_test1 เป็น FALSE สามารถเพิ่มเงื่อนไขได้ต่อเนื่องสูงสุด 127 คู่ (logical_test, value_if_true) โดยทดสอบตามลำดับจากซ้ายไปขวา | |
| value_if_true2 | Any | Optional | ค่าที่จะคืนกลับมาเมื่อ logical_test2 เป็น TRUE สามารถเป็นประเภทข้อมูลใดก็ได้เหมือน value_if_true1 | |
| … | Logical/Any | Optional | สามารถเพิ่มคู่ (logical_test, value_if_true) ได้อีกสูงสุด 125 คู่ รวมเป็น 127 คู่ทั้งหมด แนะนำให้ใส่ TRUE เป็น logical_test สุดท้ายพร้อมค่า default เพื่อป้องกัน #N/A error เมื่อไม่มีเงื่อนไขใดเป็น TRUE |
ใช้ IFS เพื่อแปลงคะแนนตัวเลข (0-100) เป็นเกรด (A-F) หรือระดับการประเมิน (ดีเยี่ยม, ดี, ปานกลาง, ปรับปรุง) แบบอัตโนมัติ เหมาะกับระบบการศึกษา HR performance review
กำหนดอัตราส่วนลดหรือค่าคอมมิชชั่นที่แตกต่างกันตามยอดซื้อ ยอดขาย หรือปริมาณที่สั่งซื้อ โดยแบ่งเป็นช่วงระดับ (tier) เช่น ซื้อครบ 100,000 ได้ส่วนลด 5%, ครบ 500,000 ได้ 10%
แบ่งลูกค้าเป็น VIP tier (Diamond, Platinum, Gold, Silver, Bronze) ตามยอดซื้อสะสม หรือจัดหมวดหมู่สินค้าเป็น Premium, Standard, Economy ตามช่วงราคาหรือคุณสมบัติ
สร้างระบบแจ้งเตือนตามเงื่อนไข เช่น แจ้งสถานะสินค้าคงคลัง (Out of Stock, Low Stock, In Stock, Overstock) หรือสถานะโครงการ (Urgent, High Priority, Normal, Low Priority) ตามข้อมูลที่กำหนด
คำนวณค่าจัดส่ง ค่าธรรมเนียมธนาคาร หรือค่าบริการที่ขึ้นอยู่กับหลายตัวแปร เช่น ระยะทาง น้ำหนัก ประเภทลูกค้า ใช้ IFS ร่วมกับ AND/OR เพื่อรองรับเงื่อนไขที่ซับซ้อน
IFS(85>=90, "A", 85>=80, "B", 85>=70, "C", 85>=60, "D", TRUE, "F")=IFS(85>=90, "A", 85>=80, "B", 85>=70, "C", 85>=60, "D", TRUE, "F")
B
IFS(SalesAmount>=500000, SalesAmount*0.15, SalesAmount>=300000, SalesAmount*0.10, SalesAmount>=100000, SalesAmount*0.05, TRUE, 0)=IFS(SalesAmount>=500000, SalesAmount*0.15, SalesAmount>=300000, SalesAmount*0.10, SalesAmount>=100000, SalesAmount*0.05, TRUE, 0)
45000 (เมื่อ SalesAmount = 300,000)
IFS(Customers[@TotalPurchase]>=1000000, "Diamond", Customers[@TotalPurchase]>=500000, "Platinum", Customers[@TotalPurchase]>=100000, "Gold", Customers[@TotalPur…=IFS(Customers[@TotalPurchase]>=1000000, "Diamond", Customers[@TotalPurchase]>=500000, "Platinum", Customers[@TotalPurchase]>=100000, "Gold", Customers[@TotalPurchase]>=10000, "Silver", TRUE, "Bronze")
Gold (เมื่อ TotalPurchase = 250,000)
IFS(ISBLANK(DataCell), "ไม่มีข้อมูล", ISERROR(DataCell), "ข้อมูลผิดพลาด", ISNUMBER(DataCell), "ตัวเลข", ISTEXT(DataCell), "ข้อความ", TRUE, "Boolean/อื่นๆ")=IFS(ISBLANK(DataCell), "ไม่มีข้อมูล", ISERROR(DataCell), "ข้อมูลผิดพลาด", ISNUMBER(DataCell), "ตัวเลข", ISTEXT(DataCell), "ข้อความ", TRUE, "Boolean/อื่นๆ")
ตัวเลข (เมื่อ DataCell = 1250)
IFS(AND(Score>=80, Attendance>=90), "Excellent", AND(Score>=70, Attendance>=80), "Good", AND(Score>=60, Attendance>=70), "Fair", OR(Score=IFS(AND(Score>=80, Attendance>=90), "Excellent", AND(Score>=70, Attendance>=80), "Good", AND(Score>=60, Attendance>=70), "Fair", OR(Score<60, Attendance<70), "Needs Improvement", TRUE, "Unknown")
Good (เมื่อ Score=75, Attendance=85)
IFS(45>=80, "A", 45>=70, "B", 45>=60, "C")=IFS(45>=80, "A", 45>=70, "B", 45>=60, "C")
#N/A
IFS(Score>=90, "A", Score>=80, "B", Score>=70, "C", Score>=60, "D", TRUE, "F")=IFS(Score>=90, "A", Score>=80, "B", Score>=70, "C", Score>=60, "D", TRUE, "F")
(เทียบเท่า Nested IF) =IF(Score>=90, "A", IF(Score>=80, "B", IF(Score>=70, "C", IF(Score>=60, "D", "F"))))
IFS(AND(Region="Bangkok", Weight=IFS(AND(Region="Bangkok", Weight<=2), 50, AND(Region="Bangkok", Weight<=5), 80, AND(Region="Bangkok", Weight>5), 120, AND(Region<>"Bangkok", Weight<=2), 80, AND(Region<>"Bangkok", Weight<=5), 120, TRUE, 200)
80 (เมื่อ Region="Bangkok", Weight=3)
IFS เขียนและอ่านง่ายกว่า Nested IF เพราะไม่ต้องซ้อนวงเล็บหลายชั้น โครงสร้างเป็นคู่ (logical_test, value_if_true) วางเรียงกันไปตามลำดับ
.
เปรียบเทียบกันดูนะครับ:
– Nested IF: =IF(A>=90,”A”,IF(A>=80,”B”,IF(A>=70,”C”,”F”)))
– IFS: =IFS(A>=90,”A”,A>=80,”B”,A>=70,”C”,TRUE,”F”)
.
ยิ่งมีหลายเงื่อนไข IFS ยิ่งอ่านง่ายกว่ามาก อย่างไรก็ตาม Nested IF มี true short-circuit evaluation (หยุดทำงานทันทีเมื่อเจอ TRUE และไม่ evaluate เงื่อนไขที่เหลือ) ส่วน IFS จะ evaluate ทุก expression ก่อน ซึ่งอาจส่งผลต่อประสิทธิภาพในกรณีที่มีสูตรคำนวณซับซ้อนใน value_if_true
.
ส่วนตัวผมแนะนำใช้ IFS เมื่อต้องการความอ่านง่าย และใช้ Nested IF เมื่อต้องการประสิทธิภาพสูงสุดครับ
เกิด #N/A error เพราะไม่มีเงื่อนไขใดเป็น TRUE เลย และไม่ได้ใส่ค่า default ไว้
.
วิธีแก้คือเพิ่ม TRUE เป็น logical_test สุดท้ายเสมอ พร้อมกำหนดค่า default ที่ต้องการ เช่น =IFS(Score>=80,”A”,Score>=70,”B”,TRUE,”C”) จะได้ “C” เมื่อคะแนนต่ำกว่า 70 แทนที่จะเป็น #N/A
.
การใส่ TRUE ท้ายสุดเป็น best practice ที่สำคัญของการใช้ IFS ครับ เพราะเงื่อนไข TRUE จะเป็น TRUE เสมอ ทำให้มั่นใจว่าจะมีค่าคืนกลับมาเสมอ 💡
สำคัญมากครับ! IFS ทดสอบเงื่อนไขตามลำดับจากซ้ายไปขวาและคืนค่าทันทีเมื่อเจอเงื่อนไขแรกที่เป็น TRUE แล้วหยุดการทำงาน
.
ดังนั้นต้องเรียงเงื่อนไขจากเฉพาะเจาะจงที่สุดไปยังกว้างที่สุด
.
ตัวอย่างเช่น: ถ้าต้องการตัดเกรด ต้องเรียง Score>=90 (A) ก่อน Score>=80 (B) ก่อน Score>=70 (C)
.
ถ้าเรียงกลับกัน (70 ก่อน 80 ก่อน 90) คะแนน 95 จะได้เกรด C เพราะ 95>=70 เป็น TRUE แล้ว ทำให้ไม่ถึงการทดสอบ 95>=80 และ 95>=90 เลย
.
นี่เป็นข้อผิดพลาดที่พบบ่อยมากครับ ระวังให้ดีนะครับ 😅
IFS มีตั้งแต่ Excel 2019, Excel 2021 และ Microsoft 365 เท่านั้น ไม่มีใน Excel 2016, 2013, 2010 หรือเวอร์ชันเก่ากว่า รองรับทั้ง Windows, Mac และ Excel for the web ถ้าใช้งานกับเวอร์ชันเก่ากว่า 2019 ให้ใช้ Nested IF แทน หรือพิจารณาใช้ CHOOSE ร่วมกับ MATCH สำหรับกรณีที่เป็นการเลือกตาม index
IFS ใช้ logical operators (>=, <=, , =, ) เพื่อทดสอบเงื่อนไข เหมาะกับการเปรียบเทียบช่วงค่า (range) เช่น Score>=80
.
ส่วน SWITCH เปรียบเทียบค่าเท่ากัน (exact match) เท่านั้น เหมาะกับการเลือกตามค่าคงที่ เช่น Region=”North” และ SWITCH มี default value built-in อยู่แล้ว ไม่ต้องใส่ TRUE
.
แนะนำใช้ SWITCH เมื่อเปรียบเทียบค่าเท่ากันหลายตัวเลือก (อ่านง่ายกว่า) และใช้ IFS เมื่อต้องการเงื่อนไขที่ซับซ้อนหรือเปรียบเทียบช่วงค่า
.
ตัวอย่าง: =SWITCH(Region,”North”,10%,”South”,8%,5%) กับ =IFS(Region=”North”,10%,Region=”South”,8%,TRUE,5%) ให้ผลเหมือนกัน แต่ SWITCH อ่านง่ายกว่าครับ
IFS รองรับได้สูงสุด 127 คู่ (logical_test, value_if_true) แต่ถ้ามีเงื่อนไขเยอะมากควรพิจารณาใช้วิธีอื่น เช่น XLOOKUP, SWITCH หรือ lookup table เพื่อความอ่านง่ายและบำรุงรักษาง่ายกว่า
.
ข้อจำกัดอื่นๆ:
1) logical_test ต้องคืนค่า TRUE/FALSE เท่านั้น ถ้าไม่ใช่จะได้ #VALUE! error
2) ถ้าไม่มีเงื่อนไขใดเป็น TRUE และไม่มีค่า default จะได้ #N/A
3) IFS ไม่มี true short-circuit evaluation ทำให้อาจช้ากว่า Nested IF ในกรณีสูตรซับซ้อน
4) ความยาวสูตรรวมต้องไม่เกิน 8,192 ตัวอักษร (ข้อจำกัดของ Excel)
ใช้ IFS เมื่อ:
1) มีเงื่อนไข 3-10 เงื่อนไข (มากกว่านี้อ่านยาก)
2) เงื่อนไขใช้ comparison operators (>=, <=)
3) ต้องการความอ่านง่ายกว่า Nested IF
4) ไม่มีการคำนวณซับซ้อนใน value_if_true
.
ใช้วิธีอื่นเมื่อ:
1) มีแค่ 1-2 เงื่อนไข → ใช้ IF ธรรมดา
2) เปรียบเทียบค่าเท่ากันเท่านั้น → ใช้ SWITCH (อ่านง่ายกว่า)
3) ค้นหาจากตาราง → ใช้ VLOOKUP/XLOOKUP
4) เงื่อนไขเกิน 10 เงื่อนไข → ใช้ lookup table
5) ต้องการประสิทธิภาพสูงสุด → ใช้ Nested IF (short-circuit)
6) ใช้ Excel 2016 หรือเก่ากว่า → ใช้ Nested IF (IFS ไม่รองรับ)
IFS สามารถคืนค่า error ได้ 3 แบบ:
.
1) #N/A error เมื่อไม่มีเงื่อนไขใดเป็น TRUE และไม่มีค่า default → แก้ด้วยการใส่ TRUE เป็นเงื่อนไขสุดท้าย
.
2) #VALUE! error เมื่อ logical_test ไม่ได้คืนค่า TRUE/FALSE (เช่น ใส่ตัวเลขหรือข้อความ) → ตรวจสอบให้แน่ใจว่าเงื่อนไขใช้ comparison operators หรือ logical functions
.
3) “You’ve entered too few arguments” เมื่อมี logical_test แต่ไม่มี value_if_true คู่กัน → ตรวจสอบว่ามี argument ครบคู่ (logical_test, value_if_true)
.
นอกจากนี้ถ้ามี error ใน cell ที่ reference (เช่น #DIV/0!) จะส่งต่อ error นั้นมาด้วย สามารถใช้ IFERROR หรือ ISERROR เพื่อจัดการ error ได้ เช่น =IFS(ISERROR(A1),”Error”,A1>=80,”Pass”,TRUE,”Fail”)
IFS เป็นฟังก์ชันที่ทดสอบหลายเงื่อนไขตามลำดับและคืนค่าของเงื่อนไขแรกที่เป็น TRUE แล้วหยุดการทำงานทันที
.
ที่เจ๋งคือ IFS ช่วยให้เราเขียนเงื่อนไขซับซ้อนได้อ่านง่ายกว่า Nested IF มากครับ ไม่ต้องมานั่งซ้อนวงเล็บหลายชั้นจนงง 😅
.
โครงสร้างเป็นคู่ (logical_test, value_if_true) วางเรียงกันไป รองรับได้สูงสุด 127 คู่เงื่อนไข แต่ส่วนตัวผมว่าถ้าเกิน 10 เงื่อนไขควรพิจารณาใช้ lookup table แทนนะครับ 💡
.
ข้อสำคัญ: ควรใส่ TRUE เป็น logical_test สุดท้ายเสมอเพื่อกำหนดค่า default ป้องกัน #N/A error เมื่อไม่มีเงื่อนไขใดตรงเลย นี่คือ best practice ที่ผมแนะนำให้ทำทุกครั้งครับ 😎
.
มีตั้งแต่ Excel 2019 และ Microsoft 365 เท่านั้น ถ้าใช้เวอร์ชันเก่ากว่าจะต้องใช้ Nested IF แทนนะครับ