Excel 2010 VBA 入门 137 动态创建窗体
作者:互联网
目录
题
如图所示,该表为某公司工资表与员工档案表,当查看工资表时,希望能够在双击员工姓名时,在员工档案表中查询该员工的基本信息,并临时创建一个窗体显示该员工信息。
月份 | 工作地区 | 部门 | 姓名 | 基本工资 | 奖金 | 补贴 | 出勤 | 缺勤(天) | 休息 | 加班小时 | 加班金额 | 扣其它费用 | 应发工资 |
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″的引用,如下图所示:
步骤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