Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 获取组合框的选定值_Excel_Vba_Combobox - Fatal编程技术网

Excel 获取组合框的选定值

Excel 获取组合框的选定值,excel,vba,combobox,Excel,Vba,Combobox,Excel工作表中有数千个单元格,它们是组合框。用户将随机选择一个并填充它 如何获取选定的组合框值?当选择ComboxBox时,是否有方法触发函数(即事件处理程序)?您可以使用下面的更改事件,当ComboxBox值更改时将触发该事件 Private Sub ComboBox1_Change() 'your code here End Sub 此外,您还可以使用以下命令获取所选值 ComboBox1.Value 也许您可以使用类似(伪代码)的方式以编程方式设置事件处理程序 但是我不知道在VB/

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


如何获取选定的组合框值?当选择ComboxBox时,是否有方法触发函数(即事件处理程序)?

您可以使用下面的更改事件,当ComboxBox值更改时将触发该事件

Private Sub ComboBox1_Change()
'your code here
End Sub
此外,您还可以使用以下命令获取所选值

ComboBox1.Value

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


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

如果您处理的是数据验证列表,可以使用工作表更改事件。在带有数据验证的工作表上单击鼠标右键,然后选择“查看代码”。然后输入以下内容:

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
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
最后,创建一个标准模块(不是类模块)。您将需要代码将所有组合框放入类模块中。您可以将其放在自动打开过程中,以便在工作簿打开时发生,但这取决于您

您需要一个公共变量来保存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
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
现在,无论何时更改组合框,都将触发事件,在本例中,将显示一个消息框


您可以在

中看到一个示例。从组合框控件获取所选值的更简单方法是:

Private Sub myComboBox_Change()
  msgbox "You selected: " + myComboBox.SelText
End Sub

您的意思是在这些单元格中有“验证”选项吗??不是一个真正的组合框,它是一个形状/形式对象…@KazJaw这个问题确实需要澄清:)如果OP有“数千”个组合框,他将需要数千个事件处理程序。否则,如果它们只是验证选项,一个
工作表\u更改
处理程序将完成此任务。@DavidZemens,毕竟。。。你是对的:)因此,我认为在你的评论和下面(来自@user20623626)中已经有了问题的答案,这肯定会起作用,但如果OP的工作表上确实有“数千”个组合框,则需要相应的数千个子例程;每个组合框1个。我没有数千个组合框,只有1个,我非常感谢这个示例。我想要一个没有数据库或可视化控件的简单组合框,所以没有activex对我来说似乎更好?您可以使用“开发人员”选项卡“窗体”部分的组合框。您可以为其指定一个宏,该宏在每次更改时都会运行。它有一点局限性,但这是我开始使用的,我只有在有充分理由的情况下才会使用ActiveX。向内布拉斯加州问好,我现在有了ActiveX combobox,它在设计上比没有ActiveX更好,而且不需要
事件
代码<代码>子cbx_更改()。。。end sub有效,那么为什么需要这些类呢?要拥有多个
更改事件
?如果希望一组组合框使用相同的代码,则需要这些类。如果您有一个或只有几个,您可以分别对它们的每个更改事件进行编码。好的,使用工作簿/vba编辑器环境中的类代码(
事件
事件
标准模块
),它可以控制所有工作表中的所有组合框吗?啊,我知道它是为
sheet1
设计的。。