Có thể bạn quan tâm: Lấy File Excel Trong Cad: Hướng Dẫn Chi Tiết Từ A Đến Z
Mở Đầu
Trong thời đại số hoá hiện nay, Microsoft Excel không chỉ là một công cụ tính toán đơn thuần mà còn là một nền tảng mạnh mẽ cho việc tự động hoá quy trình công việc, xử lý dữ liệu lớn và xây dựng các ứng dụng nội bộ. Điều này trở nên khả thi nhờ vào Visual Basic for Applications (VBA) – một ngôn ngữ lập trình tích hợp sẵn trong Excel, cho phép người dùng viết mã để điều khiển mọi khía cạnh của bảng tính.
Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, đầy đủ (full) và có thể tải về dạng PDF về lập trình VBA trong Excel, bao gồm:
- Giới thiệu tổng quan về VBA và môi trường phát triển trong Excel.
- Cài đặt, cấu hình và chuẩn bị môi trường làm việc.
- Các khái niệm cơ bản: biến, kiểu dữ liệu, cấu trúc điều khiển, hàm và thủ tục.
- Tương tác với các đối tượng Excel: Workbook, Worksheet, Range, Chart, PivotTable…
- Xây dựng Macro ghi lại (Record Macro) và chuyển đổi thành mã VBA.
- Lập trình sự kiện (Event-driven programming) trong Excel.
- Xử lý lỗi và debug hiệu quả.
- Kết nối Excel với các nguồn dữ liệu bên ngoài (Access, SQL Server, Web API).
- Tối ưu hoá hiệu năng và bảo mật macro.
- Các ví dụ thực tế: tự động hoá báo cáo, tạo biểu đồ động, thu thập dữ liệu web, phân tích tài chính.
- Hướng dẫn xuất bản và chia sẻ file VBA dưới dạng PDF để học tập và tham khảo.
Sau khi đọc xong, bạn sẽ có một tài liệu “full PDF” đáng tin cậy để học, tra cứu và áp dụng VBA trong mọi dự án Excel của mình.
Có thể bạn quan tâm: Lưu Trang Tính Trong Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
1. Tổng Quan Về VBA Trong Excel
1.1 VBA là gì?
VBA (Visual Basic for Applications) là một ngôn ngữ lập trình hướng đối tượng, dựa trên Visual Basic, được Microsoft tích hợp trong các ứng dụng Office (Excel, Word, PowerPoint, Access). VBA cho phép người dùng:
- Tự động hoá các thao tác lặp lại.
- Tạo giao diện người dùng tùy chỉnh (UserForm, Controls).
- Kết nối dữ liệu từ nhiều nguồn khác nhau.
- Mở rộng chức năng của Excel bằng các hàm và add‑in tùy chỉnh.
1.2 Lợi Ích Khi Sử Dụng VBA
| Lợi Ích | Mô Tả |
|---|---|
| Tiết kiệm thời gian | Thực hiện các tác vụ lặp lại trong vài giây thay vì giờ đồng hồ. |
| Độ chính xác cao | Giảm thiểu lỗi do nhập liệu thủ công. |
| Tích hợp sâu | Truy cập và điều khiển mọi tính năng của Excel, bao gồm cả các tính năng nâng cao như Power Query, Power Pivot. |
| Tái sử dụng | Mã VBA có thể lưu trữ trong workbook và dùng lại trong các dự án khác. |
| Khả năng mở rộng | Kết nối với các ngôn ngữ khác (C#, Python) qua COM, DLL. |
1.3 PDF Là Gì Và Tại Sao Nên Chuẩn Bị Tài Liệu PDF?
PDF (Portable Document Format) là định dạng tài liệu điện tử phổ biến, giữ nguyên bố cục, định dạng và có thể mở trên mọi hệ thống. Khi bạn biên soạn một tài liệu hướng dẫn VBA đầy đủ, PDF giúp:
- Bảo đảm nội dung không bị thay đổi.
- Chia sẻ dễ dàng qua email, cloud hoặc in ấn.
- Tích hợp hình ảnh, biểu đồ, mã nguồn, và chú giải rõ ràng.
Có thể bạn quan tâm: Lưu 1 Sheet Trong Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
2. Chuẩn Bị Môi Trường Làm Việc
2.1 Kiểm Tra Phiên Bản Excel
VBA được hỗ trợ trên các phiên bản:
- Excel 2026, 2026, 2026, 2026, Microsoft 365 (Office 365).
- Excel for Mac (có một số hạn chế về UI, nhưng vẫn hỗ trợ VBA).
Lưu ý: Excel 2026 và Microsoft 365 luôn có bản cập nhật bảo mật mới, vì vậy bạn nên cập nhật đầy đủ trước khi bắt đầu.
2.2 Kích Hoạt Tab “Developer”
- Vào File → Options → Customize Ribbon.
- Đánh dấu Developer trong danh sách bên phải.
- Nhấn OK.
Bây giờ thanh công cụ Developer sẽ xuất hiện trên Ribbon, cung cấp các công cụ như Visual Basic, Record Macro, Insert Form Controls.
2.3 Cài Đặt Môi Trường VBA
- VBA Editor (VBE): Mở bằng Alt + F11.
- Cài đặt tham chiếu (References): Trong VBE, vào Tools → References, tích chọn các thư viện cần thiết (Microsoft Scripting Runtime, Microsoft XML, v.v.) để sử dụng các đối tượng đặc biệt.
2.4 Tạo File PDF Mẫu
Bạn có thể tạo một file PDF mẫu để chèn vào tài liệu hướng dẫn:
- Mở một workbook trống, nhập tiêu đề, mục lục và một vài ví dụ.
- Vào File → Save As → PDF.
- Lưu lại dưới tên “Mau_BaoCao_VBA.pdf”.
3. Các Khái Niệm Cơ Bản Trong VBA
3.1 Cấu Trúc Cơ Bản Của Một Module
Option Explicit Sub TenMacro() ' Mô tả: Đây là một macro đơn giản MsgBox "Xin chào, đây là VBA trong Excel!"
End Sub
- Option Explicit buộc khai báo biến, giúp giảm lỗi.
- Sub là thủ tục (procedure) không trả về giá trị.
- Function trả về giá trị và có thể gọi trong công thức Excel.
3.2 Kiểu Dữ Liệu
| Kiểu | Mô tả | Kích thước |
|---|---|---|
| Integer | Số nguyên từ -32,768 đến 32,767 | 2 byte |
| Long | Số nguyên lớn hơn | 4 byte |
| Double | Số thực, độ chính xác cao | 8 byte |
| String | Chuỗi ký tự | Độ dài tùy ý |
| Boolean | True/False | 2 byte |
| Variant | Kiểu dữ liệu linh hoạt, mặc định | 16 byte |
| Date | Ngày giờ | 8 byte |
| Object | Tham chiếu tới đối tượng COM | 4/8 byte |
3.3 Biến và Hằng
Const PI As Double = 3.14159265358979
Dim i As Long, total As Double
- Const khai báo hằng số, không thể thay đổi trong runtime.
- Dim khai báo biến, có thể đặt Public (toàn cục) hoặc Private (cục bộ).
3.4 Cấu Trúc Điều Khiển
' If…Then…Else
If total > 1000 Then MsgBox "Doanh thu vượt mục tiêu!"
Else MsgBox "Cần cải thiện."
End If ' For…Next
For i = 1 To 10 Cells(i, 1).Value = i 2
Next i ' Do…Loop While
Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Select
Loop
3.5 Hàm và Thủ Tục
- Hàm (Function) có thể dùng trong công thức Excel:
=TinhTong(A1:A10). - Thủ tục (Sub) thường thực hiện hành động, không trả về giá trị.
Function TinhTong(rng As Range) As Double Dim cell As Range Dim sum As Double For Each cell In rng If IsNumeric(cell.Value) Then sum = sum + cell.Value Next cell TinhTong = sum
End Function
4. Tương Tác Với Các Đối Tượng Excel
4.1 Workbook và Worksheet
Dim wb As Workbook
Dim ws As Worksheet Set wb = ThisWorkbook ' Workbook hiện tại
Set ws = wb.Sheets("Data") ' Lấy sheet có tên "Data"
- ThisWorkbook: workbook chứa macro.
- ActiveWorkbook: workbook đang hoạt động (có thể khác).
4.2 Range – Truy Cập Ô Và Vùng Dữ Liệu
Dim rng As Range
Set rng = ws.Range("A1:D10")
rng.Font.Bold = True
rng.Interior.Color = RGB(220, 230, 241)
- Cells(row, column): truy cập ô bằng chỉ số.
- Offset(rowOffset, colOffset): di chuyển tương đối.
4.3 Chart – Tự Động Tạo Biểu Đồ
Dim cht As ChartObject
Set cht = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=400, Height:=250)
With cht.Chart .SetSourceData Source:=ws.Range("A1:B10") .ChartType = xlLineMarkers .HasTitle = True .ChartTitle.Text = "Biểu đồ doanh thu"
End With
4.4 PivotTable – Tạo Báo Cáo Tổng Hợp
Dim ptCache As PivotCache
Dim pt As PivotTable
Dim dest As Range Set dest = ws.Range("F1")
Set ptCache = wb.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:=ws.Range("A1:D500"))
Set pt = ptCache.CreatePivotTable( _ TableDestination:=dest, _ TableName:="PivotDoanhThu")
With pt .PivotFields("KhuVuc").Orientation = xlRowField .PivotFields("DoanhThu").Orientation = xlDataField
End With
4.5 UserForm – Giao Diện Người Dùng
- Trong VBE, Insert → UserForm.
- Thêm các Controls: TextBox, CommandButton, ListBox…
- Viết code cho sự kiện Click của nút:
Private Sub cmdOK_Click() Dim ten As String ten = Me.txtName.Text MsgBox "Xin chào " & ten, vbInformation Unload Me
End Sub
Để hiển thị Form: UserForm1.Show.
5. Ghi Lại (Record Macro) Và Chuyển Đổi Thành Mã VBA

