I create dynamically a Userform with comboboxes and textboxes. one of each per row. The user will choose how many lines he wants. So far I can adjust the size of the Userfor
The issue is in .Name = "Combobox" & i
I suspect it's due to "Combobox1" being the default name of any newly inserted combobox control so that:
after first iteration you have a combobox you named after "Combobox1"
at the 2nd iteration the Set CBName = UF2.Designer.Controls.Add("Forms.ComboBox.1")
statement is trying to generate a combobox whose name, before any subsequent explicit Name
property assignment, defaults to "Combobox1" which, however, is already the name you assigned to the first combobox. hence the "Ambiguous Name" error
So there are three ways you can avoid the "Ambiguous Name" error:
change .Name = "Combobox" & i
to .Name = "ComboBox" & i
where the case difference is enough to avoid conflicting with the default name
omit that statement altogether
and have VBA name it for you "ComboBox1", "ComboBox2", ...
use Set CBName = UF2.Designer.Controls.Add("Forms.ComboBox.1", Name:="Combobox" & i)
i.e. you assign the Name
right at combobox instantiation
Other than that, your code would hit the "userform_initialize" code writing issue since it would write as many subs as comboboxes to add
To face all what above issues and do some refactoring, your code could be as follows:
Option Explicit
Public Sub CommandButton2_Click()
Dim nb As Integer 'Nb = number of people to record
Dim UF2 As Object ' or use 'As VBComponent'
Dim i 'i = loop to create rows
nb = 3
Set UF2 = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With UF2
.Properties("Caption") = "Packing record"
.Properties("Width") = "250"
.Properties("Height") = "50"
.Properties("Height") = .Properties("Height") * nb + 10
.CodeModule.InsertLines 2, "Public sub userform_initialize()" '<--| start writing your "UserForm_Initialize" sub code
For i = 1 To nb
With .Designer.Controls.Add("Forms.ComboBox.1", Name:="Combobox" & i) ' or simply: With .Designer.Controls.Add("Forms.ComboBox.1")
.top = 20 * (i - 1) + 5
.Left = 10
.Width = 100
.Height = 20
End With
.CodeModule.InsertLines 2 + i, "Me.ComboBox" & i & ".AddItem (""1"")" '<--| keep adding lines to your "UserForm_Initialize" sub code
With .Designer.Controls.Add("forms.textbox.1")
.top = 0
.top = 20 * (i - 1) + 5
.Left = 120
.Width = 50
.Height = 20
End With
Next i
.CodeModule.InsertLines 2 + i, "End sub" '<--| finish writing your "UserForm_Initialize" sub code
i = i - 1
With .Designer.Controls.Add("forms.textbox.1")
.top = 20 * (i - 1) + 5
.Left = 180
.Width = 50
.Height = 20
End With
VBA.UserForms.Add(.Name).Show
End With
ThisWorkbook.VBProject.VBComponents.Remove UF2
End Sub
Set CBName = UF2.Designer.Controls.Add("forms.combobox." & i)
The class String is ALWAYS Forms.ComboBox.1 - never .2 or .3
Therefore do:
Set CBName = UF2.Designer.Controls.Add("Forms.ComboBox.1")