Viết Phần Mềm Trên Excel: Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao

Mục lục bài viết

Mở Đầu: Tại Sao Excel Là Nền Tảng Lập Trình Phổ Biến?

Microsoft Excel không chỉ là một công cụ bảng tính thông thường mà còn là một môi trường lập trình mạnh mẽ, cho phép người dùng tự động hoá quy trình, tạo các ứng dụng nội bộ và giải quyết các bài toán phức tạp mà không cần phải đầu tư vào các hệ thống phần mềm đắt tiền. Nhờ vào Visual Basic for Applications (VBA), Power Query, Power Pivot, và Office Scripts (đối với Excel trên web), người dùng có thể:

  1. Tự động hoá công việc lặp đi lặp lại: ví dụ, nhập dữ liệu, tính toán, tạo báo cáo.
  2. Xây dựng giao diện người dùng (UserForm): cho phép người dùng nhập dữ liệu một cách thân thiện.
  3. Kết nối dữ liệu từ nhiều nguồn: SQL Server, Oracle, API web, file CSV, JSON, XML…
  4. Phân tích dữ liệu nâng cao: mô hình dữ liệu, DAX, Power Query M‑language.
  5. Triển khai giải pháp doanh nghiệp: hệ thống quản lý kho, CRM, dự toán chi phí,…

Bài viết dưới đây sẽ hướng dẫn chi tiết từng bước, từ việc chuẩn bị môi trường, học ngôn ngữ lập trình, thiết kế kiến trúc phần mềm, tới triển khai và bảo trì. Mục tiêu là giúp bạn – dù là người mới bắt đầu hay đã có kinh nghiệm – có thể tự tin “viết phần mềm trên Excel” để đáp ứng nhu cầu thực tiễn.

1. Chuẩn Bị Môi Trường Phát Triển

1.1. Cài Đặt Microsoft Excel

  • Phiên bản đề xuất: Excel 2026 trở lên (Office 365/ Microsoft 365) vì hỗ trợ đầy đủ VBA, Power Query, Power Pivot và Office Scripts.
  • Kiểm tra: Vào File → Account → About Excel để xác nhận phiên bản.
  • Bản quyền: Đối với doanh nghiệp, dùng bản Office 365 để luôn cập nhật tính năng mới.

1.2. Kích Hoạt Tab “Developer”

  1. Vào File → Options → Customize Ribbon.
  2. Trong danh sách bên phải, tick vào Developer và nhấn OK.
  3. Tab Developer hiện ra, chứa các công cụ: Visual Basic, Macro, Insert Form Controls, Add‑ins, v.v.

1.3. Cài Đặt Các Add‑in Hữu Ích

Add‑inCông dụngCách cài
Power Query (Get & Transform)Kết nối, làm sạch, biến đổi dữ liệuĐược tích hợp sẵn từ Excel 2026; nếu chưa, tải từ Microsoft Store.
Power PivotXây dựng mô hình dữ liệu, DAXVào File → Options → Add‑Ins → COM Add‑ins → Go → tick Power Pivot.
Analysis ToolPakCác hàm thống kê nâng caoFile → Options → Add‑Ins → Excel Add‑ins → Analysis ToolPak.
Office Scripts (Excel trên web)Viết script bằng TypeScriptMở Excel Online → Automate → New Script.

1.4. Thiết Lập Bảo Mật Macro

  • Macro Settings: File → Options → Trust Center → Trust Center Settings → Macro Settings.
  • Chọn “Enable all macros” và “Trust access to the VBA project object model” trong môi trường phát triển. Khi triển khai thực tế, hãy chuyển sang “Disable all macros with notification” để bảo mật.

2. Làm Quen Với VBA – Ngôn Ngữ Lập Trình Cốt Lõi Của Excel

2.1. Cấu Trúc Cơ Bản

