学生成绩管理系统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管理学生名单()'管理学生名单按钮学生管理窗口.ShowEndSubSub管理学生成绩()'管理学生成绩按钮学生成绩管理窗口.ShowEndSubSub查询学生成绩()'查询学生成绩按钮学生成绩查询窗口.ShowEndSubSub成绩统计分析()'成绩统计分析按钮成绩统计分析窗口.ShowEndSubSub打印成绩单()'打印成绩单按钮打印成绩单窗口.ShowEndSubSub班级管理()'班级管理按钮Worksheets(班级管理).Visible=True'显示工作表班级管理Worksheets(班级管理).Activate'激活工作表班级管理EndSub1.1.4为工作簿对象编写有关的事件程序为了在打开系统工作簿时,自动激活“首页”工作表,并将该工作表进行保护。同时3将工作簿中除“首页”工作表外的所有工作表隐藏起来,以保护其中的数据(如果用户需要查看某工作表的数据,可以在相应窗体进行有关操作,使隐藏的工作表显示出来)。因此,为工作簿对象设置Open事件,程序代码如下:PrivateSubWorkbook_Open()DimiAsIntegerWorksheets(首页).Activate'激活工作表首页Worksheets(首页).Protect'保护工作表首页Fori=1ToWorksheets.CountIfWorksheets(i).Name首页ThenWorksheets(i).Visible=False'保护除工作表首页外的所有工作表EndIfNextiEndSub由于在操作时,对学生考试成绩进行了录入、修改等操作,而学生成绩都保存在本系统工作簿的有关工作表中,因此,在关闭系统工作簿之前,要先保存工作簿,为此,对工作簿对象设置BeforeClose事件,程序代码如下:PrivateSubWorkbook_BeforeClose(CancelAsBoolean)ThisWorkbook.CloseSaveChanges:=TrueEndSub此外,在操作时,我们会激活某些工作表并查看数据,这样,为了能够返回“首页”工作表,并隐藏其他的工作表,应该为工作簿的所有工作表都设置一个能够返回“首页”工作表的事件。为工作簿对象设置SheetBeforeRightClick事件,即单击鼠标右键激活“首页”工作表。工作簿对象的SheetBeforeRightClick事件程序代码如下:PrivateSubWorkbook_SheetBeforeRightClick(ByValShAsObject,_ByValTargetAsRange,CancelAsBoolean)DimiAsIntegerCancel=TrueFori=1ToWorksheets.CountIfWorksheets(i).Name首页ThenWorksheets(i).Visible=FalseEndIfNextiWorksheets(首页).ActivateEndSub1.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,jAsIntegerCall年级班级'清除原有的节点TreeView1.Nodes.Clear'设置TreeView1控件的属性TreeView1.LineStyle=tvwRootLinesTreeView1.Style=tvwTreelinesPlusMinusTextTreeView1.LabelEdit=tvwManual'添加一级节点(年级)Forj=1TomSetnodx=TreeView1.Nodes.Add(,,Class(j),Class(j))Nextj'添加二级节点(班级)Forj=1TomFori=1Ton(j)Setnodx=TreeView1.Nodes.Add(Class(j),_tvwChild,Class(j)&Space(1)&ClassName(j,i),ClassName(j,i))NextiNextjEndSub这里,子程序“年级班级”的功能是查询年级名称和班级名称,并保存在数组变量中。这个子程序保存在一个名称为“公共子程序”的标准模块中。程序代码如下:PublicSub年级班级()DimiAsInteger,jAsInteger,nmaxAsIntegerDimwsAsWorksheet'获取年级个数和班级个数Setws=Worksheets(班级管理)m=ws.Range(IV1).End(xlToLeft).ColumnReDimn(1Tom)AsIntegerReDimClass(1Tom)AsString'获取各年级的最大班级数目nmax=ws.UsedRange.Rows.Count-1ReDimClassName(1Tom,1Tonmax)AsString'保存班级名称Forj=1Tomn(j)=ws.Cells(65536,j).End(xlUp).Row-1Class(j)=ws.Cells(1,j)Fori=1Ton(j)ClassName(j,i)=ws.Cells(1+i,j)NextiNextjEndSub(2)为TreeView1设置NodeClick事件,当单击某个班级节点时,激活某班级工作表。程序代码如下:PrivateSubTreeView1_NodeClick(ByValNodeAsMSComctlLib.Node)OnErrorResumeNext'显示并激活某班级工作表Worksheets(Node.Key).Visible=TrueWorksheets(Node.Key).ActivateEndSub(3)为“重新选择”按钮设置Click事件,当单击此按钮时,收缩TreeView控件的节点,以便用户重新选择班级工作表。程序代码如下:7PrivateSub重新选择_Click()'收缩班级节点DimiAsIntegerFori=1ToTreeView1.Nodes.Coun