分配上单击VBA函数来动态创建的按钮上的Excel用户窗体

问题描述:

我在Excel用户窗体使用下面的代码创建一个按钮动态:分配上单击VBA函数来动态创建的按钮上的Excel用户窗体

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

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

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

你需要动态创建代码/事件处理程序为每个按钮。

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

一个更好的办法可能是创建一批在窗体上按钮(很多,你认为你需要)的时间提前。创建事件处理程序代码。首先让它们全部隐藏起来。

那么当你的窗体打开,你可以动态地改变按钮标题,使其可见和移动它们。您最初创建的事件代码将按照预期链接到激活的按钮。

+2

聪明的主意!看来VBA中的所有内容都需要很聪明。 – notnot 2009-02-19 20:22:56

我一直在寻找这一点。似乎你可以通过使用onClick属性来运行一个宏:

Command1.OnClick = "Macro1" 

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

+0

对于excel用户窗体控件,assingin“onClick”导致...“对象不支持此属性或方法” – PravyNandas 2017-07-24 09:59:50

在下面的代码应该是工作

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 
+0

我的意思是添加到用户窗体的按钮,而不是工作表 – notnot 2010-05-14 15:13:50

要在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 

当您激活形式,它会创建一个按钮。每次点击按钮时,标题都会改变。

+0

这对我来说很好。我想知道是否有一种方法可以向班级发送变量。例如,如果我要将.caption更改为我发送的任何内容。 Private Sub btn_Click(var1 As String) 我试过这个,但它导致“对象不支持这个属性或方法” – JahKnows 2017-02-17 16:03:38