เคยสงสัยไหมว่า “ยอดสะสม” (Running Total) ใน Excelทำได้กี่วิธี? ซึ่งแน่นอนว่าคงมีหลายทางเลือกมากมาย! แต่สิ่งที่ผมอยากให้ลองทำ คือ การลองแก้โจทย์เดียวกันด้วยวิธีที่ต่างกันนี่แหละ คือหนึ่งในวิธีฝึก Excel ให้เก่งขึ้นแบบก้าวกระโดด!
บทความนี้จะพาไปดูสารพัดวิธีคำนวณ Running Total ที่ครอบคลุมทุกระดับ ตั้งแต่มือใหม่จนถึงสายการใช้เครื่องมือขั้นสูงแบบจัดเต็มครับ!
มือใหม่: เรียนรู้การใช้ SUM และ SUMIFS แบบเข้าใจง่าย
สายวิเคราะห์: ลอง Pivot Table หรือสูตร Array สุดทันสมัย
ขั้นโปร: จัดเต็มด้วย Python, Power Query (M Code) และ DAX
เปรียบเทียบทุกวิธี: รู้ว่าแบบไหนเหมาะกับงานคุณ
สารบัญ
ข้อมูลตัวอย่างที่ใช้
เราเอาข้อมูลไว้ในพื้นที่ A2:B10 นะครับ
OrderID | Amount |
---|---|
Order0001 | 200 |
Order0002 | 150 |
Order0003 | 75 |
Order0004 | 125 |
Order0005 | 50 |
Order0006 | 100 |
Order0007 | 250 |
Order0008 | 300 |
และเราอาจมีบางเคสทำเป็น Table จะสะดวกกว่า โดยเราจะทำเป็น Table ชื่อ Sales นะครับ

เราจะคำนวณยอดสะสมของคอลัมน์ Amount โดยอิงจากลำดับของ OrderID ไปทีละวิธีกันเลย!
1. วิธีพื้นฐานโดยใช้สูตรปกติ (Regular Formula)
วิธีนี้เหมาะสำหรับผู้เริ่มต้น เพราะง่ายและรวดเร็ว ไม่ต้องใช้เครื่องมือพิเศษใดๆ
1.1 วิธีพื้นฐานแบบดั้งเดิม (ใช้ SUM)
เพิ่มคอลัมน์ใหม่ชื่อ “RunningTotal” ในคอลัมน์ C โดยในเซลล์ C3 (แถวแรกของข้อมูล) ใส่สูตร:
=SUM($B$3:B3)
$B$3
ล็อกแถวเริ่มต้นให้คงที่B3
จะขยายไปตามแถวที่สูตรถูก Copy ลงมา
ลากสูตรลงไปจนถึงแถวสุดท้าย (C10) จะได้ตามรูป

ผลลัพธ์:
- C3: 200
- C4: 350 (200+150)
- C5: 425 (200+150+75)
- และต่อไปเรื่อยๆ
Tips : เคสนี้ ถ้าข้อมูลเป็น Table จะใช้ [@Amount] ที่เป็น Structure Reference ของ Table วิธีนี้จะไม่ Work ยังไงก็ต้องใช้การอ้างอิงด้วย Cell Reference ตามปกติอยู่ดีนะ แต่ข้อดีของการทำเป็น Table คือสูตรจะถูก Copy ลงมาโดยอัตโนมัตินั่นเอง

วิธี 1.1 นี้เหมาะกับตารางเล็กๆ และไม่ซับซ้อน แต่ถ้าข้อมูลเยอะ อาจเริ่มช้าได้ เพราะต้องบวกการสะสมใหม่ทั้งหมดซ้ำหลายรอบโดยไม่จำเป็น (ลองสังเกตวิธีคิดในสูตร)
1.2 : ใช้สูตรอ้างอิงข้อมูลสะสมก่อนหน้า
เพื่อแก้ปัญหาความไม่มีประสิทธิภาพจากวิธีแรก และใช้ประโยชน์จากตาราง Excel (Structured Table) เราสามารถปรับสูตรให้อ้างอิงยอดสะสมจากแถวก่อนหน้าได้ง่ายขึ้น
ในเซลล์ C3 (แถวแรกของข้อมูล) ใส่สูตร:
=SUM(C2)+[@Amount]
- SUM(C2) อ้างอิงยอดสะสมจากแถวก่อนหน้า (ถ้า C2 เป็นหัวตารางที่เป็น text เช่น “RunningTotal” ฟังก์ชัน SUM จะไม่สนใจค่า text โดยอัตโนมัติอยู่แล้ว)
- [@Amount] อ้างอิงค่า Amount ในแถวปัจจุบันโดยใช้ Structured Reference
กด Enter สูตรจะถูกเติมลงในทุกแถวของคอลัมน์ในตารางอัตโนมัติ
ผลลัพธ์:

