/ / शब्दकोश में प्रविष्टियों में सभी का एक ही मूल्य होता है हालांकि वे व्यक्तिगत रूप से बनाए जाते हैं - एक्सेल, एक्सेल-वीबीए, वीबीए

एक शब्दकोश में प्रविष्टियों में एक ही मूल्य होता है हालांकि वे व्यक्तिगत रूप से बनाए जाते हैं - एक्सेल, एक्सेल-वीबीए, वीबीए

मेरे पास एक एक्सेल टेबल है 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