Thep Excel

SCAN – คำนวณและแสดงผลลัพธ์สะสมทุกขั้นตอน

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

=SCAN([initial_value], array, lambda)

By ThepExcel AI Agent
18 December 2025

Function Metrics


Popularity
9/10

Difficulty
8/10

Usefulness
9/10

Syntax & Arguments

=SCAN([initial_value], array, lambda)

Argument Type Required Default Description
initial_value Any Optional 0 ค่าเริ่มต้นของ accumulator ก่อนเริ่มวนลูป สำหรับตัวเลขใช้ 0 หรือ 1 (ขึ้นกับการคำนวณ) สำหรับข้อความใช้ “” (empty string) ถ้าไม่ระบุ Excel จะใช้ค่าเริ่มต้นตามชนิดข้อมูล
array Array/Range Yes Array, range, หรือ Named Range ที่ต้องการวนลูป SCAN จะประมวลผลทีละ element จากบนลงล่าง (column) หรือซ้ายไปขวา (row) สามารถใช้ Table reference หรือ SEQUENCE, FILTER ได้
lambda Function Yes LAMBDA function ที่รับ 2 parameters: (1) accumulator (acc/a) = ค่าสะสมจากรอบก่อนหน้า (2) value (val/v) = ค่าปัจจุบันของ element และต้อง return ค่า accumulator ใหม่สำหรับรอบถัดไป สามารถใช้ชื่อฟังก์ชันโดยตรง (MAX, MIN, SUM) แทน LAMBDA ได้ (Abbreviated Syntax)

How it works

Running Total สำหรับ Financial Dashboard

คำนวณยอดขายสะสมรายเดือน แสดง Year-to-Date (YTD) หรือ Month-to-Date (MTD) เพื่อติดตามประสิทธิภาพการขายเทียบกับเป้าหมาย

Running Maximum/Minimum สำหรับ Stock Analysis

ติดตามราคาหุ้นสูงสุด/ต่ำสุดสะสม แสดงว่าราคาหุ้นทำ All-Time High หรือ All-Time Low ในช่วงเวลาใด

Fill Down ข้อมูลที่ว่าง (Forward Fill)

เติมค่าในเซลล์ว่างด้วยค่าจากเซลล์ก่อนหน้า เหมาะสำหรับข้อมูลที่มีช่องว่างและต้องการเติมด้วยค่าล่าสุด

คำนวณดอกเบี้ยทบต้นทุกงวด

แสดงยอดเงินหลังคำนวณดอกเบี้ยทบต้นในแต่ละงวด เห็นการเติบโตของเงินลงทุนตลอดระยะเวลา

Running Count แบบมีเงื่อนไข

นับจำนวนสะสมของข้อมูลที่ผ่านเงื่อนไข เช่น นับจำนวนวันที่อุณหภูมิสูงกว่า 30 องศา

Examples

ตัวอย่างที่ 1: Running Total พื้นฐาน (Foundation)
SCAN(0, {10, 20, 30, 40, 50}, LAMBDA(acc, val, acc + val))
เริ่มต้น acc=0 จากนั้นวนลูป: รอบ 1: 0+10=10 | รอบ 2: 10+20=30 | รอบ 3: 30+30=60 | รอบ 4: 60+40=100 | รอบ 5: 100+50=150 ได้ Running Total ที่แสดงยอดสะสมในทุกขั้นตอน ต่างจาก SUM ที่ได้แค่ 150 เพียงค่าเดียว
Excel Formula:

=SCAN(0, {10, 20, 30, 40, 50}, LAMBDA(acc, val, acc + val))

Result:

{10, 30, 60, 100, 150}

ตัวอย่างที่ 2: Running Total จากข้อมูลจริง (Practical)
SCAN(0, Sales[MonthlyRevenue], LAMBDA(acc, val, acc + val))
สมมติ Sales[MonthlyRevenue] = {15000, 18000, 22000, 19000} จะได้ {15000, 33000, 55000, 74000} แสดงยอดขายสะสม (Year-to-Date) ในแต่ละเดือน ใช้สำหรับ Dashboard ติดตามประสิทธิภาพการขาย สามารถนำไป Plot กราฟเพื่อดูแนวโน้ม
Excel Formula:

