【问题标题】:VBA Combobox / automatically generate codeVBA Combobox / 自动生成代码
【发布时间】:2019-01-10 23:22:10
【问题描述】:

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

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

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

谢谢,沃伊切赫。

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

【问题讨论】:

  • 我很难想象你在问什么。您可以发布到目前为止您尝试过的内容吗?
  • 我认为他的意思是他的代码创建了几个 ComboBoxes,它们都需要代码,但框的数量可以从 1 到无限。他想要一个更智能(阅读:更高效)的流程,而不是为数百个盒子输入代码以防万一
  • 嗨瑞恩。蒂姆说得对。这正是我的意思。因为我实际使用的盒子不超过 5 个,所以我可以提前为它们定义代码。但我想知道如果我需要无限数量的 ComoBox 会发生什么。
  • 无限是不可能的,但我有一些可能适用于任意数量的控件。

标签: excel vba combobox


【解决方案1】:

这里有一些代码可以动态地将控件添加到 Excel 用户窗体中,并在后面添加代码。添加的代码将使其在 ComboBox 收到 KeyDown 时显示 MessageBox。

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

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

我想我还不如添加另一种方法来将控件动态添加到 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

【讨论】:

  • 嗨瑞恩。对不起,但我可能应该说我的 Combos 是直接插入到 Excel 表上的。因此代码位于“Sheet1”中的“Microsoft Excel 对象”中(请参阅我添加到初始帖子中的屏幕)。我不确定您的解决方案是否适用于这种情况。但如果可行,我会很乐意根据我的需要调整它。 :)
  • 哦,是的,知道这会很有帮助。如果可能的话,我建议使用UserForm 代替这个项目。它们为您提供更大的灵活性。
  • 嗨瑞恩,让我分析一下,如果它对我有用,我会告诉你。无论如何感谢您的帮助!
  • 是的,效果很好,现在我需要弄清楚如何在我的工作表中应用它。非常感谢:)
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 2010-10-04
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多