2009-11-21 40 views
5

Có cách nào để buộc thu gom rác thải trong VBA/Excel 2000 không?Buộc thu gom rác thải

Câu hỏi này đề cập đến ngôn ngữ macro trong Excel. Không sử dụng VB .NET để thao tác Excel. Vì vậy GC.collect() sẽ không hoạt động

Trả lời

11

Bạn không thể tận dụng bộ sưu tập rác do .NET Framework cung cấp khi sử dụng VBA thẳng. Perhaps this article bởi Eric Lippert sẽ hữu ích

+1

Tôi không biết rằng VBA đã sử dụng tính tham chiếu và không hỗ trợ làm sạch các tham chiếu vòng tròn. Đó có thể là vấn đề underlaying. Vấn đề ban đầu là đôi khi sổ làm việc không đóng đúng khi đóng và không tham chiếu trong trình phá hủy lớp. Tôi nghĩ vấn đề xuất phát từ đó vật thể vẫn chưa được thu thập. Nhiều khả năng tôi có một tham khảo vòng tròn một số wheyer mà đi vào chơi một số lần. Cảm ơn vì tiền hỗ trợ. – Zen

+0

Tôi đồng ý, bạn không thể thực hiện trực tiếp từ VBA. Nhưng bạn thực sự có thể tận dụng lợi thế của GC của NET nếu bạn tham khảo một thư viện COM. Xem [** câu trả lời của tôi **] (http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284), đặc biệt là phần về Phương thức '.Dispose()' được gọi từ VBA. –

3

VBA/Excel không có bộ sưu tập rác, như VB cũ. Thay vì GC, nó sử dụng tính toán tham chiếu. Bộ nhớ được giải phóng khi bạn đặt con trỏ thành không có gì (hoặc khi biến biến nằm ngoài phạm vi). Giống như trong VB cũ, nó có nghĩa là các tham chiếu vòng tròn không bao giờ được giải phóng.

+0

Ví dụ về sự cố đã biết tại đây: https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits –

3

Bạn không thể ép buộc GC trong VBA, nhưng tốt nhất là đặt thành Không có biến toàn cầu.

Bài viết được đề cập bởi kd7 cho biết sẽ vô ích khi đặt thành Không có biến cục bộ nào trước khi chúng nằm ngoài phạm vi, nhưng không nói về biến toàn cục.

Trong VBA, các biến toàn cầu được xác định trong mô-đun vẫn còn hoạt động trong toàn bộ phiên Excel, tức là cho đến khi tài liệu chứa mô-đun VBA xác định chúng đã đóng.

Vì vậy, không đặt vô dụng Set O = Nothing khi O là cục bộ, nhưng hãy làm khi toàn cầu.

Các vấn đề liên quan