使用 vba 在运行时向 Excel 用户表单添加多个标签和文本框

Lou*_*Lou 2 excel vba userform

我正在使用 Excel VBA 创建一个库存管理工具。我已经创建了从 Internet Explorer 下拉框中收集名称列表并将它们放入数组的代码。

在此处输入图片说明

我需要做的是类似于vba 在 userform 中动态创建几个文本框组合框,但我会为每个人将收到的 FLN 数量的用户名和文本框动态添加标签。然后这些将进入我已经创建的预定义用户表单。

在此处输入图片说明

根据上面的代码示例,我意识到我不能.Name = "Textbox" & i用来重命名下一个标签或文本框。i必须等于一个不断变化的列表,所以它不能一成不变;因此,为什么必须有尽可能多的标签和文本框UBound(UserArray)

更新

Private Sub CreateControl()
    Dim newTxt As msforms.Control, newLbl
    Dim i As Integer, TopAmt
    Dim UserArray As String

    TopAmt = 30

    For i = LBound(MyArray) + 1 To UBound(MyArray) - 1
        Set newLbl = MultipleOptionForm.Controls.Add("Forms.Label.1")
        With newLbl
            .Name = "Label" & i
            .Left = 10
            .Top = TopAmt
            .WordWrap = False
            .AutoSize = True
            .Visible = True
            .Caption = MyArray(i)
            Debug.Print .Name,
        End With

        Set newTxt = MultipleOptionForm.Controls.Add(bstrProgID:="Forms.Textbox.1", Name:="Textbox" & i)
        With newTxt
            .Left = 150
            .Top = TopAmt
            .Visible = True
            .Width = 20
            Debug.Print .Name
        End With
        TopAmt = TopAmt + newTxt.Height
    Next

    MultipleOptionForm.Show
End Sub
Run Code Online (Sandbox Code Playgroud)

如果可能,有关如何执行此操作的任何建议? 我不想使用 Excel 电子表格本身来完成此操作。

小智 5

Lou 对这个问题的回答具有误导性。该问题希望在通过更改其 ProgID( bstrProgID 是引用要创建的类的字符串)添加控件时提供默认名称。

如果另一个控件名称不同,您可以重命名新控件。

您还可以将控件名称作为参数传递给该Controls.Add方法。

您的标签未显示是因为您从未设置过该Label.Caption值。

在此处输入图片说明

Private Sub CreateControl()
    Dim newLbl As MSForms.Label
    Dim newTxt As MSForms.Control
    Dim i As Integer, TopAmt
    Dim UserArray As Variant

    TopAmt = 50
    UserArray = Array("Cat", "Dog", "Horse", "Gorrilla")

    For i = LBound(UserArray) To UBound(UserArray)
        Set newLbl = MultipleOptionForm.Controls.Add("Forms.Label.1")
        With newLbl
            .Name = "Label" & i
            .Left = 50
            .Top = TopAmt
            .Visible = True
            .Caption = UserArray(i)
            Debug.Print .Name,
        End With

        Set newTxt = MultipleOptionForm.Controls.Add(bstrProgID:="Forms.Textbox.1", Name:="Textbox" & i)
        With newTxt
            .Left = 100
            .Top = TopAmt
            .Visible = True
            Debug.Print .Name
        End With
        TopAmt = TopAmt + newTxt.Height
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

下一期:如何从这些动态创建的文本框中获取数据?

Dim newTxt As MSForms.Control
For i = LBound(UserArray) To UBound(UserArray)
    set newTxt  =  MultipleOptionForm.Controls("Textbox" & i)
    If UserArray(i) <> newTxt.Value then
        'Do something
    End if
Next
Run Code Online (Sandbox Code Playgroud)