我的Excel中的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
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中的值更改时创建的第二个组合框上显示的值。我尝试使用下面的参考,我仍然不能。任何人都可以指导我如何做到这一点
参考(几天来一直在这个问题上):
http://www.dbforums.com/microsoft-excel/1641165-detecting-click-event-dynamically-created-controls.html(这是针对用户形式的,我不知道为什么我无法在Sheet中复制此内容)
答案 0 :(得分:1)
打开一个新的工作簿并重命名工作表1和2" System"和"控制"分别。 打开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
查看Project Explorer,您将看到代码位于系统工作表模块中,而不是通用模块中。
添加到工作表中的控件的任何事件过程都必须存储在该工作表的模块中。
只要您参考具有所示控件的工作表名称,就可以将FillCombo子放在通用模块中。
答案 1 :(得分:0)
您可以通过编程方式添加事件。下面的代码为每个组合框添加一个事件
Pearson Programming The VBA Editor的参考资料也可能有用。
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