按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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