Trong quá trình phát triển macro, tự động hoá quy trình và viết các hàm tùy chỉnh bằng VBA (Visual Basic for Applications), một trong những lỗi criminals thường gặp nhất mà lập trình viên mới và thậm chí cả người đã có kinh nghiệm cũng phải đối mặt là Run‑time error 91: Object variable not set. Khi lỗi này xuất hiện, chương trình sẽ ngay lập tức dừng chạy và hiển thị thông báo “Object variable or With block variable not set”. Điều này thường khiến cho người dùng cảm thấy bối rối vì không rõ tại sao một biến đối tượng lại chưa được gán, hoặc vì lý do nào trong code khiến đối tượng không được khởi tạo đúng cách.
Bài viết này sẽ đi sâu vào khía cạnh nguyên nhân, cách phát hiện và khắc phục lỗi 91, cũng như những thực hành tốt nhất để tránh lỗi này trong tương lai. Bài viết được viết bằng tiếng Việt và dài hơn 1500 chữ (tương đương với khoảng 10–12 đoạn văn) để cung cấp đầy đủ kiến thức, ví dụ cụ thể và mẹo thực tiễn.
Có thể bạn quan tâm: Excel: Giải Pháp Cho Lỗi “excel Đã Tìm Thấy Vấn Đề Với Tham Chiếu Công Thức Trong Bảng Tính Này”
1. Hiểu rõ “Object Variable Not Set”
1.1 Định nghĩa
Trong VBA, Object variable là một biến được khai báo với kiểu dữ liệu Object (hoặc một kiểu con như Worksheet, Range, Workbook, Chart, v.v.). Khi một biến được khai báo nhưng chưa được gán giá trị, nó được coi là Nothing. Khi mã cố gắng truy cập thành phần của một biến chưa được gán, trình biên dịch sẽ phát hiện lỗi và ném ngoại lệ “Object variable not set”.
1.2 Cấu trúc thông thường gây ra lỗi
Dim ws As Worksheet
ws.Range("A1").Value = 10 ' Lỗi 91: ws chưa được gán
Trong ví dụ trên, ws được khai báo nhưng chưa được gán đối tượng Worksheet. Khi gọi ws.Range, VBA không biết ws trỏ tới đâu nên ném lỗi.
Có thể bạn quan tâm: Cố Định Dòng Tiêu Đề Khi In Trong Excel 2026
2. Nguyên nhân chính dẫn tới lỗi 91
| Nguyên nhân | Mô tả | Ví dụ |
|---|---|---|
| Biến chưa được gán | Khai báo biến, nhưng không thực hiện Set | Dim rng As Range rồi rng.Value = 5 |
| Gán sai kiểu | Gán một giá trị nguyên (Integer) khi cần đối tượng | Setचक = 5 |
| Giới hạn phạm vi | Sử dụng biến trong một With block nhưng không đặt Set | With Worksheets("Sheet1") Range("A1") |
| Đối tượng bị hủy | Đối tượng đã được Set rồi nhưng sau đó bị Set Nothing hoặc Kill | Set ws = Nothing rồi hōla |
| Cú pháp sai | Gặp lỗi trong Set do gạch chéo lẫn dấu chấm phẩy | Set ws = ThisWorkbook.Sheets("Sheet1") |
| Đối tượng không tồn tại | Tìm kiếm sheet/ range mà không tồn tại | Set ws = Worksheets("NonExist") |
| Biến toàn cục bị hủy | Public biến bị reset khi workbook được đóng và mở lại | – LET |
Những nguyên nhân trên thường là kết quả của lập trình không kiểm tra, thiếu logic kiểm tra, hoặc không hiểu rõ cách làm việc với đối tượng trong VBA.
Có thể bạn quan tâm: Công Thức Đổi Chữ Hoa Thành Chữ Thường Trong Excel
3. Cách phát hiện lỗi 91 khi viết mã
3.1 Mở chế độ “Break on All Errors”
Mặc dù mặc định VBA sẽ “Break on Standard Errors”, nhưng trong một số trường hợp, lỗi 91 có thể được bỏ qua nếu code đang chạy trong vòng lặp hoặc khi có On Error Resume Next. Để chắc chắn rằng lỗi này sẽ dừng ngay khi xảy ra, trong trình chỉnh sửa VBA chọn Debug > Options > Break on all errors.
3.2 Sử dụng On Error Resume Next một cách có kiểm soát
Nếu bạn cần tiếp tục chạy mã ngay cả khi lỗi xảy ra, hãy đặt On Error Resume Next прие ngay trước đoạn code có thể gây lỗi, sau đó kiểm tra Err.Number ngay sau đó:
On Error Resume Next
Set ws = Worksheets("Sheet1") ' Có thể không tồn tại
្មី
If Err.Number <> 0 Then MsgBox "Không tìm thấy Sheet1: " & Err.Description Err.Clear
End If
On Error GoTo 0
Điều này ngăn lỗi 91 ngăn chặn toàn bộ macro nhưng vẫn cho phép bạn nắm bắt và xử lý lỗi.
3.3 Kiểm tra biến trước khi truy cập
Trước khi gọi bất kỳ thành phần nào của đối tượng, hãy kiểm tra Is Nothing:
If Not ws Is Nothing Then ws.Range("A1").Value = 10
Else MsgBox ყველაზე
End If
Bằng cách này, bạn tránh được lỗi 91 và cũng có thểskill xử lýstate lỗi một cách logic.
4. Cách khắc phụcenciones lỗi 91
4.1舒服 Đặt đúng Set
Chính là cách đơn giản nhất: khi khai báo một biến đối tượng, luôn gán nó bằng cách sử dụng Set:
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
4.2 Đảm bảo đối tượng tồn tại advies
Trước khi gán, hãy kiểm tra xem đối tượng có tồn tại hay không:
If SheetExists("Sheet1") Then Set ws = ThisWorkbook.Worksheets("Sheet1")
Else MsgBox "Sheet1 không tồn tại."
End If
Định nghĩa hàm SheetExists:
Function SheetExists(shtName As String) As Boolean On Error Resume Next SheetExists = Not ThisWorkbook.Worksheets(shtName) Is Nothing On Error GoTo 0
End Function
4.3 Tránh lệnh On Error Resume Next vô tình
On Error Resume Next thường được dùng để bỏ qua lỗi, nhưng nếu không dừng sau khi lỗi xảy ra, bạn sẽ không nhận biết được lỗi 91. Để tránh, hãy đặt On Error GoTo 0 ngay sau khi kiểm tra, hoặc hạn chế sử dụng Resume Next trong các vùng code có thể gây lỗi.
4.4 Kiểm tra thuộc tính Nothing trước khi gọi
Như đã nêu trong phần 3.3, kiểm tra Nothing giúp ngăn chặn lỗi:
If Not rng Is Nothing Then rng.Value = 5
Else 'Xử lý khi rng chưa được gán
End If
4.5 Sử dụng With block đúng cách

