Excel VBA objet constructeur et le destructeur

j'ai besoin de faire quelques objets personnalisés en VBA qui devront font référence les uns aux autres et j'ai quelques questions.

premier-Comment fonctionnent les constructeurs d'objets en VBA? Existe-il des constructeurs?

<!-Deuxièmement, y a-t-il des destructeurs? Comment VBA gère-t-il la fin du cycle de vie de l'objet? Si j'ai un objet qui fait référence à d'autres (et c'est leur seule référence), puis-je le mettre à zéro et en faire quelque chose ou cela pourrait-il produire des fuites de mémoire?

ce quasi-OO genre de choses est juste un peu irritant.

22
demandé sur ashleedawg 2009-02-21 00:37:37

5 réponses

VBA supporte les Modules de classe. Ils ont un événement Class_Initialize qui est le constructeur et un Class_Terminate qui est le destructeur. Vous pouvez définir des propriétés et des méthodes. Je crois que VBA utilise le comptage de référence pour le cycle de vie des objets. C'est pourquoi vous voyez beaucoup de Réglez = Rien dans ce type de code. Dans votre exemple, je pense qu'il ne fuira pas de mémoire. Mais vous devez faire attention aux références circulaires.

21
répondu Will Rickards 2009-02-20 21:44:55

Si vous faites un module de classe dans VBA, pour le constructeur, vous pouvez utiliser:

Private Sub class_initialize()
....
End Sub

il n'y a pas de destructeurs, puisque VBA est un ramassage de déchets. Assurez-vous de nettoyer toutes les références circulaires, et vous devez éviter d'éventuelles fuites de mémoire.

16
répondu Colin 2009-02-20 21:48:40

Cela fait longtemps que je ne les ai pas utilisées, mais je ne pense pas que vous puissiez passer des paramètres dans les constructeurs. Je pense que c'était l'un des problèmes que j'ai rencontrés, mais je rencontrais tellement de problèmes sur la façon dont ces cours fonctionnaient et comment je m'attendais à ce qu'ils fonctionnent que je me rappelle peut-être mal.

8
répondu greg 2009-02-20 21:52:01

il existe Class_Terminate qui est à peu près le même que destructor.

6
répondu TechnoS 2010-06-02 17:04:44

Vous pouvez le vérifier en écrivant ce 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

et écrivez ce code dans un module:

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

et ensuite vous verrez les logs dans la fenêtre de débogage. Mais avec ce test, nous pouvons voir que class_initialize n'est pas appelé lorsque vous créez l'instance (à nouveau), mais seulement au premier appel d'une methode dans l'instance ou de l'obtention d'un var valeur.

Le class_terminate semble être appelé à la fin du testModule (si une instance est imitée sur cet objectworkbook, terminer est "jamais" appelé... probablement seulement quand le classeur est fermé ou quand Excel est fermé)

0
répondu Elloco 2017-03-01 12:05:08