检测Excel上运行时添加的combobox上的事件
我在Excel中的VBA脚本有问题。 我所做的是基本上创build的button,当按下时将创build一个两个额外的combobox在一个表中的一组。 可以连续按下此button来添加更多combobox。
这些新创build的combobox将performance如下:
- 创build了2个combobox
- Combobox1将在控制表中加载一些列表
- 只要selectCombobox1中的项目,Combobox2将加载要添加到Combobox2中的项目列表
添加button的代码是这样的
Sub Add_Criteria() Dim controlNum As Integer Dim name1 As String Dim name2 As String Dim oOle1 As OLEObject Dim oOle2 As OLEObject Dim uniqueString As String Dim cb1 As Object controlNum = Sheets("Controls").Range("A16").Value 'adding Control Set oOle1 = Sheets("System").OLEObjects _ .Add(ClassType:="Forms.ComboBox.1", Left:=10, _ Top:=75 + (controlNum * 20), Width:=100, Height:=18) Set oOle2 = Sheets("System").OLEObjects _ .Add(ClassType:="Forms.ComboBox.1", Left:=120, _ Top:=75 + (controlNum * 20), Width:=100, Height:=18) 'adding properties oOle1.Name = "Criteria" & controlNum * 2 - 1 oOle2.Name = "Criteria" & controlNum * 2 'adding control var Sheets("Controls").Range("A16").Value = controlNum + 1 With oOle1.Object .List = Sheets("Controls").Range("A5:A13").Value End With End Sub
问题是,我无法检测到事件。 我需要更改在combobox1中的值更改时创build的第二个combobox上显示的值。 我试图使用下面的参考,我仍然不能。 任何人都可以指导我如何做到这一点
参考(几天来一直在这个问题上):
http://www.dbforums.com/microsoft-excel/1641165-detecting-click-event-dynamically-created-controls.html (这是用户表单,我不知道为什么我不能在表中复制这个)
您可以以编程方式添加事件。 下面的代码为每个combobox添加一个事件
Pearson 编程的参考VBA编辑器也可能有用。
Sub Add_Criteria() Dim controlNum As Integer Dim name1 As String Dim name2 As String Dim oOle1 As OLEObject Dim oOle2 As OLEObject Dim uniqueString As String Dim cb1 As Object Dim strCode As String Dim vbProj As Object Dim vbCodeMod As Object Set vbProj = ActiveWorkbook.VBProject Set vbCodeMod = vbProj.vbcomponents(ActiveSheet.CodeName).codemodule controlNum = Sheets("Controls").Range("A16").Value 'adding Control Set oOle1 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=10, Top:=75 + (controlNum * 20), Width:=100, Height:=18) Set oOle2 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=120, Top:=75 + (controlNum * 20), Width:=100, Height:=18) vbCodeMod.AddFromString AddEvent(oOle1.Name) vbCodeMod.AddFromString AddEvent(oOle2.Name) 'adding properties oOle1.Name = "Criteria" & controlNum * 2 - 1 oOle2.Name = "Criteria" & controlNum * 2 'adding control var Sheets("Controls").Range("A16").Value = controlNum + 1 With oOle1.Object .List = Sheets("Controls").Range("A5:A13").Value End With End Sub Function AddEvent(strIn As String) As String AddEvent = "Private Sub " & strIn & "_Click()" & Chr(10) & _ "MsgBox ""Event Added""" & Chr(10) & _ "End Sub" End Function
打开一个新的工作簿,分别重命名工作表1和2“系统”和“控制”。 打开VBA编辑器并将上面的代码粘贴到通用模块中。 运行你的代码。 返回到Excel。 (Alt + F11)右键单击“系统”工作表选项卡,然后select“查看代码”。 将以下内容粘贴到模块中:
Sub FillCombo() With Sheets("System").Criteria299 'Change the name of the control as needed. .AddItem 1 .AddItem 2 End With End Sub Private Sub Criteria299_Change() 'Example of triggering the Change Event using Select Case With Sheets("System") Select Case .Criteria299.Value Case 1 .Criteria300 = "Dog" 'Change the name of the control as needed. Case 2 .Criteria300 = "Cat" End Select End With End Sub
看看项目资源pipe理器,你会看到代码是在系统工作表模块,而不是在一个通用的模块。
添加到工作表的任何控件事件过程都必须存储在该工作表的模块中。
只要您参考具有所示控件的工作表名称,FillCombo子文件就可以放在通用模块中。