Khắc phục lỗi Run-time error '424': Object required trong Excel VBA

beginner📊 Microsoft Excel2026-07-20| Microsoft Excel (Tất cả phiên bản), VBA (Visual Basic for Applications) trên Windows hoặc macOS.

Error Message

Run-time error '424': Object required
#vba#excel-macros#debugging#runtime-error-424#office-scripts

Vấn đề

VBA là một ngôn ngữ nghiêm ngặt về kiểu dữ liệu. Lỗi Run-time error '424': Object required xảy ra khi trình thông dịch mong đợi một đối tượng phức tạp—như Worksheet, Range, hoặc Chart—nhưng thay vào đó lại gặp một chuỗi (string) đơn giản, một con số hoặc một biến trống. Hãy tưởng tượng việc này giống như cố gắng bật công tắc đèn nhưng không có bóng đèn; lệnh vẫn ở đó, nhưng mục tiêu lại thiếu.

Nguyên nhân phổ biến

  • Quên từ khóa 'Set': Đây là nguyên nhân của khoảng 90% các lỗi này. Trong khi bạn có thể gán một con số bằng x = 10, các đối tượng lại yêu cầu lệnh Set.
  • Sai chính tả tên đối tượng: Tham chiếu đến Shet1 thay vì Sheet1 sẽ tạo ra một tham chiếu rỗng (null) mà VBA không thể giải quyết.
  • Biến chưa được khởi tạo: Bạn đã khai báo biến nhưng chưa bao giờ thực sự trỏ nó đến một ô (cell) hoặc trang tính (sheet) cụ thể.
  • Nhầm lẫn thuộc tính với đối tượng: Cố gắng xử lý một giá trị thuộc tính (như văn bản của một ô) như thể nó chính là ô đó.

Các bước khắc phục

1. Sử dụng từ khóa 'Set' cho tất cả đối tượng

Trong VBA, có sự khác biệt rất lớn giữa một biến lưu giữ giá trị và một biến trỏ đến một đối tượng. Nếu bạn bỏ qua Set, VBA sẽ cố gắng thực hiện phép gán "Let" (gán giá trị mặc định). Điều này sẽ thất bại ngay lập tức khi làm việc với Range hoặc Sheet.

Cách làm sai:

Dim myRange As Range
myRange = Range("A1") ' Lệnh này sẽ kích hoạt Lỗi 424 vì VBA mong đợi từ khóa Set

Cách làm đúng:

Dim myRange As Range
Set myRange = Range("A1") ' Thành công!

2. Loại bỏ lỗi chính tả với 'Option Explicit'

VBA thường quá "dễ dãi". Nếu bạn viết sai tên biến, nó sẽ không cảnh báo mà chỉ tạo ra một biến mới, trống rỗng ngay lập tức. Vì biến mới đó trống, mọi nỗ lực sử dụng nó như một đối tượng sẽ dẫn đến Lỗi 424.

Đặt Option Explicit ở ngay đầu module mã nguồn của bạn. Điều này bắt buộc bạn phải khai báo mọi biến. Nếu bạn nhập ShtData thay vì SheetData, trình biên tập sẽ phát hiện lỗi trong quá trình biên dịch trước khi bạn chạy macro.

Option Explicit

Sub UpdateCells()
    ' Với Option Explicit, lỗi chính tả ở đây sẽ được làm nổi bật ngay lập tức
    Sheet1.Cells(1, 1).Value = "Updated"
End Sub

3. Kiểm tra việc khởi tạo đối tượng

Nếu mã của bạn tìm kiếm một trang tính cụ thể hoặc một vùng dữ liệu, kết quả tìm kiếm có thể trống. Trước khi bạn cố gắng thao tác với một đối tượng, hãy kiểm tra xem nó có thực sự tồn tại hay không bằng cách sử dụng kiểm tra Nothing.

Dim targetSheet As Worksheet
On Error Resume Next
Set targetSheet = Sheets("Monthly_Report")
On Error GoTo 0

' Luôn xác thực đối tượng trước khi gọi các phương thức trên đó
If targetSheet Is Nothing Then
    MsgBox "Lỗi: Thiếu trang tính 'Monthly_Report'!"
    Exit Sub
End If

targetSheet.Activate ' Bây giờ đã an toàn để sử dụng

4. Không xử lý chuỗi như đối tượng

Bạn không thể gọi các phương thức đối tượng trên các kiểu dữ liệu nguyên thủy như String hoặc Integer. Điều này thường xảy ra khi các lập trình viên cố gắng định dạng một giá trị họ vừa trích xuất từ một ô.

Sai:

Dim userName As String
userName = Range("B2").Value
userName.Font.Bold = True ' Lỗi 424: Kiểu String không có thuộc tính Font

Đúng:

Dim userCell As Range
Set userCell = Range("B2")
userCell.Font.Bold = True ' Hoạt động: userCell là một đối tượng Range thực sự

Cách xác minh bản sửa lỗi

  • Biên dịch thường xuyên: Vào Debug > Compile VBAProject. Đây là tuyến phòng thủ đầu tiên của bạn chống lại các biến chưa khai báo và lỗi cú pháp.
  • Chạy từng bước (F8): Đừng chỉ chạy toàn bộ macro. Sử dụng phím F8 để thực thi từng dòng một. Điều này cho phép bạn thấy chính xác dòng nào kích hoạt cửa sổ thông báo lỗi.
  • Theo dõi cửa sổ Locals: Mở View > Locals Window trong khi debug. Nếu một biến hiển thị giá trị Nothing, nghĩa là phép gán Set của bạn đã thất bại hoặc bị bỏ qua.

Mẹo chuyên nghiệp để viết mã sạch hơn

  • Hãy rõ ràng: Thay vì dùng Sheets(1), hãy dùng ThisWorkbook.Sheets("Invoice"). Nó giúp mã của bạn khó bị lỗi hơn nhiều.
  • Đơn giản hóa chuỗi lệnh: Tránh các chuỗi dài như Workbooks(1).Sheets(1).Range("A1").Font.Color. Hãy chia nhỏ chúng thành các biến. Việc này giúp debug dễ dàng hơn vì bạn có thể thấy chính xác nơi chuỗi bị đứt.
  • Sử dụng tên có ý nghĩa: Tránh các tên như ws hoặc r. Sử dụng wsDashboard hoặc rngTotalSales để lỗi chính tả dễ nhận thấy hơn bằng mắt thường.

Related Error Notes