Thep Excel

REDUCEรวมผลลัพธ์จาก Array เป็นค่าเดียว

REDUCE เป็นฟังก์ชัน Helper ที่ทำงานร่วมกับ LAMBDA เพื่อวนลูปประมวลผลข้อมูลใน Array โดยรับค่าเริ่มต้น (initial_value) และส่งค่าเข้า LAMBDA ทีละ element เพื่อคำนวณค่าสะสม (accumulator) ที่สืบเนื่องจากรอบก่อนหน้า แล้ว return ผลลัพธ์สุดท้ายเพียงค่าเดียว ต่างจาก SCAN ที่ return Array ของทุกขั้นตอน REDUCE เหมาะสำหรับการสร้าง custom aggregation ที่ซับซ้อนกว่าฟังก์ชันมาตรฐาน

fx
=REDUCE([initial_value], array, lambda)

ความนิยม9/10
ความยาก8/10
ประโยชน์10/10

อัปเดต 18 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
[initial_value]ไม่บังคับ Any ค่าแรกของ Array ค่าเริ่มต้นสำหรับ accumulator ถ้าไม่ระบุ Excel จะใช้ element แรกของ Array เป็นค่าเริ่มต้นและเริ่มวนลูปที่ element ที่ 2 แนะนำให้ระบุชัดเจนเสมอเพื่อหลีกเลี่ยง data type ไม่ตรงกัน (เช่น 0 สำหรับ sum, 1 สำหรับ product, “” สำหรับ text)
array Range/Array ช่วงข้อมูลหรือ Array ที่ต้องการประมวลผล สามารถเป็น range reference (เช่น A1:A10), named range, table column (เช่น Sales[Amount]), หรือ array constant (เช่น {1,2,3,4,5})
lambda Function ฟังก์ชัน LAMBDA ที่ต้องรับพารามิเตอร์ 2 ตัว: accumulator (ค่าสะสมจากรอบก่อนหน้า) และ value (element ปัจจุบันจาก Array) แล้ว return ค่าที่จะเป็น accumulator ของรอบถัดไป สูตร LAMBDA มีรูปแบบ LAMBDA(a, v, expression) โดย a = accumulator, v = current value

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

REDUCE เป็น LAMBDA Helper Function ที่ใช้วนลูปผ่านทุก element ใน Array และคำนวณค่าสะสม (accumulator) ด้วย LAMBDA ที่กำหนดเอง จนได้ผลลัพธ์สุดท้ายเพียงค่าเดียว

ต่างจาก SCAN ที่ return Array ของทุกขั้นตอน REDUCE return เฉพาะค่าสุดท้าย เหมาะสำหรับการสร้าง custom aggregation เช่น conditional sum ที่ซับซ้อนกว่า SUMIF, text concatenation แบบมีเงื่อนไข, batch find-replace หลายคำพร้อมกัน หรือการคำนวณแบบ sequential ที่ขั้นตอนถัดไปขึ้นกับผลลัพธ์ก่อนหน้า

เอาจริงๆ REDUCE เป็นฟังก์ชันที่ทรงพลังมาก แต่ต้องเข้าใจ concept ของ accumulator ให้ดีก่อนนะครับ พอเข้าใจแล้วจะเปิดโลกใหม่ให้กับการทำงานกับ Array เลย 😎

How it works

Custom Aggregation ที่ฟังก์ชันมาตรฐานทำไม่ได้

สร้างการคำนวณแบบกำหนดเองเช่น sum เฉพาะเลขคู่, count เฉพาะค่าที่มากกว่าค่าเฉลี่ย, หรือ product ของเฉพาะค่าบวก ซึ่ง SUMIF/COUNTIF ทำไม่ได้เพราะต้องใช้ฟังก์ชันใน criteria

Text Processing แบบมีเงื่อนไข

รวมข้อความโดยกรองเฉพาะข้อมูลที่ต้องการ เช่น concatenate เฉพาะชื่อที่ยาวกว่า 3 ตัวอักษร หรือรวมเฉพาะค่าที่ไม่ซ้ำ ซึ่ง TEXTJOIN ทำเงื่อนไขซับซ้อนไม่ได้

Batch Find and Replace

ใช้ REDUCE วนลูป SUBSTITUTE เพื่อแทนที่หลายคำพร้อมกัน เช่น แก้คำผิดหลายคำในข้อความเดียว หรือทำ data cleansing โดยลบอักขระพิเศษหลายตัวออกจากข้อความ

Sequential Calculation