Có thể bạn quan tâm: Excel Hiển Thị Địa Chỉ Của Ô Hiện Hành Trong Bảng Tính
With block thường dùng để giảm độ dài code. Tuy nhiên, nếu bạn không gán đúng đối tượng vào With, lỗi 91 sẽ xảy ra Soci:
With ThisWorkbook.Worksheets("Sheet1") .Range("A1").Value = 10
End With
Nếu ThisWorkbook.Worksheets("Sheet1") không tồn tại, With block sẽ gây lỗi 91.
4.6 Kiểm tra khi mở workbook
Nếu macro chạy khi workbook mở, hãy đặt Workbook_Open và kiểm tra:
Private Sub Workbook_Open() If SheetExists("Data") Then 'Tiếp tục Else MsgBox "Sheet 'Data' thiếu! Mở lại macro." End If
End Sub
5LV: Thực hành phòng ngừa lỗi 91
5.1 Khởi tạo biến đúng kiểu
- Luôn khai báo biến với kiểu Object hoặcريت
- Sử dụng
Setngay khiritel - Không gán kiểu dữ liệu nguyên thủy vào biến đối tượng
5.2 Kiểm tra tồn tại đối tượng
- Viết hàm kiểm tra sheet, range, workbook
- Kiểm tra trước khi gán hoặc truy cập
5.3 Không để On Error Resume Next vô tình
- Sử dụng
Resume Nextchỉ trong những đoạn code đã được kiểm soát - Đặt
On Error GoTo 0ngay sau khi kiểm tra
5.4 Đặt Option Explicit ở đầu module
- Bắt buộc khai báo biến trước khi sử dụng
- Giúp tránh gõ sai tên biến, dẫn tới biến chưa gán.
5.5 Đặt Break on All Errors
- Thường xuyên kiểm tra khi phát triển
- Khi chuyển sang môi trường production, có thể tắt nhưng vẫn nên kiểm tra.
5.6 Kiểm tra toàn bộ macro bằng “Debug > Compile VBA Project”
- Công cụ này sẽ tìm các lỗi cú pháp và biến chưa gán, giúp phát hiện sớm lỗi 91.
5.7 Đặt MsgBox và Debug.Print trong quá trình debug
- Khi chạy macro thử nghiệm, in ra thông tin biến, giá trị, trạng thái.
6. Một số ví dụ thực tế và cách sửa lỗi
6.1 Ví dụ 1: Gán Worksheet sai
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' Đúng
Nếu Sheet1 không tồn tại:
If SheetExists("Sheet1") Then Set ws = ThisWorkbook.Sheets("Sheet1")
Else MsgBox "Sheet1 không tồn tại."
End If
6.2 Ví dụ 2: Gán Range sai
Dim rng As Range
Set rng = ws.Range("A1:B10") ' Đúng nếu ws đã được gán
Nếu ws chưa được gắn:
If Not ws Is Nothing Then Set rng = ws.Range("A1:B10")
Else MsgBox "Worksheet chưa được gán."
End If
6.3 Ví dụ 3: Sử dụng_default_With block
With ws .Range("A1").Value = "Hello"
End With
Nếu ws chưa được gán, lỗi 91.
6.4 Ví dụ 4: Kiểm tra workbook
If WorkbookExists("Budget.xlsx") Then Dim wb As Workbook Set wb = Workbooks.Open("Budget.xlsx")
Else MsgBox "File Budget.xlsx không tồn tại."
End If
Hàm kiểm tra:
Function WorkbookExists(filePath As String) As Boolean WorkbookExists = Dir(filePath) <> ""
End Function
7. Kiểm tra lỗi 91 trong các macro phức tạp
Trong các macro có nhiều vòng lặp, điều kiện, hoặc gọi các hàm khác, lỗi 91 thường xuất hiện khi có früher hành động không đồng bộ. Dưới đây là một số tình huống thường gặp:
- L гиб: Khi gọi một hàm trả về
Worksheet, nhưng hàm không được triển khai đúng. - Chồng lớp: Khi có nhiều lớp
Class Modulesử dụngWithblock mà không khởi tạo đầy đủ. - Đối tượng bị hủy: Khi
Set ws = Nothingsau khi cần sử dụng.
Cách khắc phục: Sử dụng Debug.Print để in giá trị và trạng thái của biến trước khi thực hiện thao tác. Ví dụ:
Debug.Print "ws is Nothing? ", ws Is Nothing
8. Tham khảo tài liệu và nguồn học
| Tài liệu | Nội dung |
|---|---|
| Microsoft Docs – VBA Guide | Tổng quan về kiểu dữ liệu, đối tượng và Set |
| Excel VBA Programming For Dummies | Phần 4: Đối tượng và biến |
| Stack Overflow | Câu hỏi “Runtime error 91” và giải pháp |
| Reddit r/excel | Thảo luận thực tế và mẹo tránh lỗi 91 |
| VBA Developer Forum | Thảo luận nâng cao, ví dụ phức tạp |
9. Kết luận
Lỗi Run-time error 91: Object variable not set là một trong những lỗi phổ biến nhất trong VBA, nhưng với sự hiểu biết đúng đắn về cách làm việc với đối tượng, kiểm tra tồn tại, và thực hành viết code có kiểm soát, bạn hoàn toàn có thể khắc phục và tránh khỏi lỗi này. Các bước quan trọng bao gồm:
- Khởi tạo biến đúng kiểu và luôn gán bằng
Set. - Kiểm tra tồn tại đối tượng trước khi gán hoặc truy cập.
- Không sử dụng
On Error Resume Nextvô tình; thay vào đó, kiểm traErr.Number. - Sử dụng
Withblock một cách hợp lý. - Kiểm tra và debug thường xuyên.
Như vậy, khi bạn áp dụng những nguyên tắc này vào quy trình phát triển macro của mình, lỗi 91 sẽ trở thành một vấn đề quá khứ, và bạn sẽ có được mã nguồn sạch, dễ bảo trì và ít lỗi hơn. Hãy nhớ, trong lập trình, “ngăn chặn lỗi trước” luôn là chiến lược tốt hơn là “điều chỉnh sau”. Chúc bạn viết mã thành công và tránh lỗi 91 một cách hiệu quả!

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