我有一个相当不切实际的解决方案。要测试它,请将以下代码放入
图纸类模块
(见附图)。这个
Me.CodeName
指
Code-Name
纸张的。
对于每个新的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