VBA组合框/自动生成代码

时间:2019-01-10 12:22:06

标签: excel vba combobox

我有一个关于Excel中组合框的问题。

我有一个excel表格,默认情况下包含两个组合框,它们的编号由变量x(默认为x = 2)描述。每个组合框的脚本都以特定的方式在subs中运行,例如,我得到了:private sub ComboBox1_DropButtonClick()。

尽管如此,有时我需要通过更改X的值来增加这些框的数量。我总共可能需要多达10个组合框。现在的问题是,是否可以通过任何方式设置无限数量的组合框的行为(例如,在DropButtonClick事件中)。我要做的是为每个组合框编写一个代码,因此我为ComboBox1_DropButtonClick(),ComboBox2_DropButtonClick(),ComboBox3_DropButtonClick()等创建了一个子代码。代码有些许不同,但可重复。因此,这一切看起来都相当愚蠢,我正在寻找一些更巧妙的解决方案。也许所有这些组合框都可以一口气编写脚本?如果有任何办法,请与我分享。

谢谢,Wojciech。

[edit]我的代码的位置(以灰色标记): Screenshot from VBA editor in VBA

1 个答案:

答案 0 :(得分:1)

下面是一些代码,可以将控件动态添加到Excel用户窗体,然后在后面添加代码。添加的代码将使ComboBox收到myText时显示MessageBox。

代码有些注释,但是如果您有问题,请告诉我:)

KeyDown

我认为我不妨添加另一种将控件动态添加到Excel工作表的方法。我建议坚持使用UserForms,但是,这是一种方法,可以在工作表中需要控件时提供帮助。

Option Explicit

Sub CreateFormComboBoxes(NumberOfComboBoxes As Long)
    Dim frm         As Object
    Dim ComboBox    As Object
    Dim Code        As String
    Dim i           As Long

    'Make a blank form called 'UserForm1', or any name you want
    'make sure it has no controls or any code in it
    Set frm = ThisWorkbook.VBProject.VBComponents("UserForm1")

    With frm
        For i = 1 To NumberOfComboBoxes
            Set ComboBox = .designer.Controls.Add("Forms.ComboBox.1")
             'Set the properties of the new controls
             With ComboBox
                .Width = 100
                .Height = 20
                .Top = 20 + ((i - 1) * 40) 'Move the control down
                .Left = 20
                .Visible = True
                .ZOrder (1)
                .Name = "ComboBox" & i
            End With
            'Add your code for each module, you can add different code, by adding a if statement here
            'And write the code depending on the name, index, or something else
            Code = Code & vbNewLine & "Private Sub " & "ComboBox" & i & "_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)" & _
                   vbNewLine & "    MsgBox(""hi"")" & vbNewLine & "End Sub"
        Next

        'Add the code
        .CodeModule.InsertLines 2, Code
    End With

End Sub

'Run this
Sub Example()
    CreateFormComboBoxes 5
End Sub


**Edit**