Author: Pachara Chatavithee

  • เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน

    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน

    ในโลกของการวิเคราะห์ข้อมูล การประมวลผลที่รวดเร็วและมีประสิทธิภาพเป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะเมื่อต้องจัดการกับชุดข้อมูล Array ขนาดใหญ่ใน Microsoft Excel บทความนี้จะแนะนำให้คุณรู้จักกับ BMAPλ (Bisected Map Lambda) เทคนิคใหม่ล่าสุดที่พัฒนาโดย Peter Bartholomew ซึ่งจะช่วยเพิ่มประสิทธิภาพในการประมวลผลข้อมูลของคุณอย่างมีนัยสำคัญ (เร็วขึ้นเป็นสิบเท่า!)

    บทความนี้เป็นบทความจาก Content Creator
    เขียนโดย พชร ชาตะวิถี เจ้าของ กลุ่ม FB : เรียน Excel ฟรี
    บรรณาธิการ ตรวจสอบโดย ศิระ เอกบุตร (เทพเอ็กเซล)
    กลั่นมาจากความคิดทั้งสองคน จึงมั่นใจได้ในความถูกต้องมากขึ้นไปอีกครับ

    BMAPλ คืออะไร?

    BMAPλ หรือ Bisected Map Lambda เป็นเทคนิคการเขียนสูตรใน Excel ที่ใช้หลักการของ recursive function ร่วมกับการแบ่งข้อมูลทีละครึ่ง (bisection) เพื่อเพิ่มประสิทธิภาพในการประมวลผล โดยเฉพาะอย่างยิ่งเมื่อต้องทำงานกับข้อมูลจำนวนมาก

    ผมรู้จักกับ BMAPλ ครั้งแรกจากการแชร์ของคุณโบ Excel Wizard ในกลุ่ม Excel Super Fan ซึ่งได้มาแนะนำความรู้เรื่อง BMAPλ ให้พวกเราได้รู้จักกัน

    หลักการทำงานของ BMAPλ

    1. การแบ่งข้อมูล (Bisection): BMAPλ จะแบ่งชุดข้อมูลออกเป็นสองส่วนเท่าๆ กัน
    2. การเรียกตัวเองซ้ำ (Recursion): ฟังก์ชันจะเรียกตัวเองซ้ำๆ เพื่อประมวลผลข้อมูลในแต่ละส่วนย่อย โดยประมวลผลทีละแถว แต่สามารถให้ผลลัพธ์ที่มีขนาดไม่เท่ากัน (Ragged Arrays) ได้
    3. การรวมผลลัพธ์: เมื่อประมวลผลเสร็จสิ้น BMAPλ จะรวมผลลัพธ์จากทุกส่วนเข้าด้วยกันโดยใช้ VSTACK

    ด้วยวิธีนี้ BMAPλ สามารถลดจำนวนรอบการทำงานจาก N (จำนวนแถวข้อมูลทั้งหมด) เหลือเพียง log2N ซึ่งช่วยเพิ่มความเร็วในการประมวลผลอย่างมาก โดยสามารถใช้กับฟังก์ชันใดๆ ที่รับอาร์เรย์หนึ่งแถวเป็นอินพุต และเหมาะสำหรับการทำงานที่ต้องการผลลัพธ์ที่มีขนาดไม่แน่นอนมากเลย

    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 1
    รูปที่ 1 แนวคิดการแบ่งข้อมูล (bisect)

    การใช้งาน BMAPλ

    ขั้นตอนการสร้างฟังก์ชัน BMAPλ

    1. ไปที่ Formulas -> Name Manager (หรือกด Ctrl + F3)
    2. คลิก New -> ตั้งชื่อฟังก์ชันเป็น BMAPλ
    3. ในช่อง Refers to ให้ใส่สูตรต่อไปนี้:
    = LAMBDA(X, Fnλ,
        LET(
            n, ROWS(X),
            Y, IF(
                n > 1,
                LET(
                    ℓ, n - QUOTIENT(n, 2),
                    X₁, TAKE(X, ℓ),
                    X₂, DROP(X, ℓ),
                    Y₁, BMAPλ(X₁, Fnλ),
                    Y₂, BMAPλ(X₂, Fnλ),
                    IFERROR(VSTACK(Y₁, Y₂), "")
                ),
                Fnλ(X)
            ),
            Y
        )
    )
    1. กด OK เพื่อบันทึก
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 2
    รูปที่ 2 การสร้างฟังก์ชัน BMAPλ ใน Name Manager

    วิธีการใช้งาน BMAPλ

    เมื่อสร้างฟังก์ชัน BMAPλ แล้ว คุณสามารถเรียกใช้งานได้โดยระบุพารามิเตอร์ 2 ตัว:

    1. X: ชุดข้อมูลที่ต้องการประมวลผล
    2. Fnλ: ฟังก์ชันที่ต้องการใช้กับข้อมูลแต่ละแถว

    ในรูปแบบนี้

    =BMAPλ( X, Fnλ )

    ตัวอย่างการใช้งาน BMAPλ

    ตัวอย่างที่ 1: การแยกคำในประโยค

    สมมติว่าเรามีข้อมูลประโยคในคอลัมน์ A และต้องการแยกคำในแต่ละประโยค

    ในสถานการณ์ปกติ MAP จะไม่สามารถใช้ร่วมกับ TEXTSPLIT ได้ โดยมันจะ Error แบบนี้

    =MAP(A2:A7,LAMBDA(x,TEXTSPLIT(x," ")))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 3

    แต่ถ้าเปลี่ยนมาจาก BMAPλ แทน มันก็จะสามารถใช้ได้เลยแบบสบายๆ

    =BMAPλ(A2:A7,LAMBDA(x,TEXTSPLIT(x," ")))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 4

    นอกจากนี้ เราสามารถทำให้ผลลัพธ์มีจำนวนแถวไม่เท่ากันได้ เช่น ผมใช้ TOCOL เพื่อพลิกข้อมูลลงมาให้อยู่คอลัมน์เดียวกัน ก็ยัง work

    =BMAPλ(A2:A7,LAMBDA(x,TOCOL(TEXTSPLIT(x," "))))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 5

    ตัวอย่างที่ 2: การจัดกลุ่มข้อมูล

    สมมติว่าเรามีข้อมูล ID, วันที่, และปริมาณ ต้องการจัดกลุ่มข้อมูลตาม ID

    ที่มา:

    https://gist.github.com/ncalm/0e72b08272ec14f411e8aaa763c0c0b5?trk=article-ssr-frontend-pulse_little-text-block

    1. input data คือ

    ={"ID","Date","Qty";"ID07",44289,3;"ID07",44322,4;"ID08",45251,7;"ID22",44511,12;"ID22",45159,2;"ID22",45038,5;"ID45",45108,16;"ID45",45116,8;"ID61",45116,32}

    ให้ copy ไปวางไว้ที่ cell A1 จะได้ข้อมูล ID ที่ range A2:A10 ข้อมูล date ที่ B2:B10 และ Qty อยู่ที่ C2:C10

    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 6
    รูปที่ 3 Input data (ฝั่งซ้าย)

    2. โจทย์ คือ ต้องการกรองข้อมูล ID เดียวกันมาเรียงให้อยู่ในบรรทัดเดียวกัน

    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 7
    รูปที่ 4 Expected result (ฝั่งขวา)

    3. ตั้งชื่อข้อมูล column ID ว่า a โดย LET ฟังก์ชัน จากนั้นหา ID ที่ไม่ซ้ำกันโดย UNIQUE ฟังก์ชัน และตั้งชื่อว่า u

    =LET(a,A2:A10,u,UNIQUE(a),

    3. X คือ u และฟังก์ชันที่เราจะทำงานกับ X คือ

    LAMBDA(v,TOROW(FILTER(B2:C10,a=v)))

    ฟังก์ชันนี้จะรับค่า v จากนั้นกรองข้อมูล date และ qty (B2:C10) ที่มีค่า ID = v จากนั้นนำมาเรียงอยู่ในบรรทัดเดียวกันโดย TOROW

    4. เรียกใช้ BMAPλ ดังนี้ 

    =LET(a,A2:A10,u,UNIQUE(a),BMAPλ(u,LAMBDA(v,TOROW(FILTER(B2:C10,a=v))))

    5. แปะ ID ไว้หน้าคำตอบเพื่อความเรียบร้อยสวยงาม

    =LET(a,A2:A10,u,UNIQUE(a),HSTACK(u,
    BMAPλ(u,LAMBDA(v,TOROW(FILTER(B2:C10,a=v))))))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 8
    รูปที่ 5 การประยุกต์ใช้ BMAPλ ในการจัดการข้อมูล

    ฟังก์ชันนี้จะจัดกลุ่มข้อมูลตาม ID โดยนำข้อมูลวันที่และปริมาณมาเรียงในแถวเดียวกันได้ตามต้องการ

    เทียบความเร็ว BMAPλ vs REDUCE

    เพื่อทดสอบประสิทธิภาพ เราจะใช้ข้อมูลสุ่ม 10,000 แถว และเปรียบเทียบเวลาการประมวลผลระหว่าง BMAPλ และ REDUCE

    สูตรวัดเวลาการรัน:

    สูตรนี้ได้มาจาก Excel Wizard อีกเช่นเคย ขอบคุณมากครับ

    =LET(st,NOW(),
    rs,
    "ใส่สูตรลงตรงนี้ จะส่งกลับบรรทัดแรกเป็นเวลาประมวลผล",
    VSTACK(TEXT(NOW()-st,"[s].00 \s"),rs))

    ทดลองรันโดย BMAPλ

    =LET(st,NOW(),a,A2:A10001,u,UNIQUE(a),
    rs,
    HSTACK(u,BMAPλ(u,LAMBDA(v,TOROW(FILTER(B2:C10001,a=v))))),
    IFNA(VSTACK(TEXT(NOW()-st,"[s].00 \s"),rs),""))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 9
    รูปที่ 6 รันโดย BMAPλ

    ทดลองรันโดย REDUCE

    =LET(st,NOW(),a,A2:A10001,u,UNIQUE(a),
    rs,
    HSTACK(u,DROP(REDUCE(0,u,LAMBDA(c,v,VSTACK(c,TOROW(FILTER(B2:C10001,a=v))))),1)),
    IFNA(VSTACK(TEXT(NOW()-st,"[s].00 \s"),rs),""))
    เร่งความเร็วสูตรขั้นสุดด้วย BMAPλ: เทคนิคใหม่สำหรับการเขียนสูตร Excel ซับซ้อน 10
    รูปที่ 7 รันโดย REDUCE

    สรุปผลการทดสอบความเร็ว

    ข้อดีของ BMAPλ

    1. ความเร็ว: เมื่อต้องจัดการarray ขนาดใหญ่ที่ต้องการประมวลผลเป็นแถว ๆ ฟังก์ชัน BMAPλ จะช่วยในการแบ่งข้อมูลออกเป็นส่วนย่อย ๆ (bisection) และประมวลผลแต่ละส่วนอย่างมีประสิทธิภาพ ทำให้การทำงานรวดเร็วขึ้นกว่าการต้องอ่านทั้งหมดซ้ำกันบ่อยๆ จากการทดสอบ BMAPλ ทำงานเร็วกว่า REDUCE ถึง 10 เท่า
    2. ความยืดหยุ่น: สามารถจัดการกับข้อมูลที่มีขนาดไม่เท่ากัน (Ragged Arrays) ได้ดีกว่าฟังก์ชัน MAP, REDUCE หรือ SCAN ใน Excel ปัจจุบันซึ่งจะติดข้อจำกัดไม่สามารถทำการคำนวณ Array ของ Array ได้
    3. ประสิทธิภาพ: Peter Bartholomew ผู้สร้างฟังก์ชัน BMAPλ อธิบายเหตุผลที่ BMAPλ รันได้เร็วกว่า เนื่องจากจำนวนรอบการรันลดลงจากต้องรัน N รอบ เหลือ  log2N
    4. ทำลายขีดจำกัด : Excel Wizard ได้แนะนำว่า BMAPλ ช่วยให้เราสามารถข้ามข้อจำกัดเรื่องจำนวนรอบที่จำกัดของฟังก์ชัน recursive จากประมาณ 4000 รอบ เป็น 24000 รอบ

    สรุป

    BMAPλ เป็นเทคนิคที่ทรงพลังสำหรับการจัดการข้อมูลขนาดใหญ่ใน Excel โดยเฉพาะอย่างยิ่งเมื่อต้องการความเร็วและความยืดหยุ่นในการประมวลผล แม้ว่าจะมีความซับซ้อนในการเขียนสูตรมากกว่าฟังก์ชันทั่วไป แต่ประโยชน์ที่ได้รับคุ้มค่ากับการเรียนรู้และนำไปใช้ ลองนำ BMAPλ ไปประยุกต์ใช้กับงานของคุณ และคุณจะพบว่า Excel สามารถทำงานได้เร็วขึ้นอย่างที่คุณไม่เคยคาดคิดมาก่อน!

    แหล่งข้อมูลเพิ่มเติม

    สำหรับผู้ที่สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ BMAPλ สามารถอ่านบทความของ Owen Price ที่จะเล่าประวัติความเป็นมา และอธิบายขั้นตอนการสร้างฟังก์ชันอย่างละเอียดกว่าได้ที่:
    Excel LAMBDA Spotlight: Bisected Map (BMAPλ)

  • การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step)

    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step)

    Recursive function คืออะไร?

    Recursive function คือ ฟังก์ชันที่ทำงานโดยมีการอ้างอิงตัวเองไปเรื่อยๆ ทำงานวนลูป โดยใช้ผลการรันในรอบก่อนหน้า นำไปรันต่อในรอบถัดไป รันไปเรื่อยๆ จนถึงจุดสิ้นสุดที่กำหนด (Stopping criteria) คล้ายกับการใช้ Do While loop ในการเขียนโปรแกรม ต่างกันตรงที่เมื่อมีการวนลูป ฟังก์ชัน recursive จะมีการอ้างอิงตัวมันเองไปเรื่อยๆ

    บทความนี้เป็นบทความจาก Content Creator
    เขียนโดย พชร ชาตะวิถี เจ้าของ กลุ่ม FB : เรียน Excel ฟรี
    บรรณาธิการ ตรวจสอบโดย ศิระ เอกบุตร (เทพเอ็กเซล)
    กลั่นมาจากความคิดทั้งสองคน จึงมั่นใจได้ในความถูกต้องมากขึ้นไปอีกครับ

    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 11
    Do While loop & Recursive LAMBDA flow diagram

    ใน Excel ผมมักจะใช้ฟังก์ชัน Recursive LAMBDA ในงานที่ไม่ทราบจำนวนรอบการรันที่แน่นอน

    เพื่อให้การวนลูปหยุดทันทีเมื่อถึงจุดสิ้นสุดที่กำหนด (หากทราบจำนวนรอบการรันที่แน่นอน ผมมักจะใช้ฟังก์ชัน REDUCE)

    ตัวอย่างปัญหาที่มีจำนวนรอบการรันไม่แน่นอน มีดังนี้ 

    1. การจำลองสถานการณ์การเล่นเกม XO ซึ่งจำนวนรอบการรันจะเท่ากับ 9 รอบ คือเมือ input ค่า X และ O ครบ 9 ช่องแล้วไม่มีผู้ชนะ หรือเกมจะจบทันทีเมื่อมีผู้ชนะ (X หรือ O เรียงกันได้ 3 ช่อง) ก่อนจะใส่ค่าครบ 9 ช่องก็ได้
    2. การสุ่มเปิดตัวเลขในเกม BINGO ซึ่งจำนวนรอบการสุ่มเปิดตัวเลขจะหยุดเมื่อมีคนได้ BINGO เป็นต้น
    3. ใช้ในอัลกอริธึมในการหาตำตอบรูปแบบต่างๆ เช่น Genetic algorithm (GA) หรือ Differential evolution (DE)  ที่มีการกำหนด stopping criteria เป็นต้น

    มาทดลองประยุกต์ใช้ฟังก์ชัน recursive กันเลย lol

    1. ฟังก์ชัน recursive ในการหาคา MOD

    เริ่มจากตัวอย่างง่ายๆ ก่อน คือ กรณีมีส้ม 38 ลูก ต้องการแบ่งใสถุง ถุงละ 8 ลูก จะเหลือเศษกีลูก นันคือ 

    =MOD(38,8) 

    หรือ 

    =(((38-8)-8)-8)-8
    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 12
    การประยุกต์ใช้ recursive ในการหาค่า MOD

    เราสามารถประยุกต์ใช้ฟังก์ชัน recursive ในการหาคา mod ได้ ดังนี้

    ฟังก์ชันของเราจะรับ 2 ค่า คือ รับคา n เริมต้นเท่ากับ 38 และลบออกทีละ d (divisor) เท่ากับ 8 ดังนั้นในแต่ละรอบจะมีการอัพเดท n โดย n-d ส่วนค่า d ไม่มีการอัพเดท stopping criteria คือ เมื่อส้มเหลือน้อยกว่า 8 ลูก คือ n<8 หรือ n<d ให้ส่งกลับค่าจำนวนส้มที่เหลือ

    ฟังก์ชัน recursive ของเราจะสร้างใน cell เพื่อให้คุณมองเห็นภาพรวมของฟังก์ชัน ดังนี้ 

    1.1. เริ่มโดย ฟังก์ชันของเราจะรับ 3 ค่าตัวแปร คือ fx, n, และ d คือ การอ้างอิงตัวเอง (fx) ค่าจำนวนส้มที่เหลือในแต่ละรอบ (n) และจำนวนการแบ่งส้ม (d)

    fx(fx,n,d)

    1.2. ในแต่ละรอบเราจะอัพเดทค่า n แต่ไม่อัพเดทค่า d ดังนี้ 

    fx(fx,n-d,d)

    1.3. ใช้ LET สร้างฟังก์ชัน fx ด้วยฟังก์ชัน LAMBDA รับค่า 3 ค่า คือ fx, n, และ d ดังนี้ 

    =LET(fx,LAMBDA(fx,n,d,

    1.4. ระบุ stopping criteria และค่าที่ต้องการส่งกลับ ดังนี้

    =LET(fx,LAMBDA(fx,n,d,IF(n<d,n

    1.5. ถ้ายังไม่ถึง stopping criteria ให้รันฟังก์ชัน recursive ของเราไปเรื่อยๆ

    =LET(fx,LAMBDA(fx,n,d,IF(n<d,n,fx(fx,n-d,d)

    1.6. เรียกใช้ฟังก์ชัน recursive ของเรากับค่า n = 38 และ d = 8 ดังนี้

    =LET(fx,LAMBDA(fx,n,d,IF(n<d,n,fx(fx,n-d,d))),fx(fx,38,8))

    สรุป

    =LET(
        fx, LAMBDA(fx, n, d,
            IF(n < d, n, fx(fx, n - d, d))
        ),
        fx(fx, 38, 8)
    )

    2. ฟังก์ชัน recursive ในการหาคา FACT

    การหาค่า 5! หรือ 5*4*3*2*1 สามารถหาค่าได้จากสูตร ดังนี้

    =FACT(5)

    หรือ

    =5*(5-1)*((5-1)-1)*(((5-1)-1)-1)*((((5-1)-1)-1)-1)
    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 13
    การประยุกต์ใช้ recursive ในการหาค่า FACT

    รับค่า n เริ่มต้นเท่ากับ 5 ในรอบแรก ค่าคำตอบจะถูกอัพเดทเท่ากับ 5*(5-1) หรือ n*(n-1) และเราจะวนลูปไปเรื่อยๆ จนกระทั่ง n เท่ากับ 1

    เราสามารถประยุกต์ใช้ฟังก์ชัน recursive ในการหาคา factorial ได้ดังนี้

    2.1. ฟังก์ชันของเรารับ 2 ค่า คือ fx และ n

    fx(fx,n) 

    2.2. อัพเดทค่า n โดย n*(n-1)…

    n*fx(fx,n-1) 

    2.3.ใช้ LET สร้างฟังก์ชัน fx ด้วย LAMBDA รับค่า 2 ค่า คือ fx และ n ดังนี้

    =LET(fx,LAMBDA(fx,n

    2.4. ในตัวอย่างนี้ลองเปลี่ยนจาก stopping criteria มาระบุ running criteria และค่าที่ต้องการส่งกลับ ดังนี้

    =LET(fx,LAMBDA(fx,n,IF(n>1,n*fx(fx,n-1),1)

    2.5. เรียกใช้ฟังก์ชัน recursive ของเรากับค่า n = 5 ดังนี้

    =LET(fx,LAMBDA(fx,n,IF(n>1,n*fx(fx,n-1),1)),fx(fx,5))

    สรุป

    =LET(
        fx, LAMBDA(fx, n,
            IF(n > 1, n * fx(fx, n - 1), 1)
        ),
        fx(fx, 5)
    )

    3. ประยุกต์ใช้ฟังก์ชัน recursive ในการลบข้อมูลที่ไม่ต้องการออกจากข้อมูลตัวอักษร

    ในตัวอย่างนี้เราต้องการ clean ข้อมูลจาก A2 โดยการลบข้อมูลใน B2 ออก

    เราสามารถ clean ข้อมูลนี้ด้วยฟังก์ชัน REDUCE ได้ดังนี้

    =REDUCE(
        A2,
        MID(B2, SEQUENCE(LEN(B2)), 1),
        LAMBDA(a, v, SUBSTITUTE(a, v, ""))
    )
    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 14
    การประยุกต์ใช้ recursive ในการ clean data

    ฟังก์ชัน recursive ในการ clean data ในตัวอย่างนี้สามารถสร้างได้ ดังนี้

    3.1. ฟังก์ชันของเรารับ 3 ค่าตัวแปร คือ fx, symbol (s), และ text (t) ดังนี้

    fx(fx,s,t) 

    3.2. อัพเดทค่า s โดย 

    MID(s,2,LEN(s)-1)

    3.3. อัพเดทค่า t โดย 

    SUBSTITUTE(t,LEFT(s),"")

    3.4. recursive ฟังก์ชันของเราจะอัพเดท s และ t ดังนี้

    fx(fx,MID(s,2,LEN(s)-1),SUBSTITUTE(t,LEFT(s),"")

    3.5.ใช้ LET สร้างฟังก์ชัน fx ด้วย LAMBDA รับค่า 3 ค่า คือ fx, s, และ t ดังนี้

    =LET(fx,LAMBDA(fx,s,t

    3.6. ระบุ stopping criteria และค่าที่ต้องการส่งกลับ ดังนี้

    =LET(fx,LAMBDA(fx,s,t,IF(s="",t,
    fx(fx,MID(s,2,LEN(s)-1),SUBSTITUTE(t,LEFT(s),""))

    3.7. เรียกใช้ฟังก์ชัน recursive ของเรากับค่า s = B2 และ t = A2 ดังนี้

    =LET(fx,LAMBDA(fx,s,t,IF(s="",t,
    fx(fx,MID(s,2,9),SUBSTITUTE(t,LEFT(s),"")))),
    fx(fx,B2,A2))

    สรุป

    =LET(
        fx, LAMBDA(fx, s, t,
            IF(
                s = "",
                t,
                fx(
                    fx,
                    MID(s, 2, 9),
                    SUBSTITUTE(t, LEFT(s), "")
                )
            )
        ),
        fx(fx, B2, A2)
    )

    ข้อจำกัดของฟังก์ชัน recursive ใน Excel

    ขณะที่ผมเขียนบทความนี้ ฟังก์ชัน recursive ใน Excel จะสามารถรันได้มากที่สุด 5,460 รอบ และถ้าในฟังก์ชันมีการใช้ฟังก์ชัน LET จะมีจำนวนรอบสุงสุดลดลงเหลือ 4,095 รอบ

    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 15
    จำนวนรอบสูงสุดที่ฟังก์ชัน recursive สามารถรันได้ใน  Excel

    ฝากการบ้านให้ไปลองแกะสูตรดูครับ ^^

    ผมลองประยุกต์ใช้ฟังก์ชัน recursive ในการจำลองสถานการณ์การเล่นเกม XO เผื่อมีท่านใด สนใจในเชิงลึก อยากลองแกะสูตรเล่นดู โดยตัวเกมจะเริ่มจากตารางว่างๆ 9 ช่อง และจะมีการสุ่ม input ค่า X และ O สลับกันไปเรื่อยๆ และหยุดรันทันทีเมื่อมีผู้ชนะหรือใส่ค่าครบทุกช่อง และผลยังไม่มีผู้ชนะ สูตรมีดังนี้ครับ

    =LET(
        s, SEQUENCE(3, 3),
        r, SORTBY(TOCOL(s), RANDARRAY(9)),
        c, LAMBDA(v, CONCAT(v)),
        fx, LAMBDA(fx, t, n,
            IF(
                AND(
                    OR(t = ""),
                    ISERR(
                        FIND(
                            {"XXX", "OOO"},
                            TEXTJOIN(
                                1,
                                ,
                                BYROW(t, c),
                                BYCOL(t, c),
                                c(REPT(t, s = {1, 5, 9})),
                                c(REPT(t, s = {7, 5, 3}))
                            )
                        )
                    )
                ),
                fx(fx, IFS(t > "", t, s = INDEX(r, n + 1), IF(MOD(n + 1, 2), "X", "O"), 1, ""), n + 1),
                t
            )
        ),
        fx(fx, IF(s, ""), )
    )
    การใช้ฟังก์ชัน Recursive ในสูตร Excel (step by step) 16
    การจำลองสถานการณ์การเล่นเกม XO โดยฟังก์ชัน recursive ลองแกะดูนะครับ ^^

    สรุป

    จากตัวอย่างที่กล่าวมาในข้างต้น คุณจะเห็นขั้นตอนในการสร้างฟังก์ชัน recursive ของผมอย่างละเอียด ผมจะค่อยๆสร้างทีละขั้นตอน สิ่งสำคัญที่เราต้องมองให้ออก คือ 

    1. ตัวแปรที่ฟังก์ชันของเราต้องการมีอะไรบ้าง 
    2. แต่ละตัวแปรถูกอัพเดทอย่างไรในแต่ละรอบการรัน
    3. จุดสิ้นสุดหรือ stoppping criteria หรือบางเคสเป็น running criteria
    4. สร้างฟังก์ชันตามโครงสร้างของ recursive LAMBDA ดังนี้
    =LET(fx,LAMBDA(fx,ตัวแปร1,ตัวแปร2,...,
    IF(เงื่อนไขการหยุด,ส่งกลับ,recursive function)),
    fx(fx,input1,input2,...))

    โดยส่วนตัวคิดว่าการใช้ฟังก์ชัน recursive จะใช้จำนวนรอบการรันที่น้อยกว่า ตัวอย่างเช่นใน เกม XO ถ้าเราใช้ฟังก์ชัน REDUCE เราต้องรัน 9 รอบ โดยเมื่อพบผู้ชนะกำหนดให้ input ค่าที่เหลือเป็น “” ก็ทำได้ ดังนั้นผมขอสรุปว่าคุณสามารถเลือกทำได้ทั้ง 2 วิธี ตราบใดที่ยังไม่กระทบต่อเวลาประมวลผลที่ยอมรับได้ โดยใน REDUCE คณจะต้องมั่นใจว่ากำหนดจำนวนรอบในการรันที่เพียงพอที่จะทำให้ได้คำตอบ เพราะถ้าจำนวนรอบน้อยเกินไป อาจจะส่งผลให้คำตอบผิด อย่างไรก็ตามในการทำงานจริงฟังก์ชัน REDUCE จะถูกใช้แทนฟังก์ชัน recursive หากติดปัญหาเรื่องข้อจำกัดด้านจำนวนรอบการรันในปัญหาขนาดใหญ่

  • การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step)

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step)

    ใน LAMBDA helper functions ผมคิดว่า REDUCE เป็นฟังก์ชันที่พา Excel ไปสู่ยุคใหม่ของการเขียนสูตร เพราะเราสามารถใช้ REDUCE ในการทำงานแบบวน loop เหมือนที่เราทำในการเขียนโปรแกรมได้แล้ว 😂

    ซึ่งการทำ looping มีประโยชน์มากในการทำงาน กล่าวโดยสรุปได้ดังนี้

    1. ช่วยให้เราสามารถรันสูตรเดิมซ้ำๆ อย่างอัตโนมัติไม่ต้อง copy ไปวางอีกต่อไป
    2. ช่วยให้สูตรของเราสั้นลงเนื่องจาก รันหลายๆรอบ ก็เขียนสูตรแค่รอบเดียว
    3. ช่วยเพิ่มความ dynamic ให้กับสูตร ตัวอย่างเช่น จำนวนรอบในการรันข้อมูลขึ้นอยู่กับขนาดของ input data กรณีในอนาคตมีการเพิ่มหรือลดข้อมูล คำตอบจะถูกอัพเดทโดยอัตโนมัติ เป็นต้น

    เรามาดูวิธีการใช้งาน REDUCE กันครับ

    บทความนี้เป็นบทความจาก Content Creator
    เขียนโดย พชร ชาตะวิถี เจ้าของ กลุ่ม FB : เรียน Excel ฟรี
    บรรณาธิการ ตรวจสอบโดย ศิระ เอกบุตร (เทพเอ็กเซล)
    กลั่นมาจากความคิดทั้งสองคน จึงมั่นใจได้ในความถูกต้องมากขึ้นไปอีกครับ

    Syntax ของ REDUCE

    =REDUCE([initial_value], array, lambda(accumulator, value, body))
    • [initial_value] คือ ค่าเริ่มต้น ก่อนที่ REDUCE จะเริ่มทำงาน สามารถใส่เป็นค่าเดี่ยวหรือใส่เป็น array ก็ได้ เนื่องจากเป็น optional argument [..] ถ้าเราว่างไว้  REDUCE จะใช้ value ตัวแรกของ array เป็น initial_value และส่งกลับค่านี้ในรอบที่ 1
    • array คือ array ที่เราต้องการทำงานด้วยทีละตัว กรณีเป็น array 1 มิติในแนวตั้ง จำนวน row ของ array ก็คือ จำนวนรอบที่ REDUCE จะทำงาน
    • accumulator คือ การตั้งชื่อตัวแปรของ accumulator (สมมุติว่าชื่อ a แต่จริงๆ จะชื่ออะไรก็ได้) โดย REDUCE จะ update ค่าของ a ไปเรื่อยๆ จนครบทุก value
    • value คือ การตั้งชื่อตัวแปรของ value (สมมุติว่าชื่อ v แต่จริงๆ จะชื่ออะไรก็ได้) v ก็คือค่าจาก array (parameter ตัวที่สอง) แต่ละตัวนั่นเอง
    • body คือ สูตรที่ต้องการให้ REDUCE ส่งกลับค่า

    มาเรียนการใช้ฟังก์ชัน REDUCE โดยการลองทำโจทย์ตัวอย่างกันเลยครับ

    1. เริ่มด้วยสูตรยอดนิยม : การลบข้อมูลที่ไม่ต้องการออกจากข้อมูล

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 17
    รูปที่ 1 การใช้ REDUCE ลบข้อมูลที่ไม้ต้องการ

    โจทย์ลักษณะนี้ ถ้าทำด้วยวิธีปกติคือต้องใช้ SUBSTITUTE แทนค่าในข้อความหลายๆ รอบ (เท่ากับจำนวนอักขระที่ต้องการแทน ซึ่งในที่นี้มี 4 ตัว คือ B3:B6) แต่ถ้าเราใช้ REDUCE ในการวน Loop เราก็จะสามารถเขียนสูตรครั้งเดียว โดยจะเปลี่ยนจำนวนที่จะแทนเป็นกี่ค่าก็ได้

    =REDUCE(A3:A7,B3:B6,LAMBDA(a,v,SUBSTITUTE(a,v,"")))

    ในข้อแรกเราต้องการลบข้อมูลที่ไม่ต้องการ (B3:B6) ออกจาก input data (A3:A7) มีขั้นตอนการทำ ดังนี้

    =REDUCE(A3:A7

    คือ การกำหนดค่าเริ่มต้นเป็น range A3:B3 โดยจะเห็นว่าในสูตรนี้เรากำหนดค่าเริ่มต้นเป็น range ของข้อมูลตัวอักษรก่อนการ clean data นั่นเอง

    =REDUCE(A3:A7,B3:B6

     คือ การกำหนด array ที่เราต้องการทำงานด้วย ซึ่งในข้อนี้ คือ range B3:B6 หรือตัวอักษรที่เราต้องการลบออกจากข้อมูล

    =REDUCE(A3:A7,B3:B6,LAMBDA(a,v

    คือ การตั้งชื่อ accumulator เป็น a และ value เป็น v หลังจากนี้ เราจะทำงานกับ a และ v

    =REDUCE(A3:A7,B3:B6,LAMBDA(a,v,SUBSTITUTE(a,v,"")))

    คือ การสร้าง body ของสูตร โดยใช้ SUBSTITUTE(a,v,””) เป็น การค้นหาค่า v ใน a ถ้าเจอ แทนที่ด้วยความว่างเปล่า (“”) หรือลบข้อมูล v ตัวนั้นออกจาก a นั่นเอง

    อธิบายขั้นตอนการทำงานของ REDUCE

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 18
    รูปที่ 2 ตัวอย่างการทำงานของฟังก์ชัน REDUCE

    รอบที่ 1 : REDUCE จะนำค่าเริ่มต้น (A3:A7) มาใช้เป็นค่า a จากนั้นวิ่งไปรับค่า v ตัวแรก ($) และค้นหา v ตัวแรกใน array a ทุกตัว ถ้าเจอ v จะถูกแทนที่ด้วย “” ผลที่ได้จากรอบที่ 1 คือ v ตัวแรก หรือ $ จะถูกลบออกไปจาก a และ a หลังจบรอบที่ 1 จะถูกใช้เป็น a เริ่มต้นของรอบที่ 2  

    รอบที่ 2-4 : REDUCE จะวนลูปทำงานเหมือนเดิม คือ ลบ #, !, ? ออกจากข้อมูลทีละตัว โดยจะอัพเดท a ไปเรื่อยๆ (เรามองไม่เห็น) โดยหลังจากวนลูป v ครบทุกตัว เราจะเห็น output สุดท้าย คือ ข้อมูล A3:A7 ที่ถูกลบค่า v ทั้งหมดออกไป ส่งกลับคำตอบเป็น dyanamic range C3#

    การวน Loop ด้วย REDUCE แบบนี้มีข้อดีคือทำให้เราไม่จำเป็นต้องเขียน SUBSTITUTE ซ้อนกันหลายๆ รอบเหมือนวิธีปกตินั่นเอง หวังว่าตัวอย่างนี้จะช่วยให้ทุกท่านเข้าใจลักษณะการทำงานของฟังก์ชัน REDUCE มากยิ่งขึ้นนะครับ ^^

    2. กรณีว่าง initial value ไว้ REDUCE จะใช้ v ตัวแรกเป็น initial value

    =REDUCE(,A3:A6,LAMBDA(a,v,a&v))

    จะเห็นว่าสูตรนี้ว่าง initial value ไว้ ดังนั้น ในรอบที่ 1 REDUCE จะส่งกลับค่า v ตัวแรก คือ A3 หรือ =”A” และในรอบถัดไปจะวนลูปนำค่า v มาแปะต่อท้าย a จนครบ v ทุกตัว

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 19
    รูปที่ 3 กรณีไม่กำหนด initial value

    3. การประยุกต์ใช้ REDUCE ในการทำ looping แสดงค่า  “Hello, World!” จำนวน n ตัว

    =LET(
    n,4,
    t,"Hello, World!",
    REDUCE(t,SEQUENCE(n-1),LAMBDA(c,v,VSTACK(c,t)))
    )

    ในที่นี้เรามีการใช้ LET มาประกาศตัวแปรด้วย คือ กำหนด

    • n = 4
    • t = “Hello, World!”

    ในส่วน REDUCE เราให้ initial value เท่ากับ t แสดงว่าเริ่มต้น มี “Hello, World!” 1 ตัวแล้วสิ่งที่ต้องการทำ คือ ต้องการเอา t ไป VSTACK หรือเอาไปแปะใต้ c หรือ VSTACK(c,t) อีก n-1 รอบนั่นเอง

    เรามักจะกำหนด v ด้วยฟังก์ชัน SEQUENCE(..) เพื่อใช้แทนจำนวนรอบที่เราต้องการวนลูป แต่จะเห็นว่าในส่วนการส่งกลับ ไม่ได้มีส่วนเกี่ยวข้องกับ body เลย (เราใช้ v เพื่อวนลูปเท่านั้น)

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 20
    รูปที่ 4 การประยุกต์ใช้ REDUCE ทำ looping

    4. ประยุกต์ใช้ REDUCE แก้ปัญหา ExcelBI : PQ challenge 187

    PQ challenge 187 Download Practice File – https://lnkd.in/dcsdNKgn

    c.r. ExcelBI & Excel Super Fan 

    จาก input data (A1:C12) ให้สร้างตารางแสดงข้อมูลตามความต้องการของลูกค้า (E1:30)

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 21
    รูปที่ 5 ExcelBI : PQ challenge 187

    โจทย์ข้อนี้สามารถประยุกต์ใช้ REDEUCE (แบบ 2 ชั้น) ในการจัดการข้อมูลได้ ดังนี้

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 22
    รูปที่ 6 การประยุกต์ใช้ REDUCE แก้ปัญหา PQ challenge 187

    เห็นสูตรยาวๆ อย่าเพิ่งตกใจ สูตรยาวๆนี้ มีวิธีสร้างแบบค่อยเป็นค่อยไปได้ ดังนี้

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 23
    รูปที่ 7 ค่อยเป็นค่อยไป 01 ^^

    4.1. จัดการข้อมูล continent โดยตัดตัวที่ซ้ำออกและเรียงจาก A-Z (M2#)

    =SORT(UNIQUE(A2:A12))

    4.2. ในทำนองเดียวกัน จัดการข้อมูล year (ไม่ซ้ำ + เรียง A-Z) (N3#)

    =SORT(UNIQUE(B2:B12))

    4.3. ที่ O4 ใช้ continent และ year กรองหาค่า sales โดยทดลองกับ (Asia, 2010)

    =FILTER(C2:C12,(A2:A12=M2)*(B2:B12=N3),0)

    ความหมายของสูตรนี้คือ การกรองค่าจาก C2:C12 (sales) เมื่อ continent เท่ากับ Asia (M2) และ คูณ (*) year เท่ากับ 2010 (N3) กรณีไม่เจอค่าที่ match ส่งกลับค่า 0

    (ซึ่งเป็นความต้องการของโจทย์ ที่ว่าให้ดูจากข้อมูล input พบว่าอาจมีกรณีไม่เจอข้อมูล ซึ่งกำหนดให้ส่งกลับค่า 0)

    4.4. ที่ P5 หาค่า sales ของทุก continent (ทดลอง year = 2010)

    =REDUCE(0,M2#,LAMBDA(x,v,VSTACK(x,FILTER(C2:C12,(A2:A12=v)*(B2:B12=N3),0))))

    สูตรนี้ ผมใส่ initial value เป็น 0 ไว้ก่อนชั่วคราว และกำหนด array เท่ากับ M2# จาก 4.1. ตั้งชื่อ accumulator ว่า x และตั้งชื่อ value ว่า v จากนั้นนำสูตรจาก 4.3. มาสร้างเป็น body แล้วแทน M2 ด้วย v

    และเราต้องการให้ REDUCE อัพเดทค่า x โดยนำค่า sales มาเรียงต่อกันในแนวตั้ง เลยต้องใช้ VSTACK(x,… จะได้ค่า sales ของทุก continent ออกมา (ตัวแรกยังเป็น 0 อยู่ ปล่อยไปก่อน)

    4.5. ถ้าสังเกตผลลัพธ์ที่ต้องการ พบว่าต้องการข้อมูล 3 columns คือ continent, year, และ sales ตามลำดับ จึงต้องเพิ่ม continent และ year เข้ามา ดังนี้ 

    =REDUCE(0,M2#,LAMBDA(x,v,VSTACK(x,HSTACK(v,N3,FILTER(C2:C12,(A2:A12=v)*(B2:B12=N3),0)))))

    เราเพิ่ม HSTACK(v,N3,.. เข้ามาเพื่อให้ได้ผลลัพธ์ตามที่ต้องการ

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 24
    รูปที่ 8 ค่อยเป็นค่อยไป 02 ^^

    4.6. ใช้ REDUCE ตัวที่ 2 หาค่า sales ของทุก continent ของทุก year

    =REDUCE(A1:C1,N3#,LAMBDA(y,w,REDUCE(y,M2#,LAMBDA(x,v,VSTACK(x,HSTACK(v,w,FILTER(C2:C12,(A2:A12=v)*(B2:B12=w),0)))))))

    ใน REDUCE ตัวที่ 2 ใช้ A1:C1 หรือชื่อ header จาก input เป็น initial value ใส่ค่า array เป็น year จาก 4.2. (N3#) ตั้งชื่อ accumulator ว่า y และตั้งชื่อ value ว่า w จากนั้นนำสูตรจาก 4.5. มาใช้เป็น body โดยเปลี่ยนค่า initial value จาก 0 เป็น y และแทน N3 ด้วย w REDUCE ตัวที่ 2 จะทำหน้าที่อัพเดทข้อมูลของทุกปี (จนครบทุก w)

    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 25
    รูปที่ 9 ค่อยเป็นค่อยไป 03 ^^

    4.7. ปรับรูปแบบตารางให้เป็นไปตามที่โจทย์ต้องการ นั่นคือ ในแต่ละปี จะต้องทำการคำนวณ Total sales และมี แถวว่าง 1 แถว คั่นกลางระหว่างแต่ละปี  ดังนี้

    =REDUCE(A1:C1,N3#,LAMBDA(y,w,VSTACK(REDUCE(y,M2#,LAMBDA(x,v,VSTACK(x,HSTACK(v,w,FILTER(C2:C12,(A2:A12=v)*(B2:B12=w),0))))),HSTACK("TOTAL",w,SUMIF(B2:B12,w,C2:C12)),{"","",""})))

    ผมตั้ง VSTACK หน้า REDUCE ตัวแรก เพื่อก่อนจะขึ้นปีถัดไปเราจะของแปะข้อมูล ได้แก่
    1) HSTACK(“TOTAL”,w,SUMIF(B2:B12,w,C2:C12)) และ
    2) {“”,””,””}  

    4.8. คุณเค้าอยากได้ Grand total sales ด้วย ก็ต้องเพิ่มให้

    =VSTACK(REDUCE(A1:C1,N3#,LAMBDA(y,w,VSTACK(REDUCE(y,M2#,LAMBDA(x,v,VSTACK(x,HSTACK(v,w,FILTER(C2:C12,(A2:A12=v)*(B2:B12=w),0))))),HSTACK("TOTAL",w,SUMIF(B2:B12,w,C2:C12)),{"","",""}))),HSTACK("GRAND TOTAL",TAKE(N3#,1)&"-"&TAKE(N3#,-1),SUM(C2:C12)))

    ตั้ง VSTACK หน้า REDUCE ตัวที่ 2 (หน้าสุด) และแปะ HSTACK(“GRAND TOTAL”,TAKE(N3#,1)&”-“&TAKE(N3#,-1),SUM(C2:C12)) เข้าไป

    4.9. เพื่อความเรียบร้อยสวยงาม array หรือ range ไหนที่ถูกใช้มากกว่า 1 ครั้ง ผมจะใช้ LET เก็บค่า เช่น N3# ถูกใช้ 2 ครั้ง ผมตั้งชื่อว่า z แล้วกัน (N3# คือ dynamic range ที่ถูกสร้างที่ cell N3 สูตรที่ใช้สร้างก็จะอยู่ที่ N3 นั่นแหละ) จะได้ ดังนี้

    =LET(z,SORT(UNIQUE(B2:B12)),VSTACK(REDUCE(A1:C1,z,LAMBDA(y,w,VSTACK(REDUCE(y,SORT(UNIQUE(A2:A12)),LAMBDA(x,v,VSTACK(x,HSTACK(v,w,FILTER(C2:C12,(A2:A12=v)*(B2:B12=w),0))))),HSTACK("TOTAL",w,SUMIF(B2:B12,w,C2:C12)),{"","",""}))),HSTACK("GRAND TOTAL",TAKE(z,1)&"-"&TAKE(z,-1),SUM(C2:C12))))

    4.10. เก็บรายละเอียด ค่า range A2:A12, B2:B12, C2:C12 ที่ถูกใช้มากกว่า 1 ครั้งให้เรียบร้อยสวยงาม โดยตั้งชื่อเป็น a, b, และ c ตามลำดับ ดังนี้

    =LET(a,A2:A12,b,B2:B12,c,C2:C12,z,SORT(UNIQUE(b)),VSTACK(REDUCE(A1:C1,z,LAMBDA(y,w,VSTACK(REDUCE(y,SORT(UNIQUE(a)),LAMBDA(x,v,VSTACK(x,HSTACK(v,w,FILTER(c,(a=v)*(b=w),0))))),HSTACK("TOTAL",w,SUMIF(b,w,c)),{"","",""}))),HSTACK("GRAND TOTAL",@z&"-"&TAKE(z,-1),SUM(c))))

    Note: @z ส่งกลับตัวซ้ายบนสุดของ array ให้ผลเหมือนกับ TAKE(z,1) เลือกใช้ตามสะดวก ^^

    ลองใช้ Advanced Formula Environment กระจายให้สูตรอ่านง่ายขึ้น

    =LET(
        a, A2:A12,
        b, B2:B12,
        c, C2:C12,
        z, SORT(UNIQUE(b)),
        VSTACK(
            REDUCE(
                A1:C1,
                z,
                LAMBDA(y, w,
                    VSTACK(
                        REDUCE(
                            y,
                            SORT(UNIQUE(a)),
                            LAMBDA(x, v, VSTACK(x, HSTACK(v, w, FILTER(c, (a = v) * (b = w), 0))))
                        ),
                        HSTACK("TOTAL", w, SUMIF(b, w, c)),
                        {"", "", ""}
                    )
                )
            ),
            HSTACK("GRAND TOTAL", @z & "-" & TAKE(z, -1), SUM(c))
        )
    )
    การใช้ฟังก์ชัน REDUCE ทำงานแบบวน Loop ในสูตร Excel (step by step) 26
    รูปที่ 10 ค่อยเป็นค่อยไป 04 คุณก็ทำได้ เชื่อผม ลองดูครับ ^^

    สรุป

    จากตัวอย่างนี้แสดงให้เห็นว่า เราสามารถประยุกต์ใช้  REDUCE เพื่อจัดการข้อมูลได้หลากหลาย โดยประโยชน์ที่แท้จริงที่ต้องเขียนสูตรยาวๆแบบนี้ เนื่องจากต้องการความ dynamic กล่าวคือ ถ้าในอนาคตข้อมูลเปลี่ยน เราแค่กรอก a,b, และ c ใหม่งานเสร็จทันที หรือถ้าสร้าง input data เป็น Table ก็แค่เพิ่มข้อมูลในตาราง input data คำตอบจะถูกอัพเดทโดยอัตโนมัต ซึ่งก็คุ้มกับการที่จะเขียนสูตรยาวๆ เพื่อให้เราทำงานสบายขึ้นในอนาคต 😂