VBA create several textboxes/comboboxes dynamically in userform

后端 未结 2 1503
心在旅途
心在旅途 2021-01-07 01:33

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

相关标签:
2条回答
  • 2021-01-07 02:11

    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
    
    0 讨论(0)
  • 2021-01-07 02:21

    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")

    0 讨论(0)
提交回复
热议问题