I’ve got a question concerning combobox in Excel.
I’ve got an excel sheet that by default contains two comboboxes and their number is described by a variable x (x=2 by default). Each combobox is scripted to behave in a particular way in subs, for example I’ve got: private sub ComboBox1_DropButtonClick().
Nonetheless, sometimes I need to increase the number of these boxes by changing the value of X. I may need up to 10 comboboxes in total. Now the question is whether there’s any way in which I can set the behaviour of an infinite number of comboboxes (for example in the event of DropButtonClick). What I did was to write a code for each of those comboboxes, so I’ve got a sub for ComboBox1_DropButtonClick(), ComboBox2_DropButtonClick(), ComboBox3_DropButtonClick(), etc.. The code varies a bit, but it’s repeatable. So it all looks rather dumb and I’m searching for some more ingenious solution. Maybe all those comboboxes can be scripted in one go? If there’s any way to do it, please share it with me.
Thanks, Wojciech. Location of my code (marked in grey):
Screenshot from VBA editor in VBA
Here is some code to dynamically add controls to an Excel Userform, and add the code behind. The code added will make it display a MessageBox when the ComboBox receives a
The code is somewhat commented, but let me know if you have questions 🙂
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**
I figured I might as well add the other approach for adding controls dynamically to an Excel sheet. I’d recommend sticking to UserForms, but, here’s a method that should help out when controls are needed in a Sheet.
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