前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起学Excel专业开发22:使用类模块创建对象1

一起学Excel专业开发22:使用类模块创建对象1

作者头像
fanjy
发布2019-11-07 17:02:20
9350
发布2019-11-07 17:02:20
举报
文章被收录于专栏:完美Excel完美Excel

在Excel应用程序中,经常使用类模块来创建自已的对象,用于:

1.封装VBA和Windows API代码,使之更易于使用或重用。

2.捕获事件。

3.引发事件。

4.创建自已的对象和对象模型。

创建自已的对象——CCell类模块示例

假设要使用代码来分析单元格,将其中的内容分为下面4种类型:

1.空值

2.标签

3.数值

4.公式

在VBE中插入一个类模块,将其命名为CCell,输入代码:

代码语言:javascript
复制
'创建枚举常量
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中,插入一个标准模块,输入代码:

代码语言:javascript
复制
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方法转换成函数形式:

代码语言:javascript
复制
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

这样,在标准模块中调用类模块来分析单元格的代码可以修改为:

代码语言:javascript
复制
Public Sub AnalyzeActiveCell()
   Dim clsCell As CCell
   
    '创建CCell对象的新实例
   Set clsCell = New CCell
   
    '确定当前单元格类型并显示
   Set clsCell.Cell = Application.ActiveCell
   MsgBox clsCell.Analyze()
End Sub
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档