- C3: 200
- C4: 350 (200+150)
- C5: 425 (350+75)
- และต่อไปเรื่อยๆ
ข้อดี:
วิธีนี้เร็วกว่าวิธีแรก เพราะคำนวณเฉพาะการบวกเพิ่มจากยอดก่อนหน้า ไม่ต้องบวกใหม่ทั้งหมด และใช้ Structured Reference ทำให้สูตรอ่านง่ายและยืดหยุ่น เหมาะกับข้อมูลขนาดใหญ่กว่า
1.3 ใช้ SUMIFS
เพื่อยึดตาม OrderID แม้เรียงข้อมูลใหม่
อีกวิธีนึงที่สามารถใช้ได้ดี คือ SUMIFS ซึ่งใช้ประโยชน์จากการอ้างอิง OrderID มาช่วยในการคำนวณสะสมได้
=SUMIFS(Sales[Amount], Sales[OrderID], "<=" & [@OrderID])
คำอธิบาย:
- ฟังก์ชัน
SUMIFS
จะบวกเฉพาะค่าจากคอลัมน์Amount
ที่OrderID
มีค่าน้อยกว่าหรือเท่ากับแถวปัจจุบัน - ใช้
[@OrderID]
เพื่ออ้างอิงค่าในแถวปัจจุบัน - ข้อดีคือ ไม่ต้องอาศัยลำดับแถวใน Excel จะเรียงข้อมูลใหม่ หรือ Filter ยังไง Running Total ก็ยังคำนวณได้ถูกต้องเสมอ (เพราะดูจากค่า ไม่ใช่ตำแหน่ง)
📌 เหมาะกับใคร?
- เหมาะกับงานที่มีการ Sort หรือ Filter ข้อมูลบ่อยๆ
- ใช้ใน Table ได้เต็มรูปแบบ ทำงานร่วมกับ Structured Reference ได้
- ไม่สนตำแหน่งของแถว ใช้ได้แม้ Sort / Filter / สลับลำดับข้อมูล
- อย่างไรก็ตาม การคำนวณแบบนี้จะไม่สามารถเอายอดสะสมก่อนหน้ามาคิดได้นะ ต้องคำนวณใหม่ทุกตัว (เพื่อรองรับการเรียงใหม่)
2. ใช้ Pivot Table: วิธีที่สะดวกสำหรับการวิเคราะห์
ถ้าคุณชอบเครื่องมือที่ช่วยจัดการข้อมูลอัตโนมัติแบบง่ายๆ โดยไม่ต้องเขียนสูตรเลย Pivot Table คือตัวเลือกที่ดี
ขั้นตอน:
- เลือก Table ที่ทำไว้
- ไปที่แท็บ Insert > Pivot Table > เลือก “New Worksheet”
- ใน Pivot Table Fields:
- ลาก “OrderID” ไปที่ Rows
- ลาก “Amount” ไปที่ Values (เลือกให้เป็น Sum of Amount)
- คลิกที่ “Sum of Amount” ใน Values > เลือก Value Field Settings
- ไปที่ Show Values As > เลือก Running Total In > Base Field เลือก “OrderID”
- กด OK
ผลลัพธ์:

