Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA组合框/自动生成代码_Excel_Vba_Combobox - Fatal编程技术网

Excel VBA组合框/自动生成代码

Excel VBA组合框/自动生成代码,excel,vba,combobox,Excel,Vba,Combobox,我有一个关于Excel中combobox的问题 我有一个excel工作表,默认情况下包含两个组合框,它们的编号由变量x(默认情况下x=2)描述。每个组合框都被编写成脚本,以在subs中以特定的方式运行,例如,我得到了:private sub ComboBox1_DropButtonClick() 尽管如此,有时我需要通过更改X的值来增加这些框的数量。我可能总共需要10个组合框。现在的问题是,是否有任何方法可以设置无限多个组合框的行为(例如,在DropButtonClick事件中)。我所做的是为每

我有一个关于Excel中combobox的问题

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

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

谢谢,沃伊切赫

[编辑]我的代码位置(以灰色标记):

下面是一些代码,可以动态地将控件添加到Excel用户表单中,并在后面添加代码。添加的代码将使组合框在收到
向下键时显示消息框

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


我想我还可以添加另一种方法,将控件动态添加到Excel工作表中。我建议坚持使用UserForms,但是,这里有一种方法可以帮助解决在工作表中需要控件的问题

Sub addCombosToExcelSheet(MySheet As Worksheet, NumberOfComboBoxes As Long, StringRangeForDropDown As String)
    Dim i           As Long
    Dim combo       As Shape
    Dim yPosition   As Long
    Dim Module      As Object

    yPosition = 20
    For i = 1 To NumberOfComboBoxes
        yPosition = (i - 1) * 50

        'Create the shape
        Set combo = MySheet.Shapes.AddFormControl(xlDropDown, 20, yPosition, 100, 20)

        ' Range where the values are stored for the dropDown
        combo.ControlFormat.ListFillRange = StringRangeForDropDown
        combo.Name = "Combo" & i
        Code = "Sub Combo" & i & "_Change()" & vbNewLine & _
               "    MsgBox(""hi"")" & vbNewLine & _
               "End Sub"
        'Add the code
        With ThisWorkbook
            'Make sure Module2 Exits and there is no other code present in it
            Set Module = .VBProject.VBComponents("Module2").CodeModule
            Module.AddFromString (Code)
        End With

        'Associate the control with the action, don't include the () at the end!
        combo.OnAction = "'" & ActiveWorkbook.Name & "'!Combo" & i & "_Change"
    Next

End Sub

Sub Example()
    Dim sht As Worksheet: Set sht = ThisWorkbook.Sheets(1)
    addCombosToExcelSheet sht, 10, "Sheet1!$A$1:$A$10"
End Sub

我很难想象你在问什么。你能发布你到目前为止尝试过的东西吗?我想他的意思是,他的代码生成了几个组合框,这些组合框都需要代码,但是框的数量可以是1到无限。他不想为成百上千的盒子输入代码,以防它们被做成。他想要的是一个更智能(阅读:更高效)的流程。蒂姆说得很对。这正是我的意思。因为我实际使用的框不超过5个,所以我可以提前为它们定义代码。但是我想知道如果我需要无限多的Comobox会发生什么。无限是不可能的,但是我有一些东西可以用于任意数量的控件。嗨,Ryan。很抱歉,我应该说我的组合是直接插入excel表格的。因此,该代码位于“Sheet1”中的“MicrosoftExcel对象”中(请参见我在第一篇文章中添加的屏幕)。我不确定你的解决方案在这种情况下是否有效。但如果有效,我会很高兴地根据自己的需要进行调整。:)哦,是的,知道这一点会很有帮助。如果可能的话,我建议在这个项目中使用
UserForm
。他们给你更多的灵活性。嗨,瑞安,让我分析一下,我会让你知道这对我是否有效。无论如何,谢谢你的帮助!是的,工作非常出色,现在我需要弄清楚如何在我的工作表中应用它。非常感谢:)
Sub addCombosToExcelSheet(MySheet As Worksheet, NumberOfComboBoxes As Long, StringRangeForDropDown As String)
    Dim i           As Long
    Dim combo       As Shape
    Dim yPosition   As Long
    Dim Module      As Object

    yPosition = 20
    For i = 1 To NumberOfComboBoxes
        yPosition = (i - 1) * 50

        'Create the shape
        Set combo = MySheet.Shapes.AddFormControl(xlDropDown, 20, yPosition, 100, 20)

        ' Range where the values are stored for the dropDown
        combo.ControlFormat.ListFillRange = StringRangeForDropDown
        combo.Name = "Combo" & i
        Code = "Sub Combo" & i & "_Change()" & vbNewLine & _
               "    MsgBox(""hi"")" & vbNewLine & _
               "End Sub"
        'Add the code
        With ThisWorkbook
            'Make sure Module2 Exits and there is no other code present in it
            Set Module = .VBProject.VBComponents("Module2").CodeModule
            Module.AddFromString (Code)
        End With

        'Associate the control with the action, don't include the () at the end!
        combo.OnAction = "'" & ActiveWorkbook.Name & "'!Combo" & i & "_Change"
    Next

End Sub

Sub Example()
    Dim sht As Worksheet: Set sht = ThisWorkbook.Sheets(1)
    addCombosToExcelSheet sht, 10, "Sheet1!$A$1:$A$10"
End Sub