---
title: SCAN – คำนวณและแสดงผลลัพธ์สะสมทุกขั้นตอน
url: https://www.thepexcel.com/functions/excel/logical/scan/
type: function-explainer
program: Excel
syntax: "=SCAN([initial_value], array, lambda)"
date: 2025-12-18
scores:
  popularity: 9
  difficulty: 8
  usefulness: 9
---

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

> วนลูปคำนวณค่าสะสมและแสดงผลลัพธ์ทุกขั้นตอนเป็น array

## คำอธิบาย

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

## Syntax

```excel
=SCAN([initial_value], array, lambda)
```

**excel**

```excel
=SCAN(0, A1:A5, LAMBDA(acc, val, acc + val))
```

Running total จากช่วงข้อมูล เริ่มต้นที่ 0

**excel**

```excel
=SCAN("", TextData, LAMBDA(a, v, a & v))
```

ต่อข้อความสะสมจาก array หรือ Named Range

**excel**

```excel
=SCAN(0, Numbers, MAX)
```

Abbreviated syntax: Running maximum ใช้ชื่อฟังก์ชัน MAX โดยตรง

**excel**

```excel
=SCAN(1, {1,2,3,4,5}, LAMBDA(a, v, a * v))
```

Factorial sequence: 1, 2, 6, 24, 120

## Arguments

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

## เคสการใช้งาน

### Running Total สำหรับ Financial Dashboard

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

_เหมาะกับ:_ financial-analysis

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

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

_เหมาะกับ:_ statistical-analysis

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

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

_เหมาะกับ:_ data-cleaning

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

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

_เหมาะกับ:_ financial-function

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

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

_เหมาะกับ:_ statistical-analysis

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: Running Total พื้นฐาน (Foundation)

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

**ผลลัพธ์:** `{10, 30, 60, 100, 150}`

เริ่มต้น 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 เพียงค่าเดียว

### 2. ตัวอย่างที่ 2: Running Total จากข้อมูลจริง (Practical)

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

**ผลลัพธ์:** `Array ของ Running Total ตาม MonthlyRevenue`

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

### 3. ตัวอย่างที่ 3: Running Maximum (Advanced)

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

**ผลลัพธ์:** `{85, 92, 92, 95, 95, 97}`

เปรียบเทียบค่าปัจจุบันกับ maximum ที่ผ่านมา เก็บค่าที่มากกว่า: 85 (max=85) → 92 (max=92) → 78 (max ยังเป็น 92) → 95 (max=95) → 88 (max ยังเป็น 95) → 97 (max=97) จะเห็นว่า All-Time High เปลี่ยนแปลงเมื่อไร เหมาะสำหรับวิเคราะห์ราคาหุ้นหรือสถิติกีฬา

### 4. ตัวอย่างที่ 4: Abbreviated Syntax ใช้ MAX โดยตรง

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

**ผลลัพธ์:** `{3, 7, 7, 9, 9}`

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

### 5. ตัวอย่างที่ 5: Running Count เฉพาะตัวเลข (Conditional)

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

**ผลลัพธ์:** `{1, 1, 2, 2, 3, 3}`

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 กี่ค่า

### 6. ตัวอย่างที่ 6: Fill Down ข้อมูลที่ว่าง (Forward Fill)

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

**ผลลัพธ์:** `{"North", "North", "North", "South", "South", "East"}`

ถ้า val ว่าง (empty string) ใช้ค่าเดิม (acc) ถ้าไม่ว่างใช้ค่าใหม่ (val): North → ว่าง (ใช้ North) → ว่าง (ใช้ North) → South → ว่าง (ใช้ South) → East เหมาะสำหรับข้อมูลที่มีหมวดหมู่แต่บางแถวว่าง ต้องการเติมด้วยหมวดหมู่ล่าสุด

### 7. ตัวอย่างที่ 7: ต่อข้อความสะสม (String Concatenation)

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

