检测在Excel上运行时添加的组合框上的事件

时间:2012-02-28 04:37:18

标签: excel vba excel-vba events combobox

我的Excel中的VBA脚本有问题。我所做的基本上是创建按钮,按下这些按钮将在其中一个工作表中创建一组两个额外的组合框。可以连续按此按钮以添加更多组合框。

这些新创建的组合框的行为如下:

  1. 创建了2个Combobox
  2. Combobox1将在控制表中加载一些列表
  3. 每当选择Combobox1中的项目时,Combobox2将加载要添加到Combobox2的项目列表
  4. 添加按钮的代码就像这样

     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中复制此内容)

2 个答案:

答案 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的参考资料也可能有用。

enter image description here

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