2011-09-26 17 views
8

में संग्रह की आइटम प्रॉपर्टी सेट करना मुझे आश्चर्य है कि यह कितना मुश्किल है लेकिन मुझे लगता है कि यह एक त्वरित फिक्स है इसलिए मैं यहां पूछूंगा (Google और दस्तावेज़ीकरण की खोज की लेकिन न तो मदद मिली)। मेरे पास कुछ कोड है जो कुंजी का उपयोग करके संग्रह में आइटम जोड़ता है। जब मैं संग्रह में पहले से मौजूद एक कुंजी पर आ जाता हूं, तो मैं बस वर्तमान मूल्य पर एक संख्या जोड़कर इसे सेट करना चाहता हूं।वीबीए

If CollectionItemExists(aKey, aColl) Then 'If key already has a value 
    'add value to existing item 
    aColl(aKey).Item = aColl(aKey) + someValue 
Else 
    'add a new item to the collection (aka a new key/value pair) 
    mwTable_ISO_DA.Add someValue, aKey 
End If 

पहली बार मैं संग्रह में मुख्य/मान जोड़े जोड़ने के लिए, मैं मान के रूप में एक पूर्णांक द्वारा जोड़ा जा रहा:

यहाँ कोड है। जब मैं फिर से कुंजी पर आ जाता हूं, तो मैं मूल्य पर एक और पूर्णांक जोड़ने की कोशिश करता हूं, लेकिन यह काम नहीं करता है। मुझे नहीं लगता कि समस्या किसी भी प्रकार की वस्तु गलत है या कुछ समान है। त्रुटि संदेश मैं वर्तमान में मिलता है

रनटाइम त्रुटि 424: ऑब्जेक्ट आवश्यक

+0

पहले, संबंधित प्रश्न के उत्तर में यह प्रश्न आपके प्रश्न का उत्तर देना चाहिए: http://stackoverflow.com/questions/5709444/modify-value-by-key/5710063 # 5710063। लघु संस्करण यह है कि संग्रह सरणी की तरह काम नहीं करते हैं; आप "तत्व" को पुन: असाइन नहीं कर सकते हैं। दूसरों के जवाब पहले से ही आपको दिए गए हैं जो आप चाहते हैं पाने के लिए वैकल्पिक वैकल्पिक तरीके हैं। – jtolle

उत्तर

12

आप मान संपादित नहीं कर सकते पर एक उत्कृष्ट लेख लिखा है एक बार उन्हें एक संग्रह में जोड़ा गया है। तो यह संभव नहीं है:

aColl.Item(aKey) = aColl.Item(aKey) + someValue 

इसके बजाय, आप संग्रह से बाहर वस्तु ले, अपने मूल्य संपादित कर सकते हैं, और इसे फिर से जोड़ें।

temp = aColl.Item(aKey) 
aColl.Remove aKey 
aColl.Add temp + someValue, aKey 

यह थोड़ा कठिन है, लेकिन इन तीन पंक्तियों को उप में रखें और आप सभी सेट हैं।

संग्रह अधिक अनुकूल होते हैं जब उन्हें ऑब्जेक्ट्स के कंटेनर के रूप में उपयोग किया जाता है (जैसे कि "आदिम" चर के लिए कंटेनर के विपरीत, पूर्णांक, डबल इत्यादि)। आप संग्रह में निहित ऑब्जेक्ट संदर्भ को नहीं बदल सकते हैं, लेकिन आप उस संदर्भ से जुड़े ऑब्जेक्ट में हेरफेर कर सकते हैं।

एक तरफ ध्यान दें, मुझे लगता है कि आपने Item से संबंधित वाक्यविन्यास को गलत समझा है। आप यह नहीं कह सकते: aColl(aKey).Item। सही वाक्यविन्यास aColl.Item(aKey) है, या, aColl(aKey) के बाद Item संग्रह ऑब्जेक्ट का डिफ़ॉल्ट तरीका है। हालांकि, मैं पूर्ण, स्पष्ट रूप का उपयोग करना पसंद करता हूं ...

0

मुझे लगता है कि आप मौजूदा कुंजी-मान पेयर को हटा दें और उसके बाद फिर से संग्रह करने के लिए महत्वपूर्ण जोड़ने की जरूरत है, लेकिन नए के साथ मूल्य

8

DictionariesCollections से अधिक बहुमुखी और अधिक समय कुशल हैं। आप इस मार्ग से चला गया, तो आप सीधे नीचे शब्दकोश पर एक सरल Exists परीक्षण चला सकते हैं, और फिर कुंजी मान अद्यतन

पैट्रिक मैथ्यू dictionaries v collections

Sub Test() 
    Dim MyDict 
    Set MyDict = CreateObject("scripting.dictionary") 
    MyDict.Add "apples", 10 
    If MyDict.exists("apples") Then MyDict.Item("apples") = MyDict.Item("apples") + 20 
    MsgBox MyDict.Item("apples") 
End Sub 
+1

शब्दकोश एक चीज़ को छोड़कर सब कुछ के लिए संग्रह से बेहतर है: शब्दकोश आदेश को संरक्षित नहीं करता है। मेरे अधिकांश अनुप्रयोगों में, आदेश * महत्वपूर्ण है; इस वजह से मैं एक बार या दो बार शब्दकोश से खराब हो गया! –