excel_vba_编程教程(完整版)-第64部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
象示例就是这些曲奇。每个示例都有其类定义的特点(属性和方法),正如你可以使用相同的区旗
217
… 页面 234…
剪切机制作许多曲奇一样,你可以创建多个类的示例。你可以独立改变相同类中的任意示例中的类
的每个示例的属性。
类模块允许你定义你自己的自定义类,连同自定义属性和方法。回忆一下,属性是定义对象某个特
点的品质,例如外形、位置、颜色、标题等等。方法是对象可以执行的操作。通过在类模块里面编
写属性过程,你可以给你的自定义对象创建属性。对象的方法也可以在类模块里面通过编写子过程
或者函数过程来创建。在类模块里创建完你的对象后,你可以象使用其它的内置对象一样使用它。
你也可以将对象类导出VBA工程给其它能使用VBA的应用程序使用。
6。创建类
本章的剩余部分将示范创建和使用一个叫做CEmployee的自定义对象的过程。该对象将代表一个员
工,该CEmployee对象将具有属性例如:Id,FirstName,LastName和Salary。它也有一个方法,可
以修改当前薪水。
1。 在工程浏览器窗口选择ObjColClass (Chap11。xls),并选择“插入”|“类模块”
2。 选择工程浏览器里的类模块,并使用属性窗口将其重命名为CEmployee。
技巧11…2 给类模块命名
每次创建新类模块的时候,请给个它一个有意义的名称。将类模块命名为你想要在你的VBA过程使
用的名称。你给你的类选择的名称应该易于理解并且明确对象类要代表的东西。作为一个规则,对
象类名称一般前面有一个大写字母“C”。
7。变量声明
在添加和重命名类模块后,下一步就是声明变量,用来存储你要存储在该对象里数据。你想要存储
与对象的每个数据都得分配一个变量。类的变量被称为数据成员,并且使用关键字Private声明。
该关键字确保这些变量只在该类模块里面可用。使用关键字Private代替常用的Dim语句,隐藏该数
据成员并且避免应用程序的其它部分引用它。只有定义这些变量的类模块中的过程才可以修改这些
变量的值。
因为这些变量的名称也充作属性名称,所以要给你的对象数据成员使用有意义的名称。传统上使用
m_作为变量名称的前缀,以表明它们是类的数据成员。
1。 在类模块CEmployee的顶端输入下述声明:
Option Explicit
'declarations
Private m_LastName As String
Private m_FirstName As String
Private m_Salary As Currency
Private m_Id As String
注意,每个数据成员变量的名称都以前缀“m_”
8。定义类的属性
使用关键字Private声明变量保证变量不能从该对象以外直接访问,意思是说,该类模块以外的VBA
过程不能设置或者读取存储与这些变量里的数据。要让你VBA应用程序的其它部分也能够设置或者
读取员工数据的话,你就必须在CEmployee类模块里面添加特殊的属性过程。这里有三种属性过程:
属性过程在一个对象属性需要设置或者读取的时候被执行。Property Get过程可以和Property Let
过程拥有一样的名称。你应该给对象的每个可能被VBA应用程序其它部分访问的属性创建属性过程。
三种属性语句中最容易理解的是Property Get过程,我们通过仔细看一下Property Get LastName
过程来检查一下属性过程的语法。
属性过程包含下属部分:
Property Get LastName ( ) As String
LastName是属性名称,As String决定该属性返回值的数据类型
218
… 页面 235…
LastName = m_LastName
LastName是属性名称,而m_LastName是数据成员变量,它存储着你想要获取或者设置的属性
值。m_LastName变量应该在类模块的顶端使用关键字Private定义好了。
如果获取的数据是一个计算的结果,那么你可以包含适当的VBA语句:
Property Get Royalty()
Royalty = (Sales * Percent)…Advance
End Property
技巧11…3 从属性过程立即退出
正如关键字Exit Sub和Exit Function允许你提前退出子过程或者函数过程一样,Exit Property
关键字同样也给了立即退出属性过程的方法。程序执行将会依照Property Get,Property Let或者
Property Set过程语句继续下去(译者,原文不可理解,可能有误)
9。创建 Property Get 过程
CEmployee类对象有四个属性需要给当前VBA工程里的其它模块的VBA程序使用,使用对象CEmployee
时,你肯定想要获得员工的ID,姓和名以及当前薪水的信息。
1。 在类模块CEmployee里输入下述Property Get过程,紧接着声明部分输入:
Property Get Id( ) As String
Id = m_Id
End Property
Property Get LastName( ) As String
LastName = m_LastName
End Property
Property Get FirstName( ) As String
FirstName = m_FirstName
End Property
Property Get Salary( ) As Currency
Salary = m_Salary
End Property
每种员工必须的信息要求一个单独的Property Get过程,上面的每个Property Get过程返回当前属
性的值。注意,Property Get过程和函数过程非常类似。就像函数过程,Property Get过程包含一
个赋值语句。回忆一下第四章的内容,要从函数过程返回值的话,你就必须将该值赋予该函数名称。
10。创建 Property Let 过程
除了使用Property Get过程来获取存储在数据成员(私有变量)里的数据之外,你必须准备相应的
Property Let过程,以允许其它过程在必要的时候可以更改这些变量的值。然而,如果存储在私有
变量的某个数据就是只读的话,那么你就不必准备Property Let过程了。假设你不希望用户更改员
工ID,你只要不给它写Property Let过程,就可以使它为只读的了。因此类模块CEmployee将只有
三个属性(LastName,First… Name和Salary),每个属性需要一个单独的Property Let过程。
1。 在类模块CEmployee里输入下述Property Let过程:
Property Let LastName(L As String)
m_LastName = L
End Property
Property Let FirstName(F As String)
m_FirstName = F
End Property
Property Let Salary(ByVal dollar As Currency)
m_Salary = dollar
End Property
Property Let过程至少需要一个参数来明确你想要赋予该属性的数值,该参数可以按值传递(参见
219
… 页面 236…
Property Let Salary过程里的关键字ByVal)或者按引用传递(ByRef是默认的)。如果你需要重新
熟悉一下这些关键字的意思的话,那么参加第四章里的“按值或者按引用传递参数”部分。传递给
Property Let过程的参数数据类型必须和同名称的Property Get 或者Set过程返回值的数据类型一
致。注意,Property Let过程拥有前面部分准备的Property Get过程相同的名称。忽略了ID属性的
Property Let过程,你将创建一个只读的ID属性,只能读取,不能设置。
技巧11…4 定义属性过程的范围
你可以将关键字Public,Private或Static放在属性过程名称的前面来确定它的范围。例如:
要创建一个可以从所有模块的过程里访问的Property Get过程的话,那么依照下属语句格式:
Public Property Get FirstName( ) As String
要让Property Get过程只能从声明它的模块中其它过程访问的话,那么使用下述语句格式:
Private Property Get FirstName( ) As String
在过程调用中,要保护Property Get过程的当地变量的话,那么可以使用下述语句格式:
Static Property Get FirstName( ) As String
如果没有明确使用Public或者Private,熟悉过程默认上就会使公共的,同样,如果没有使用关键
字Static, 那么当地变量在过程的调用中就不会被保护。
11。创建类方法
除了属性之外,对象通常还一个或者多个方法。方法是该对象可以执行的操作。方法允许你操作存
储与类对象里的数据。方法可以使用自过程或者函数过程创建。要让方法在类模块之外可用的话,
那么需要在自过程或函数过程定义前带关键字Public。你在本章创建的对象CEmployee有一个方法,
让你计算新薪水。假设员工的薪水可以按照一个确定的百分比或值来增加或者减少。
1。 在类模块里输入下述函数过程CalcNewSalary:
Public Function CalcNewSalary(choice As Integer; _
curSalary As Currency; amount As Long) As Currency
Select Case choice
Case 1
' by percent
CalcNewSalary =curSalary +((curSalary + amount)/100)
Case 2
' by amount
CalcNewSalary = curSalary + amount
End Select
End Function
函数CalcNewSalary在类模块里使用关键字Public一起定义,作为类CEmployee的一个方法。要计算
一个新的薪水的话,类模块之外的VBA过程必须提供三个参数:choice,CurSalary和amount。参数
choice明确计算类型,假设你想要按5个百分点或者5美元增加员工的薪水,选择1将按5个百分点增
加薪水,而选择2将当前的薪水基础上增加5美元。参数CurSalary是员工的当前薪水数字,而amount
决定了薪水改变量。
技巧11…5 关于类方法
12。创建类的示例
在类里输入完所有必须的Property Get,Property Let,自过程和函数过程后,你可以创建一个类
的信示例了,称为对象。在你能够创建对象之前,对象变量必须在一个标准模块里声明好,以存储
对该对象的引用。如果该类模块的名称为CEmployee的话,该类的新示例就可以使用下述语句创建:
Dim emp As New CEmployee
变量emp代表队类CEmployee的一个对象的引用。当你使用关键字New声明对象变量的时候,VBA就会
创建该对象并分配内存给它;然而,该对象并没有获得示例,直到你在你的程序代码里通过赋值给
它的属性或者执行它的方法创建对该对象的引用。你同样可以通过声明一个对象变量为类定义的数
220
… 页面 237…
据类型来创建该对象的一个示例。例如:
Dim emp As CEmployee
Set emp = New CEmployee
如果你不使用关键字New在Dim语句里(如上所示),那么VBA就不会份哦内存给你的自定义对象,直
到你的程序真正需要它。
13。类模块里的事件过程
事件基本上是一个对象可以识别的操作。自定义类只可识别两种事件:Initialize和Terminate。
这两个事件分别在该类的示例创建和消灭的时候引发。
Initialize事件在从类创建对象的时候产生(参见前面部分关于“创建类的示例”)。在类CEmployee
例子里面,Initialize事件在你代码里第一次使用变量emp的时候也会引发。因为Initialize事件
里的语句将是该对象第一个要执行的,在任何属性被赋值之前,也在任何方法被执行之前,所以
Initialize事件是一个执行类创建的对象的初始化最好的地方。回忆一下,在类模块CEmployee里,
ID是只读的,你可以使用Initialize事件给m_Id变量赋予一个单独的五位数。
1。 在类模块CEmployee里输入下述过程Class_Initialize:
Private Sub C