Excel không chỉ là một công cụ tính toán đơn thuần 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á các tác vụ lặp lại, xử lý dữ liệu phức tạp và tạo ra các giải pháp kinh doanh tùy chỉnh. Trong Excel, “các mã lệnh” thường được hiểu là Macro (được viết bằng ngôn ngữ VBA – Visual Basic for Applications) và định dạng công thức (công thức Excel, hàm, và các hàm người dùng định nghĩa – UDF). Bài viết này sẽ cung cấp một hướng dẫn chi tiết, từ những khái niệm cơ bản, cách tạo và chạy macro, cho tới các kỹ thuật lập trình nâng cao, giúp bạn khai thác tối đa sức mạnh của các mã lệnh trong Excel.
Có thể bạn quan tâm: Các Hàm Excel Hay Dùng: Từ Cơ Bản Đến Nâng Cao Để Tối Ưu Công Việc
1. Giới Thiệu Tổng Quan Về VBA và Macro Trong Excel
1.1. VBA là gì?
- Visual Basic for Applications (VBA) là một ngôn ngữ lập trình được tích hợp sẵn trong các ứng dụng Microsoft Office (Excel, Word, PowerPoint, Access…).
- VBA cho phép người dùng tự động hoá các thao tác, tương tác với các đối tượng (Workbook, Worksheet, Range, Chart…) và tạo ra các giao diện người dùng (UserForm, Control).
1.2. Macro là gì?
- Macro là một tập hợp các lệnh VBA được ghi lại hoặc viết tay, có thể thực thi một chuỗi hành động một cách tự động.
- Macro thường được lưu trong Module (một loại đối tượng trong VBA Project) và có thể được gán cho nút, hình ảnh, phím tắt để dễ dàng kích hoạt.
1.3. Lợi ích khi sử dụng macro
| Lợi ích | Mô tả |
|---|---|
| Tiết kiệm thời gian | Tự động hoá các tác vụ lặp đi lặp lại (nhập dữ liệu, định dạng, tính toán) |
| Độ chính xác cao | Giảm thiểu lỗi do nhập liệu thủ công |
| Tùy biến quy trình | Tạo quy trình làm việc chuẩn hoá cho toàn bộ tổ chức |
| Tích hợp dữ liệu | Kết nối và trích xuất dữ liệu từ các nguồn khác (SQL, Web, API) |
| Tạo giao diện người dùng | Thiết kế form nhập liệu, báo cáo tùy chỉnh |
Có thể bạn quan tâm: Các Công Thức Excel Cơ Bản: Hướng Dẫn Toàn Diện Cho Người Mới Bắt Đầu
2. Cài Đặt và Chuẩn Bị Môi Trường Lập Trình
2.1. Bật tab “Developer”
- Vào File → Options → Customize Ribbon.
- Trong danh sách “Main Tabs”, đánh dấu Developer và nhấn OK.
2.2. Mở cửa sổ VBA Editor
- Nhấn Alt + F11 hoặc chọn Developer → Visual Basic.
2.3. Tạo một workbook mới với macro
- File → New → Blank workbook.
- Lưu file dưới định dạng Excel Macro-Enabled Workbook (.xlsm) để macro có thể chạy.
2.4. Bảo mật macro
- Vào File → Options → Trust Center → Trust Center Settings → Macro Settings.
- Chọn “Enable all macros” (chỉ trong môi trường thử nghiệm) hoặc “Disable all macros with notification” để được nhắc khi mở file có macro.
Có thể bạn quan tâm: Hướng Dẫn Chi Tiết Cài Đặt Microsoft Word Và Excel Trên Các Hệ Điều Hành Phổ Biến
3. Cấu Trúc Cơ Bản Của Một Macro VBA
Sub TenMacro() ' Khai báo biến Dim ws As Worksheet Dim rng As Range ' Gán đối tượng Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' Chọn vùng dữ liệu Set rng = ws.Range("A2:A10") ' Thực hiện một hành động (ví dụ: thay đổi màu nền) rng.Interior.Color = RGB(255, 255, 0) ' Màu vàng ' Thông báo hoàn thành MsgBox "Đã tô màu vàng cho vùng A2:A10!", vbInformation
End Sub
- Sub: Định nghĩa một thủ tục (procedure) không trả về giá trị.
- Function: Định nghĩa một hàm trả về giá trị, có thể dùng trong công thức Excel.
- Dim: Khai báo biến.
- Set: Gán đối tượng cho biến.
- ThisWorkbook: Workbook chứa macro hiện tại.
- MsgBox: Hiển thị hộp thoại thông báo.
4. Các Lệnh Cơ Bản Thường Dùng
| Nhóm lệnh | Mô tả | Ví dụ |
|---|---|---|
| Quản lý Workbook/Worksheet | Mở, lưu, đóng, tạo sheet | Workbooks.Open "C:\Data.xlsx" |
| Xử lý Range | Đọc/ghi giá trị, định dạng, sao chép | Range("B2").Value = 100 |
| Vòng lặp | For…Next, Do…Loop, While | For i = 1 To 10: Cells(i,1).Value = i: Next i |
| Điều kiện | If…Then…Else, Select Case | If Cells(1,1).Value > 0 Then … |
| Sự kiện | Worksheet_Change, Workbook_Open | Private Sub Worksheet_Change(ByVal Target As Range) |
| Làm việc với File | FileSystemObject, Dir, Kill | Kill "C:\Temp\oldfile.txt" |
| Tương tác với người dùng | InputBox, MsgBox, UserForm | InputBox("Nhập tên:", "Tên") |
| Kết nối dữ liệu | ADODB, DAO, QueryTables | Set cn = New ADODB.Connection |
5. Ghi Lại Macro (Macro Recorder)
5.1. Cách ghi macro
- Developer → Record Macro.
- Đặt tên (không có dấu cách) và chọn Store macro in: This Workbook.
- Thực hiện các thao tác trên sheet (định dạng, sao chép, tính toán…).
- Nhấn Stop Recording.
5.2. Phân tích mã đã ghi
Sau khi dừng ghi, mở VBA Editor để xem mã. Thông thường, macro ghi lại sẽ chứa rất nhiều Select/Selection không cần thiết, có thể tối ưu hoá:
' Mã ghi lại
Range("A1").Select
Selection.Font.Bold = True ' Tối ưu
Range("A1").Font.Bold = True
5.3. Khi nào nên viết tay thay vì ghi
- Khi cần điều kiện logic, vòng lặp, xử lý lỗi.
- Khi muốn tối ưu hiệu năng (tránh sử dụng Select/Activate).
- Khi tạo hàm người dùng định nghĩa (UDF) để dùng trong công thức.
6. Viết Hàm Người Dùng Định Nghĩa (UDF)
UDF cho phép bạn tạo các hàm tùy chỉnh, có thể gọi trực tiếp trong ô Excel như hàm chuẩn.
6.1. Cú pháp cơ bản
Function TenHam(ByVal ThamSo1 As Double, Optional ThamSo2 As Double = 0) As Double TenHam = ThamSo1 + ThamSo2
End Function
- Function trả về giá trị.
- Optional cho phép tham số không bắt buộc, có giá trị mặc định.
6.2. Ví dụ thực tế: Hàm tính trung bình có trọng số
Function TrungBinhTrongSo(ValRange As Range, WeightRange As Range) As Double Dim i As Long, SumVal As Double, SumWeight As Double If ValRange.Count <> WeightRange.Count Then TrungBinhTrongSo = CVErr(xlErrRef) ' Trả lỗi nếu kích thước không khớp Exit Function End If For i = 1 To ValRange.Count SumVal = SumVal + ValRange.Cells(i).Value WeightRange.Cells(i).Value SumWeight = SumWeight + WeightRange.Cells(i).Value Next i If SumWeight = 0 Then TrungBinhTrongSo = CVErr(xlErrDiv0) Else TrungBinhTrongSo = SumVal / SumWeight End If
End Function
- Sử dụng trong Excel:
=TrungBinhTrongSo(A2:A10, B2:B10)
7. Xây Dựng Giao Diện Người Dùng (UserForm)
7.1. Tạo UserForm
- Trong VBA Editor, Insert → UserForm.
- Thêm các Control: TextBox, ComboBox, ListBox, CommandButton.
7.2. Mã ví dụ: Form nhập dữ liệu khách hàng

