Tình Huống Lỗi
Bạn mở VBA Editor (Alt+F11), nhấn F5 để chạy macro, và editor ngay lập tức đánh dấu một dòng và hiển thị:
Compile error: Method or data member not found
Macro không chạy được. VBA kiểm tra tên của mọi method và property so với type library của đối tượng trước khi thực thi. Chỉ cần một tên sai — nó dừng ngay tại đó.
Phân Tích Nguyên Nhân
Lỗi này hầu như luôn xuất phát từ một trong ba nguyên nhân:
- Lỗi đánh máy trong tên method hoặc property —
.Vlauethay vì.Value,.ClearContenetthay vì.ClearContents, v.v. - Biến được khai báo sai kiểu — gọi method của
Workbooktrên biến được khai báo làWorksheet, hoặc gọi method củaRangetrên biếnWorksheet. - Thiếu tham chiếu thư viện — code sử dụng các đối tượng từ thư viện ngoài (Scripting Runtime, ADO, Outlook) chưa được bật trong Tools → References.
VBA phát hiện lỗi này ở giai đoạn biên dịch, không phải khi chạy. Dòng được đánh dấu chính xác là vị trí gây ra lỗi — không cần đoán mò.
Cách Sửa Từng Bước
Bước 1: Đọc Dòng Được Đánh Dấu Để Tìm Lỗi Đánh Máy
Đóng hộp thoại lỗi. Con trỏ vẫn ở trên dòng có vấn đề. Đọc từng ký tự trong tên property hoặc method:
' Sai — lỗi đánh máy trong tên property
ws.Cells(1, 1).Vlaue = "Hello"
' Đúng
ws.Cells(1, 1).Value = "Hello"
' Sai
rng.ClearContenet
' Đúng
rng.ClearContents
Chỉ một ký tự bị hoán vị là đủ để kích hoạt lỗi này. Hãy sao chép tên method trực tiếp từ Object Browser (Bước 2) và bạn sẽ không bao giờ bị lỗi đánh máy nữa.
Bước 2: Dùng Object Browser Để Tìm Đúng Tên Member
Nhấn F2 trong VBA Editor để mở Object Browser. Tìm kiếm kiểu đối tượng của bạn — Worksheet, Range, Workbook — và bạn sẽ thấy danh sách đầy đủ các property và method hợp lệ. Sao chép chính xác cách viết từ đó vào code của bạn.
IntelliSense cũng hoạt động ngay trong code. Gõ tên biến, thêm dấu chấm, rồi nhấn Ctrl+Space. Danh sách gợi ý trống — hoặc thiếu method bạn mong đợi thấy — thường chỉ ra lỗi kiểu dữ liệu hoặc thiếu tham chiếu thư viện.
Bước 3: Sửa Lỗi Sai Kiểu Biến
Gán một kiểu đối tượng cho biến được khai báo là kiểu khác là lỗi rất dễ mắc phải:
' Vấn đề: đối tượng Workbook được gán cho biến kiểu Worksheet
Dim ws As Worksheet
Set ws = ThisWorkbook ' Workbook ≠ Worksheet
ws.Worksheets(1).Activate ' Compile error: Worksheet không có member .Worksheets
' Sửa: khớp kiểu khai báo với đối tượng được gán
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Worksheets(1).Activate
' Vấn đề: gọi method của Range trên biến Worksheet
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Address ' Compile error: Worksheet không có .Address
' .Address thuộc về Range, không phải Worksheet
Dim rng As Range
Set rng = ActiveSheet.Range("A1")
Debug.Print rng.Address ' Hoạt động: "$A$1"
Bước 4: Sửa Lỗi Thiếu Tham Chiếu Thư Viện
Các thư viện ngoài — Scripting.FileSystemObject, ADODB.Connection, Outlook.Application — không được VBA nhận diện trừ khi bạn bật chúng lên. Vào Tools → References và đánh dấu thư viện mà code của bạn cần dùng.
Để thêm tham chiếu: Tools → References → đánh dấu "Microsoft Scripting Runtime" (hoặc thư viện nào code bạn cần).
' Yêu cầu "Microsoft Scripting Runtime" được đánh dấu trong Tools → References
Dim fso As Scripting.FileSystemObject
Set fso = New Scripting.FileSystemObject
fso.CreateFolder "C:\Temp\Output"
Không thể thêm tham chiếu? Workbook dùng chung, xung đột phiên bản, và môi trường doanh nghiệp bị khóa là những lý do phổ biến. Hãy dùng late binding thay thế — không cần tham chiếu thư viện, dù bạn mất IntelliSense:
' Late binding — hoạt động không cần tham chiếu thư viện
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder "C:\Temp\Output"
Bước 5: Kiểm Tra Khả Năng Tương Thích Phiên Bản Excel
Không phải mọi method đều tồn tại trong mọi phiên bản Excel. Một member của Worksheet được giới thiệu trong Excel 2019 hoặc Microsoft 365 sẽ gây ra lỗi này trên máy vẫn đang chạy Excel 2016. Khi không chắc, hãy kiểm tra phần "Version information" trong tài liệu của Microsoft cho member cụ thể đó.
Sửa Triệt Để: Option Explicit + Khai Báo Kiểu Cụ Thể
Thêm Option Explicit ở đầu mỗi module. Khai báo mọi biến với kiểu đối tượng cụ thể — không bao giờ dùng As Object hoặc As Variant khi bạn đã biết kiểu thực tế:
Option Explicit
Sub ProcessData()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
Set rng = ws.Range("A1:A10")
rng.ClearContents
ws.Cells(1, 1).Value = "Done"
End Sub
Với kiểu cụ thể, IntelliSense chỉ hiển thị các member hợp lệ cho mỗi biến. Lỗi đánh máy trở thành tên không được nhận diện ngay lập tức. Lỗi sai kiểu xuất hiện ở dòng gán — không bị chôn vùi đâu đó trong logic ba bước sau.
Để áp dụng tự động cho tất cả module mới: Tools → Options → tab Editor → đánh dấu "Require Variable Declaration".
Xác Minh
Kiểm tra nhanh để xác nhận lỗi đã thực sự được giải quyết:
- Mở VBA Editor (Alt+F11).
- Vào Debug → Compile VBAProject.
- Không có hộp thoại nào = lỗi biên dịch đã được giải quyết.
- Nhấn F5 để chạy và xác nhận macro hoàn thành.
Nếu biên dịch thành công nhưng xuất hiện lỗi runtime, đó là vấn đề khác — cách sửa lỗi biên dịch ở đây là đúng.

