按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
End Sub
Private Sub refNames_Change()
lboxStudents。RowSource = refNames。Value
lboxStudents。ListIndex = 0
lboxStudents。Visible = True
Call lboxStudents_Change
End Sub
5。 输入代码来控制命令按钮OK(cmdOK_Click)和Cancel(cmdCancel_Click):
Private Sub cmdOK_Click()
If Me。optNew。Value = True Then
Me。Hide
ActiveWorkbook。Sheets(〃Sheet2〃)。Select
r = ActiveSheet。UsedRange。Rowsunt
nr = r + 1
Range(〃A〃 & nr)。Value = Me。txtSSN。Text
Range(〃B〃 & nr)。Value = Me。txtLast。Text
Range(〃C〃 & nr)。Value = Me。txtFirst。Text
Range(〃D〃 & nr)。Value = Me。cboxYear。Text
Range(〃E〃 & nr)。Value = Me。cboxMajor。Text
Me。txtSSN。Text = 〃〃
Me。txtLast。Text = 〃〃
Me。txtFirst。Text = 〃〃
Me。cboxYear。Text = 〃〃
Me。cboxMajor。Text = 〃〃
Me。txtSSN。SetFocus
'redisplay the form
Me。Show
Else
MsgBox 〃This control is currently unavailable。〃
End If
End Sub
Private Sub cmdCancel_Click()
Unload Me
Set Students = Nothing
End Sub
6。 输入过程cboxGrade_Click来控制位于Exams页上的Grade复合框:
Private Sub cboxGrade_Click()
YesNo = MsgBox(〃Enter the grade in the worksheet?〃; _
vbYesNo; 〃Modify Grade〃)
If YesNo = 6 Then
Me。lblGrade。Caption = cboxGrade。Value
Select Case TabStrip1。Value
Case 0
Range(〃F〃 & indexPlus)。Value = Me。lblGrade。Caption
Case 1
Range(〃H〃 & indexPlus)。Value = Me。lblGrade。Caption
Case 2
Range(〃J〃 & indexPlus)。Value = Me。lblGrade。Caption
Case 3
210
… 页面 227…
Range(〃L〃 & indexPlus)。Value = Me。lblGrade。Caption
End Select
cboxGrade。Value = 〃〃
End If
End Sub
7。 输入过程Calendar1_Click,如下所示:
Private Sub Calendar1_Click()
YesNo = MsgBox(〃Enter the date in the worksheet?〃; vbYesNo; _
〃Modify Date〃)
If YesNo = 6 Then
Me。lblDate。Caption = Calendar1。Value
Select Case TabStrip1。Value
Case 0
Range(〃G〃 & indexPlus)。Value = Me。lblDate。Caption
Case 1
Range(〃I〃 & indexPlus)。Value = Me。lblDate。Caption
Case 2
Range(〃K〃 & indexPlus)。Value = Me。lblDate。Caption
Case 3
Range(〃M〃 & indexPlus)。Value = Me。lblDate。Caption
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)—— 对象的定义,包含其名称、