excel - 在 VBA 中的循环中将对象分配给数组

标签 excel vba

我尝试用在循环中创建的对象填充一个数组,如下所示。问题是所有细胞最终似乎都有相同的对象。解释可能是 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/

相关文章:

excel - VBA:如果值在列表中,则删除行,遍历列表

sql - 使用 Excel 编辑电子商务数据库是否现实?

Excel VBA - 声明变量的不同方法

vba - 发送带有附件的电子邮件 ..VBA 代码

vba - VBA 中的循环和索引

excel - VBA - 网页抓取无法获取 HTMLElement insideText

c# - 如何在 Silverlight 中使用 OpenXml (Office)?

vba - 将下载的数据解析为更简单的结构

vba - 使用 SUMIFS 添加持续时间总是给出 00 :00:00

arrays - 存储数据的最佳方法是什么