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

时间:2010-07-11 02:48:22

标签: vba collections object for-loop

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

我是如何尝试通过For循环中的sampleCollection.Add添加自定义对象(Transaction)的?如果我将字符串添加到集合而不是对象,则代码可以很好地工作。

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

对newbee的任何帮助表示赞赏!

~~~~~~~~~~~~~~~~~~~~~~~

作为对Mitch的回应的回应,以下是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编辑器中添加了属性声明...所以我复制/粘贴了那里列出的内容。

4 个答案:

答案 0 :(得分:6)

你需要创建一个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

答案 1 :(得分:1)

稍微修改过的表单(没有Transaction类)可以按我的意思运行。我相信你的Transaction类有一个错误。你可以为它发布代码吗?

答案 2 :(得分:0)

更简单的版本是将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 :(得分:0)

无法使用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

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