@ptm0412 đấy như vậy cháu cũng hiểu sơ ý muốn của bạn ấy, 3 cái biến này:
Dim i as Long
Dim t as Long
Dim k as String
Như vậy cháu sử dụng IsEmpty là đúng ý của bạn ấy rồi đớiii.
Bạn chưa trả lời về mấy cái Objects. Mấy cái này mới là khùng.
Set rg = Range(gì gì đó)
Set rg = Nothing chỉ có nghĩa là không chỉ rg vào cái Range gì gì đó nữa. Nhưng cái Range gì gì đó nó thuộc về Worksheet và Workbook, đâu đã "giải phóng" khỏi bộ nhớ?
Loại biến này chỉ giải phóng vì sợ để đó bị ảnh hưởng cái Range mà nó chỉ vào thôi (lỡ tay đặt Value = cái gì đó). Chứ về bộ nhớ thì nó chỉ chiếm vài bytes.
Loại biến chỉ vào cái đối tượng (Object) được dựng ra mới quan trọng với bộ nhớ.
Set Dic = Nothing có nghĩa là bứt cái Dic ra khỏi cái đối tượng (object) mà nó đang chỉ vào. Đâu có bảo đảm "giải phóng" cái đối tượng ấy đâu?
Một thằng nợ nhiều nhà băng. Một vài nhà băng xoá nợ không có nghĩa là thằng ấy sạch nợ.
VBA dùng reference count để đếm số này. Chỉ khi nào số count này là 0 thì VBA mới tin là đối tượng đã được "tự do". Và lúc ấy nó mới tính chuyện lấy lại bộ nhớ.
Điển hình:
Set Dic = CreateObject("CaiGiDo") ' dựng đói tượng theo lớp CaiGiDo, ref count ở đây là 1
... code nhét đầy cỡ vài GB vào Dic
Set Dic2 = Dic ' chỉ Dic2 vào đối tượng kia, ref count ở đây là 2
Set Dic = Nothing ' bứt Dic ra, ref count ở đây là 1, vì thằng Dic2 còn sờ sờ kia
... code gì thì cứ code
' cái đối tượng kia vẫn sừng sững chiếm vài GB vì VBA đâu thể dẹp nó. Mỗi lần VBA hỏi thăm thì nó trả lời "ref count của tao vẫn đang > 0"
Set Dic2 = Nothing ' bứt Dic2 ra, bây giờ thì ref count là 0 (nếu không còn thằng nào nữa)
... code gì đó đòi hỏi bộ nhớ
' VBA sẽ lại hỏi cái đối tượng kia, và lần này thì nó trả lời "tao đi chầu Phật đây, mày cứ việc lây lại cái đống bọ nhớ kia
' bấy giờ cái chỗ bộ nhớ kia mới thực sự được tính là phơ-ri.
Ví dụ trên thì đếm dễ rồi. Vì các ref's đều trực tiếp. Mọi việc sẽ rối như tơ vò nếu có việc chỉ-qua-chỉ-lại (cross references)
Điển hình là đối tượng ADO thỉnh thoảng bị VBA đếm nhầm ref count, Excel đơ luôn.
Bảo tôi code cái này thì tôi chịu. Hơi đâu bỏ cả tuần lễ (có thể đến cả tháng, tôi học chậm lắm) đi tìm tài liệu rồi viết mấy cái sub's để làm chuyện từ thiện. Cả tháng ấy thà đi viết code dạo, lấy tiền đem vào bệnh viện giúp người nghèo mua thuốc có lẽ còn nhiều "công đức" hơn.
Nhưng ở trên tôi đã mách cho một chuyên viên C++. Tôi tin là người này có khả năng làm nhanh và tốt hơn tôi. Những điều y khoe về trình độ C++ đều thật cả. Và tôi có nói rõ với thớt rồi, không biết y là ai thì chỉ là tay mơ trong làng C++. Đừng có mở miệng khoác lác cái vụ C++ 200 đô một tiết, nghe nực cười lắm.