คำนวณแบบต่อเนื่องที่แต่ละขั้นตอนขึ้นกับผลลัพธ์ก่อนหน้า เช่น คำนวณดอกเบี้ยทบต้น, running balance ของบัญชี, หรือการคำนวณที่ผลของรอบก่อนเป็น input ของรอบถัดไป

Array Building แบบมีเงื่อนไข

สร้าง Array ใหม่จากข้อมูลเดิมโดยมีเงื่อนไขซับซ้อน เช่น รวม Array หลายชุดแบบมีเงื่อนไข หรือแปลงข้อมูลที่ไม่สามารถใช้ MAP ได้เพราะต้องอ้างอิงผลลัพธ์ก่อนหน้า

Examples

ตัวอย่างที่ 1: Foundation – ผลรวมพื้นฐาน (เหมือน SUM)REDUCE(0, {1,2,3,4,5}, LAMBDA(a, v, a+v))

เริ่มต้นด้วย a=0 (initial_value) แล้วบวกทีละตัว:

• รอบ 1: a=0, v=1 → return 0+1 = 1
• รอบ 2: a=1, v=2 → return 1+2 = 3
• รอบ 3: a=3, v=3 → return 3+3 = 6
• รอบ 4: a=6, v=4 → return 6+4 = 10
• รอบ 5: a=10, v=5 → return 10+5 = 15

ผลลัพธ์สุดท้ายคือ 15 ซึ่งเหมือนกับ =SUM(1,2,3,4,5)

นี่คือตัวอย่างพื้นฐานที่แสดงการทำงานของ REDUCE: ค่า a คือผลสะสมจากรอบก่อนหน้า และ v คือค่าปัจจุบันจาก Array ครับ

fx
=REDUCE(0, {1,2,3,4,5}, LAMBDA(a, v, a+v))

ผลลัพธ์15
ตัวอย่างที่ 2: Foundation – หา MAX (ค่าสูงสุด)REDUCE(0, {5,3,9,1,7}, LAMBDA(a, v, MAX(a, v)))

เปรียบเทียบค่าสะสม (a) กับค่าปัจจุบัน (v) แล้วเก็บค่าที่มากกว่า:

• รอบ 1: a=0, v=5 → MAX(0,5) = 5
• รอบ 2: a=5, v=3 → MAX(5,3) = 5
• รอบ 3: a=5, v=9 → MAX(5,9) = 9
• รอบ 4: a=9, v=1 → MAX(9,1) = 9
• รอบ 5: a=9, v=7 → MAX(9,7) = 9

ได้ 9 ซึ่งเป็นค่าสูงสุดใน Array (เหมือน =MAX(5,3,9,1,7))

แสดงให้เห็นว่า REDUCE สามารถทำ comparison operation ได้ ไม่ใช่แค่บวกลบอย่างเดียวครับ

fx
=REDUCE(0, {5,3,9,1,7}, LAMBDA(a, v, MAX(a, v)))

ผลลัพธ์9
ตัวอย่างที่ 3: Practical – รวมเฉพาะเลขคู่REDUCE(0, {1,2,3,4,5,6,7,8,9,10}, LAMBDA(a, v, IF(ISEVEN(v), a+v, a)))

ใช้ IF กับ ISEVEN เพื่อบวกเฉพาะเลขคู่:

• v=1 (คี่) → return a ไม่เปลี่ยน
• v=2 (คู่) → return a+2
• v=3 (คี่) → return a ไม่เปลี่ยน
• v=4 (คู่) → return a+4
• v=5 (คี่) → return a ไม่เปลี่ยน
• v=6 (คู่) → return a+6
• v=7 (คี่) → return a ไม่เปลี่ยน
• v=8 (คู่) → return a+8
• v=9 (คี่) → return a ไม่เปลี่ยน
• v=10 (คู่) → return a+10

ผลลัพธ์: 2+4+6+8+10 = 30

นี่คือสิ่งที่ SUMIF ทำไม่ได้เพราะ ISEVEN return array ไม่ใช่ range criteria ปกติ แต่ REDUCE แก้ปัญหานี้ได้ด้วยการใช้ IF ภายใน LAMBDA 😎

fx
=REDUCE(0, {1,2,3,4,5,6,7,8,9,10}, LAMBDA(a, v, IF(ISEVEN(v), a+v, a)))

ผลลัพธ์30
ตัวอย่างที่ 4: Practical – ต่อข้อความแบบมีเงื่อนไขREDUCE("", {"John","Al","Michael","Bob","Tom"}, LAMBDA(a, v, IF(LEN(v)>3, IF(a="", v, a&", "&v), a)))

