【问题标题】:applying event handler to dynamic control将事件处理程序应用于动态控制
【发布时间】:2014-08-19 10:57:50
【问题描述】:

我有一个用户表单,它动态地将commandButton 放置到用户表单上,但我似乎无法正确设置动态事件处理程序:下面显示了我如何设置动态按钮的代码:

Set cButton = Me.Controls.Add("Forms.CommandButton.1")
With cButton
  .Left = 150
  .Top = 0
  .Width = 300
  .Height = 140
End With

我还在任何子程序或过程之外定义了dim WithEvents cButton as Commandbutton,最后我有了动态按钮的事件处理程序,我现在只想输出一条消息:

Private Sub cButton_Click()
   MsgBox "Dynamic Handler functioning correctly"
End Sub

现在我能够为各个控件的动态事件创建事件处理程序,但是我正在创建多个控件并且它们都具有相同的名称 cButton 那么我如何能够为每个控件创建单独的事件处理程序.下面显示了用于创建多个控件的代码:

If TextBox1 <> vbNullString Then
    For i = 1 To TextBox1.Value


    Set cButton = Me.Controls.Add("Forms.CommandButton.1")
        With cButton
            .Left = 150
            .Top = 0
            .Width = 300
            .Height = 140
        End With
  Next i
End IF

【问题讨论】:

  • 我什至没有意识到错字,但是当错字被修复后,问题仍然存在
  • 您需要删除此行:Dim cButton As Control
  • Rory 你会看看我在下面的答案下发布的评论,看看你是否可以就此事给我一些指导?
  • 如果以下答案对您有用,您应该将其标记为正确。您的跟进应移至一个新问题,该问题将得到更快的回答,并将两个主题分开以便在 StackOverflow 上搜索。

标签: vba excel


【解决方案1】:

cButton 只能声明一次:

Dim WithEvents cButton As CommandButton

Sub UserForm_Initialize()
    Set cButton = Me.Controls.Add("Forms.CommandButton.1")
    With cButton
      .Left = 150
      .Top = 0
      .Width = 300
      .Height = 140
    End With
End Sub

Private Sub cButton_Click()
   MsgBox "Dynamic Handler functioning correctly"
End Sub

【讨论】:

  • 效果很好,感谢您为我指明了正确的方向!这背后的另一个问题是:如果我有一个添加 3 个按钮的循环,我怎么能为每个按钮创建单独的事件处理程序,因为它们都具有相同的名称 cButton
  • @user3538102 在这种情况下,您需要cButton1cButton2、...:Dim WithEvents cButton1 As CommandButtonDim WithEvents cButton2 As CommandButton 等...并添加相应的事件处理程序:Private Sub cButton1_Click() ,...
  • 我将编辑这个问题,以便您知道我的意思,因为我不认为这是正确的,或者我错了
  • 如果您希望它们在单击时执行不同的操作,则需要单独的变量;如果没有,请使用一个类并创建您添加到数组/集合/字典的类的单独实例。这里和其他地方有很多这样的例子。 :)
  • 好的,谢谢信息!我会看看使用一个类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多