在Excel应用程序中,经常使用类模块来创建自已的对象,用于:
1.封装VBA和Windows API代码,使之更易于使用或重用。
2.捕获事件。
3.引发事件。
4.创建自已的对象和对象模型。
创建自已的对象——CCell类模块示例
假设要使用代码来分析单元格,将其中的内容分为下面4种类型:
1.空值
2.标签
3.数值
4.公式
在VBE中插入一个类模块,将其命名为CCell,输入代码:
'创建枚举常量
Public Enum anlCellType
anlCellTypeEmpty
anlCellTypeLabel
anlCellTypeConstant
anlCellTypeFormula
End Enum
'声明模块变量
Private muCellType As anlCellType
Private mrngCell As Excel.Range
'为属性赋值
Property Set Cell(ByRef rngCell AsExcel.Range)
Set mrngCell = rngCell
End Property
'获取属性值
Property Get Cell() As Excel.Range
Set Cell = mrngCell
End Property
'获取属性值
Property Get CellType() As anlCellType
CellType = muCellType
End Property
'获取属性值
'转换枚举常量为文本
Property Get DescriptiveCellType() AsString
Select Case muCellType
Case anlCellTypeEmpty
DescriptiveCellType = "空"
Case anlCellTypeLabel
DescriptiveCellType = "标签"
Case anlCellTypeConstant
DescriptiveCellType = "常量"
Case anlCellTypeFormula
DescriptiveCellType = "公式"
End Select
End Property
'分析指定单元格
Public Sub Analyze()
If IsEmpty(mrngCell) Then
muCellType = anlCellTypeEmpty
ElseIf mrngCell.HasFormula Then
muCellType = anlCellTypeFormula
ElseIf IsNumeric(mrngCell.Formula) Then
muCellType = anlCellTypeConstant
Else
muCellType = anlCellTypeLabel
End If
End Sub
在CCell类模块中,创建了一个由4个成员构成的公共枚举常量,每个枚举成员代表一种单元格类型,其值分别默认为0、1、2、3。使用枚举成员可以增强代码的可读性和可维护性,利用DescriptiveCellType属性可将枚举成员的值转换成易于理解的文本。
类模块定义了对象的属性和方法。在类模块中,所有的公共变量或属性过程都可作为对象的属性,所有的公有过程或函数均可作为对象的方法。
属性过程用于控制变量与外界交互,有3种形式:
1.直接对属性赋值
2.使用Set语句为属性赋值对象
3.使用Get语句返回值或对象引用
在CCell类模块中,使用了2个私有的模块级变量来存储属性值:变量muCellType存储单元格的类型,其值为anlCellType枚举成员值;变量mrngCell存储对某个单元格的引用,它表示由CCell类所创建的对象。
在CCell类模块中,使用Set语句给Cell属性指定一个Range型的引用并将其保存到变量mrngCell中。使用Get语句读取属性的值,其中CellType属性以枚举成员值返回所代表的单元格类型,DescriptiveCellType属性以描述性文本返回所代表的单元格类型,因为这两个属性没有对应的Set方法,所以是只读属性。
在实际应用中,基于过程的属性比基于公共变量的属性更好,因为可以更方便地控制给属性赋值和返回属性值。属性过程可以对传递给对象的数据进行检验并执行相应的操作,同时还可以根据需要设置属性为只读或者只写。
在CCell类模块中,定义了一个方法Analyze,是一个子过程,可以分析mrngCell变量所引用的单元格的数据类型,并将单元格数据类型所对应的枚举值赋给变量muCellType。
下面,我们来测试CCell类。
在VBE中,插入一个标准模块,输入代码:
Public Sub AnalyzeActiveCell()
Dim clsCell As CCell
'创建CCell对象的新实例
Set clsCell = New CCell
'确定当前单元格类型并显示
Set clsCell.Cell = Application.ActiveCell
clsCell.Analyze
MsgBox clsCell.DescriptiveCellType
End Sub
类模块可以看成是一种对象模板,根据需要可以创建任意多个对象实例。运行AnalyzeActiveCell过程,显示当前单元格数据类型。
由于在CCell类模块中定义Analyze方法使用的是子过程,因此不能向外部返回值。我们可以以函数形式创建方法,使其可以返回值。例如,将CCell类模块中的Analyze方法转换成函数形式:
Public Function Analyze() As String
If IsEmpty(mrngCell) Then
muCellType = anlCellTypeEmpty
ElseIf mrngCell.HasFormula Then
muCellType = anlCellTypeFormula
ElseIf IsNumeric(mrngCell.Formula) Then
muCellType = anlCellTypeConstant
Else
muCellType = anlCellTypeLabel
End If
Analyze = Me.DescriptiveCellType
End Function
这样,在标准模块中调用类模块来分析单元格的代码可以修改为:
Public Sub AnalyzeActiveCell()
Dim clsCell As CCell
'创建CCell对象的新实例
Set clsCell = New CCell
'确定当前单元格类型并显示
Set clsCell.Cell = Application.ActiveCell
MsgBox clsCell.Analyze()
End Sub