2009-09-10 12 views
9
Dim A As Collection 
Set A = New Collection 

Dim Arr2(15, 5) 
Arr2(1,1) = 0 
' ... 

A.Add (Arr2) 

Arr2A के माध्यम से मैं Arr2 तक कैसे पहुंच सकता हूं? उदाहरण के लिए, मैं निम्नलिखित करना चाहते हैं:सरणी के साथ संग्रहित संग्रह

A.Item(1) (1,1) = 15 

तो ऊपर संग्रह के अंदर पहले दो आयामी सरणी के पहले तत्व बदल जाएगा ...

उत्तर

7

हममम ... वाक्य रचना कानूनी लग रहा है मेरे सामने वीबीए के बिना पर्याप्त। क्या मैं सही हूं कि आपकी समस्या यह है कि आपका कोड "संकलित" करता है और त्रुटि उत्पन्न किए बिना निष्पादित करता है, लेकिन संग्रह में सरणी कभी नहीं बदली जाती है? यदि ऐसा है, तो मुझे लगता है कि ऐसा इसलिए है क्योंकि आपका एआईटीम (1) संग्रह में संग्रहीत सरणी के प्रति को वापस कर सकता है। फिर आप चुने गए तत्व को ठीक से एक्सेस और संशोधित करते हैं, लेकिन इसका प्रभाव आपके पास नहीं है क्योंकि यह गलत सरणी उदाहरण है।

सामान्य वीबीए संग्रह सामान्य वस्तुओं में संग्रह करते समय सबसे अच्छा काम करते हैं। फिर वे काम करेंगे जैसे आप चाहते हैं क्योंकि वे संदर्भ संग्रह करते हैं। वे मूल्यों को संग्रहित करने के लिए ठीक हैं, लेकिन मुझे लगता है कि वे हमेशा उन्हें कॉपी करते हैं, यहां तक ​​कि "बड़े" जैसे सरणी प्रकार, जिसका अर्थ है कि आप संग्रहीत सरणी की सामग्री को म्यूट नहीं कर सकते हैं।

इस उत्तर पर विचार करें जब तक कि अंतर्निहित COM सामानों को बेहतर तरीके से पता न हो। उम ... पेजिंग जोएल स्पॉस्की?

संपादित करें: एक्सेल वीबीए में इसे आजमाने के बाद, मुझे लगता है कि मैं सही हूं। संग्रह में एक सरणी संस्करण डालने से एक प्रतिलिपि होती है, और इसलिए एक बाहर निकलता है। इसलिए आपने जो वास्तव में पूछा है उसे कोड करने का एक सीधा तरीका प्रतीत नहीं होता है।

यह क्या आप वास्तव में चाहते हैं एक 3-डी सरणी है की तरह लग रहा है, लेकिन तथ्य यह है कि आप पहली बार आयाम के लिए एक संग्रह का उपयोग करने के tyring रहे थे मतलब है कि आपको लगता है कि आयाम में यह के आकार को बदलने में सक्षम होना चाहता हूँ। वीबीए आपको केवल सरणी के अंतिम आयाम के आकार को बदलने देगा (मदद में "redim संरक्षित" देखें)। आप अपने 2-डी सरणियों एक 1-डी सरणी है कि आप का आकार बदल सकते हैं अंदर, हालांकि रख सकते हैं:

ReDim a(5) 
Dim b(2, 2) 
a(2) = b 
a(2)(1, 1) = 42 
ReDim Preserve a(6) 

ध्यान दें कि एक ReDim साथ घोषित किया जाता है, इस मामले में मंद नहीं।

अंत में, यह काफी संभव है कि जो कुछ भी आप करने की कोशिश कर रहे हैं, उसके लिए कुछ अन्य दृष्टिकोण बेहतर होगा। बढ़ने योग्य, परिवर्तनीय 3-डी सरणी कम से कम कहने के लिए जटिल और त्रुटि-प्रवण हैं।

4

@jtolle सही है। जब यह करने के लिए प्रदान करती है

Dim A As Collection 
Set A = New Collection 
Dim Arr2(15, 5) 

Arr2(1, 1) = 99 

' ... 

A.Add (Arr2) ' adds a copy of Arr2 to teh collection 

Arr2(1, 1) = 11 ' this alters the value in Arr2, but not the copy in the collection 

Dim x As Variant 

x = A.Item(1) 
x(1, 1) = 15 ' this does not alter Arr2 
+0

मुझे नहीं लगता कि Arr2 (1, 1) = 11 वास्तव में संग्रह में सरणी बदलता है। मेरा संपादित उत्तर देखें, लेकिन ऐसा लगता है कि संग्रह से जोड़ने और पढ़ने के दौरान वीबीए सरणी की एक प्रति बनाता है। – jtolle

+0

शायद मैं सिर्फ आपकी टिप्पणी से गुमराह हूं? वह पंक्ति Arr2 को बदलती है, लेकिन संग्रह में संग्रहीत सरणी नहीं है। मैं इसे एआर 2 बदल रहा हूं, लेकिन एआईटीम (1) नहीं, जो एएड (एआर 2) द्वारा बनाई गई एआर 2 की एक प्रति है। – jtolle

+0

@jtolle: क्षमा करें, मैंने अभी पुनः जांच की है और आप बिल्कुल सही हैं। मैं उपरोक्त कोड अपडेट करूंगा। यह संग्रह में Arr2 की एक प्रति है। –

1

शायद VBA सरणी की एक प्रतिलिपि बनाता: आप नीचे दिए गए कोड को चलाने और मूल्यों का निरीक्षण किया तो Arr2 की और एक्स आपको लगता है कि वे अलग हैं देखेंगे (त्वरित घड़ी Shift-F9 है) संग्रह? वीबीनेट ऐसा नहीं करता है। इस कोड के बाद, एक (3,3) वीबीए में 20 और vb.net में 5 है।

Dim c As New Collection 
Dim a(10, 10) As Integer 

a(3, 3) = 20 
c.Add(a) 
c(1)(3, 3) = 5 
1

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

0

यदि आप चाहते हैं कि संग्रह सरणी की एक प्रति है, और सरणी का संदर्भ नहीं है, तो सरणी का उपयोग करें।क्लोन विधि: -

Dim myCollection As New Collection 
Dim myDates() as Date 
Dim i As Integer 

Do 
    i = 0 
    Array.Resize(myDates, 0) 
    Do 
     Array.Resize(myDates, i + 1) 
     myDates(i) = Now 
     ... 
     i += 1 
    Loop 
    myCollection.Add(myDates.Clone) 
Loop 

अंत में, मेरे चयन में myDates() के संचय संग्रह शामिल होंगे।

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