Pivot Table จะแสดงยอดสะสมตามลำดับ OrderID อัตโนมัติ โดยไม่ต้องเขียนสูตรเอง
วิธีนี้เหมาะกับการวิเคราะห์ข้อมูลแบบรวดเร็ว และสามารถปรับแต่งเพิ่มเติมได้ แต่ข้อเสียคือ โครงสร้างตารางมันต้องมีหน้าตาแบบ PivotTable เท่านั้น และต้องมีการ Refresh ผลลัพธ์ถึงจะอัปเดทตามข้อมูลใหม่
3. ใช้สูตร Array: วิธีทันสมัยใน Excel 365/2021
สำหรับผู้ใช้ Excel เวอร์ชันใหม่ (365 หรือ 2021) สามารถใช้ฟังก์ชัน SCAN เพื่อคำนวณยอดสะสมแบบอาร์เรย์ได้
แต่เวลาเราใช้ Dynamic Arrays แล้วกรณีผลลัพธ์ออกมาหลายค่า จะใส่ไว้ใน Table ไม่ได้ ดังนั้นมันจะเหมาะกับกรณีที่ผลลัพธ์ออกมาในบริเวณที่เป็นข้อมูลปกติที่ไม่ได้เป็น Table ซะมากกว่า
ขั้นตอน:
ในเซลล์ C3 ใส่สูตร: SCAN + LAMBDA มาช่วยได้
SCAN(initial_value,array,function)
=SCAN(0, Sales[Amount], LAMBDA(acc,val, acc+val))
0
คือค่าเริ่มต้นของผลรวมSales[Amount]
คือช่วงข้อมูล Amount ซึ่งเป็น Array ที่มีหลายค่าLAMBDA(acc, val, acc+val)
บอกให้บวกสะสมไปเรื่อยๆ- acc = accum value ก่อนหน้า (ค่าเริ่มต้นคือ initial_value คือ 0)
- val = ค่าแต่ละตัวที่กำลังไล่ SCAN อยู่
- ชื่อตัวแปรจะตั้งอะไรก็ได้ ไม่จำเป็นต้องใช้ acc กับ val นะ
กด Enter สูตรจะคำนวณยอดสะสมทั้งหมดในครั้งเดียว

ผลลัพธ์:
- C3: 200
- C4: 350 (200+150)
- C5: 425 (350+75)
- และต่อไปเรื่อยๆ
วิธีนี้ก็สะดวก ไม่ต้องลากสูตร และทำงานได้มีประสิทธิภาพ เพราะเอาผลลัพธ์ที่สะสมไว้มาใช้ต่อได้
4. ใช้ Python in Excel: วิธีที่ง่ายกว่าที่คิด
ในเมื่อ Excel รุ่นใหม่อย่าง Excel 365 สามารถใช้ Python ที่เหมาะกับการคำนวณขั้นสูงได้แล้ว! เรามาลองใช้ Python คำนวณ Running Total ดู
ขั้นตอน:
ไปที่ช่อง Cell ว่างๆ พิมพ์ =PY แล้ว Tab เพื่อเข้าสู่โหมดเขียน Code ด้วย Python
ใส่โค้ด
df=xl("Sales[#All]", headers=True)
df['RunningTotal'] = df['Amount'].cumsum()
df
กด Ctrl+Enter เพื่อรัน Code
ผลลัพธ์:
ตอนแรกจะแสดงเป็น Python Object ก่อน

ให้กดเปลี่ยนเป็น Excel Value มันจะได้ Spill ออกมาเป็น Dynamic Array (กด Ctrl+Shift+Alt+M ก็ได้)

