我尝试用在循环中创建的对象填充一个数组,如下所示。问题是所有细胞最终似乎都有相同的对象。解释可能是 obj
不是循环的局部变量。
Sub foo()
Dim Arr(1 To 3) As Class1
Dim i As Integer
For i = 1 To 3
Dim obj As New Class1
obj.name = i
Set Arr(i) = obj
Next
For i = 1 To 3
Debug.Print Arr(i).name
Next
End Sub
令人惊讶的是,输出是
3
3
3
我也曾尝试删除 Set
,取而代之的是 Arr(i) = obj
。这会导致 Object variable or with block variable not set
。
最佳答案
您的问题是对象的声明。
Dim foo as New bar
这叫做 self-assigned declaration是什么让设置一个新对象成为可选的。如果您调用一个对象成员,但它尚未设置好,它就会被创建(隐式Set foo = New bar
)。但是当你已经创建了一个实例时(第一次调用obj.name
)。那个被重用并且相同的引用被存储三次用于相同的对象实例。这就是为什么数组中的所有元素都返回相同的值,因为它们是相同的对象实例,而不是三个不同的对象。
所以不要在声明中使用New
,那么你总是需要一个Set foo
并且可以在Nothing
上检查对象实例。
您的代码的第二个问题是,将对象分配给数组是因为从数组中删除元素很容易出错,而未删除的引用会导致未处理但未使用的对象。
对象(-references)的首选存储是Collection
。
Sub foo()
Dim ObjCollection as Collection
Set ObjCollection = New Collection
Dim i As Integer
For i = 1 To 3
Dim obj As bar
Set obj = New bar
obj.name = i
ObjCollection.Add obj
Next
For i = 1 To 3
Debug.Print ObjCollection(i).name
Next
End Sub
关于excel - 在 VBA 中的循环中将对象分配给数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754713/