1

在下面的循环中,我将一个类对象添加到另一个类对象内的集合中,该类对象本身就在一个集合中。

    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
4

3 回答 3

3

因此,解决方案是在循环之外实例化机会,然后每次重新初始化,如下所示:

Set opportunity = New ClmOpportunity
于 2012-08-31T23:51:39.087 回答
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
于 2012-09-01T00:06:44.107 回答
0

您总是添加相同的 ClmOpportunity 对象,因为 Dim as New 仅实例化新对象一次,即使在循环内使用也是如此。

在循环内创建新对象的正确方法是:

For ...

  Dim opportunity As ClmOpportunity
  Set opportunity = New ClmOpportunity

Next
于 2012-09-02T05:22:42.567 回答