ต่อข้อความเฉพาะชื่อที่ยาวกว่า 3 ตัวอักษร คั่นด้วยคอมม่า:

• v="John" (4 ตัว) → ใช้เงื่อนไข LEN(v)>3 = TRUE → เช็ค a="" → ใช่ → return "John"
• v="Al" (2 ตัว) → LEN(v)>3 = FALSE → return a เดิม = "John"
• v="Michael" (7 ตัว) → TRUE → a ไม่ว่าง → return "John, Michael"
• v="Bob" (3 ตัว) → FALSE → return a เดิม = "John, Michael"
• v="Tom" (3 ตัว) → FALSE → return a เดิม = "John, Michael"

ได้ "John, Michael" โดยไม่มีคอมม่านำหน้าเพราะใช้ IF(a="", v, a&", "&v) ป้องกัน

นี่คือสิ่งที่ TEXTJOIN ทำไม่ได้เพราะ TEXTJOIN ไม่สามารถใช้ฟังก์ชันใน if_empty parameter ได้ ส่วน REDUCE ให้ความยืดหยุ่นมากกว่าครับ 💡

fx
=REDUCE("", {"John","Al","Michael","Bob","Tom"}, LAMBDA(a, v, IF(LEN(v)>3, IF(a="", v, a&", "&v), a)))

ผลลัพธ์"John, Michael"
ตัวอย่างที่ 5: Advanced – Batch SUBSTITUTE (แทนที่หลายคำ)REDUCE("Hello World, Good Morning", {"Hello","World","Good"}, LAMBDA(txt, word, SUBSTITUTE(txt, word, "Hi")))

ใช้ REDUCE วนลูป SUBSTITUTE เพื่อแทนที่หลายคำพร้อมกัน:

• รอบ 1: txt="Hello World, Good Morning", word="Hello"
→ SUBSTITUTE → "Hi World, Good Morning"
• รอบ 2: txt="Hi World, Good Morning", word="World"
→ SUBSTITUTE → "Hi Hi, Good Morning"
• รอบ 3: txt="Hi Hi, Good Morning", word="Good"
→ SUBSTITUTE → "Hi Hi, Hi Morning"

สุดท้ายได้ "Hi Hi, Hi Morning" โดยแทนที่ทั้ง 3 คำพร้อมกัน

ทำไมต้องใช้ REDUCE?

ถ้าใช้ SUBSTITUTE ปกติ จะต้อง nest กันหลายชั้น =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(…))) ซึ่งอ่านยาก และถ้ามีคำที่ต้องแทนที่เยอะ (เช่น 20 คำ) สูตรจะยาวมาก 😭

REDUCE ทำให้อ่านง่ายและขยายได้ง่ายกว่า แค่เพิ่มคำใน Array ก็จัดการได้เลย 👍

fx
=REDUCE("Hello World, Good Morning", {"Hello","World","Good"}, LAMBDA(txt, word, SUBSTITUTE(txt, word, "Hi")))

ผลลัพธ์"Hi Hi, Hi Morning"
ตัวอย่างที่ 6: Advanced – นับจำนวน element ที่ตรงเงื่อนไขREDUCE(0, {5,12,3,18,7,21,9}, LAMBDA(a, v, IF(v>10, a+1, a)))

นับจำนวนค่าที่มากกว่า 10 โดยไม่ใช้ค่า v มาบวก แต่ใช้บวก 1 แทน:

• v=5 → 5>10 = FALSE → return a+0
• v=12 → 12>10 = TRUE → return a+1
• v=3 → 3>10 = FALSE → return a+0
• v=18 → 18>10 = TRUE → return a+1
• v=7 → 7>10 = FALSE → return a+0
• v=21 → 21>10 = TRUE → return a+1
• v=9 → 9>10 = FALSE → return a+0

มี 3 ค่าที่มากกว่า 10 (12, 18, 21) ได้ผลลัพธ์ 3

เทคนิคที่น่าสนใจ: ไม่จำเป็นต้องใช้ค่า v เสมอนะครับ บางครั้งเราแค่ใช้ v เพื่อเช็คเงื่อนไข แล้วบวกค่าคงที่ (เช่น +1) แทน

Pattern นี้ใช้กับการ count แบบมีเงื่อนไขที่ COUNTIF ทำไม่ได้ 💡

fx
=REDUCE(0, {5,12,3,18,7,21,9}, LAMBDA(a, v, IF(v>10, a+1, a)))

