SWITCH ประเมินนิพจน์หรือค่าหนึ่งค่า แล้วเปรียบเทียบกับรายการค่าที่กำหนดตามลำดับ เมื่อพบค่าที่ตรงกันจะส่งคืนผลลัพธ์ที่เชื่อมโยงทันที หากไม่ตรงกับค่าใดเลยสามารถกำหนด default value ได้ เหมาะสำหรับแทนที่ nested IF หลายชั้นด้วยไวยากรณ์ที่อ่านง่ายกว่ามาก
=SWITCH(expression, value1, result1, [value2, result2], ..., [default])
=SWITCH(expression, value1, result1, [value2, result2], ..., [default])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| expression | Any | Yes | ค่าหรือนิพจน์ที่ต้องการประเมินและเปรียบเทียบกับรายการค่า สามารถเป็นตัวเลข ข้อความ วันที่ ค่าลอจิก หรือผลลัพธ์จากฟังก์ชันอื่น เช่น A1, WEEKDAY(B1), หรือ TRUE | |
| value1 | Any | Yes | ค่าตัวเลือกแรกที่จะนำมาเปรียบเทียบกับ expression หาก expression ตรงกับ value1 ฟังก์ชันจะส่งคืน result1 ทันที | |
| result1 | Any | Yes | ผลลัพธ์ที่จะส่งคืนเมื่อ expression ตรงกับ value1 สามารถเป็นค่าคงที่ การอ้างอิงเซลล์ หรือสูตรคำนวณ | |
| value2 | Any | Optional | ค่าตัวเลือกที่ 2 ที่จะนำมาเปรียบเทียบกับ expression สามารถระบุคู่ value-result เพิ่มเติมได้สูงสุด 126 คู่ | |
| result2 | Any | Optional | ผลลัพธ์ที่จะส่งคืนเมื่อ expression ตรงกับ value2 ฟังก์ชันจะตรวจสอบตามลำดับจนกว่าจะพบค่าที่ตรงกัน | |
| default | Any | Optional | #N/A error | ค่าที่จะส่งคืนเมื่อ expression ไม่ตรงกับค่าใดเลยในรายการ ถ้าไม่ระบุและไม่มีค่าตรงกัน ฟังก์ชันจะส่งคืน #N/A error แนะนำให้ระบุ default เสมอเพื่อป้องกัน error |
แมปรหัสสถานะ เกรด หมวดหมู่ หรือโค้ดต่างๆ ให้เป็นข้อความที่ผู้ใช้อ่านเข้าใจได้ง่าย เช่น P → Pending, C → Completed, X → Cancelled
กำหนดเปอร์เซ็นต์ส่วนลด อัตราดอกเบี้ย หรือค่าคอมมิชชั่นที่แตกต่างกันตามประเภทสินค้า ระดับลูกค้า หรือช่องทางการขาย
สร้าง label สำหรับรายงาน dashboard หรือ chart ที่เปลี่ยนแปลงตามค่าที่คำนวณได้ เช่น Performance: Poor/Average/Good/Excellent
เปลี่ยนวิธีการคำนวณตามโหมดหรือเงื่อนไขที่ผู้ใช้เลือก เช่น คำนวณภาษีแบบต่างๆ หรือใช้สูตรการตั้งราคาที่แตกต่างกัน
แปลง numeric codes จากระบบอื่นให้เป็นข้อความที่มีความหมาย เช่น error codes, priority levels, หรือ status indicators
SWITCH("M", "S", "Small", "M", "Medium", "L", "Large", "Unknown")=SWITCH("M", "S", "Small", "M", "Medium", "L", "Large", "Unknown")
Medium
SWITCH(3, 1, "อาทิตย์", 2, "จันทร์", 3, "อังคาร", 4, "พุธ", 5, "พฤหัสบดี", 6, "ศุกร์", 7, "เสาร์")=SWITCH(3, 1, "อาทิตย์", 2, "จันทร์", 3, "อังคาร", 4, "พุธ", 5, "พฤหัสบดี", 6, "ศุกร์", 7, "เสาร์")
อังคาร
100 * SWITCH("Electronics", "Electronics", 0.9, "Clothing", 0.8, "Home Goods", 0.85, 1)=100 * SWITCH("Electronics", "Electronics", 0.9, "Clothing", 0.8, "Home Goods", 0.85, 1)
90
SWITCH("Z", "A", "Excellent", "B", "Good", "C", "Average")=SWITCH("Z", "A", "Excellent", "B", "Good", "C", "Average")
#N/A
SWITCH(TRUE, 75>=90, "A", 75>=80, "B", 75>=70, "C", 75>=60, "D", TRUE, "F")**เทคนิค TRUE Pattern:**
– ตั้ง expression = TRUE
– แทนที่ value ด้วย condition (เงื่อนไขที่ส่งคืน TRUE/FALSE)
– SWITCH จะหา condition แรกที่เป็น TRUE แล้วส่งคืน result นั้น
**วิธีทำงาน:**
– expression = TRUE
– ตรวจสอบ condition1: 75>=90 → FALSE ไม่ตรง
– ตรวจสอบ condition2: 75>=80 → FALSE ไม่ตรง
– ตรวจสอบ condition3: 75>=70 → TRUE ตรงกัน
– ส่งคืน "C" ทันที
– TRUE ที่ท้ายสุดทำหน้าที่เป็น default (TRUE ตรงกับ TRUE เสมอ)
**กรณีใช้งานจริง:**
=SWITCH(TRUE, A2>=90, "A", A2>=80, "B", A2>=70, "C", A2>=60, "D", TRUE, "F")
**ข้อควรระวัง:** แม้เทคนิคนี้จะใช้งานได้ แต่ SWITCH จะประเมินทุก condition แม้หาคำตอบแล้ว ทำให้ช้ากว่า nested IF หรือ IFS ในกรณีที่มีการคำนวณซับซ้อน
**ทางเลือกที่ดีกว่า:** ใช้ IFS แทนสำหรับ range-based conditions
=IFS(A2>=90, "A", A2>=80, "B", A2>=70, "C", A2>=60, "D", TRUE, "F")
=SWITCH(TRUE, 75>=90, "A", 75>=80, "B", 75>=70, "C", 75>=60, "D", TRUE, "F")
C
SWITCH("P", "P", "⏳ Pending", "I", "🔄 In Progress", "R", "👀 Under Review", "C", "✅ Completed", "X", "❌ Cancelled", "⚠️ Invalid Status")**Status Codes:**
– P = Pending (รอดำเนินการ)
– I = In Progress (กำลังทำ)
– R = Under Review (รอตรวจสอบ)
– C = Completed (เสร็จสมบูรณ์)
– X = Cancelled (ยกเลิก)
**วิธีทำงาน:**
– expression = "P"
– SWITCH จับคู่ "P" กับ value1="P" → ตรงกัน
– ส่งคืน "⏳ Pending" พร้อมไอคอนนาฬิกาทราย
– default = "⚠️ Invalid Status" สำหรับกรณีข้อมูล corrupt หรือผิดพลาด
**กรณีใช้งานจริง:** =SWITCH(A2, "P", "⏳ Pending", "I", "🔄 In Progress", "R", "👀 Under Review", "C", "✅ Completed", "X", "❌ Cancelled", "⚠️ Invalid Status")
– A2: เซลล์ที่มีรหัสสถานะ
– ผลลัพธ์: ข้อความพร้อมไอคอนที่อ่านง่าย
**ประโยชน์:**
– Dashboard อ่านง่าย ไม่ต้องจำรหัส
– ไอคอนช่วยให้มองเห็นสถานะได้ทันที
– Default ป้องกัน error จากข้อมูลผิดปกติ
– ง่ายต่อการบำรุงรักษามากกว่า nested IF 5 ชั้น
=SWITCH("P", "P", "⏳ Pending", "I", "🔄 In Progress", "R", "👀 Under Review", "C", "✅ Completed", "X", "❌ Cancelled", "⚠️ Invalid Status")
⏳ Pending
50000 * SWITCH("Manager", "Junior", 0.05, "Senior", 0.08, "Manager", 0.12, "Director", 0.15, 0.03)**อัตราคอมมิชชั่นตามตำแหน่ง:**
– Junior: 5% (0.05)
– Senior: 8% (0.08)
– Manager: 12% (0.12)
– Director: 15% (0.15)
– พนักงานอื่นๆ: 3% (0.03) – default rate
**วิธีทำงาน:**
– expression = "Manager"
– SWITCH ค้นหาอัตราคอมมิชชั่น → 0.12 (12%)
– คำนวณ 50,000 * 0.12 = 6,000 บาท
**สูตรใช้งานจริงที่ซับซ้อนขึ้น:**
=B2 * SWITCH(C2, "Junior", 0.05, "Senior", 0.08, "Manager", IF(B2>=100000, 0.15, 0.12), "Director", 0.15, 0.03)
– B2: ยอดขาย
– C2: ตำแหน่งพนักงาน
– Manager ได้ 12% ปกติ แต่ถ้ายอดขายเกิน 100,000 จะได้ 15%
**การขยายผล – รวมกับ IFS สำหรับ tiered commission:**
=SWITCH(C2,
"Manager", IFS(B2>=100000, B2*0.15, B2>=50000, B2*0.12, TRUE, B2*0.08),
"Director", B2*0.15,
B2*0.05
)
**จุดเด่น:**
– ผสมผสาน SWITCH (เลือกตามตำแหน่ง) กับ IF/IFS (เงื่อนไขภายในแต่ละตำแหน่ง)
– result สามารถเป็นฟังก์ชันซับซ้อนได้ ไม่จำเป็นต้องเป็นค่าคงที่
– อ่านง่ายและบำรุงรักษาได้ดีกว่า nested IF ที่มี 10+ เงื่อนไข
=50000 * SWITCH("Manager", "Junior", 0.05, "Senior", 0.08, "Manager", 0.12, "Director", 0.15, 0.03)
6000
SWITCH(TRUE, (B2-C2)/C2 >= 0.2, "📈 Outstanding (+" & TEXT((B2-C2)/C2, "0%") & ")", (B2-C2)/C2 >= 0.05, "✅ Above Target (+" & TEXT((B2-C2)/C2, "0%") & ")", (B2-C…**Performance Tiers:**
– Outstanding: เกินเป้า 20% ขึ้นไป → 📈 พร้อม % ที่เกิน
– Above Target: เกินเป้า 5-20% → ✅ พร้อม % ที่เกิน
– On Track: ± 5% จากเป้า → ➡️ ไม่แสดง %
– Below Target: ต่ำกว่าเป้า 5-20% → ⚠️ พร้อม % ติดลบ
– Critical: ต่ำกว่าเป้า 20%+ → 🚨 พร้อม % ติดลบ
**ตัวอย่างการคำนวณ (B2=57,500, C2=50,000):**
– คำนวณเปอร์เซ็นต์: (57,500 – 50,000) / 50,000 = 0.15 (15%)
– เช็คเงื่อนไข: 0.15 >= 0.2 → FALSE
– เช็คเงื่อนไข: 0.15 >= 0.05 → TRUE ✅
– ส่งคืน: "✅ Above Target (+15%)"
– TEXT((B2-C2)/C2, "0%") จัดรูปแบบเลขทศนิยมเป็น %
**เทคนิคขั้นสูง:**
1. **TRUE Pattern** – ใช้ SWITCH(TRUE, …) เพื่อประเมินช่วงค่า
2. **Nested Calculation** – คำนวณ (B2-C2)/C2 ซ้ำในแต่ละ condition
3. **Dynamic Text** – ใช้ & และ TEXT() สร้างข้อความที่เปลี่ยนตามข้อมูล
4. **Conditional Formatting** – ไอคอนเปลี่ยนตามระดับ performance
**วิธีปรับปรุงประสิทธิภาพด้วย LET:**
=LET(
variance, (B2-C2)/C2,
varText, TEXT(variance, "0%"),
SWITCH(TRUE,
variance >= 0.2, "📈 Outstanding (+" & varText & ")",
variance >= 0.05, "✅ Above Target (+" & varText & ")",
variance >= -0.05, "➡️ On Track",
variance >= -0.2, "⚠️ Below Target (" & varText & ")",
TRUE, "🚨 Critical (" & varText & ")"
)
)
– คำนวณ variance แค่ครั้งเดียว แล้วใช้ซ้ำ
– ลด calculation overhead
– อ่านง่ายและบำรุงรักษาได้ดีขึ้น
**การใช้งานใน Dashboard:**
– ใช้เป็น label ใน chart
– แสดงใน conditional formatting
– สร้าง KPI card ที่อัพเดทอัตโนมัติ
– รองรับการวิเคราะห์แบบ real-time
**ข้อดี:**
– Visual impact สูง (ไอคอนช่วยมองเห็นทันที)
– ข้อมูลครบถ้วน (มีทั้งสถานะและตัวเลข)
– ปรับแต่งได้ง่าย (เปลี่ยน threshold หรือข้อความได้ทันที)
– ใช้สูตรเดียวแทนหลายคอลัมน์
=SWITCH(TRUE, (B2-C2)/C2 >= 0.2, "📈 Outstanding (+" & TEXT((B2-C2)/C2, "0%") & ")", (B2-C2)/C2 >= 0.05, "✅ Above Target (+" & TEXT((B2-C2)/C2, "0%") & ")", (B2-C2)/C2 >= -0.05, "➡️ On Track", (B2-C2)/C2 >= -0.2, "⚠️ Below Target (" & TEXT((B2-C2)/C2, "0%") & ")", TRUE, "🚨 Critical (" & TEXT((B2-C2)/C2, "0%") & ")")
✅ Above Target (+15%)
SWITCH ใช้การเปรียบเทียบแบบ exact matching (เท่ากับพอดี) เหมาะกับการแมปค่าคงที่ เช่น รหัส → ข้อความ และมี default value ในตัว
.
ส่วน IFS ใช้เงื่อนไขทุกแบบ (>, =, <=, =, ) เหมาะกับ range-based conditions แต่ไม่มี default ต้องใช้ TRUE เป็นเงื่อนไขสุดท้าย
.
**ใช้ SWITCH เมื่อ:** ต้องการเปรียบเทียบค่าที่ตายตัว เช่น สถานะ P/I/C, เกรด A/B/C/D, หมวดหมู่สินค้า
**ใช้ IFS เมื่อ:** ต้องการเช็คช่วงค่า เช่น คะแนน >=90, >=80, >=70 หรือเงื่อนไขที่หลากหลาย
ถ้า expression ไม่ตรงกับ value ใดเลย และไม่มี default ฟังก์ชันจะส่งคืน #N/A error 😭 ซึ่งอาจทำให้สูตรอื่นที่อ้างอิงเซลล์นี้เกิด error ตามไปด้วย
.
💡 **Best Practice:** ส่วนตัวผมแนะนำให้ระบุ default value เสมอครับ แม้จะคิดว่าครอบคลุมทุกกรณีแล้ว เพื่อรองรับข้อมูลผิดพลาดหรือกรณีที่ไม่คาดคิด เช่น:
– ใช้ “Unknown”, “Invalid”, “N/A” เป็น default text
– ใช้ 0 หรือ “” (empty string) เป็น default value
– ใช้ IFERROR ครอบสูตรเพื่อจัดการ error: =IFERROR(SWITCH(…), “Error”)
SWITCH รองรับได้สูงสุด 126 คู่ value-result (252 arguments สำหรับ value และ result) บวก 1 expression และ 1 optional default รวมเป็น 254 arguments ซึ่งเพียงพอสำหรับการใช้งานส่วนใหญ่ครับ
.
**ข้อควรพิจารณา:**
– ถ้ามีตัวเลือกมากกว่า 20-30 คู่ ส่วนตัวผมแนะนำให้ใช้ lookup table (VLOOKUP/XLOOKUP) แทนนะครับ เพื่อความอ่านง่ายและบำรุงรักษา
– สูตรที่ยาวเกินไปอาจทำให้คำนวณช้าและแก้ไขยาก 😅
– แนะนำจัดการข้อมูลแมปในตารางแยก แล้วใช้ lookup function อ้างอิงแทน
SWITCH(TRUE, condition1, result1, condition2, result2, …) เป็นเทคนิคที่ใช้ TRUE เป็น expression แล้วแทนที่ value ด้วยเงื่อนไข (conditions) ที่ส่งคืน TRUE/FALSE ทำให้ SWITCH สามารถทำงานกับ range-based conditions ได้คล้าย IFS
**วิธีทำงาน:** SWITCH จะตรวจสอบแต่ละ condition ตามลำดับ เมื่อพบ condition ที่เป็น TRUE (ตรงกับ expression=TRUE) จะส่งคืน result นั้นทันที
**ควรใช้เมื่อไหร่:**
– ต้องการ range-based conditions แต่ต้องการ default value (ซึ่ง IFS ไม่มี)
– มีเงื่อนไขไม่เกิน 5-7 condition (ถ้าเยอะกว่านี้ใช้ IFS ดีกว่า)
**ข้อเสียที่ควรระวัง:**
– SWITCH ไม่มี short-circuit evaluation จะประเมินทุก condition แม้พบคำตอบแล้ว ทำให้ช้ากว่า nested IF หรือ IFS
– ถ้ามี calculation ซับซ้อนใน condition แนะนำใช้ nested IF หรือ IFS แทน
– ไวยากรณ์อาจทำให้สับสนได้ เพราะไม่ได้ออกแบบมาสำหรับจุดประสงค์นี้
SWITCH รองรับเฉพาะ:
– **Excel 2019** (perpetual license)
– **Microsoft 365** (subscription version)
– **Excel Online**
– **Excel for Mac 2019 ขึ้นไป**
ไม่รองรับ Excel 2016, 2013, 2010 หรือเวอร์ชันเก่ากว่า
**ทางเลือกสำหรับ backward compatibility:**
– ใช้ nested IF statements: =IF(A1=”P”, “Pending”, IF(A1=”C”, “Completed”, “Other”))
– ใช้ CHOOSE ร่วมกับ MATCH: =CHOOSE(MATCH(A1, {“P”,”C”,”X”}, 0), “Pending”, “Completed”, “Cancelled”)
– สร้าง lookup table แยก แล้วใช้ VLOOKUP หรือ INDEX-MATCH
**หมายเหตุ:** ถ้าไฟล์ต้องแชร์กับคนที่ใช้ Excel รุ่นเก่า ไฟล์จะเปิดได้แต่สูตร SWITCH จะแสดง #NAME? error
**คำตอบสั้น:** ไม่จริงเสมอไป ขึ้นอยู่กับสถานการณ์
**ข้อดีของ SWITCH:**
– **ไวยากรณ์สั้นและอ่านง่าย** – สูตรกระชับกว่า nested IF มาก
– **บำรุงรักษาได้ง่าย** – แก้ไขหรือเพิ่มเงื่อนไขใหม่ทำได้ง่าย
– **Performance ใกล้เคียงกัน** สำหรับการ exact matching ง่ายๆ
**ข้อเสียของ SWITCH ด้าน Performance:**
– **ไม่มี short-circuit evaluation** – Excel ประเมินทุก expression ในสูตร แม้กระทั่งส่วนที่ไม่ได้ใช้
– **ช้ากว่า nested IF** เมื่อมี calculation ซับซ้อนใน result หรือใช้ SWITCH(TRUE, …)
– **อาจเกิด recursion issues** ในกรณีใช้กับ LAMBDA แบบ recursive
**Nested IF มี short-circuit:**
=IF(A1=”P”, expensive_calc1(), IF(A1=”C”, expensive_calc2(), expensive_calc3()))
– เมื่อ A1=”P” จะคำนวณแค่ expensive_calc1() ไม่ทำ calc2 และ calc3
**SWITCH ไม่มี short-circuit:**
=SWITCH(A1, “P”, expensive_calc1(), “C”, expensive_calc2(), expensive_calc3())
– Excel คำนวณทั้ง calc1(), calc2(), และ calc3() ทุกครั้ง แม้ผลลัพธ์จะใช้แค่ตัวเดียว
**คำแนะนำ:**
– ถ้า result เป็นค่าคงที่หรือการอ้างอิงเซลล์ธรรมดา → ใช้ SWITCH เพื่อความอ่านง่าย
– ถ้ามี calculation ซับซ้อนหรือ performance-critical → ใช้ nested IF หรือ IFS
– ถ้าต้องการทั้งความอ่านง่ายและ performance → ใช้ LET ร่วมกับ SWITCH เพื่อคำนวณล่วงหน้า
เคยเขียน nested IF ซ้อนกันหลายชั้นจนงงเองมั้ยครับ? 😅
.
SWITCH เป็นฟังก์ชันที่ Microsoft สร้างมาเพื่อแก้ปัญหานี้โดยเฉพาะ มันทำงานแบบง่ายๆ คือ รับค่าหนึ่งค่า แล้วเปรียบเทียบกับรายการตัวเลือกที่เราตั้งไว้ เมื่อเจอค่าที่ตรงกันตัวแรก ก็ส่งผลลัพธ์ที่เชื่อมโยงกับค่านั้นกลับมาทันที 💡
.
ข้อดีสำคัญคือ ไวยากรณ์อ่านง่ายกว่า nested IF มาก และแก้ไขได้ง่ายกว่าด้วย ส่วนตัวผมชอบใช้ตอนต้องแปลงรหัสสถานะต่างๆ ให้เป็นข้อความที่อ่านเข้าใจง่ายครับ เช่น P → Pending, C → Completed แบบนี้ 😎
SWITCH เหมาะสำหรับงานที่ต้องการ exact matching เช่น:
| คุณสมบัติ | SWITCH | Nested IF | IFS |
|---|---|---|---|
| ประเภทเงื่อนไข | เท่ากับเท่านั้น (=) | ทุกประเภท | ทุกประเภท |
| Default value | มี (อาร์กิวเมนต์สุดท้าย) | มี (ELSE) | ไม่มี |
| ความอ่านง่าย | ดีมาก | แย่เมื่อซ้อนเยอะ | ดี |
| Short-circuit | ไม่ (ประเมินทุก expression) | ใช่ | ใช่ |
| Excel version | 2019+ | ทุกเวอร์ชัน | 2019+ |
ข้อควรระวัง: SWITCH จะประเมินทุก expression ในสูตร แม้กระทั่งส่วนที่ไม่ถูกใช้งาน ถ้าคุณมีการคำนวณที่ซับซ้อนหรือใช้เวลานาน และต้องการ short-circuit evaluation ควรใช้ nested IF แทน
แม้ SWITCH จะออกแบบมาสำหรับ exact matching แต่คุณสามารถใช้เทคนิค SWITCH(TRUE, condition1, result1, condition2, result2, ...) เพื่อสร้างเงื่อนไขแบบช่วงค่าได้ คล้ายกับ IFS แต่มี default value
=SWITCH(TRUE,
Score>=90, "A",
Score>=80, "B",
Score>=70, "C",
Score>=60, "D",
TRUE, "F"
)
อย่างไรก็ตาม ควรใช้เทคนิคนี้อย่างระมัดระวัง เพราะ SWITCH ไม่ได้ optimize สำหรับการเปรียบเทียบแบบช่วงค่า และจะประเมินทุกเงื่อนไขแม้พบคำตอบแล้ว