**ผลลัพธ์:** `{"T", "Th", "The", "Thep", "ThepE", "ThepEx", "ThepExc", "ThepExce", "ThepExcel"}`

ใช้ & operator ต่อข้อความสะสม แสดงการสร้างคำทีละตัวอักษร: T → Th → The → Thep → ... → ThepExcel เปรียบเสมือนดูการพิมพ์แบบ slow motion เหมาะสำหรับ animation หรือ debug string operations

### 8. ตัวอย่างที่ 8: คำนวณดอกเบี้ยทบต้นทุกงวด (Complex Real-World)

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

**ผลลัพธ์:** `Array แสดงยอดเงินหลังดอกเบี้ย 0.5% ต่อเดือน เป็นเวลา 12 เดือน`

เงินต้น 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 ตรงๆ แต่ใช้เพื่อกำหนดจำนวนรอบ

### 9. ตัวอย่างที่ 9: Factorial Sequence (Mathematical)

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

**ผลลัพธ์:** `{1, 2, 6, 24, 120}`

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

## หมายเหตุเพิ่มเติม

## การทำงานของ SCAN แบบ Step-by-Step

```
=SCAN(0, {1, 2, 3, 4}, LAMBDA(acc, val, acc + val))

รอบ 1: acc=0 (initial), val=1 → return 0+1=1  
รอบ 2: acc=1 (จากรอบก่อน), val=2 → return 1+2=3  
รอบ 3: acc=3, val=3 → return 3+3=6  
รอบ 4: acc=6, val=4 → return 6+4=10

ผลลัพธ์: {1, 3, 6, 10} (array ขนาด 4 elements)
```

## Abbreviated Syntax (ไวยากรณ์แบบย่อ)

สามารถใช้ชื่อฟังก์ชันโดยตรงแทน LAMBDA ได้สำหรับฟังก์ชันที่รับ 2 arguments:

```excel
=SCAN(0, data, MAX)     → Running Maximum
=SCAN(0, data, MIN)     → Running Minimum  
=SCAN(0, data, SUM)     → แบบนี้ไม่แนะนำ (ใช้ SCAN(0, data, LAMBDA(a,v,a+v)) แทน)
```

**⚠️ ข้อควรระวัง:** ไม่ใช้กับ COUNT เพราะ COUNT นับ arguments = 2 ตลอด ไม่ได้นับ element

## SCAN vs. REDUCE Comparison

| ลักษณะ | SCAN | REDUCE |
|--------|------|--------|
| **Return Type** | Array (หลายค่า) | Single Value (ค่าเดียว) |
| **Output** | ผลลัพธ์ทุกขั้นตอน | ผลลัพธ์สุดท้าย |
| **Use Case** | Running Total, Trend Analysis | Final Total, Aggregation |
| **Example Result** | {1, 3, 6, 10, 15} | 15 |
| **Visualization** | เห็นกราฟแนวโน้ม | เห็นแค่ตัวเลขเดียว |

## เมื่อไหร่ควรใช้ SCAN

✅ **ใช้ SCAN เมื่อ:**
- ต้องการดู Running Total, Running Max/Min
- ทำ Dashboard แสดงแนวโน้มเทียบเวลา
- ต้องการ Fill Down ข้อมูลที่ว่าง
- แสดงการคำนวณทบต้นทุกงวด
- Debug การคำนวณแบบ step-by-step

❌ **ใช้ REDUCE แทนเมื่อ:**
- ต้องการแค่ผลลัพธ์สุดท้าย (เช่น Total Sum)
- ไม่สนใจค่าระหว่างทาง
- ประหยัด memory (REDUCE ใช้ memory น้อยกว่า)

## Performance Tips

