处理许多ComboBox_Change事件

那么我也是VBA编程的新手。 我正在创build一个帮助我做报价的表单,然后我的表单的一部分显示了我已经注册的项目,如下所示:

我的表单与combobox

所以这些ComboBoxes的目的是根据我select的选项更改或删除相应的项目,我会有很多他们在我的UserForm,使很难创build许多ComboBox事件程序(如ComboBox1_Change,ComboBox2_Change,.. 。ComboBox50_Change)。 然后,主要问题是:我怎样才能在VBA中做到这一点,而不必花费大量的时间为不同的对象创build相同的代码呢? 我想为所有combobox创build一个代码。

我明白,我可以在下面这样做,但我相信它有一个更好的办法。

Sub ComboBox1_Change() Call myCode End Sub Sub ComboBox2_Change() Call myCode End Sub Sub ComboBox50_Change() Call MyCode End Sub Sub myCode() For i=1 to 50 If Controls("ComboBox" & i).Value = "Change" Then Call MySecondCode End If Next i End Sub 

我花了大约30分钟的时间寻找这个问题,但是我没有find对我有益的东西。 我希望你们明白我的问题。 提前致谢。

更新:

Axel Richter,正如我在评论中所说,我在这方面遇到了问题:

 Private Function isNOKTest() If prod1.Value = "" Or _ prod2.Value = "" Or _ tecido.Value = "" Or _ tamanhos.Value = "" Or _ unitario.Value = "" Or _ quantidade.Value = "" Then isNOKTest = True End If End Function Private myCBsWithEvents As Collection Private Sub UserForm_Initialize() Set myCBsWithEvents = New Collection For Each c In Me.Controls If Left(c.Name, 8) = "ComboBox" Then c.AddItem "CHANGE" c.AddItem "DELETE" Set myCBWithEvents = New clsCBWithEvents Set myCBWithEvents.myCB = c myCBsWithEvents.Add myCBWithEvents End If Next End Sub ' ' ' 'datatext.Value = Format(Now, "dd/mm/yyyy") 'bordadoqty.Value = 1 'estampaqty.Value = 1 'Itemlab.Caption = 1 ' 

当任何代码被添加到项目中,类模块中的事件不起作用,显然不与“事件”链接,但我不知道发生了什么。

这可以通过使用处理事件的类模块来实现。

在你的项目中插入一个类模块。 将其命名为clsCBWithEvents 。 在这个类模块中有以下代码:

 Public WithEvents myCB As ComboBox Private Sub myCB_Change() If Me.myCB.Value = "Change" Then MsgBox Me.myCB.Name & " has changed to ""Change""" ElseIf Me.myCB.Value = "Delete" Then MsgBox Me.myCB.Name & " has changed to ""Delete""" End If End Sub 

在你的用户表单中有以下代码:

 Private myCBsWithEvents As Collection Private Sub UserForm_Initialize() Set myCBsWithEvents = New Collection For Each c In Me.Controls If TypeName(c) = "ComboBox" Then c.AddItem "Change" c.AddItem "Delete" Set myCBWithEvents = New clsCBWithEvents Set myCBWithEvents.myCB = c myCBsWithEvents.Add myCBWithEvents End If Next End Sub 

现在,此用户表单中的每个ComboBox都将使用此事件处理。