Les données d'object VBA sont écrites en plus dans la collecte

Dans la boucle ci-dessous, j'ajoute un object de class à une collection dans un autre object de class, qui est lui-même dans une collection.

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 

La première boîte de message présente le nom d'opportunité correct, mais la deuxième boîte de message est définie pour la dernière opportunité qui a été ajoutée, même si John Smith est le premier dans la collection.

Donc, si j'ai deux propriétaires, John Smith avec l'opportunité 1 et Mary Lou avec l'opportunité 2 de sortir de la deuxième boîte de message sera l'occasion 2 pour les deux records.

Mais le premier message sera l'opportunité 1 et 2 comme prévu.

C'est le code du module de class Propriétaire:

 Public name As Variant Public opportunities As New collection Public Function addOpportunity(opp As ClmOpportunity) Dim OppID As Ssortingng OppID = opportunities.count + 1 opp.ID = OppID opportunities.Add opp, OppID End Function 

Donc, la solution à cela était d'instancier l'opportunité en dehors de la boucle, puis réinitialiser à chaque fois comme ceci:

 Set opportunity = New ClmOpportunity 

Vous n'ajoutez certainement pas plusieurs copys de l'object "même" opportunité? Difficile à dire sans la boucle complète. Si vous vérifiez tous les éléments de la collection, ils ont tous le même nom?

Ce code montre le même comportement si vous commentez la ligne marquée …

 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 

Vous ajoutez toujours le même object ClmOpportunity, car Dim as New instancie un nouvel object une seule fois, même s'il est utilisé dans un cycle.

Une façon correcte de créer un nouvel object à l'intérieur du cycle est:

 For ... Dim opportunity As ClmOpportunity Set opportunity = New ClmOpportunity Next