处理许多ComboBox_Change事件

时间:2016-01-16 03:34:20

标签: excel excel-vba excel-2010 excel-2007 vba

嗯,我也是VBA编程的新手。我正在创建一个帮助我做引用的表单,然后我的表单中有一部分显示我已注册的项目,如下所示:

My Form with ComboBoxes

所以这些ComboBoxes的目的是根据我选择的选项更改或删除相应的项目,我的UserForm中会有很多这样的项目,这使得很难创建许多ComboBox事件程序(如ComboBox1_Change,ComboBox2_Change) ,... ComboBox50_Change)。然后,主要问题是:如何在不浪费大量时间为不同对象制作相同代码的情况下在VBA中执行此操作?我想为所有ComboBox只创建一个代码。

我知道我可以在下面以这种方式做,但我确信它有更好的方法。

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分钟搜索这个问题,但我找不到任何对我好的东西。我希望你们明白我的问题。提前谢谢。

更新

正如我在评论中所说的那样,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
'

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

1 个答案:

答案 0 :(得分:2)

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

在项目中插入一个类模块。将其命名为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都将使用此事件处理。