VBA对象数据被过度写入集合中

时间:2012-08-31 23:26:40

标签: excel class vba object collections

在下面的循环中,我将一个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

3 个答案:

答案 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