简体   繁体   English

Excel VBA 将项目添加到程序化 ComboBox 时其他 ZFD249A0C28275EBF5D4C8464CFCA222

[英]Excel VBA add item to a programatic ComboBox when other ComboBox Change

I add a new page in Multipage1 programmatically我以编程方式在 Multipage1 中添加一个新页面

Private Sub CommandButton3_Click()
Dim i As Integer
    i = MultiPage1.Pages.Count
    MultiPage1.Pages.Add.Caption = "Guarantee " & i

Then I would like my new page containing 3 ComboBoxes and the ComboBox1 will list the item in the table on my worksheet name "LeftTB", here is the code.然后我想要我的新页面包含 3 个 ComboBoxes,ComboBox1 将在我的工作表名称“LeftTB”上列出表中的项目,这是代码。

    For r = 1 To 3
            Set myCB = MultiPage1.Pages(i).Controls.Add("Forms.ComboBox.1", "ComboBox" & r, 1)
            With myCB
                .Width = 150
                .Height = 18
            Select Case r
                Case Is = 1
                        .Left = 54
                        .Top = 156
            'add item to combobox1
                    Dim rng, cl As Range
            'LeftTB is the name of Table contain Data
                    Set rng = Range("LeftTB") 
                    For Each cl In rng
                        .AddItem cl.Value
                    Next cl
                Case Is = 2
                        .Left = 252
                        .Top = 156
                Case Is = 3
                        .Left = 54
                        .Top = 180
                End Select
            End With
          Next r
    End Sub

It works fine to add value in ComboBox1 by this code.通过此代码在 ComboBox1 中添加值可以正常工作。 For the item in ComboBox 2, it depends on the value of the ComboBox1 as the code below.对于 ComboBox 2 中的项目,它取决于 ComboBox1 的值,如下代码所示。

Private Sub ComboBox1_Change()
Dim rng, cl As Range

'The CenterTB is the table in my worksheet with two columns. The first column (SubD) contains the same data as table "LeftTB" and the next column is the item I would like to add to ComboBox2
Set rng = Range("CenterTB[SubD]")

For i = 1 to me.MultiPage1.Pages.Count
    me.MultiPage1.Pages(i).Controls("ComboBox2").Clear
    For Each cl In rng
        If cl.Value = me.MultiPage1.Pages(i).Controls("ComboBox1").Text Then
        me.MultiPage1.Pages(i).Controls("ComboBox2").AddItem cl.Offset(0, 1).Value
    End If
    Next cl
Next i
End Sub

However, it does not work when ComboBox1 is programmatic.但是,当 ComboBox1 是编程时,它不起作用。 I have no idea to detect the change procedure of Combobox1 when it is programmatic.我不知道在编程时检测 Combobox1 的更改过程。

Can someone provide me the solution?有人可以为我提供解决方案吗?

When creating controls on the fly, VBA does not automatically create their Events!在动态创建控件时,VBA 不会自动创建它们的事件!

There are two ways to do that.有两种方法可以做到这一点。 To create a events wrapper class, or simpler, in case of a known number of controls to be added (your case) to previously declare the controls in a specific way:要创建事件包装器 class 或更简单,如果要添加已知数量的控件(您的情况)以先前以特定方式声明控件:

  1. Put the next declaration on top of the form code module (in the declarations area):将下一个声明放在表单代码模块的顶部(在声明区域中):
Option Explicit

Private WithEvents ComboBox1 As MSForms.ComboBox
Private WithEvents ComboBox2 As MSForms.ComboBox 'possible to use its events, too
Private WithEvents ComboBox3 As MSForms.ComboBox 'possible to use its events, too
  1. Then you should adapt your code, in a way to set the above declared variables as what you want/need them to be.然后你应该调整你的代码,将上面声明的变量设置为你想要/需要的。 So, please adapt your code in the next way:因此,请按以下方式调整您的代码:
Private Sub btCreateCmb_Click()
  Dim myCB As MSForms.ComboBox, r As Long
   For r = 1 To 3
       Set myCB = MultiPage1.Pages(i).Controls.Add("Forms.ComboBox.1", "ComboBox" & r, 1)
       With myCB
          .Width = 150
          .Height = 18
          Select Case r
             Case Is = 1
                 Set ComboBox1 = myCB 'added to Set your first combo
                 .Left = 54
                 .Top = 156
                 'add item to combobox1
                 Dim rng, cl As Range
                 'LeftTB is the name of Table contain Data
                    Set rng = Range("LeftTB") 
                    For Each cl In rng
                        .AddItem cl.Value
                    Next cl
                Case Is = 2
                     Set ComboBox2 = myCB 'added to Set your second combo
                     .Left = 252
                     .Top = 156
                Case Is = 3
                     Set ComboBox3 = myCB 'added to Set your third combo
                     .Left = 54
                     .Top = 180
                End Select
            End With
          Next r
End Sub
  1. Only now, the combo events will be triggered (if their code exists in the form code module).只有现在,才会触发组合事件(如果它们的代码存在于表单代码模块中)。 Please, firstly use the next short code example:请首先使用下一个短代码示例:
Private Sub ComboBox1_Change()
   MsgBox "Changed 1..."
End Sub

If you exactly followed the above suggestions, It should be surely triggered!如果您完全按照上述建议进行操作,它肯定会被触发!

Now, you can put in its event code whatever you need...现在,您可以根据需要放入其事件代码...

Please, test it and send some feedback.请测试它并发送一些反馈。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM