2009-02-19 9 views
8

मैं निम्नलिखित कोड के साथ एक एक्सेल userform पर गतिशील बटन बनाने हूँ:असाइन पर क्लिक करें एक्सेल UserForm पर एक डायनामिक रूप से तैयार करने के लिए बटन VBA समारोह

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1") 
    .Caption = "XYZ" 
    .name = "AButton" 
    .Font.Bold = True 
    .ForeColor = &HFF& 
    ... blah blah blah 
End With 

मैं जब चलाने के लिए एक समारोह असाइन करना चाहते हैं इन बटनों पर क्लिक किया गया है, लेकिन मुझे ऐसा करने का एक सीधा तरीका नहीं मिल रहा है क्योंकि बटन के हिस्से के रूप में कोई संपत्ति नहीं है।

क्या उपरोक्त मुहावरे का उपयोग करके ऐसा करने का कोई तरीका है? क्या मुझे इस पूरी चीज़ को अलग तरीके से जाना चाहिए?

उत्तर

8

आपको प्रत्येक बटन के लिए गतिशील रूप से कोड/ईवेंट हैंडलर बनाने की आवश्यकता है।

यह कर का एक सा ले - यहाँ देखें: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

एक बेहतर तरीका (कई के रूप में के रूप में आपको लगता है कि आप की आवश्यकता होगी) फार्म पर बटन का एक समूह बनाने के लिए समय से आगे हो सकता है। इवेंट हैंडलर कोड भी बनाएं। शुरुआत में उन्हें सभी छुपाएं।

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

+2

चालाक विचार! लगता है कि वीबीए में सबकुछ चालाक होने की आवश्यकता है। – notnot

0

मैं इसे भी देख रहा हूं। लगता है आप onClick संपत्ति का उपयोग करके किसी मैक्रो चला सकते हैं:

Command1.OnClick = "Macro1" 

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

+0

एक एक्सेल उपयोगकर्ताफॉर्म नियंत्रण के लिए, "ऑनक्लिक" assingin के परिणामस्वरूप ... "ऑब्जेक्ट इस प्रॉपर्टी या विधि का समर्थन नहीं करता है" – PravyNandas

2

नीचे कोड एक एक्सेल रूप में गतिशील रूप से एक नियंत्रण घटना को जोड़ने के लिए

Dim NewButton As OLEObject 
Dim CodeModule As Object 

Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _ 
    Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _ 
    Width:=202.5, Height:=26.25) 
NewButton.Object.Caption = "Click Me!" 
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule 
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world""" 
1
Sub Oval1_Click() 
    file = ActiveWorkbook.Name 
    Set Output = Workbooks.Add() 
    ActiveWorkbook.SaveAs Filename:="Try.xls"   
    Sheets(1).Select   
    ActiveSheet.Buttons.Add(460, 10, 140, 30).Select 
    ActiveSheet.Buttons.Text = "DATA"  
    ActiveSheet.Shapes("Button 1").Select 
    Selection.OnAction = "Book1.xlsm!data_Click" 
End Sub 

Sub data_Click()  
    MsgBox "you have clicked me"  
    ActiveSheet.DrawingObjects.Delete   
End Sub 
+0

मेरा मतलब उपयोगकर्ताफॉर्म में जोड़े गए बटनों के लिए है, वर्कशीट – notnot

13

काम करना चाहिए; आपको पहले कक्षा मॉड्यूल में ईवेंट (ओं) जोड़ने की आवश्यकता है। मेरे उदाहरण के लिए, मैं एक घटना के साथ clsTEST नाम के एक वर्ग मॉड्यूल जोड़ने के लिए जा रहा हूँ, btn_click()

'#### CLASS NAMED clsTEST 
    Public WithEvents btn As MSForms.CommandButton 
    Public frm As UserForm 

    Dim iCount As Long 

    Private Sub btn_Click() 

    iCount = IIf(iCount < 1, 1, iCount + 1) 
    btn.Caption = "Count " & Str(iCount) 

End Sub 
'### END CLASS 

आप देख सकते हैं, केवल एक चीज यह कर देगा बटन के लिए पर शीर्षक सेट कर दिया जाता तब की संख्या बार आप इसे क्लिक किया।

Dim mColButtons As New Collection '## SET A NEW COLLECTION 

    Private Sub UserForm_Activate() 
    ' 
    Dim btnEvent As clsTEST 
    Dim ctl As MSForms.Control 
    ' 
    Set ctl = Me.Controls.Add("Forms.CommandButton.1") 
    ' 
    With ctl 
    .Caption = "XYZ" 
    .Name = "AButton" 
    END With 
    ' 
    Set btnEvent = new clsTEST 
    Set btnEvent.btn = ctl 
    set btnEvent.frm = Me 
    ' 
    mColButtons.add btnEvent 
    'End Sub 

आप प्रपत्र को सक्रिय करते हैं, यह एक बटन बना देगा: इसके बाद, प्रपत्र कोड में निम्नलिखित दर्ज करें। हर बार जब आप बटन पर क्लिक करेंगे तो कैप्शन बदल जाएगा।

+0

पर यह मेरे लिए बहुत अच्छा काम नहीं करता है। मैं सोच रहा था कि एक तरीका है कि मैं कक्षा में एक चर भेज सकता हूं। उदाहरण के लिए, अगर मैं बदलना चाहता था। जो भी मैं भेजता हूं उसे कैप्शन करना। निजी उप btn_Click (var1 स्ट्रिंग के रूप में) मैंने कोशिश की लेकिन इसके परिणामस्वरूप "ऑब्जेक्ट इस संपत्ति या विधि का समर्थन नहीं करता है" – JahKnows

+0

यह सही है। _Click() ईवेंट किसी भी पैरामीटर को स्वीकार नहीं करते हैं। वैकल्पिक रूप से आप कोशिश कर सकते हैं कि कक्षा के अंदर एक और निजी चर सेट करें और आपको पहले कैप्शन असाइन करें, और फिर अपना ईवेंट हैंडलर पर सेट करें। – PravyNandas

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