2013-09-26 179 views
20

Tôi đã tự dạy mình Excel VBA trong hai năm qua và tôi có ý tưởng rằng đôi khi nó thích hợp để vứt bỏ các biến ở cuối đoạn mã. Ví dụ, tôi đã nhìn thấy nó thực hiện trong bit này chuyển thể từ Ron de Bruin's code for transferring Excel to HTML:Khi nào một biến Excel VBA bị giết hoặc được đặt thành Không có gì?

Function SaveContentToHTML (Rng as Range) 

     Dim FileForHTMLStorage As Object 
     Dim TextStreamOfHTML As Object 
     Dim TemporaryFileLocation As String 
     Dim TemporaryWorkbook As Workbook 

... 

     TemporaryWorkbook.Close savechanges:=False 
     Kill TemporaryFileLocation 
     Set TextStreamOfHTML = Nothing 
     Set FileForHTMLStorage = Nothing 
     Set TemporaryWorkbook = Nothing 

End Function 

tôi đã thực hiện một số tìm kiếm về vấn đề này và tìm thấy rất ít ngoài làm thế nào để làm điều đó, và trong một bài diễn đàn a statement that no local variables need to be cleared, kể từ khi họ ngừng tồn tại tại End Sub. Tôi đoán, dựa trên mã ở trên, điều đó có thể không đúng tại End Function hoặc trong các trường hợp khác mà tôi chưa gặp phải.

Vì vậy, câu hỏi của tôi nắm này:

  • Có nơi nào đó trên web mà giải thích khi nào và tại sao cho dọn dẹp biến, và tôi chỉ không tìm thấy nó?

Và nếu không có thể ai đó ở đây xin giải thích ...

  • Khi là biến dọn dẹp cho Excel VBA cần thiết và khi nó không phải là?
  • Và cụ thể hơn ... Có sử dụng biến cụ thể (biến công cộng? Biến được xác định chức năng không?) Vẫn được tải trong bộ nhớ lâu hơn so với số người đăng ký và có thể gây rắc rối nếu tôi không xóa lên sau bản thân tôi?

Trả lời

31

VB6/VBA sử dụng cách tiếp cận xác định đối với các đối tượng phá hủy. Mỗi đối tượng lưu trữ số lượng tham chiếu đến chính nó. Khi con số đạt đến số không, đối tượng sẽ bị hủy.

Biến đối tượng được đảm bảo để được làm sạch (đặt thành Nothing) khi chúng vượt quá phạm vi, điều này làm giảm bộ đếm tham chiếu trong đối tượng tương ứng của chúng. Không yêu cầu hành động thủ công.

Chỉ có hai trường hợp khi bạn muốn một dọn dẹp rõ ràng:

  1. Khi bạn muốn một đối tượng bị phá hủy trước khi biến nó đi ra khỏi phạm vi (ví dụ, thủ tục của bạn sẽ mất thời gian dài để thực thi, và đối tượng nắm giữ một tài nguyên, vì vậy bạn muốn hủy bỏ đối tượng càng sớm càng tốt để giải phóng tài nguyên).

  2. Khi bạn có tham chiếu vòng tròn giữa hai hoặc nhiều đối tượng.

    Nếu objectA cửa hàng một tài liệu tham khảo để objectB, và objectB cửa hàng một tham chiếu đến objectA, hai đối tượng sẽ không bao giờ bị phá hủy, trừ khi bạn phanh chuỗi bằng cách thiết lập một cách rõ ràng objectA.ReferenceToB = Nothing hoặc objectB.ReferenceToA = Nothing.

Đoạn mã bạn hiển thị không đúng. Không cần dọn dẹp thủ công. Nó thậm chí còn có hại để làm sạch thủ công, vì nó cung cấp cho bạn một số false sense of more correct code.

Nếu bạn có một biến ở cấp lớp, nó sẽ được làm sạch/bị phá hủy khi cá thể lớp bị hủy. Bạn có thể phá hủy nó sớm hơn nếu bạn muốn (xem mục 1.).

Nếu bạn có biến ở cấp mô-đun, nó sẽ được làm sạch/hủy khi chương trình của bạn thoát (hoặc, trong trường hợp VBA, khi dự án VBA được đặt lại). Bạn có thể phá hủy nó sớm hơn nếu bạn muốn (xem mục 1.).

Cấp truy cập của một biến (công khai và riêng tư) không ảnh hưởng đến thời gian sống của nó.

+1

Cảm ơn GSerg, giải thích này rõ ràng và súc tích và mang lại cho tôi ý thức tốt hơn cho quản lý biến. Một câu hỏi bổ sung: bạn nói "cấp truy cập của biến không ảnh hưởng đến tuổi thọ của nó". Bạn có biết nếu tuổi thọ đó bị giới hạn bởi khi một giá trị được đặt đầu tiên bởi mã đang hoạt động (bắt đầu) và khi mã mã đạt đến thẻ 'End' (kết thúc)? Hay nó kết thúc khi dự án reset? Tôi đã thử nghiệm lý thuyết này bằng cách đặt giá trị của một biến công khai bị mờ trong một mô-đun khác, nhưng biến không bao giờ xuất hiện trong cửa sổ cục bộ, vì vậy tôi không thể quan sát khi nó giảm xuống. –

+0

@KarlRookey Công khai và riêng tư khác với cấp độ lớp so với cấp thủ tục. Công cộng vs tư nhân không ảnh hưởng đến thời gian cuộc sống. Cấp độ lớp nghĩa là cuộc sống biến đổi miễn là lớp học sống. Cấp độ mô-đun có nghĩa là cuộc sống biến miễn là dự án không được đặt lại. Lưu ý rằng "cuộc sống" và "chứa một cái gì đó" không phải là synonims. Biến có thể sống và chứa 'Nothing'. – GSerg

3

VBA sử dụng bộ thu gom rác được triển khai bởi reference counting.

Có thể có nhiều tham chiếu đến một đối tượng cụ thể (ví dụ: Dim aw = ActiveWorkbook tạo tham chiếu mới cho Sổ làm việc hoạt động), do đó trình thu thập rác chỉ dọn dẹp đối tượng khi rõ ràng không có tham chiếu nào khác. Đặt thành Không có gì là cách rõ ràng để giảm số lượng tham chiếu. Số đếm được giảm xuống hoàn toàn khi bạn thoát khỏi phạm vi.

Nói đúng ra, trong các phiên bản Excel hiện đại (2010+) thiết lập để Không có gì là không cần thiết, nhưng có vấn đề với các phiên bản cũ của Excel (mà cách giải quyết là để thiết lập một cách rõ ràng)