2009-02-20 208 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)

称为
相关问题