मेरे पास एक एक्सेल टेबल है 1:n-Relationship
ID value
----------
1 A
1 B
1 C
2 A
2 B
3 F
4 X
4 Z
और एक वस्तु (CValueMap
) जो किसी दिए गए आईडी के लिए मानों को स्टोर करना चाहिए:
Option Explicit
Public id As Integer
Public values As Collection
मैं पंक्तियों को फिर से बनाकर एक्सेल टेबल पढ़ता हूं CValueMap
(यदि यह अभी तक मेरे शब्दकोश में मौजूद नहीं है) और मान भरना।
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
अब मुझे लगता है कि मेरे पास 4 है CValueMap
जहां पहले व्यक्ति है ABC
, दूसरा AB
, तीसरा F
और आखिरी में XZ
मूल्य के रूप में। हालांकि, यह मामला नहीं है क्योंकि यह कोड दिखाता है:
"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
मुझे सच में यकीन नहीं है कि मैं गलत कहां गया था। व्यवहार से मैंने माना वही ValueMap को लिखा गया हो सकता है से प्रत्येक में प्रवेश allValues
शब्दकोश, लेकिन चूंकि मैंने 4 विशिष्ट बनाये हैं और इसे जोड़ने से पहले उन्हें सही तरीके से लोड किया है value
मैं यह देखने में असफल रहा कि यह कहां हो सकता था।
उत्तर:
जवाब के लिए 2 № 1आपके लिए ऑब्जेक्ट सबक - कभी नहीँ उपयोग Dim... As New...
क्योंकि जब आप एक नई वस्तु प्राप्त करते हैं तो आप नियंत्रण नहीं कर सकते हैं।
आपके कोड में आवश्यक सरल परिवर्तन:
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 № 2
अपने अंत से ठीक पहले, इस लाइन को जोड़ें:
Set newValueMap = Nothing