/ / Einträge in einem Wörterbuch haben alle den gleichen Wert, obwohl sie einzeln erstellt werden - Excel, Excel-VBA, VBA

Einträge in einem Wörterbuch haben alle den gleichen Wert, obwohl sie einzeln erstellt werden - Excel, Excel-VBA, VBA

Ich habe eine Excel-Tabelle für eine 1:n-Relationship

ID  value
----------
1   A
1   B
1   C
2   A
2   B
3   F
4   X
4   Z

Und ein Objekt (CValueMap) welche die Werte für eine gegebene ID speichern sollen:

Option Explicit

Public id As Integer
Public values As Collection

Ich lese die Excel-Tabelle, indem ich die Zeilen iteriere und den CValueMap (wenn es noch nicht in meinem Wörterbuch vorhanden ist) und füllen Sie die Werte.

Dim idCell As Range
Dim allValues As New Scripting.Dictionary
allValues.RemoveAll

For Each idCell In Range("id_value_table[ID]")
If Not allValues.Exists(idCell.value) Then
Dim newValueMap As New CValueMap
newValueMap.id = idCell.value
Set newValueMap.values = New Collection
allValues.Add idCell.value, newValueMap
End If

Dim valueMap As CValueMap
Set valueMap = allValues.Item(idCell.value)
valueMap.values.Add idCell.Offset(0, 1).value
Next idCell

Ich würde jetzt annehmen, dass ich 4 habe CValueMaps wo der erste hat ABC, der Zweite AB, der dritte F und der letzte XZ als Werte. Dies ist jedoch nicht der Fall, wie dieser Code zeigt:

"iterate allValues
Dim singleKey as Variant
For Each singleKey In allValues.Keys
Debug.Print singleKey & " has these values:"
Debug.Print "ID: " & allValues.Item(singleKey).id
Dim value As Variant
For Each value In allValues.Item(singleKey).values
Debug.Print "  " & value
Next value
Next singleKey

.

---------------OUTPUT:-------------------
1 has these values:
ID: 4
X
Z
2 has these values:
ID: 4
X
Z
3 has these values:
ID: 4
X
Z
4 has these values:
ID: 4
X
Z

Ich bin nicht wirklich sicher, wo ich falsch gelaufen bin. Von dem Verhalten, das ich angenommen habe gleich ValueMap wurde möglicherweise in geschrieben jeder Eintrag in der allValues Deutsch:. Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Ich habe jedoch vier verschiedene Wörter erstellt und sie richtig geladen, bevor ich den Deutsch: values Ich sehe nicht, wo das passiert sein könnte.

Antworten:

2 für die Antwort № 1

Objektunterricht für Sie - NOCH NIE benutzen Dim... As New... Sie können nicht steuern, wann oder ob Sie ein neues Objekt erhalten.

Einfache Änderungen an Ihrem Code erforderlich:

Dim idCell                As Range
Dim allValues             As Scripting.Dictionary
Dim newValueMap           As CValueMap

Set allValues = New Scripting.Dictionary
allValues.RemoveAll

For Each idCell In Range("id_value_table[ID]")
If Not allValues.Exists(idCell.value) Then
Set newValueMap = New CValueMap
newValueMap.id = idCell.value
Set newValueMap.values = New Collection
allValues.Add idCell.value, newValueMap
End If

Dim valueMap          As CValueMap
Set valueMap = allValues.Item(idCell.value)
valueMap.values.Add idCell.Offset(0, 1).value
Next idCell

0 für die Antwort № 2

Kurz vor deinem Ende Wenn, füge diese Zeile hinzu:

Set newValueMap = Nothing