同其他编程语言一样,VBA有可以创建类对象,VBA的类对象有自己的属性、方法、事件
公共变量和私有变量的区别
- 公共变量:可以跨模块调用,使用public关键词,在模块最上方声明
- 私有变量:只能在本模块类使用,使用private关键词定义,在模块最上方声明
- 函数、过程未使用关键词声明,默认为public,可以跨模块使用
public i as long ' 声明公共变量,不同模块都可以调用
private num as byte ' 声明私有变量,只在当前模块内可以使用
' 未带关键词声明,等同于public声明
Sub public_test()
MsgBox "未带关键词,默认为public,可以跨模块调用该方法"
End Sub
' 使用private声明,只能在当前模块使用
Private Sub private_test()
MsgBox "使用private私有定义,只能在当前模块使用"
End Sub
插入类模块
打开VBE窗口,点击插入-插入类模块,win系统界面可能会有些许区别(win快捷键:alt+f11)
面板左下方,可以修改类命名,这里我们修改类命名为Person
类的属性
- 直接在类模块声明变量:可随便修改
- 使用关键词Property定义类属性:可设置只读,修改有效性验证等
外部过程修改属性值时,会执行Property过程。过程中可以编写代码,对设置的值进行检查,控制其在一个规定的范围中。Property过程有以下3种形式:
- Property Let:这类过程用来设置类模块的属性值。
- Property Get:这类过程用来读取类模块的属性值。
- Property Set:这类过程用来设置对对象的引用。
在使用Property过程设置属性值时,类模块中的变量可声明为Private类型,避免过程直接修改类模块中变量的值。
每个Property Get的过程声明行都需要指定属性的名称和数据类型
Public public_var as long ' 可以在类模块顶部通过public声明一个属性,不过该属性可以在其他模块直接修改
Private m_age As Byte ' 定义年龄属性
Private m_sex As String ' 定义性别属性
Private m_name As String ' 定义姓名属性
Private m_weight As Long ' 定义体重属性
Property Get age() as Byte
age = m_age ' 返回年龄值
End Property
Property Let weight(m_weight As Long) ' let过程必须带一个变量参数赋值
weight = m_weight ' 设置体重属性
End Property
' Exit Propert语句可以结束Propert过程
Property Let age(a as long)
If a >= 0 And a <= 100 Then ' 设置范围,变量为数值,且在0-100之间
m_age = a
Else
MsgBox "您设置的年龄无效,请输入0-100的数字"
Exit Property ' 如果变量无效则结束property过程
End If
End Property
类的方法
同过程、函数,直接在类模块里写函数、过程,即为类的方法
Sub class_method(str as String)
MsgBox "在类里面直接写过程过函数,即为类方法"
MsgBox "向class_method方法里传入参数:" & str
End Sub
' 当然也可以写函数,跟模块里写函数是一样的
Public Function func(num As Integer)
MsgBox num
End Function
类的事件
同工作表,工作簿一样,类也有事件
- Initialize事件:实例初次创建时触发
- Terminate事件:最后一个指针释放或破坏时触发
可以用Initialize事件设置对象类的默认属性值;用Terminate事件进行销毁对象前的整理工作。
在类模块下拉列表选择Class,右侧选择对应的事件。
Private Sub Class_Initialize()
m_weight = 60 ' 初始化m_weight变量
End Sub
类的实例调用
现在我们写了这样一个类模块
Public var As Long
Private m_age As Byte ' 定义年龄属性
Private m_sex As String ' 定义性别属性
Private m_name As String ' 定义姓名属性
Private m_weight As Long ' 定义体重属性
Private Sub Class_Initialize()
m_weight = 66 ' 初始化m_weight变量
End Sub
Property Let weight(w As Long)
m_weight = w ' 设置weight属性
End Property
Property Get weight() As Long
weight = m_weight ' 读取weight属性
End Property
Sub class_method()
MsgBox "在类里面直接写过程过函数,即为类方法"
End Sub
Public Function func(num As Integer)
MsgBox num
End Function
Property Let age(a As byte)
If a >= 0 And a <= 100 Then ' 设置范围,变量为数值,且在0-100之IsNumeric(a) And间
m_age = a
Else
MsgBox "您设置的年龄无效,请输入0-100的数字"
Exit Property ' 如果变量无效则结束property过程
End If
End Property
Property Get age() As Byte
age = m_age ' 读取年龄属性
End Property
我们插入一个模块,创建类实例调用
Sub test1()
Dim m As New Person
m.weight = 171 '设置体重属性
MsgBox m.weight
m.class_method ' 调用类方法
m.func (111) ' 调用类函数
m.age = 190
m.age = 27
Debug.Print m.age
End Sub