VBA – 获取combobox的选定值

Excel工作表中有成千上万的单元格,它们是ComboBoxes。 用户将随机select一个并填充它。

如何获得所选的ComboBox值? 有没有办法触发一个function(即事件处理程序),当ComboxBoxes已被选中?

如果您正在处理数据validation列表,则可以使用Worksheet_Change事件。 右键单击包含数据validation的工作表,然后select查看代码。 然后input这个:

 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Target.Value End Sub 

如果你正在处理ActiveXcombobox,它会更复杂一些。 您需要创build一个自定义类模块来连接事件。 首先,创build一个名为CComboEvent的类模块,并将其放入其中。

 Public WithEvents Cbx As MSForms.ComboBox Private Sub Cbx_Change() MsgBox Cbx.Value End Sub 

接下来,创build另一个名为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 

最后,创build一个标准模块(不是类模块)。 您将需要代码将所有combobox放入类模块中。 你可以把它放在一个Auto_Open过程中,以便在打开工作簿时发生,但这取决于你。

您将需要一个Publicvariables来保存CComboEvents的一个实例。 把它公开化,它的所有孩子都会在范围之内。 您在范围内需要它们以便触发事件。 在该过程中,遍历所有combobox,为每个combobox创build一个新的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 

现在,每当一个combobox被改变时,事件就会触发,在这个例子中,一个消息框将会显示。

你可以在https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm看到一个例子

您可以使用下面的更改事件,当combobox值发生改变时将触发。

 Private Sub ComboBox1_Change() 'your code here End Sub 

你也可以用下面的方法获得选定的值

 ComboBox1.Value 

也许你可以设置事件处理程序编程,使用像(伪代码)

 sub myhandler(eventsource) process(eventsource.value) end sub for each cell cell.setEventHandler(myHandler) 

但我不知道在VB / VBA中实现这一点的语法,或者甚至可能。