学习Excel技术,关注微信公众号:
excelperfect
在Excel应用程序中,经常使用类模块来创建自已的对象,用于:
1.封装VBA和Windows API代码,使之更易于使用或重用。
2.捕获事件。
3.引发事件。
4.创建自已的对象和对象模型。
创建自已的对象——CCell类模块示例
假设要使用代码来分析单元格,将其中的内容分为下面4种类型:
1.空值
2.标签
3.数值
4.公式
在VBE中插入一个类模块,将其命名为CCell,输入代码:
'创建枚举常量Public Enum anlCellType anlCellTypeEmpty anlCellTypeLabel anlCellTypeConstant anlCellTypeFormulaEnd Enum '声明模块变量Private muCellType As anlCellTypePrivate mrngCell As Excel.Range '为属性赋值Property Set Cell(ByRef rngCell AsExcel.Range) Set mrngCell = rngCellEnd Property '获取属性值Property Get Cell() As Excel.Range Set Cell = mrngCellEnd Property '获取属性值Property Get CellType() As anlCellType CellType = muCellTypeEnd Property '获取属性值'转换枚举常量为文本Property Get DescriptiveCellType() AsString Select Case muCellType Case anlCellTypeEmpty DescriptiveCellType = "空" Case anlCellTypeLabel DescriptiveCellType = "标签" Case anlCellTypeConstant DescriptiveCellType = "常量" Case anlCellTypeFormula DescriptiveCellType = "公式" End SelectEnd 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 IfEnd 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.DescriptiveCellTypeEnd 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.DescriptiveCellTypeEnd Function
这样,在标准模块中调用类模块来分析单元格的代码可以修改为:
Public Sub AnalyzeActiveCell() Dim clsCell As CCell '创建CCell对象的新实例 Set clsCell = New CCell '确定当前单元格类型并显示 Set clsCell.Cell = Application.ActiveCell MsgBox clsCell.Analyze()End Sub