Menu

Hỗ trợ xử lý lỗi 'Object variable or With block variable not set' trong VBA

Lệ Mai Nhi 10/06/2026 18:01 106 lượt xem 1 trả lời

Chào mọi người, mình đang làm một đoạn code VBA để tự động hóa việc xử lý dữ liệu trên nhiều sheet. Đại khái là code sẽ duyệt qua từng sheet, kiểm tra nếu sheet đó có tên chứa 'Data' thì sẽ sao chép dữ liệu từ sheet đó sang một sheet tổng hợp. Tuy nhiên, mình gặp phải lỗi 'Object variable or With block variable not set', thường là khi mình gọi đến một biến đối tượng mà nó chưa được gán giá trị.

Cụ thể, đoạn code của mình có phần như sau:

Dim ws As Worksheet
Dim wsTarget As Worksheet

Set wsTarget = ThisWorkbook.Sheets("Summary")

For Each ws In ThisWorkbook.Sheets
    If InStr(ws.Name, "Data") > 0 Then
        ' Sao chép dữ liệu từ ws sang wsTarget
        ws.UsedRange.Copy wsTarget.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
    End If
Next ws

Mình nghi ngờ lỗi nằm ở chỗ ws chưa được gán giá trị khi ws.UsedRange.Copy được gọi. Nhưng mình đã dùng For Each ws In ThisWorkbook.Sheets rồi mà?

Có cao nhân nào chỉ giúp mình cách khắc phục lỗi này hoặc chỉ ra chỗ sai trong logic của mình không ạ? Mình cảm ơn nhiều!

0

Lỗi "Object variable or With block variable not set" này đúng là "ám ảnh" với nhiều anh em làm VBA đây. Thường thì nó xảy ra khi mình khai báo biến nhưng quên Set cho nó một đối tượng cụ thể.

Trong trường hợp của bạn, khi Set wsTarget..., có thể là biến wsTarget chưa được gán giá trị đúng. Bạn thử kiểm tra lại xem wsTarget có được Set trước khi sử dụng không?

Nếu bạn đang muốn gán một sheet cụ thể cho wsTarget, ví dụ như sheet tên "Tổng hợp", thì có thể dùng:

Set wsTarget = ThisWorkbook.Sheets("Tổng hợp")

Hoặc nếu bạn muốn tạo một sheet mới và gán cho nó:

Set wsTarget = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsTarget.Name = "Sheet Mới"

Bạn thử xem lại phần Set wsTarget của mình nhé!

2

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký