Excel 2010 VBA 入门 137 动态创建窗体

目录

VBComponents集合

VBComponent对象


        如图所示,该表为某公司工资表与员工档案表,当查看工资表时,希望能够在双击员工姓名时,在员工档案表中查询该员工的基本信息,并临时创建一个窗体显示该员工信息。

月份 工作地区 部门 姓名 基本工资 奖金 补贴 出勤 缺勤(天) 休息 加班小时 加班金额 扣其它费用 应发工资
1900/1/8 行政部 行政部 张三 1100 2000 500 176 0 9 0 0 8 3592
1900/1/8 行政部 行政部 李四 1100 2000 500 176 0 9 0 0 8 3592
1900/1/8 行政部 行政部 王二 1100 2000 500 176 0 9 0 0 8 3592
姓名 职务 部门 地区 录用时间 有效期限 年龄 是否为深圳户口 性别 民族 身份证号 出生日期 联系电话 籍贯 户口所在地
张三 主管 行政部 行政部 55 非深户口 515024196602154156 1966/2/15 XXXXX 四川 四川
王二 主管 行政部 行政部 55 非深户口 516024196602154156 1966/2/15 XXXXX 四川 四川

 

      使用VB组件集合对象(VBComponents)的Add方法添加一个窗体组件,使用该窗体的Properties属性设置窗体的各个属性,并使用其Designer属性访问设计器,然后添加控件用以显示所有的信息。

添加VBE库”Microsoft Visual Basic for Applications Extensibility 5.3″的引用,如下图所示:

Excel 2010 VBA 入门 137 动态创建窗体

步骤1  按组合键【Alt+F11】打开VBE。
步骤2  双击sheet1,并输入以下代码:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim i As Long
    If Target.Column = 4 And Target.Row > 1 And Target.Row <= Range("A1").CurrentRegion.Rows.Count Then
        Dim arrHeader
        Dim arrData
        Dim usForm As Object
        Dim objLbl As Object
        Dim Rng As Range
        
        Cancel = True
        
        Set Rng = Sheet2.Range("A:A").Find(Target.Value)
        
        If Rng Is Nothing Then
            Exit Sub
        End If
        
        arrHeader = Sheet2.Range("A1:O1").Value
        arrData = Intersect(Rng.EntireRow, Sheet2.Range("A:O")).Value
        
        Set usForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
        
        With usForm
            .Properties("Caption") = Target.Value & " 档案"
            .Properties("Height") = 18 * (UBound(arrData, 2) + 2)
            .Properties("Width") = 420
            With .Designer
                For i = 1 To UBound(arrData, 2)
                    Set objLbl = .Controls.Add("Forms.Label.1")
                    With objLbl
                        .Top = 12 + 18 * (i - 1)
                        .Height = 12
                        .Width = 100
                        .Left = 18
                        .Caption = arrHeader(1, i) & ":"
                    End With
                    
                    Set objLbl = .Controls.Add("Forms.Label.1")
                    With objLbl
                        .Top = 12 + 18 * (i - 1)
                        .Height = 12
                        .Width = 300
                        .Left = 130
                        .Caption = arrData(1, i)
                    End With
                Next i
            End With
        End With
        VBA.UserForms.Add(usForm.Name).Show
        ThisWorkbook.VBProject.VBComponents.Remove usForm
    End If

End Sub

步骤3  返回工作表界面,在功能区中选择“开发工具”选项卡,在“代码”组中单击“宏安全性”按钮,在“宏设置”选项中勾选“信任对VBA工程对象模型的访问”,如图所示。

Excel 2010 VBA 入门 137 动态创建窗体

 步骤4  双击“工资表”中的“姓名”列,当其存在于“员工档案表”时,则显示窗体,如图所示。当窗体关闭后,工作簿不会进行保存。

Excel 2010 VBA 入门 137 动态创建窗体

VBComponents集合

        当需要访问某个工作簿的VBA工程时,可以通过VBProject属性访问工程对象。VBComponents集合是VBProject对象下的子对象(即VB组件集合),其中包括所有的工作表、窗体、模块等(即VBE的工程资源管理器中所能见的对象)。使用该集合的Add方法可以添加VB组件,其语法为

VBComponents.Add(component)

     该方法可以返回一个VB组件对象。参数component为所需要添加的组件,可以为表中的任意常量。

    常  置

    说  明

Vbext_ct_ClassModule

添加类模块

vbext_ct_MSForm

添加窗体

Vbext_ct_StdModule

添加标准模块

        使用VBComponents的Add方法添加窗体后,其窗体将存在于当前工作簿的VB工程中。当需要删除VBComponent对象时,可以使用VBComponents的Remove方法,其语法如下:

VBComponents.Remove(component)

参数component为所需要删除的组件对象。
当需要操作VBComponents时,必须在Excel的“宏设置”选项中勾选“信任对VBA工程对象模型的访问”(见本例的操作步骤3)。

VBComponent对象

        当使用VBComponents的Add方法添加窗体后,其返回的是VBComponent对象。尽管窗体对象是VBA工程中的一个组成部分,但其对象模型和VBComponent对象是不同的。因而,VBComponent对象无法直接访问窗体对象的属性或执行其方法。
当需要读取或修改VBComponent对象的属性时,需要通过其Properties集合访问,其语法为

VBComponent.Properties(propname)[=value]

其中,propname为所需访问的属性的名称,value为属性的值。
          通过VBComponent的Designer属性可以访问VB组件的设计器模型,在该设计器下可以使用Controls的Add方法在窗体中添加控件,其方法与在窗体中添加控件是相同的。
        当需要使添加的窗体显示时,则需要将窗体添加至VBA的Userforms集合中,其语法为

VBA.UserForms.Add(componentname).Show

其中,componentname为添加的窗体名称。
        由于窗体显示之后,其后所有的代码都将在该窗体关闭后才执行,因而窗体的属性设置以及窗体控件的添加必须放置于窗体显示代码之前。

上一篇:【转载】EXCEL VBA-区域选择


下一篇:Excel-VBA操作文件四大方法之一