在下面的循环中,我将一个Class Object添加到另一个类对象中的一个集合中,该对象本身位于一个集合中。
Dim opportunity As New ClmOpportunity
opportunity.name = name
owners.item(overallOwner).addOpportunity opportunity
MsgBox opportunity.name
Next i
MsgBox owners("John Smith").opportunities(1).name
第一个消息框显示正确的商机名称,但第二个消息框设置为添加的最后一个商机,即使John Smith是集合中的第一个。
因此,如果我有两个所有者,John Smith有机会1,Mary Lou有机会2,那么第二个消息框中的输出将是两个记录的机会2。
但第一条消息将是机会1和2,如预期的那样。
这是Owner类模块中的代码:
Public name As Variant
Public opportunities As New collection
Public Function addOpportunity(opp As ClmOpportunity)
Dim OppID As String
OppID = opportunities.count + 1
opp.ID = OppID
opportunities.Add opp, OppID
End Function
答案 0 :(得分:3)
所以解决这个问题的方法是在循环之外实例化机会,然后每次重新初始化:
Set opportunity = New ClmOpportunity
答案 1 :(得分:2)
你肯定不会添加“同一”机会对象的多个副本?没有完整的循环很难分辨。如果检查集合中的所有项目,它们都具有相同的名称吗?
如果您注释掉标记的行...
,此代码会显示相同的行为Sub Tester()
Dim col As New Collection
Dim o As clsTest 'has just a "name" property
Set o = New clsTest
o.name = "obj1"
col.Add o, "key1"
'compare debug output with the next line
' commented/uncommented
Set o = New clsTest
o.name = "obj2"
col.Add o, "key2"
Debug.Print col(1).name, col(2).name
End Sub
答案 2 :(得分:0)
您总是添加相同的ClmOpportunity对象,因为即使在循环中使用,Dim as New也只实例化一次新对象。
在循环内创建新对象的正确方法是:
For ...
Dim opportunity As ClmOpportunity
Set opportunity = New ClmOpportunity
Next