2009-12-16 53 views
3

在Excel VBA中我添加了一个命令按钮到窗体......像下面编程方式添加一个命令一个窗体

 Set ctrl = Me.Controls.Add(_ 
     bstrProgID:="Forms.CommandButton.1", _ 
     Name:="CommandButton1", Visible:=True) 

现在我想知道我怎么会告诉它被点击时它做什么?谢谢!!

回答

6

这是vba将让你做的的技术之一,但你可能不应该这样做。出于所有相同的原因,你不应该使用改变你的代码的代码。

这就是说,这里是如何做你想做的。首先插入一个类模块并将其命名为DynBtn,那么这段代码粘贴到它:

Private WithEvents mobjBtn As MSForms.CommandButton 
Private msOnAction As String 
''// This has to be generic or call by name won't be able to find the methods 
''// in your form. 
Private mobjParent As Object 

Public Property Get Object() As MSForms.CommandButton 
    Set Object = mobjBtn 
End Property 

Public Function Load(ByVal parentFormName As Object, ByVal btn As MSForms.CommandButton, ByVal procedure As String) As DynBtn 
    Set mobjParent = parentFormName 
    Set mobjBtn = btn 
    msOnAction = procedure 
    Set Load = Me 
End Function 

Private Sub Class_Terminate() 
    Set mobjParent = Nothing 
    Set mobjBtn = Nothing 
End Sub 

Private Sub mobjBtn_Click() 
    CallByName mobjParent, msOnAction, VbMethod 
End Sub 

现在,在您的形式使用,创建一个空白用户表单并粘贴此代码到其中:

Private Const mcsCmdBtn As String = "Forms.CommandButton.1" 
Private mBtn() As DynBtn 

Private Sub UserForm_Initialize() 
    Dim i As Long 
    ReDim mBtn(1) As DynBtn 
    For i = 0 To UBound(mBtn) 
     Set mBtn(i) = New DynBtn 
    Next 
    ''// One Liner 
    mBtn(0).Load(Me, Me.Controls.Add(mcsCmdBtn, "Btn1", True), "DoSomething").Object.Caption = "Test 1" 
    ''// Or using with block. 
    With mBtn(1).Load(Me, Me.Controls.Add(mcsCmdBtn, "Btn2", True), "DoSomethingElse").Object 
     .Caption = "Test 2" 
     .Top = .Height + 10 
    End With 
End Sub 

Public Sub DoSomething() 
    MsgBox "It Worked!" 
End Sub 

Public Sub DoSomethingElse() 
    MsgBox "Yay!" 
End Sub 

Private Sub UserForm_Terminate() 
    Erase mBtn 
End Sub 
+0

CallByName也可以传递对传递命令按钮的Name或Tag属性有用的参数。 – ak112358 2012-08-20 14:47:43

相关问题