2011-02-25 15 views
7

मैं वर्ड 2007 में वीबीए का उपयोग करके एक फॉर्म दस्तावेज़ का प्रतिनिधित्व करने के लिए कोड बनाने की कोशिश कर रहा हूं। मैंने अनुभाग, प्रश्नपत्र और प्रश्न का प्रतिनिधित्व करने के लिए कक्षाएं बनाई हैं।वीबीए - संग्रहों के संग्रह में संग्रह कैसे जोड़ें

तो मेरे पास 15 अनुभाग हैं। मैंने प्रत्येक 'सेक्शन' ऑब्जेक्ट को 'सेक्शन' संग्रह में जोड़ने के लिए एक फ़ंक्शन बनाया है, फिर ऑब्जेक्ट को नष्ट कर दिया है, नतीजा यह है कि ऑब्जेक्ट संग्रह (या कुछ) में लगातार रहते हैं।

क्या संग्रह में संग्रह जोड़ने के लिए एक ही विधि का उपयोग करना संभव है या क्या मुझे प्रत्येक संग्रह को स्पष्ट रूप से परिभाषित करना होगा? मॉड्यूल में

कोड:

Public Sections As Collection 

Function DefineSection(ByVal SectionName As String) 

    Set Section = New clsSection 
    Section.myName = SectionName 
    Sections.Add Section, SectionName 

End Function 


Function DefineQuestionSet(ByVal SectionName As String, ByVal Name As String, ByVal NoOfQuestions As Integer, ByVal IsMutuallyExclusive As Boolean, Optional ByVal DependentOnSection As String) 

    Dim Qsets As Collection 

    Set Qsets = New Collection 
    Set QuestionSet = New clsQuestionSet 

    QuestionSet.Name = Name 
    QuestionSet.NoOfQuestions = NoOfQuestions 
    QuestionSet.MutuallyExclusive = IsMutuallyExclusive 

    If Not (DependentOnSection) = "" Then 
     QuestionSet.DependentOnSection = DependentOnSection 
    End If 

    Qsets.Add QuestionSet 
    Sections.Item(SectionName).Add Qsets 

End Function 

फिर इस के माध्यम से कहा जाता है:

Sub Initilise() 

    Set Sections = New Collection 

    DefineSection "PersonalDetails" 
    DefineQuestionSet "PersonalDetails", "PersonalDetails", 29, False 

End Sub 

उत्तर

5

हाँ। आप संग्रहण विज्ञापन infinitum में संग्रह में संग्रह जोड़ सकते हैं। आपके द्वारा पोस्ट किया गया कोड ऐसा लगता है कि इसे केवल इसके माध्यम से चमकने से काम करना चाहिए। क्या आपको विशिष्ट समस्याएं हैं?

अद्यतन: वीबीए केवल संदर्भ वस्तुओं के लिए पास करता है। यदि आप किसी संग्रह को निर्दिष्ट करने के बाद किसी ऑब्जेक्ट को स्पष्ट रूप से नष्ट करते हैं (उदाहरण के लिए, Set myObj = Nothing) तो आप संग्रह के अंदर ऑब्जेक्ट को भी नष्ट कर देंगे।

[संपादित करें]: जाहिर है यह सच नहीं है। this website से (पहली टिप्पणी में Stevo से जुड़े):

  • वर्ग का एक उदाहरण बनाएँ:

    आदेश वर्ग वस्तुओं का प्रबंधन करने के संग्रह का उपयोग करने में, आपको निम्न करना चाहिए

  • गुण और वर्ग
  • की पद्धति सेट किसी सार्वजनिक समूह में कक्षा जोड़ें
  • अनलोड वर्ग के उदाहरण

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

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

Private QSetsColl As Collection 

Public Sub Add(QSets As Object) 
    If QSetsColl Is Nothing Then Set QSetsColl = New Collection 
    QSetsColl.Add QSets 
End Sub 
+0

दुर्भाग्य से मैं अब के लिए कोड बदल दिया है लौटने के लिए, कोशिश करने के लिए और सिर्फ स्वतंत्र संग्रह बना - लेकिन मुझे लाइन 'सेक्शन.इटम (सेक्शननाम) से एक त्रुटि मिली है।' DefineQuestionSet 'फ़ंक्शन में Qsets' जोड़ें। – Stevo

+0

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

+0

त्रुटि संदेश हमेशा गूढ़ है 'ऑब्जेक्ट इस संपत्ति का समर्थन नहीं करता है या विधि ' – Stevo

0

मुझे लगता है कि मैं इस सवाल का जवाब अब है, लेकिन अगर किसी को स्पष्ट कर सकता है कि हो सकता है उपयोगी।

मुझे लगता है कि कोड क्या कर रहा है एक ऑब्जेक्ट में संग्रह जोड़ने की कोशिश कर रहा है - जो स्पष्ट रूप से काम नहीं करेगा। तो मुझे एक संग्रह बनाने की ज़रूरत है जिसे मैं ऑब्जेक्ट और संग्रह जोड़ सकता हूं। आदि

1

इस सरल उदाहरण का प्रयास करें:

Private Sub CommandButton1_Click() 

    Dim masterCollection As New collection 
    masterCollection.Add "first key", createDetailCollection() 
    masterCollection.Add "second key", createDetailCollection() 
    masterCollection.Add "third key", createDetailCollection() 

End Sub 

पालन समारोह एक initializated संग्रह

Function createDetailCollection() 
    Dim collection As New collection 
    createCollection = collezioneBuy 
End Function 
+0

शायद आपको 'createCollection = collezioneBuy'' बनाने के बजाय 'Create createCollection = collezioneBuy'' को createDetailCollection() 'में उपयोग करना चाहिए। – Ans