其他分享
首页 > 其他分享> > Excel 2010 VBA 入门 137 动态创建窗体

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

作者:互联网

目录

VBComponents集合

VBComponent对象


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

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

 

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

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

步骤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工程对象模型的访问”,如图所示。

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

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

标签:VBA,对象,Excel,动态创建,VBComponents,添加,窗体,VBComponent,行政部
来源: https://blog.csdn.net/ngbshzhn/article/details/121288404