Mong anh Siwtom góp thêm ý kiến để mọi người có thêm kinh nghiệm, dù biết rằng thêm 1 câu lệnh nữa không nhiều nhưng không hiểu được bản chất vấn đề thì nghe sao sao ấy.
Tôi không đọc tài liệu về chuyện code trong VBA nhưng do tôi cũng từng viết trong Delphi nên tôi có thể kết luận ... khó biết lắm.
Tôi cho ví dụ trong Delphi. Ta xét Interface. Interface chỉ là interface, phải có một class nào đó implement cái interface kia. Về interface có cái gọi là "đếm số tham chiếu". Nó kiểu như có 1 cái phòng được dựng lên (1 đối tượng được tạo ra) và có 1 vị muốn làm việc với nó (tham chiếu). Mỗi khi có một vị nào đó "tham chiếu" tới cái phòng kia thì chỉ số của "đồng hồ đếm số tham chiếu" được tăng thêm 1, còn khi có vị nào đó "làm xong việc" và thôi không "quan tâm" nữa (interface = nil, nothing, set interface = nil, nothing) thì chỉ số của "đồng hồ đếm số tham chiếu" được giảm bớt 1. Khi chỉ số của "đồng hồ đếm số tham chiếu" = 0 (khi không còn vị nào "quan tâm" vì vị cuối cùng cũng "nhắn tin" là thôi không quan tâm - Set interface = Nothing) thì căn phòng - interface được "đập vỡ, tiêu hủy, hủy diệt" - căn phòng được phá đi. Vì có còn cần thiết nữa đâu?
Nếu nói về hàm để tăng chỉ số của "đồng hồ đếm số tham chiếu" thì đó là AddRef, còn lệnh giảm chỉ số của "đồng hồ đếm số tham chiếu" là Release.
Những người lập trình trong Delphi hầu như không phải gọi hàm AddRef và Release vì trong quá trình compile thì Delphi tự thêm vào những chỗ cần thiết các lệnh AddRef và Release.
Nhưng tôi thấy những người lập trình trong C++ bắt buộc phải tự mình gọi các hàm AddRef và Release.
Vậy thì tôi có câu hỏi: Như thế thì trong VBA thế nào? VBA có làm thay cho người lập trình như Delphi làm thay cho họ, hay VBA không làm thay giống như C++?
Tôi biết trong Delphi thế nào nhưng trong VBA thì chịu vì thứ nhất là tôi mới quan tâm tới VBA từ gần 1 năm nay, thứ nữa là khả năng tiếng Anh của tôi ở mức "luôn cầm từ điển trong tay và tra vài từ rồi đoán".
Dù thế nào chăng nữa thì viết Set dic = Nothing không ai dám nói là sai. Thậm chí viết:
Set dic = Nothing
Set dic = Nothing
Set dic = Nothing
cũng không ai dám nói là sai. Cùng lắm là nói: "thừa".
Nhưng các bạn cứ thử nghĩ xem. Một chuỗi "Set dic = Nothing" là mấy lần gõ? Mất mấy giây?. Và cái chuỗi đó ta viết trong code 10, 100, 1000 lần? Vậy thì viết chuỗi như thế mất thêm bao công sức, thời gian? Còn nếu nói về "thời gian thực hiện"? Ta giả sử là thực ra đối tượng sẽ được giải phóng khi ra khỏi Sub. Vậy thì viết thêm Set dic = Nothing thừa đến mức nào? Thực ra không là cái gì cả. VBA khi kiểm tra thấy dic = Nothing thì chả "giải phóng" cái gì cả. Thời gian, điện, nước chỉ tốn cho việc kiểm tra, nó chả là cái gì cả.
Vậy nếu là tôi, tức người không rõ cho lắm về những việc mà VBA làm sau "cánh gà", thì tôi sẽ viết Set dic = Nothing. Nó chả tốn mồ hôi, sức lực, điện nước là bao nhiêu nhưng tôi chắc 200% là tài nguyên được giải phóng, ngày ăn ngon miệng, tối ngủ yên giấc. Còn không thì vẫn nghi nghi hoặc hoặc, áy náy, không yên tâm. Trừ phi ông Microsoft xuất bản sách trong tiếng Việt của tôi và viết rõ ràng.
Tôi không phải là người quan tâm tiết kiệm từng xu nhưng lại vô tư phung phí hàng triệu. Có những code nếu viết cẩn thận một chút thì nó bù lại cho 1 tỷ tỷ thời gian mất vì set dic = Nothing. Kiểu tiết kiệm không phải chỗ.
Nếu cái Set dic = Nothing kia nó tốn quá nhiều công sức, thời gian điện nước thì tôi sẽ bỏ ra 1 ngày, 1 tháng, 1 năm để tìm hiểu rõ có cần hay không. Còn không thì quên đi cái chuyện tủn mủn như thế.