我有一个Excel工作表里有成千上万个下拉框。用户将随机选择一个并填写。
如何获取所选下拉框的值?是否有触发函数(例如事件处理程序)的方法来检测下拉框是否已被选择?
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 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
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
class
和event
代码。 sub cbx_change() ... end sub
可以工作,那么为什么需要类呢?是为了拥有多个“change events”吗? - Timoevent
、events
和standard module
),它可以获取所有工作表中的所有组合框?啊,我明白了,这是针对sheet1
的。 - TimoPrivate Sub ComboBoxName_Change()
Range("C6") = ComboBoxName.Value
End Sub
Private Sub myComboBox_Change()
msgbox "You selected: " + myComboBox.SelText
End Sub
sub myhandler(eventsource)
process(eventsource.value)
end sub
for each cell
cell.setEventHandler(myHandler)
但我不知道在VB/VBA中实现这个的语法,或者是否可能。
Worksheet_Change
处理程序就可以解决问题。 - David Zemens