Vba 在Excel上运行时添加的组合框上检测事件
我在Excel中的VBA脚本有问题。我所做的基本上是创建按钮,当按下按钮时,将在其中一个工作表中创建一组两个额外的组合框。可以连续按下此按钮以添加更多组合框 这些新创建的组合框的行为如下:Vba 在Excel上运行时添加的组合框上检测事件,vba,excel,events,combobox,Vba,Excel,Events,Combobox,我在Excel中的VBA脚本有问题。我所做的基本上是创建按钮,当按下按钮时,将在其中一个工作表中创建一组两个额外的组合框。可以连续按下此按钮以添加更多组合框 这些新创建的组合框的行为如下: 创建了2个组合框 Combobox1将在控制表中加载一些列表 每当选择Combobox1中的项目时,Combobox2将加载要添加到Combobox2的项目列表 添加按钮的代码如下所示 Sub Add_Criteria() Dim controlNum As Integer D
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中的值更改时创建的第二个Combox1上显示的值。我试着使用下面的参考,但仍然不能。有人能告诉我怎么做吗
参考资料(关于此问题已讨论了几天):
(这是针对userform的,我不知道为什么我不能在工作表中复制它)打开新的工作簿,分别将工作表1和2重命名为“系统”和“控件”。 打开VBA编辑器,将上面的代码粘贴到通用模块中。 运行你的代码。 返回Excel。(Alt+F11) 在“系统图纸”选项卡上单击鼠标右键,然后选择“查看代码”。 在模块中粘贴以下内容:
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
查看ProjectExplorer,您将看到代码在系统工作表模块中,而不是在常规模块中
添加到工作表的控件的任何事件过程都必须存储在该工作表的模块中
只要引用具有所示控件的工作表名称,FillCombo子模块就可以放在通用模块中。打开新工作簿,分别将工作表1和2重命名为“系统”和“控件”。 打开VBA编辑器,将上面的代码粘贴到通用模块中。 运行你的代码。 返回Excel。(Alt+F11) 在“系统图纸”选项卡上单击鼠标右键,然后选择“查看代码”。 在模块中粘贴以下内容:
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
查看ProjectExplorer,您将看到代码在系统工作表模块中,而不是在常规模块中
添加到工作表的控件的任何事件过程都必须存储在该工作表的模块中
只要引用具有所示控件的工作表名称,FillCombo子模块就可以放在常规模块中。您可以通过编程方式添加事件。下面的代码为每个组合框添加一个事件 皮尔逊的这篇参考资料也可能有用
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
您可以通过编程方式添加事件。下面的代码为每个组合框添加一个事件 皮尔逊的这篇参考资料也可能有用
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
正是我需要的。此答案在添加和删除组合框时会添加另一个问题。每当我添加组合框时,它将被命名为Criteria1、Criteria2,依此类推。当我删除时,我将删除最后2个条件,即,如果我有10个组合框,我将删除Criteria10和Criteria9,但通过此操作,添加到工作表中的事件不会被删除并创建一个不明确的子项,因为存在同名的现有子项。我可以添加一个增量命名而不减少,但它并不优雅。有没有办法把它也删除PS:我想+1这个答案,但我需要15个rep=。=这正是我需要的。此答案在添加和删除组合框时会添加另一个问题。每当我添加组合框时,它将被命名为Criteria1、Criteria2,依此类推。当我删除时,我将删除最后2个条件,即,如果我有10个组合框,我将删除Criteria10和Criteria9,但通过此操作,添加到工作表中的事件不会被删除并创建一个不明确的子项,因为存在同名的现有子项。我可以添加一个增量命名而不减少,但它并不优雅。PS:我想+1这个答案,但我需要15个rep==