eventsvbaevent-handlingolecommandbutton

Handling Events for OLEObject CommandButtons created at Runtime


I have struggled with this problem for while now...I want to do something very simple. I want to create multiple commandbuttons at runtime, and then handle events for these commandbuttons with one procedure. So I have built a "withevents" class to handle the automation, but my code is not working. When I run Test(), the CommandButton is created, but when I click on it...there is no messagebox response...I cannot find the error..Please any help would be great!!

Class cTest

Public WithEvents Button As MSForms.CommandButton

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

Module 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

Solution

  • I have one rather impractical solution. To test it place the following code in Sheet Class Module (see attached image). The Me.CodeName refers to Code-Name of the sheet.

    For each new Sheet1-button a new event handled will be added. This event handler will execute the common event handler and pass the name of the clicked command button to it.

    ' 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
    

    enter image description here