VBA组合框/自动生成代码



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

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

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

谢谢,沃伊切赫。

[edit]我的代码的位置(用灰色标记):VBA 中VBA编辑器的屏幕截图

这里有一些代码可以动态地将控件添加到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