2010-09-02 10 views
6

क्या वीबीए श्रेणी चर के सरणी का उपयोग कर समर्थन करता है?वीबीए में रेंजों के एक ऐरे का उपयोग - एक्सेल

dim rangeArray() as range 
dim count as integer 
dim i as integer 

count = 3 

redim rangeArray(1 to count) 

for i = 1 to count 
    msgbox rangeArray(i).cells(1,1).value 
next 

मैं इसे इस प्रकार के आवेदन में काम नहीं कर सकता। मैं एक "मास्टर कॉपी" के रूप में एक निश्चित क्रम में श्रेणियों की एक श्रृंखला को स्टोर करना चाहता हूं। इसके बाद मैं इस सरणी को जो कुछ भी जोड़, हटा, क्रमबद्ध या कर सकता हूं और फिर इसे एक्सेल में श्रेणियों की एक श्रृंखला में प्रिंट कर सकता हूं। ऐसा लगता है कि एक्सेल इसका समर्थन नहीं करता है - यह आपको स्प्रेडशीट में अपना डेटा स्टोर करने के लिए मजबूर करता है और इसे उपयोग करने के लिए आपको इसे फिर से पढ़ना होगा।

+0

जो मैं करने की कोशिश कर रहा हूं वह जावा में "कंटेनर क्लास" जैसा कुछ करता है, एक सुविधाजनक स्थान में मिश्रित डेटा स्टोर करने में सक्षम होने के लिए, अधिमानतः अनदेखा। मेरे कार्यक्रम में, एक टेम्पलेट अनुभाग है जो किसी अन्य शीट से कॉपी हो जाता है और फिर सक्रिय शीट पर बार-बार चिपकाया जाता है और टैग किया जाता है ताकि उपयोगकर्ता अलग-अलग अनुभागों के साथ-साथ नामित भी पहचान सकें ताकि मैं इसका उल्लेख कर सकूं। – GenericJam

+0

इस कोड के साथ काम नहीं कर रहा है? आप क्या हासिल करने का प्रयास कर रहे हैं? उपर्युक्त कोड को देखते हुए, आपने सरणी को वास्तविक श्रेणी संदर्भ से भर नहीं दिया है। 'सेट रेंजएरे (1) = रेंज ("ए 1")' सेट रेंजएरे (2) = रेंज ("ए 2") 'के बाद' सेट रेंजएरे (3) = रेंज ("ए 3") ' – shahkalpesh

+0

धन्यवाद योगदान देने वाले हर किसी के लिए। अंत में मैंने श्रेणियों की प्रतिलिपि बनाई, नए खंडों को जोड़ा, उन्हें क्रम में नाम दिया और उन्हें मूल स्थान पर वापस कॉपी किया। यह थोड़ा सा चंचल था लेकिन यह काम करता है। मेरे लिए मुख्य प्रकाशन था: एक्सेल जब तक शीट पर नहीं होता तब तक डेटा के लगातार डेटा और मिश्रित समूहों का समर्थन नहीं करता है। समस्या यह है कि आप गलती से गलत कोशिकाओं में डालकर डेटा पर प्रतिलिपि बना सकते हैं, इसलिए आपको अपने डेटा को रखने और ट्रैक करने में बहुत मेहनत करनी होगी। – GenericJam

उत्तर

10

नहीं, सरणी वस्तुओं को पकड़ नहीं सकती है। लेकिन ओ ऑब्जेक्ट ऑब्जेक्ट्स रख सकते हैं। मुझे लगता है कि आप जो चाहते हैं वह एक रेंज ऑब्जेक्ट है जिसमें विभिन्न विशिष्ट अन्य रेंज ऑब्जेक्ट होते हैं। इस उदाहरण में, rMaster मेरा "सरणी" है जिसमें तीन कोशिकाएं होती हैं।

Sub StoreRanges() 

    Dim rMaster As Range 
    Dim rCell As Range 

    Set rMaster = Sheet1.Range("A1") 
    Set rMaster = Union(rMaster, Sheet1.Range("A10")) 
    Set rMaster = Union(rMaster, Sheet1.Range("A20")) 

    For Each rCell In rMaster 
     MsgBox rCell.Address 
    Next rCell 

End Sub 

अपने नए पाया ज्ञान है कि सरणियों पर्वतमाला (thnx jtolle) पकड़ कर सकते हैं, आपके द्वारा एक सरणी में पर्वतमाला की दुकान और उन्हें सॉर्ट

