PDA

Vollständige Version anzeigen : Grundlagenfrage Collections: Werte in Collection ändern


krisjugisto
27.03.2012, 13:41
Hallo,

ich habe mich mal an Collections gewagt, doch scheitere ich derzeit daran, einen Wert eines Elements in der Collection dauerhaft zu ändern. In meinen Dokumentationen finde ich nichts dazu. Ein Beispiel:

Sub Test()

Dim col As New Collection, var As Variant

col.Add (1)
col.Add (2)
col.Add (3)

'Step 1 Result 1, 2, 3
For Each var In col
Debug.Print var
Next

'Step 2 Result 2, 3, 4
For Each var In col
var = var + 1
Debug.Print var
Next

'Step 3 Result 1, 2, 3
For Each var In col
Debug.Print var
Next

End Sub

Wenn ich dies nun ausführe erhalte ich im ersten Schritt die erwartete Ausgabe von 1,2,3 und im zweiten die von 2,3,4. Aber warum im dritten Schritt wieder 1,2,3? Ich hätte die Änderungen aus dem zweiten Schritt gerne dauerhaft.

Was habe ich übersehen?

Danke und Grüße

ebs17
27.03.2012, 14:46
Eine Collection hat nach Hilfe nur die Methoden Add, Remove und Item. Edit ist da nicht dabei. Du verwendest, da ohne Angabe, die Item-Methode (Anzeigen des Wertes).

Zum Ändern müsstest Du einen Eintrag löschen und dann neu anlegen. Dazu müsstest Du zusätzlich einen Key verwenden, um gezielt bestimmte Einträge ansprechen zu können, oder Du musst bei der Indexauflistung ordentlich aufpassen.
Sub Test_9()

Dim col As VBA.Collection, var As Variant, i As Long
Set col = New VBA.Collection

col.Add 11, "a"
col.Add 22, "b"
col.Add 33, "e"

'Step 1 Result 1, 2, 3
For Each var In col
Debug.Print var
Next
Debug.Print
' 2. Element anzeigen
Debug.Print col.Item(2)
' Element mit Key "e" anzeigen
Debug.Print col.Item("e")

' Element für Key "b" ändern
col.Remove "b"
col.Add 55, "b"
Debug.Print
For i = 1 To col.Count
Debug.Print col.Item(i)
Next
End Sub

krisjugisto
27.03.2012, 14:54
Danke, ich hatte es schon befürchtet. Durch Deine Erklärung ist mir nun auch klar, warum in Schritt 2 var nach der Änderung auch den neuen Wert enthält: Ich habe lokal var geändert, nicht, wie ich dachte, das Item, dessen Wert bis dahin in var lag. Der aber nun überschrieben wurde.

Die Lösung mit dem Entfernen und Neueinfügen schwebte mir auch schon vor, jedoch wollte ich vorher sicherstellen, dass es nicht einfacher geht.

Noch mal: Danke Dir.

EDIT: Ortho