Có thể bạn quan tâm: Hàm Unique Trong Excel 2026: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
Mở Đầu
Excel không chỉ là một công cụ tính toán mạnh mẽ mà còn là một môi trường lập trình linh hoạt thông qua Visual Basic for Applications (VBA). Tuy nhiên, khi làm việc với VBA, người dùng thường gặp phải các lỗi (error) khiến cho macro không chạy được, gây mất thời gian và ảnh hưởng đến hiệu suất công việc. Bài viết này sẽ đi sâu vào nguyên nhân, phân loại, và cách khắc phục các lỗi Visual Basic trong Excel, đồng thời cung cấp một loạt các ví dụ thực tế và mẹo tối ưu hoá mã nguồn. Hy vọng rằng, sau khi đọc xong, bạn sẽ có một cái nhìn tổng quan và chi tiết để xử lý hầu hết các lỗi VBA một cách tự tin.
Có thể bạn quan tâm: Công Thức Tính Thâm Niên Trong Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
1. Tổng Quan về Lỗi Visual Basic trong Excel
1.1. Định Nghĩa Lỗi VBA
- Lỗi biên dịch (Compile Error): Xảy ra khi VBA không thể biên dịch mã nguồn do có cú pháp sai hoặc tham chiếu không hợp lệ.
- Lỗi thời gian chạy (Run-time Error): Xuất hiện khi macro đang thực thi và gặp vấn đề như truy cập đối tượng không tồn tại, chia cho 0, hoặc vượt quá giới hạn bộ nhớ.
- Lỗi logic (Logic Error): Mã chạy mà không sinh ra lỗi hệ thống, nhưng kết quả không như mong muốn do logic sai.
1.2. Tại Sao Lỗi VBA Thường Gây Rối?
- Môi trường đa dạng: Excel có nhiều phiên bản (2007, 2026, 2026, 2026, 2026, 365) và mỗi phiên bản có thể có các thư viện, đối tượng khác nhau.
- Tham chiếu (References) không đồng nhất: Khi macro được chia sẻ giữa các máy, các thư viện tham chiếu có thể không được cài đặt.
- Dữ liệu không đồng nhất: Các sheet có cấu trúc khác nhau, tên cột thay đổi, dữ liệu rỗng, hoặc dữ liệu kiểu không phù hợp.
- Bảo mật macro: Cài đặt bảo mật macro (macro security) có thể chặn thực thi macro, gây ra lỗi “Macros are disabled”.
Có thể bạn quan tâm: Hàm Nối Ký Tự Trong Excel: Từ Cơ Bản Đến Nâng Cao
2. Phân Loại Chi Tiết Các Lỗi Thông Dụng
2.1. Lỗi Biên Dịch (Compile Errors)
| Mã lỗi | Mô tả | Nguyên nhân thường gặp | Cách khắc phục |
|---|---|---|---|
| Compile error: Expected: end of statement | Cú pháp không hợp lệ | Thiếu dấu chấm phẩy, ngoặc, hoặc ký tự đặc biệt | Kiểm tra lại câu lệnh, dùng Debug → Compile VBAProject |
| Compile error: Variable not defined | Biến chưa được khai báo | Option Explicit được bật, nhưng biến chưa khai báo | Thêm Dim variableName As Type ở đầu module |
| Compile error: Type mismatch | Kiểu dữ liệu không tương thích | Gán giá trị chuỗi cho biến kiểu số, hoặc ngược lại | Sử dụng hàm CInt, CLng, CDbl, CStr để ép kiểu |
| Compile error: Sub or Function not defined | Hàm hoặc thủ tục không tồn tại | Gọi hàm chưa được định nghĩa, hoặc lỗi trong tên hàm | Kiểm tra chính tả, chắc chắn hàm đã được khai báo trong module hiện tại hoặc module công khai |
| Compile error: Invalid qualifier | Sử dụng từ khóa không hợp lệ | Gọi một phương thức không thuộc đối tượng | Kiểm tra đối tượng và phương thức, ví dụ Range("A1").Select là hợp lệ, nhưng Worksheet("Sheet1").Select không phải |
2.2. Lỗi Thời Gian Chạy (Run-time Errors)
| Mã lỗi | Tên lỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|---|
| Error 9 | Subscript out of range | Tham chiếu tới sheet, workbook, hoặc mảng không tồn tại | Kiểm tra tên sheet (Worksheets("Data")), dùng If WorksheetExists("Data") Then |
| Error 13 | Type mismatch | Gán giá trị không tương thích kiểu | Sử dụng hàm chuyển đổi kiểu, kiểm tra IsNumeric |
| Error 1004 | Application-defined or object-defined error | Thao tác trên Range không hợp lệ (ví dụ: Range("A1:B2").Select khi sheet không kích hoạt) | Đảm bảo sheet được kích hoạt, hoặc dùng Worksheets("Sheet1").Range("A1:B2").Select |
| Error 424 | Object required | Đối tượng chưa được khởi tạo (ví dụ: Set rng = Nothing sau đó dùng rng.Value) | Khởi tạo đối tượng trước khi sử dụng (Set rng = Worksheets("Sheet1").Range("A1")) |
| Error 91 | Object variable or With block variable not set | Biến đối tượng chưa được gán giá trị | Sử dụng Set obj = New ClassName hoặc kiểm tra If obj Is Nothing Then |
| Error 438 | Object doesn’t support this property or method | Gọi phương thức không tồn tại trên đối tượng | Kiểm tra tài liệu VBA, đảm bảo đối tượng hỗ trợ phương thức |
| Error 50290 | The macro cannot be run because the workbook is protected | Bảo vệ workbook hoặc sheet | Bỏ bảo vệ ActiveWorkbook.Unprotect Password:="pwd" |
| Error 800A03EC | Application-defined or object-defined error (thường xuất hiện khi dùng Excel Automation từ VBScript) | Tham chiếu sai hoặc không có quyền | Kiểm tra quyền truy cập và đường dẫn file |
2.3. Lỗi Logic
- Vòng lặp vô hạn: Do điều kiện
Do Whileluôn đúng, gây treo Excel. - Kết quả sai do sai vị trí cột: Khi dữ liệu thay đổi vị trí, macro vẫn lấy giá trị cột cố định.
- Nhập dữ liệu trùng lặp: Không kiểm tra dữ liệu đã tồn tại, dẫn tới lỗi nhập trùng.
Cách phòng ngừa:
1. Luôn sử dụng Option Explicit.
2. Kiểm tra dữ liệu đầu vào bằng các hàm IsNumeric, IsDate, Trim.
3. Viết unit test cho các hàm phức tạp (có thể dùng Debug.Print để kiểm tra kết quả).
3. Quy Trình Debug Lỗi VBA Bước Đầu
3.1. Sử Dụng Công Cụ Debug
| Công cụ | Chức năng | Cách sử dụng |
|---|---|---|
| Immediate Window | Thực thi câu lệnh ngay lập tức, kiểm tra giá trị biến | Nhấn Ctrl+G, gõ ? variableName |
| Watch Window | Theo dõi giá trị biến trong quá trình chạy | Click chuột phải trên biến → Add Watch |
| Breakpoints | Dừng thực thi tại một dòng cụ thể | Nhấn F9 trên dòng muốn dừng |
| Step Into (F8) | Bước từng dòng, vào trong hàm con | Nhấn F8 để di chuyển |
| Step Over (Shift+F8) | Bước qua hàm con, không vào trong | Dùng khi hàm đã kiểm chứng |
3.2. Kiểm Tra Tham Chiếu (References)
- Vào Tools → References trong VBA editor.
- Bỏ tick các thư viện “MISSING” hoặc thay thế bằng phiên bản đúng.
- Đối với các thư viện bên ngoài (ADO, DAO, Scripting Runtime), đảm bảo chúng đã được cài đặt trên máy.
3.3. Kiểm Tra Bảo Mật Macro
- File → Options → Trust Center → Trust Center Settings → Macro Settings
- Chọn “Enable all macros” (không khuyến khích trong môi trường production).
- Hoặc “Disable all macros with notification” và “Trust access to VBA project object model” để cho phép chạy macro đã ký.
4. Các Kịch Bản Lỗi Thực Tế và Giải Pháp Cụ Thể
4.1. Lỗi “Subscript out of range” Khi Lấy Dữ Liệu Từ Sheet Khác