ตารางจะแสดงคอลัมน์ “RunningTotal” พร้อมยอดสะสม
วิธีนี้ได้ผลลัพธ์ออกมาง่ายๆ เลย เพราะมีฟังก์ชันสำเร็จรูปอย่าง .cumsum() มาช่วยอยู่แล้วนั่นเอง
4. ใช้ Power Query (M Code)
Power Query เหมาะกับการจัดการข้อมูลที่มีหลายขั้นตอน แล้วบันทึกเป็น Step การทำงานไว้ได้ หากต้องการทำซ้ำ สามารถกด Refresh ได้เลย
เลือกตารางข้อมูล > ไปที่ Data > Get & Transform Data > From Table/Range
ใน Power Query Editor ใช้โค้ด M ดังนี้
4.1 วิธี M Code สร้าง List ที่เปลี่ยนช่วงข้อมูลให้เยอะขึ้นเรื่อยๆ
let
Source = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
AddRunningTotal = Table.AddColumn(Source, "RunningTotal", (current) =>
List.Sum(
Table.SelectRows(Source, each [OrderID] <= current[OrderID])[Amount]
), type number)
in
AddRunningTotal
หลักการ:
- สูตร (current) => List.Sum(Table.SelectRows(Source, each [OrderID] <= current[OrderID])[Amount])
จะสร้าง List ของ Amount โดย Filter OrderID ที่ไม่เกิน OrderID ปัจจุบัน แล้วบวกผลรวม - ตัวอย่าง: ที่แถว Order0003 จะได้ List [200, 150, 75] แล้วคำนวณเป็น 425

