【问题标题】:Assign on-click VBA function to a dynamically created button on Excel Userform将单击 VBA 函数分配给 Excel 用户窗体上动态创建的按钮
【发布时间】:2010-10-08 16:22:15
【问题描述】:

我正在使用以下代码在 Excel 用户窗体上动态创建按钮:

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

我想指定一个函数在单击这些按钮时运行,但我找不到直接的方法来执行此操作,因为按钮本身没有属性。

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

【问题讨论】:

    标签: excel vba event-handling userform


    【解决方案1】:

    在 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
    

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

    【讨论】:

    • 这对我来说效果很好。我想知道有没有办法可以向班级发送变量。例如,如果我要将 .caption 更改为我发送的任何内容。 Private Sub btn_Click(var1 As String) 我试过了,但结果是“对象不支持这个属性或方法”
    • 没错。 _Click() 事件不接受任何参数。或者,您可以尝试在类中设置另一个私有变量并首先为您分配标题,然后将您的事件设置给处理程序。
    【解决方案2】:

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

    这需要做一些工作 - 请参阅此处:http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

    更好的方法可能是提前在表单上创建一堆按钮(您认为需要多少就多少)。同时创建事件处理程序代码。最初将它们全部隐藏。

    然后,当您的表单打开时,您可以动态更改按钮标题、使其可见并四处移动。您最初创建的事件代码将按预期链接到激活的按钮。

    【讨论】:

    • 聪明的主意!似乎 VBA 中的一切都需要聪明。
    【解决方案3】:

    下面的代码应该可以工作

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

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:

        我也一直在看这个。似乎您可以使用 onClick 属性运行宏:

        Command1.OnClick = "Macro1"
        

        然后使用该名称创建一个运行所需功能的宏。 这是我解决这个问题的技巧,直到我找到更好的东西。

        【讨论】:

        • 对于一个 excel 用户窗体控件,assingin "onClick" 导致... "对象不支持此属性或方法"
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 2018-02-17
        • 1970-01-01
        • 2016-11-19
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多