在vba中也可以使用窗体。
在窗体的设计状态下,可以添加各种控件。
有时候我们希望通过vba代码在窗体中动态的添加控件,而不是事先在窗体中添加控件再写代码。
在vba中可以使用UserForm对象的Controls.Add方法动态添加控件,它的语法如下:
Set Control = object.Add( ProgID [, Name [, Visible]])
其中ProgID参数为要添加的控件的程序标识符,Name参数为要添加的控件的名称, Visible参数设置该控件是否可见。
常见的控件的ProgID如下:
| CheckBox | Forms.CheckBox.1 |
| ComboBox | Forms.ComboBox.1 |
| CommandButton | Forms.CommandButton.1 |
| Frame | Forms.Frame.1 |
| Image | Forms.Image.1 |
| Label | Forms.Label.1 |
| ListBox | Forms.ListBox.1 |
| MultiPage | Forms.MultiPage.1 |
| OptionButton | Forms.OptionButton.1 |
| ScrollBar | Forms.ScrollBar.1 |
| SpinButton | Forms.SpinButton.1 |
| TabStrip | Forms.TabStrip.1 |
| TextBox | Forms.TextBox.1 |
| ToggleButton | Forms.ToggleButton.1 |
如下的代码将在用户窗体UserForm1中添加10个标签控件和10个文本框控件:
Sub QQ1722187970()
Dim oLB As Control
Dim oTextBox As Control
Dim oCombox As Control
With UserForm1
For i = 1 To 10
'添加标签控件
Set oLB = .Controls.Add("Forms.Label.1", "LB" & i, True)
With oLB
.Caption = "第" & i & "个标签"
.Left = 50
.Top = 30 + (i - 1) * 40
End With
'添加文本框控件
Set oTextBox = .Controls.Add("Forms.TextBox.1", "Txt" & i, True)
With oTextBox
.Left = 50 + 100
.Top = 30 + (i - 1) * 40
.Width = 300
.Height = 30
End With
Next i
.Show
End With
End Sub
如下图所示,其中两个命令按钮是在设计状态下添加的。

当控件是在vba代码的运行阶段动态添加的,如果要访问控件的内容,需要用如下的加感叹号的引用形式:
userform1!thebox.text
比如要读取上图中的第一个文本框的内容,可以使用如下的代码:
MsgBox UserForm1!Txt1.Text
其中Txt1为动态添加文本框时指定的名称。


获取文本框内容
UserForm1!Txt1.Text
因为是动态窗体,不知道有多少个文本框
如何动态的将Txt1替换成变量呢
txt1中的1如何用变量代替?
触发事件怎么做?
Controls (“TX1”)