我的 Excel 工作表中有数千个单元格,它们是组合框。用户将随机选择一个并填充它。
如何获取选定的 ComboBox 值?有没有办法在选择 ComboxBox 时触发函数(即事件处理程序)?
您可以使用以下更改事件,当组合框值发生更改时将触发该事件。
Private Sub ComboBox1_Change()
'your code here
End Sub
您也可以使用下面的方法获取所选值
ComboBox1.Value
如果您正在处理数据验证列表,则可以使用 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 过程中,以便每当打开工作簿时都会发生,但这取决于您。
您需要一个公共变量来保存 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
查看示例从 ComboBox 控件获取所选值的更简单方法是:
Private Sub myComboBox_Change()
msgbox "You selected: " + myComboBox.SelText
End Sub
对于 ActiveX 组合框,.value 选项不能直接在过程中使用。我发现的最简单的解决方案是使用 Workbook_Open 填充组合框下单元格中的值(因此它是隐藏的),然后在我的代码中引用该值。
Private Sub ComboBoxName_Change()
Range("C6") = ComboBoxName.Value
End Sub
也许您可以使用(伪代码)之类的东西以编程方式设置事件处理程序
sub myhandler(eventsource)
process(eventsource.value)
end sub
for each cell
cell.setEventHandler(myHandler)
但我不知道在 VB/VBA 中实现此目的的语法,或者是否可能。