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中实现这一点的语法,或者甚至可能。