如何用vba给用户窗体动态的添加控件?

在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为动态添加文本框时指定的名称。

       

仅有1条评论 发表评论

  1. yy /

    获取文本框内容
    UserForm1!Txt1.Text
    因为是动态窗体,不知道有多少个文本框
    如何动态的将Txt1替换成变量呢

  2. 匿名 /

    txt1中的1如何用变量代替?

  3. 匿名 /

    触发事件怎么做?

  4. 匿名 /

    Controls (“TX1”)

发表评论