2013-02-21 127 views
4

我一直在努力解決這個問題,現在...我想做一些非常簡單的事情。我想在運行時創建多個commandbutton,然後用一個過程處理這些commandbutton的事件。所以我建立了一個「withevents」類來處理自動化,但是我的代碼沒有工作。當我運行Test()時,CommandButton被創建,但是當我點擊它時...沒有消息框響應...我找不到錯誤..請任何幫助都會很棒!在運行時創建的OLEObject命令按鈕的處理事件

類CTEST

Public WithEvents Button As MSForms.CommandButton 

Public Sub Button_Click() 
s = MsgBox("Hello", vbOKOnly) 
End Sub 

模塊1

Public TestCollection As Collection 

Sub Test() 

Set TestCollection = New Collection 
Dim Btn As CommandButton 
Dim OLEBtnObj As cTest 
Set OLEBtnObj = New cTest 
Set Btn = Sheet1.OLEObjects.Add(ClassType:="Forms.CommandButton.1", link:=False,_ DisplayAsIcon:=False, Left:=368.25, Top:=51, Width:=44.25, Height:=24).Object 
Set OLEBtnObj.Button = Btn 
TestCollection.Add Item:=OLEBtnObj 

End Sub 
+0

我相信工作表控件(.OLEObjects.Add)似乎重新編譯項目。如果你想,嘗試使用Form Controls併爲其分配一個'.OnClick'事件,或者如果你仍然想使用ActiveX控件,那麼試試這個http://stackoverflow.com/questions/10633387/programatically-inserting-click- event-code-for-dynamic-generated-label-not-w – 2013-02-21 07:04:51

回答

5

我有:-)一個而不切實際的解決方案。要測試它,請在Sheet1 Class Module中放置以下代碼。

對於每個新的Sheet1按鈕,將添加一個新的事件處理。此事件處理程序將執行常見事件處理程序並將單擊的命令按鈕的名稱傳遞給它。

' Standard Module 
Sub test() 
    ' adds three buttons to Sheet1 with click-event handlers 
    Sheet1.AddButton 
    ActiveCell.Offset(5, 0).Activate 
    Sheet1.AddButton 
    ActiveCell.Offset(5, 0).Activate 
    Sheet1.AddButton 
End Sub 

' Sheet1 Class Module 
Option Explicit 

' Add Microsoft Visual Basic For Applications Extensibility 

Public Function AddButton() As MSForms.CommandButton 
    Dim msFormsCommandButton As MSForms.CommandButton 
    Set msFormsCommandButton = Me.OLEObjects.Add(ClassType:="Forms.CommandButton.1").Object 
    CreateEventHandler msFormsCommandButton.Name 
    Set AddButton = msFormsCommandButton 
End Function 

Private Sub CommonButton_Click(ByVal buttonName As String) 
    MsgBox "You clicked button [" & buttonName & "]" 
End Sub 

Private Sub CreateEventHandler(ByVal buttonName As String) 
    Dim VBComp As VBIDE.VBComponent 
    Dim CodeMod As VBIDE.CodeModule 
    Dim codeText As String 
    Dim LineNum As Long 

    Set VBComp = ThisWorkbook.VBProject.VBComponents(Me.CodeName) 
    Set CodeMod = VBComp.CodeModule 
    LineNum = CodeMod.CountOfLines + 1 

    codeText = codeText & "Private Sub " & buttonName & "_Click()" & vbCrLf 
    codeText = codeText & " Dim buttonName As String" & vbCrLf 
    codeText = codeText & " buttonName = """ & buttonName & "" & vbCrLf 
    codeText = codeText & " CommonButton_Click buttonName" & vbCrLf 
    codeText = codeText & "End Sub" 
    CodeMod.InsertLines LineNum, codeText 
End Sub 
+0

感謝上帝!這個def的工作原理......在廣泛研究這個問題之後,我們無法使用「withevents」關鍵字爲動態創建的OLEObjects構建包裝類。唯一的解決方案是以編程方式爲每個創建的對象在工作表模塊中插入新代碼...雖然這不是最優雅的解決方案,但它工作正常。非常感謝丹尼爾!並且爲了將來的參考,您是否認爲使用Visual Studio Tools for Office實現起來要容易得多。我想要熟悉那個API。現在使用VSOT而不是VBA形式... – 2013-02-21 22:44:13

+1

嗨,Sunny,我很高興它對你有用。除此之外,我沒有找到其他工作表上OLE按鈕的解決方案。熟悉VSTO非常有用。另一方面,VBA非常容易處理。 – dee 2013-02-22 07:10:35