标签:
杂谈 |
分类: 2014 |
本帖最后由 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)定义一个私有变量,做为转换变量临时储存数据;
(2)Property let 过程负责给属性赋值;
(3)Property get过程负责读取属性的值。
我个人认为,这三个部分,缺一不可(不信你可以删掉一个部分试一试)。因为VBA要求,给属性赋值,必须要用Property let 过程;而读取属性的值,不得不用Property get过程;而要完成变量的传递,必须要有个私有变量进行传递,那就是为什么一定要定义一个私有变量啦,当然多了不限,只要你需要。
三、尝试一下如果控制类模块的属性
通过上面的内容,我们了解可以通过这种方法定义属性,但是您一定和我第一次见到这些内容的感觉一样,这有什么意义吗?不是和Public定义变量作为属性的效果是一样的啊。
您说得很对,下面我们就来稍微控制一下,来说明一下通过过程进行属性定义的好处。
首先我们确定一个逻辑概念,每周工作时间不能超过24*7=168小时,那就是说,如果超过168小时,给“每周工作时间”这个属性的赋值就应该是无效的。
下面是类模块的代码
复制代码
上面代码中,我们在赋值的过程中对“每周工作时间”属性进行了筛选,剔除了不和常理的时间。
以下是标准模块代码:
复制代码
如上代码所示,虽然第二次为每周工作时间赋值为200小时,但因为判断条件“标准模块传递的时间变量
< 168 ”,所以没有被接受。系统仍然保存着第一次赋值,35小时。
前面的几个帖子链接地址
vba类模块浅显学习之一,定义变量与作用域
vba类模块浅显学习之二,最简单的类模块
这些代码的源文件
类模块基本示例3.rar(10.39 KB, 下载次数:
86)
类模块基本示例2.rar(10.11 KB, 下载次数:
52)
关于类模块属性控制的问题,不知道是否能表达的清楚,但是我还是试着想分享一下我的理解。
一、复习一下过程的的相关知识,预习一下
在理解类模块属性控制之前,我们还要稍微理解一下一个基本的概念————过程与函数
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关键字是默认的,也就是你写了
二、试着改变一下属性定义的方法
我们通过 (vba类模块浅显学习之二,最简单的类模块)http://www.excelpx.com/thread-168589-1-2.html 已经知道,仅仅通过在类模块中定义公共变量,就可以成为类模块的属性,如下所示:
- Option Explicit
- Public 姓名 As String
- Public 工资 As Double
- Public 每周工作时间 As Double
- Option
Explicit
- Public 姓名 As String
- Public 工资 As Double
- '以下是另外一种对属性值进行定义的方法
- Private 时间转换变量 As
Double
'定义私有变量,用来存储通过Property Let语句 - Property Let 每周工作时间(标准模块传递的时间变量 As Double) '使用Property
Let过程,将标准模块的变量“标准模块传递的时间变量”传递给私有变量“时间转换变量”
-
时间转换变量 = 标准模块传递的时间变量 - End Property
- Property Get 每周工作时间() As
Double
'使用Property Get过程,将私有变量传递给属性“每周工作时间” -
每周工作时间 = 时间转换变量 - End Property
(1)定义一个私有变量,做为转换变量临时储存数据;
(2)Property let 过程负责给属性赋值;
(3)Property get过程负责读取属性的值。
我个人认为,这三个部分,缺一不可(不信你可以删掉一个部分试一试)。因为VBA要求,给属性赋值,必须要用Property let 过程;而读取属性的值,不得不用Property get过程;而要完成变量的传递,必须要有个私有变量进行传递,那就是为什么一定要定义一个私有变量啦,当然多了不限,只要你需要。
三、尝试一下如果控制类模块的属性
通过上面的内容,我们了解可以通过这种方法定义属性,但是您一定和我第一次见到这些内容的感觉一样,这有什么意义吗?不是和Public定义变量作为属性的效果是一样的啊。
您说得很对,下面我们就来稍微控制一下,来说明一下通过过程进行属性定义的好处。
首先我们确定一个逻辑概念,每周工作时间不能超过24*7=168小时,那就是说,如果超过168小时,给“每周工作时间”这个属性的赋值就应该是无效的。
下面是类模块的代码
- Option Explicit
- Public 姓名 As String
- Public 工资 As Double
- '以下是另外一种对属性值进行定义的方法
- Private 时间转换变量 As Double
'定义私有变量,用来存储通过Property Let语句 - Property Let 每周工作时间(标准模块传递的时间变量 As Double)
'使用Property
Let过程,将标准模块的变量“时间临时变量”传递给私有变量“标准模块传递的时间变量”
-
-
'下面通过if语句进行了控制,对从标准模块传递过来的变量进行了验证
-
If 标准模块传递的时间变量 < 168 Then -
时间转换变量 = 标准模块传递的时间变量 -
Else
-
Exit Property -
End If - End Property
- Property Get 每周工作时间() As
Double
'使用Property Get过程,将私有变量传递给属性“每周工作时间” -
每周工作时间 = 时间转换变量 - End Property
以下是标准模块代码:
- Option Explicit
- Sub EmployeePay()
-
Dim 新雇员 As New 雇员 '创建“雇员”类模块对象的单个实例——新雇员 -
-
'给“新雇员”的各个属性赋值
-
新雇员.姓名 = "张三" -
新雇员.工资 = 15 -
新雇员.每周工作时间 = 35 -
新雇员.每周工作时间 = 200 -
-
'读取“新雇员”的各个属性的值
-
MsgBox "雇员姓名:" & 新雇员.姓名 & Chr(13) & _ -
"雇员每小时工资:" & 新雇员.工资 & Chr(13) & _ -
"雇员每周工作时间:" & 新雇员.每周工作时间 & Chr(13) - End Sub
前面的几个帖子链接地址
vba类模块浅显学习之一,定义变量与作用域
vba类模块浅显学习之二,最简单的类模块
这些代码的源文件

