【问题标题】:Populate VBA Collection with Custom Objects using Collection.Add使用 Collection.Add 使用自定义对象填充 VBA 集合
【发布时间】: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 编辑器中添加了属性声明。我复制/粘贴了那里列出的内容。

【问题讨论】:

    标签: vba collections object for-loop


    【解决方案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,我在上面的描述中添加了更多代码。也许你可以告诉我你用什么代替了我的事务类?也许我可以尝试让您的代码最终发挥作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多