同其他编程语言一样,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

vb 引用部件 Public Declare Function vba引用另一个模块函数_类模块

类的属性

  • 直接在类模块声明变量:可随便修改
  • 使用关键词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,右侧选择对应的事件。

vb 引用部件 Public Declare Function vba引用另一个模块函数_属性值_02

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