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

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

在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

本文分享自微信公众号 - 完美Excel(excelperfect),作者:fanjy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一起学Excel专业开发24:使用类模块创建对象3

    在《一起学Excel专业开发23:使用类模块创建对象2》中,我们自定义的集合类存在两个方面的不足:

    fanjy
  • 基础扩展 | 13. 使用VBA实现栈结构

    栈是一种常见的基础数据结构,用来实现后进先出的目的。比如,在桌子上摞了一堆书,最后放的书一定在最上面,最先拿走的也是最上面的书。

    fanjy
  • VBA实用小程序52: 将所有VBA模块导出到另一工作簿

    有时候,我们觉得某工作簿中的代码很有用,想将它们移到另一工作簿中。可以在该工作簿的每个代码模块中单击鼠标右键,在快捷菜单中,使用“导出文件”命令(如下图1所示)...

    fanjy
  • Prayaya Q3安装使用

    一、Prayaya Q3安装包里面有哪些文件? Q3里包括:总目录、基本系统模块目录、RO模块目录、推荐模块目录。

    py3study
  • 这里有一份Node.js入门指南和实践,请注意查收

    JS 是脚本语言,脚本语言都需要一个解析器才能运行。对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色。而对于需要独立运行的 JS,NodeJS 就是...

    null仔
  • 阿迪达斯69周年免费送2500双鞋?真相竟然是……

    自今年年初以来,你可能在WhatsApp上收到过联系人向你发送的,关于阿迪达斯运动鞋免费送的活动消息。

    FB客服
  • VMBox测评

    用户1153097
  • Java SE | 每日作业卷day09

    (1)定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为String类型;

    剑走天涯
  • 没有执行力,谈什么目标理想?

    最近和一个半年没见的朋友冒着疫情的风险一起吃了个饭,见面的时候闹了个笑话,朋友一直喊我,而我却完全认不出来他了。

    用户6983566
  • thinkphp v5.x 远程代码执行漏洞poc

    近日,thinkphp团队发布了版本更新,其中修复了一处远程代码执行漏洞,可直接getshell,影响范围:v5.x < 5.1.31,<= 5.0.23

    用户1467662

扫码关注云+社区

领取腾讯云代金券