操作用于多个类似动态创建的命令按钮(Actions for multiple similar dyn

2019-10-20 09:08发布

我写在Excel VBA程序,将基本上与一个文本框和一个命令按钮启动,命令按钮将创建一个新的文本框和命令按钮,它的下面,并命令按钮又会创建一个新的文本框和命令按钮,等等。 希望你跟着那些乱七八糟。

我可以创建初始的按钮没问题(它必须动态创建因此它稍后删除的机会)。 我的问题是然后创建click()事件处理程序。 我需要的所有click()事件做同样的事情,但命名相对于它自己的名字的新对象。 这是所有吹我的脑海里,我会很感激的帮助不大。

随意问的具体信息,但我还没有真正能够环绕的话题不够好写一些测试代码,但我的头。

Answer 1:

创建一个名为CEventClass自定义类模块(插入 - 类模块,F4改名字)。 键入此代码到类模块

'These are declared WithEvents so the events are
'exposed to us
Public WithEvents cmdEvent As MSForms.CommandButton
Public WithEvents tbxEvent As MSForms.TextBox


'This will fire for any control
'assigned to cmdEvent
Private Sub cmdEvent_Click()

    MsgBox cmdEvent.Caption

End Sub

'This will fire for any control
'assigned to tbxEvent
Private Sub tbxEvent_Change()

    If Len(tbxEvent.Text) < 6 Then
        tbxEvent.BackColor = vbYellow
    Else
        tbxEvent.BackColor = vbWhite
    End If

End Sub

现在创建上面没有控制用户窗体。 将这个代码的形式的代码模块中

'These will keep the class instances in
'scope for as long as the form is loaded
Private mEventButtons As Collection
Private mEventTexts As Collection

Private Sub UserForm_Initialize()

    Dim cmd As MSForms.CommandButton
    Dim txt As MSForms.TextBox
    Dim clsEventClass As CEventClass

    Set mEventButtons = New Collection
    Set mEventTexts = New Collection

    'Create two commandbuttons
    Set cmd = Me.Controls.Add("Forms.CommandButton.1", "FirstName")
    cmd.Top = 10
    cmd.Left = 10
    cmd.Caption = "First"
    'Create a new instance of CEventClass and
    'assign the button to cmdEvent
    Set clsEventClass = New CEventClass
    Set clsEventClass.cmdEvent = cmd
    mEventButtons.Add clsEventClass

    Set cmd = Me.Controls.Add("Forms.CommandButton.1", "SecondName")
    cmd.Top = 50
    cmd.Left = 10
    cmd.Caption = "Second"
    Set clsEventClass = New CEventClass
    Set clsEventClass.cmdEvent = cmd
    mEventButtons.Add clsEventClass

    'Create two textboxes and assign them to new instances
    'of the class
    Set txt = Me.Controls.Add("Forms.TextBox.1", "ThirdName")
    txt.Top = 10
    txt.Left = 150
    Set clsEventClass = New CEventClass
    Set clsEventClass.tbxEvent = txt
    mEventTexts.Add clsEventClass

    Set txt = Me.Controls.Add("Forms.TextBox.1", "FourthName")
    txt.Top = 50
    txt.Left = 150
    Set clsEventClass = New CEventClass
    Set clsEventClass.tbxEvent = txt
    mEventTexts.Add clsEventClass

End Sub

现在,当你运行的形式,这两个事件将如果单击/更改控制火势。

你可能注意到没有为文本框没有更新后事件。 该事件实际上不是一个文本框的事件,但对于文本框控件容器的事件,这样你就可以不公开这种方式。 这是一个原因,我更喜欢在设计时创建的所有控件和隐藏或根据需要取消隐藏它们。 我就这样我就不必重复码了这么多可能仍然使用一些控制WITHEVENTS。 但是,对于像TextBox_AfterUpdate,我只是在设计时创建的所有事件过程。

更新:

如果你希望事件来创建新的按钮,你必须做的一对夫妇更多的事情。 首先,你不得不暴露用户窗体外的集合。 您添加到您的用户窗体模块

Public Property Get EventButtons() As Collection
    Set EventButtons = mEventButtons
End Property

然后您更改命令按钮事件的代码来创建一个新的按钮

Private Sub cmdEvent_Click()

    Dim cmd As MSForms.CommandButton
    Dim clsEventClass As CEventClass

    Set cmd = cmdEvent.Parent.Controls.Add("Forms.CommandButton.1", cmdEvent.Caption & "1")
    cmd.Top = cmdEvent.Top + 40
    cmd.Left = cmdEvent.Left
    cmd.Caption = cmdEvent.Caption & "1"
    Set clsEventClass = New CEventClass
    Set clsEventClass.cmdEvent = cmd
    cmdEvent.Parent.EventButtons.Add clsEventClass

End Sub

这将创建一个新的按钮,40分以下哪个被点击了。 你不说你的逻辑是什么命名或定位,所以我想你可以工作了这一点。 使用cmdEvent.Parent获取到用户窗体的引用。



文章来源: Actions for multiple similar dynamically created command buttons