我正在使用以下代码在Excel用户表单上动态创建按钮:
With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
.Caption = "XYZ"
.name = "AButton"
.Font.Bold = True
.ForeColor = &HFF&
... blah blah blah
End With
我想在单击这些按钮时分配一个函数来运行,但我找不到一种直接的方法来执行此操作,因为按钮本身没有属性。
有没有办法用上面的习语做到这一点?我应该以不同的方式讨论这件事吗?
答案 0 :(得分:14)
在Excel表单中动态添加控件事件;您需要先在类模块中添加事件。对于我的例子,我将添加一个名为clsTEST的类模块,其中包含一个事件,btn_click()
'#### CLASS NAMED clsTEST
Public WithEvents btn As MSForms.CommandButton
Public frm As UserForm
Dim iCount As Long
Private Sub btn_Click()
iCount = IIf(iCount < 1, 1, iCount + 1)
btn.Caption = "Count " & Str(iCount)
End Sub
'### END CLASS
正如您所看到的,这样做的唯一方法是将按钮上的标题设置为您点击它的次数。 接下来,在表单代码中输入以下内容:
Dim mColButtons As New Collection '## SET A NEW COLLECTION
Private Sub UserForm_Activate()
'
Dim btnEvent As clsTEST
Dim ctl As MSForms.Control
'
Set ctl = Me.Controls.Add("Forms.CommandButton.1")
'
With ctl
.Caption = "XYZ"
.Name = "AButton"
END With
'
Set btnEvent = new clsTEST
Set btnEvent.btn = ctl
set btnEvent.frm = Me
'
mColButtons.add btnEvent
'End Sub
当您激活表单时,它将创建一个按钮。每次点击按钮,标题都会改变。
答案 1 :(得分:9)
您需要为每个按钮动态创建代码/事件处理程序。
需要做一些事情 - 请参阅此处:http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html
更好的方法可能是在表单上创建一堆按钮(尽可能多的是你需要的)。也创建事件处理程序代码。最初将它们全部隐藏起来。
然后,当您的表单打开时,您可以动态更改按钮标题,使其可见并移动它们。您最初创建的事件代码将按预期链接到激活的按钮。
答案 2 :(得分:2)
以下代码应该正常工作
Dim NewButton As OLEObject
Dim CodeModule As Object
Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
答案 3 :(得分:1)
Sub Oval1_Click()
file = ActiveWorkbook.Name
Set Output = Workbooks.Add()
ActiveWorkbook.SaveAs Filename:="Try.xls"
Sheets(1).Select
ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
ActiveSheet.Buttons.Text = "DATA"
ActiveSheet.Shapes("Button 1").Select
Selection.OnAction = "Book1.xlsm!data_Click"
End Sub
Sub data_Click()
MsgBox "you have clicked me"
ActiveSheet.DrawingObjects.Delete
End Sub
答案 4 :(得分:0)
我也一直在关注这个问题。似乎您可以使用onClick属性运行宏:
Command1.OnClick = "Macro1"
然后按照运行所需功能的名称创建一个宏。 这是我的黑客,直到找到更好的东西。