2013-09-26 72 views
20

我在過去兩年中一直在教自己的Excel VBA,並且我有這樣的想法,即在代碼段末尾處理變量有時是適當的。舉例來說,我已經看到了它在該位改編自Ron de Bruin's code for transferring Excel to HTML完成:什麼時候應該將Excel VBA變量殺死或設置爲Nothing?

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 

我已經做了這方面的一些搜索和發現以後如何做到這一點非常少,而在一個論壇上發帖a statement that no local variables need to be cleared,因爲它們不再存在於End Sub。我猜根據上面的代碼,在End Function或其他我沒遇到過的情況下可能不是這樣。

所以我的問題歸結爲:

  • 有沒有什麼地方解釋的時候,爲什麼變量清理在網絡上,我只是還沒有找到它?

如果不是有人可以在這裏解釋一下......

  • 當是爲Excel VBA變量清理必要的,當它是不是?
  • 更具體地說......是否有特定變量的用途(公共變量? 功能定義的變量?)仍然存在加載到內存更長的時間比 潛艇做的,爲此可能會引起麻煩,如果我不乾淨 起來在我自己後?

回答

31

VB6/VBA用途確定性的方法去掉物體。每個對象存儲對自身的引用數量。當數字達到零時,對象被銷燬。

當超出範圍時,保證對象變量被清除(設置爲Nothing),這會減少其各自對象中的引用計數器。不需要手動操作。

  1. 當你需要它的變量超出範圍之前被銷燬的對象(例如,你的程序是要多久的時間:

    當你想要一個明確的清理有隻有兩種情況執行,並且該對象擁有一個資源,因此您想盡快銷燬該對象以釋放該資源)。

  2. 當您在兩個或多個對象之間有循環引用時。

    如果objectA存儲引用objectB,並objectB商店objectA參考,這兩個對象將永遠不會銷燬,除非你剎車鏈條式設置objectA.ReferenceToB = NothingobjectB.ReferenceToA = Nothing

你顯示的代碼片段是錯誤的。不需要手動清理。做手動清理甚至是有害的,因爲它給你一個false sense of more correct code

如果您在類級別有一個變量,那麼當類實例被破壞時它將被清除/銷燬。如果您願意,可以提前銷燬它(請參閱項目1.)。

如果在模塊級別有一個變量,當程序退出時(或者在VBA的情況下,VBA項目被重置時)它將被清除/銷燬。如果您願意,可以提前銷燬它(請參閱項目1.)。

變量(公有與私有)的訪問級別不會影響其使用期限。

+1

謝謝GSerg,這個解釋清晰簡潔,給了我一個更好的變量管理意義。還有一個問題:你說「變量的訪問級別不影響它的生命週期」。你知道當一個值首先由活動代碼設置(start)並且代碼到達'End'標籤(完成)時,這個生命週期是否受到限制?或者當項目重置時它結束了嗎?我試着通過設置在另一個模塊中變暗的公共變量的值來測試這個理論,但變量從未出現在本地窗口中,所以我無法觀察它何時下降。 –

+0

@KarlRookey公有vs私有不同於級別與程序級別。公共與私人不會影響生活時間。只要班級生活,班級就意味着變化的生活。只要項目未重置,模塊級別就意味着可變壽命。請注意,「生命」和「包含某物」不是synonims。變量可以存在幷包含「Nothing」。 – GSerg

3

VBA使用由reference counting實現的垃圾回收器。

可以有多個對給定對象的引用(例如,Dim aw = ActiveWorkbook創建對Active Workbook的新引用),因此只有在清除了沒有其他引用的情況下,垃圾回收器纔會清理對象。設置爲Nothing是遞減引用計數的明確方式。退出範圍時,計數會隱式遞減。

嚴格地說,在現代版本的Excel(2010+)設置爲Nothing是沒有必要的,但也有與舊版本的Excel的問題(其解決方法是明確設置)

相關問題