2012-05-14 13 views
35

कई लोग डेटा की एक सूची स्टोर करने के लिए एक्सेल/वीबीए में बड़े पैमाने पर सरणी का उपयोग करते हैं। हालांकि, संग्रह वस्तु है जो मेरे विचार में बहुत अधिक सुविधाजनक है (मुख्य रूप से: सूची की लंबाई को फिर से परिभाषित करने की आवश्यकता नहीं है)।संग्रह होने पर वीबीए में सरणी का उपयोग क्यों करें?

तो, मैं ईमानदारी से खुद से पूछ रहा हूं कि मुझे कुछ याद आ रही है? अन्य लोग अभी भी डेटा की सूची संग्रहीत करने के लिए सरणी का उपयोग क्यों करते हैं? क्या यह अतीत का एक हैंगओवर है?

उत्तर

31

कई कारणों से संग्रह के बजाय सरणियों (या शब्दकोशों) का उपयोग करने के लिए:

  • आप सीमा (और इसके विपरीत) Range("A1:B12") = MyArray
  • संग्रह के साथ आसानी से सरणी हस्तांतरण कर सकते हैं, जबकि केवल अद्वितीय कुंजी स्टोर कर सकते हैं सरणियों किसी भी मूल्य स्टोर कर सकते हैं
  • संग्रह एक जोड़े (कुंजी, मूल्य) स्टोर करने के लिए, जबकि आप स्टोर कर सकते हैं है एक सरणी में जो कुछ भी

एक बेहतर समझ

के लिए Chip Pearson's article सरणियों के बारे में देखें एक बेहतर सवाल नहीं बल्कि होगा क्यों लोग शब्दकोशों (ठीक है, संग्रह मानक VBA हैं आप आयात करने के लिए शब्दकोशों है, जबकि)

+4

इसके अलावा सरणी संग्रह से बेहतर प्रदर्शन करती हैं (कुंजी लुकअप एक्सेस को छोड़कर जब आप सरणी में सीधे इंडेक्स नहीं कर सकते हैं)। –

+0

@ चार्ल्सविल्लियम्स: टिप – JMax

+13

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

3

संग्रह जो स्वत: आकार बदलते हैं धीमे होते हैं (सैद्धांतिक रूप से बोलते हुए, विभिन्न कार्यान्वयन स्पष्ट रूप से अपना स्वयं का लाभ होगा)। यदि आप जानते हैं कि आपके पास प्रविष्टियों की एक निश्चित संख्या है और आपको केवल उन्हें रैखिक फैशन में एक्सेस करने की आवश्यकता है तो पारंपरिक सरणी सही दृष्टिकोण है।

15

@CharlesWilliams जवाब से अधिक संग्रह का प्रयोग करेंगे सही है: किसी सरणी के सभी मानों के माध्यम से लूपिंग एक संग्रह या शब्दकोश को पुनरावृत्ति करने से तेज़ है: इतना है कि, जब मैं ऐसा करने की ज़रूरत होती हूं तो मैं हमेशा एक कुंजीपटल() या आइटम() विधि का उपयोग करता हूं - दोनों विधियां वापस एक वेक्टर सरणी

एक नोट: मैं संग्रह वर्ग का उपयोग करने से कहीं ज्यादा डिक्शनरी कक्षा का उपयोग करता हूं, मौजूदा() विधि बहुत उपयोगी है।

संग्रह या शब्दकोशों में कमी, या पाठ्यक्रम हैं। उनमें से एक यह है कि सरणी 2- या यहां तक ​​कि 3-आयामी हो सकती है - सारणीबद्ध डेटा के लिए एक बेहतर डेटा संरचना। आप संग्रह के सदस्यों के रूप में स्टोर एरे कर सकते हैं, लेकिन इसमें कुछ डाउनसाइड्स हैं: उनमें से एक यह है कि आपको आइटम का संदर्भ नहीं मिल रहा है - जब तक कि आप arrItem = MyDictionary(strKey) का उपयोग न करें, आपको लगभग निश्चित रूप से 'बायवल' कॉपी मिल जाएगी सरणी; यह खराब है यदि आपका डेटा गतिशील है, और कई प्रक्रियाओं में परिवर्तन के अधीन है। यह भी धीमा है: आवंटन और निर्वासन के बहुत सारे।

सभी पीड़ाओं से मैं काफी विश्वास नहीं VBA स्मृति पुनःआवंटन अगर मैं एक संग्रह या सरणियों के साथ शब्दकोश की क्या ज़रूरत सदस्यों के रूप में (या वस्तुओं!): बाहर के दायरे, नहीं द्वारा Set objCollection = Nothing पर नहीं, यहां तक ​​कि नहीं objDictionary.RemoveAll द्वारा - यह साबित करना मुश्किल है कि समस्या वीबीई में उपलब्ध सीमित परीक्षण टूलकिट के साथ मौजूद है, लेकिन मैंने उन अनुप्रयोगों में पर्याप्त मेमोरी लीक देखी हैं जो शब्दकोशों में सरणी का उपयोग करते हैं ताकि आपको पता चल सके कि आपको सावधान रहना होगा। ऐसा कहा जा रहा है, मैं कभी भी किसी भी एरस कमांड के बिना सरणी का उपयोग नहीं करता हूं।

@ जेमैक्स ने सरणी के लिए अन्य बड़े प्लस को समझाया है: आप वर्कशीट में एक 'हिट' में एक सरणी बना सकते हैं, और अपने काम को एक 'हिट' में लिख सकते हैं।

आप निश्चित रूप से इंडेक्सेड ऐरे क्लास का निर्माण करके दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकते हैं: संबंधित संग्रह या शब्दकोश ऑब्जेक्ट्स के साथ 2-आयामी सरणी, कुंजी के रूप में किसी प्रकार की पंक्ति पहचानकर्ता को संग्रहित करती है, और पंक्ति ordinals के रूप में डेटा आइटम

संबंधित मुद्दे