在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”)