处理许多 ComboBox_Change 事件
Handle many ComboBox_Change Event
嗯,我也是 VBA 编程的新手。我正在创建一个表格来帮助我进行报价,然后我的表格的一部分显示了我已经注册的项目,如下所示:
所以这些组合框的目的是根据我选择的选项更改或删除相应的项目,我的用户窗体中会有很多组合框,因此很难创建许多组合框事件程序(如 ComboBox1_Change, ComboBox2_Change, ... ComboBox50_Change)。然后,主要问题是:我怎样才能在 VBA 中做到这一点而不浪费大量时间为不同的对象制作相同的代码?我只想为所有组合框创建一个代码。
我知道我可以用下面的方法来做,但我相信它有更好的方法。
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
'
当任何代码添加到项目中时,class 模块中的事件不起作用,显然没有链接到 "Events",但我不知道发生了什么。
这可以使用处理事件的 class 模块来实现。
在您的项目中插入一个 class 模块。将其命名为 clsCBWithEvents
。在这个 class 模块中有以下代码:
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
都将使用此事件处理。
嗯,我也是 VBA 编程的新手。我正在创建一个表格来帮助我进行报价,然后我的表格的一部分显示了我已经注册的项目,如下所示:
所以这些组合框的目的是根据我选择的选项更改或删除相应的项目,我的用户窗体中会有很多组合框,因此很难创建许多组合框事件程序(如 ComboBox1_Change, ComboBox2_Change, ... ComboBox50_Change)。然后,主要问题是:我怎样才能在 VBA 中做到这一点而不浪费大量时间为不同的对象制作相同的代码?我只想为所有组合框创建一个代码。
我知道我可以用下面的方法来做,但我相信它有更好的方法。
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
'
当任何代码添加到项目中时,class 模块中的事件不起作用,显然没有链接到 "Events",但我不知道发生了什么。
这可以使用处理事件的 class 模块来实现。
在您的项目中插入一个 class 模块。将其命名为 clsCBWithEvents
。在这个 class 模块中有以下代码:
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
都将使用此事件处理。