Cái này là vụ 'clone object'.
Ban đầu có Set object_0 = CreateObject()
* Giả sử có có nhu cầu dùng thêm object_1, object_2 mà ta dùng cách:
Set object_1 = object_0
Set object_2 = object_0
...
Bạn giải thích như vậy chưa rõ.
Lệnh gán (dấu bằng) chỉ giành cho loại biến có thể mang giá trị. Khi ta gán a = b thì VBA sẽ lấy trị của biểu thức b gán vào biểu thức a. Sau khi gán xong, a và b chả còn gì với nhau.
Lệnh gán Set có thể dịch là "đặt". Lệnh này không copy trị mà chỉ copy địa chỉ.
Nói cách khác, trong hầu hết các trường hợp, Set tức là "đặt" tên, hay thêm tên mới cho đối tượng.
Set sh = Sheet1 ' đặt thêm cho Sheet1 tên sh
Set sh1a = sh ' sh1a là tên mới của đối tượng mà sh đang trỏ vào
Set sh1b = Sheet1
' Sheet1 hiện giờ có thêm 3 tên mới: sh, sh1a, sh1b
Set sh1a = Nothing ' bứt tên sh1a ra khỏi đối tượng mà nó đang trỏ vào
' Sheet1 hiện giờ chỉ còn 3 tên: sh, sh1b, Sheet1
Lệnh Set này chỉ giành cho các kiểu cơ cấu dữ liệu phức tạp
Chú thích 1: khi đối tượng không còn tên nào, tức là các tên của nó đều được Set Nothing hoặc Set sang đối tượng khác,, nó sẽ được coi là mồ côi và sẽ được bộ phận dọn rác của VBA hủy.
Trường hợp đối tượng tạm, không tên như
With CreateObject...
...
End With
Thì nó được coi là mồ côi sau khi VBA chạy lệnh End With.
Chú thích 2: từ "clone" trong ngữ cảnh đối tượng có nghĩa là "bản sao", tức là một đối tượng khác với phương thức và thuộc tính in hệt như đối tượng ban đầu. Sau khi "clone" xong thì hai đối tượng này hoàn toàn độc lập nhau. Khi thay đổi thằng này không ảnh hưởng thằng kia. (nói đơn giản thôi, chứ loại đối tượng chứa đối tương là chuyện khác. Lúc ấy phải phân biệt clone sâu hay cạn)