我在Excel工作表中有数千个单元格,它们是ComboBoxes。用户将随机选择一个并填充。
如何获取所选的ComboBox值?选择了ComboxBoxes后,是否有一种方法可以触发函数(即事件处理程序)?
如果要处理数据验证列表,则可以使用Worksheet_Change事件。右键单击带有数据验证的工作表,然后选择查看代码。然后输入以下内容:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Value
End Sub
如果要处理ActiveX组合框,则要复杂一些。您需要创建一个自定义类模块来挂接事件。首先,创建一个名为CComboEvent的类模块,并将此代码放入其中。
Public WithEvents Cbx As MSForms.ComboBox
Private Sub Cbx_Change()
MsgBox Cbx.Value
End Sub
接下来,创建另一个名为CComboEvents的类模块。这将保存我们所有的CComboEvent实例并将它们保持在范围内。将此代码放在CComboEvents中。
Private mcolComboEvents As Collection
Private Sub Class_Initialize()
Set mcolComboEvents = New Collection
End Sub
Private Sub Class_Terminate()
Set mcolComboEvents = Nothing
End Sub
Public Sub Add(clsComboEvent As CComboEvent)
mcolComboEvents.Add clsComboEvent, clsComboEvent.Cbx.Name
End Sub
最后,创建一个标准模块(不是类模块)。您将需要代码将所有组合框放入类模块中。您可以将其放在Auto_Open过程中,以便在打开工作簿时都会发生,但这取决于您。
您需要一个Public变量来保存CComboEvents的实例。将其公开将使它及其所有子级失去作用。您需要在范围内使用它们,以便触发事件。在该过程中,循环浏览所有组合框,为每个组合框创建一个新的CComboEvent实例,然后将其添加到CComboEvents。
Public gclsComboEvents As CComboEvents
Public Sub AddCombox()
Dim oleo As OLEObject
Dim clsComboEvent As CComboEvent
Set gclsComboEvents = New CComboEvents
For Each oleo In Sheet1.OLEObjects
If TypeName(oleo.Object) = "ComboBox" Then
Set clsComboEvent = New CComboEvent
Set clsComboEvent.Cbx = oleo.Object
gclsComboEvents.Add clsComboEvent
End If
Next oleo
End Sub
现在,只要更改组合框,事件就会触发,并且在此示例中,将显示一个消息框。
您可以在https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm看到示例
您可以使用下面的更改事件,当组合框值更改时将触发此事件。
Private Sub ComboBox1_Change()
'your code here
End Sub
也可以使用下面的方法获得选择的值
ComboBox1.Value
从ComboBox控件中获取选定值的更简单方法是:
Private Sub myComboBox_Change()
msgbox "You selected: " + myComboBox.SelText
End Sub
也许您将能够使用(伪代码)之类的程序来设置事件处理程序。>
sub myhandler(eventsource) process(eventsource.value) end sub for each cell cell.setEventHandler(myHandler)
但是我不知道在VB / VBA中实现此目标的语法,或者甚至是可能的。