我在用户表单上有4个以上的ComboBox。当他们开火时,他们会开火。我想要做的是找出哪个ComboBox触发了该事件。组合框是根据有多少组件创建的。生成ComboBoxes的代码如下所示:
For j = 0 To UBound(ComponentList) - 1
'Set Label
num = j + 1
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True)
With control
.Caption = "Component " & CStr(num)
.Left = 30
.Top = Height
.Height = 20
.Width = 100
.Visible = True
End With
'set ComboBox
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True)
With combo
.List = ComponentList()
.Left = 150
.Top = Height
.Height = 20
.Width = 50
.Visible = True
Set cButton = New clsButton
Set cButton.combobox = combo
coll.Add cButton
End With
Height = Height + 30
Next j
这很好用,我可以得到用户选择的值,但我找不到使用的ComboBox。下面的代码是它触发的事件(clsButton
):
Public WithEvents btn As MSForms.CommandButton
Public WithEvents combobox As MSForms.combobox
Private combolist() As String
Private Sub btn_Click()
If btn.Caption = "Cancel" Then
MsgBox "Cancel"
Unload UserForm1
Variables.ComponentSelectionError = False
ElseIf btn.Caption = "Enter" Then
MsgBox "enter"
Unload UserForm1
Variables.ComponentSelectionError = True
End If
End Sub
Private Sub combobox_Click()
MsgBox combobox.Value
End Sub
上面的这段代码由Doug Glancy亲自处理,以便使用代码生成的ComboBox来处理事件。
如何获取触发事件的ComboBox?即姓名或其他形式的身份证明。
答案 0 :(得分:5)
我搜索了超过500个网页(花了很长时间)后,终于回答了我自己的问题
这是我使用的,当点击某些组合框时它会起作用并触发:
Private Sub combobox_Click()
MsgBox combobox.Value
If combobox = UserForm1.Controls("Component0") Then
MsgBox "Success1"
End If
If combobox = UserForm1.Controls("Component1") Then
MsgBox "Success2"
End If
End Sub
希望这可以用于其他需要它的人。
答案 1 :(得分:4)
在类.Name
中不会出现在组合框的intellisense列表中,因为MSForms.ComboBox
实际上没有名称属性本身(在F2对象浏览器中看一下),而不是属性由Control
基类提供:
Private Sub combobox_Click()
MsgBox combobox.Value
MsgBox combobox.Name '// no hint but still works
'//cast to a Control to get the formal control interface with .Name
Dim ctrl As Control: Set ctrl = combobox
MsgBox ctrl.Name
End Sub
答案 2 :(得分:2)
也许再次参考btn.Combobox?类似于您首先将组合框分配给按钮的方式,但后来反过来:
set combobox = btn.Combobox
答案 3 :(得分:0)
您是否有理由不在自定义类中添加属性并在集合中注册时设置该属性?
For j = 0 To UBound(ComponentList) - 1
'Set Label
num = j + 1
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True)
With control
.Caption = "Component " & CStr(num)
.Left = 30
.Top = Height
.Height = 20
.Width = 100
.Visible = True
End With
'set ComboBox
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True)
With combo
.List = ComponentList()
.Left = 150
.Top = Height
.Height = 20
.Width = 50
.Visible = True
Set cButton = New clsButton
'*******EDIT********
with cButton
.combobox = combo
.Indx = j
end With 'cButton
'*******************
coll.Add cButton
End With
Height = Height + 30
Next j
课程模块
Public WithEvents btn As MSForms.CommandButton
Dim WithEvents mCombobox As MSForms.comboBox
Private combolist() As String
'*******EDIT********
Public Indx As Long
Property Let comboBox(cb As MSForms.comboBox)
Set mCombobox = cb
End Property
'*******************
Private Sub btn_Click()
If btn.Caption = "Cancel" Then
MsgBox "Cancel"
Unload UserForm1
Variables.ComponentSelectionError = False
ElseIf btn.Caption = "Enter" Then
MsgBox "enter"
Unload UserForm1
Variables.ComponentSelectionError = True
End If
End Sub
Private Sub mCombobox_Click()
'*******EDIT********
MsgBox "Combobox " & Indx & Chr(9) & mComboBox.Value
'*******************
End Sub
由于您需要多对一的事件映射,我假设您在实际代码中有一个共同的回调,所以您也可以这样做...
在标准模块中
Public Sub cbCallBack(ocb As clsButton)
MsgBox ocb.Indx
End Sub
在clsButton中(替换事件处理程序)
Private Sub mCombobox_Click()
cbCallBack Me
End Sub