2012-02-28 48 views
1

我在Excel中遇到了与我的VBA脚本有关的问题。我所做的是基本上创建按钮,当按下时会在其中一张表中创建一组两个额外的组合框。可以连续按下此按钮以添加更多组合框。运行时在Excel上检测组合框上的事件

这些新创建的组合框将像这样:

  1. 创建2组合框
  2. Combobox1将在控制片加载一些列表
  3. 只要选择在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中的值更改时创建的第二个组合框上显示的值。我试图使用下面的参考,我仍然不能。任何人都可以指导我如何做到这一点

参考(一直在这个问题天):

http://www.dbforums.com/microsoft-excel/1641165-detecting-click-event-dynamically-created-controls.html(这是为用户窗体,我不知道为什么我不能复制这片)

回答

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 
+1

正是我所需要的。当组合框被添加和删除时,这个答案增加了另一个问题。 每当我添加组合框,它将被命名为标准1,Criteria2,等等 当我删除,我会删除最后2个标准,也就是说,如果我有10个组合框,我会删除Criteria10和Criteria9 但随着这样,添加到工作表的事件不会被删除,并且会创建一个模糊的子项,因为存在具有相同名称的子项。我可以在不减少的情况下添加一个增量命名,但它并不优雅。有没有办法将其删除 PS:我想+1这个答案,但我需要15 rep =。= – 2012-02-28 10:39:07

1

分别打开新的工作簿并重命名工作表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 

看项目资源管理器,你会看到代码是系统工作模块中,而不是在一个通用模块。

添加到工作表的控件的任何事件过程都必须存储在该工作表的模块中。

只要您参考具有所示控件的工作表名称,FillCombo子文件就可以放在通用模块中。

相关问题