ข้อสังเกต:
วิธีนี้ยังไม่ค่อยมีประสิทธิภาพ เพราะมีการคำนวณซ้ำซ้อนในแต่ละแถว (ถ้าเปิดดู List ก่อนใช้ List.Sum จะเห็นชัดว่าเป็น List ที่ซ้ำกันในแต่ละรอบ)
4.2 วิธี M Code แบบมีประสิทธิภาพ (แต่ยากนะ)
เพื่อลดการคำนวณซ้ำซ้อน เราจะใช้การสะสม (Accumulation) ด้วย List.Generate เพื่อคำนวณ Running Total ทีละแถว
ขั้นตอน:
ใช้โค้ด M ดังนี้ จะ Efficient ขึ้นเยอะ
let
Source = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source, {{"OrderID", type text}, {"Amount", Int64.Type}}),
MyData = Table.Buffer(#"Changed Type"),
AmountList = List.Buffer(MyData[Amount]),
RunningTotalList = List.Generate(
() => [Total = AmountList{0}, Index = 0],
each [Index] < List.Count(AmountList),
each [Total = List.Sum({[Total], AmountList{[Index] + 1}}), Index = [Index] + 1],
each [Total]
),
TransfromToList = Table.ToColumns(MyData) & {Value.ReplaceType(RunningTotalList, type {number})},
Result = Table.FromColumns(TransfromToList, Table.ColumnNames(MyData) & {"Running Total"})
in
Result

คลิก Close & Load เพื่อโหลดข้อมูลกลับไปที่ Excel
หลักการทำงานของโค้ด
- Source : ดึงตาราง “Sales” จาก Excel มาเป็นตารางใน Power Query
- #”Changed Type” : กำหนด Data Type
- MyData : ใช้ Table.Buffer เพื่อเก็บตารางไว้ในหน่วยความจำ ลดการประเมินซ้ำเมื่ออ้างอิง MyData ภายหลัง (เช่น ดึง Amount, Table.ToColumns)
- AmountList : ดึงคอลัมน์ Amount ออกมาเป็น List (เช่น {200, 150, 75, …}) และใช้ List.Buffer เพื่อเก็บในหน่วยความจำ
- RunningTotalList : คำนวณ Running Total ด้วย List.Generate ซึ่งจะอธิบายถัดไป
- TransfromToList : แปลงตารางเป็น List และเพิ่ม Running Total โดยกำหนด Type เป็น Number
- Table.ToColumns(MyData): แปลงตาราง MyData เป็น List ของคอลัมน์ (เช่น {{OrderID1, OrderID2, …}, {Amount1, Amount2, …}})
- Value.ReplaceType(RunningTotalList, type {number}): กำหนด Data Type ให้ RunningTotalList เป็น List ของ number
- รวม RunningTotalList เข้ากับ List ของคอลัมน์จาก MyData
- Result : สร้างตารางผลลัพธ์
- ใช้ Table.FromColumns เพื่อสร้างตารางใหม่จาก TransfromToList
- ใช้ชื่อคอลัมน์จาก Table.ColumnNames(MyData) และเพิ่ม Running Total
ส่วนสำคัญ
ส่วนสำคัญ คือ Part ที่ เป็น Running Total List ที่ใช้สูตรนี้ ที่ทำให้มัน Efficient ขึ้นมาก
= List.Generate(
() => [Total = AmountList{0}, Index = 1],
each [Index] <= List.Count(AmountList),
each [Total = [Total] + AmountList{[Index]}, Index = [Index] + 1],
each [Total]
)
หลักการ ของ RunningTotalList
- เริ่มต้นที่ Total = AmountList{0} (Amt แรก คือ 200) และ Index = 0
- วนลูปจนถึง Index < List.Count(AmountList) (เช่น 8 สมาชิก วนถึง Index = 7)
- คำนวณ Total โดยใช้ List.Sum({[Total], AmountList{[Index] + 1}}), บวกยอดสะสมจาก Total เดิม และ Amount ใหม่ของแถวถัดไป
- คืนค่า Total เป็น List ของ Running Total (เช่น {200, 350, 425, …})

ผลลัพธ์:
- RunningTotal จะแสดงยอดสะสมตามลำดับ (200, 350, 425, 550, 600, 700, 950, 1250)
ข้อดี:
วิธีนี้ลดการคำนวณซ้ำซ้อนเมื่อเทียบกับวิธี 4.1 เพราะคำนวณสะสมทีละครั้งแทนการ Filter ใหม่ทุกแถว เหมาะกับข้อมูลขนาดใหญ่
5. ใช้ DAX
DAX เหมาะสำหรับการทำงานใน Power Pivot (หรือ Power BI) โดยที่เราทำได้ 2 วิธี คือ ใช้ DAX สร้าง New Column หรือ สร้าง New Measure ก็ได้
5.1 DAX New Column
DAX New Column จะคำนวณ Running Total และเก็บผลลัพธ์เป็นคอลัมน์ใหม่ในตาราง Sales
กดสร้าง New Column ใน Data Model ชื่อ Running Total แล้วใส่สูตรนี้
โค้ด DAX สำหรับ New Column
=
VAR CurrentID=Sales[OrderID]
VAR AccumTable=FILTER(
ALL(Sales[Amount],Sales[OrderID]) ,
Sales[OrderID] <= CurrentID)
RETURN
SUMX(AccumTable,Sales[Amount])

การทำงาน
- VAR CurrentID = Sales[OrderID]: เก็บค่า OrderID ของแถวปัจจุบัน (เช่น Order0001)
- VAR AccumTable = FILTER…
- ALL(Sales[Amount], Sales[OrderID]): ล้างบริบทการกรองและเลือกเฉพาะคอลัมน์ Amount และ OrderID
- Sales[OrderID] <= CurrentID: กรองแถวที่มี OrderID น้อยกว่าหรือเท่ากับ CurrentID
- SUMX(AccumTable, Sales[Amount]): รวมค่า Amount จากตาราง AccumTable ที่กรองแล้ว
ข้อดี
- โค้ดอ่านง่ายขึ้นด้วย VAR
- เหมาะสำหรับการเก็บค่า Running Total แบบคงที่ไว้ในตารางเลย ตอนเรียกดูรายงานจะเร็ว
ข้อควรระวัง
- ต้องเรียงลำดับ OrderID ให้ถูกต้อง (เช่น ใช้ Power Query เพื่อเรียงลำดับก่อน)
- ค่าเหล่านี้จะไม่เปลี่ยนตาม Filter Context ของรายงานแล้ว
5.2 DAX Measure (ใช้ VAR)
DAX Measure จะคำนวณ Running Total ตามบริบทการกรอง (เช่น ใน Visual หรือ PivotTable) โดยไม่เก็บผลลัพธ์ในตารางเลย
โค้ด DAX สำหรับ New Measure
Running Total Measure =
VAR CurrentID = MAX(Sales[OrderID])
RETURN
CALCULATE(
SUM(Sales[Amount]),
Sales[OrderID] <= CurrentID
)

การทำงาน
- VAR CurrentID = MAX(Sales[OrderID]): เก็บค่า OrderID สูงสุดในบริบทการกรองปัจจุบัน (เช่น ถ้าใน PivotTable กรองถึง Order0003, CurrentID จะเป็น Order0003)
- CALCULATE: คำนวณผลรวมของ Amount โดยล้าง Filter Context เกี่ยวกับ OrderID แล้วค่อยกรองแถวใน Sales โดยเลือกเฉพาะแถวที่มี OrderID น้อยกว่าหรือเท่ากับ CurrentID
- ผลลัพธ์:
- ถ้าใน Visual กรองถึง Order0003: 200 + 150 + 75 = 425
- ถ้าแสดงทั้งตาราง: 200 + 150 + 75 + 125 + 50 + 250 + 100 + 300 = 1250
ข้อดี
- โค้ดชัดเจนด้วย VAR
- คำนวณแบบไดนามิกตามบริบทการกรอง
- ประหยัดหน่วยความจำ เพราะไม่เก็บในตาราง
ข้อควรระวัง
- ต้องใช้ใน Visual หรือ PivotTable ที่มีการกรอง OrderID
- อาจช้าลงถ้ามีการกรองจำนวนมาก
การเปรียบเทียบ
คุณสมบัติ | New Column (VAR) | Measure (VAR) |
---|---|---|
ที่เก็บข้อมูล | อยู่ในตาราง | คำนวณแบบไดนามิก |
ประสิทธิภาพ | อาจช้าตอน refresh แต่เร็วตอนดูรายงาน | เร็วตอน refresh แต่อาจช้าตอนดูรายงาน |
การใช้งาน | แสดงผลคงที่ | วิเคราะห์แบบโต้ตอบได้ |
คำแนะนำ
- New Column: ใช้เมื่อต้องการค่า Running Total แบบคงที่และไม่เปลี่ยนแปลงบ่อย
- Measure: ใช้เมื่อต้องการวิเคราะห์แบบไดนามิกหรือกรองข้อมูลใน Visual
📌 สรุป: วิธีไหนเหมาะกับใคร?
วิธี | จุดเด่น | เหมาะกับกรณี |
---|---|---|
1.1 SUM ปกติ | เข้าใจง่าย มือใหม่ใช้ได้ทันที | ตารางเรียงลำดับแน่นอน |
1.2 SUM + [@Amount] | ลากสูตรอัตโนมัติ, อ่านง่าย | ใช้กับ Table ได้ดี และประสิทธิภาพสูง |
1.3 SUMIFS | ไม่พึ่งลำดับแถว, คงผลลัพธ์เดิมไว้ได้แม้มีการสลับลำดับ | ข้อมูลถูก Sort ใหม่แล้วไม่พัง |
2. Pivot Table | ไม่ต้องเขียนสูตร | วิเคราะห์ข้อมูลแบบ เปลี่ยนมุมมองได้สะดวก |
3. SCAN (Array) | เขียนครั้งเดียว คำนวณทั้งชุด | งานไม่อยู่ใน Table / ชอบสูตรใหม่ |
4. Python | เขียนสั้น ใช้ .cumsum() | เขียน Script/Advanced Data Analysis |
5.1 Power Query (Filter) | ขั้นตอนชัดเจน | เหมาะในขั้นตอนข้อมูล ที่ข้อมูลไม่เยอะ |
5.2 Power Query (Accumulate) | เร็วกว่าแบบ Filter | เหมาะในขั้นตอนข้อมูล ใช้กับข้อมูลจำนวนมากได้ |
6.1 DAX Column | ค่าเก็บคงที่ ดูรายงานเร็ว | สร้าง Data Model |
6.2 DAX Measure | Dynamic ตาม Context | วิเคราะห์ใน PowerPivot / Visual |
ส่งท้าย
Running Total อาจดูเหมือนเรื่องเล็กๆ แต่พอเราได้ลองใช้หลายๆ วิธี จะพบว่าแต่ละแบบมี “แนวคิดเบื้องหลัง” ที่แตกต่างกัน และนั่นแหละคือกุญแจสู่การเป็น “คนเก่ง Excel” เลยล่ะ!
ลองใช้หลายเทคนิคกับข้อมูลจริงดูนะ แล้วคุณจะเข้าใจ Excel ในแบบที่ลึกและสนุกยิ่งขึ้นแน่นอนครับ 😊
Leave a Reply