2009-02-20 8 views
22

Ich muss einige benutzerdefinierte Objekte in VBA, die sich gegenseitig verweisen müssen und ich habe ein paar Probleme.Excel VBA Objekt Konstruktor und Destruktor

Erstens - wie funktionieren Objektkonstruktoren in VBA? Gibt es Konstrukteure?

Zweitens - gibt es Destruktoren? Wie behandelt VBA das Ende des Objektlebenszyklus? Wenn ich ein Objekt habe, das auf andere verweist (und dies ist ihre einzige Referenz), kann ich es dann auf Nothing setzen und damit fertig werden, oder könnte das zu Memoreys führen?

Dieses Quasi-OO Zeug ist nur ein bisschen irritierend.

+1

Informationen zum Hinzufügen von Variablen zum Konstruktor finden Sie in [diese StackOverflow-Frage] [1]. [1]: http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash

Antwort

21

VBA unterstützt Klassenmodule. Sie haben ein Class_Initialize-Ereignis, das der Konstruktor und eine Class_Terminate ist, die der Destruktor ist. Sie können Eigenschaften und Methoden definieren. Ich glaube, VBA verwendet Referenzzählung für Objektlebenszyklus. Aus diesem Grund sehen Sie in dieser Art von Code eine Menge Set = Nichts. In Ihrem Beispielfall denke ich, dass es keinen Speicher verlieren wird. Aber Sie müssen auf zirkuläre Referenzen achten.

16

Wenn Sie ein Klassenmodul in VBA machen, für den Konstruktor können Sie verwenden:

Private Sub class_initialize() 
.... 
End Sub 

Es gibt noch keine Destruktoren sind, da VBA Müll gesammelt ist. Stellen Sie sicher, dass Sie alle zirkulären Referenzen löschen, und vermeiden Sie mögliche Speicherlecks.

+9

Es ist nicht wahr, dass es keinen destructor ist. Es ist Class_Terminate – RubberDuck

8

Es ist eine Weile her, seit ich sie benutzt habe, aber ich glaube nicht, dass Sie Parameter in die Konstruktoren übergeben können. Ich denke, das war eines der Probleme, denen ich begegnete, aber ich stieß auf so viele Probleme, wie diese Klassen funktionierten und wie ich erwartete, dass sie funktionierten, was ich vielleicht falsch einschätzen würde.

+2

Sie haben Recht. Du kannst nicht. – Tmdean

+0

Kompliziertere Klassen haben oft "Start" -Funktionen und "objectStarted" -Zustandsvariablen, um dem Prinzip eines parametrisierten Konstruktors zu entsprechen. –

6

Es gibt Class_Terminate, das ist ziemlich genau dasselbe wie Destruktor.

0

Ich bestätige, dass class_initialize und class_terminate.

Sie können es durch dieses Testclass writting:

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 

Und diesen Code in einem Modul schreiben:

Sub test() 
    Dim myTestClass As New TestClass 
    Debug.Print myTestClass.testVar 
End Sub 

Und dann werden Sie Protokolle im Debug-Fenster. Aber mit diesem Test können wir sehen, dass class_initialize nicht aufgerufen wird, wenn Sie die Instanz (mit new) erstellen, sondern nur beim ersten Aufruf einer Methode in der Instanz oder beim Abrufen eines var -Werts.

Die Class_Terminate scheint am Ende der Testmodule aufgerufen werden (wenn eine Instanz auf Thisworkbook-Objekt maked wird, beenden wird „nie“ genannt ... wahrscheinlich nur, wenn die Arbeitsmappe geschlossen wird oder wenn Excel geschlossen ist)