=SCAN(0, Sales[MonthlyRevenue], LAMBDA(acc, val, acc + val))

Result:

Array ของ Running Total ตาม MonthlyRevenue

ตัวอย่างที่ 3: Running Maximum (Advanced)
SCAN(0, {85, 92, 78, 95, 88, 97}, LAMBDA(acc, val, MAX(acc, val)))
เปรียบเทียบค่าปัจจุบันกับ maximum ที่ผ่านมา เก็บค่าที่มากกว่า: 85 (max=85) → 92 (max=92) → 78 (max ยังเป็น 92) → 95 (max=95) → 88 (max ยังเป็น 95) → 97 (max=97) จะเห็นว่า All-Time High เปลี่ยนแปลงเมื่อไร เหมาะสำหรับวิเคราะห์ราคาหุ้นหรือสถิติกีฬา
Excel Formula:

=SCAN(0, {85, 92, 78, 95, 88, 97}, LAMBDA(acc, val, MAX(acc, val)))

Result:

{85, 92, 92, 95, 95, 97}

ตัวอย่างที่ 4: Abbreviated Syntax ใช้ MAX โดยตรง
SCAN(0, {3, 7, 2, 9, 5}, MAX)
Abbreviated Syntax: ใช้ชื่อฟังก์ชัน MAX โดยตรงแทนการเขียน LAMBDA(acc, val, MAX(acc, val)) Excel จะส่ง accumulator และ value ให้ MAX อัตโนมัติ ทำให้โค้ดสั้นและอ่านง่ายขึ้น ใช้ได้กับฟังก์ชันที่รับ 2 arguments เช่น MAX, MIN, SUM แต่ไม่ใช่ COUNT
Excel Formula:

=SCAN(0, {3, 7, 2, 9, 5}, MAX)

Result:

{3, 7, 7, 9, 9}

ตัวอย่างที่ 5: Running Count เฉพาะตัวเลข (Conditional)
SCAN(0, {10, "N/A", 25, "", 30, "Error"}, LAMBDA(acc, val, acc + ISNUMBER(val)))
ISNUMBER return TRUE (1) หรือ FALSE (0) เมื่อบวกสะสมจะได้ Running Count ของตัวเลข: 10 (count=1) → N/A (count ยังเป็น 1) → 25 (count=2) → empty (count ยังเป็น 2) → 30 (count=3) → Error (count ยังเป็น 3) เหมาะสำหรับตรวจสอบคุณภาพข้อมูลว่ามีตัวเลขที่ valid กี่ค่า
Excel Formula:

=SCAN(0, {10, "N/A", 25, "", 30, "Error"}, LAMBDA(acc, val, acc + ISNUMBER(val)))

Result:

{1, 1, 2, 2, 3, 3}

ตัวอย่างที่ 6: Fill Down ข้อมูลที่ว่าง (Forward Fill)
SCAN("", {"North", "", "", "South", "", "East"}, LAMBDA(acc, val, IF(val="", acc, val)))
ถ้า val ว่าง (empty string) ใช้ค่าเดิม (acc) ถ้าไม่ว่างใช้ค่าใหม่ (val): North → ว่าง (ใช้ North) → ว่าง (ใช้ North) → South → ว่าง (ใช้ South) → East เหมาะสำหรับข้อมูลที่มีหมวดหมู่แต่บางแถวว่าง ต้องการเติมด้วยหมวดหมู่ล่าสุด
Excel Formula:

=SCAN("", {"North", "", "", "South", "", "East"}, LAMBDA(acc, val, IF(val="", acc, val)))

Result:

{"North", "North", "North", "South", "South", "East"}

ตัวอย่างที่ 7: ต่อข้อความสะสม (String Concatenation)
SCAN("", {"T", "h", "e", "p", "E", "x", "c", "e", "l"}, LAMBDA(acc, val, acc & val))
ใช้ & operator ต่อข้อความสะสม แสดงการสร้างคำทีละตัวอักษร: T → Th → The → Thep → … → ThepExcel เปรียบเสมือนดูการพิมพ์แบบ slow motion เหมาะสำหรับ animation หรือ debug string operations
Excel Formula:

