使用 Collection.Add 使用自定义对象填充 VBA 集合

Posted

技术标签:

【中文标题】使用 Collection.Add 使用自定义对象填充 VBA 集合【英文标题】:Populate VBA Collection with Custom Objects using Collection.Add 【发布时间】:2011-03-14 09:27:54 【问题描述】:

我正在尝试在 For 循环中通过 sampleCollection.Add 添加自定义对象(事务)。

如果我将字符串而不是对象添加到集合中,则代码有效。

Public Function PopCollection()
    Dim sampleCollection As New Collection
    Dim objTrans As New Transaction
    Dim objTrans2 As New Transaction


    '********** SETUP ARRAY FOR LOOP *************
    Dim arrA(0 To 1) As String
    arrA(0) = "Description 1"
    arrA(1) = "Description 2"


    '********** POPULATE COLLECTION *************
    For n = 0 To 1
        objTrans.DESC = arrA(n)
        Call sampleCollection.Add(objTrans)
    Next n


    '********** ITERATE THROUGH COLLECTION *************
    For n = 1 To sampleCollection.Count
        Set objTrans2 = sampleCollection.Item(n)
        Debug.Print n & " - " & objTrans2.DESC
    Next n

End Function

此代码底部的Debug.Print n & " - " & objTrans2.DESC 行输出了两次“Description 2”。我希望它输出“描述 1”和“描述 2”。

这是Transaction类中的信息:

Public PTXN As Integer
Public ACCTID As Integer
Public CHECKNUM As String
Public DESC As String
Public STATUS As String
Public TRANSACTIONDATE As String
Public SPLIT_DESC As String
Public SPLIT_AMT As Single
Public SPLIT_CATEGORY As Integer

我只在 Excel 的 VB 编辑器中添加了属性声明。我复制/粘贴了那里列出的内容。

【问题讨论】:

【参考方案1】:

无法使用 Collection.add 使用自定义对象填充 VBA 集合

代码两次输出“描述 2”

简单来说,这样做总是更好:

    Dim FooCollection As Collection
    Set FooCollection = New Collection
    
    Dim FooClass As classFoo
    Set FooClass = New classFoo
    FooCollection.Add FooClass

而不是:

    Dim FooCollection As New Collection
    etc

正如我最近发现的那样,后者会导致非常微妙且不那么明显的问题,并且可能不会产生任何错误。

【讨论】:

【参考方案2】:

更简单的版本是将 n=0 设置为 SampleCollection.Count,因为数组的索引以 0 开头,而您的 n 以 1 开头...

For n = 0 To sampleCollection.Count
    Set objTrans = sampleCollection.Item(n)
    Debug.Print n & " - " & objTrans.DESC
Next n

【讨论】:

【参考方案3】:

您需要创建一个新的 objTrans 实例。您正在做的是将 DESC 设置为 Description 1,添加到集合中,然后将 DESC 更改为 Description 2(不创建新的 objTrans 实例),然后再次将同一实例添加到集合中。以下是我的做法。

Public Function PopCollection()

    Dim sampleCollection As Collection
    Dim objTrans As Transaction
    Dim arrA As Variant
    Dim n As Long

    arrA = Array("Description 1", "Description 2")
    Set sampleCollection = New Collection

    For n = LBound(arrA) To UBound(arrA)
        Set objTrans = New Transaction
        objTrans.DESC = arrA(n)
        sampleCollection.Add objTrans
    Next n

    For n = 1 To sampleCollection.Count
        Set objTrans = sampleCollection.Item(n)
        Debug.Print n & " - " & objTrans.DESC
    Next n

End Function

【讨论】:

迪克,成功了!!!谢谢!我花了几个小时试图弄清楚这一点。感谢您的解释和清理代码...我喜欢看看其他人如何更新我的代码。【参考方案4】:

稍加修改的表单(没有 Transaction 类)按我的预期工作。我相信有一个错误是你的 Transaction 类。可以贴一下代码吗?

【讨论】:

Mitch,我在上面的描述中添加了更多代码。也许你可以告诉我你用什么代替了我的事务类?也许我可以尝试让您的代码最终发挥作用。

以上是关于使用 Collection.Add 使用自定义对象填充 VBA 集合的主要内容,如果未能解决你的问题,请参考以下文章

实训16 2018.04.16

sonata_type_collection btn_add 不工作

关于集合

使用自定义适配器的自定义对象

Quickblox:使用自定义对象登录 (Android)

使用内部对象的实例变量的值对自定义对象数组进行排序