2009-02-20 471 views
22

我需要在VBA中創建一些需要相互引用的自定義對象,並且我有一些問題。Excel VBA對象構造函數和析構函數

首先 - 對象構造函數如何在VBA中工作?有沒有構造函數?

其次 - 是否存在析構函數? VBA如何處理對象生命週期的結束?如果我有一個引用別人的對象(這是他們唯一的引用),那麼我可以將它設置爲Nothing,並且可以使用它或可以產生Memeory泄漏?

這個準OO的東西只是有點刺激。

+1

要將變量添加到構造函數中,請參見[此StackOverflow問題] [1]。 [1]:http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash 2014-03-19 14:51:24

回答

21

VBA支持類模塊。他們有一個Class_Initialize事件是構造函數,而一個Class_Terminate是析構函數。您可以定義屬性和方法。 我相信VBA在對象生命週期中使用引用計數。這就是爲什麼你在這種類型的代碼中看到很多Set whatever = Nothing的原因。在你的例子中,我認爲它不會泄漏任何內存。但是你需要小心循環引用。

16

如果你正在在VBA類模塊,用於構造函數,你可以使用:

Private Sub class_initialize() 
.... 
End Sub 

沒有析構函數,因爲VBA是垃圾收集。只要確保清理任何循環引用,並且應該避免任何可能的內存泄漏。

+9

這是不正確的,沒有一個析構函數。它是Class_Terminate – RubberDuck 2014-04-25 20:06:39

8

我已經使用它們已經有一段時間了,但我認爲你不能將參數傳遞給構造函數。我認爲那是我遇到的問題之一,但我遇到了很多關於這些課程是如何工作的問題,以及我如何期望他們工作,我可能會誤解。

+2

你是對的。你不能。 – Tmdean 2009-02-20 22:17:18

6

存在Class_Terminate,它幾乎與析構函數相同。

0

我確認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)

稱爲