亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Excel VBA變量何時應被殺死或設置為Nothing?

Excel VBA變量何時應被殺死或設置為Nothing?

不負相思意 2019-12-04 09:58:53
在過去的兩年中,我一直在自學Excel VBA,我認為有時在代碼段的末尾處理變量是適當的。例如,我看過這是在Ron de Bruin的將Excel轉換為HTML的代碼中改編而成的: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 = NothingEnd Function我已經對此進行了一些搜索,發現除如何執行之外幾乎沒有發現,并且在一個論壇中發表了一個聲明,無需清除任何局部變量,因為它們不再存在于End Sub。根據以上代碼,我猜測在End Function或在其他情況下我可能沒有遇到過這種情況。所以我的問題可以歸結為:網絡上是否有什么地方解釋了何時以及為何進行變量清除,而我只是沒有找到它?如果沒有人在這里,請解釋一下...什么時候需要清除Excel VBA的變量,何時不需要?更具體地說,...是否有特定的變量用法(公共變量或函數定義的變量?)在內存中的保存時間比subs更長,因此如果我不自己清理,可能會造成麻煩?
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

VB6 / VBA使用確定性方法存儲對象。每個對象存儲對其自身的引用數量。當數字達到零時,對象將被銷毀。

當對象變量Nothing超出范圍時,保證將其清除(設置為),這將減少其各自對象中的引用計數器。無需手動操作。

當您需要顯式清理時,只有兩種情況:

  1. 當您要在對象的變量超出范圍之前對其進行銷毀時(例如,您的過程將花費很長時間執行,并且該對象擁有資源,因此您希望盡快銷毀該對象以釋放對象)資源)。

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

    如果objectA存儲objectBobjectB引用了objectA這兩個對象,則除非通過顯式設置objectA.ReferenceToB = Nothing或制動鏈,否則這兩個對象將永遠不會被破壞objectB.ReferenceToA = Nothing。

您顯示的代碼段是錯誤的。無需手動清理。進行手動清理甚至有害,因為這會使您對更正確的代碼有錯誤的認識。

如果在類級別具有變量,則在銷毀類實例時將清除/銷毀該變量。您可以根據需要提前銷毀它(請參閱第項1.)。

如果在模塊級別具有變量,則在程序退出時(或在VBA情況下,當VBA項目重置時)將清除/銷毀該變量。您可以根據需要提前銷毀它(請參閱第項1.)。

變量的訪問級別(公共或私有)不會影響其生存時間。


查看完整回答
反對 回復 2019-12-04
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

VBA使用通過引用計數實現的垃圾收集器。


一個給定對象可以有多個引用(例如,Dim aw = ActiveWorkbook創建對Active Workbook的新引用),因此,垃圾收集器僅在明確沒有其他引用時才清除該對象。設置為Nothing是減少引用計數的一種明確方法。退出范圍時,計數將隱式遞減。


嚴格來說,在現代Excel版本(2010+)中,沒有必要將“無”設置為“空”,但是較早版本的Excel存在一些問題(為此必須明確設置解決方法)


查看完整回答
反對 回復 2019-12-04
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

我至少有一種情況不會自動清除數據,最終將導致“內存不足”錯誤。在用戶窗體中,我有:


Public mainPicture As StdPicture

...

mainPicture = LoadPicture(PAGE_FILE)

銷毀UserForm后(Unload Me),mainPicture未取消分配為中加載的數據分配的內存。我必須添加一個明確的


mainPicture = Nothing

在終止事件中。


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 1808 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號