NO.1
使用VBA代码添加Form窗体表单,对于一些初学者来说,似乎真的很为难。
除了对代码陌生之外,并不知道如何来进行操作添加后的窗体。
这也是一件十分困扰的事情。
本节将介绍一下,使用vba代码添加窗体,然后在窗体上添加控件,如标签按钮等等方法。
NO.2
vba中 VBComponents 集合里包含了模块、窗体、类模块。
添加窗体就用到VBComponents.Add()来进行操作。
如:
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
表示添加一个窗体。
其中vbext_ct_MSForm参数,表示将窗体添加到集合。
类模块vbext_ct_ClassModule 标准模块vbext_ct_StdModule。
新建表单后,运行程序什么也看不到,还需要对表单进行属性设置。
这就是像是盖一栋大楼,只是做了大楼的一个工程设计,仅仅是立项要盖这栋大楼,而没有真正实施盖楼的过程。
所以,名义上的新建了这栋楼,但其并没有变成实际意义上的大楼。
感觉有点不可接受,不管怎么说,以上代码并不能让你看到新建的窗体。
接下来,要对窗体进行一些属性设置,就是说要真正的施工对进入工地盖楼了。
设置窗体属性,要用到Properties()。中文意思就是不动产、财产、所有物等等。
Properties()括号里添加窗体属性名称,然后等于号,属性值。
这样才能够对新建的Form窗体进行实体化赋值。
如下代码:
.Properties("caption") ="我是新建窗体"'窗体标签
.Properties("width") = 900'宽
.Properties("Height") = 600'高
更多窗体属性可查询帮助。
上图为例,将对表格内容作为新建表单的标题名称、宽、高,包括窗体里的标签名称和按钮进行自定义设置。
NO.3
添加窗体之后不是我们的初衷,因为窗体只是一个容器,我们要往里面放很多东西。
这就像大楼主体已经完工,但是不能住人呀,四面没有窗户,也没有各类消防设施,更没有电梯,那么,这就是说,并没有完全得到我们想要的大楼样子。
还要对大楼进行配套设施的安装。
添加标签
那我们再加一个标签吧,就像在大楼顶上安装一个XXX小区的名称,是不是有点意思了。
添加标签代码:
With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
.Designer.Controls.Add("Forms.Label.1")
End With
由于新建的窗体还处在编辑模式下,所以不能直接引用Controls.Add(),要在其前面加Designer。
Designer中文意思就"设计师"。看到了吧,整个过程当中,不能以一种既定的事实来对待这件事情。
就像不能对一栋在建的大楼以成熟小区来对待一样,不能随意进出,也不能以为它是一个有人住的地方,真正意义上它还是不算是一个小区。
只有交付使用之后,才能作为一个正常的对象来对待。
所以,要特别注意的地方在对表单里的对象进行属性设置的时候,前面添加"设计师"Designer。
示例:
默认F为新建的窗体对象。
Dim Lobj As Object
Set Lobj = F.Designer.Controls.Add("Forms.Label.1")
With Lobj
.Caption = "恭喜!你已经成功新建了一个表单窗体。"
.Top = 50
.Left = 0
.Height = 90
.Width = .Parent.Width
.TextAlign = 2
With .Font
.Size = 28
.Name = "黑体"
.Bold = True
End With
End With
添加按钮
同理,添加按钮用如下代码:
With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
.Designer.Controls.Add("Forms.CommandButton.1")
End With
NO.4
显示窗体
如此进行,对代码细致的编写之后,构造整个表单的过程就完成了。
但是,我们还是不能看到它的模样,因为没有把它呈现在眼前。
就比如,在北京盖了一栋大楼,而你在广州。
想要看到这楼,是不是有两个办法,一你亲自来北京,站到大楼下面,二给大楼拍个视频,通过视频信息传输设备观看。
这就是说,这楼是盖好了,在你看到它之前,还有一些方法去完成,不然,真的难说这楼是个什么样子。
说了这么多,编程就是这么玄乎,真真假假,假假真真,要抓到代码表示的实际东西,还真不是一件轻松的事情。
我们接着就是要把窗体呈现在电脑屏幕上,让自己或别人看到它,而不只是某种意义上的代码构造完成这种玄乎的事情。
显示出来也需要一行代码,也十分简单一行代码,如下:
F默认新建的窗体对象
VBA.UserForms.Add(F.Name).Show
运行后效果如下图
是不是完整了一些,如不添加标签和按钮,那么什么也没有。
这样新建后的表单就有了更多的内容。
NO.5
删除窗体
最后一步删除窗体,这个不提倡使用,但要学会使用。
F为默认新建窗体对象变量。
ThisWorkbook.VBProject.VBComponents.Remove F
这句意思是从VBComponents集合中移除F窗体。
这个不能用大楼来比喻,没有移除大楼的过程,而且操作起来也太困难,也现实中最大把设计图纸销毁,完成移除。
NO.6
完整代码
以上代码可作为学习之用,以下偌直接复制到自己的VBE窗体中使用即可。
新建窗体过程函数
Private Sub AddNewForm()
Dim w As Worksheet
Set w = ActiveSheet
Dim F As Object
Set F = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With F
.Properties("caption") ="我新建的表单窗体"
.Properties("width") =900
.Properties("Height") = 600
Dim Lobj As Object
Set Lobj = F.Designer.Controls.Add("Forms.Label.1")
With Lobj
.Caption = "恭喜!" & VBA.vbCrLf & VBA.vbCrLf & "你已经成功新建了一个表单窗体。"
.Top = 50
.Left = 0
.Height = 90
.Width = .Parent.Width
.TextAlign = 2
With .Font
.Size = 28
.Name = "黑体"
.Bold = True
End With
End With
With F.Designer.Controls.Add("Forms.CommandButton.1")
.Caption = "关 闭"
.Width = 150
.Height = 28
.Top = Lobj.Top + Lobj.Height + 50
.Left = .Parent.Width \ 2 - .Width \ 2
End With
''''''''''''''''''''''''''''''''''''''''''' Button按钮 CodeModule
With ThisWorkbook.VBProject.VBComponents(F.Name).CodeModule
.InsertLines 2, "Private Sub CommandButton1_Click()"
.InsertLines 3, "Unload me"
.InsertLines 4, "End Sub"
End With
End With
VBA.UserForms.Add(F.Name).Show
ThisWorkbook.VBProject.VBComponents.Remove F
End Sub
NO.7
学习VBA,从0开始构造一个应用界面,十分不好掌握其中一些代码应用。
有些代码在编辑过程中会遇到很多问题,同时也会增加许多不明白的问题,需要一一解决。
本身VBA已经给出很多常用的一些对象,直接拿来使用就可以,但是对于喜欢结构编程方法的人来说,面向对象真的是小儿科。
怎么办呢,呵呵!努力吧!
---END---
欢迎关注、收藏