2013-03-20 6 views
7

का चयनित मूल्य प्राप्त करें मेरे पास Excel वर्कशीट में हजारों कक्ष हैं जो कॉम्बोबॉक्स हैं। उपयोगकर्ता यादृच्छिक रूप से एक का चयन करेगा और इसे पॉप्युलेट करेगा।वीबीए - एक Combobox

मैं चयनित कॉम्बोबॉक्स मूल्य कैसे प्राप्त करूं? कॉमबॉक्सबॉक्स का चयन होने पर फ़ंक्शन को ट्रिगर करने का कोई तरीका है (यानी एक ईवेंट हैंडलर)?

+1

पर एक उदाहरण देख सकते क्या आप उन कोशिकाओं में 'मान्यता' विकल्प होता है मतलब है ?? एक असली combobox नहीं है जो एक आकार/रूप वस्तु है ... –

+1

@KazJaw इस सवाल को वास्तव में स्पष्टीकरण की आवश्यकता है :) यदि ओपी में "हजारों" comboboxes है, तो उसे हजारों ईवेंट हैंडलर की आवश्यकता होगी। अन्यथा, अगर वे केवल सत्यापन विकल्प हैं, तो 'वर्कशीट_Change' हैंडलर चाल करेगा। –

+0

@ डेविड ज़ेमेन्स, आखिरकार ... आप सही हैं :) इसलिए, मुझे लगता है कि आपकी टिप्पणी में और नीचे (उपयोगकर्ता @62203626 से) –

उत्तर

6

यदि आप डेटा सत्यापन सूची से निपट रहे हैं, तो आप वर्कशीट_Change ईवेंट का उपयोग कर सकते हैं। डेटा सत्यापन के साथ शीट पर राइट क्लिक करें और व्यू कोड चुनें। फिर इसमें टाइप करें:

Private Sub Worksheet_Change(ByVal Target As Range) 

    MsgBox Target.Value 

End Sub 

यदि आप ActiveX comboboxes से निपट रहे हैं, तो यह थोड़ा और जटिल है। घटनाओं को हुक करने के लिए आपको एक कस्टम क्लास मॉड्यूल बनाना होगा। सबसे पहले, CComboEvent नामक एक क्लास मॉड्यूल बनाएं और इसमें यह कोड डालें।

Public WithEvents Cbx As MSForms.ComboBox 

Private Sub Cbx_Change() 

    MsgBox Cbx.Value 

End Sub 

अगला, CComboEvents नामक एक और क्लास मॉड्यूल बनाएं। यह हमारे सभी CComboEvent उदाहरणों को पकड़ लेगा और उन्हें दायरे में रखेगा। इस कोड को CComboEvents में रखें।

Private mcolComboEvents As Collection 

Private Sub Class_Initialize() 
    Set mcolComboEvents = New Collection 
End Sub 

Private Sub Class_Terminate() 
    Set mcolComboEvents = Nothing 
End Sub 

Public Sub Add(clsComboEvent As CComboEvent) 

    mcolComboEvents.Add clsComboEvent, clsComboEvent.Cbx.Name 

End Sub 

अंत में, मानक मॉड्यूल बनाएं (क्लास मॉड्यूल नहीं)। आपको अपने सभी comboboxes को कक्षा मॉड्यूल में रखने के लिए कोड की आवश्यकता होगी। आप इसे Auto_Open प्रक्रिया में डाल सकते हैं, इसलिए जब भी कार्यपुस्तिका खोली जाती है तब यह होता है, लेकिन यह आपके ऊपर है।

आपको CComboEvents का उदाहरण रखने के लिए एक सार्वजनिक चर की आवश्यकता होगी। इसे सार्वजनिक बनाना इसे और उसके सभी बच्चों को गुंजाइश में रखेगा। आपको उन्हें दायरे में चाहिए ताकि घटनाएं ट्रिगर हो जाएं। प्रक्रिया में, सभी comboboxes के माध्यम से पाश, प्रत्येक के लिए एक नया CComboEvent उदाहरण बनाने, और CComboEvents को जोड़ने के लिए।

Public gclsComboEvents As CComboEvents 

Public Sub AddCombox() 

    Dim oleo As OLEObject 
    Dim clsComboEvent As CComboEvent 

    Set gclsComboEvents = New CComboEvents 

    For Each oleo In Sheet1.OLEObjects 
     If TypeName(oleo.Object) = "ComboBox" Then 
      Set clsComboEvent = New CComboEvent 
      Set clsComboEvent.Cbx = oleo.Object 
      gclsComboEvents.Add clsComboEvent 
     End If 
    Next oleo 

End Sub 

अब, जब भी एक combobox बदल जाता है, घटना आग लग जाएगी और, इस उदाहरण में, एक संदेश बॉक्स दिखाएगा।

आप https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm

4

आप नीचे दिए गए परिवर्तन ईवेंट का उपयोग कर सकते हैं जिससे कंबोबॉक्स मान बदल जाएगा।

Private Sub ComboBox1_Change() 
'your code here 
End Sub 

इसके अलावा आपके द्वारा चयनित मूल्य से नीचे

ComboBox1.Value 
+1

निश्चित रूप से यह काम करेगा, लेकिन यदि ओपी वास्तव में "हजारों" वर्कशीट पर comboboxes के, हजारों subroutines की आवश्यकता होगी; प्रत्येक combobox के लिए 1। –

+0

मेरे पास हजारों comboboxes नहीं हैं, केवल 1, और मैं उदाहरण के लिए बहुत बाध्य हूँ। – YetAnotherRandomUser

-1

का उपयोग कर हो सकता है कि आप प्रोग्राम ईवेंट हैंडलर्स सेट करने के लिए सक्षम हो जाएगा, की तरह कुछ का उपयोग कर (स्यूडोकोड) प्राप्त कर सकते हैं

sub myhandler(eventsource) 
    process(eventsource.value) 
end sub 

for each cell 
    cell.setEventHandler(myHandler) 

लेकिन मैं वीबी/वीबीए में इसे प्राप्त करने के लिए वाक्यविन्यास नहीं जानता, या यदि यह भी संभव है।