Sub UseArray() 

    Dim aRng(1 To 3) As Range 
    Dim i As Long 

    Set aRng(1) = Range("a1") 
    Set aRng(2) = Range("a10") 
    Set aRng(3) = Range("a20") 

    BubbleSortRangeArray aRng 

    For i = LBound(aRng) To UBound(aRng) 
     Debug.Print aRng(i).Address, aRng(i).Value 
    Next i 

End Sub 

Sub BubbleSortRangeArray(ByRef vArr As Variant) 

    Dim i As Long, j As Long 
    Dim vTemp As Variant 

    For i = LBound(vArr) To UBound(vArr) - 1 
     For j = i To UBound(vArr) 
      If vArr(i).Value > vArr(j).Value Then 
       Set vTemp = vArr(i) 
       Set vArr(i) = vArr(j) 
       Set vArr(j) = vTemp 
      End If 
     Next j 
    Next i 

End Sub 
+0

यदि मैंने इस विधि का उपयोग किया है, तो क्या मैं इसे अपने मौजूदा डेटा पर प्रतिलिपि किए बिना सॉर्ट करने में सक्षम हूं? – GenericJam

+3

यदि आप इस पोस्ट को संपादित करते हैं, तो मैं खुशी से -1 को हटा दूंगा, लेकिन सरणी * ऑब्जेक्ट्स को रेंज ऑब्जेक्ट्स सहित रख सकता है। – jtolle

+0

अगर आप सही नहीं हैं तो इसे हटाएं। खैर, मैं केवल 15 वर्षों के लिए एक्सेल का उपयोग कर रहा हूं। :) सुधारों के लिए धन्यवाद। –

1

यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि आप किस बारे में बात कर रहे हैं।

यदि आप Range एस बनाने की क्षमता के बारे में पूछ रहे हैं जो कि कुछ भी नहीं है और अपने आप पर मौजूद है, तो नहीं, कोई रास्ता नहीं है। Range ऑब्जेक्ट केवल कुछ ऐसा है जो वर्कशीट के किसी निश्चित क्षेत्र को संदर्भित करता है। इसमें अपने या कुछ का कोई भंडारण नहीं है। Range वर्ग के कई अलग-अलग उदाहरण भी वही वर्कशीट क्षेत्र का संदर्भ ले सकते हैं।

और यदि आप सिर्फ सरणी में कुछ संदर्भों को स्टोर करना चाहते हैं, तो यह ठीक है, इसके लिए जाएं। आपके कोड के साथ एकमात्र समस्या यह है कि आप उन्हें उपयोग करने से पहले सरणी तत्वों को प्रारंभ नहीं करते हैं: Range एक संदर्भ प्रकार है, इसलिए सभी तत्व डिफ़ॉल्ट रूप से Nothing s के साथ आरंभ किए जाते हैं।

+0

मुझे क्या करना होगा, फिर मेरी अवधारणा को लागू करने के लिए उस अनुभाग की प्रतिलिपि बनाना है जिसे मैं शीट के एक अप्रयुक्त खंड में उपयोग करना चाहता हूं, इसके साथ गड़बड़ कर रहा हूं और फिर जब इसे इसके साथ किया जाता है तो इसे वापस कॉपी करें। – GenericJam

+0

@GenericJam तब एक छिपी हुई चादर का उपयोग करें। – GSerg

4

यह पूरी तरह स्पष्ट नहीं है जाएगा का एक उदाहरण है कि तुम क्या करना चाहते हैं, लेकिन ...

यदि आप एक संग्रह चाहते हैं, तो वीबीए संग्रह ऑब्जेक्ट का उपयोग क्यों न करें?

Dim myRanges as New Collection 

एक संग्रह। यह एक रेंज समेत कोई वस्तु हो सकती है।

एक रेंज ऑब्जेक्ट में डेटा नहीं है; यह वर्कशीट कोशिकाओं का संदर्भ रखता है। यदि आप अपने संग्रह में श्रेणी सामग्री चाहते हैं, तो आपको उन्हें वर्कशीट से और कॉपी करना होगा।

जावा के साथ, आपके वीबीए वेरिएबल अस्थायी हैं, भले ही एक ऐरे या संग्रह में हों। यदि आप फ़ाइल को बंद करना चाहते हैं और जब आप इसे फिर से खोलते हैं तो वहां डेटा होता है, तो आपको इसे वर्कशीट सेल में रखना होगा। वर्कशीट्स आपकी दृढ़ता तंत्र हैं।

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

+0

क्या वर्कशीट का उपयोग किए बिना हासिल करना संभव है, लेकिन डेटा को केवल चर में संग्रहीत करना है? – Ans

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