Option Explicit Sub TenMacro() Dim i As Long For i = 1 To 10 Cells(i, 1).Value = "Dòng " & i Next i
End Sub
  • Option Explicit: Buộc khai báo biến, giúp giảm lỗi.
  • Sub: Định nghĩa một thủ tục (procedure) không trả về giá trị.
  • Function: Định nghĩa hàm trả về giá trị, có thể gọi từ ô Excel.

2.2. Các Kiểu Dữ Liệu Quan Trọng

KiểuMô tảVí dụ
IntegerSố nguyên (‑32,768 → 32,767)Dim n As Integer
LongSố nguyên lớn hơnDim n As Long
DoubleSố thực, độ chính xác caoDim d As Double
StringChuỗi ký tựDim txt As String
BooleanTrue/FalseDim flag As Boolean
VariantKiểu linh hoạt (mặc định)Dim v

2.3. Các Đối Tượng Quan Trọng

Đối tượngMô tảCú pháp thường dùng
ApplicationToàn bộ ExcelApplication.ScreenUpdating = False
WorkbookSổ làm việcThisWorkbook.Sheets("Sheet1")
WorksheetTrang tínhWorksheets(1).Range("A1")
RangeÔ hoặc vùng ôRange("A1:B10").Value
UserFormGiao diện người dùngUserForm1.Show

2.4. Xử Lý Lỗi (Error Handling)

Sub Example() On Error GoTo ErrHandler ' Code có thể gây lỗi Dim ws As Worksheet Set ws = Worksheets("Không tồn tại") Exit Sub
ErrHandler: MsgBox "Lỗi: " & Err.Description, vbCritical
End Sub
  • On Error Resume Next: Bỏ qua lỗi (không khuyến khích).
  • On Error GoTo -1: Reset trạng thái lỗi.

2.5. Ghi và Đọc File

Sub GhiFile() Dim fso As Object, txt As Object Set fso = CreateObject("Scripting.FileSystemObject") Set txt = fso.CreateTextFile("C:\temp\du_lieu.txt", True) txt.WriteLine "Dòng 1" txt.WriteLine "Dòng 2" txt.Close
End Sub Sub DocFile() Dim fso As Object, txt As Object, line As String Set fso = CreateObject("Scripting.FileSystemObject") Set txt = fso.OpenTextFile("C:\temp\du_lieu.txt") Do While Not txt.AtEndOfStream line = txt.ReadLine Debug.Print line Loop txt.Close
End Sub

3. Thiết Kế Kiến Trúc Ứng Dụng Trên Excel

3.1. Phân Tầng (Layered Architecture)

  1. Data Layer (Lớp dữ liệu)
  2. Nguồn: Sheet “Data”, Database, API.
  3. Truy xuất qua VBA, Power Query hoặc ODBC.

  4. Business Logic Layer (Lớp logic nghiệp vụ)

  5. Các hàm VBA thực hiện tính toán, kiểm tra, quy tắc nghiệp vụ.
  6. Đặt trong module riêng, ví dụ modBusiness.

  7. Presentation Layer (Lớp giao diện)

  8. Sheet hiển thị, UserForm, Control (Button, ComboBox).
  9. Giao tiếp với người dùng, gọi các hàm Business.

3.2. Quy Tắc Đặt Tên (Naming Conventions)

Thành phầnQuy tắcVí dụ
Modulemod + mô tảmodDataAccess
Functionfn + mô tảfnTinhTong
Subsub + mô tảsubXuatBaoCao
Variables (String), l (Long), d (Double)sTenKH, lSoLuong
UserFormfrm + mô tảfrmNhapDonHang
Control trên Formtxt (TextBox), cbo (ComboBox), cmd (CommandButton)txtMaKH

3.3. Tổ Chức File và Thư Mục

ProjectFolder/
│
├─ Workbook.xlsx ← File Excel chính
├─ Modules/
│ ├─ modDataAccess.bas
│ ├─ modBusiness.bas
│ └─ modUI.bas
├─ Forms/
│ ├─ frmNhapDonHang.frm
│ └─ frmBaoCao.frm
├─ ClassModules/
│ └─ clsKhachHang.cls
└─ Documentation/ └─ README.md
  • Export các module, form, class vào các file .bas, .frm, .cls để quản lý phiên bản (Git).