Có thể bạn quan tâm: Hàm Lấy Số Dư Trong Excel: Cách Sử Dụng, Ứng Dụng Thực Tiễn Và Mẹo Tối Ưu
5.1 Sử Dụng Record Macro
- Vào Developer → Record Macro.
- Thực hiện các thao tác (định dạng, sao chép, tạo biểu đồ).
- Dừng ghi và kiểm tra mã trong VBE.
5.2 Tối Ưu Hóa Mã Được Ghi
- Xóa các lệnh không cần thiết (Select, Activate).
- Thêm Option Explicit và khai báo biến.
- Sử dụng With…End With để giảm lặp.
With Sheets("Report") .Range("A1").Value = "Ngày" .Range("B1").Value = "Doanh thu" .Columns("A:B").AutoFit
End With
6. Lập Trình Sự Kiện (Event-Driven Programming)
Excel cung cấp nhiều sự kiện cho Workbook, Worksheet và Application.
6.1 Các Sự Kiện Thông Dụng
| Đối tượng | Sự kiện | Mô tả |
|---|---|---|
| Workbook | Open, BeforeClose, BeforeSave | Khi mở, đóng, lưu workbook. |
| Worksheet | Change, SelectionChange, BeforeDoubleClick | Khi thay đổi ô, thay đổi lựa chọn, nhấp đúp. |
| Application | SheetActivate, NewWorkbook | Khi kích hoạt sheet, tạo workbook mới. |
6.2 Ví Dụ: Tự Động Kiểm Tra Dữ Liệu Khi Người Dùng Nhập
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Me.Range("B2:B100")) Is Nothing Then If Not IsNumeric(Target.Value) Then MsgBox "Vui lòng nhập số!", vbExclamation Application.EnableEvents = False Target.ClearContents Application.EnableEvents = True End If End If
End Sub
Lưu ý: Khi thay đổi giá trị trong sự kiện, tắt Application.EnableEvents để tránh vòng lặp vô hạn.
7. Xử Lý Lỗi Và Debug
7.1 Các Lệnh Xử Lý Lỗi
On Error GoTo ErrHandler
' Code có thể gây lỗi
Exit Sub ErrHandler: MsgBox "Lỗi: " & Err.Number & " - " & Err.Description, vbCritical Resume Next ' Hoặc Resume <label>
- On Error Resume Next bỏ qua lỗi (không khuyến khích).
- On Error GoTo 0 tắt xử lý lỗi tùy chỉnh.
7.2 Công Cụ Debug
- Breakpoints (F9) để dừng thực thi tại dòng.
- Watch Window để theo dõi giá trị biến.
- Immediate Window (
Ctrl+G) để thử lệnh nhanh.
7.3 Ghi Log Lỗi Vào File
Sub GhiLogLoi(ByVal txt As String) Dim fso As Object, ts As Object Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(ThisWorkbook.Path & "\Log.txt", 8, True) ts.WriteLine Now & " - " & txt ts.Close
End Sub
Gọi GhiLogLoi Err.Description trong block ErrHandler.
8. Kết Nối Excel Với Các Nguồn Dữ Liệu Bên Ngoài
8.1 Kết Nối Với Access
Dim cn As Object, rs As Object
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Data\MyDB.accdb;"
cn.Open Set rs = cn.Execute("SELECT FROM KhachHang")
Worksheets("Data").Range("A2").CopyFromRecordset rs rs.Close: cn.Close
8.2 Kết Nối Với SQL Server
Dim cn As New ADODB.Connection
cn.ConnectionString = "Driver={SQL Server};Server=SERVER01;Database=SalesDB;Trusted_Connection=Yes;"
cn.Open
8.3 Gửi Yêu Cầu Web API (JSON)
Dim http As Object, json As String
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://api.exchangerate-api.com/v4/latest/USD", False
http.send
json = http.responseText
' Sau đó dùng JSON parser (VBA‑JSON) để xử lý
Bạn cần thêm reference tới Microsoft XML, v6.0.
9. Tối Ưu Hoá Hiệu Năng Và Bảo Mật
9.1 Tối Ưu Hoá Mã
- Tránh sử dụng Select/Activate.
- Sử dụng biến mảng để xử lý dữ liệu lớn: đọc
Range.Valuevào Variant, thao tác trong VBA, rồi ghi lại. - Tắt ScreenUpdating và Calculation trong quá trình chạy:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' ... code ...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
9.2 Bảo Mật Macro
- Digital Signature: ký macro bằng chứng chỉ để người dùng tin cậy.
- Macro Settings: trong Trust Center → Macro Settings → “Disable all macros with notification”.
- Password Protect VBA Project: Tools → VBAProject Properties → Protection → Set password.
9.3 Tránh Phụ Thuộc Vào Đường Dẫn Cứng
Sử dụng ThisWorkbook.Path để tạo đường dẫn tương đối, tránh lỗi khi di chuyển file.
10. Các Ví Dụ Thực Tế
10.1 Tự Động Hoá Báo Cáo Hàng Tháng
Sub BaoCaoHangThang() Dim wsSrc As Worksheet, wsDst As Worksheet Dim lastRow As Long, i As Long Set wsSrc = ThisWorkbook.Sheets("RawData") Set wsDst = ThisWorkbook.Sheets("Report") Application.ScreenUpdating = False wsDst.Cells.Clear wsDst.Range("A1").Value = "Tháng" wsDst.Range("B1").Value = "Doanh thu" For i = 2 To wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row If wsSrc.Cells(i, "A").Value = Format(Date, "mm/yyyy") Then wsDst.Cells(2, "A").Value = wsSrc.Cells(i, "A").Value wsDst.Cells(2, "B").Value = wsDst.Cells(2, "B").Value + wsSrc.Cells(i, "C").Value End If Next i ' Định dạng và tạo biểu đồ With wsDst .Columns("A:B").AutoFit Call TaoBieuDo(.Range("A1:B2")) End With Application.ScreenUpdating = True MsgBox "Báo cáo tháng đã hoàn thành!", vbInformation
End Sub Sub TaoBieuDo(rng As Range) Dim cht As ChartObject Set cht = rng.Worksheet.ChartObjects.Add(Left:=300, Top:=20, Width:=400, Height:=250) With cht.Chart .SetSourceData Source:=rng .ChartType = xlColumnClustered .HasTitle = True .ChartTitle.Text = "Doanh thu tháng " & Format(Date, "mm/yyyy") End With
End Sub
10.2 Thu Thập Dữ Liệu Từ Web (Web Scraping)
Sub LayBangGia() Dim http As Object, html As Object, tbl As Object, tr As Object, td As Object Dim i As Long, j As Long Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", "https://www.example.com/bang-gia", False http.send Set html = CreateObject("HTMLFile") html.body.innerHTML = http.responseText Set tbl = html.getElementsByTagName("table")(0) For i = 0 To tbl.Rows.Length - 1 Set tr = tbl.Rows(i) For j = 0 To tr.Cells.Length - 1 Set td = tr.Cells(j) ThisWorkbook.Sheets("Gia").Cells(i + 1, j + 1).Value = td.innerText Next j Next i MsgBox "Lấy bảng giá thành công!", vbInformation
End Sub
10.3 Phân Tích Tài Chính – Tính Tỷ Suất Lợi Nhuận
Function TinhLoiNhuan(giaBan As Double, giaVon As Double) As Double If giaVon = 0 Then TinhLoiNhuan = 0 Else TinhLoiNhuan = (giaBan - giaVon) / giaVon End If
End Function Sub ApplyLoiNhuan() Dim rng As Range, cell As Range Set rng = Sheets("SanPham").Range("C2:C100") ' Giá bán For Each cell In rng cell.Offset(0, 1).Value = TinhLoiNhuan(cell.Value, cell.Offset(0, -1).Value) ' Giả sử giá vốn ở cột B Next cell MsgBox "Tính lợi nhuận hoàn tất."
End Sub
11. Xuất Bản Và Chia Sẻ Tài Liệu PDF
11.1 Tạo PDF Từ VBA
Sub XuatPDF() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Report") ws.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ThisWorkbook.Path & "\BaoCaoThang.pdf", _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=True
End Sub
11.2 Đánh Dấu (Watermark) Trên PDF
VBA không hỗ trợ trực tiếp, nhưng bạn có thể:
- Thêm hình ảnh (logo, watermark) vào sheet trước khi xuất PDF.
- Hoặc sử dụng thư viện bên thứ ba như PDFCreator qua COM.
Sub AddWatermark() Dim shp As Shape Set shp = ThisWorkbook.Sheets("Report").Shapes.AddTextEffect( _ PresetTextEffect:=msoTextEffect1, _ Text:="CONFIDENTIAL", _ FontName:="Arial", _ FontSize:=72, _ FontBold:=msoTrue, _ FontItalic:=msoFalse, _ Left:=100, Top:=200) shp.Fill.Transparency = 0.8 shp.Rotation = 45
End Sub
Sau khi chạy AddWatermark, thực hiện XuatPDF.
11.3 Phân Phối PDF
- Email: sử dụng Outlook Automation để gửi file PDF.
- SharePoint/OneDrive: tải lên thư mục chia sẻ.
- Website: đặt PDF lên server và cung cấp link tải.
Sub GuiEmailPDF() Dim olApp As Object, olMail As Object Set olApp = CreateObject("Outlook.Application") Set olMail = olApp.CreateItem(0) ' 0 = olMailItem With olMail .To = "nguoi_nhan@example.com" .Subject = "Báo cáo tháng - PDF" .Body = "Kính gửi, vui lòng xem báo cáo đính kèm." .Attachments.Add ThisWorkbook.Path & "\BaoCaoThang.pdf" .Send End With MsgBox "Email đã được gửi.", vbInformation
End Sub
12. Kết Luận
Việc học và thành thạo lập trình VBA trong Excel không chỉ giúp bạn tối ưu hoá quy trình làm việc, mà còn mở ra cánh cửa sáng tạo các giải pháp tự động hoá phức tạp, tích hợp dữ liệu và xây dựng công cụ phân tích mạnh mẽ. Bằng cách biên soạn một tài liệu “full PDF” như chúng ta vừa làm, bạn sẽ có nguồn tham khảo đầy đủ, có thể in ấn, chia sẻ và cập nhật theo nhu cầu thực tế.
Các Bước Tiếp Theo Đề Xuất
- Thực hành ngay: Tạo một workbook mẫu, áp dụng các macro đã học.
- Lưu trữ PDF: Sử dụng các đoạn code xuất PDF để ghi lại các dự án và tài liệu hướng dẫn.
- Tham gia cộng đồng: Các diễn đàn như MrExcel, Stack Overflow, và nhóm Facebook “VBA Việt Nam” là nơi chia sẻ kiến thức quý báu.
- Tiếp tục học: Nghiên cứu các công nghệ bổ trợ như Power Query, Power Pivot, và tích hợp Python qua xlwings để mở rộng khả năng của Excel.
Hy vọng tài liệu này sẽ là cẩm nang toàn diện cho mọi người muốn “đi từ A tới Z” trong thế giới VBA và Excel. Chúc bạn thành công trong mọi dự án tự động hoá!

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