我需要在VBA中創建一些需要相互引用的自定義對象,並且我有一些問題。Excel VBA對象構造函數和析構函數
首先 - 對象構造函數如何在VBA中工作?有沒有構造函數?
其次 - 是否存在析構函數? VBA如何處理對象生命週期的結束?如果我有一個引用別人的對象(這是他們唯一的引用),那麼我可以將它設置爲Nothing,並且可以使用它或可以產生Memeory泄漏?
這個準OO的東西只是有點刺激。
我需要在VBA中創建一些需要相互引用的自定義對象,並且我有一些問題。Excel VBA對象構造函數和析構函數
首先 - 對象構造函數如何在VBA中工作?有沒有構造函數?
其次 - 是否存在析構函數? VBA如何處理對象生命週期的結束?如果我有一個引用別人的對象(這是他們唯一的引用),那麼我可以將它設置爲Nothing,並且可以使用它或可以產生Memeory泄漏?
這個準OO的東西只是有點刺激。
VBA支持類模塊。他們有一個Class_Initialize事件是構造函數,而一個Class_Terminate是析構函數。您可以定義屬性和方法。 我相信VBA在對象生命週期中使用引用計數。這就是爲什麼你在這種類型的代碼中看到很多Set whatever = Nothing的原因。在你的例子中,我認爲它不會泄漏任何內存。但是你需要小心循環引用。
如果你正在在VBA類模塊,用於構造函數,你可以使用:
Private Sub class_initialize()
....
End Sub
沒有析構函數,因爲VBA是垃圾收集。只要確保清理任何循環引用,並且應該避免任何可能的內存泄漏。
這是不正確的,沒有一個析構函數。它是Class_Terminate – RubberDuck 2014-04-25 20:06:39
我已經使用它們已經有一段時間了,但我認爲你不能將參數傳遞給構造函數。我認爲那是我遇到的問題之一,但我遇到了很多關於這些課程是如何工作的問題,以及我如何期望他們工作,我可能會誤解。
你是對的。你不能。 – Tmdean 2009-02-20 22:17:18
存在Class_Terminate,它幾乎與析構函數相同。
我確認class_initialize和class_terminate。
您可以通過書面方式這TestClass的檢查:
Public testVar As Integer
Private Sub class_initialize()
Debug.Print "Class init"
testVar = 10
End Sub
Private Sub class_terminate()
Debug.Print "Class terminate"
End Sub
和模塊中編寫代碼:
Sub test()
Dim myTestClass As New TestClass
Debug.Print myTestClass.testVar
End Sub
,然後你會看到在調試窗口日誌。但是通過這個測試,我們可以看到,當您創建實例(使用new)時,不會調用class_initialize,而只會在實例的第一個方法調用或獲取var值時調用。
的class_terminate似乎在testModule結束(如果實例的ThisWorkbook對象maked,終止是「從不」叫......大概只有工作簿時關閉或當關閉Excel)
稱爲
要將變量添加到構造函數中,請參見[此StackOverflow問題] [1]。 [1]:http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash 2014-03-19 14:51:24