3.4. Version Control (Quản Lý Phiên Bản)

  • Export mã VBA ra file văn bản.
  • Sử dụng Git để commit, branch, merge.
  • Khi cần cập nhật workbook, Import lại các module đã sửa.

4. Xây Dựng Ứng Dụng Thực Tế: Ví Dụ “Quản Lý Đơn Hàng”

4.1. Yêu Cầu Chức Năng

  1. Nhập đơn hàng qua UserForm (Mã KH, Mã SP, Số lượng, Ngày).
  2. Kiểm tra tồn kho tự động (kết nối tới Sheet “Kho”).
  3. Tính tổng tiền (đơn giá × số lượng, áp dụng chiết khấu).
  4. Lưu dữ liệu vào Sheet “DonHang”.
  5. Xuất báo cáo tổng hợp theo ngày, khách hàng.
  6. Gửi email thông báo khi tồn kho dưới mức cảnh báo.

4.2. Thiết Kế Cơ Sở Dữ Liệu Trên Sheet

SheetCộtMô tả
KhoA: Mã SPMã sản phẩm
B: Tên SPTên sản phẩm
C: Đơn giáGiá bán
D: Số lượng tồnSố lượng hiện có
DonHangA: Mã ĐHTự động tăng
B: Mã KHKhách hàng
C: Mã SPSản phẩm
D: Số lượng
E: Đơn giáLấy từ “Kho”
F: Thành tiền=ED
G: NgàyNgày tạo

4.3. Tạo UserForm Nhập Đơn Hàng

  1. Mở VBA → Insert → UserForm → Đặt tên frmNhapDonHang.
  2. Thêm các control:
  3. Label + ComboBox cho Mã KH (cboMaKH).
  4. ComboBox cho Mã SP (cboMaSP).
  5. TextBox cho Số lượng (txtSoLuong).
  6. CommandButton Lưu (cmdLuu).
  7. CommandButton Hủy (cmdHuy).

  8. Khởi tạo dữ liệu ComboBox trong sự kiện UserForm_Initialize:

