在VBA中初始化对象的正确方法是什么?

时间:2012-04-02 02:44:36

标签: vba excel-vba excel

我有一个自定义对象,我通过循环添加到数组中。问题是当我初始化这样的对象时:

Dim CallNum As New Lib_CallNum

循环中添加的最后一个对象将覆盖循环期间添加的所有其他对象。所以我最终会得到一个充满了大量相同对象的数组。为了解决这个问题,我不得不改变初始化对象的方式:

Dim CallNum As Lib_CallNum
Set CallNum = New Lib_CallNum

但我不确定为什么第一次初始化不起作用。那么两组代码有什么区别?

2 个答案:

答案 0 :(得分:10)

循环内的Dim实际上并未在每次迭代中执行。它仅在第一次遇到变量时执行。

为了证明这一点,请在Lib_CallNum类初始化定义中添加一个部分:

Private Sub Class_Initialize()
    Debug.Print "Initialise Lib_CallNum"
    ' ...
End Sub

并运行您的原始代码。初始化仅报告一次。从那时起,您将多次向阵列添加相同的实例。

初始化新实例对象的正确方法是@Doug告诉你的,Set ... = New ...

答案 1 :(得分:3)

根据我的经验on your previous post,我仍然认为你没有采用正确的方法,尽管不确定,因为从未见过你完成的代码。你应该有类似的东西:

Function Something
Dim CallNum as Lib_CallNum
...
Do While SomeCondition
   Set CallNum = New Lib_CallNum
   'do some stuff
   Set CallNum = Nothing
Loop
Return Whatever
End Function

换句话说,你应该在函数的顶部声明对象 - 不是在循环中重复 - 并在循环中实例化(并将其设置为Nothing)。

如果你谷歌,你可以找到解释为什么不在其声明中实例化一个对象。专业Excel开发has a good one。但我认为你的问题可能是从未将它设置为Nothing。但不确定。