2013-03-20 125 views
7

我在Excel工作表中有成千上万个单元格,它们是ComboBoxes。用户将随机选择一个并填充它。VBA - 获取组合框的选定值

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

+1

一个例子,你的意思是你在这些单元格“验证”选项?不是一个真正的组合框,它是一个形状/形式的对象... – 2013-03-20 23:27:03

+1

@KazJaw这个问题确实需要澄清:)如果OP有“数千”组合框,他将需要数千个事件处理程序。否则,如果他们只是验证选项,一个'Worksheet_Change'处理程序就可以解决问题。 – 2013-03-21 01:55:27

+0

@DavidZemens,毕竟......你是对的:)所以,我认为你的评论和下面的问题已经有答案(来自@ user20623626) – 2013-03-21 06:55:40

回答

6

如果您正在处理数据验证列表,则可以使用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过程中,以便在打开工作簿时发生,但这取决于您。

您需要一个Public变量来存放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

4

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

Private Sub ComboBox1_Change() 
'your code here 
End Sub 

您也可以通过以下

ComboBox1.Value 
+1

这肯定会起作用,但是如果OP确实有“成千上万”工作表上的组合框将需要相应的数千个子程序;每个组合框1个。 – 2013-03-21 01:54:00

+0

我没有成千上万的组合框,只有1个,我非常感谢这个例子。 – YetAnotherRandomUser 2017-03-14 13:54:30

-1

也许你就可以编程设置事件处理程序获得所选值,使用类似(伪)

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

for each cell 
    cell.setEventHandler(myHandler) 

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