Private Sub UserForm_Initialize() Dim wsKH As Worksheet, lastRow As Long, i As Long Set wsKH = ThisWorkbook.Sheets("KhachHang") lastRow = wsKH.Cells(wsKH.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow cboMaKH.AddItem wsKH.Cells(i, "A").Value Next i Dim wsSP As Worksheet Set wsSP = ThisWorkbook.Sheets("Kho") lastRow = wsSP.Cells(wsSP.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow cboMaSP.AddItem wsSP.Cells(i, "A").Value Next i
End Sub

4.4. Xử Lý Lưu Đơn Hàng

Private Sub cmdLuu_Click() On Error GoTo ErrHandler Dim wsDon As Worksheet, wsKho As Worksheet Dim nextRow As Long, qty As Long, stock As Long, price As Double Set wsDon = ThisWorkbook.Sheets("DonHang") Set wsKho = ThisWorkbook.Sheets("Kho") ' Kiểm tra nhập liệu If cboMaKH.Value = "" Or cboMaSP.Value = "" Or txtSoLuong.Value = "" Then MsgBox "Vui lòng nhập đầy đủ thông tin.", vbExclamation Exit Sub End If qty = CLng(txtSoLuong.Value) ' Lấy tồn kho và đơn giá Dim rng As Range Set rng = wsKho.Range("A:A").Find(cboMaSP.Value, LookIn:=xlValues, LookAt:=xlWhole) If rng Is Nothing Then MsgBox "Mã sản phẩm không tồn tại.", vbCritical Exit Sub End If stock = rng.Offset(0, 3).Value ' cột D: số lượng tồn price = rng.Offset(0, 2).Value ' cột C: đơn giá If qty > stock Then MsgBox "Số lượng yêu cầu vượt quá tồn kho (" & stock & ").", vbExclamation Exit Sub End If ' Cập nhật bảng Đơn Hàng nextRow = wsDon.Cells(wsDon.Rows.Count, "A").End(xlUp).Row + 1 wsDon.Cells(nextRow, "A").Value = nextRow - 1 ' Mã ĐH tự động wsDon.Cells(nextRow, "B").Value = cboMaKH.Value wsDon.Cells(nextRow, "C").Value = cboMaSP.Value wsDon.Cells(nextRow, "D").Value = qty wsDon.Cells(nextRow, "E").Value = price wsDon.Cells(nextRow, "F").Formula = "=E" & nextRow & "D" & nextRow wsDon.Cells(nextRow, "G").Value = Date ' Cập nhật tồn kho rng.Offset(0, 3).Value = stock - qty MsgBox "Lưu đơn hàng thành công!", vbInformation Unload Me Exit Sub ErrHandler: MsgBox "Lỗi: " & Err.Description, vbCritical
End Sub

4.5. Tạo Macro Mở Form

Sub MoFormNhapDonHang() frmNhapDonHang.Show
End Sub
  • Gán macro này vào Button trên Sheet “Menu” hoặc Ribbon tùy ý.

4.6. Xuất Báo Cáo Tổng Hợp (PivotTable)

  1. Tạo PivotTable trong Sheet “BaoCao”.
  2. Dòng: Ngày (G), Mã KH (B).
  3. Giá trị: Tổng Thành Tiền (F).

Có thể tự động tạo Pivot qua VBA:

Sub TaoBaoCao() Dim wsSrc As Worksheet, wsDst As Worksheet Dim ptCache As PivotCache, pt As PivotTable Set wsSrc = ThisWorkbook.Sheets("DonHang") Set wsDst = ThisWorkbook.Sheets("BaoCao") wsDst.Cells.Clear Set ptCache = ThisWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:=wsSrc.Range("A1").CurrentRegion) Set pt = ptCache.CreatePivotTable( _ TableDestination:=wsDst.Range("A3"), _ TableName:="ptBaoCao") With pt .PivotFields("G").Orientation = xlRowField ' Ngày .PivotFields("B").Orientation = xlRowField ' Mã KH .PivotFields("F").Orientation = xlDataField ' Thành tiền .PivotFields("F").Function = xlSum End With MsgBox "Báo cáo đã được tạo.", vbInformation
End Sub

4.7. Gửi Email Thông Báo Khi Tồn Kho Thấp

Viết Phần Mềm Trên Excel
Viết Phần Mềm Trên Excel
Sub KiemTraTonKhoVaGuiMail() Dim ws As Worksheet, lastRow As Long, i As Long Dim lowStock As String Set ws = ThisWorkbook.Sheets("Kho") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row lowStock = "" For i = 2 To lastRow If ws.Cells(i, "D").Value < 10 Then lowStock = lowStock & ws.Cells(i, "A").Value & " - " & ws.Cells(i, "B").Value & vbCrLf End If Next i If lowStock <> "" Then Dim outlook As Object, mail As Object Set outlook = CreateObject("Outlook.Application") Set mail = outlook.CreateItem(0) With mail .To = "kho@example.com" .Subject = "Cảnh báo tồn kho thấp" .Body = "Các mặt hàng dưới mức tồn kho ( <10):" & vbCrLf & lowStock .Send End With MsgBox "Email cảnh báo đã được gửi.", vbInformation End If
End Sub
  • Đặt macro này vào Workbook_Open để kiểm tra mỗi khi mở file.
Private Sub Workbook_Open() Call KiemTraTonKhoVaGuiMail
End Sub

4.8. Kiểm Thử (Testing)

  • Unit Test: Viết các hàm kiểm tra tính đúng đắn, ví dụ fnTestTinhTong.
  • Integration Test: Kiểm tra quy trình nhập → lưu → báo cáo.
  • Error Cases: Nhập số lượng âm, mã SP không tồn tại, email không có Outlook.

5. Tối Ưu Hóa Hiệu Năng và Bảo Mật

5.1. Tối Ưu Mã VBA

Thực hànhLý do
Tắt ScreenUpdatingApplication.ScreenUpdating = False giảm thời gian vẽ lại.
Tắt CalculationApplication.Calculation = xlCalculationManual tránh tính lại mỗi lần thay đổi.
Sử dụng Variant ArrayĐọc/ghi dữ liệu một lần thay vì vòng lặp ô.
Avoid Select/ActivateTruy cập trực tiếp đối tượng, giảm overhead.
Early Binding (đối với Outlook, ADODB)Nhanh hơn và có IntelliSense.

5.2. Bảo Mật Mã VBA

  • Mật khẩu bảo vệ project: Tools → VBAProject Properties → Protection.
  • Ẩn sheet dữ liệu: ws.Visible = xlSheetVeryHidden.
  • Sử dụng quyền truy cập file: FileSystemObject để kiểm soát read/write.

5.3. Triển Khai Đa Người Dùng

  • Shared Workbook (Excel 2026 trở xuống) -> không khuyến khích vì xung đột.
  • Excel Online + Office Scripts: cho phép nhiều người cùng chỉnh sửa, script chạy trên server.
  • Power Automate: tự động hoá workflow (gửi mail, sao lưu file) mà không cần VBA.

6. Power Query – Kết Nối & Làm Sạch Dữ Liệu Không Cần VBA

6.1. Nhập Dữ Liệu Từ Nguồn Bên Ngoài

  1. Data → Get Data → From Database → From SQL Server Database.
  2. Nhập server, database, chọn bảng, tùy chỉnh truy vấn trong Power Query Editor.

6.2. Biến Đổi Dữ Liệu (M‑Language)

  • Thêm cột tùy chỉnh:
= Table.AddColumn(PreviousStep, "Thành Tiền", each ĐơnGiá SốLượng)
  • Ghép bảng (Merge Queries): nối “DonHang” với “Kho” để lấy đơn giá.

6.3. Tự Động Làm Mới Dữ Liệu

  • Data → Queries & Connections → Properties → Refresh every X minutes.

Power Query giảm nhu cầu viết VBA cho các tác vụ ETL (Extract‑Transform‑Load) và giúp duy trì kế thừa (reusability) của mô hình dữ liệu.

7. Power Pivot & DAX – Phân Tích Dữ Liệu Nâng Cao

7.1. Tạo Mô Hình Dữ Liệu

  • Add to Data Model khi import dữ liệu (checkbox “Add this data to the Data Model”).
  • Định nghĩa Relationships giữa bảng “DonHang”, “Kho”, “KhachHang”.

7.2. Công Thức DAX Cơ Bản

Công thứcMô tả
CALCULATE(SUM(Thành Tiền), YEAR(Ngày) = 2026)Tổng tiền năm 2026
DISTINCTCOUNT(Mã KH)Số khách hàng duy nhất
FILTER(ALL('DonHang'), 'DonHang'Số lượng > 100)Đơn hàng > 100

7.3. PivotTable DAX

  • Chọn PivotTable → Use this workbook’s Data Model.
  • Kéo các measure DAX vào khu vực Values để có báo cáo tương tác.

8. Office Scripts – Lập Trình Trên Excel Web (TypeScript)

8.1. Khi Nào Dùng Office Scripts?

  • Khi dự án cần đồng bộ trên cloud, người dùng làm việc trên Excel Online.
  • Khi muốn tích hợp với Power Automate để tự động hoá quy trình doanh nghiệp.

8.2. Ví Dụ Script Đơn Giản

function main(workbook: ExcelScript.Workbook) { // Lấy bảng "DonHang" let sheet = workbook.getWorksheet("DonHang"); let table = sheet.getTable("tblDonHang"); // Thêm cột "Thành Tiền" table.addColumn(-1, {name: "Thành Tiền", formula: "=@ĐơnGiá@SốLượng"}); // Lọc các đơn hàng > 1000 let rows = table.getRows(); rows.forEach(row => { let total = row.getRange().getCell(0,5).getValue() as number; // cột F if (total > 1000) { row.getRange().getFormat().getFill().setColor("#FFF2CC"); } });
}
  • Lưu script, đặt tên, có thể run trực tiếp hoặc gọi từ Power Automate.

9. Triển Khai và Bảo Trì

9.1. Đóng Gói (Packaging)

  • File Excel (.xlsm): chứa macro, UserForm.
  • File Add‑in (.xlam): nếu muốn chia sẻ chức năng mà không cho người dùng sửa code.
  • Documentación: hướng dẫn người dùng (README, video hướng dẫn).

9.2. Quy Trình Bảo Trì

Giai đoạnHoạt động
ReleaseKiểm tra version, ghi log thay đổi, sao lưu file gốc.
SupportThu thập feedback, ghi nhận bug, tạo ticket.
UpdateSửa lỗi, cải tiến tính năng, cập nhật tài liệu.
BackupLưu trữ workbook và các module trên SharePoint/OneDrive.

9.3. Kiểm Soát Phiên Bản

git init
git add .
git commit -m "Initial commit - core modules"
git tag v1.0.0
  • Khi xuất bản, export các module thành .bas và commit lên repository.

10. Các Lưu Ý Cuối Cùng Khi Viết Phần Mềm Trên Excel

  1. Không lạm dụng VBA cho các tác vụ quy mô lớn: Khi dữ liệu > 100.000 dòng, Excel sẽ chậm; nên cân nhắc chuyển sang Power BI, Access, hoặc SQL.
  2. Luôn tách dữ liệu và logic: Đừng để công thức và macro phụ thuộc vào vị trí cố định của ô.
  3. Kiểm tra môi trường người dùng: Phiên bản Excel, quyền macro, Outlook có sẵn hay không.
  4. Ghi chú (Comment) đầy đủ: Giúp người khác (và chính bạn trong tương lai) hiểu nhanh.
  5. Kiểm thử tự động: Dùng Rubberduck VBA (add‑in) để thực hiện unit test và static analysis.
  6. Tuân thủ quy định bảo mật dữ liệu: Đặc biệt khi xử lý thông tin cá nhân (GDPR, CCPA). Mã hoá file, hạn chế gửi dữ liệu qua email không mã hoá.

Kết Luận

Viết phần mềm trên Excel không chỉ là việc viết một vài macro đơn giản, mà là một quy trình toàn diện từ phân tích yêu cầu, thiết kế kiến trúc, lập trình VBA/Power Query/Power Pivot/Office Scripts, tới triển khai, bảo trì và đảm bảo bảo mật. Nhờ vào tính linh hoạt và khả năng tích hợp sâu với các công nghệ Microsoft khác, Excel trở thành nền tảng “low‑code” mạnh mẽ, phù hợp cho các doanh nghiệp vừa và nhỏ muốn nhanh chóng đưa giải pháp vào hoạt động mà không cần đầu tư hạ tầng công nghệ phức tạp.

Bằng cách nắm vững các kiến thức và kỹ thuật được trình bày ở trên, bạn có thể:

  • Tự động hoá quy trình kinh doanh, giảm thiểu lỗi nhập liệu.
  • Xây dựng các ứng dụng nội bộ (quản lý kho, bán hàng, dự toán, báo cáo tài chính) chỉ trong môi trường Excel quen thuộc.
  • Mở rộng sang Power Query và Power Pivot để xử lý dữ liệu lớn và phân tích chuyên sâu.
  • Đưa các workflow lên cloud bằng Office Scripts và Power Automate, tạo môi trường làm việc cộng tác và linh hoạt.

Hãy bắt đầu với một dự án nhỏ, áp dụng các nguyên tắc thiết kế và kiểm thử, sau đó dần mở rộng quy mô. Khi bạn đã thành thạo, Excel sẽ trở thành “công cụ lập trình” đa năng, giúp doanh nghiệp của bạn di chuyển nhanh hơn, thông minh hơn và tiết kiệm chi phí đáng kể. Chúc bạn thành công trong hành trình viết phần mềm trên Excel!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận