使用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
娄这个问题的答案是误导。 该问题希望通过更改其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