针对多个类似dynamic创build的命令button的动作

我正在Excel VBA中编写一个程序,基本上会以一个文本框和一个命令button开始,命令button将在它下面创build一个新的文本框和命令button,而该命令button将依次创build一个新的文本框和命令button,等等。 希望你跟着那个烂摊子。

我可以创build初始button没有问题(它必须dynamic创build,所以有机会稍后删除)。 我的问题是创buildclick()事件处理程序。 我需要所有的click()事件来做同样的事情,但是将它们命名为相对于自己名字的新对象。 这一切都让我心动,我真的很感激一点帮助。

随意要求提供具体的信息,但是我还没有真正能够把我的头围绕在这个话题上,足以编写一些testing代码。

创build一个名为CEventClass的自定义类模块(Insert – Class Module,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 

现在创build一个没有控件的用户窗体。 把这个代码放在窗体的代码模块中

 '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 

现在,当你运行表单时,如果你点击/更改控件,这两个事件将会触发。

您可能会注意到文本框没有AfterUpdate事件。 该事件实际上不是文本框事件,而是文本框的控件容器的事件,所以不能以这种方式公开它。 这是我更喜欢在devise时创build所有控件并根据需要隐藏或取消隐藏的原因之一。 我仍然可以使用WithEvents来控制一些控件,所以我不必重复代码。 但对于像TextBox_AfterUpdate这样的东西,我只是在devise时创build了所有的事件过程。

更新:

如果你想要事件来创build新的button,你必须做更多的事情。 首先,你必须公开集合在用户表单之外。 您将其添加到您的Userform模块

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

然后你改变你的commandbutton事件代码来创build一个新的button

 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 

这将创build一个新的button40点以下,无论点击。 你不说你的命名或定位的逻辑是什么,所以我认为你可以解决这个问题。 使用cmdEvent.Parent获取对Userform的引用。