按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
End Select
End If
End Sub
8。 输入过程TabStrip1_Change和MultiPage1_Change,如下所示:
Private Sub TabStrip1_Change()
indexPlus = lboxStudents。ListIndex + 3
With ActiveWorkbook。Worksheets(〃Sheet2〃)
Select Case TabStrip1。Value
Case 0
' English
Me。lblGrade。Caption = Range(〃F〃 & indexPlus)。Value
Me。lblDate。Caption = Range(〃G〃 & indexPlus)。Value
Case 1
'French
Me。lblGrade。Caption = Range(〃H〃 & indexPlus)。Value
Me。lblDate。Caption = Range(〃I〃 & indexPlus)。Value
Case 2
'Math
Me。lblGrade。Caption = Range(〃J〃 & indexPlus)。Value
Me。lblDate。Caption = Range(〃K〃 & indexPlus)。Value
Case 3
'Physics
Me。lblGrade。Caption = Range(〃L〃 & indexPlus)。Value
Me。lblDate。Caption = Range(〃M〃 & indexPlus)。Value
End Select
End With
End Sub
Private Sub MultiPage1_Change()
Me。lblWho。Caption = Me。txtLast。Value & 〃; 〃 _
& Me。txtFirst。Value
211
… 页面 228…
Call TabStrip1_Change
End Sub
39。使用自定义窗体 Students and Exams
既然你已经准备好多有必须的VBA过程了,我们来看看该窗体是如何对用户操作反应的。
1。 切换到Excel窗口,并激活Sheet1
2。 点击按钮Display Form
点击Display Form按钮运行过程DoStudents,该过程显示自定义窗体Students and Exams。 在
窗体出现在屏幕上之前,VB执行过程UserForm_Initialize里面的每条语句。结果显示为图
10…19。
图10…19 工作表里的按钮Display Form让你快速访问自定义窗体Students and Exams来查看或者输
入数据。当窗体上载时,只有符合选定的选项按钮的控件才会显示。
窗体显示后,你就可以输入新学生并点击OK将学生的数据转移到工作表。当你点击OK按钮时,就会
执行cmdOK_Click过程。注意,你不能输入新学生参加的考试,因为多页控件的第二页(Exams)这
时不可用。一旦新学生的数据被写入工作表,该窗体就会重新显示,你可以继续输入数据,或者你
可以点击Cancel,将窗体从屏幕上清除。当你点击Cancel按钮时,就会执行过程cmdCancel_Click。
3。 使用自定义窗体Students and Exams输入两位新学生的数据。任何时候,你都可以点击Active
选项按钮,从已有学生中上传数据。当你点击Active选项按钮时,标签Name Range和RefEdit
控件就变为可见的了。
4。 点击Active选项按钮,然后点击RefEdit控件的减号按钮
5。 选择工作表里的姓名区域,如图10…20所示。
图10…20 使用RefEdit控件,你可以选择包含你想要使用数据的单元格区域
使用RefEdit控件,你可以选择工作表里的单元格区域,在本练习里,选择了包含学生姓和名的单
元格。选择有效数据很重要,开始点击Last Name列标下面的单元格(B3)并且向下向右拖曳鼠标
以至包括学生的名
212
… 页面 229…
注意,当你使用RefEdit控件时,窗体临时被隐藏。你所选择的单元格出现在RefEdit控件上。点击
RefEdit控件的减号按钮返回窗体。当你返回窗体时,过程refNames_Change正在运行,该过程使用
单元格区域地址,将学生姓名填充到列表框控件里。该过程的最后一条语句调用
lboxStudents_Change过程,确保窗体的文字框和复合框与列表框里所选学生姓名同步。列表框显
示已有学生的姓名,被选学生的数据显示在左边的文字框和复合框里面(参见图10…21)
图10…21 窗体上的列表框是通过RefEdit控件将储存在工作表里的数据填充的
6。 点击列表框里的任意姓名,并查看该学生的数据
7。 点击列表框里的任意姓名,然后点击Exams页。
Exams也显示了被选学生(参见图10…22)的姓名。TabStrip控件显示考试科目,如果被选学生参加
过任何考试,当你点击适当科目页时,考试的日期和分数就会显示出来。
图10…22 Exams页显示被选学生和科目的考试日期和分数
你可以通过提供的复合框和日历控件,输入或者更改学生的分数和考试日期。VB将问你是否修改数
据(回顾Calendar1_Click和cboxGrade_Click过程的VBA代码)在你以确定回应对话框后,所选的
数据或者分数就会写入到工作表中相应的列(参见图10…23)
TabStrip1_Change过程确保你点击科目页的时候,VB会从适当的工作表单元格显示考试的分数和考
试日期。MultiPage1_Change过程则确保当你点击Exams页时,lblWho标签显示当前列表框里选项学
生的姓和名。
213
… 页面 230…
图10…23 工作表F到M列里的数据是通过用户窗体Students and Exams上Exams页输入的
40。接下来……
既然你到了这个相对比较长的章节的结尾,那么你已经有了必要的技巧来设计有用的窗体。我们来
简单总结一下你在本章学习的内容。内置对话框可以从你自己的VBA过程里显示,对于需要用户输
入的自定义VBA应用程序,就需要创建一个自定义窗体。通过设置tab键顺序,确保用户可以窗体上
按逻辑顺序移动。在窗体模块里面编写VBA过程,让窗体对用户操作作出反应。通过使用属性窗口
或者编写UserForm_Initialize过程,给控件设置初始值。确保有过程将数据转移到工作表。在下
章里,当你开发集合和自定义对象主题的时候,将获得更多于自定义窗体实用的经验。
第十一章 自定义集合和类模块
在第九章,你学习了如果通过使用自动控制(Automation)控制另一个应用程序的对象,回想一下,
在创建了对Microsoft Word 10。0 Object Library的引用之后,你就能够控制Word应用程序,调用
其对象、属性和方法。你也学习了如何使用自动控制从Microsoft Outlook获取联系地址。有个好
消息,那就是,你不必局限于使用Excel的内置对象或者其它应用程序的对象,VBA允许你创建你自
己的对象和对象集合,以及它们完整的方法和属性。在本章,你将学习如何使用集合,包括如何声
明自定义集合对象。你也将学习如何使用类模块来创建用户定义的对象。
在跳入这些理论和实用的实例之前,我们来过一下一些本章将用到的术语吧:
集合(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
MsgB