Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9410|回复: 8

[分享] vba类模块浅显学习之三,控制类模块的属性

[复制链接]
发表于 2011-3-19 18:56 | 显示全部楼层 |阅读模式
本帖最后由 wbzxz 于 2011-4-16 21:20 编辑

关于类模块属性控制的问题,不知道是否能表达的清楚,但是我还是试着想分享一下我的理解。
一、复习一下过程的的相关知识,预习一下
在理解类模块属性控制之前,我们还要稍微理解一下一个基本的概念————过程与函数

1、变量、过程、函数是标准模块中使用的最基本构件。
2、微软官方的定义:过程是命名的语句序列,可作为单元来执行。

3、过程始终是在模块级别中的,如果不标准的说,他是模块的下一级。

4、在VBA中,所有可执行的代码必须包含在过程内,一过程不能套在其它过程中。
5、定义过程的语句不多,我知道的大概是 Sub, Function, Property。
6、过程和函数(这里所说的函数不是Excel里面内置的函数,而是指函数过程)其实没有实质区别,唯一的区别就是,当需要返回值的时候,就用Function;如果不需要返回值,Sub,Function可以随便用。
7、Property过程比较特殊,是用于类模块添加和操作属性的过程。
8、和变量一样,过程也有作用域(和变量的作用域基本相差不大),所以过程语句也使用Public,Private,Static关键字(还有一个friend),我感觉这是很重要的。
我个人在用sub,function这样语句的时候,很少用Public,Private,Static这样的关键字,我以为这些关键字意义不大,现在才知道,Public关键字是默认的,也就是你写了  Sub()………end Sub,实际上相当与 Public Sub()………end Sub。


二、试着改变一下属性定义的方法
我们通过 vba类模块浅显学习之二,最简单的类模块http://www.excelpx.com/thread-168589-1-2.html 已经知道,仅仅通过在类模块中定义公共变量,就可以成为类模块的属性,如下所示:
  1. Option Explicit

  2. Public 姓名 As String
  3. Public 工资 As Double
  4. Public 每周工作时间 As Double
复制代码
这样进行属性的定义很简单,也很方便,可以随意进行赋值和读取(具有可读/写属性)。但是有个问题,就是对属性进行赋值太随意啦,可以说,只要符合属性定义的数据类型,任何值都是合理的,所以呢,微软为我们提供了另外一种方法,通过过程来设置和读取类模块的属性值,如下代码所示,对“每周工作时间”属性采取了另外一种定义的方法


  1. Option Explicit

  2. Public 姓名 As String
  3. Public 工资 As Double

  4. '以下是另外一种对属性值进行定义的方法

  5. Private 时间转换变量 As Double  '定义私有变量,用来存储通过Property Let语句

  6. Property Let 每周工作时间(标准模块传递的时间变量 As Double) '使用Property Let过程,将标准模块的变量“标准模块传递的时间变量”传递给私有变量“时间转换变量”
  7.   时间转换变量 = 标准模块传递的时间变量
  8. End Property

  9. Property Get 每周工作时间() As Double  '使用Property Get过程,将私有变量传递给属性“每周工作时间”
  10.   每周工作时间 = 时间转换变量
  11. End Property
复制代码
如上代码所示,如果要定义一个属性,既可以赋值,也可以读取,必须包含三部分。

(1)定义一个私有变量,做为转换变量临时储存数据;
(2)Property let 过程负责给属性赋值;
(3)Property get过程负责读取属性的值。

我个人认为,这三个部分,缺一不可(不信你可以删掉一个部分试一试)。因为VBA要求,给属性赋值,必须要用Property let 过程;而读取属性的值,不得不用Property get过程;而要完成变量的传递,必须要有个私有变量进行传递,那就是为什么一定要定义一个私有变量啦,当然多了不限,只要你需要。

三、尝试一下如果控制类模块的属性
通过上面的内容,我们了解可以通过这种方法定义属性,但是您一定和我第一次见到这些内容的感觉一样,这有什么意义吗?不是和Public定义变量作为属性的效果是一样的啊。
您说得很对,下面我们就来稍微控制一下,来说明一下通过过程进行属性定义的好处。


首先我们确定一个逻辑概念,每周工作时间不能超过24*7=168小时,那就是说,如果超过168小时,给“每周工作时间”这个属性的赋值就应该是无效的。


