Có thực sự cần VBA Set Obj = Nothing hay không ?

tuhocvba

Administrator
Thành viên BQT
Sau khi sử dụng biến số Object, nhất định phải thiết định biến số đó là Nothing. Đó là điều mà nhiều người vẫn nghĩ. Tuy nhiên thực ra thì không thiết định cũng được.
Mặc dù nhiều người nghĩ rằng thiết định biến Object là Nothing là việc nên làm tuy nhiên đó không phải là lý lẽ chặt chẽ. Thời điểm hủy bỏ Object mà vẫn còn tham chiếu tới nó thì không có ý nghĩa.
Hãy xem ví dụ dưới đây:
Mã:
Sub test()
    Dim C As New Collection
    With C
        .Add "A"
        .Add "B"
        .Add "C"
        Set C = Nothing
        Debug.Print .Item(1)
        Debug.Print .Item(2)
        Debug.Print .Item(3)
    End With
End Sub
Ở dòng code thứ 7, tôi đã hủy bỏ biến C. Tuy nhiên kết quả lần lượt được ghi là A,B,C.
Bạn cần đăng nhập để thấy đính kèm

Khi mà chưa thoát ra khỏi khối With thì chương trình vẫn tham chiếu vào biến Object và vì vậy dù cho có thiết định C là Nothing thì biến Object đó vẫn sống.
Một biến Object được tham chiếu tới từ đâu, số điểm tham chiếu tới là quan trọng. Nếu số điểm tham chiếu tới là 0, thì nó có thể được hủy bỏ. Ở chương trình trên có hai nơi xuất hiện chữ With (dòng 3 và dòng 11 ) do đó có thể nói là có hai điểm đang tham chiếu tới nó. Tại thời điểm chúng ta hủy bỏ biến C (Collection) thì vẫn còn 1 điểm (dòng code thứ 11) tham chiếu tới nó. Vì vậy nó không thể hủy bỏ vào lúc này. Chỉ khi nào thoát ra khỏi khối With, thì mới có thể hủy bỏ biến C.

Đối với việc sử dụng biến Object từ các ứng dụng bên ngoài, thì dù chương trình có kết thúc, nó có thể vẫn còn lưu đâu đó trong bộ nhớ của máy tính.
Ví dụ:
Mã:
Sub IE_start()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
End Sub
Đoạn code trên để mở ứng dụng Internet Explorer (IE), tuy nhiên khi chương trình kết thúc, ứng dụng IE tự nó không đóng lại. Do đó, trường hợp này dù có thiết định Nothing thì kết quả cũng giống với code ở trên.
Mã:
Sub IE_start2()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    Set IE = Nothing
End Sub
Với việc sử dụng biến đối tượng Object bên ngoài, để hủy bỏ biến đó đi, chúng ta cần thao tác để close nó lại. Với trường hợp IE thì dùng phương thức Quit.
Mã:
Sub IE_start3()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Quit
End Sub
Nguồn tham khảo và dịch từ:
 
Top