学生成绩管理系统
1.1学生成绩管理系统的总体设计
1.2班级管理模块的设计
1.3学生名单管理模块的设计
1.4管理学生成绩模块的设计
1.5查询学生成绩模块的设计
1.6成绩统计分析模块的设计
1.7打印成绩单模块的设计
1.1学生成绩管理系统的总体设计
对学生考试成绩的管理,是每个学校重要的日常管理工作之一。由于每个学校的考试
面广,参加人数多,如果人工管理学生成绩,将会降低学校的运作效率。而利用ExcelVBA
开发一个学生成绩管理系统,则可大大提高管理效率。
1.1.1学生成绩管理系统的构成模块
本章介绍的学生成绩管理系统的模块构成如图1-1所示。本系统由“班级管理”、“学
生名单管理”、“登记学生成绩”、“查询学生成绩”、“成绩统计分析”和“打印成绩单”6
个模块构成。各个模块的功能介绍如下。
学生成绩管理系统
班级管理学生名单管理登记学生成绩查询学生成绩成绩统计分析打印成绩单
图1-1学生成绩管理系统
(1)班级管理:设置各个年级的班级名称。
(2)学生名单管理:用于管理各班级的学生信息,包括学生的学号、姓名、性别等基
本信息。
(3)登记学生成绩:完成学生各学科考试成绩的登记、修改等功能。
(4)查询学生成绩:根据设定的条件查询学生成绩。
(5)成绩统计分析:对各班、各年级的学生考试成绩进行统计分析。
(6)打印成绩单:将学生的考试成绩按班级生成成绩单,并打印出来。
1.1.2学生成绩管理系统的工作簿设计
建立一个名称为“学生成绩管理系统”的工作簿,将此工作簿的一个工作表重命名为
“首页”,在此工作表中插入一个自己喜欢的背景图片。插入一个艺术字“学生成绩管理系
统”并设置其格式。插入6个自选图形(矩形),分别在这6个自选图形中添加文字,添加
的文字分别为“管理学生名单”、“管理学生成绩”、“查询学生成绩”、“成绩统计分析”、“打
印成绩单”和“班级管理”,设置自选图形和文字的格式。插入其他的用于修饰界面的自选
图形,并设置其格式。
最后的界面如图1-2所示。
2
数据列表管理与应用
学生成绩管理系统
图1-2学生成绩管理系统界面
1.1.3为自选图形按钮指定宏
为了在单击首页工作表的6个自选图形时,能够执行相应的操作,为这6个自选图形
指定如下的宏,并将它们保存在一个名称为“自定义按钮的指定宏”的标准模块中。
Sub管理学生名单()''"管理学生名单"按钮
学生管理窗口.Show
EndSub
Sub管理学生成绩()''"管理学生成绩"按钮
学生成绩管理窗口.Show
EndSub
Sub查询学生成绩()''"查询学生成绩"按钮
学生成绩查询窗口.Show
EndSub
Sub成绩统计分析()''"成绩统计分析"按钮
成绩统计分析窗口.Show
EndSub
Sub打印成绩单()''"打印成绩单"按钮
打印成绩单窗口.Show
EndSub
Sub班级管理()''"班级管理"按钮
Worksheets("班级管理").Visible=True''显示工作表"班级管理"
Worksheets("班级管理").Activate''激活工作表"班级管理"
EndSub
1.1.4为工作簿对象编写有关的事件程序
为了在打开系统工作簿时,自动激活“首页”工作表,并将该工作表进行保护。同时
3
将工作簿中除“首页”工作表外的所有工作表隐藏起来,以保护其中的数据(如果用户需
要查看某工作表的数据,可以在相应窗体进行有关操作,使隐藏的工作表显示出来)。因此,
为工作簿对象设置Open事件,程序代码如下:
PrivateSubWorkbook_Open()
DimiAsInteger
Worksheets("首页").Activate''激活工作表"首页"
Worksheets("首页").Protect''保护工作表"首页"
Fori=1ToWorksheets.Count
IfWorksheets(i).Name<>"首页"Then
Worksheets(i).Visible=False''保护除工作表"首页"外的所有工作表
EndIf
Nexti
EndSub
由于在操作时,对学生考试成绩进行了录入、修改等操作,而学生成绩都保存在本系
统工作簿的有关工作表中,因此,在关闭系统工作簿之前,要先保存工作簿,为此,对工
作簿对象设置BeforeClose事件,程序代码如下:
PrivateSubWorkbook_BeforeClose(CancelAsBoolean)
ThisWorkbook.CloseSaveChanges:=True
EndSub
此外,在操作时,我们会激活某些工作表并查看数据,这样,为了能够返回“首页”
工作表,并隐藏其他的工作表,应该为工作簿的所有工作表都设置一个能够返回“首页”
工作表的事件。为工作簿对象设置SheetBeforeRightClick事件,即单击鼠标右键激活“首
页”工作表。工作簿对象的SheetBeforeRightClick事件程序代码如下:
PrivateSubWorkbook_SheetBeforeRightClick(ByValShAsObject,_
ByValTargetAsRange,CancelAsBoolean)
DimiAsInteger
Cancel=True
Fori=1ToWorksheets.Count
IfWorksheets(i).Name<>"首页"Then
Worksheets(i).Visible=False
EndIf
Nexti
Worksheets("首页").Activate
EndSub
1.1.5保护工作表
为了保护“首页”工作表的各个自选图形及其布置,应该对此工作表进行保护。在设
计好工作表后,可以通过手工的方法对工作表进行保护。为了保险起见,在工作簿对象的
Open事件程序中,也同时对工作表进行保护。
1.1.6定义公共变量
定义下面几个公共变量,它们保存在一个名称为“公共变量”的标准模块中:
PublicClassName''保存班级名称的数组变量
PublicClass''保存年级名称的数组变量
Publicn''保存某年级下的班级数目的数组变量
PublicmAsInteger''保存年级数目
PublicpAsInteger''保存某班级学生人数
4
数据列表管理与应用
学生成绩管理系统
1.2班级管理模块的设计
班级管理模块的功能是对各个年级的班级名字进行管理。班级管理是通过一个工作表
“班级管理”进行的。“班级管理”工作表的结构如图1-3所示。
图1-3“班级管理”工作表
在“班级管理”工作表中,第1行保存年级名称,如“初一”、“初二”、“初三”、…,
在年级名称对应的各列分别保存个年级的班级名称,如“1班”、“2班”、“3班”、…。这
样设计是为了便于操作各个班级学生成绩工作表。
在“首页”工作表中单击“班级管理”图形按钮,即可激活“班级管理”工作表。
1.3学生名单管理模块的设计
学生名单管理模块的功能是激活各个班级工作表并输入或修改学生的基本信息,包括
“学号”、“姓名”、“性别”等基本信息。而各个班级工作表可以编写程序自动创建。学生
名单管理模块的这些功能是通过一个“管理学生名单”窗体完成的。
1.3.1“管理学生名单”窗体的结构设计
“管理学生名单”窗体的结构如图1-4所示。在此窗体上,有2个框架、1个TreeView
控件、1个标签和3个命令按钮。各个控件的功能及属性设置说明如下。
图1-4“管理学生名单”窗体结构
5
(1)用户窗体:名称属性设置为“学生管理窗口”,Caption属性设置为“管理学生名单”。
将用户窗体的ShowModal属性设置为False,即设置为无模式窗体,以便在运行窗体
后,仍可以操作工作表。
(2)2个框架:用于将不同功能的控件组合在一起,其Caption属性分别设置为“选择班
级”和“创建班级工作表”。
(3)1个TreeView控件:名称为TreeView1,用于显示各个年级的各个班级名称,分两级
节点显示,一级节点是年级名称,二级节点是班级名称。
(4)1个标签:显示说明文字,其Caption属性设置为“如果还没有班级工作表,就单击
此按钮”。
(5)命令按钮“创建班级工作表”:单击此按钮,系统将自动创建班级工作表,其名称属
性和Caption属性均设置为“创建班级工作表”。
(6)命令按钮“重新选择”:单击此按钮,系统将TreeView控件中的节点收缩,以便用
户重新选择班级工作表,其名称属性和Caption属性均设置为“重新选择”。
(7)命令按钮“退出”:单击此按钮,就关闭窗体,其名称属性和Caption属性均设置为
“退出”。
1.3.2班级工作表结构设计
班级工作表是保存各个班级的学生基本信息和各科考试成绩的工作表,可以通过单击
命令按钮“创建班级工作表”自动创建。班级工作表的结构如图1-5所示。
当创建完各个班级工作表后,就可以激活某个班级工作表,在班级工作表中输入学生
的基本信息。
学生的“学号”、“姓名”、“性别”等基本信息是通过工作表输入的,这样设计
的好处是可以充分利用Excel的工具实现数据的快速输入,比如学号是有规律
的序列号,可以采用填充复制的方法输入学号。
图1-5各个班级工作表的结构
1.3.3“管理学生名单”窗体的程序代码设计
(1)首先为用户窗体设置Initialize事件,当启动窗体时,查询年级数和班级数,为TreeView1
设置节点。程序代码如下:
6
数据列表管理与应用
学生成绩管理系统
PrivateSubUserForm_Initialize()
DimiAsInteger,jAsInteger
Call年级班级
''清除原有的节点
TreeView1.Nodes.Clear
''设置TreeView1控件的属性
TreeView1.LineStyle=tvwRootLines
TreeView1.Style=tvwTreelinesPlusMinusText
TreeView1.LabelEdit=tvwManual
''添加一级节点(年级)
Forj=1Tom
Setnodx=TreeView1.Nodes.Add(,,Class(j),Class(j))
Nextj
''添加二级节点(班级)
Forj=1Tom
Fori=1Ton(j)
Setnodx=TreeView1.Nodes.Add(Class(j),_
tvwChild,Class(j)&Space(1)&ClassName(j,i),ClassName(j,i))
Nexti
Nextj
EndSub
这里,子程序“年级班级”的功能是查询年级名称和班级名称,并保存在数组变量中。
这个子程序保存在一个名称为“公共子程序”的标准模块中。程序代码如下:
PublicSub年级班级()
DimiAsInteger,jAsInteger,nmaxAsInteger
DimwsAsWorksheet
''获取年级个数和班级个数
Setws=Worksheets("班级管理")
m=ws.Range("IV1").End(xlToLeft).Column
ReDimn(1Tom)AsInteger
ReDimClass(1Tom)AsString
''获取各年级的最大班级数目
nmax=ws.UsedRange.Rows.Count-1
ReDimClassName(1Tom,1Tonmax)AsString
''保存班级名称
Forj=1Tom
n(j)=ws.Cells(65536,j).End(xlUp).Row-1
Class(j)=ws.Cells(1,j)
Fori=1Ton(j)
ClassName(j,i)=ws.Cells(1+i,j)
Nexti
Nextj
EndSub
(2)为TreeView1设置NodeClick事件,当单击某个班级节点时,激活某班级工作表。程
序代码如下:
PrivateSubTreeView1_NodeClick(ByValNodeAsMSComctlLib.Node)
OnErrorResumeNext
''显示并激活某班级工作表
Worksheets(Node.Key).Visible=True
Worksheets(Node.Key).Activate
EndSub
(3)为“重新选择”按钮设置Click事件,当单击此按钮时,收缩TreeView控件的节点,
以便用户重新选择班级工作表。程序代码如下:
7
PrivateSub重新选择_Click()
''收缩班级节点
DimiAsInteger
Fori=1ToTreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded=False
Nexti
EndSub
(4)为“创建班级工作表”按钮设置Click事件,当单击此按钮时,系统将自动创建班级
工作表,并输入工作表的标题数据。程序代码如下:
PrivateSub创建班级工作表_Click()
OnErrorResumeNext
DimwsAsWorksheet
DimiAsInteger,jAsInteger
''创建班级工作表,工作表名称格式为"年级名班级名"
Forj=1Tom
Fori=1Ton(j)
Setws=Worksheets(Class(j)&Space(1)&ClassName(j,i))
IfwsIsNothingThen''如果没有该工作表,就创建它
Worksheets.AddAfter:=Worksheets(Worksheets.Count)
ActiveSheet.Name=Class(j)&Space(1)&ClassName(j,i)
''输入标题数据
Range("A1:K1").Select
Selection=Array("学号","姓名","性别","数学","语文",_
"英语","物理","化学","生物","体育","总分")
Selection.HorizontalAlignment=xlCenter''标题文字居中
Columns("A:A").NumberFormatLocal="@"''A列数据为文本
EndIf
Nexti
Nextj
Worksheets("首页").Activate
ActiveSheet.Range("A2").Select
EndSub
(5)为“退出”设置Click事件,当单击此按钮时就关闭窗体。程序代码如下:
PrivateSub退出_Click()
End
EndSub
1.3.4学生名单管理模块的应用举例
单击“首页”工作表的“管理学生名单”图形按钮,可打开“管理学生名单”窗体,
如图1-6所示。
如果还没有各个班级的工作表,就单击“创建班级工作表”按钮,创建各个班级工
作表。
单击左边控件中的某个年级,展开年级节点,选择要操作的班级名,则系统就自动激
活该班级节点对应的工作表,如图1-7所示,此时可以单击“退出”按钮关闭窗体后在该
工作表中直接输入学生信息,也可以不关闭窗体而直接在该工作表中输入学生信息(因为
窗体被设置成了无模式窗体),如图1-8所示。输入完毕后,可以按【Ctrl+S】组合键或单
击【保存】按钮将工作簿进行保存。
当全部学生的基本信息输入完毕后,就可以在当前工作表中单击鼠标右键,返回到“首
页”工作表。
8
数据列表管理与应用
学生成绩管理系统
图1-6启动“管理学生名单”窗体图1-7选择班级名称
图1-8不关闭窗体,在班级工作表中直接输入学生基本信息
1.4管理学生成绩模块的设计
管理学生成绩模块的功能是输入和修改各个班级学生的考试成绩。管理学生成绩模块
的功能是通过一个“学生成绩管理”窗体完成的。
1.4.1“学生成绩管理”窗体的结构设计
“学生成绩管理”窗体的结构如图1-9所示。在此窗体上,有3个框架、1个TreeView
控件、12个标签、12个文本框和4个命令按钮。各个控件的功能及属性设置说明如下。
(1)用户窗体:名称属性设置为“学生成绩管理窗口”,Caption属性设置为“学生成绩
管理”。将用户窗体的ShowModal属性设置为False,即设置为无模式窗体,以便在
运行窗体后,仍可操作工作表。
(2)3个框架:用于将不同功能的控件组合在一起,其Caption属性分别设置为“选择学
生”、“学生基本信息”和“学生考试成绩”。
(3)1个TreeView控件:名称为TreeView1,用于显示各个年级、各个班级的各个学生姓
名,分3级节点显示,一级节点是年级名称,二级节点是班级名称,三级节点是学生
姓名。
9
图1-9“学生成绩管理”窗体
(4)12个标签:用于对12个文本框的功能进行说明,其Caption属性的设置情况如图1-9所
示。
(5)12个文本框:分别用于显示或输入学生的基本信息和各科的考试成绩,其名称属性
分别设置为“学号”、“姓名”“性别”、“班级”“数学”、“语文”“英
语”、“物理”、“化学”、“生物”、“体育”和“总分”。
(6)命令按钮“重选学生”:单击此按钮,系统将TreeView控件中的节点收缩,以便用
户重新选择学生,其名称属性和Caption属性均设置为“重选学生”。
(7)命令按钮“输入新学生”:单击此按钮,系统将窗体文本框中的学生信息数据清除(但
保留班级文本框的数据),以输入新的学生信息,其名称属性和Caption属性均设置
为“输入新学生”。
(8)命令按钮“添加/修改”:单击此按钮,系统将输入的学生考试成绩保存到该学生所
在的班级工作表中,其名称属性设置为“添加/修改”,Caption属性设置为“添加/
修改”。此外,在按钮中插入一个图片(通过设置其Picture属性来插入图片),并将
PicturePosition属性设置为fmPicturePositionLeftCenter。
(9)命令按钮“退出”:单击此按钮,可关闭窗体,其名称属性和Caption属性均设置为
“退出”。此外,在按钮中插入一个图片(通过设置其Picture属性来插入图片),
并将PicturePosition属性设置为fmPicturePositionLeftCenter。
1.4.2“学生成绩管理”窗体的程序代码设计
(1)首先定义如下的模块级变量,它们放在用户窗体对象程序代码窗口的顶部。
DimmyTextAsString
DimmyNameAsString
DimwsAsWorksheet
DimmyArrayAsVariant
(2)为用户窗体设置Initialize事件,当启动窗体时,查询年级数和班级数,为TreeView1
设置节点。程序代码如下:
PrivateSubUserForm_Initialize()
OnErrorResumeNext
10
数据列表管理与应用
学生成绩管理系统
myArray=Array("学号","姓名","性别","数学","语文","英语","物理",_
"化学","生物","体育","总分")
Call设置节点''设置TreeView1控件的节点
EndSub
这里的子程序“设置节点”就是为TreeView1设置节点,程序代码如下:
PublicSub设置节点()
DimiAsInteger,jAsInteger,kAsInteger,pAsInteger
DimmystrAsString
Call年级班级''设置年级班级变量数据
TreeView1.Nodes.Clear''清除原有的节点
''设置TreeView1控件的属性
TreeView1.LineStyle=tvwRootLines
TreeView1.Style=tvwTreelinesPlusMinusText
TreeView1.LabelEdit=tvwManual
''添加一级节点(年级)
Forj=1Tom
Setnodx=TreeView1.Nodes.Add(,,Class(j),Class(j))
Nextj
''添加二级节点(班级)
Forj=1Tom
Fori=1Ton(j)
Setnodx=TreeView1.Nodes.Add(Class(j),_
tvwChild,Class(j)&Space(1)&ClassName(j,i),ClassName(j,i))
Nexti
Nextj
''添加三级节点(学生)
Forj=1Tom
Fori=1Ton(j)
''查询某个班级的学生数
mystr=Class(j)&Space(1)&ClassName(j,i)
Setws=Worksheets(mystr)
p=ws.Range("B65536").End(xlUp).Row-1
Fork=1Top
Setnodx=TreeView1.Nodes.Add(mystr,tvwChild,mystr&k,_
ws.Range("B"&k+1))
Nextk
Nexti
Nextj
EndSub
(3)为TreeView1设置NodeClick事件,当单击某个学生姓名时,激活某班级的工作表,
并将该学生的基本信息及考试成绩显示在有关文本框中,同时选中工作表中该学生所
在的行。程序代码如下:
PrivateSubTreeView1_NodeClick(ByValNodeAsMSComctlLib.Node)
OnErrorResumeNext
DimcelAsRange
''确定选择的学生所在的工作表
myText=Node.Parent.Parent.Text&Space(1)&Node.Parent.Text
myName=Node.Text
Setws=Worksheets(myText)
ws.Visible=True
ws.Activate
''在工作表中查找该学生,并将查询到该学生的信息显示在窗体上
p=ws.Range("B65536").End(xlUp).Row-1
11
ForEachcelInws.Range("B2:B"&p+1)
Ifcel.Text=myNameThen
班级.Value=myText
Fori=0ToUBound(myArray)
Me.Controls(myArray(i)).Value=cel.Offset(0,i-1)
Nexti
Rows(cel.Row).Select
ExitFor
Else
Call清除窗口
EndIf
Next
EndSub
这里,子程序“清除窗口”的功能是清除窗口中各个文本框的数据,程序代码如下:
PublicSub清除窗口()
DimiAsInteger
Fori=0ToUBound(myArray)
Me.Controls(myArray(i)).Value=""
Nexti
EndSub
(4)为“重选学生”按钮设置Click事件,当单击此按钮时,收缩TreeView控件的节点,
以便用户重新选择学生。程序代码如下:
PrivateSub重选学生_Click()
Call设置节点''收缩班级节点
DimiAsInteger
Fori=1ToTreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded=False
Nexti
Call清除窗口
班级.Value=""
EndSub
(5)为“输入新学生”按钮设置Click事件,当单击此按钮时,系统将窗体中学生的信息
数据清除(但保留班级文本框的数据),已准备输入新的学生信息。程序代码如下:
PrivateSub输入新学生_Click()
Call清除窗口
EndSub
(6)为学生各科考试成绩的文本框设置Change事件,当输入各科考试成绩分数时,自动
计算出总分,并显示在“总分”文本框中。这些文本框的Change事件程序代码分别
如下:
PrivateSub数学_Change()
Call总分计算
EndSub
PrivateSub语文_Change()
Call总分计算
EndSub
PrivateSub英语_Change()
Call总分计算
EndSub
PrivateSub物理_Change()
Call总分计算
EndSub
PrivateSub化学_Change()
12
数据列表管理与应用
学生成绩管理系统
Call总分计算
EndSub
PrivateSub生物_Change()
Call总分计算
EndSub
PrivateSub体育_Change()
Call总分计算
EndSub
而子程序“总分计算”用于计算总分,并将计算的总分显示在“总分”文本框中,程
序代码如下:
PublicSub总分计算()
总分.Value=Val(数学.Value)+Val(语文.Value)+Val(英语.Value)_
+Val(物理.Value)+Val(化学.Value)+Val(生物.Value)+Val(体育.Value)
EndSub
(7)为“添加/修改”按钮设置Click事件,当单击此按钮时,就将工作表中已经存在的学
生信息进行修改保存,或将输入的新的学生信息保存到工作表。如果是新输入的学生,
则该学生的名字同时也添加到TreeView1控件。程序代码如下:
PrivateSub添加修改_Click()
DimcelAsRange,iAsInteger
''保存该学生信息
Setws=Worksheets(班级.Value)
p=ws.Range("B65536").End(xlUp).Row-1
ForEachcelInws.Range("A2:A"&p+1)
Ifcel.Text=学号.ValueThen''修改数据
Fori=1ToUBound(myArray)
cel.Offset(0,i)=Me.Controls(myArray(i)).Value
Nexti
GoTohhh
EndIf
Next
''添加新的数据
p=ws.Range("B65536").End(xlUp).Row
Fori=1ToUBound(myArray)+1
Cells(p+1,i)=Me.Controls(myArray(i-1)).Value
Nexti
hhh:
Call设置节点
Fori=1Tom
IfTreeView1.Nodes(i).Key=Class(i)Then
TreeView1.Nodes(i).Expanded=True
ExitFor
EndIf
Nexti
EndSub
(8)为“退出”按钮设置Click事件,当单击此按钮时就关闭窗体。程序代码如下:
PrivateSub退出_Click()
End
EndSub
1.4.3学生成绩管理模块的应用举例
单击“首页”工作表的“管理学生成绩”图形按钮,打开“学生成绩管理”窗体,如
13
图1-10所示。
图1-10启动“学生成绩管理”窗体
单击左边控件中的某年级节点,展开年级节点,单击班级节点,展开班级节点,选择
要输入或修改成绩的学生,则该学生的基本信息就显示在窗体上,如图1-11所示。
图1-11选择学生
在学生考试成绩文本框中输入各科考试成绩,然后单击“添加/修改”按钮,则该学生
的考试成绩就保存到工作表中,如图1-12所示。
如果输入数据有误,可以在左边的控件中将该学生查找出来,再在文本框中进行修改,
最后单击“添加/修改”按钮即可。也可以直接在工作表中进行修改。
输入完毕后,可以按【Ctrl+S】组合键或单击【保存】按钮将工作簿进行保存。
当全部学生的基本信息输入完毕后,就可以在当前工作表中单击鼠标右键,返回到“首
页”工作表。
14
数据列表管理与应用
学生成绩管理系统
图1-12将学生考试成绩保存到工作表
1.5查询学生成绩模块的设计
查询学生成绩模块的功能是根据用户设定的条件,比如某科分数或总分大于、等于或
小于某数,查询出所有满足条件的学生。查询学生成绩模块的这些功能是通过一个“学生
成绩查询”窗体完成的。
1.5.1“学生成绩查询”窗体的结构设计
“学生成绩查询”窗体的结构如图1-13所示。在此窗体上,有2个框架、4个复合框、
8个标签、4个文本框和2个命令按钮。各个控件的功能及属性设置说明如下。
图1-13“学生成绩查询”窗体
(1)用户窗体:名称属性设置为“学生成绩查询窗口”,Caption属性设置为“学生成绩
查询”。将用户窗体的ShowModal属性设置为False,即设置为无模式窗体,以便在
运行窗体后,仍可以操作工作表。
15
(2)2个框架:用于将不同功能的控件组合在一起,其Caption属性分别设置为“设置查
询条件”和“查询结果”。
(3)8个标签:用于对4个复合框和4文本框的功能进行说明,其Caption属性的设置如
图1-13所示。其中标题为“项目结果”标签的名称属性也设置为“项目结果”,其
功能是用于显示具体的查询项目名称。
(4)4个复合框:分别用于选择查询年级、查询班级、查询项目(即科目和总分项目)和
设置查询条件(大于、等于或小于),其名称属性分别设置为“查询年级”、“查询
班级”、“查询项目”和“查询条件”。
(5)4个文本框:分别用于输入或显示查询条件值及查询结果,其名称属性分别设置为“条
件值”、“姓名”、“性别”和“项目结果”。
(6)命令按钮“查询”:单击此按钮,系统根据条件进行查询,并将查询结果在窗口中显
示出来,同时在相应的工作表中标识出该结果所在的行。其名称属性均设置为“查询”。
(7)命令按钮“退出”:单击此按钮,可关闭窗体,其名称属性和Caption属性均设置为
“退出”。
1.5.2“学生成绩查询”窗体的程序代码设计
(1)首先定义如下的模块级变量,它们放在用户窗体对象程序代码窗口的顶部。
DimmyArray
DimmyRowAsInteger
DimwsAsWorksheet
(2)为用户窗体设置Initialize事件,当启动窗体时,查询年级数和班级数,复合框设置
项目。程序代码如下:
PrivateSubUserForm_Initialize()
DimjAsInteger
Call年级班级
''为查询年级复合框设置项目
Forj=1Tom
查询年级.AddItemClass(j)
Nextj
查询年级.ListIndex=0
''为查询项目复合框设置项目
myArray=Array("数学","语文","英语","物理","化学","生物","体育","总分")
Forj=0ToUBound(myArray)
查询项目.AddItemmyArray(j)
Nextj
查询项目.ListIndex=0
''为查询条件复合框设置项目
With查询条件
.AddItem"大于"
.AddItem"等于"
.AddItem"小于"
EndWith
查询条件.ListIndex=0
EndSub
(3)为“查询年级”复合框设置Change事件,当选择要查询的年级时,自动为“查询班
级”复合框设置项目,以便用户可以选择该年级下的某个班级。程序代码如下:
16
数据列表管理与应用
学生成绩管理系统
PrivateSub查询年级_Change()
DimiAsInteger
''为查询班级复合框设置项目
查询班级.Clear
Fori=1Ton(查询年级.ListIndex+1)
查询班级.AddItemClassName(查询年级.ListIndex+1,i)
Nexti
查询班级.ListIndex=0
EndSub
(4)为“查询”按钮设置Click事件,当单击此按钮时,就将符合条件的学生成绩逐次显
示在窗口中,同时在相应的工作表中也逐次地标识出该学生所在的行。当有符合条件
的学生时,此按钮的Caption会被设置为“查找下一个”;当所有符合条件的学生都
查找并显示出来后,此按钮的Caption又被重新设置为“查询”。程序代码如下:
PrivateSub查询_Click()
OnErrorResumeNext
DimmyColumnAsInteger
Setws=Worksheets(查询年级.Value&Space(1)&查询班级.Value)
ws.Visible=True
ws.Activate
If查询.Caption="查询"ThenmyRow=2
myColumn=查询项目.ListIndex+4
Fori=myRowTows.Range("A65536").End(xlUp).Row
If查询条件.Value="大于"Then
IfVal(Cells(i,myColumn).Value)>Val(条件值.Value)Then
Call查询显示(Cells(i,myColumn),myColumn)
myRow=Cells(i,myColumn).Row+1
查询.Caption="查找下一个"
ExitSub
EndIf
ElseIf查询条件.Value="等于"Then
IfVal(Cells(i,myColumn).Value)=Val(条件值.Value)Then
Call查询显示(Cells(i,myColumn),myColumn)
myRow=Cells(i,myColumn).Row+1
查询.Caption="查找下一个"
ExitSub
EndIf
ElseIf查询条件.Value="小于"Then
IfVal(Cells(i,myColumn).Value) Call查询显示(Cells(i,myColumn),myColumn)
myRow=Cells(i,myColumn).Row+1
查询.Caption="查找下一个"
ExitSub
EndIf
EndIf
Nexti
MsgBox"没有查询到结果!",vbExclamation,"无查询结果"
查询.Caption="查询"
EndSub
这里,子程序“查询显示”的功能是在窗体上显示查询结果,同时在相应的工作表中
也标识出该学生所在的行。子程序“查询显示”的程序代码如下:
PublicSub查询显示(mycelAsRange,myColAsInteger)
姓名.Value=Cells(mycel.Row,2)
17
性别.Value=Cells(mycel.Row,3)
项目结果.Caption=查询项目.Value&"分数:"
查询结果.Value=Cells(mycel.Row,myCol)
Rows(mycel.Row).Select
EndSub
(5)为“退出”按钮设置Click事件,当单击此按钮时就可关闭窗体。程序代码如下:
PrivateSub退出_Click()
End
EndSub
1.5.3学生成绩查询模块的应用举例
单击“首页”工作表的“查询学生成绩”图形按钮,打开“学生成绩查询”窗体,如
图1-14所示。
图1-14启动“学生成绩查询”窗体
选择年级、班级、学科名称或总分,设置查询条件及条件值,单击“查询”按钮,则
查询出的结果就显示在窗体的文本框中,同时该学生所在行也被选中。此时,“查询”按钮
的标题变为“查找下一个”,如图1-15所示。继续单击此按钮,将依次显示出符合条件的
学生信息,如图1-16所示。
图1-15查询出符合条件的学生
18
数据列表管理与应用
学生成绩管理系统
图1-16继续查找符合条件的学生
1.6成绩统计分析模块的设计
成绩统计分析模块的功能是对某班级或某年级的学生考试成绩,按设定的条件进行统
计分析。成绩统计分析模块的这些功能是通过一个“成绩统计分析”窗体完成的。
1.6.1“成绩统计分析”窗体的结构设计
“成绩统计分析”窗体的结构如图1-17所示。在此窗体上,有1个框架、4个标签、
4个复合框、2个文本框和2个命令按钮。各个控件的功能及属性设置说明如下。
图1-17“成绩统计分析”窗体结构
(1)用户窗体:名称属性设置为“成绩统计分析窗口”,Caption属性设置为“成绩统计
分析”。将用户窗体的ShowModal属性设置为False,即设置为无模式窗体。
(2)1个框架:用于美化窗体,其Caption属性分别设置为“选择统计分析条件”。
(3)4个标签:用于对3个复合框的功能进行说明,其Caption属性的设置见图1-17所示。
其中Caption属性为“与”的标签的名称属性也设置为“与”。
(4)4个复合框:分别用于选择查询年级、选择查询班级、选择学科以及设置条件比较符,
其名称属性分别设置为“查询年级”、“查询班级”、“学科”和“比较符”。
(5)两个文本框分别用于设定查询条件值,其名称属性分别为“条件1”和“条件2”。
当在“比较符”复合框中选择“between”时,就会在窗体上出现这两个文本框,用
于设置一个条件区间;当在“比较符”复合框中选择“=”、“>”或“>”时,仅出
现第一个条件值文本框“条件1”。
19
(6)命令按钮“统计分析”:单击此按钮,系统就根据条件进行查询,并将查询结果复制
到工作表“统计分析结果”中。
(7)命令按钮“退出”:单击此按钮,可关闭窗体,其名称属性和Caption属性均设置为
“退出”。
1.6.2“成绩统计分析”窗体的程序代码设计
(1)首先定义如下的模块级变量,它们放在用户窗体对象程序代码窗口的顶部:
DimmyArrayAsVariant
(2)为用户窗体设置Initialize事件,当启动窗体时,查询年级数和班级数,为复合框设
置项目。程序代码如下:
PrivateSubUserForm_Initialize()
DimjAsInteger
Setwb=ThisWorkbook
Call年级班级
''为选择年级复合框设置项目
Forj=1Tom
选择年级.AddItemClass(j)
Nextj
选择年级.ListIndex=0
''为学科复合框设置项目
myArray=Array("数学","语文","英语","物理","化学","生物","体育","总分")
Forj=0ToUBound(myArray)
学科.AddItemmyArray(j)
Nextj
学科.ListIndex=0
With比较符
.AddItem"="
.AddItem">"
.AddItem"<"
.AddItem"between"
EndWith
比较符.ListIndex=0
EndSub
(3)为“选择年级”复合框设置Change事件,当选择要查询的年级时,自动为“选择年
级”复合框设置项目,以便用户可以选择该年级下的某个班级。程序代码如下:
PrivateSub选择年级_Change()
DimiAsInteger
''为选择班级复合框设置项目
选择班级.Clear
Fori=1Ton(选择年级.ListIndex+1)
选择班级.AddItemClassName(选择年级.ListIndex+1,i)
Nexti
选择班级.AddItem"全年级"
选择班级.ListIndex=0
EndSub
(4)为“比较符”复合框设置Change事件,当选择不同的比较符时,设置两个文本框及
1个标签的可见性,以及“条件1”文本框的宽度。程序代码如下:
PrivateSub比较符_Change()
If比较符.Value="between"Then
与.Visible=True:条件2.Visible=True:条件1.Width=36
20
数据列表管理与应用
学生成绩管理系统
Else
与.Visible=False:条件2.Visible=False:条件1.Width=90
EndIf
条件1.SetFocus
EndSub
(5)为“统计分析”按钮设置Click事件,当单击此按钮时,系统将根据选择的统计分析
条件进行统计分析,并将统计结果复制到“统计分析结果”工作表中。程序代码如下:
PrivateSub统计分析_Click()
DimwsAsWorksheet
DimfinalRowAsInteger,iAsInteger,kAsInteger
DimmyConditionAsString
DimcnnAsADODB.Connection
DimrsAsADODB.Recordset
''判断工作簿中是否存在"统计分析结果"工作表
SheetExist=False''默认工作表不存在
ForEachwsInWorksheets
Ifws.Name="统计分析结果"Then
SheetExist=True:ExitFor
EndIf
Next
IfSheetExist=FalseThen''如果工作表"统计分析结果"不存在,就创建它
Worksheets.AddAfter:=Worksheets(Worksheets.Count)
ActiveSheet.Name="统计分析结果"
EndIf
Setws=Worksheets("统计分析结果")''定义工作表对象变量
ws.Visible=True''显示工作表"统计分析结果"
ws.Activate''激活工作表"统计分析结果"
ws.Cells.Clear''删除工作表"统计分析结果"的所有数据
''设置查询条件
myCondition="where"&学科.Value
If比较符.Value="between"Then
myCondition=myCondition&"between"&条件1.Value_
&"and"&条件2.Value
Else
myCondition=myCondition&比较符.Value&条件1.Value
EndIf
''建立与当前工作簿的连接
Setcnn=NewADODB.Connection
Withcnn
.Provider="microsoft.jet.oledb.4.0"
.ConnectionString="ExtendedProperties=Excel8.0;"_
&"DataSource="&ThisWorkbook.FullName
.Open
EndWith
''输入标题
ws.Range("A1:E1")=Array("班级","学号","姓名","性别",学科.Value)
''根据选择的统计分析要求,查询数据并复制到工作表"统计分析结果"中
If选择班级.Value="全年级"Then''选择某年级进行统计分析
Fori=1ToWorksheets.Count
IfWorksheets(i).Name="首页"OrWorksheets(i).Name="班级管理"_
OrWorksheets(i).Name="统计分析结果"ThenGoTomyNext
mysql="select学号,姓名,性别,"&学科.Value&"from["_
&Worksheets(i).Name&"$]"&myCondition&"orderby"_
&学科.Value&"DESC"
21
Setrs=NewADODB.Recordset
rs.Openmysql,cnn,adOpenKeyset,adLockOptimistic
finalRow=ws.Range("A65536").End(xlUp).Row''计算最后一行行号
Ifrs.RecordCount>0Then
Fork=1Tors.RecordCount
ws.Range("A"&k+finalRow)=Worksheets(i).Name
Nextk
''复制查询到的数据
ws.Range("B"&finalRow+1).CopyFromRecordsetrs
EndIf
myNext:
Nexti
Else''选择某班级进行统计分析
mysql="select学号,姓名,性别,"&学科.Value&"from["&选择年级_
.Value&Space(1)&选择班级.Value&"$]"&myCondition_
&"orderby"&学科.Value&"DESC"
Setrs=NewADODB.Recordset
rs.Openmysql,cnn,adOpenKeyset,adLockOptimistic
finalRow=ws.Range("A65536").End(xlUp).Row''计算最后一行行号
Ifrs.RecordCount>0Then
ws.Range("A"&finalRow+1)=选择班级.Value
ws.Range("B"&finalRow+1).CopyFromRecordsetrs''复制查询到的数据
Else
MsgBox"没有查询到符合条件的学生!",vbInformation,"没有记录"
EndIf
EndIf
Application.ScreenUpdating=True
EndSub
说明:查询程序利用了ADO来查询工作表,因此需要引用几个ADO项目,具体引用
项目可以参阅第22章和第23章的有关内容。
(6)为“退出”按钮设置Click事件,当单击此按钮时可关闭窗体。程序代码如下:
PrivateSub退出_Click()
End
EndSub
1.6.3成绩统计分析模块的应用举例
单击“首页”工作表的“成绩统计分析”图形按钮,打开“成绩统计分析”窗体,如
图1-18所示。
图1-18启动“成绩统计分析”窗体
22
数据列表管理与应用
学生成绩管理系统
选择年级、班级、学科名称或总分,设置统计条件(比如要查询所有初一年级的数学
成绩介于90~110的学生),设置的条件如图1-19所示,单击“统计分析”按钮,则系统
就开始进行统计分析,结果如图1-20所示。
由于是对每个班级进行排序统计,并将各个班级自己的排序结果都放在一个工作表中,
造成所有的统计数据并不是真正意义上的从大到小排列,如图1-20所示,此时,可以单击
工作表工具栏上的排序按钮,进行重新排序即可。这里将各个班级符合条件的学生放在一
起,是为了方便查看各个班级的符合条件的学生。读者也可以在程序的最后加上排序语句,
将某学科的成绩从高到低进行自动排序,这个排序语句可以通过录制宏的方式得到。
图1-19设置的统计分析条件图1-20得到的分析结果
如果要统计初一1班所有语文成绩大于90分的学生,则设置如图1-21所示的条件,
得到的结果如图1-22所示。
图1-21设置统计分析条件图1-22初一1班所有语文成绩大于90分的学生
1.7打印成绩单模块的设计
打印成绩单模块的功能是生成某班的学生成绩单,并打印出来,以便于分发给每个学
生。打印成绩单模块的这些功能是通过一个“打印成绩单”窗体完成的。
1.7.1学生成绩单结构
成绩单是分发给每个学生的。每个学生的成绩单上应该有完整的科目名称和考试成绩。
成绩单的结构如图1-23所示。本模块就是要生成这样的成绩单,并打印出来。
23
图1-23学生成绩单
1.7.2“打印成绩单”窗体的结构设计
“打印成绩单”窗体的结构如图1-24所示。在此窗体上,有1个框架、2个标签、2
个复合框和3个命令按钮。标签的Caption属性设置为“选择年级和班级”。2个标签和2
个复合框的功能及属性设置与“成绩统计分析”窗体相同。3个命令按钮名称属性和Caption
属性分别为“生成成绩单”、“打印成绩单”和“退出”,分别完成编写成绩单、打印成绩单
和关闭窗体的功能。
图1-24“打印成绩单”窗体结构
1.7.3“打印成绩单”窗体的程序代码设计
(1)首先定义如下的模块级变量。
DimwbAsWorkbook
(2)为用户窗体设置Initialize事件,事件程序代码如下:
PrivateSubUserForm_Initialize()
DimjAsInteger
Setwb=ThisWorkbook
Call年级班级
''为选择年级复合框设置项目
Forj=1Tom
选择年级.AddItemClass(j)
Nextj
24
数据列表管理与应用
学生成绩管理系统
选择年级.ListIndex=0
EndSub
(3)为“选择年级”复合框设置Change事件,事件程序代码如下:
PrivateSub选择年级_Change()
DimiAsInteger
''为选择班级复合框设置项目
选择班级.Clear
Fori=1Ton(选择年级.ListIndex+1)
选择班级.AddItemClassName(选择年级.ListIndex+1,i)
Nexti
选择班级.ListIndex=0
EndSub
(4)为命令按钮“生成成绩单”设计Click事件程序,代码如下:
PrivateSub生成成绩单_Click()
DimnewBookAsWorkbook
DimmyArrayAsVariant
DimwsAsWorksheet
Setws=ThisWorkbook.Sheets(选择年级.Value&Space(1)&选择班级.Value)
DimfinaColAsInteger,finalRowAsInteger
finalRow=ws.Range("A65536").End(xlUp).Row
finalcolumn=ws.Range("IV1").End(xlToLeft).Column
myArray=Array("学号","姓名","性别","数学","语文","英语","物理",_
"化学","生物","体育","总分")
''根据选择设定新工作簿名
myBookName=选择年级.Value&Space(1)&选择班级.Value&Space(1)&"成绩单"
''检查是否有已经打开的同名文件,如果有,就关闭它
Fori=1ToWorkbooks.Count
IfWorkbooks(i).Name=myBookName&".xls"Then
Workbooks(i).CloseSaveChanges:=False
EndIf
Nexti
''删除当前文件夹中已有的重名工作簿
OnErrorResumeNext
KillThisWorkbook.Path&"\"&myBookName&".xls"
OnErrorGoTo0
''创建新工作簿
SetnewBook=Workbooks.Add
WithnewBook
.Sheets(1).Name="成绩单"
.SaveAsFilename:=ThisWorkbook.Path&"\"&myBookName
EndWith
newBook.Worksheets("成绩单").Columns("A:A").NumberFormatLocal="@"
Cells.DeleteShift:=xlUp
Cells.Interior.ColorIndex=2
k=1
Fori=2TofinalRow
''复制数据,并设置数据格式
Range(Cells(k,1),Cells(k,finalcolumn))=myArray
Range(Cells(k,1),Cells(k,finalcolumn)).HorizontalAlignment=xlCenter
Forj=1Tofinalcolumn
Cells(k+1,j)=ws.Cells(i,j)
Cells(k+1,j).HorizontalAlignment=xlCenter
Nextj
''设置单元格边框
25
Range(Cells(k,1),Cells(k+1,finalcolumn)).Select
WithSelection
.Borders(xlEdgeLeft).Weight=xlThin
.Borders(xlEdgeTop).Weight=xlThin
.Borders(xlEdgeBottom).Weight=xlThin
.Borders(xlEdgeRight).Weight=xlThin
.Borders(xlInsideVertical).Weight=xlThin
.Borders(xlInsideHorizontal).Weight=xlThin
EndWith
k=k+3
Nexti
Cells(1,1).Select
EndSub
(5)为命令按钮“打印成绩单”设置Click事件。以通过录制宏的方式获得基本的宏代码,
然后再进行修改,以适应本系统的需要。程序代码如下:
PrivateSub打印成绩单_Click()
IfMsgBox("是否打印成绩单?",vbQuestion+vbYesNo,"打印成绩单")=vbNoThen
ExitSub
ActiveSheet.PageSetup.PrintArea="$A$1:$K$"&Range("A65536").End
(xlUp).Row
WithActiveSheet.PageSetup
.LeftHeader=""
.CenterHeader=选择年级.Value&Space(1)&选择班级.Value&Space(1)_
&"成绩单"
.CenterFooter="第&P页,共&N页"
.LeftMargin=Application.InchesToPoints(0.748031496062992)
.RightMargin=Application.InchesToPoints(0.748031496062992)
.TopMargin=Application.InchesToPoints(0.984251968503937)
.BottomMargin=Application.InchesToPoints(0.984251968503937)
.HeaderMargin=Application.InchesToPoints(0.511811023622047)
.FooterMargin=Application.InchesToPoints(0.511811023622047)
.PrintComments=xlPrintNoComments
.CenterHorizontally=True
.Orientation=xlLandscape
.PaperSize=xlPaperA4
.Order=xlDownThenOver
.Zoom=100
.PrintErrors=xlPrintErrorsDisplayed
EndWith
ActiveWindow.SelectedSheets.PrintPreview
EndSub
1.7.4“打印成绩单”模块的应用举例
单击“首页”工作表的“打印成绩单”图形按钮,打开“打印成绩单”窗体,如图1-25
所示。
选择年级和班级,单击“生成成绩单”按钮,则系统编制某班的成绩单,结果参阅前
面的图1-23所示。单击“打印成绩单”按钮,系统将首先进行预览,如图1-26所示,然
后单击预览窗口的“打印”按钮,即可开始打印。如果不想打印,可单击预览窗口的“关
闭”按钮。
26
数据列表管理与应用
学生成绩管理系统
图1-25“打印成绩单”窗体
图1-26预览成绩单
27
|
|