11

我在 Excel 工作表中有数千个单元格,它们是组合框。用户将随机选择一个并填充它。

如何获取选定的 ComboBox 值?当 ComboxBoxes 被选中时,有没有办法触发一个函数(即事件处理程序)?

4

4 回答 4

12

您可以使用以下更改事件,该事件将在组合框值更改时触发。

Private Sub ComboBox1_Change()
'your code here
End Sub

您也可以使用以下方法获取所选值

ComboBox1.Value
于 2013-03-21T01:43:05.063 回答
9

如果您正在处理数据验证列表,则可以使用 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看到一个示例

于 2013-03-21T13:25:36.890 回答
0

从 ComboBox 控件获取选定值的更简单方法是:

Private Sub myComboBox_Change()
  msgbox "You selected: " + myComboBox.SelText
End Sub
于 2020-05-21T03:06:22.913 回答
-1

也许您可以使用(伪代码)之类的方式以编程方式设置事件处理程序

sub myhandler(eventsource)
  process(eventsource.value)
end sub

for each cell
  cell.setEventHandler(myHandler)

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

于 2013-03-21T08:45:58.853 回答