Có thể bạn quan tâm: Excel Phiên Bản Mới Nhất: Tất Cả Những Gì Bạn Cần Biết Về Tính Năng, Cải Tiến Và Cách Tận Dụng Tối Đa Công Cụ Bảng Tính Hàng Đầu
Giới thiệu chung
Trong môi trường kinh doanh hiện đại, dữ liệu là nguồn tài nguyên quan trọng quyết định sự thành công của doanh nghiệp. Microsoft Excel, với khả năng xử lý bảng tính mạnh mẽ, đã trở thành công cụ không thể thiếu trong việc thu thập, phân tích và trình bày dữ liệu. Tuy nhiên, khi khối lượng dữ liệu ngày càng tăng và yêu cầu tự động hoá các quy trình trở nên phức tạp hơn, việc chỉ dựa vào các chức năng cơ bản của Excel sẽ không còn đủ. Đây là lúc VBA (Visual Basic for Applications) xuất hiện như một “cây đũa thần” giúp người dùng mở rộng khả năng của Excel, tạo ra các giải pháp tùy chỉnh, tự động hoá và tối ưu hoá quy trình làm việc.
Bài viết này sẽ cung cấp cho bạn một cái nhìn toàn diện về Excel Power Programming with VBA, từ những kiến thức nền tảng, cách viết macro đơn giản, đến các kỹ thuật nâng cao như tạo form người dùng, làm việc với API, và triển khai giải pháp doanh nghiệp thực tế. Hãy cùng khám phá cách biến Excel thành một nền tảng lập trình mạnh mẽ, giúp bạn tiết kiệm thời gian, giảm lỗi và nâng cao hiệu suất công việc.
Có thể bạn quan tâm: Free Word Excel Password Recovery Wizard: Hướng Dẫn Chi Tiết Để Khôi Phục Mật Khẩu Tài Liệu Word Và Excel Miễn Phí
1. VBA là gì? Lý do nên học VBA trong Excel
1.1. Định nghĩa VBA
VBA (Visual Basic for Applications) 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, bao gồm Excel, Word, PowerPoint và Access. VBA cho phép người dùng viết macro – các đoạn mã tự động thực hiện các thao tác lặp đi lặp lại hoặc phức tạp trong môi trường Office.
1.2. Lợi ích khi sử dụng VBA trong Excel
| Lợi ích | Mô tả |
|---|---|
| Tự động hoá | Thực hiện các thao tác lặp đi lặp lại (nhập liệu, định dạng, tính toán) chỉ bằng một cú click. |
| Tiết kiệm thời gian | Giảm thời gian xử lý dữ liệu từ giờ sang phút, thậm chí giây. |
| Giảm lỗi thủ công | Loại bỏ những sai sót do nhập liệu hoặc thao tác người dùng. |
| Mở rộng tính năng | Tạo các chức năng tùy chỉnh, giao diện người dùng (UserForm), kết nối dữ liệu ngoài (API, CSDL). |
| Tích hợp hệ thống | Giao tiếp với các ứng dụng Office khác, Outlook, PowerPoint, thậm chí các phần mềm bên thứ ba. |
| Bảo mật | Kiểm soát quyền truy cập, mã hoá dữ liệu và tạo các quy trình kiểm duyệt tự động. |
1.3. Khi nào nên dùng VBA?
- Xử lý dữ liệu lớn: Khi công việc yêu cầu lọc, tổng hợp, hoặc chuyển đổi dữ liệu trên hàng nghìn dòng.
- Báo cáo định kỳ: Tự động tạo báo cáo hàng ngày/tuần/tháng mà không cần can thiệp thủ công.
- Tích hợp hệ thống: Khi cần lấy dữ liệu từ hệ thống ERP, CRM, hoặc gửi email tự động.
- Tùy biến giao diện: Khi muốn tạo form nhập liệu, dashboard tương tác trong Excel.
- Kiểm soát quy trình: Khi cần áp dụng các quy tắc nghiệp vụ, validation dữ liệu.
Có thể bạn quan tâm: Excel Nâng Cao Pivot Table: Bí Quyết Tối Ưu Hóa Phân Tích Dữ Liệu
2. Cài đặt môi trường và chuẩn bị
2.1. Kích hoạt tab “Developer”
- Mở Excel →
File→Options. - Chọn
Customize Ribbon. - Đánh dấu vào mục
Developervà nhấnOK.
2.2. Giới thiệu về cửa sổ VBA Editor (VBE)
- Project Explorer: Hiển thị cấu trúc workbook, sheet, module, userform.
- Properties Window: Thay đổi thuộc tính của đối tượng đang chọn.
- Code Window: Nơi viết và chỉnh sửa mã VBA.
- Immediate Window: Thực thi lệnh nhanh, kiểm tra giá trị biến.
2.3. Các loại module
| Loại | Mô tả |
|---|---|
| Standard Module | Chứa các procedure, function có thể gọi từ bất kỳ workbook nào. |
| Class Module | Định nghĩa đối tượng tùy chỉnh, hỗ trợ lập trình hướng đối tượng. |
| UserForm | Tạo giao diện người dùng (form) với các control (textbox, combobox, button…). |
| Worksheet/Workbook Module | Đặt mã xử lý sự kiện (event) như Worksheet_Change, Workbook_Open. |
3. Các khái niệm cơ bản trong VBA
3.1. Biến và kiểu dữ liệu
Dim i As Integer 'Số nguyên
Dim d As Double 'Số thực
Dim s As String 'Chuỗi ký tự
Dim b As Boolean 'True/False
Dim dt As Date 'Ngày tháng
Dim rng As Range 'Đối tượng Range
Dim ws As Worksheet 'Đối tượng Worksheet
- Option Explicit: Bắt buộc khai báo biến, giảm lỗi typo.
3.2. Cấu trúc điều khiển
| Cấu trúc | Ví dụ |
|---|---|
| If…Then…Else | If x > 10 Then MsgBox "Lớn hơn 10" Else MsgBox "Nhỏ hơn hoặc bằng 10" End If |
| Select Case | Select Case month(dt) Case 1: ... Case Else: ... End Select |
| For…Next | For i = 1 To 10: Cells(i,1).Value = i: Next i |
| Do While/Until | Do While i <= 100: i = i + 1: Loop |
| For Each…Next | For Each c In rng: c.Value = c.Value 2: Next c |
3.3. Hàm và Procedure
Sub (procedure không trả về giá trị)
vba Sub HelloWorld() MsgBox "Xin chào VBA!" End SubFunction (trả về giá trị)
vba Function AddNumbers(a As Double, b As Double) As Double AddNumbers = a + b End Function
3.4. Xử lý lỗi (Error Handling)
On Error GoTo ErrHandler
'--- Code
Exit Sub
ErrHandler: MsgBox "Lỗi: " & Err.Description, vbCritical Resume Next
End Sub
4. Tạo macro tự động hoá công việc thường gặp
4.1. Ví dụ 1: Xóa các hàng trống trong một bảng
Sub DeleteEmptyRows() Dim ws As Worksheet, rng As Range, lastRow As Long, i As Long Set ws = ThisWorkbook.Sheets("Data") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = lastRow To 1 Step -1 If Application.WorksheetFunction.CountA(ws.Rows(i)) = 0 Then ws.Rows(i).Delete End If Next i
End Sub
4.2. Ví dụ 2: Tự động tạo báo cáo tuần
Sub WeeklyReport() Dim src As Worksheet, dst As Worksheet, curWeek As Long Set src = ThisWorkbook.Sheets("RawData") Set dst = ThisWorkbook.Sheets("Report") curWeek = Application.WorksheetFunction.WeekNum(Date, vbMonday) dst.Cells.Clear src.Rows(1).Copy Destination:=dst.Rows(1) 'Tiêu đề src.AutoFilterMode = False src.Range("A1").AutoFilter Field:=3, Criteria1:=curWeek 'Giả sử cột C là tuần src.Range("A2").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Destination:=dst.Cells(2, 1) src.AutoFilterMode = False MsgBox "Báo cáo tuần " & curWeek & " đã được tạo."
End Sub
4.3. Ví dụ 3: Gửi email tự động qua Outlook
Sub SendMail() Dim OutlookApp As Object, MailItem As Object Dim rng As Range, bodyText As String Set OutlookApp = CreateObject("Outlook.Application") Set MailItem = OutlookApp.CreateItem(0) '0 = olMailItem Set rng = ThisWorkbook.Sheets("Report").Range("A1:D10") bodyText = "Kính gửi, " & vbCrLf & vbCrLf & _ "Vui lòng xem báo cáo đính kèm." & vbCrLf & vbCrLf & _ "Trân trọng," & vbCrLf & "Tên bạn" With MailItem .To = "example@domain.com" .Subject = "Báo cáo tuần " & Format(Date, "ww") .Body = bodyText .Attachments.Add rng.ExportAsFixedFormat(Type:=xlTypePDF, _ Filename:=Environ("TEMP") & "\Report.pdf") .Display 'hoặc .Send để gửi ngay End With Set MailItem = Nothing Set OutlookApp = Nothing
End Sub
5. Tạo UserForm cho giao diện nhập liệu
5.1. Thiết kế form
- Trong VBE,
Insert→UserForm. - Thêm các control: Label, TextBox, ComboBox, CommandButton.
- Đặt thuộc tính
NamevàCaptioncho từng control.
5.2. Mã xử lý sự kiện

