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

最初のメッセージボックスには正しい商談名が表示されますが、2番目のメッセージボックスは、John Smithがコレクションの最初にある場合でも、追加された最後の商談に設定されます。

したがって、所有者が2人いる場合、機会1のジョンスミスと機会2のメアリールーの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

Dim as Newは、サイクル内で使用された場合でも、新しいオブジェクトを1回だけインスタンス化するため、常に同じClmOpportunityオブジェクトを追加しています。

サイクル内で新しいオブジェクトを作成する正しい方法は次のとおりです。

For ...

  Dim opportunity As ClmOpportunity
  Set opportunity = New ClmOpportunity

Next
于 2012-09-02T05:22:42.567 に答える