1. **Avoid nested SCAN** - ซ้อน SCAN หลายชั้นจะช้ามาก ให้ใช้ LET หรือ Helper Variables แทน
2. **Keep LAMBDA simple** - LAMBDA ที่ซับซ้อนจะทำให้แต่ละรอบช้า
3. **Use Abbreviated Syntax** - `=SCAN(0, data, MAX)` เร็วกว่า `LAMBDA(a,v,MAX(a,v))`
4. **Consider Helper Columns** - ถ้า dataset >10,000 rows อาจเร็วกว่าใช้ Helper Column แบบธรรมดา

## Common Errors

| Error | Cause | Solution |
|-------|-------|----------|
| `#VALUE!` | LAMBDA parameters ไม่ถูกต้อง | ตรวจสอบว่ามี 2 parameters (acc, val) |
| `#CALC!` | LAMBDA มี infinite loop | ตรวจสอบ logic ภายใน LAMBDA |
| `#SPILL!` | ไม่มีที่ว่างสำหรับ spill array | ลบข้อมูลใน spill range หรือ resize |
| Array ไม่แสดง | ใช้ Excel เวอร์ชันเก่า | อัปเกรดเป็น Microsoft 365 หรือ Excel 2024 |

## คำถามที่พบบ่อย

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

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

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

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

**Q: ทำไมใช้ 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 ค่า

**Q: ใช้ 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)

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

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

**Q: จะทำ 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

**Q: 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 สำหรับโครงสร้างที่ซับซ้อนกว่า

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

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

## ฟังก์ชันที่เกี่ยวข้อง

- [REDUCE – รวมผลลัพธ์จาก Array เป็นค่าเดียว](https://www.thepexcel.com/functions/excel/logical/reduce/)
- [LAMBDA – สร้างฟังก์ชันที่กำหนดเอง](https://www.thepexcel.com/functions/excel/logical/lambda/)
- [MAP – ประมวลผลทุก Element ใน Array ด้วย LAMBDA](https://www.thepexcel.com/functions/excel/logical/map/)
- [BYROW – ประมวลผลทีละแถวด้วย LAMBDA](https://www.thepexcel.com/functions/excel/logical/byrow/)
- [BYCOL – ประมวลผลทีละคอลัมน์ด้วย LAMBDA](https://www.thepexcel.com/functions/excel/logical/bycol/)
- [MAKEARRAY – สร้าง Array ด้วย LAMBDA แบบกำหนดเอง](https://www.thepexcel.com/functions/excel/logical/makearray/)
- [SEQUENCE – สร้างตารางตัวเลขเรียงลำดับแบบ Dynamic Array](https://www.thepexcel.com/functions/excel/math-and-trigonometry/sequence/)
- [FILTER – ฟังก์ชันกรองข้อมูลแบบไดนามิก](https://www.thepexcel.com/functions/excel/lookup-and-reference/filter/)
- [LET – กำหนดตัวแปรในสูตรเพื่อเพิ่มความเร็วและความชัดเจน](https://www.thepexcel.com/functions/excel/logical/let/)
- [ISNUMBER – ตรวจสอบว่าเป็นตัวเลขหรือไม่](https://www.thepexcel.com/functions/excel/information/isnumber/)
- [HSTACK – ฟังก์ชันรวมข้อมูลแนวนอน](https://www.thepexcel.com/functions/excel/lookup-and-reference/hstack/)

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

- [Microsoft Support: SCAN function](https://support.microsoft.com/en-us/office/scan-function-d58dfd11-9969-4439-b2dc-e7062724de29) _(official)_
- [ExcelJet: Excel SCAN function](https://exceljet.net/functions/scan-function) _(guide)_
- [Xelplus: How to Use the Excel SCAN Function](https://www.xelplus.com/scan-function-in-excel/) _(tutorial)_
- [LinkedIn: Demystifying LAMBDA - SCAN and REDUCE](https://www.linkedin.com/pulse/demystifying-lambda-scan-reduce-beyond-excel-33ave) _(article)_

---

_Source: [https://www.thepexcel.com/functions/excel/logical/scan/](https://www.thepexcel.com/functions/excel/logical/scan/)_