=SCAN("", {"T", "h", "e", "p", "E", "x", "c", "e", "l"}, LAMBDA(acc, val, acc & val))

Result:

{"T", "Th", "The", "Thep", "ThepE", "ThepEx", "ThepExc", "ThepExce", "ThepExcel"}

ตัวอย่างที่ 8: คำนวณดอกเบี้ยทบต้นทุกงวด (Complex Real-World)
SCAN(100000, SEQUENCE(12), LAMBDA(principal, month, principal * (1 + 0.005)))
เงินต้น 100,000 บาท ดอกเบี้ย 0.5% ต่อเดือน คำนวณทบต้น: เดือน 1: 100,000 × 1.005 = 100,500 | เดือน 2: 100,500 × 1.005 = 101,002.5 | … | เดือน 12: ~106,167 แสดงการเติบโตของเงินลงทุนทุกเดือน เหมาะสำหรับ Financial Planning ใช้ SEQUENCE(12) สร้าง array {1,2,3,…,12} แม้ว่าจะไม่ได้ใช้ month parameter ตรงๆ แต่ใช้เพื่อกำหนดจำนวนรอบ
Excel Formula:

=SCAN(100000, SEQUENCE(12), LAMBDA(principal, month, principal * (1 + 0.005)))

Result:

Array แสดงยอดเงินหลังดอกเบี้ย 0.5% ต่อเดือน เป็นเวลา 12 เดือน

ตัวอย่างที่ 9: Factorial Sequence (Mathematical)
SCAN(1, {1, 2, 3, 4, 5}, LAMBDA(acc, val, acc * val))
คำนวณ Factorial สะสม: 1 (1!) → 2 (2! = 1×2) → 6 (3! = 2×3) → 24 (4! = 6×4) → 120 (5! = 24×5) แสดงว่า Factorial เติบโตเร็วมาก ต่างจาก REDUCE ที่ได้แค่ 120 SCAN ช่วยให้เห็นทุกขั้นตอนของการคูณสะสม
Excel Formula:

=SCAN(1, {1, 2, 3, 4, 5}, LAMBDA(acc, val, acc * val))

Result:

{1, 2, 6, 24, 120}

FAQs

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

SCAN return array ที่แสดงค่า accumulator ในทุกขั้นตอนของการคำนวณ (intermediate values) เช่น {1, 3, 6, 10, 15} ส่วน REDUCE return เฉพาะค่าสุดท้ายเพียงค่าเดียว เช่น 15 ใช้ SCAN เมื่อต้องการเห็น running results, แนวโน้ม, หรือการเปลี่ยนแปลงเทียบเวลา ใช้ REDUCE เมื่อต้องการแค่ผลลัพธ์สุดท้าย เช่น total sum, final count

Accumulator คืออะไร และต้องตั้งชื่อเฉพาะไหม?

Accumulator คือตัวแปรที่เก็บค่าสะสมจากการคำนวณรอบก่อนหน้า ในรอบแรก accumulator = initial_value หลังจากนั้นจะเป็นค่าที่ LAMBDA return ในรอบก่อนหน้า ชื่อไม่จำเป็นต้องเป็น ‘acc’ หรือ ‘a’ แต่นิยมใช้เพื่อความชัดเจน สามารถใช้ชื่ออื่นได้ เช่น ‘total’, ‘max_so_far’, ‘running_count’ ขึ้นกับบริบท

ทำไมใช้ COUNT แบบ Abbreviated Syntax แล้วได้ 2 ตลอด?

เพราะ COUNT นับจำนวน arguments ที่ได้รับ ซึ่ง SCAN ส่งให้เสมอ 2 ตัว (accumulator และ value) จึงได้ 2 ทุกรอบ ไม่ได้นับ element ใน array ให้ใช้ LAMBDA แทน เช่น =SCAN(0, data, LAMBDA(acc, val, acc + 1)) เพื่อนับทุก element หรือ =SCAN(0, data, LAMBDA(acc, val, acc + ISNUMBER(val))) เพื่อนับเฉพาะตัวเลข Abbreviated Syntax เหมาะกับ MAX, MIN, SUM, หรือฟังก์ชันที่คำนวณจาก 2 ค่า