ผลลัพธ์3
ตัวอย่างที่ 7: Advanced – Find & Replace จาก Lookup TableLET( text, "XL training and PPT training", find_list, {"XL","PPT"}, replace_list, {"Excel","PowerPoint"}, REDUCE(text, SEQUENCE(ROWS(find_list)), LAMBDA(txt, i,…

ใช้ REDUCE กับ lookup table เพื่อแทนที่หลายคำจากตาราง:

Setup:
• text = "XL training and PPT training" (ข้อความต้นทาง)
• find_list = {"XL","PPT"} (คำที่ต้องการหา)
• replace_list = {"Excel","PowerPoint"} (คำที่ใช้แทนที่)
• SEQUENCE(ROWS(find_list)) = {1;2} (index สำหรับวนลูป)

Process:
• i=1: INDEX(find_list,1)="XL", INDEX(replace_list,1)="Excel"
→ SUBSTITUTE("XL training and PPT training", "XL", "Excel")
→ "Excel training and PPT training"
• i=2: INDEX(find_list,2)="PPT", INDEX(replace_list,2)="PowerPoint"
→ SUBSTITUTE("Excel training and PPT training", "PPT", "PowerPoint")
→ "Excel training and PowerPoint training"

Use Case สุดจริง 🔥

เหมาะสำหรับ data cleansing ที่มี lookup table ของคำผิด-คำถูก หรือ abbreviation-fullname หลายสิบคู่

แค่เพิ่มใน find_list และ replace_list สูตรก็จะทำงานอัตโนมัติ ไม่ต้องแก้สูตร Pattern นี้ขยายได้ไม่จำกัด ถ้ามี 100 คู่ก็ใช้สูตรเดียวกันนี้ได้เลยครับ 😎

fx
=LET(
text, "XL training and PPT training",
find_list, {"XL","PPT"},
replace_list, {"Excel","PowerPoint"},
REDUCE(text, SEQUENCE(ROWS(find_list)),
LAMBDA(txt, i,
SUBSTITUTE(txt,
INDEX(find_list, i),
INDEX(replace_list, i)
)
)
)
)

ผลลัพธ์"Excel training and PowerPoint training"
ตัวอย่างที่ 8: Real-World – คำนวณดอกเบี้ยทบต้นLET( principal, 10000, monthly_deposit, 1000, annual_rate, 0.06, months, 12, monthly_rate, annual_rate/12, REDUCE(principal, SEQUENCE(months), LAMBDA(balance, m…

คำนวณเงินคงเหลือหลังฝาก 1,000 บาทต่อเดือนเป็นเวลา 12 เดือน โดยมีดอกเบี้ย 6% ต่อปี:

ตั้งต้น:
• principal = 10,000 บาท (เงินต้นเริ่มต้น)
• monthly_deposit = 1,000 บาท (ฝากเพิ่มทุกเดือน)
• annual_rate = 6% → monthly_rate = 0.5% (0.06/12)

Process (คำนวณทีละเดือน):
• เดือน 1: balance=10,000 → (10,000+1,000)×1.005 = 11,055
• เดือน 2: balance=11,055 → (11,055+1,000)×1.005 = 12,115.28
• เดือน 3: balance=12,115.28 → (12,115.28+1,000)×1.005 = 13,180.85
• … (วนต่อไปเรื่อยๆ)
• เดือน 12: balance = 23,563.50 บาท

ทำไมต้องใช้ REDUCE?

การคำนวณดอกเบี้ยทบต้นแบบนี้ขึ้นกับผลลัพธ์ของรอบก่อนหน้า (sequential calculation) ฟังก์ชันปกติเช่น FV ไม่สามารถจัดการกรณีที่มีเงินฝากเพิ่มทุกเดือนพร้อมดอกเบี้ยทบต้นได้ครบถ้วน

REDUCE ให้ control เต็มที่ในการคำนวณแต่ละขั้นตอน นี่คือ real-world use case ของ REDUCE ในการทำ financial modeling ที่ซับซ้อนครับ 💰

fx
=LET(
principal, 10000,
monthly_deposit, 1000,
annual_rate, 0.06,
months, 12,
monthly_rate, annual_rate/12,
REDUCE(principal, SEQUENCE(months),
LAMBDA(balance, month,
(balance + monthly_deposit) * (1 + monthly_rate)
)
)
)

ผลลัพธ์23563.50

FAQs

REDUCE ต่างจาก SCAN อย่างไร?+

ความแตกต่างหลักคือประเภทของผลลัพธ์:

REDUCE:
• Return ผลลัพธ์สุดท้ายค่าเดียว (single value)
• เหมาะสำหรับ final result เช่น ผลรวมสุดท้าย, ข้อความที่รวมเสร็จ
• ตัวอย่าง: =REDUCE(0, {1,2,3,4,5}, LAMBDA(a,v,a+v)) → 15

SCAN:
• Return Array ของผลลัพธ์ทุกขั้นตอน (array of intermediate results)
• เหมาะสำหรับ running totals, progressive results
• ตัวอย่าง: =SCAN(0, {1,2,3,4,5}, LAMBDA(a,v,a+v)) → {1;3;6;10;15}

เมื่อไหร่ใช้อะไร:
• ใช้ REDUCE เมื่อต้องการแค่ผลลัพธ์สุดท้าย (aggregate value)
• ใช้ SCAN เมื่อต้องการเห็นผลสะสมทุกขั้นตอน (running results, cumulative totals)

ทั้งสองฟังก์ชันใช้ LAMBDA เหมือนกันและมี syntax คล้ายกัน แตกต่างแค่ output ครับ

ถ้าไม่ใส่ initial_value จะเกิดอะไรขึ้น?+

ถ้าไม่ระบุ initial_value ไว้ Excel จะทำ 2 สิ่ง:

1. ใช้ element แรกของ Array เป็น initial_value
2. เริ่มวนลูปที่ element ที่ 2 (ข้าม element แรก)

ตัวอย่าง:
“`
=REDUCE(, {10,20,30}, LAMBDA(a,v,a+v))

• รอบ 1: a=10 (ค่าแรกใน Array), v=20 → 10+20=30
• รอบ 2: a=30, v=30 → 30+30=60

ผลลัพธ์: 60
“`

ข้อควรระวัง:
• Data type อาจไม่ตรงกับที่ต้องการ (เช่น คาดหวัง 0 แต่ได้ text)
• การคูณจะผิดถ้า element แรกไม่ใช่ 1
• อ่านสูตรยากขึ้นเพราะไม่ชัดเจนว่าค่าเริ่มต้นคืออะไร

Best Practice: ระบุ initial_value ชัดเจนเสมอ:
• 0 สำหรับ sum
• 1 สำหรับ product
• "" (empty text) สำหรับ concatenation
• 0 หรือ -999999 สำหรับ MAX/MIN

ส่วนตัวผมแนะนำให้ใส่เสมอนะครับ จะได้อ่านสูตรง่ายกว่า

Accumulator คืออะไรและทำงานอย่างไร?+

Accumulator (มักตั้งชื่อ `a` หรือ `acc`) คือตัวแปรที่เก็บค่าสะสมระหว่างการวนลูป

วงจรการทำงาน:
1. รอบแรก: a = initial_value
2. รอบถัดไป: a = ผลลัพธ์ที่ LAMBDA return จากรอบก่อน
3. รอบสุดท้าย: REDUCE return ค่า a ของรอบสุดท้าย

ตัวอย่างเห็นภาพ:
“`
=REDUCE(0, {5,10,15}, LAMBDA(a,v,a+v))

รอบ 1:
Input: a=0 (initial), v=5 (element แรก)
Process: a+v = 0+5 = 5
Return: 5 → จะเป็น a ของรอบถัดไป

รอบ 2:
Input: a=5 (จากรอบก่อน), v=10 (element ที่ 2)
Process: a+v = 5+10 = 15
Return: 15 → จะเป็น a ของรอบถัดไป

รอบ 3:
Input: a=15 (จากรอบก่อน), v=15 (element สุดท้าย)
Process: a+v = 15+15 = 30
Return: 30 → จบการวนลูป

ผลลัพธ์สุดท้าย: 30
“`

Key Point: LAMBDA ต้อง return ค่าที่จะกลายเป็น accumulator ของรอบถัดไป ดังนั้นต้องคิดว่าอยากให้ค่าสะสมเป็นอะไรหลังจากประมวลผล element ปัจจุบันแล้ว

เข้าใจตรงนี้แล้ว จะเขียน REDUCE ได้คล่องมากขึ้นครับ

สามารถใช้ REDUCE ทำ Running Total ได้ไหม?+

ตอบสั้นๆ: ไม่เหมาะครับ

REDUCE return ค่าสุดท้ายค่าเดียว ไม่ใช่ Array ของทุกขั้นตอน

ถ้าใช้ REDUCE:
“`
=REDUCE(0, {10,20,30,40}, LAMBDA(a,v,a+v))
ผลลัพธ์: 100 (ผลรวมสุดท้ายค่าเดียว)
“`

ถ้าต้องการ Running Total ต้องใช้ SCAN:
“`
=SCAN(0, {10,20,30,40}, LAMBDA(a,v,a+v))
ผลลัพธ์: {10;30;60;100} (Array แสดงผลสะสมทุกขั้น)
“`

เมื่อไหร่ใช้อะไร:
• REDUCE: ต้องการแค่ผลสุดท้าย → ผลรวม, ข้อความที่รวมเสร็จ, ค่าสูงสุด
• SCAN: ต้องการเห็นทุกขั้นตอน → Running Total, Cumulative Sum, กราฟแสดงความคืบหน้า

ถ้าใช้ REDUCE ทำ Running Total จะได้แค่ตัวเลขสุดท้ายมาตัวเดียว ซึ่งไม่ใช่สิ่งที่ต้องการนะครับ

REDUCE รองรับ Excel เวอร์ชันไหนบ้าง?+

REDUCE เป็น LAMBDA Helper Function ที่รองรับเฉพาะ:

✅ รองรับ:
• Microsoft 365 (subscription)
• Excel 2024
• Excel for the web
• Excel for Mac (Microsoft 365)

❌ ไม่รองรับ:
• Excel 2021 หรือเก่ากว่า
• Excel 2019
• Excel 2016
• Excel 2013
• Standalone versions ที่ไม่ใช่ subscription

วิธีตรวจสอบ:
พิมพ์ =REDUCE( ใน cell ถ้า Excel แสดง tooltip คำแนะนำพารามิเตอร์แสดงว่ารองรับ ถ้าขึ้น #NAME? error แสดงว่า Excel version นั้นไม่รองรับ

Alternative สำหรับ Excel เก่า:
ถ้าไม่มี REDUCE ต้องใช้วิธีอื่นแทน:
• สร้าง Helper Column คำนวณทีละขั้น
• ใช้ VBA User-Defined Function
• ใช้ Power Query (สำหรับ data transformation)
• Nested formulas (อ่านยาก แต่ทำได้บางกรณี)

ส่วนตัวผมแนะนำให้ update เป็น Microsoft 365 นะครับ จะได้ใช้ LAMBDA ครอบครัวได้หมดเลย

REDUCE ช้ากว่าฟังก์ชันมาตรฐานไหม?+

ใช่ REDUCE ช้ากว่าฟังก์ชันมาตรฐาน แต่ความต่างขึ้นกับขนาดข้อมูลครับ

Performance Comparison:
• ข้อมูลน้อย (10,000 rows): REDUCE ช้ากว่าชัดเจน

ตัวอย่าง:
• =SUM(A1:A10000) → เร็วมาก (optimized C++ code)
• =REDUCE(0, A1:A10000, LAMBDA(a,v,a+v)) → ช้ากว่า (วนลูปทีละ cell)

Best Practice:
1. ใช้ฟังก์ชันมาตรฐานก่อนเสมอ ถ้าทำได้:
• SUM, AVERAGE, MAX, MIN → ใช้เลย อย่าใช้ REDUCE
• SUMIF, COUNTIF → ถ้าเงื่อนไขง่าย ใช้อันนี้

2. ใช้ REDUCE เมื่อ:
• ฟังก์ชันมาตรฐานทำไม่ได้
• เงื่อนไขซับซ้อนเกินไป (เช่น sum เฉพาะเลขคู่)
• ต้องการ sequential calculation

3. Optimization Tips:
• ถ้าข้อมูลเยอะมาก ลอง Filter ก่อนใส่ REDUCE
• ใช้ LET เก็บค่าที่คำนวณซ้ำ
• พิจารณาใช้ Helper Column แทน ถ้า performance สำคัญมาก

สรุป: REDUCE ให้ flexibility แลกกับ speed ใช้เมื่อจำเป็นจริงๆ นะครับ

REDUCE กับ MAP ต่างกันอย่างไร?+

ทั้งคู่เป็น LAMBDA Helper Functions แต่ใช้งานต่างกันครับ:

REDUCE:
• วัตถุประสงค์: รวม Array เป็นค่าเดียว (aggregate)
• Input: Array + LAMBDA ที่รับ 2 parameters (accumulator, value)
• Output: Single value (ค่าเดียว)
• Use Case: Sum, Max, Concatenate, Count, คำนวณค่าสุดท้าย
• ตัวอย่าง: =REDUCE(0, {1,2,3}, LAMBDA(a,v,a+v)) → 6

MAP:
• วัตถุประสงค์: แปลงทุก element ใน Array (transform)
• Input: Array + LAMBDA ที่รับ 1 parameter (value)
• Output: Array ที่มีขนาดเท่าเดิม แต่ค่าถูกแปลง
• Use Case: คูณทุกตัวด้วย 2, เปลี่ยนเป็น UPPER, คำนวณ formula สำหรับทุก element
• ตัวอย่าง: =MAP({1,2,3}, LAMBDA(v,v*2)) → {2,4,6}

เปรียบเทียบแบบเห็นภาพ:
“`
Array เริ่มต้น: {10, 20, 30}

MAP (transform):
{10, 20, 30} → apply LAMBDA(v, v*2)
→ {20, 40, 60} (ขนาด Array เท่าเดิม, ค่าถูกแปลง)

REDUCE (aggregate):
{10, 20, 30} → apply LAMBDA(a,v, a+v) with initial=0
→ 60 (ได้ค่าเดียว)
“`

Key Difference:
• MAP: One-to-one mapping (1 input → 1 output per element)
• REDUCE: Many-to-one reduction (many inputs → 1 output)

เมื่อไหร่ใช้อะไร:
• MAP: ต้องการแปลงทุกค่า → คูณ, หาร, เปลี่ยน format
• REDUCE: ต้องการรวมเป็นค่าเดียว → sum, max, concatenate

เข้าใจความต่างตรงนี้ แล้วจะเลือกใช้ได้ถูกต้องครับ

REDUCE สามารถทำงานกับ 2D Array ได้ไหม?+

ได้ครับ แต่จะวนลูปแบบ row-by-row หรือ column-by-column

REDUCE จะประมวลผล 2D Array ทีละแถว (ถ้า Array เป็น vertical) หรือทีละคอลัมน์ (ถ้า Array เป็น horizontal)

ตัวอย่างที่ 1: Sum ทุกค่าใน 2D Array
“`
=REDUCE(0, A1:C3,
LAMBDA(total, row,
total + SUM(row)
)
)
“`

ถ้า A1:C3 มีข้อมูล:
“`
1 2 3
4 5 6
7 8 9
“`

REDUCE จะวนลูป:
• รอบ 1: row={1,2,3} → total=0+SUM({1,2,3})=6
• รอบ 2: row={4,5,6} → total=6+SUM({4,5,6})=21
• รอบ 3: row={7,8,9} → total=21+SUM({7,8,9})=45

ผลลัพธ์: 45

Tips สำหรับ 2D Array:
• ใช้ BYCOL/BYROW ร่วมกับ REDUCE สำหรับ control ที่ดีกว่า
• ถ้าต้องการวนลูปทีละ cell ใช้ TOCOL() แปลงเป็น 1D ก่อน
• Nested REDUCE สามารถวนลูป 2 dimensions ได้

Alternative:
ถ้าต้องการประมวลผลทีละคอลัมน์/แถว ใช้ BYCOL/BYROW จะง่ายกว่า:
“`
=BYCOL(A1:C3, LAMBDA(col, SUM(col)))
“`

REDUCE เหมาะกับ 1D Array มากกว่า สำหรับ 2D ควรพิจารณา BYCOL/BYROW ก่อนนะครับ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ REDUCE จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้REDUCELogical
Logical (7)
BYCOL

BYCOL ส่งแต่ละคอลัมน์ทั้งคอลัมน์เข้า LAMBDA แล้ว return ผลลัพธ์เป็น Array แถวเดียว ต่างจาก MAP ที่ส่งทีละเซลล์ และ BYROW ที่ส่งทีละแถว ทำให้สามารถคำนวณ SUM, MAX, AVERAGE ของทุกคอลัมน์พร้อมกันในสูตรเดียว แทนที่จะต้องเขียนสูตรซ้ำหลายครั้ง ซึ่งช่วยลดโอกาสเกิดข้อผิดพลาดและทำให้แก้ไข logic ได้ง่ายกว่ามาก เหมาะสำหรับงาน dashboard summary, quality checking และการวิเคราตลัพธ์ทีละคอลัมน์แบบเป็นระบบ

BYROW

BYROW เป็น LAMBDA Helper Function ที่ประมวลผลข้อมูลทีละแถว โดยส่งแต่ละแถวทั้งหมด (เป็น array) เข้าไปใน LAMBDA แล้ว return ผลลัพธ์เป็นคอลัมน์เดียว ที่เจ๋งคือ BYROW รองรับทั้ง short-form syntax (=BYROW(array, SUM)) สำหรับการ aggregate ง่ายๆ และ custom LAMBDA สำหรับ logic ซับซ้อนที่ต้องตรวจสอบหลายคอลัมน์พร้อมกัน เช่น ตรวจว่านักเรียนผ่านทุกวิชา (MIN>=50) หรือรวมข้อความหลายคอลัมน์ด้วย TEXTJOIN ต่างจาก MAP ที่ทำงานทีละ cell และ BYCOL ที่ทำงานทีละคอลัมน์ BYROW ทำให้คุณเขียน logic ครั้งเดียว แล้วประมวลผลทุกแถวพร้อมกันทันที

LAMBDA

LAMBDA สร้าง custom function ที่ใช้ซ้ำได้โดยไม่ต้องเขียน VBA กำหนด parameter และ calculation แล้วบันทึกผ่าน Name Manager (Ctrl+F3) ด้วยชื่อที่จดจำง่าย เรียกใช้เหมือนฟังก์ชันมาตรฐาน สูตรอยู่ที่เดียว แก้ไขที่เดียวมีผลทั้ง workbook ใช้ร่วมกับ helper functions (MAP, REDUCE, SCAN, BYROW, BYCOL, MAKEARRAY) สร้างสูตร dynamic array ขั้นสูงได้ รองรับ recursive LAMBDA เรียกตัวเองซ้ำจนถึงเงื่อนไข แทนที่สูตรยาวๆ ด้วย custom function ที่อ่านง่าย

LET

LET ช่วยให้คุณกำหนดชื่อตัวแปร (Named Variables) ภายในสูตร Excel เพื่อเก็บค่าหรือผลลัพธ์การคำนวณ จากนั้นนำชื่อเหล่านั้นมาใช้ซ้ำในสูตรเดียวกัน
.
ทำให้สูตรที่ซับซ้อนอ่านง่ายขึ้นเยอะ ลดข้อผิดพลาดจากการเขียนซ้ำ และเพิ่มความเร็วเพราะแต่ละการคำนวณจะทำงานเพียงครั้งเดียว ไม่ว่าจะถูกอ้างอิงกี่ครั้งก็ตาม

MAKEARRAY

MAKEARRAY สร้าง Dynamic Array ตามขนาดที่กำหนด (rows × cols) โดยใช้ LAMBDA function คำนวณค่าในแต่ละเซลล์ตามตำแหน่ง row และ column index (เริ่มที่ 1) ต่างจาก SEQUENCE ที่สร้างเฉพาะตัวเลขเรียงลำดับ MAKEARRAY สามารถสร้างข้อมูลได้หลากหลายรูปแบบตามการคำนวณที่กำหนดใน LAMBDA เช่น ตารางสูตรคูณ matrix ทางคณิตศาสตร์ pattern ข้อความ หรือค่าสุ่ม เหมาะสำหรับสร้าง dataset ขนาดใหญ่ที่มีรูปแบบเฉพาะ หรือ lookup table แบบ dynamic โดย LAMBDA จะถูกเรียกทำงานสำหรับทุกเซลล์ใน array ผลลัพธ์ ทำให้สร้างข้อมูลจำนวนมากได้อย่างรวดเร็วด้วยสูตรเดียว

MAP

MAP ส่งค่าทีละ element จาก Array หนึ่งหรือหลายตัวเข้าไปประมวลผลใน LAMBDA แล้วคืน Array ผลลัพธ์ที่มีขนาดเท่ากับ input array ต้นฉบับ เหมาะสำหรับ element-wise operations เช่น การแปลงค่าทุกตัว การตรวจสอบเงื่อนไขทีละเซลล์ หรือการคำนวณจากหลาย Array พร้อมกัน ต่างจาก BYROW/BYCOL ที่ส่งทั้งแถวหรือทั้งคอลัมน์ MAP จะส่งเฉพาะค่าเดี่ยวๆ ทีละตำแหน่ง

SCAN

SCAN วนลูปผ่าน array โดยใช้ LAMBDA function คำนวณค่าสะสม (accumulator) และ return array ที่แสดงค่าสะสมในทุกขั้นตอนของการคำนวณ ต่างจาก REDUCE ที่ return เฉพาะค่าสุดท้าย SCAN เหมาะสำหรับ Running Total, Running Maximum/Minimum, การคำนวณดอกเบี้ยทบต้น หรือการแสดงผลลัพธ์แบบต่อเนื่องที่ต้องการเห็นทุกขั้นตอนของการเปลี่ยนแปลง ใช้งานได้ใน Excel 365 และ Excel 2024

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่