使用 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 集合的主要内容,如果未能解决你的问题,请参考以下文章