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

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

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

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

  • 创建了2个组合框
  • Combobox1将在控制表中加载一些列表
  • 每当选择Combobox1中的项目时,Combobox2将加载要添加到Combobox2的项目列表
  • 添加按钮的代码如下所示

     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==