在Excel用户窗体上将点击VBA函数分配给一个dynamic创build的button

我使用以下代码在Excel用户窗体上dynamic创buildbutton:

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1") .Caption = "XYZ" .name = "AButton" .Font.Bold = True .ForeColor = &HFF& ... blah blah blah End With 

我想分配一个函数来运行时点击这些button,但我找不到一个简单的方法来做到这一点,因为没有属性作为button本身的一部分。

有没有办法使用上述成语做到这一点? 我应该以不同的方式来处理这件事吗?

您需要为每个buttondynamic创build代码/事件处理程序。

这需要一点 – 在这里看到: http : //navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

一个更好的方法可能是提前在表单上创build一堆button(尽可能多地按照你认为需要的方式)。 创build事件处理程序代码。 把它们全部隐藏起来。

然后当你的窗体打开时,你可以dynamic的改变button标题,使它们可见并移动它们。 您最初创build的事件代码将按照预期链接到激活的button。

以Excel格式dynamic添加控件事件; 您需要首先在类模块中添加事件。 对于我的示例,我将添加一个名为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 

正如你所看到的,这将做的唯一的事情是设置button的标题,然后点击它的次数。 接下来,在表单代码中input以下内容:

  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 

当你激活表单时,它会创build一个button。 每次点击button,标题都会改变。

下面的代码应该工作

 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""" 
 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 

我一直在看这个。 似乎你可以通过使用onClick属性来运行一个macros:

 Command1.OnClick = "Macro1" 

然后通过运行所需函数的名称创build一个macros。 这是我的破解,直到我find更好的东西。

Interesting Posts