ใช้ SCAN กับ Excel Table ได้ไหม?

ได้ แต่ไม่สามารถใส่สูตร SCAN ภายใน Table (Ctrl+T) ได้ เพราะ Dynamic Array Functions ไม่สามารถ spill ภายใน Table ให้ใส่สูตร SCAN ในเซลล์นอก Table แล้ว reference ข้อมูลจาก Table เช่น =SCAN(0, Sales[Revenue], LAMBDA(acc, val, acc + val)) หรือแปลง Table เป็น range ธรรมดาก่อน (Table Design → Convert to Range)

SCAN รองรับ Excel เวอร์ชันไหน?

SCAN เป็น LAMBDA Helper Function ที่มีใน Excel for Microsoft 365 (Windows, Mac, Web) และ Excel 2024 เท่านั้น ไม่มีใน Excel 2021, Excel 2019 หรือเวอร์ชันเก่ากว่า ถ้าใช้เวอร์ชันเก่าต้องใช้วิธีอื่น เช่น Helper Column แทน หรืออัปเกรดเป็น Microsoft 365 subscription

จะทำ Year-to-Date ที่ reset ทุกปีได้อย่างไร?

ใช้ IF condition ใน LAMBDA ตรวจสอบว่าเป็นเดือนมกราคม (หรือจุดเริ่มต้นปี) หรือไม่ ถ้าใช่ให้ reset accumulator กลับไปเป็นค่าปัจจุบัน เช่น =SCAN(0, data, LAMBDA(acc, val, IF(MONTH(date_column)=1, val, acc+val))) โดยอาจต้องใช้ BYROW หรือ MAP เพื่อเข้าถึงคอลัมน์วันที่ประกอบด้วย หรือสร้าง array ที่รวม date กับ value ไว้ด้วยกันก่อนส่งให้ SCAN

SCAN สามารถ return หลายคอลัมน์พร้อมกันได้ไหม?

ไม่ได้โดยตรง SCAN return array มิติเดียว (1D array) แต่สามารถใช้ HSTACK หรือ LET ร่วมกับหลาย SCAN เพื่อสร้าง array หลายคอลัมน์ เช่น =HSTACK(original_data, SCAN(0, original_data, LAMBDA(a,v,a+v)), SCAN(0, original_data, MAX)) จะได้ 3 คอลัมน์: ข้อมูลต้นฉบับ, Running Total, Running Maximum หรือใช้ MAP/BYROW ร่วมกับ SCAN สำหรับโครงสร้างที่ซับซ้อนกว่า

ทำไม SCAN ช้ากว่าการใช้ Helper Column?

SCAN อาจช้ากว่า Helper Column ใน dataset ขนาดใหญ่มาก (>10,000 rows) เพราะเป็น array formula ที่คำนวณทั้งหมดในครั้งเดียว แต่ข้อดีคือสูตรเดียวแทนที่จะหลายเซลล์ และ auto-update เมื่อข้อมูลต้นทางเปลี่ยน ถ้าช้าเกินไปให้ใช้ Helper Column แทน หรือ optimize LAMBDA ให้ง่ายขึ้น (หลีกเลี่ยง nested SCAN หรือฟังก์ชันซับซ้อนภายใน LAMBDA)

Resources & Related

Additional Notes

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

SCAN ต่างจาก REDUCE ตรงที่ REDUCE return เฉพาะค่าสุดท้ายเพียงค่าเดียว ในขณะที่ SCAN return ทุกค่าที่เกิดขึ้นระหว่างทาง เปรียบเสมือนการดูภาพเคลื่อนไหวทีละเฟรมแทนที่จะเห็นแค่เฟรมสุดท้าย ฟังก์ชันนี้มีประโยชน์มากสำหรับการวิเคราะห์ข้อมูลที่ต้องการเห็นแนวโน้มหรือการเปลี่ยนแปลงเทียบเวลา

Leave a Reply

Your email address will not be published. Required fields are marked *