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

在VBA中初始化对象的正确方法是什么?,vba,excel,Vba,Excel,我有一个通过循环添加到数组的自定义对象。问题是当我像这样初始化对象时: Dim CallNum As New Lib_CallNum 在循环中添加的最后一个对象将覆盖在循环过程中添加的所有其他对象。所以我会得到一个数组,里面装满了一堆相同的对象。要解决此问题,我必须将初始化对象的方式更改为: Dim CallNum As Lib_CallNum Set CallNum = New Lib_CallNum 但我不确定为什么第一次初始化不起作用。那么这两套代码之间的区别是什么呢 根据我的经验,我

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

Dim CallNum As New Lib_CallNum
在循环中添加的最后一个对象将覆盖在循环过程中添加的所有其他对象。所以我会得到一个数组,里面装满了一堆相同的对象。要解决此问题,我必须将初始化对象的方式更改为:

Dim CallNum As Lib_CallNum
Set CallNum = New Lib_CallNum
但我不确定为什么第一次初始化不起作用。那么这两套代码之间的区别是什么呢

根据我的经验,我仍然认为您的方法不太正确,尽管我不确定,因为我从未见过您完成的代码。您应该有如下内容:

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开发。但我认为你的问题可能在于从不把它设为零。但不确定。

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

要演示这一点,请在
Lib_CallNum
类初始化定义中添加一个部分:

Private Sub Class_Initialize()
    Debug.Print "Initialise Lib_CallNum"
    ' ...
End Sub
并运行原始代码。初始化将只报告一次。从那时起,您将多次向数组中添加相同的实例


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

这里还值得一提的是,使用
Dim obj作为新的[对象类型]
语法可能会导致销毁对象的问题,如果您可能希望手动销毁对象或使用循环对象引用,这基本上不是一个好主意。我建议你养成习惯,总是使用两行语法来创建对象,这样你就可以知道什么时候以及如何创建和销毁你的对象。