毕业论文(设计)
题目 基于VBA开发成绩分析管理系统
专科学校
专业 计算机信息管理
班级
考生姓名
准考证号
指导教师
2013 年 4 月 12 日
目 录
前 言 1
第一章 概 述 2
1.1系统开发背景 2
1.2 系统开发环境与开发工具 2
1.3 系统开发目标 2
1.4 可行性分析 2
1.4.1 技术上可行性 2
1.4.2 运行上可行性 3
第二章 需求分析 4
2.1 成绩分析系统现状分析 4
2.2 基于VBA技术的应用 4
2.2.1 VBA简介 4
2.2.2 VBA与其他开发技术的比较 4
第三章 成绩分析系统设计与实现 5
3.1 系统结构 5
3.2 程序逻辑 6
3.2.1 系统E-R图 6
3.2.2 查询模块流程图 6
3.2.3 分析模块流程图 7
3.3 主程序设计说明 7
3.3.1 用户登录模块 7
3.3.2 系统设计 9
3.3.3 数据错误检查及维护 29
第四章 成绩分析系统系统测试 32
4.1 概述 32
4.2 测试的原则和目标 32
4.2.1测试的原则 32
4.2.2测试的目标 32
4.3 测试方法 33
4.3.1 界面测试 33
4.3.2 性能测试 33
4.4 系统的优点与不足 34
第五章 总结与展望 35
参考文献 36
摘 要
随着计算机技术的飞速发展,计算机的应用已经越来越普及,其渗透到人类社会的各个领域并发挥着重要的作用。同样,运用计算机对学生成绩信息进行分析与管理已经成为各大院校的迫切需求。
学生成绩信息是教育单位不可或缺的一部分,然而使用传统的人工方式对学生成绩进行分析存在着许多缺点,比如说误差性大、效率低、成本高等,这时迫切需要一种能够自动对学生成绩信息进行分析管理的方法。运用成绩分析系统对学生成绩信息进行分析,具有人工分析无法比拟的优点,例如:检索迅速、可靠性高、成本低等,这些优点能够极大的提高管理者对学生成绩管理的效率,使得学校的管理正规化、科学化。而运用基于Visual Basic发展而来的VBA技术,不但继承了VB的开发机制,而且具有与VB相似的语言结构,它具有效率高、简单易学及功能强大的特点。
关键词:VBA、成绩分析、Excel、成绩管理。
前 言
计算机网络技术的发展,使得人们的生活与工作方式发生了很大的改变,人工处理数据信息的模式已经远远不能满足人们的需求,在这种形势下,使用计算机软件技术处理学生成绩信息成为了必然。
90年代早期,使应用程序自动化还是一块充满挑战性的领域,对每个需要自动化的应用程序,人们不得不学习一种不同的自动化语言,例如,可以用Excel的宏语言来使Excel自动化,微软决定让它开发出来的应用程序共享一种通用的自动化语言——Visual Basic For Application(VBA),可以说VBA是一种非常流行的应用程序开发语言,使用它可以自定义Excel工具栏、菜单和界面,可以自定义Excel,使其成为开发平台等等。
本篇论文将从系统的开发背景、可行性分析、需求分析、概要设计、详细设计和系统测试等主要方面对成绩分析系统进行详细讲解,在论文的最后,将再次通过总结系统的设计、功能对系统进行整体上的认识。
第一章 概 述
1.1系统开发背景
计算机应用的普及使得学校使用计算机技术对学生成绩信息进行分析变得越来越频繁,而基于VBA技术的成绩分析系统通过Visual Basic for Application与Excel的巧妙结合运用让学生成绩信息分析变得更加准确、高效。
1.2 系统开发环境与开发工具
成绩信息分析系统的开发环境如下:windows xp操作系统。
开发所使用的工具有:Microsoft office 2003,Visual Basic For Application。
1.3 系统开发目标
本系统开发的主要目标是为了实现对学生成绩信息的高效和准确的分析,同时学生可以通过本系统查询成绩以及档案等信息。
1.4 可行性分析
1.4.1 技术上可行性
可行性研究的目的是用最小的代价在尽可能的时间内确定问题是否能够得到解决。
本系统的设计开发利用Microsoft office Excel作为本系统的开发平台,操作简单易学,容易上手,适用于大中规模的数据量需求。
使用Visual Basic For Application作为系统的开发环境,它提供完善的指令控制语句、类与对象的支持及丰富的数据类型,给开发高性能系统提供的保障为开发满足客户要求的系统,保证了代码的模块化要求,而代码模块化的提高,非常有利于以后对新系统的扩展与修改。
综上所述,本成绩分析系统无论在硬件设备上还是开发技术上都是可行的。
1.4.2 运行上可行性
本系统作为一个使用Microsoft office Excel对数据进行分析,所耗费的资源非常少,要求的环境配置也非常简单,同时对硬件的要求很低,在运行上具有非常大的可行性。
第二章 需求分析
2.1 成绩分析系统现状分析
目前市场上的成绩分析系统层出不穷,系统结构千变万化,然而当我们在使用别人做的系统时会发现此类系统会出现很多不必要出现的问题,比如系统打开速度慢,系统很多功能用不到,安装系统时要求的环境配置很高等等的这些问题使得市场上的系统在用户体验上做的很差。
于是,在这种形势下,一种更适合用户体验的成绩分析系统成为了使用者的迫切需求,基于VBA技术的成绩分析系统采用的是以Excel形式对成绩信息进行分析管理的模式,它无需与数据库进行连接,同时要求的环境配置非常低,用户非常容易上手操作,这种系统在现今这种状态下非常值得提倡使用。
2.2 基于VBA技术的应用
2.2.1 VBA简介
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能。也可说是一种应用程式视觉化的Basic Script。
2.2.2 VBA与其他开发技术的比较
Microsoft Office software的普及使得人们常见的Office软件中的Word、Excel、Access、Powerpoint都可以利用VBA使这些软件的应用更高效率,例如:通过一段VBA代码,可以实现画面的切换和复杂逻辑的统计。
第三章 成绩分析系统设计与实现
3.1 系统结构
本成绩分析系统从功能上划分以下两个模块:学生成绩分析模块,学生信息查询模块,以下对这两个模块进行详细的说明。
学生成绩分析模块:该模块可以对整个年级的学生成绩信息进行排名,并通过输入班级名生成班级成绩表,另外该模块还可以对每一科目的成绩进行分析。
如果在管理员想查询某次考试的缺考人员信息,可以通过点击主界面的缺考人员名单进行查询分析。同时,可以对数据信息进行维护与查错。
学生信息查询模块:该模块是学生用来查询个人信息包括个人成绩查询,个人成绩排名查询,单科成绩的详细情况查询以及对个人档案信息的简单维护,同时如果学生为了保证信息安全需要定期修改个人密码,只需要点击主界面上的修改密码选项即可以轻松实现密码的修改。
系统整体模块如图3-1所示:
图3-1 系统整体模块结构图
3.2 程序逻辑
3.2.1 系统E-R图
系统E-R图如图3-2所示。
图3-2 系统E-R图
3.2.2 查询模块流程图
查询模块流程图如图3-3所示。
图3-3 查询模块流程图
3.2.3 分析模块流程图
分析模块流程图如图3-4所示。
图3-4 分析模块流程图
3.3 主程序设计说明
3.3.1 用户登录模块
成绩分析系统的用户登录模块如图3-5所示:
图3-5 成绩分析系统登录模块
用户登录类别分为两种:管理员与学生,其中学生具有查询个人信息的权限而无法查看其他学生、班级等信息。管理员同样不能登陆学生信息主界面,管理员具有对全年级学生信息进行操作的权限,包括对成绩信息的分析,查询,对学生档案信息的查询等。通过下面的表格,可以清楚的看到管理员的登录号和密码以及相关权限。
表3-1 登陆用户信息
| 用户类别 | 管理员 | 学生 |
| 登录号 | 88888 | 12001 |
| 密码 | 123 | 123 |
| 操作权限 | 成绩分析、成绩查询、统计人数、科目分析、数据错误检查维护、缺考人员名单查询等 | 个人成绩查询,个人排名查询,单科成绩分析,个人密码修改,档案信息维护等 |
Private Sub CommandButton1_Click()
zc = Sheets("登录").Range("A65536").End(xlUp).Row
If TextBox1.Value = "" Then MsgBox "请输入登录号", vbOKOnly, "错误"
For i = 2 To zc
If TextBox1.Text = Sheets("登录").Cells(i, 1) Then
If TextBox2.Text = Sheets("登录").Cells(i, 3) Then
Application.StatusBar = "当前用户为:" & Sheets("登录").Cells(i, 1) & ";" & "姓名为:" & Sheets("登录").Cells(i, 2) & ";身份为:" & Sheets("登录").Cells(i, 4)
登录.Hide
If Sheets("登录").Cells(i, 4) = "学生" Then
主界面2.Show
Else
主界面1.Show
End If
Else
MsgBox "密码错误!", vbOKOnly, "错误"
End If
Exit For
End If
Next i
If i > zc Then: MsgBox "登录号不存在!", vbOKOnly, "错误"
| End Sub |
3.3.2 系统设计
本系统分为学生个人成绩查询模块与学生成绩分析模块。
1. 学生个人成绩查询模块
其中学生个人成绩查询主界面如图3-6所示:
图3-6 学生成绩查询模块
学生通过登陆窗口输入登录号与密码进入此目录,在此目录下,学生可以查看个人成绩、个人排名、单科成绩以及档案等信息。
(1)个人成绩查询功能实现
通过点击个人成绩查询,可以看到如图3-7:
图3-7 个人成绩查询结果
该按钮其功能主要是学生用来查询个人成绩信息,主要代码如下图所示:
Set sth = Sheets("成绩表")
yh = Mid(Application.StatusBar, 7, WorksheetFunction.Find(";", Application.StatusBar) - 7)
For i = 2 To sth.Range("B65536").End(xlUp).Row
If sth.Cells(i, 3) = Val(yh) Then Exit For
Next i
Label2.Caption = sth.Cells(i, 2)
Label18.Caption = sth.Cells(i, 3)
Label3.Caption = sth.Cells(1, "E")
Label4.Caption = sth.Cells(1, "F")
Label5.Caption = sth.Cells(1, "G")
Label6.Caption = sth.Cells(1, "H")
Label7.Caption = sth.Cells(1, "I")
Label8.Caption = sth.Cells(1, "J")
Label10.Caption = sth.Cells(i, "E")
Label11.Caption = sth.Cells(i, "F")
Label12.Caption = sth.Cells(i, "G")
Label13.Caption = sth.Cells(i, "H")
Label14.Caption = sth.Cells(i, "I")
Label15.Caption = sth.Cells(i, "J")
| Label16.Caption = WorksheetFunction.Sum(sth.Range("E" & i & ":I" & i)) |
通过点击该功能,可以看到如下结果,如图3-8所示:
图3-8 个人成绩排名
学生通过点击该按钮,可以查看自己的成绩排名,主要代码如下图所示:
Set sth = Sheets("成绩表")
zccjb = sth.Range("B65536").End(xlUp).Row
yh = Mid(Application.StatusBar, 7, WorksheetFunction.Find(";", Application.StatusBar) - 7)
For i = 2 To sth.Range("B65536").End(xlUp).Row
If sth.Cells(i, 3) = Val(yh) Then Exit For
Next i
Label2.Caption = yh
Label4.Caption = sth.Cells(i, 2)
bj = sth.Cells(i, "D")
cj = WorksheetFunction.Sum(sth.Range("E" & i & ":I" & i))
Label8.Caption = cj
m1 = 1
m2 = 1
For j = 2 To zccjb
If WorksheetFunction.Sum(sth.Range("E" & j & ":I" & j)) > cj Then
m2 = m2 + 1
If sth.Cells(j, "D") = bj Then m1 = m1 + 1
End If
Next j
Label9.Caption = m1
| Label10.Caption = m2 |
当你点击单科成绩分析时,会要求你选择分析的科目如下图3-9所示:
图3-9 单科成绩分析
比如选择了“语文”这门课程,当你点击确定时,就能将“语文”的成绩分析结果显示出来,如下图3-10所示:
图3-10 单科成绩查询结果
该按钮是用来对单科成绩进行分析的,其功能主要代码如下图所示:
Set sth = Sheets("成绩表")
zccjb = sth.Range("B65536").End(xlUp).Row
yh = Mid(Application.StatusBar, 7, WorksheetFunction.Find(";", Application.StatusBar) - 7)
For i = 2 To zccjb
If sth.Cells(i, 3) = Val(yh) Then Exit For
Next i
km = Sheets("主界面").Cells(40, 1)
Label2.Caption = yh
Label4.Caption = sth.Cells(i, 2)
Label6.Caption = sth.Cells(i, 4)
For j = 5 To 9
If sth.Cells(1, j) = km Then Exit For
Next j
科目分析结果.Caption = "[" & km & "]成绩分析结果"
Label14.Caption = sth.Cells(i, j)
mcbj = 1
mcbjmax = sth.Cells(i, j)
mcnj = 1
mcnjmax = sth.Cells(i, j)
For k = 2 To zccjb
If sth.Cells(k, j) > sth.Cells(i, j) Then
mcnj = mcnj + 1
If sth.Cells(k, j) > mcnjmax Then mcnjmax = sth.Cells(k, j)
If sth.Cells(k, "D") = sth.Cells(i, "D") Then
mcbj = mcbj + 1
If sth.Cells(k, j) > mcbjmax Then mcbjmax = sth.Cells(k, j)
End If
End If
Next k
Label15.Caption = mcbj
Label16.Caption = mcbjmax
Label17.Caption = mcnj
| Label18.Caption = mcnjmax |
该功能顾名思义是学生用来修改个人密码的,如下图3-11所示:
图3-11 密码修改
可以通过该窗口随时更换学生的个人密码。
学生为了保护个人数据,需要定期修改密码,该密码修改功能主要代码如下图所示:
If TextBox2.Text <> TextBox3.Text Then
MsgBox "新密码确认错误!", vbOKOnly, "失败了"
Exit Sub
End If
yh = Mid(Application.StatusBar, 7, WorksheetFunction.Find(";", Application.StatusBar) - 1)
For i = 2 To Sheets("登录").Range("B65536").End(xlUp).Row
If Sheets("登录").Cells(i, 1) = Val(yh) Then
If Sheets("登录").Cells(i, 3) = TextBox1.Text Then
Sheets("登录").Cells(i, 3) = TextBox2.Text
MsgBox "密码修改成功!", vbOKOnly, "成功了"
Else
MsgBox "错误的原密码!", vbOKOnly, "失败了"
End If
Exit For
End If
| Next i |
通过点击个人档案维护,会出现如下窗口,学生可以通过该窗口修改个人基本档案信息。
图3-12 个人档案信息维护
学生可以对其档案进行维护,其功能主要代码如下图所示:
Set sth = Sheets("学生花名册")
xh = Mid(Application.StatusBar, 7, WorksheetFunction.Find(";", Application.StatusBar) - 7)
For i = 2 To sth.Range("B65536").End(xlUp).Row
If sth.Cells(i, 1) = Val(xh) Then Exit For
Next i
sth.Cells(i, 5) = TextBox4.Text
sth.Cells(i, 6) = TextBox5.Text
sth.Cells(i, 7) = TextBox6.Text
sth.Cells(i, 8) = TextBox7.Text
sth.Cells(i, 4) = TextBox8.Text
sth.Cells(i, 9) = TextBox9.Text
sth.Cells(i, 10) = TextBox10.Text
sth.Cells(i, 11) = TextBox11.Text
| ThisWorkbook.Save |
而成绩分析的主界面如图3-13所示:
图3-13 成绩分析主目录
管理员在该目录下,可以对年级信息进行排名,统计年级前N名的人数,同时能够对科目进行分段分析以及查看各班级的成绩。另外,管理员还能够对每次缺考的学生进行分析查询。
(1)年级排名功能实现
当管理员点击年级排名时,会得到全年级学生成绩排名,如图3-14所示:
图3-14 年级排名
该按钮是管理员用来对整个年级的学生成绩信息进行排名分析,实现此功能主要代码如下图所示:
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Sheets
If w.Name = "年级排名" Then
cz = MsgBox("存在[年级排名]表,是否确定删除后重新开始?", vbYesNo, "是否继续操作")
If cz = vbYes Then Sheets("年级排名").Delete Else: Exit Sub
End If
Next w
Application.DisplayAlerts = True
gs = Sheets.Count + 1
Sheets.Add after:=Sheets(gs - 1)
Sheets(gs).Name = "年级排名"
Sheets("成绩表").Cells.Copy Destination:=Sheets(gs).Range("A1")
Sheets(gs).Range("K1:L1") = Array("总分", "名次")
zccjb = Sheets(gs).Range("B65536").End(xlUp).Row
For i = 2 To zccjb
Sheets(gs).Cells(i, "K") = WorksheetFunction.Sum(Sheets(gs).Range("E" & i & ":I" & i))
Next i
Sheets(gs).Range("A2:K" & zccjb).Sort Key1:=Range("K2"), Order1:=xlDescending
For j = 2 To zccjb
Sheets(gs).Cells(j, "A") = j - 1
If Sheets(gs).Cells(j, "K") = Sheets(gs).Cells(j - 1, "K") Then
Sheets(gs).Cells(j, "L") = Sheets(gs).Cells(j - 1, "L")
Else
Sheets(gs).Cells(j, "L") = j - 1
End If
Next j
Sheets(gs).Range("J1").Copy
Sheets(gs).Range("K1:L1").PasteSpecial Paste:=xlPasteFormats
Sheets(gs).Range("E2").Copy
Sheets(gs).Range("K2:L" & zccjb).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
| Range("B1").Select |
当运行此功能时,会要求管理员输入需要统计的人数,如图3-15。
图3-15 输入人数n
如需要统计20人,就可以输入“20”,通过点击确定按钮即可得到统计结果,如图3-16所示。
图3-16年级前n名
如果需要对年级前N名学生人数进行统计,那么该按钮即可实现,实现其功能的主要代码如下图所示:
Application.DisplayAlerts = False
For i = 1 To Sheets.Count
If Sheets(i).Name = "前N名人数统计" Then
If MsgBox("已存在[前N名人数统计]表,是否要删除?", vbYesNo, "已存在") = vbYes Then
Sheets("前N名人数统计").Delete
Exit For
Else
Exit Sub
End If
End If
Next i
Application.DisplayAlerts = True
For i = 1 To Sheets.Count
If Sheets(i).Name = "年级排名" Then Exit For
Next i
If i > Sheets.Count Then
MsgBox "在未形成年级排名表前无法进行前N名人数统计," & Chr(13) & "请先生成年级排名表!!!", vbYesonly, "注意"
Exit Sub
End If
n = Val(Application.InputBox(prompt:="请输入需要需要统计的人数(n值):", Title:="请输入数字"))
Set sth1 = Sheets("年级排名")
zcnjpm = sth1.Range("B65536").End(xlUp).Row
If n < 1 Or n > sth1.Range("B65536").End(xlUp).Row - 1 Then
MsgBox "输入的[" & n & "]不符合统计范围,无法继续统计!": Exit Sub
End If
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "前N名人数统计"
Worksheets(Sheets.Count).Move after:=sth1
Set sth2 = Sheets("前N名人数统计")
sth2.Cells(1, 1) = "前" & n & "名人数统计情况"
sth2.Range("A2:C2") = Array("班级", "人数", "比例")
sth2.Cells(3, 1) = sth1.Cells(2, "D")
m = 3
For i = 2 To zcnjpm
For j = 3 To m
If sth1.Cells(i, "D") = sth2.Cells(j, "A") Then Exit For
Next j
If j > m Then
m = m + 1
sth2.Cells(m, 1) = sth1.Cells(i, "D")
End If
Next i
For i = 3 To m
sth2.Cells(i, 2) = WorksheetFunction.CountIf(sth1.Range("D2:D" & n + 1), sth2.Cells(i, 1))
sth2.Cells(i, 3) = sth2.Cells(i, 2) / n
Next i
sth2.Cells(m + 1, 1) = "合计"
sth2.Cells(m + 1, 2) = n
sth2.Cells(m + 1, 3) = 1
sth2.Range("A1").Font.Bold = True
sth2.Range("A2:C" & m + 1).Borders.LineStyle = xlContinuous
| sth2.Range("C3:C" & m + 1).Style = "Percent" |
该功能是建立在人数统计功能的基础上实现的,只有在统计完年级前N名学生人数的情况下,才能运用此功能,否则会出现如下问题,如图3-17所示。
图3-17
然而,当我们已经对年级前N名学生人数进行了统计时,便可以使用该功能,最终效果如下图3-18所示:
图3-18 年级前N名图表分析
通过统计前N名学生人数,可以用分析图形象的表示出其结果,实现该分析图的主要代码如下图所示:
For i = 1 To Sheets.Count
If Sheets(i).Name = "前N名人数统计" Then Exit For
Next i
If i > Sheets.Count Then
MsgBox "在未形成前N名人数统计表前无法进行前N名人数分析," & Chr(13) & "请先生前N名人数统计表!!!", vbYesonly, "注意"
Exit Sub
End If
If Sheets("前N名人数统计").ChartObjects.Count > 0 Then
MsgBox "已存在分析图,请删除当前分析图后再试", vbOKOnly, "失败"
Exit Sub
End If
bjcd = Sheets("前N名人数统计").Range("A300").End(xlUp).Row - 1
Charts.Add.ChartType = xl3DPieExploded '插入图饼图
ActiveChart.SetSourceData Source:=Sheets("前N名人数统计").Range("A2:C" & bjcd), PlotBy:=xlColumns '取数
ActiveChart.Location Where:=xlLocationAsObject, Name:="前N名人数统计" '插入的图放置在总分排名表中
ActiveChart.ChartTitle.Characters.Text = "各班人数所占比例分析" '设置图的表头
| ActiveChart.SeriesCollection(1).ApplyDataLabels ShowPercentage:=True '图上增加百分比 |
班级成绩表功能用来生成班级学生成绩信息,当我们运行此按钮时,如下图3-19所示。
图3-19 选择班级
我们选择统计一班的学生成绩,运行结果如下图3-20:
图3-20 班级排名
该功能用来生成班级成绩表,实现其功能的主要代码如下所示:
Set sth1 = Sheets("成绩表")
zccjb = sth1.Range("B65536").End(xlUp).Row
Application.DisplayAlerts = False
For Each w In Sheets
If w.Name = ComboBox1.Value & "成绩" Then
If MsgBox("已存在[" & ComboBox1.Value & "成绩]表,是否要删除?", vbYesNo, "已存在") = vbYes Then
Sheets(ComboBox1.Value & "成绩").Delete
Else
Exit Sub
End If
End If
Next w
Application.DisplayAlerts = True
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = ComboBox1.Value & "成绩"
Set sth2 = Sheets(ComboBox1.Value & "成绩")
sth2.Cells(1, 1) = "班级:" & ComboBox1.Value
sth1.Range("A1:C1").Copy Destination:=sth2.Range("A2")
sth1.Range("E1:J1").Copy Destination:=sth2.Range("D2")
sth2.Range("J2:K2") = Array("总分", "班级名次")
m = 3
For i = 2 To zccjb
If sth1.Cells(i, "D") = ComboBox1.Value Then
sth1.Range("A" & i & ":C" & i).Copy Destination:=sth2.Range("A" & m)
sth1.Range("E" & i & ":J" & i).Copy Destination:=sth2.Range("D" & m)
sth2.Cells(m, "J") = WorksheetFunction.Sum(sth2.Range("D" & m & ":H" & m))
m = m + 1
End If
Next i
sth2.Range("A2:K" & m - 1).Sort Key1:=Range("K2"), Order1:=xlDescending
For j = 3 To m - 1
sth2.Cells(j, "A") = j - 2
If sth2.Cells(j, "J") = sth2.Cells(j - 1, "J") Then
sth2.Cells(j, "K") = sth2.Cells(j - 1, "K")
Else
sth2.Cells(j, "K") = j - 2
End If
Next j
sth2.Range("I2").Copy
sth2.Range("J2:K2").PasteSpecial Paste:=xlPasteFormats
sth2.Range("E3").Copy
sth2.Range("J3:K" & m - 1).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
| sth2.Range("B1").Select |
科目分析的主要功能是统计不同班级不同分数段的学生人数,运行结果如下图3-21。
图3-21 选择科目
当我们选择分析的科目是语文的时候,通过点击确定按钮即可形象地得到分析结果,如下图3-22所示。
图3-22 单科成绩统计
本按钮主要是用来对科目进行分析,实现其功能的主要代码如下:
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Sheets
If w.Name = "科目分段分析" Then
cz = MsgBox("存在[科目分段分析]表,是否确定删除后重新开始?", vbYesNo, "是否继续操作")
If cz = vbYes Then Sheets("科目分段分析").Delete Else: Exit Sub
End If
Next w
Application.DisplayAlerts = True
gs = Sheets.Count + 1
Sheets.Add after:=Sheets(gs - 1)
Sheets(gs).Name = "科目分段分析"
Set sth = Sheets(gs)
sth.Cells(1, 1) = "科目名称:" & ComboBox1.Value
sth.Range("A2:D2") = Array("序号", "班级", "人数", "单科分段情况")
sth.Range("J2") = "三率情况"
sth.Range("M2:N2") = Array("最高分", "最低分")
sth.Range("D3:L3") = Array("130以上", "130-120", "120-100", "100-80", "80-60", "60-0", "及格率(90)", "良好率(112.5)", "优秀率(127.5)")
sth.Range("A2:N3").HorizontalAlignment = xlCenter
sth.Range("A2:A3").MergeCells = True
sth.Range("B2:B3").MergeCells = True
sth.Range("C2:C3").MergeCells = True
sth.Range("D2:I2").MergeCells = True
sth.Range("J2:L2").MergeCells = True
sth.Range("M2:M3").MergeCells = True
sth.Range("N2:N3").MergeCells = True
sth.Range("J3:L3").WrapText = True
sth.Rows("3:3").RowHeight = 40
sth.Columns("K:L").ColumnWidth = 9.38
Dim dkfd(6) As Integer '单科分段
Dim kmCol As String 'F2单元格的科目在成绩表中对应的列号
dkfd(0) = 151
dkfd(1) = 130
dkfd(2) = 120
dkfd(3) = 100
dkfd(4) = 80
dkfd(5) = 60
dkfd(6) = 0
Set sth1 = Sheets("成绩表")
zccjb = sth1.Range("B65536").End(xlUp).Row
For k = 1 To 5
If sth1.Cells(1, k + 4) = ComboBox1.Value Then Exit For
Next k
kmCol = Chr(68 + k) '将字符码转换为字符,chr(69)为"E"
sth.Cells(4, 1) = 1
sth.Cells(4, 2) = sth1.Cells(2, 4)
m = 4
For i = 2 To zccjb
For j = 4 To m
If sth1.Cells(i, 4) = sth.Cells(j, 2) Then Exit For
Next j
If j > m Then
sth.Cells(m + 1, 2) = sth1.Cells(i, 4)
sth.Cells(m + 1, 1) = m - 2
m = m + 1
End If
If sth1.Cells(j, kmCol) <> "" Then
sth.Cells(j, 3) = sth.Cells(j, 3) + 1
For k = 1 To 6
If sth1.Cells(i, kmCol) >= dkfd(k) And sth1.Cells(i, kmCol) < dkfd(k - 1) Then
sth.Cells(j, k + 3) = sth.Cells(j, k + 3) + 1
Exit For
End If
Next k
If sth1.Cells(i, kmCol) >= 90 Then sth.Cells(j, "J") = sth.Cells(j, "J") + 1
If sth1.Cells(i, kmCol) >= 112.5 Then sth.Cells(j, "K") = sth.Cells(j, "K") + 1
If sth1.Cells(i, kmCol) >= 127.5 Then sth.Cells(j, "L") = sth.Cells(j, "L") + 1
If sth1.Cells(i, kmCol) > sth.Cells(j, "M") Then sth.Cells(j, "M") = sth1.Cells(i, kmCol)
If sth1.Cells(i, kmCol) < sth.Cells(j, "N") Or sth.Cells(j, "N") = "" Then sth.Cells(j, "N") = sth1.Cells(i, kmCol)
End If
Next i
sth.Cells(m, "A") = "合计"
sth.Cells(m, "B") = Application.WorksheetFunction.CountA(sth.Range("B4:B" & m - 1))
For i = 3 To 12
sth.Cells(m, i) = Application.WorksheetFunction.Sum(sth.Range(Cells(2, i), Cells(m - 1, i)))
Next i
For i = 4 To m
sth.Cells(i, "J") = sth.Cells(i, "J") / sth.Cells(i, "C")
sth.Cells(i, "K") = sth.Cells(i, "K") / sth.Cells(i, "C")
sth.Cells(i, "L") = sth.Cells(i, "L") / sth.Cells(i, "C")
Next i
sth.Cells(m, "M") = Application.WorksheetFunction.Max(sth.Range("M4:M" & m - 1))
sth.Cells(m, "N") = Application.WorksheetFunction.Min(sth.Range("N4:N" & m - 1))
sth.Range("A2:N" & m).Borders.LineStyle = xlContinuous
| sth.Range("J2:L" & m).NumberFormatLocal = "0.00%" |
同样的道理,该功能也是建立在科目分段分析功能的基础上建立起来的,运行结果如下图3-23。
图3-23 科目分段
同样,也可以用分析图的形式对科目进行分析,实现其功能的主要代码如下:
For i = 1 To Sheets.Count
If Sheets(i).Name = "科目分段分析" Then Exit For
Next i
If i > Sheets.Count Then
MsgBox "在未形成[科目分段分析]表前无法形成科目分段分析图," & Chr(13) & "请先进行科目分段分析!!!", vbYesonly, "注意"
Exit Sub
End If
Set sth = Sheets("科目分段分析")
zckmhd = sth.Range("B1000").End(xlUp).Row - 1
If sth.ChartObjects.Count > 0 Then
MsgBox "已存在分析图,请删除当前分析图后再试", vbOKOnly, "失败"
Exit Sub
End If
Charts.Add.ChartType = xlColumnClustered '插入柱形图表
ActiveChart.SetSourceData Source:=sth.Range("D3:I" & zckmhd), PlotBy:=xlRows '取数
For i = 1 To zckmhd - 3
ActiveChart.SeriesCollection(i).Name = sth.Cells(i + 3, 2) '图例改名,改为1班,2班等等
Next i
ActiveChart.Location Where:=xlLocationAsObject, Name:="科目分段分析"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = Mid(sth.Range("A1"), 6, 50) & "分段情况分析"
| End With |
其运行结果如下图3-24所示:
图3-24 数据错误检查
该功能管理员用来进行数据错误检查,实现其功能的主要代码如下:
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Sheets
If w.Name = "错误检查结果" Then
cz = MsgBox("存在[错误检查结果]表,是否确定删除后重新开始?", vbYesNo, "是否继续操作")
If cz = vbYes Then Sheets("错误检查结果").Delete Else: Exit Sub
End If
Next w
Application.DisplayAlerts = True
gs = Sheets.Count + 1
Sheets.Add after:=Sheets(gs - 1)
Sheets(gs).Name = "错误检查结果"
Set sth = Sheets(gs)
Set sth1 = Sheets("学生花名册")
Set sth2 = Sheets("成绩表")
zchmz = sth1.Range("A65536").End(xlUp).Row
zccjb = sth2.Range("B65536").End(xlUp).Row
sth.Range("A1:B1") = Array("表名", "存在的错误")
m = 2
For i = 2 To zchmz '对学生花名册数据检查
If sth1.Cells(i, 1) = "" Or sth1.Cells(i, 2) = "" Or sth1.Cells(i, 2) = "" Then
sth.Cells(m, 1) = "学生花名册"
sth.Cells(m, 2) = "花名册第" & i & "行学号或姓名或班级为空"
m = m + 1
End If
For j = i + 1 To zchmz '对花名册学号重复检查
If sth1.Cells(i, 1) = sth1.Cells(j, 1) Then
sth.Cells(m, 1) = "学生花名册"
sth.Cells(m, 2) = "花名册第" & i & "行与第" & j & "行学号重复"
m = m + 1
End If
Next j
Next i
For i = 2 To zccjb
If sth2.Cells(i, 2) = "" Or sth2.Cells(i, 3) = "" Or sth2.Cells(i, 4) = "" Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行学号或姓名或班级为空"
m = m + 1
End If
For j = i + 1 To zccjb '对成绩表学号重复检查
If sth2.Cells(i, 3) = sth2.Cells(j, 3) Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行与第" & j & "行学号重复"
m = m + 1
End If
Next j
n = 0
For k = 2 To zchmz
If sth2.Cells(i, 3) = sth1.Cells(k, 1) Then
If sth2.Cells(i, 2) <> sth1.Cells(k, 2) Or sth2.Cells(i, 4) <> sth1.Cells(k, 3) Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行的姓名或班级与学生花名册不一致"
m = m + 1
End If
n = 1
Exit For
End If
Next k
If n = 0 Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行的学号在学生花名册中找不到"
m = m + 1
End If
Next i
| MsgBox "错误检查完毕,请查看结果!", vbOKOnly, "已完成" |
其运行结果如下图3-25所示:
图3-25 缺考人员名单
如果有学生缺考,通过该功能即可轻松实现查询,主要代码如下:
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Sheets
If w.Name = "缺考人员名单" Then
cz = MsgBox("存在[缺考人员名单]表,是否确定删除后重新开始?", vbYesNo, "是否继续操作")
If cz = vbYes Then Sheets("缺考人员名单").Delete Else: Exit Sub
End If
Next w
Application.DisplayAlerts = True
gs = Sheets.Count + 1
Sheets.Add after:=Sheets(gs - 1)
Sheets(gs).Name = "缺考人员名单"
Set sth = Sheets(gs)
Set sth1 = Sheets("学生花名册")
Set sth2 = Sheets("成绩表")
zchmz = sth1.Range("A65536").End(xlUp).Row
zccjb = sth2.Range("B65536").End(xlUp).Row
sth.Range("A1:D1") = Array("学号", "姓名", "班级", "缺少科目")
m = 2
For i = 2 To zccjb
For j = 5 To 9
If sth2.Cells(i, j) = "" Then
sth.Cells(m, 1) = sth2.Cells(i, 3)
sth.Cells(m, 2) = sth2.Cells(i, 2)
sth.Cells(m, 3) = sth2.Cells(i, 4)
sth.Cells(m, 4) = sth2.Cells(1, j)
m = m + 1
End If
Next j
Next i
For i = 2 To zchmz
For j = 2 To zccjb
If sth1.Cells(i, 1) = sth2.Cells(j, 3) Then Exit For
Next j
If j > zccjb Then
sth.Range("A" & m & ":C" & m) = sth1.Range("A" & i & ":C" & i).Value
sth.Cells(m, 4) = "缺考5门"
m = m + 1
End If
Next i
| MsgBox "缺考人员检查完毕,请查看结果!", vbOKOnly, "已完成" |
数据错误检查在系统的开发建设中占据了非常重要的地位,通过数据错误检查功能,我们能够发现在处理数据过程中出现的错误,通过对检查出的错误进行修改,使得数据分析能够更加准确。
具体实现代码如下:
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Sheets
If w.Name = "错误检查结果" Then
cz = MsgBox("存在[错误检查结果]表,是否确定删除后重新开始?", vbYesNo, "是否继续操作")
If cz = vbYes Then Sheets("错误检查结果").Delete Else: Exit Sub
End If
Next w
Application.DisplayAlerts = True
gs = Sheets.Count + 1
Sheets.Add after:=Sheets(gs - 1)
Sheets(gs).Name = "错误检查结果"
Set sth = Sheets(gs)
Set sth1 = Sheets("学生花名册")
Set sth2 = Sheets("成绩表")
zchmz = sth1.Range("A65536").End(xlUp).Row
zccjb = sth2.Range("B65536").End(xlUp).Row
sth.Range("A1:B1") = Array("表名", "存在的错误")
m = 2
For i = 2 To zchmz '对学生花名册数据检查
If sth1.Cells(i, 1) = "" Or sth1.Cells(i, 2) = "" Or sth1.Cells(i, 2) = "" Then
sth.Cells(m, 1) = "学生花名册"
sth.Cells(m, 2) = "花名册第" & i & "行学号或姓名或班级为空"
m = m + 1
End If
For j = i + 1 To zchmz '对花名册学号重复检查
If sth1.Cells(i, 1) = sth1.Cells(j, 1) Then
sth.Cells(m, 1) = "学生花名册"
sth.Cells(m, 2) = "花名册第" & i & "行与第" & j & "行学号重复"
m = m + 1
End If
Next j
Next i
For i = 2 To zccjb
If sth2.Cells(i, 2) = "" Or sth2.Cells(i, 3) = "" Or sth2.Cells(i, 4) = "" Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行学号或姓名或班级为空"
m = m + 1
End If
For j = i + 1 To zccjb '对成绩表学号重复检查
If sth2.Cells(i, 3) = sth2.Cells(j, 3) Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行与第" & j & "行学号重复"
m = m + 1
End If
Next j
n = 0
For k = 2 To zchmz
If sth2.Cells(i, 3) = sth1.Cells(k, 1) Then
If sth2.Cells(i, 2) <> sth1.Cells(k, 2) Or sth2.Cells(i, 4) <> sth1.Cells(k, 3) Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行的姓名或班级与学生花名册不一致"
m = m + 1
End If
n = 1
Exit For
End If
Next k
If n = 0 Then
sth.Cells(m, 1) = "成绩表"
sth.Cells(m, 2) = "成绩表第" & i & "行的学号在学生花名册中找不到"
m = m + 1
End If
Next i
MsgBox "错误检查完毕,请查看结果!", vbOKOnly, "已完成"
| 主界面1.Hide |
第四章 成绩分析系统系统测试
4.1 概述
系统测试是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。
4.2 测试的原则和目标
4.2.1测试的原则
1.程序员应该避免检查自己的程序,系统测试应该由第三方负责;
2.设计测试用例时应考虑到合法输入和不合法的输入以及各种边界条件,特殊情况下不要制造极端状态和意外状态。
3.对策就错误结果进行一个确认过程,一般由A测试出来的错误,一定要由B来确认。严重的错误可以召开评审会议进行讨论和分析,对测试结果要进行严格的确认,是否真的存在这个问题以及严重程度等。
4.要妥善保存测试计划、测试用例、出错统计和最终分析报告、为维护提供方便。
4.2.2测试的目标
1.发现一些可以通过测试避免的开发风险
2.实施测试来降低所发现的风险
3.确定测试何时可以结束
4.3 测试方法
4.3.1 界面测试
界面是软件系统与用户交互的最直接的面,界面的好坏决定用户对软件系统的第一印象,而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能够给用户带来轻松愉悦的感受成就感,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧于放弃中付诸东流。
本系统的界面测试主要包括以下几个方面的内容:
1.界面在窗口中的显示是否正确、美观;
2.界面上的按钮布局是否合理、美观,是否符合用户需求;
3.为实现功能,是否将所需要的元素全部罗列出来了,如单选框、复选框、输入框等。
4.3.2 性能测试
系统性能测试毋庸置疑是软件开发最重要的指标,通过对系统性能的测试,我们可以评估系统的能力,发现系统结构中的不足之处以及验证系统稳定性和可靠性等。
本成绩分析系统测试主要包括以下几个方面的内容:
1.管理员与普通用户登录是否能够按照要求登录到规定的界面以及登录名与密码是否能够验证成功。
2.学生登录主界面后能否准确查询个人成绩信息、个人排名信息。通过点击单科成绩分析,是否能对成绩进行准确的分析。
3.管理员登录主界面后对年级进行排名时是否出现错误排名,在对年级前N名人数进行统计时能否准确统计信息,年级前N名分析图是否合理。另外,在对不同科目分段进行分析时是否会出现误差,分析图是否合理。在对数据错误进行检查时结果是否有误等等。
安全性测试(Security)这个领域正在研究中,不过防火墙,补丁包.杀毒软件等的就不必说了,不过可以考虑破坏性测试时任意。
兼容性 (Compatibility) 不同浏览器,不同应用程序版本在实现功能时的表现,不同的上网方式,如果你测试的是一个公共网站的话。
4.4 系统的优点与不足
本系统采用VBA技术通过灵活运用vb代码进行设计开发,具有成本低、操作简单、高效等优点,另外安装本系统要求的环境配置非常简单,无论用户的电脑安装的是windows XP还是Windows 7 或者更高级的系统都能够轻松使用此系统。然而本系统也有很多不容忽视的缺点,比如系统安全性低,在多用户同时登陆本系统的情况下,会出现访问速度慢的情况。
第五章 系统开发技巧与难点
本系统开发的技术难点是业务逻辑的理解业务逻辑是依据成绩分析系统的特点及特殊的应用领域需要来进行设计的,只有在准确理解一个系统的业务逻辑之后才可能开发出适应其应用的应用系统来,并且在系统之间模块的科学划分与结构组织都是正确的理解实际应用的业务逻辑需求的前提下完成的。
第五章 总结与展望
本次系统的设计与开发是在辅导老师和同学的热心帮助下完成的,经过漫长的努力与奋斗,系统基本上开发完毕,其功能基本符合用户的需求,能够完成学生信息的查询与分析。自我感觉还是比较满意的。
由于本次毕业设计时间短,系统还存在很多不尽如人意的地方,比如主界面不够美观,系统功能有点过于简单,在安全性和出错处理方面做的不是很严谨,等等的这些问题都是需要在今后的学习或工作中值得重视的。
参考文献
[1] 沈洪、施明利、朱军、谭浩强. VB程序设计.2010.第1版.清华大学出版社
[2] JamesFoxall、梅兴文.Visual Basic 2010入门经典.2011.第1版.人民邮电出版社
[3] 江鸿宾、沈洪、施明利.VB程序设计案例汇编. 2010.第1版.清华大学出版社
[4] 罗刚君. Excel VBA程序开发自学宝典.2011.第1版.电子工业出版社
[5] 俞磊. Visual Basic完全自学手册.2009. 第1版.机械工业出版社
[6] 赵志东. Excel VBA基础入门.2011.第2版.人民邮电出版社
[7] 龚沛曾、杨志强、陆慰民. Visual Basic 程序设计教程.2007.第1版.高等教育出版社
[8] 创锐文化. Excel VBA从入门到精通.2011.第1版.中国铁道出版社
[9] 杨本伦. Visual Basic开发技术大全.2010.第1版.清华大学出版社
[10] 魏汪洋. 从零开始学Excel VBA.2011. 第2版.电子工业出版社
致 谢
经过这几个月来的勤奋努力,自己终于完成了毕业设计和毕业论文的整体工作,在这里我要感谢我的设计指导教师,是他在论文的选题及技术方向上给我提出许多宝贵的设计意见,在最后的测试修改阶段又在百忙之中抽出时间为我提供了必要的帮助,这样使得我得以顺利的完成毕业设计开发及毕业论文的整理,老师渊博的知识、敏锐的思路和实事求是的工作作风给我留下了深刻的印象,使得我终身受益,谨此向老师表示衷心的感谢。
感谢老师们在校期间对我的谆谆教诲和无私的帮助,在实际的开发工作中,我深深体会到了基础理论知识的重要性,在大学阶段只有好好学习,掌握好扎实的理论基础,这样才能在将来的工作中更快的学习,从而得心应手,有所成就,真正成为一个对社会和他人有用的人。
最后还要感谢我的同学们在这次毕业设计及论文写作中给我的支持和帮助。下载本文