Có thể bạn quan tâm: Cách Sắp Xếp Dữ Liệu Trong Pivot Table Của Excel Theo Giá Trị: Hướng Dẫn Chi Tiết Từ A Đến Z
Private Sub btnSave_Click() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Employees") Dim nextRow As Long nextRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 ws.Cells(nextRow, 1).Value = Me.txtID.Value ws.Cells(nextRow, 2).Value = Me.txtName.Value ws.Cells(nextRow, 3).Value = Me.cboDept.Value ws.Cells(nextRow, 4).Value = Me.txtSalary.Value MsgBox "Đã lưu thông tin nhân viên.", vbInformation Me.Hide
End Sub Private Sub UserForm_Initialize() Me.cboDept.AddItem "Kế toán" Me.cboDept.AddItem "Marketing" Me.cboDept.AddItem "IT" Me.cboDept.AddItem "Nhân sự"
End Sub
5.3. Gọi form từ macro
Sub ShowEmployeeForm() EmployeeForm.Show
End Sub
6. Làm việc với dữ liệu ngoại vi: API, JSON, và CSDL
6.1. Gửi yêu cầu HTTP GET tới API
Function GetJSON(url As String) As String Dim http As Object Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", url, False http.send GetJSON = http.responseText
End Function
6.2. Phân tích JSON (sử dụng thư viện VBA‑JSON)
- Tải file
JsonConverter.bastừ GitHub (VBA‑JSON). - Nhập vào dự án (
File→Import File).
Sub ImportCurrencyRates() Dim jsonText As String, jsonObj As Object Dim rate As Double jsonText = GetJSON("https://api.exchangerate-api.com/v4/latest/USD") Set jsonObj = JsonConverter.ParseJson(jsonText) rate = jsonObj("rates")("VND") ThisWorkbook.Sheets("Rates").Range("A1").Value = "USD/VND" ThisWorkbook.Sheets("Rates").Range("B1").Value = rate
End Sub
6.3. Kết nối tới SQL Server
Sub GetDataFromSQL() Dim conn As Object, rs As Object, sql As String Set conn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") conn.ConnectionString = "Provider=SQLOLEDB;Data Source=SERVERNAME;" & _ "Initial Catalog=DBName;Integrated Security=SSPI;" conn.Open sql = "SELECT EmployeeID, FullName, Salary FROM Employees WHERE Active = 1" rs.Open sql, conn, 1, 3 'adOpenKeyset, adLockOptimistic ThisWorkbook.Sheets("SQLData").Range("A2").CopyFromRecordset rs rs.Close: conn.Close Set rs = Nothing: Set conn = Nothing
End Sub
7. Kỹ thuật lập trình nâng cao
7.1. Lập trình hướng đối tượng (OOP) trong VBA
'Class Module: clsEmployee
Private pID As Long
Private pName As String
Private pDept As String
Private pSalary As Double Public Property Get ID() As Long ID = pID
End Property
Public Property Let ID(val As Long) pID = val
End Property Public Property Get Name() As String Name = pName
End Property
Public Property Let Name(val As String) pName = val
End Property '... các property khác ... Public Sub RaiseSalary(percent As Double) pSalary = pSalary (1 + percent / 100)
End Sub
Sub TestEmployee() Dim emp As clsEmployee Set emp = New clsEmployee emp.ID = 1001 emp.Name = "Nguyễn Văn A" emp.RaiseSalary 5 Debug.Print emp.ID, emp.Name, emp.Salary
End Sub
7.2. Sử dụng Dictionary (đối tượng Scripting)
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary") dict.Add "A", 1
dict.Add "B", 2
If dict.Exists("C") Then MsgBox dict("C")
Else MsgBox "Key C không tồn tại"
End If
7.3. Tạo Add‑in (XLA/XLAM) để chia sẻ macro
File→Save As→ ChọnExcel Add‑in (.xlam).- Đặt các macro trong
ThisWorkbookhoặcStandard Module. - Cài đặt add‑in:
File→Options→Add‑Ins→Excel Add‑ins→Browse.
7.4. Bảo mật macro
- Digital Signature: Ký macro bằng chứng thư số để người dùng tin cậy.
- Password Protect VBA Project:
Tools→VBAProject Properties→Protection. - Trust Center Settings: Cho phép chỉ chạy macro từ nguồn đáng tin cậy.
8. Ứng dụng thực tế trong doanh nghiệp
8.1. Tự động hoá quy trình bán hàng
- Nhập dữ liệu đơn hàng: Form nhập liệu, lưu vào bảng “Orders”.
- Kiểm tra tồn kho: VBA truy vấn cơ sở dữ liệu kho, cập nhật số lượng.
- Tạo hoá đơn PDF:
ExportAsFixedFormat→ gửi email tự động. - Báo cáo doanh thu: PivotTable tự động cập nhật hàng ngày.
8.2. Quản lý dự án
- Dashboard Gantt: Vẽ biểu đồ Gantt bằng Shapes, cập nhật tiến độ qua macro.
- Theo dõi thời gian: Form nhập thời gian, tính tổng giờ cho từng nhân viên.
- Nhắc nhở deadline: Macro chạy mỗi ngày, gửi email nhắc nhở qua Outlook.
8.3. Kiểm soát tài chính
- Đối chiếu ngân hàng: Import file CSV, so sánh với sổ sách, đánh dấu sai lệch.
- Tự động tính thuế: Công thức tính thuế phức tạp được gói trong Function VBA.
- Báo cáo tài chính: Tạo báo cáo cân đối, lãi lỗ, xuất file PDF/Excel.
9. Tối ưu hoá và debug VBA
9.1. Sử dụng Option Base và Array
Option Base 1 'Mảng bắt đầu từ 1 thay vì 0
Dim arr(1 To 10) As Double
9.2. Tránh vòng lặp chậm – dùng Arrays và WorksheetFunction
Dim data As Variant, result As Variant
data = ws.Range("A1:A10000").Value
'Xử lý trong bộ nhớ
For i = LBound(data) To UBound(data) data(i, 1) = data(i, 1) 2
Next i
ws.Range("B1:B10000").Value = data
9.3. Công cụ Debug
- Breakpoint (
F9) – tạm dừng thực thi. - Step Into (
F8) – bước qua từng dòng. - Watch Window – theo dõi giá trị biến.
- Immediate Window – kiểm tra và thay đổi giá trị nhanh.
9.4. Profiling thời gian thực thi
Sub TestPerformance() Dim t0 As Double, t1 As Double t0 = Timer '--- code cần đo t1 = Timer MsgBox "Thời gian: " & Format(t1 - t0, "0.00") & " giây"
End Sub
10. Tài nguyên học tập và cộng đồng
| Nguồn | Mô tả |
|---|---|
| Microsoft Docs | Tài liệu chính thức về VBA, đối tượng Excel Object Model. |
| Chương trình VBA trên Udemy, Coursera | Khóa học video từ cơ bản tới nâng cao. |
| Stack Overflow | Câu hỏi & trả lời về các vấn đề lập trình VBA. |
| Reddit r/vba | Cộng đồng chia sẻ macro, giải pháp thực tế. |
| GitHub – VBA‑JSON, Excel‑AddIn‑Framework | Thư viện mã nguồn mở hỗ trợ JSON, tạo Add‑in. |
| Sách “Excel VBA Programming For Dummies” | Hướng dẫn thân thiện cho người mới. |
11. Kết luận
Excel Power Programming with VBA không chỉ là một kỹ năng “điểm nhấn” trong hồ sơ cá nhân mà còn là công cụ mạnh mẽ giúp doanh nghiệp tối ưu hoá quy trình, giảm chi phí và nâng cao độ chính xác trong xử lý dữ liệu. Từ việc viết macro đơn giản, tạo form nhập liệu, tới việc tích hợp API và cơ sở dữ liệu, VBA mở ra một thế giới lập trình linh hoạt ngay trong môi trường Excel mà hầu hết người dùng đã quen thuộc.
Để thực sự thành thạo, bạn cần:
- Nắm vững nền tảng: biến, cấu trúc, đối tượng Excel.
- Thực hành thường xuyên: biến các công việc thủ công thành macro.
- Khám phá các kỹ thuật nâng cao: OOP, API, Add‑in.
- Tham gia cộng đồng: học hỏi, chia sẻ và cập nhật xu hướng mới.
Hãy bắt đầu bằng một dự án nhỏ, ví dụ tự động hoá báo cáo tuần, sau đó dần mở rộng sang các quy trình phức tạp hơn. Khi bạn cảm nhận được thời gian tiết kiệm và độ tin cậy tăng lên, chắc chắn VBA sẽ trở thành “đối tác” không thể thiếu trong hành trình làm việc với Excel của bạn.
Chúc bạn thành công và luôn “Power up” với VBA!

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ẻ.
