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.
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.
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.
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.
il existe Class_Terminate qui est à peu près le même que destructor.
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é)