下面是类模块的代码


  1. Option Explicit

  2. Public 姓名 As String
  3. Public 工资 As Double

  4. '以下是另外一种对属性值进行定义的方法

  5. Private 时间转换变量 As Double   '定义私有变量,用来存储通过Property Let语句

  6. Property Let 每周工作时间(标准模块传递的时间变量 As Double) '使用Property Let过程,将标准模块的变量“时间临时变量”传递给私有变量“标准模块传递的时间变量”
  7.   
  8.   '下面通过if语句进行了控制,对从标准模块传递过来的变量进行了验证
  9.   If 标准模块传递的时间变量 < 168 Then
  10.     时间转换变量 = 标准模块传递的时间变量
  11.   Else
  12.     Exit Property
  13.   End If
  14. End Property

  15. Property Get 每周工作时间() As Double  '使用Property Get过程,将私有变量传递给属性“每周工作时间”
  16.   每周工作时间 = 时间转换变量
  17. End Property
复制代码
上面代码中,我们在赋值的过程中对“每周工作时间”属性进行了筛选,剔除了不和常理的时间。


以下是标准模块代码:
  1. Option Explicit

  2. Sub EmployeePay()

  3.   Dim 新雇员 As New 雇员 '创建“雇员”类模块对象的单个实例——新雇员
  4.   
  5.   '给“新雇员”的各个属性赋值
  6.   新雇员.姓名 = "张三"
  7.   新雇员.工资 = 15
  8.   新雇员.每周工作时间 = 35
  9.   新雇员.每周工作时间 = 200
  10.   
  11.   '读取“新雇员”的各个属性的值
  12.   MsgBox "雇员姓名:" & 新雇员.姓名 & Chr(13) & _
  13.           "雇员每小时工资:" & 新雇员.工资 & Chr(13) & _
  14.           "雇员每周工作时间:" & 新雇员.每周工作时间 & Chr(13)
  15. End Sub

复制代码
如上代码所示,虽然第二次为每周工作时间赋值为200小时,但因为判断条件“标准模块传递的时间变量 < 168 ”,所以没有被接受。系统仍然保存着第一次赋值,35小时。

前面的几个帖子链接地址

vba类模块浅显学习之一,定义变量与作用域
vba类模块浅显学习之二,最简单的类模块


这些代码的源文件
类模块基本示例3.rar (10.39 KB, 下载次数: 205)

评分

参与人数 1 +20 收起 理由
过儿 + 20 继续~~~~

查看全部评分

发表于 2011-4-16 19:45 | 显示全部楼层
本帖最后由 yiyiyicz 于 2011-4-16 19:46 编辑

跟着学习,谢谢分享
“虽然我们每周工作时间赋值为200小时,实际显示的时候,还是35小时”,这句话是不是可以改为“虽然第二次为每周工作时间赋值为200小时,但因为判断条件“标准模块传递的时间变量 < 168 ”,所以没有被接受。系统仍然保存着第一次赋值,35”
如果判断条件“标准模块传递的时间变量 < 168 ”中168改为268,则msgbox所显示的将是200
不知理解的是否正确?
回复

使用道具 举报

 楼主| 发表于 2011-4-16 21:23 | 显示全部楼层
回复 yiyiyicz 的帖子

您说得非常对,而且分析的也非常正确,按照您的说法,我把原来的心得进行了修改,非常感谢。
回复

使用道具 举报

发表于 2011-4-16 21:29 | 显示全部楼层
回复 wbzxz 的帖子

你可不要轻易改
类模块,我仅仅是菜鸟

回复

使用道具 举报

 楼主| 发表于 2011-4-16 21:32 | 显示全部楼层
回复 yiyiyicz 的帖子

嘿嘿,我也是初学,学一点,写一点,大家一起学习,互相交流。
回复

使用道具 举报

发表于 2012-1-29 22:58 | 显示全部楼层
这么好的帖子,说句THANKYOU!{:912:}
回复

使用道具 举报

发表于 2012-1-30 08:23 | 显示全部楼层
学习了,好贴要顶。
回复

使用道具 举报

发表于 2012-1-30 20:51 | 显示全部楼层
的确是很好的心得,一看就明白了.顶!!!
回复

使用道具 举报

发表于 2017-10-3 13:44 | 显示全部楼层
学习了,顶起来,扫盲了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 15:37 , Processed in 0.908834 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表