使用vba在运行时添加多个标签和文本框到Excel用户窗体中

我正在用Excel VBA创build一个库存pipe理工具。 我已经创build了一些代码,用于从Internet Explorer的下拉框中收集名称列表,并将其放入数组中。

在这里输入图像说明

我需要做的是类似vba的东西在userform中dynamic地创build几个文本框combobox ,但我会dynamic地添加用户名和文本框的标签为每个人将接收的FLN的数量。 这些会进入我已经创build的预定义的用户窗体。

在这里输入图像说明

根据上面的代码示例,我意识到我不能使用.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 

如果可能的话,如何做到这一点的建议?我讨厌使用Excel电子表格来完成这个任务。

娄这个问题的答案是误导。 该问题希望通过更改其ProgID(bstrProgID是引用要创build的类的string)添加控件时提供默认名称。

只要另一个控件不具有相同的名称,您可以重命名新的控件。

您也可以将控件名称作为parameter passing给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 

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

 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