Sửa lỗi 'Compile error: Method or data member not found' trong VBA Excel

intermediate📊 Microsoft Excel2026-06-30| Microsoft Excel 2016 / 2019 / 2021 / Microsoft 365 (Windows), VBA Editor (Alt+F11)

Error Message

Compile error: Method or data member not found
#vba#excel#compile-error#object#macro

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.Vlaue thay vì .Value, .ClearContenet thay vì .ClearContents, v.v.
  • Biến được khai báo sai kiểu — gọi method của Workbook trên biến được khai báo là Worksheet, hoặc gọi method của Range trên biến Worksheet.
  • 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.

Related Error Notes