Bảng tính 7 — Tự động hoá: VBA, Macro & Apps Script
Khi bảng tính bắt đầu lặp lại chính nó
Có một dấu hiệu rất rõ trong đời một analyst ngân hàng: mỗi sáng bạn mở đúng file cũ, làm đúng chuỗi thao tác cũ — dán dữ liệu, lọc, định dạng, xuất PDF, gửi email cho chi nhánh — và nhận ra mình đang làm robot. Đó là lúc tự động hoá đáng cân nhắc: không phải để trông "pro" hơn, mà để giảm sai sót thao tác tay, rút thời gian và làm quy trình lặp lại y hệt mỗi lần chạy.
Nhưng tự động hoá cũng là con dao hai lưỡi trong ngân hàng: một macro viết ẩu có thể phá dữ liệu không hoàn tác được, một file .xlsm không ai kiểm soát có thể trở thành "chương trình ẩn" mà rủi ro không kém một ứng dụng thật. Bài này đi qua đủ hai mặt: cách làm (VBA, Office Scripts, Apps Script, Power Automate) và cách kiểm soát (rủi ro macro, quản trị End-User Computing, khi nào nên bỏ macro để chuyển sang giải pháp chuẩn).
Trong loạt bài này chúng ta đã dựng nền tảng không-code: Power Query để làm sạch và gộp dữ liệu, mô hình dữ liệu & DAX để tính toán, dashboard để trình bày. Tự động hoá bằng code là lớp cuối cùng — chỉ dùng khi các lớp không-code đã hết dư địa.
Nguyên tắc số một: ưu tiên không-code trước
Trước khi viết dòng VBA nào, hãy hỏi: Power Query hoặc công thức có làm được không? Rất nhiều thứ người ta viết macro để làm, thực ra Power Query làm sạch hơn, bền hơn, và không có rủi ro bảo mật macro.
| Nhu cầu | Giải pháp ưu tiên | Khi nào mới cần macro/code |
|---|---|---|
| Làm sạch, gộp nhiều file cùng cấu trúc | Power Query (Get Data → Folder) | Khi cấu trúc mỗi file khác nhau, cần logic điều kiện phức tạp |
| Tính toán, phân loại theo điều kiện | Công thức / DAX | Khi cần lặp qua từng dòng với thao tác không diễn đạt được bằng công thức |
| Refresh dữ liệu định kỳ | Power Query + refresh theo lịch | Khi cần thao tác ngoài Excel (đổi tên file, gửi mail, gọi hệ thống khác) |
| Định dạng báo cáo cố định | Template + Power Query | Khi định dạng phụ thuộc dữ liệu và phải áp cho hàng chục file |
| Xuất PDF & gửi email hàng loạt | — | Đây là chỗ macro thật sự có giá trị |
Quy tắc thực chiến: macro chỉ nên làm những việc Power Query không với tới — chủ yếu là các thao tác ngoài dữ liệu (xuất file, gửi mail, điều phối nhiều workbook, tương tác với hệ điều hành). Còn phần biến đổi dữ liệu thì để Power Query lo, vì nó tự tài liệu hoá từng bước và không cần bật "Enable Macros".
Khi nào tự động hoá là xứng đáng
- Báo cáo định kỳ: cùng một báo cáo chạy hằng ngày/tuần/tháng, cấu trúc ổn định.
- Xử lý nhiều file: gộp/định dạng hàng chục file chi nhánh giống nhau.
- Quy trình nhiều bước lặp: chuỗi thao tác dài, dễ sai nếu làm tay, phải làm y hệt mỗi lần.
Ngược lại, nếu việc chỉ làm một lần, hoặc mỗi lần lại khác, hoặc dữ liệu nguồn hay đổi cấu trúc — tự động hoá thường tốn công bảo trì hơn giá trị tiết kiệm.
Excel: Macro Recorder — cửa vào nhanh nhất
Cách học VBA nhanh nhất không phải đọc sách mà là ghi lại thao tác của chính mình. Vào tab Developer → Record Macro, làm thủ công đúng chuỗi việc bạn muốn (định dạng, lọc, sao chép…), rồi Stop Recording. Excel tự sinh ra mã VBA tương ứng. Mở Visual Basic Editor (Alt+F11) để đọc mã đó — bạn học được tên đối tượng và phương thức thật.
Macro Recorder tuyệt vời để khởi động, nhưng mã nó sinh ra thường rườm rà và giòn: nó ghi lại cả thao tác chọn ô (Select, Activate) mà một macro tốt không cần, và nó hardcode mọi thứ theo đúng ô bạn đang đứng. Dùng nó để khám phá cú pháp, rồi viết lại gọn gàng.
VBA cơ bản — đủ để tự viết macro có ích
VBA (Visual Basic for Applications) là ngôn ngữ nhúng trong Office. Vài khối kiến thức tối thiểu:
Sub và biến. Đơn vị chạy được là một Sub. Biến khai báo bằng Dim.
Sub TinhTongSoDu()
Dim ws As Worksheet
Dim i As Long
Dim tong As Double
Set ws = ThisWorkbook.Worksheets("SaoKe")
tong = 0
' ... (minh hoạ, không phải mã chạy trên SQL Builder)
End Sub
Vòng lặp. Lặp qua các dòng dữ liệu là việc hay gặp nhất:
' MINH HOẠ: cộng dồn cột số dư (cột C) từ dòng 2 tới dòng cuối
Dim dongCuoi As Long
dongCuoi = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
For i = 2 To dongCuoi
tong = tong + ws.Cells(i, "C").Value
Next i
MsgBox "Tong so du: " & Format(tong, "#,##0")
Tham chiếu Range / Worksheet. Luôn tham chiếu tường minh (ThisWorkbook.Worksheets("Ten")) thay vì dựa vào sheet "đang active" — đây là nguồn lỗi số một của macro tự sinh.
Xử lý workbook / file. VBA mở, đọc, lưu, đóng các file khác được:
' MINH HOẠ: mở một file chi nhánh, đọc dữ liệu, đóng lại
Dim wb As Workbook
Set wb = Workbooks.Open("D:\BaoCao\CN_HoChiMinh.xlsx")
' ... đọc/copy dữ liệu ...
wb.Close SaveChanges:=False
MsgBox để báo trạng thái/hoàn tất; InputBox để nhận tham số đơn giản từ người dùng.
Bốn kiểu macro có ích thật (minh hoạ)
- Định dạng báo cáo chuẩn — áp header, viền, định dạng số, đóng băng dòng tiêu đề cho hàng loạt sheet giống nhau.
- Gộp file — mở lần lượt các file chi nhánh trong một thư mục, dán dữ liệu vào một sheet tổng.
- Xuất PDF —
ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:="..."; rất hợp để phát báo cáo dạng ảnh chụp không sửa được. - Gửi email qua Outlook — tạo
Outlook.Application, dựng mail, đính kèm PDF, gửi tới danh sách chi nhánh.
' MINH HOẠ: gửi báo cáo PDF qua Outlook
Dim ol As Object, mail As Object
Set ol = CreateObject("Outlook.Application")
Set mail = ol.CreateItem(0) ' 0 = olMailItem
With mail
.To = "[email protected]"
.Subject = "Bao cao cuoi ngay"
.Attachments.Add "D:\BaoCao\BC_CuoiNgay.pdf"
.Send
End With
Hiệu năng. Với macro chạm nhiều ô, tắt cập nhật màn hình và tính lại tự động khi chạy, bật lại khi xong:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' ... phần việc nặng ...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Chỉ riêng việc tắt ScreenUpdating có thể rút một macro từ vài phút xuống vài giây.
Office Scripts — VBA hiện đại cho Excel web
VBA chỉ chạy trên Excel desktop và mang tiếng "cũ, kém an toàn". Microsoft đưa ra Office Scripts viết bằng TypeScript — chạy trên Excel for the web, và quan trọng hơn: gọi được từ Power Automate. Nghĩa là bạn có thể để một luồng tự động chạy script trên đám mây, không cần mở máy tính. Với các quy trình mới, Office Scripts + Power Automate là hướng thay thế đáng cân nhắc cho VBA, đặc biệt khi cần chạy theo lịch không phụ thuộc một máy trạm cụ thể.
Google Sheets: Apps Script
Bên Google, tương đương với VBA là Apps Script — viết bằng JavaScript, chạy trên hạ tầng Google.
// MINH HOẠ Apps Script: onEdit tự ghi thời điểm sửa vào cột Z
function onEdit(e) {
const sh = e.source.getActiveSheet();
const r = e.range.getRow();
sh.getRange(r, 26).setValue(new Date()); // cột Z
}
Điểm mạnh của Apps Script:
- Trigger sự kiện:
onOpen(khi mở file — thường dùng để thêm menu tuỳ chỉnh),onEdit(khi có người sửa ô). - Custom function: viết hàm dùng ngay trong ô như
=MYFUNC(A1). - Gửi mail:
MailApp.sendEmail(...)gửi thẳng, không cần Outlook. - Lịch chạy time-driven: đặt trigger chạy theo giờ/ngày trên đám mây — sheet tự cập nhật và gửi báo cáo kể cả khi không ai mở file.
Khác biệt với VBA: Apps Script chạy trên cloud của Google (không cần máy trạm bật), dùng JavaScript (không phải Basic), có giới hạn quota thời gian chạy và số email/ngày, và về bản chất an toàn hơn vì không có quyền truy cập hệ điều hành như VBA. Đổi lại, nó bị đóng khung trong hệ sinh thái Google Workspace.
Power Automate — tự động hoá luồng, không cần mở máy
Khi việc tự động hoá vượt khỏi một file — kéo dữ liệu từ Excel trên SharePoint, gửi email, cập nhật một danh sách, chạy theo lịch — thì công cụ đúng là Power Automate (trước gọi Microsoft Flow). Nó nối các connector: Excel, Outlook, SharePoint, Teams, và có thể gọi Office Scripts.
Ưu điểm quyết định so với VBA: luồng chạy trên đám mây theo lịch (trigger định kỳ), không phụ thuộc một máy tính phải bật và mở file. Một luồng "8h sáng mỗi ngày làm việc: refresh file, xuất PDF, gửi mail các chi nhánh" chạy được kể cả khi máy bạn tắt.
So sánh nhanh các công cụ
| Công cụ | Ngôn ngữ | Nơi chạy | Chạy theo lịch không cần mở máy |
|---|---|---|---|
| VBA | VBA (Basic) | Excel desktop | Không (phải có máy bật + file mở) |
| Office Scripts | TypeScript | Excel web / cloud | Có (qua Power Automate) |
| Apps Script | JavaScript | Google cloud | Có (time-driven trigger) |
| Power Automate | Low-code (flow) | Cloud | Có |
Lịch & trigger — chạy định kỳ
"Tự động hoá" thật sự đến từ trigger: cái gì khởi động macro/luồng. Có ba loại:
- Sự kiện trong file:
onOpen/onEdit(Apps Script),Workbook_Open(VBA) — chạy khi mở/sửa. - Theo lịch (time-driven): chạy vào giờ cố định — Apps Script time trigger, Power Automate scheduled flow.
- Thủ công: người dùng bấm nút — an toàn nhất cho các macro có tác động ghi/xoá dữ liệu.
Trong ngân hàng, macro ghi/xoá/gửi nên để trigger thủ công có xác nhận hoặc chạy trong luồng có kiểm soát, tránh trigger onEdit âm thầm chạy tác vụ nặng mỗi lần ai đó gõ một ô.
Nguyên tắc an toàn & kiểm soát trong ngân hàng
Đây là phần quan trọng nhất của bài. Trong môi trường ngân hàng, một macro không kiểm soát là rủi ro thật.
Rủi ro macro
- Macro là vector malware: file Office chứa macro độc là con đường tấn công kinh điển. Vì thế Microsoft vô hiệu hoá macro theo mặc định — nhất là với file tải từ Internet/email (Mark of the Web).
- Chỉ bật macro từ nguồn tin cậy: không bao giờ "Enable Content" với file lạ. Trong tổ chức, macro nên được ký số (digital signature) và chỉ chạy từ Trusted Location do IT quản lý.
- Macro có thể phá dữ liệu không hoàn tác được: khác thao tác tay, chạy macro thường xoá sạch stack Undo. Một vòng lặp xoá dòng sai điều kiện là mất dữ liệu vĩnh viễn.
End-User Computing (EUC) governance
Một macro hay một file Excel phức tạp thực chất là một chương trình do người dùng cuối viết — gọi là End-User Computing (EUC). Nếu file đó dùng cho việc trọng yếu (báo cáo cho lãnh đạo, số liệu vào sổ, tính toán rủi ro), nó phải chịu kiểm soát như một ứng dụng, không phải "file cá nhân". Khung EUC tối thiểu:
- Kiểm kê (inventory): biết những file/macro trọng yếu nào đang tồn tại và ai chủ sở hữu.
- Version & lưu vết: quản lý phiên bản, không để "báo_cáo_final_v7_moi_nhất.xlsm" trôi nổi.
- Review độc lập: logic macro/công thức được người thứ hai kiểm tra, đặc biệt các công thức tính tiền/rủi ro.
- Chống "chương trình ẩn": cảnh giác với logic nghiệp vụ chôn trong VBA mà không ai ngoài tác giả hiểu — khi người đó nghỉ, không ai bảo trì được.
Chất lượng của đầu ra macro cũng phải được kiểm soát như mọi dữ liệu khác — các kiểm tra tính đầy đủ, hợp lệ, đối chiếu tổng số nên áp lên kết quả macro sinh ra; xem thêm Chất lượng dữ liệu.
Khi nào nên chuyển từ macro sang giải pháp chuẩn
Macro là giải pháp tốt cho quy mô nhỏ và thao tác ngoài-dữ liệu. Hãy chuyển sang SQL/pipeline/BI chuẩn khi gặp các dấu hiệu:
- Dữ liệu lớn tới mức Excel ì ạch, hoặc vượt trần ~1,048,576 dòng.
- Nhiều người cùng cần kết quả, cần một nguồn số liệu duy nhất thay vì file gửi qua lại.
- Logic đã phức tạp tới mức chỉ tác giả hiểu — rủi ro bảo trì cao.
- Cần lịch chạy tin cậy, có log, có cảnh báo khi lỗi.
Lúc này, phần biến đổi dữ liệu nên chuyển vào SQL/pipeline dữ liệu, phần trình bày chuyển sang công cụ BI. Macro (nếu còn) chỉ giữ lại các thao tác cuối như xuất/gửi mà nền tảng chuẩn chưa lo.
Cây quyết định: tự động hoá bằng gì?
Cạm bẫy thường gặp
- Hardcode đường dẫn (
D:\BaoCao\...): đổi máy hay đổi thư mục là gãy. Dùng đường dẫn tương đối theoThisWorkbook.Pathhoặc tham số hoá. - Không bắt lỗi: thiếu
On Error(VBA) haytry/catch(Apps Script) khiến macro dừng giữa chừng, để lại dữ liệu nửa vời. - Macro phá dữ liệu không Undo được: luôn sao lưu trước khi chạy macro có ghi/xoá; test trên bản copy.
- Quên tối ưu hiệu năng: không tắt
ScreenUpdating/tính lại tự động khiến macro chậm gấp nhiều lần. - Dựa vào sheet active: tham chiếu tường minh worksheet, đừng để macro "đoán" đang đứng ở đâu.
Use case thực tế
Bối cảnh. Một chi nhánh vùng của NCB quản lý 42 phòng giao dịch. Mỗi cuối ngày, tổ báo cáo phải phát cho từng phòng một file PDF gồm: số dư huy động cuối ngày, doanh số giải ngân, và top giao dịch lớn. Trước đây làm tay: lọc dữ liệu theo từng phòng, định dạng, xuất PDF, đính kèm email — khoảng 4 phút/phòng × 42 = ~2,8 giờ mỗi tối, và tối nào cũng có 1–2 phòng bị gửi nhầm file.
Giải pháp. Nhóm tự động hoá theo đúng nguyên tắc "không-code trước, macro sau":
- Power Query kéo dữ liệu giao dịch cuối ngày từ kho (nguồn số liệu vốn được lấy bằng một câu SQL tổng hợp, minh hoạ dưới), làm sạch, gắn mã phòng giao dịch — không dùng macro cho bước này.
- VBA macro (chạy trên desktop, trigger bằng nút bấm có hộp xác nhận): lặp qua 42 mã phòng, với mỗi mã thì lọc, áp template định dạng, xuất PDF vào thư mục theo tên phòng, rồi tạo mail Outlook đính kèm đúng PDF. Có
On Errorghi log phòng nào lỗi; tắtScreenUpdatingđể chạy nhanh. - Kiểm soát EUC: file
.xlsmđặt ở Trusted Location của IT, macro ký số, mã được review bởi một người thứ hai, và có bước đối chiếu: tổng số dư trong PDF phải khớp tổng của bảng nguồn trước khi cho phép gửi.
Minh hoạ câu SQL tổng hợp nguồn (đúng schema sandbox — số dư huy động và số tài khoản theo loại tiền):
-- ▶ Chạy được
SELECT currency,
COUNT(*) AS so_tai_khoan,
ROUND(SUM(balance)::numeric, 2) AS tong_so_du
FROM accounts
GROUP BY currency
ORDER BY tong_so_du DESC;
Kết quả. Thời gian phát báo cáo cuối ngày giảm từ ~2,8 giờ xuống dưới 6 phút (chủ yếu là thời gian macro chạy + người kiểm tra bước đối chiếu). Số vụ gửi nhầm file về 0 vì việc ghép PDF–email do code làm theo mã phòng. Quan trọng không kém: vì macro nằm trong khung EUC, khi người viết nghỉ phép, đồng nghiệp đã được review vẫn vận hành và sửa được — không còn "chương trình ẩn".
Ghi nhớ
- Ưu tiên không-code trước: Power Query/công thức/DAX cho phần biến đổi dữ liệu; chỉ dùng macro cho thao tác ngoài dữ liệu (xuất PDF, gửi mail, điều phối file).
- Tự động hoá xứng đáng với việc lặp ổn định: báo cáo định kỳ, xử lý nhiều file, quy trình nhiều bước; không đáng với việc một-lần hoặc luôn thay đổi.
- Macro Recorder để học nhanh cú pháp, nhưng viết lại gọn — mã tự sinh giòn và rườm rà.
- VBA cốt lõi: Sub, biến, vòng lặp, tham chiếu Range/Worksheet tường minh, xử lý workbook, MsgBox; luôn tắt
ScreenUpdatingkhi chạy nặng. - Office Scripts (TypeScript), Apps Script (JavaScript) và Power Automate cho phép chạy theo lịch trên cloud, không cần mở máy — hướng hiện đại thay VBA.
- Rủi ro macro: là vector malware, bị vô hiệu mặc định, chỉ bật từ nguồn tin cậy/ký số; macro có thể phá dữ liệu không Undo được.
- EUC governance: file/macro trọng yếu phải được kiểm kê, version, review độc lập; tránh "chương trình ẩn" trong Excel (xem Chất lượng dữ liệu).
- Chuyển sang SQL/pipeline/BI chuẩn khi dữ liệu quá lớn, nhiều người dùng, logic quá phức tạp hoặc cần lịch chạy tin cậy có log.
- Các mã VBA/Apps Script ở trên chỉ là minh hoạ, không chạy trên SQL Builder.
Bài viết liên quan
Làm chủ công thức bảng tính để phân tích dữ liệu ngân hàng: tra cứu (VLOOKUP, INDEX/MATCH, XLOOKUP) và cách chọn; tham chiếu tuyệt đối/tương đối và named range; hàm điều kiện & tổng hợp (IF/IFS, SUMIFS, COUNTIFS, SUMPRODUCT); xử lý văn bản & ngày tháng; xử lý lỗi (IFERROR/IFNA); mảng động (FILTER, SORT, UNIQUE); LAMBDA/LET; mẹo hiệu năng, audit và các cạm bẫy kinh điển.
PivotTable — công cụ tổng hợp mạnh nhất của bảng tính, tương đương GROUP BY trong SQL. Bài chỉ nguyên lý pivot từ dữ liệu tidy, cách dựng vùng Rows/Columns/Values/Filters, chọn hàm và Show Values As, nhóm ngày/số, Calculated Field, Slicer & Timeline, GETPIVOTDATA, refresh & pivot cache, khác biệt Google Sheets và pivot từ Data Model, kèm thực hành ngân hàng.
Định vị Excel & Google Sheets trong công việc data analyst ngân hàng: khi nào dùng bảng tính vs SQL/BI, giới hạn & 'spreadsheet hell', tư duy dữ liệu sạch (tidy, named range, Table), tổng quan năng lực nâng cao của series (công thức, PivotTable, Power Query, Data Model/DAX, dashboard, tự động hoá), kết nối dữ liệu thật và kiểm soát chất lượng công thức.
Power Query — công cụ ETL self-service trong Excel & Power BI: kết nối nguồn (file/folder, web, database, API), làm sạch và biến đổi dữ liệu qua các Applied Steps lặp lại được, refresh một nút. Đi sâu unpivot, Merge/Append, Group By, ngôn ngữ M & Advanced Editor, parameter, query folding, và so sánh với PivotTable/công thức. Thực hành gộp 12 file sao kê tháng và unpivot báo cáo cân đối cho ngân hàng.