Có thể bạn quan tâm: Các Kỹ Năng Trong Excel: Từ Cơ Bản Đến Nâng Cao Để Tối Ưu Hoá Công Việc
Private Sub btnLuu_Click() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("KhachHang") Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 ws.Cells(lastRow, 1).Value = txtMaKH.Text ws.Cells(lastRow, 2).Value = txtTenKH.Text ws.Cells(lastRow, 3).Value = txtSDT.Text ws.Cells(lastRow, 4).Value = txtDiaChi.Text MsgBox "Đã lưu thông tin khách hàng!", vbInformation Me.Hide
End Sub Private Sub UserForm_Initialize() txtMaKH.Text = "" txtTenKH.Text = "" txtSDT.Text = "" txtDiaChi.Text = ""
End Sub
- Gán macro
ShowFormđể mở form:
Sub ShowForm() UserForm1.Show
End Sub
7.3. Lưu ý khi dùng UserForm
- Không để tên control trùng với từ khóa VBA (ví dụ:
Name). - Giải phóng bộ nhớ:
Unload Mesau khi đóng. - Xử lý lỗi nhập: kiểm tra dữ liệu trước khi ghi vào sheet.
8. Xử Lý Lỗi (Error Handling)
8.1. Cấu trúc On Error
Sub DemoError() On Error GoTo ErrHandler Dim x As Double x = 1 / 0 ' Gây lỗi chia cho 0 Exit Sub ErrHandler: MsgBox "Đã xảy ra lỗi: " & Err.Description, vbCritical Resume Next ' Tiếp tục thực thi dòng tiếp theo
End Sub
8.2. Các phương pháp xử lý
| Phương pháp | Mô tả |
|---|---|
On Error Resume Next | Bỏ qua lỗi và tiếp tục. Thường dùng khi kiểm tra tồn tại file, sheet… |
On Error GoTo -1 | Đặt lại trạng thái lỗi. |
Err.Clear | Xóa thông tin lỗi hiện tại. |
Err.Raise | Tự tạo lỗi tùy chỉnh. |
8.3. Ghi log lỗi
Sub WriteLog(ByVal Msg As String) Dim logWs As Worksheet Set logWs = ThisWorkbook.Sheets("Log") Dim nextRow As Long nextRow = logWs.Cells(logWs.Rows.Count, "A").End(xlUp).Row + 1 logWs.Cells(nextRow, 1).Value = Now logWs.Cells(nextRow, 2).Value = Msg
End Sub
Sử dụng trong ErrHandler:
ErrHandler: WriteLog "Lỗi tại " & Err.Source & ": " & Err.Description MsgBox "Đã ghi lại lỗi vào sheet Log.", vbExclamation Resume Next
9. Kết Nối Dữ Liệu Ngoại Vi (External Data)
9.1. Kết nối SQL Server bằng ADODB
Sub GetDataFromSQL() Dim cn As Object, rs As Object Dim sql As String Dim ws As Worksheet Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.ConnectionString = "Provider=SQLOLEDB;Data Source=SERVERNAME;Initial Catalog=DBNAME;Integrated Security=SSPI;" cn.Open sql = "SELECT MaKH, TenKH, DiaChi FROM KhachHang WHERE TrangThai = 1" rs.Open sql, cn, 1, 3 Set ws = ThisWorkbook.Sheets("Data") ws.Range("A2").CopyFromRecordset rs rs.Close: cn.Close Set rs = Nothing: Set cn = Nothing MsgBox "Lấy dữ liệu thành công!", vbInformation
End Sub
9.2. Đọc file CSV
Sub ImportCSV() Dim filePath As String filePath = Application.GetOpenFilename("CSV Files (.csv),.csv") If filePath = "False" Then Exit Sub With ThisWorkbook.Sheets("CSVData").QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=Range("$A$1")) .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .Refresh BackgroundQuery:=False End With
End Sub
10. Tối Ưu Hiệu Năng Khi Viết Macro
| Kỹ thuật | Lý do |
|---|---|
Tránh dùng .Select và .Activate | Giảm số lần chuyển đổi ngữ cảnh, tăng tốc độ. |
| Sử dụng mảng (Array) để đọc/ghi dữ liệu | Đọc toàn bộ vùng vào mảng, xử lý trong RAM, sau đó ghi lại một lần. |
| Tắt tính năng tính toán tự động | Application.Calculation = xlCalculationManual tránh tính lại mỗi khi thay đổi ô. |
| Tắt ScreenUpdating | Application.ScreenUpdating = False ngăn Excel vẽ lại màn hình trong quá trình chạy macro. |
| Tắt Events | Application.EnableEvents = False tránh chạy các sự kiện phụ khi thay đổi dữ liệu. |
| Sử dụng With…End With | Giảm số lần tham chiếu đối tượng, làm code ngắn gọn. |
10.1. Ví dụ tối ưu đọc/ghi dữ liệu
Sub FastCopy() Dim src As Variant Dim wsSrc As Worksheet, wsDst As Worksheet Set wsSrc = ThisWorkbook.Sheets("Source") Set wsDst = ThisWorkbook.Sheets("Dest") Application.ScreenUpdating = False Application.Calculation = xlCalculationManual src = wsSrc.Range("A1:D10000").Value ' Đọc vào mảng wsDst.Range("A1").Resize(UBound(src, 1), UBound(src, 2)).Value = src ' Ghi lại Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True
End Sub
11. Bảo Mật Macro và Triển Khai
11.1. Mã hoá (Password Protect) VBA Project
- Trong VBA Editor, Tools → VBAProject Properties → Protection.
- Đánh dấu Lock project for viewing, nhập mật khẩu và xác nhận.
11.2. Chuyển đổi macro sang Add‑in (.xlam)
- Tạo file Excel Add‑in để chia sẻ macro giữa nhiều workbook.
- Lưu file dưới định dạng Excel Add‑in (.xlam), sau đó File → Options → Add‑Ins → Excel Add‑ins → Browse để tải.
11.3. Sử dụng Digital Signature để tránh cảnh báo
- Mua hoặc tạo Self‑signed certificate (Tools → Digital Signature).
- Ký macro bằng chứng thực để người dùng tin tưởng hơn khi mở file.
12. Thực Hành: Dự Án Mini – Tự Động Hóa Báo Cáo Doanh Thu Hàng Tháng
12.1. Yêu cầu
- Thu thập dữ liệu bán hàng từ các sheet “Jan”, “Feb”, … “Dec”.
- Tính tổng doanh thu, số lượng đơn hàng, trung bình giá bán.
- Tạo sheet “Báo cáo” với bảng tổng hợp và biểu đồ cột.
12.2. Các bước thực hiện
- Chuẩn bị dữ liệu: Mỗi sheet tháng có cột
Ngày,Mã SP,Số lượng,Đơn giá. - Viết macro tổng hợp:
Sub TongHopDoanhThu() Dim wsRpt As Worksheet, ws As Worksheet Dim months As Variant, i As Long, lastRow As Long Dim totalQty As Long, totalRev As Double Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsRpt = ThisWorkbook.Sheets("BaoCao") wsRpt.Cells.Clear months = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", _ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") wsRpt.Range("A1:D1").Value = Array("Tháng", "Số lượng", "Doanh thu", "Trung bình/đơn") For i = LBound(months) To UBound(months) Set ws = ThisWorkbook.Sheets(months(i)) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row totalQty = Application.WorksheetFunction.Sum(ws.Range("C2:C" & lastRow)) totalRev = Application.WorksheetFunction.SumProduct(ws.Range("C2:C" & lastRow), ws.Range("D2:D" & lastRow)) wsRpt.Cells(i + 2, 1).Value = months(i) wsRpt.Cells(i + 2, 2).Value = totalQty wsRpt.Cells(i + 2, 3).Value = totalRev wsRpt.Cells(i + 2, 4).Value = IIf(totalQty = 0, 0, totalRev / totalQty) Next i ' Tạo biểu đồ Dim cht As ChartObject Set cht = wsRpt.ChartObjects.Add(Left:=300, Top:=20, Width:=500, Height:=300) With cht.Chart .SetSourceData Source:=wsRpt.Range("A1:C13") .ChartType = xlColumnClustered .HasTitle = True .ChartTitle.Text = "Doanh thu theo tháng" End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox "Báo cáo đã hoàn thành!", vbInformation
End Sub
- Gán macro vào nút trên sheet “Dashboard” để người dùng chỉ cần click.
12.3. Mở rộng
- Thêm UserForm cho phép người dùng chọn năm, khu vực.
- Kết nối SQL để lấy dữ liệu trực tiếp từ hệ thống ERP.
- Gửi báo cáo qua email tự động (sử dụng Outlook Object Model).
13. Các Tài Nguyên Học Tập Và Cộng Đồng
| Nguồn | Mô tả |
|---|---|
| Microsoft Docs – VBA Reference | Tài liệu chính thức, đầy đủ các đối tượng, phương thức, thuộc tính. |
| Excel Macro Mastery (Chandoo.org) | Blog, video hướng dẫn từ cơ bản tới nâng cao. |
| Stack Overflow | Cộng đồng lập trình viên, giải đáp các vấn đề cụ thể. |
| MrExcel Forum | Diễn đàn chuyên về Excel, nhiều ví dụ thực tế. |
| YouTube – Leila Gharani | Kênh video giảng dạy VBA ngắn gọn, thực hành ngay. |
| Udemy / Coursera | Khóa học chi tiết, có bài tập thực hành. |
14. Kết Luận
Các mã lệnh trong Excel – từ macro đơn giản, hàm người dùng định nghĩa, cho tới các ứng dụng phức tạp như kết nối cơ sở dữ liệu hay xây dựng giao diện người dùng – đều mang lại giá trị to lớn cho việc tự động hoá, tối ưu hoá quy trình, và nâng cao năng suất làm việc.
Để thành thạo VBA, bạn cần:
- Hiểu rõ cấu trúc đối tượng của Excel (Workbook, Worksheet, Range, Chart…).
- Thực hành viết code thay vì chỉ dựa vào ghi macro.
- Áp dụng các nguyên tắc tối ưu (tránh Select, dùng mảng, tắt ScreenUpdating).
- Xây dựng hệ thống xử lý lỗi và log để bảo trì dễ dàng.
- Bảo mật và triển khai dưới dạng Add‑in hoặc ký số để chia sẻ nội bộ.
Bằng cách nắm vững các kiến thức và kỹ thuật trên, bạn sẽ biến Excel thành một công cụ mạnh mẽ, phù hợp cho mọi nhu cầu kinh doanh – từ quản lý dữ liệu đơn giản cho tới phát triển các giải pháp doanh nghiệp phức tạp. Hãy bắt đầu viết macro hôm nay và khám phá tiềm năng vô hạn của Excel!

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
