Problems in copying a Collection to another and removing elementsfrom two Collections

D

deltaquattro

Hi,

two questions on Collections:

1. in VBA, the only way to copy the items (not just the references) of
a collection c1 to another collection c2 is to go through each element
of c1 with a For Each Next and Add each item to c2, right?

2. I have a collection c1 containing some objects to be deleted (the
ones for which the Defective property is True). I want to delete them
from c1 and at the same time to delete the objects in the same
position from another collection c2. See code below:

Sub RemoveDefectivesfromColns(c1 As Collection, c2 As Collection)
Dim obj as Object, I As Long

For I=1 to c1.Count
Set obj =c1(I)
If obj.Defective Then
c1.Remove I
c2.Remove I
End If
Next I
End Sub

Problems: number of elements in c1 and c2 is changing as the cycle
goes on, so sooner or later the Remove method will fail (because I
exceeds the number of remaining elements in c1 and c2). How can I
solve this? Also, is there a way to do this with a For Each In Next?
Would it be faster? Thanks,

Best Regards

deltaquattro











c1.Add Item:="woof"

Set c2=c1

makes
 
P

Peter T

Re 1.
Yes, that is assuming your collection refers to objects (well, there are
other ways but no need to go there).

Re 2.
Loop backwards
For I= c1.Count to 1 step -1

Regards,
Peter T
 
D

deltaquattro

Hi, Peter,

thanks for the answers:

1. yes I forgot to specify that I was referring to a collection of
objects. Which are the other way to do a "deep" copy which you are
referring to? Could you give me some details?

2. Oh, right, didn't think of that :) thanks!

Best Regards

Sergio
 
P

Peter T

Sorry I meant assuming *not* objects, VB/A does not provide a 'clone' method
of copying objects. It is though possible to assign an object to an object
variable knowing only the object-pointer to the object, IOW could store
merely the objPtr (a long) to each object then reassign to variables later
but I doubt useful for your purposes (involves memory copy and risky if not
done correctly).

You can easily assign an existing collection to a new collection variable,
eg
Set col1 = col2
however it remains the same collection object, add/remove to col1 and col2
reflects same.

If you want to store references to all your objects in the collection while
manipulating it in some other way, do exactly as you indicated in your OP.
Or if very large and you don't need the 'keys' probably faster to populate
an appropriately dimensioned and declared object array.

Regards,
Peter T



Hi, Peter,

thanks for the answers:

1. yes I forgot to specify that I was referring to a collection of
objects. Which are the other way to do a "deep" copy which you are
referring to? Could you give me some details?

2. Oh, right, didn't think of that :) thanks!

Best Regards

Sergio
 
P

Peter T

Sorry I meant assuming *not* objects, VB/A does not provide a 'clone' method
of copying objects. It is though possible to assign an object to an object
variable knowing only the object-pointer to the object, IOW could store
merely the objPtr (a long) to each object then reassign to variables later
but I doubt useful for your purposes (involves memory copy and risky if not
done correctly).

You can easily assign an existing collection to a new collection variable,
eg
Set col1 = col2
however it remains the same collection object, add/remove to col1 and col2
reflects same.

If you want to store references to all your objects in the collection while
manipulating it in some other way, do exactly as you indicated in your OP.
Or if very large and you don't need the 'keys' probably faster to populate
an appropriately dimensioned and declared object array.

Regards,
Peter T



Hi, Peter,

thanks for the answers:

1. yes I forgot to specify that I was referring to a collection of
objects. Which are the other way to do a "deep" copy which you are
referring to? Could you give me some details?

2. Oh, right, didn't think of that :) thanks!

Best Regards

Sergio
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top