excel_vba_编程教程(完整版)-第63部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
集合(Collection)—— 一个包含一组相关对象的对象
类(Class)—— 对象的定义,包含其名称、属性、方法和事件。类充作一种对象模版,在允许的
时候,由此创建对象示例。
示例(Instance)—— 术语类的一种特定对象,称为类的示例。当你创建一个示例的时候,你也
就创建了一个新对象,它拥有类定义的属性和方法。
类模块(Class Module)—— 包含类定义的模块,包括它的属性和方法定义
模块——模块含有Sub(子过程)和Function(函数)过程,可为其它VBA过程使用,并且和任何对
象没有特别的关系。
窗体模块——包含给由用户窗体或者其控件引发的事件过程使用的VBA代码。窗体模块是一种类模
块。
事件—— 一种可以为对象识别的对象,例如鼠标点击或者按键,你可以为其定义应对操作。事件
可以由用户操作,或者VBA语句或者系统引发。
事件过程—— 一个可以自动执行的过程,是对用户引发的事件或者系统引发的程序代码的反应。
1。使用集合
一组相类似的对象成为集合。例如,在Excel里,所有打开了的工作簿属于Workbooks集合,而某个
具体工作簿里面的所有工作表都是Worksheets集合里面的成员。在Word里,所有打开的文档都属于
Documents集合,一个文档里的每个段落都是Paragraphs集合的成员。集合是包含其它对象的对象。
无论你想要使用什么集合,你都可以做下述事情:
* 使用索引值可以引用集合里的特定对象,例如,要指向Worksheets集合里的第二个对象的话,
那么使用下述语句的任意一条:
Worksheets(2)。Select
或者
214
… 页面 231…
Worksheets(〃Sheet2〃)。Select
* 使用Count属性可以知道集合里的成员数目,例如,当你在立即窗口里输入语句:
?Worksheetsunt
VBA将会返回当前工作簿里的工作表总数
* 使用Add方法可以在集合里插入新的项目,例如,当你在立即窗口里输入语句:
Worksheets。Add
VBA将会在当前工作簿里面插入一个新的工作表,这时,Worksheets集合里多了一个成员。
* 使用For Each…Next循环可以遍历集合里的每个对象。假设你打开了一个工作簿,包含五个工
作表,它们的名称为:
“Daily wages”, “Weekly wages”, “Bonuses”, “Yearly salary”和“Monthly wages”。
使用下述过程将名称里包含“wages”的工作表删除:
Sub DeleteSheets()
Dim ws As Worksheet
Application。DisplayAlerts = False
For Each ws In Worksheets
If InStr(ws。Name; 〃wages〃) Then
ws。Delete
End If
Next
End Sub
当你编写你自己的VBA过程时,你可能会碰到这样一种情况,那就是,没有方便的内置集合来处理
你的任务。解决办法就是创建自定义集合。从第七章,你就已经知道如何通过动态或静态数组来实
用多个数据。因为,集合有允许你添加、移动和计算其成员的内置属性和方法,所以使用集合比使
用数组容易得多。
2。声明自定义集合
要创建一个用户定义的集合的话,你应该先声明一个Collection类型的对象变量,该变量在Dim语
句里和关键字New一起声明,如下所示:
Dim 集合名称 As New Collection
3。给自定义集合添加对象
在声明Collection对象后,你就可以使用Add方法往集合里插入新成员了。用来组成该集合的对象
不必需要是同样的数据类型。Add方法如下所示:
object。Add item; key; before; after
你只需要明确对象和成员,object是集合名称,它是使用在Collection对象声明中的相同名称;item
是你要添加到集合里的对象。尽管其它的参数是可选的,但是它们也很有用。集合里的成员自动从
1开始分配号码,了解这个很重要。然而,它们也可以给分配一个独特的键。除了通过索引号(1,
2,3等等)访问某个特定的成员之外,你也可以在集合添加对象的时候给该对象分配一个键。例如,
如果你创建一个自定义工作表集合,那么你应该使用工作表名称作为键;要鉴别学生或者员工集合
里的单个人员的话,你就可以使用社会保险号码(SSN)作为他们的键。
如果你想要确定对象在集合里面的位置时,那么你就应该使用before或者after参数(不要同时使
用它们)。参数before在此之前添加新对象的对象,而参数after是一个对象,在它之后添加新的对
象。
接下来过程Getments声明了一个叫做colNotes的自定义集合,该过程提示输入作者姓名,然后
在活动工作簿里遍历所有的工作表,以找到该作者的批注。只有某个特定作者输入的批注会加入自
定义集合。过程给第一个批注分配一个键,然后将剩余的批注添加到集合里,每次都将它们置于最
后添加的批注之前(注意before参数的使用)。如果集合至少有一个批注,那么过程会在一个信息
框显示由参数key确定的批注内容。注意,参数key如何用来引用集合里的成员。然后,过程将集合
里的所有批注打印到立即窗口。文本函数(Mid和Len)用来仅获取批注内容,而排除作者姓名。接
着,返回工作簿里的批注数目和自定义集合里的批注数目到Count属性。在试验过程Getments
之前,我们先得按照以下步骤创建一个工作簿:
215
… 页面 232…
1。 打开一个新工作簿并保存为Chap11。xls
2。 在工作表Sheet1的任意单元格上单击右键,并从快捷菜单上选择插入批注,随意输入一些文本。
在批注框之外的任意地方点击一下,退出批注编辑模式。使用相同的技巧在工作表Sheet2再插
入两个批注,给每个批注输入不同的文本。在当前工作簿里插入新工作表(Sheet4),并插入一
个批注。现在你应该在三个工作表里一共有四个批注。
3。 选择“工具”|“选项”并且点击“常规”页,用户名文本框里面应该显示的是你的名字,删除
你自己的名字,并输入Joan Simth,并点击确定。现在,在工作表Sheet2和Sheet4的任意地方
各输入一个批注。这些批注应该会自动地印上Joan Smith的名字。当你输入完批注后,回到选
项对话框,并将常规页上的用户名改回你自己的名字。
4。 切换到VB编辑器,并将VBA工程重命名为ObjColClass
5。 在当前工程里添加一新模块,并重命名为MyCollection
6。 输入过程Getments,显示如下:
Sub Getments()
Dim sht As Worksheet
Dim colNotes As New Collection
Dim myNote As ment
Dim I As Integer
Dim t As Integer
Dim fullName As String
fullName = InputBox(〃Enter author's full name:〃)
For Each sht In ThisWorkbook。Worksheets
sht。Select
I = ActiveSheetmentsunt
For Each myNote In ActiveSheetments
If myNote。Author = fullName Then
MsgBox myNote。Text
If colNotesunt = 0 Then
colNotes。Add Item:=myNote; key:=〃first〃
Else
colNotes。Add Item:=myNote; Before:=1
End If
End If
Next
t = t + I
Next
If colNotesunt 0 Then MsgBox colNotes(〃first〃)。Text
MsgBox 〃Total ments in workbook: 〃 & t & Chr(13) & _
〃Total ments in collection:〃 & colNotesunt
Debug。Print 〃ments by 〃 & fullName
For Each myNote In colNotes
Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _
Len(myNote。Text))
Next
End Sub
7。 运行过程Getments并且查看结果
4。从自定义集合移出对象
从自定义集合里移出成员和添加成员一样简单。使用Remove方法可以移出对象,如下所示:
object。Remove item
object是自定义集合的名称,含有你要移出的对象;item是你要从集合移出的对象。
216
… 页面 233…
我们来修改你在前面部分准备的过程Getments,示范从集合里移出成员。在该过程结尾,我们
将当前集合colNotes里成员的内容一个一个地显示出来,并且询问用户,使用应该将该成员从该集
合移出。
1。 将下面的声明加入到过程Getments的声明部分:
Dim response
Dim myId As Integer
第一条语句声明了一个叫做response的变量,你将使用该变量来储存Msgbox函数的结果。第二
条浴巾声明变量myld来储存集合对象的索引号。
2。 定位过程Getments的下述语句:
For Each myNote In colNotes
在上面的语句之后,添加下述语句:
myId = 1
3。 定位到过程Getments的下述语句:
Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _
Len(myNote。Text))
在该语句后,输入下面的代码块:
response = MsgBox(〃Remove this ment?〃 & Chr(13) _
& Chr(13) & myNote。Text; vbYesNo + vbQuestion)
If response = 6 Then
colNotes。Remove Index:=myId
Else
myId = myId + 1
End If
4。 在该过程输入下述语句:
Debug。Print 〃The following ments remain in the collection:〃
For Each myNote in colNotes
Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _
Len(myNote。Text))
Next
5。 运行过程Getments,并且将显示在信息框里批注之一删除。
修改后的过程Getments2可以在附带的CD里找到。该过程将指定的批注从自定义集合里清除,但
是不会从工作表里删除批注。
技巧11…1 给集合重新编号
当移出对象后,集合回自动重新编号,因此,你可以使用1作为Index参数,来删除自定义集合里的
所有对象,如下所示:
Do While myCollectionunt 》0
myCollection。Remove Index:=1
Loop
插入:模块还是类模块?
在VB编辑器的插入菜单里有两个模块命令:模块和类模块。这些在本章的开头有定义。到目前为止,
你已经使用过标准模块来创建Sub和Function过程。你将第一次在本章使用类模块来创建自定义对
象并且定义它的属性和方法。
5。创建自定义对象
创建一个新的,非标准的VBA对象,需要在你的工程里插入类模块并且在模块里添加代码。然而,
在做此之前,你需要对类是什么要有一个基本的了解。
如果你回头看一下本章的开头,那么你就会知道类从某种意义上说是对象模板。一个经常使用的类
比就是将类比作一个曲奇剪切机。就像曲奇剪切机决定某个曲奇做成什么样一样,类的定义决定某
个对象应该是什么样以及如何做。在实际使用一个对象类之前,你必须先创建一个类的新示例。对
象示例就是这些曲奇。每个示例都有其类定义的特点(属性和方法),正如你可以使用相同的区旗