获取下拉框的选定值

12

我有一个Excel工作表里有成千上万个下拉框。用户将随机选择一个并填写。

如何获取所选下拉框的值?是否有触发函数(例如事件处理程序)的方法来检测下拉框是否已被选择?


1
你的意思是这些单元格中有“验证”选项吗?而不是真正的组合框,它是一个形状/表单对象... - Kazimierz Jawor
1
@KazJaw 这个问题确实需要澄清 :) 如果 OP 有 "成千上万" 的组合框,他将需要成千上万个事件处理程序。否则,如果它们只是验证选项,那么 Worksheet_Change 处理程序就可以解决问题。 - David Zemens
@DavidZemens,毕竟...你是对的 :) 所以,我认为你在评论中和下面(来自@user20623626)已经回答了问题。 - Kazimierz Jawor
5个回答

14
您可以使用下面的更改事件,当组合框的值发生变化时将触发该事件。
Private Sub ComboBox1_Change()
'your code here
End Sub

同时,您可以使用以下方法获取所选值

ComboBox1.Value

2
肯定这会起作用,但是如果 OP 确实在工作表上有“数千个”组合框,就需要相应数量的子例程;每个组合框需要一个子例程。 - David Zemens
1
我没有成千上万的组合框,只有一个,感谢您提供的示例。 - YetAnotherRandomUser

10

如果你正在处理数据验证列表,你可以使用Worksheet_Change事件。右键单击包含数据验证的工作表,选择“查看代码”。然后输入以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)

    MsgBox Target.Value

End Sub

如果你正在处理ActiveX comboboxes,那就有些复杂了。你需要创建一个自定义的类模块来连接事件。首先,创建一个名为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的实例。将其设置为Public可以保持其及其子项在范围内。您需要它们在范围内,以便触发事件。在该过程中,循环遍历所有下拉框,为每个下拉框创建一个新的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查看一个示例。

我想要一个简单的组合框,不需要数据库或可视控件,所以没有使用ActiveX对我来说更好? - Timo
1
您可以在开发者选项卡的表单部分使用组合框。您可以将宏分配给它,每次更改时都会运行该宏。它的功能有些受限,但这是我开始使用的内容,只有在有充分理由时才会转向ActiveX。 - Dick Kusleika
问候内布拉斯加州,我现在有一个ActiveX组合框 - 在设计上比没有ActiveX看起来更漂亮 - 不需要classevent代码。 sub cbx_change() ... end sub可以工作,那么为什么需要类呢?是为了拥有多个“change events”吗? - Timo
1
如果您想让一堆组合框使用相同的代码,您需要使用类。如果您只有一个或者几个组合框,您可以单独编写每个组合框的更改事件代码。 - Dick Kusleika
好的,使用工作簿/VBA编辑器环境中的类代码(eventeventsstandard module),它可以获取所有工作表中的所有组合框?啊,我明白了,这是针对sheet1的。 - Timo

0
对于ActiveX组合框,.value选项在过程中无法直接使用。我找到的最简单的解决方案是使用Workbook_Open来填充我的组合框下方的单元格的值(以便隐藏它),然后在我的代码中引用该值。
Private Sub ComboBoxName_Change()
  Range("C6") = ComboBoxName.Value
End Sub

0
从ComboBox控件中获取所选值的更简单方法是:
Private Sub myComboBox_Change()
  msgbox "You selected: " + myComboBox.SelText
End Sub

-1
也许您可以使用类似以下的伪代码来以编程方式设置事件处理程序:

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

for each cell
  cell.setEventHandler(myHandler)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接