Có thể bạn quan tâm: Cách Lọc Thông Tin Trong Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
Sub GetData() Dim ws As Worksheet Set ws = Worksheets("Data") MsgBox ws.Range("A1").Value
End Sub
Nguyên nhân: Sheet “Data” không tồn tại hoặc tên bị sai (có thể có khoảng trắng).
Giải pháp:
Function WorksheetExists(wsName As String) As Boolean On Error Resume Next WorksheetExists = Not Worksheets(wsName) Is Nothing On Error GoTo 0
End Function Sub GetData() Dim ws As Worksheet If WorksheetExists("Data") Then Set ws = Worksheets("Data") MsgBox ws.Range("A1").Value Else MsgBox "Sheet 'Data' không tồn tại!", vbExclamation End If
End Sub
4.2. Lỗi “Type mismatch” Khi Đọc Dữ Liệu Từ Ô Có Công Thức
Dim total As Double
total = Worksheets("Sheet1").Range("A1").Value 'A1 chứa công thức =SUM(B1:B10)
Nếu A1 trả về lỗi #DIV/0! hoặc #N/A, VBA sẽ báo Type mismatch.
Giải pháp: Kiểm tra IsError trước khi gán.
Dim total As Double
With Worksheets("Sheet1").Range("A1") If Not IsError(.Value) Then total = CDbl(.Value) Else total = 0 'hoặc xử lý tùy ý End If
End With
4.3. Lỗi “Object required” Khi Sử Dụng Find Không Tìm Được Kết Quả
Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A:A").Find(What:="ABC")
rng.Select 'Nếu không tìm thấy, rng = Nothing -> lỗi 424
Giải pháp:
Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A:A").Find(What:="ABC", LookIn:=xlValues, LookAt:=xlWhole)
If Not rng Is Nothing Then rng.Select
Else MsgBox "Không tìm thấy giá trị 'ABC' trong cột A.", vbInformation
End If
4.4. Lỗi “Application-defined or object-defined error” Khi Đặt Định Dạng Trên Vùng Không Hợp Lệ
Worksheets("Sheet1").Range("A1:B2").MergeCells = True
Nếu vùng đã được merge, việc lại merge sẽ gây lỗi 1004.
Giải pháp: Kiểm tra MergeCells trước khi thao tác.
With Worksheets("Sheet1").Range("A1:B2") If Not .MergeCells Then .Merge
End With
4.5. Lỗi Khi Sử Dụng Application.ScreenUpdating = False Mà Quên Bật Lại
Nếu macro dừng đột ngột (có lỗi) thì ScreenUpdating sẽ vẫn là False, khiến Excel “đóng băng”.
Giải pháp: Dùng cấu trúc On Error GoTo kèm Finally (được mô phỏng bằng Exit Sub).
Sub SafeMacro() On Error GoTo ErrHandler Application.ScreenUpdating = False '--- Code chính --- Call ProcessData '--- Kết thúc bình thường --- CleanExit: Application.ScreenUpdating = True Exit Sub ErrHandler: MsgBox "Đã xảy ra lỗi: " & Err.Description, vbCritical Resume CleanExit
End Sub
5. Các Thủ Thuật Nâng Cao Để Tránh Lỗi
5.1. Sử Dụng Option Explicit và Option Base 1
Option Explicit 'Buộc khai báo biến
Option Base 1 'Mảng bắt đầu từ chỉ số 1 (thay vì 0)
Giúp giảm lỗi biến chưa khai báo và lỗi chỉ số mảng.
5.2. Định Nghĩa Các Hằng Số Thay Vì Hardcode
Const COL_ID As Long = 1
Const COL_NAME As Long = 2
Khi thay đổi cấu trúc sheet, chỉ cần sửa hằng số một chỗ.
5.3. Tách Các Hàm Thành Module Riêng
- Module1: Hàm xử lý dữ liệu (DataProcessing).
- Module2: Hàm giao diện người dùng (UI).
- Module3: Hàm tiện ích (Utilities).
Điều này giúp giảm xung đột tên và dễ bảo trì.
5.4. Kiểm Tra Trước Khi Gọi Đối Tượng Ngoài (External Objects)
Khi sử dụng CreateObject("Scripting.FileSystemObject"), luôn kiểm tra On Error Resume Next và xác nhận đối tượng đã được tạo.
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso Is Nothing Then MsgBox "Không thể tạo FileSystemObject. Kiểm tra thư viện scripting.", vbCritical Exit Sub
End If
5.5. Sử Dụng Error Handling Theo Chuẩn
Sub Example() On Error GoTo ErrHandler '--- code --- Exit Sub ErrHandler: LogError Err.Number, Err.Description, "Example" Resume Next 'hoặc Resume CleanExit
End Sub Sub LogError(ByVal ErrNum As Long, ByVal ErrDesc As String, ByVal ProcName As String) Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("ErrorLog") Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1 ws.Cells(lastRow, 1).Value = Now ws.Cells(lastRow, 2).Value = ProcName ws.Cells(lastRow, 3).Value = ErrNum ws.Cells(lastRow, 4).Value = ErrDesc
End Sub
Việc ghi log giúp phát hiện lỗi trong môi trường production mà không cần mở VBA editor.
6. Các Công Cụ và Tài Nguyên Hỗ Trợ
- Microsoft Documentation: Trang chính thức của Microsoft cho VBA (docs.microsoft.com).
- MrExcel Forum & Stack Overflow: Cộng đồng trao đổi giải pháp lỗi VBA.
- MZ-Tools: Add-in cho VBA hỗ trợ refactor, tìm kiếm lỗi, và tạo báo cáo.
- Rubberduck VBA: Open-source add-in cung cấp static code analysis, unit testing, và refactoring.
- GitHub VBA Projects: Tham khảo mã nguồn mẫu, cách tổ chức dự án.
7. Kết Luận
Lỗi Visual Basic trong Excel không phải là điều không thể tránh khỏi; chúng là dấu hiệu cho chúng ta biết rằng code chưa được tối ưu hoặc môi trường chưa đồng nhất. Bằng cách hiểu rõ các loại lỗi, sử dụng công cụ debug một cách hiệu quả, và Áp dụng các best practice như Option Explicit, quản lý tham chiếu, và xử lý lỗi chuẩn, bạn có thể giảm thiểu đáng kể thời gian giải quyết sự cố và nâng cao độ ổn định của các macro.
Hãy nhớ rằng:
- Kiểm tra dữ liệu đầu vào luôn là bước đầu tiên quan trọng.
- Giữ môi trường VBA sạch sẽ (loại bỏ tham chiếu “MISSING”, cập nhật thư viện).
- Ghi log lỗi để có bằng chứng khi macro chạy trên máy khác.
- Đừng quên bảo mật: cho phép macro chỉ khi cần, và ký macro bằng chứng thực số.
Với kiến thức và các ví dụ thực tiễn trong bài viết này, bạn đã sẵn sàng đối mặt và khắc phục hầu hết các lỗi Visual Basic trong Excel. Chúc bạn lập trình suôn sẻ và công việc luôn đạt hiệu suất cao!

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