2009-12-16 27 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

相關問題