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 CValueMap
s 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: value
s Ich sehe nicht, wo das passiert sein könnte.
Antworten:
2 für die Antwort № 1Objektunterricht 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