一、大致解释一下什么是类、对象
有一些计算机常识的,都应该知道什么叫类(Class)或者对象(Object)。一个对象,可以有属性、方法。举个白痴但是通俗的例子:人作为一种对象,有上着、下着这两个可读可写的属性,以及穿着好看不好看这个只读的属性,还有走路、跑步这两种方法。属性返回的是一个值,方法返回值不能表达的东西。
再举一个Excel里的例子:A1单元格,有字体、字号、边框样式……这些可读可写的属性,还有所在位置、所属Sheet、……这些只读的属性,还有清除其中内容、将其中的字母全变大字、……这些方法。
类有一个特点,凡是同属于这个类的对象,其属性、方法的类目(如上面说的字号、边框样式,而不是说14号字、粗边框这种具体的)都是相同的。也就是说,定义好了一个类,赋与不同的属性,就能搞出许多对象。
比如,造出一个叫“地名”的类,令其属性“地图”为陕西的行政区划,则问它“灞桥”,它就能返回“陕西省-西安市-灞桥区”。创建若干个同属地名这个类的对象,扔进去不同省的,问它地名,它就能告诉你相应省内地区的行政归属。
总地来说,这东西和函数稍有类似,能够按照既定的模式,在给定的参数下,做出不同却相似的效果。
二、VBA的类模式怎么玩
1 创建一个类
打开Excel中的开发工具
-查看代码
:

如图新建一个类:

给这个类起个名字:

赋予它属性,定义好内部存储这些属性的变量:

赋予它属性,告诉VBA怎么写入(Let)、读取(Get)属性(Property)。注意,如果正在写入的这个属性和其他属性是关联的,则在这时即可对这个关联的属性赋值,如图中的“受到未成年保护”这个属性:

这里需要注意,属性在赋值时指定(Let)成了什么数据类型(
Property Let 年龄(x as Integer)
中的Integer
),在获取(Get)该属性的代码(Property Get 年龄() As Integer
)中,应该令返回值为这种数据类型(As Integer
)。
告诉它怎么“动”(即赋与一种方法),比如弹出窗口(MsgBox)来介绍自己:

提示:如果想让方法有返回值,则将本段代码第一行的Sub
换成Function
。
Private Gender As String, Age As Integer, Protected As Boolean
Property Let 性别(x As String)
Gender = Left(x, 1)
End Property
Property Get 性别() As String
性别 = Gender
End Property
Property Let 年龄(x As Integer)
If x >= 18 Then
Protected = False
Else
Protected = True
End If
Age = CInt(Round(CSng(x), 0))
End Property
Property Get 年龄() As Integer
年龄 = Age
End Property
Property Get 受到未成年保护()
If Protected Then
受到未成年保护 = "是"
Else
受到未成年保护 = "否"
End If
End Property
Sub 自我介绍()
If Protected = True Then
tmp1 = ",受到未成年人法的保护"
Else
tmp1 = ",不受未成年人法的保护"
End If
MsgBox Gender & "性,年" & Age & tmp1
End Sub
2 新建并使用这个类下的对象
插入模块:

在一个过程(Sub)中创建3个这个类的对象,Alice、Bob、哪吒:

赋予三个“人”以性别、年龄:


Sub 演示()
Dim Alice As New 人
Dim Bob As New 人
Dim 哪吒 As New 人
Alice.年龄 = 26
Alice.性别 = "女"
Bob.年龄 = 21
Bob.性别 = "男"
哪吒.年龄 = 16
哪吒.性别 = "男"
Alice.自我介绍
Bob.自我介绍
哪吒.自我介绍
End Sub
点击运行试试看:

就会依次弹出:



网友评论