2009-12-15 22 views
9

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

उत्तर

1

सामान्य कोड को एक ही विधि में अलग करें और सेल को पैरामीटर के रूप में पास करें। प्रत्येक बटन को अपनी स्वयं की घटना विधि असाइन करें, जो बदले में पैरामीटर के रूप में संपादित करने के लिए विशिष्ट सेल के साथ सामान्य विधि को कॉल करता है। कुछ ऐसा:

Private Sub CommonMethod(someCell as String) 
    ' Do your stuff 
    Range(someCell).Value = something 
End Sub 

इसलिए प्रत्येक बटन को अपनी विधि के लिए असाइन किया जा सकता है। यह पहले से ही बनाया गया है इसलिए इसे फिर से बनाने की कोशिश न करें, इसे सरल रखें।

Private Sub Button1_Click() 
    CommonMethod("A1"); 
End Sub 

Private Sub Button2_Click() 
    CommonMethod("A2"); 
End Sub 
3

वीबीए में कोई नियंत्रण एरे नहीं हैं जैसे वीबी में हैं। कुछ नियंत्रणों के लिए आप घटनाओं को संभालने के लिए एक कस्टम क्लास बना सकते हैं। उदाहरण के लिए, मान लें कि आपके पास दो कमांड बटन वाले उपयोगकर्ताफॉर्म हैं। userform मॉड्यूल में इस कोड को

Private mcolEventButtons As Collection 

Private Sub UserForm_Initialize() 

    Dim clsEventButton As CEventButton 

    Set mcolEventButtons = New Collection 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton1 
    clsEventButton.RangeAddress = "A1" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton1.Name 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton2 
    clsEventButton.RangeAddress = "A10" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton2.Name 

End Sub 

फिर CEventButton नामक कस्टम वर्ग मॉड्यूल बनाने के रख दिया और इस कोड को

Private WithEvents mctlEventButton As MSForms.CommandButton 
Private msRangeAddress As String 

Public Property Set EventButton(ctlButton As MSForms.CommandButton) 

    Set mctlEventButton = ctlButton 

End Property 

Public Property Get EventButton() As MSForms.CommandButton 

    Set EventButton = mctlEventButton 

End Property 

Private Sub mctlEventButton_Click() 

    Sheet1.Range(Me.RangeAddress).Value = "Something" 

End Sub 

Public Property Get RangeAddress() As String 

    RangeAddress = msRangeAddress 

End Property 

Public Property Let RangeAddress(ByVal sRangeAddress As String) 

    msRangeAddress = sRangeAddress 

End Property 

चर आयाम चुनाव में WithEvents कीवर्ड CommandButton की घटनाओं और आग बस के रूप में करता है, तो यह एक विशेष नियंत्रण और उपयोगकर्ता प्रारूप मॉड्यूल में बंधे थे।

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

मैं एक उदाहरण के रूप में कस्टम क्लास मॉड्यूल में एक रेंज एड्रेस संपत्ति बनाते हैं। स्टोर करने के लिए आपको कौन सी जानकारी की आवश्यकता होगी, वह उस पर निर्भर करेगा जो आप अंततः पूरा करने की कोशिश कर रहे हैं।

इस उदाहरण के लिए काम करने के लिए, आपको उपयोगकर्ता के शोमोडल प्रॉपर्टी को FALSE पर सेट करने की आवश्यकता है, कमांडबटन 1 और कमांडबटन 2 नामक कमांडबूटन को, शीट 1 के कोडनाम के साथ एक शीट है, और शायद कुछ अन्य सामान।