Excel VBA课程设计实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计实习报告四川化工职业技术学院
题目成绩管理系统
系别信息工程系
班级计算机应用技术
姓名xXXXXxx
学号 21
起止时间12月26日------1月6日
2011—2012年
目录
一、实习目的 (1)
二、实习内容 (1)
三、实习过程 (1)
(一)实习准备 (1)
(二)表格和窗体的设计 (2)
(三)代码设计 (6)
四、实习日志 (22)
五、实习体会 (24)
VBA是Ofice中广泛使用的宏语言,使用宏可以增强Word、Excel等办公软件的自动化能力,使用户更高效地完成特定任务。

Excel处理对象多为数据,使用VBA可以使繁琐和枯燥的工作变得简单易行。

本学期的学习使我对VBA有了深刻的认识,掌握VBA的一些操作方法,本次的实习使我对VBA的实际运用又有了进一步的了解。

一、实习目的
掌握VBA程序设计语言的基础知识,并开发一个基于数据库的高效办公应用系统,通过实习能达到利用VBA编程思想和技巧,实现各种高效自动化办公应用,能建立友好的图形用户界面,能正确地进行数据库服务器和数据库中数据的操作。

二、实习内容
题目:(项目二)成绩管理系统
本项目利用VBA实现学生成绩评估的自动化,使学校提高对考生成绩分析的效率,从而提高学校考试系统的自动化。

三、实习过程
(一)实习准备
在任何程序设计时,都需要有缜密的设计思路。

本次是“成绩管理系统”,结合学校的实际情况,首先对问题和需求进行分析,其次对项目的功能进行分析。

得出项目设计流程图
(二)表格和窗体的设计
在开始编写代码前,需要设计好需要的每个工作表的框架,以便调用。

首先设计了学生信息表,在第二行中一次输入编号、姓名、性别、班级字段,如图2。

设计学生分数表用来录入学生的考试成绩,涉及字段为:编号、姓名、数学、英语、语文、物理、化学、生物、体育、总分;如图1。

设计统计学生整体情况的统计表;如图3
图 1 学生分数信息表
图 2 学生信息表
图 3 统计表
本次实习涉及到窗体,我采用先设计窗体再编写代码的方式。

添加与更新学生信息窗体,添加与更新学生分数信息窗体,如图所示。

图 4 添加与更新学生信息窗体
图 5 添加与更新学生分数信息窗体
图 6 分数查询(普通查找与高级查找)窗体
(三)代码设计
相关窗体设计完成后,接下来就是编写相关的功能代码,有了代码窗体的功能才能充分体现。

首先是添加与更新学生信息窗体的“确定”按钮编写相应代码,主要代码如下:Private Sub CommandButton1_Click()
Dim tempY As Integer
Dim SetFlag As Boolean
SetFlag = True
tempY = 3
If (Trim(TextBox1.Text) = "") Or (Trim(TextBox2.Text) = "") Then
MsgBox "请输入编号和姓名,确保一致", vbOKOnly, "警告!"
End
End If
While (Not IsEmpty(Sheets("学生信息表").Cells(tempY, 1).Value))
If (Trim(TextBox1.Text = Sheets("学生信息表").Cells(tempY, 1).Value)) Then
Sheets("学生信息表").Cells(tempY, 1).Value = TextBox1.Text
Sheets("学生信息表").Cells(tempY, 2).Value = TextBox2.Text
If (Trim(ComboBox1.Text <> "")) Then
Sheets("学生信息表").Cells(tempY, 3).Value = ComboBox1.Text
End If
If (Trim(TextBox4.Text <> "")) Then
Sheets("学生信息表").Cells(tempY, 4).Value = TextBox4.Text
End If
SetFlag = False
GoTo renew
End If
tempY = tempY + 1
Wend
While (Not IsEmpty(Sheets("学生信息表").Cells(tempY, 1).Value))
If (Trim(TextBox1.Text = Sheets("学生信息表").Cells(tempY, 1).Value)) Then SetFlag = False
GoTo renew
End If
tempY = tempY + 1
Wend
renew:
If (SetFlag) Then
If (vbOK = MsgBox("没有找到该学生信息,是否新加入条目", vbOKCancel, "提示")) Then
Sheets("学生信息表").Cells(tempY, 1).Value = TextBox1.Text
Sheets("学生信息表").Cells(tempY, 2).Value = TextBox2.Text
If (Trim(ComboBox1.Text <> "")) Then
Sheets("学生信息表").Cells(tempY, 3).Value = ComboBox1.Text
End If
If (Trim(TextBox4.Text <> "")) Then
Sheets("学生信息表").Cells(tempY , 4).Value = TextBox4.Text End If End If End If End Sub
窗体的效果如下图所示:
图 7
当查找到学生信息需要删除时,点击删除按钮。

相应代码为: Private Sub CommandButton4_Click() Dim tempY As Integer tempY = 3 '按照编号搜索记录
If (Trim(TextBox5.Text) <> "") Then
While (Not IsEmpty(Sheets("学生信息表").Cells(tempY , 1).Value)) If (TextBox5.Text = Sheets("学生信息表").Cells(tempY , 1).Value) Then Sheets("学生信息表").Select
Sheets("学生信息表").Range("A" & CStr(tempY) & ":D" & CStr(tempY)).Select Dim shanchu As Integer
shanchu = MsgBox("确定删除学生信息?", vbYesNo, "提示:") If shanchu = 6 Then
输入学生信息后,单机“确定”按钮后,如果找到相应的学生信息将会更新学生信息,如果没有相关学生信息,将弹出是否添加学生信息的对话框。

如 图 7所示
Sheets("学生信息表").Range("A" & CStr(tempY) & ":D" & CStr(tempY)).Delete Shift:=xlUp
MsgBox "删除学生信息成功!", vbOKOnly, "提示:"
End If
End If
tempY = tempY + 1
Wend
ElseIf (Trim(TextBox6.Text) <> "") Then
While (Not IsEmpty(Sheets("学生信息表").Cells(tempY, 1).Value))
If (TextBox6.Text = Sheets("学生信息表").Cells(tempY, 2).Value) Then
Sheets("学生信息表").Select
Sheets("学生信息表").Range("A" & CStr(tempY) & ":D" & CStr(tempY)).Select
shanchu = MsgBox("确定删除学生信息?", vbYesNo, "提示:")
If shanchu = 6 Then
Sheets("学生信息表").Range("A" & CStr(tempY) & ":D" & CStr(tempY)).Delete Shift:=xlUp
MsgBox "删除学生信息成功!", vbOKOnly, "提示:"
End If
End If
tempY = tempY + 1
Wend
Else
MsgBox "请选择要删除的学生编号或姓名!", vbOKOnly, "提示:"
End If
End Sub
当需要删除学生信息时,如果没有输入学生的条件编号或者姓名,将弹出提示输入删除条件的对话框;当输入了学生的编号或姓名,将弹出确认删除的信息框。

如下图所示:
图8 删除学生信息
添加与更新学生分数的窗体代码:
Private Sub CommandButton1_Click()
Dim tempY As Integer
Dim SetFlag As Boolean
SetFlag = True
tempY = 3
If (Trim(TextBox1.Text) = "") Or (Trim(TextBox2.Text) = "") Then
MsgBox "请输入编号和姓名,确保一致", vbOKOnly, "警告!"
End
End If
While (Not IsEmpty(Sheets("学生分数表").Cells(tempY, 1).Value))
If (Trim(TextBox1.Text = Sheets("学生分数表").Cells(tempY, 1).Value)) Then
Sheets("学生分数表").Cells(tempY, 1).Value = TextBox1.Text
Sheets("学生分数表").Cells(tempY, 2).Value = TextBox2.Text
If (Trim(TextBox3.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 3).Value = TextBox3.Text
End If
If (Trim(TextBox4.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 4).Value = TextBox4.Text
End If
If (Trim(TextBox5.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 5).Value = TextBox5.Text
End If
If (Trim(TextBox6.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 6).Value = TextBox6.Text
End If
If (Trim(TextBox7.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 7).Value = TextBox7.Text
End If
If (Trim(TextBox8.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 8).Value = TextBox8.Text
End If
If (Trim(TextBox9.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 9).Value = TextBox9.Text
End If
SetFlag = False
GoTo renew
End If
tempY = tempY + 1
Wend
While (Not IsEmpty(Sheets("学生分数表").Cells(tempY, 1).Value))
If (Trim(TextBox1.Text = Sheets("学生分数表").Cells(tempY, 1).Value)) Then
SetFlag = False
GoTo renew
End If
tempY = tempY + 1
Wend
renew:
If (SetFlag) Then
If (vbOK = MsgBox("没有找到该学生信息,是否新加入条目", vbOKCancel, "提示")) Then
Sheets("学生分数表").Cells(tempY, 1).Value = TextBox1.Text
Sheets("学生分数表").Cells(tempY, 2).Value = TextBox2.Text
If (Trim(TextBox3.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 3).Value = TextBox3.Text
End If
If (Trim(TextBox4.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 4).Value = TextBox4.Text
End If
If (Trim(TextBox5.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 5).Value = TextBox5.Text
End If
If (Trim(TextBox6.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 6).Value = TextBox6.Text
End If
If (Trim(TextBox7.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 7).Value = TextBox7.Text
End If
If (Trim(TextBox8.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 8).Value = TextBox8.Text
End If
If (Trim(TextBox9.Text <> "")) Then
Sheets("学生分数表").Cells(tempY, 9).Value = TextBox9.Text
End If
End If
End If
qinkon
End Sub
当添加学生分数时将检查是否已有该生的分数记录,如果有该学生的记录将进行更新,如果没有相关信息将提示是否添加新的记录。

单击“确定”按钮后,界面输入的内容将自动清空,方便添加下一条记录。

图9 添加与更新学生分数信息框
为了方便快速的找到所要学生的分数信息,本项目提供了查找功能,可以通过输入学生编号或姓名查询该生的分数信息,也可以根据分数信息查询相关的学生信息。

主要代码如下:
Private Sub CommandButton1_Click()
Dim tempY As Integer
tempY = 3
If (Trim(TextBox1.Text) <> "") Then
While (Not IsEmpty(Sheets("学生分数表").Cells(tempY, 1).Value))
If (TextBox1.Text = Sheets("学生分数表").Cells(tempY, 1).Value) Then
Sheets("学生分数表").Select
Sheets("学生分数表").Range("A" & CStr(tempY) & ":J" & CStr(tempY)).Select
End If
tempY = tempY + 1
Wend
'按姓名搜所
ElseIf (Trim(TextBox2.Text) <> "") Then
While (Not IsEmpty(Sheets("学生分数表").Cells(tempY, 1).Value))
If (TextBox2.Text = Sheets("学生分数表").Cells(tempY, 2).Value) Then
Sheets("学生分数表").Select
Sheets("学生分数表").Range("A" & CStr(tempY) & ":J" & CStr(tempY)).Select
End If
tempY = tempY + 1
Wend
Else
'mei you xin xi shu ru
MsgBox "请输入查询条件", vbOKOnly, "提示:"
End If
End Sub
该段代码用来实现通过输入学生的编号或姓名来找到相应的分数信息。

效果如图:
图10 通过编号或姓名的方式查找相应信息
高级查找代码:
Public Function searchvalue(ByVal colvalue As Integer, ByVal numbervalue As Integer, ByVal limitnum As Integer)
Dim tempY As Integer
Dim tempflag As Boolean
tempflag = True
tempY = 3
Sheets("学生分数表").Select
'进入逐行循环
While (Not IsEmpty(Sheets("学生分数表").Cells(tempY, 1).Value))
If (numbervalue = 1) Then
If (Sheets("学生分数表").Cells(tempY, 1).Offset(0, (colvalue + 1)).Value < limitnum) Then
If (vbOK = MsgBox("是" & Sheets("学生分数表").Cells(tempY, 2).Value & "吗?", vbOKCancel, "确认")) Then
Sheets("学生分数表").Range("A" & CStr(tempY) & ":J" & CStr(tempY)).Select
End
End If
End If
ElseIf (numbervalue = 2) Then
If (Sheets("学生分数表").Cells(tempY, 1).Offset(0, (colvalue + 1)).Value = limitnum) Then If (vbOK = MsgBox("是" & Sheets("学生分数表").Cells(tempY, 2).Value & "吗?", vbOKCancel, "确认")) Then
Sheets("学生分数表").Range("A" & CStr(tempY) & ":J" & CStr(tempY)).Select
End
End If
End If
ElseIf (numbervalue = 3) Then
If (Sheets("学生分数表").Cells(tempY, 1).Offset(0, (colvalue + 1)).Value > limitnum) Then If (vbOK = MsgBox("是" & Sheets("学生分数表").Cells(tempY, 2).Value & "吗?", vbOKCancel, "确认")) Then
Sheets("学生分数表").Range("A" & CStr(tempY) & ":J" & CStr(tempY)).Select
End
End If
End If
End If
tempY = tempY + 1
Wend
If (tempflag) Then
MsgBox "没有找到该学生", vbOKOnly, "查找失败!"
End If
End Function
该段代码通过分数信息来找到相应的学生。

单击“确定”按钮后将弹出确认对话框询问是否要查找该生,单击“取消”将查询下一条符合筛选规则的记录,单击“确定”按钮将选中有该姓名的记录,如果没有需要的信息将显示查找失败的内容。

如图所示:
图11 高级查询
接下来就是分数单的相关代码。

分数单是用来发给学生成绩信息的,就要求有完整的信息内容。

需要在相应的分数上有相应的科目标题。

主要代码如下:Private Sub CommandButton1_Click()
Dim tempX As Integer
Dim tempY As Integer
Dim tempZ As Integer
tempZ = 3
tempY = 4
While (Not IsEmpty(Sheets("学生分数表").Cells(tempZ, 1).Value))
tempX = 1
While (Not IsEmpty(Sheets("学生分数表").Cells(2, tempX).Value))
Sheets("分数单").Cells(tempY, tempX).Value = Sheets("学生分数表").Cells(2, tempX).Value
Sheets("分数单").Cells(tempY + 1, tempX).Value = Sheets("学生分数表
").Cells(tempZ, tempX).Value
tempX = tempX + 1
Wend
tempY = tempY + 2
tempZ = tempZ + 1
Wend
End Sub
本段代码实现在“分数单”表中生成分数单。

当单击“生成分数单”按钮后将生成一个学生成绩的分数单。

如图所示:
图12 生成分数单
使用统计表对学生考试情况的整体分析,主要代码设计:
While (Not IsEmpty(Sheets("学生信息表").Cells(L, 1).Value))
If (("一班" = Sheets("学生信息表").Cells(L, 4).Value)) Then
bji1 = bji1 + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
bji1fs = bji1fs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
ElseIf (("二班" = Sheets("学生信息表").Cells(L, 4).Value)) Then
bji2 = bji2 + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
bji2fs = bji2fs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
ElseIf (("三班" = Sheets("学生信息表").Cells(L, 4).Value)) Then
bji3 = bji3 + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
bji3fs = bji3fs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
ElseIf (("四班" = Sheets("学生信息表").Cells(L, 4).Value)) Then
bji4 = bji4 + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
bji4fs = bji4fs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
End If
If (("男" = Sheets("学生信息表").Cells(L, 3).Value)) Then
nan = nan + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
nanfs = nanfs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
ElseIf (("女" = Sheets("学生信息表").Cells(L, 3).Value)) Then
nv = nv + 1
H = 3
While (Not IsEmpty(Sheets("学生分数表").Cells(H, 1).Value))
If (Sheets("学生信息表").Cells(L, 1).Value = Sheets("学生分数表").Cells(H, 1).Value) Then
nvfs = nvfs + CInt(Sheets("学生分数表").Cells(H, 10).Value)
End If
H = H + 1
Wend
End If
L = L + 1
Wend
此段代码实现在学生信息表中循环查找记录和循环查找分数记录。

Sheets("统计表").Cells(7, 7).Value = bji1
Sheets("统计表").Cells(8, 7).Value = bji2
Sheets("统计表").Cells(9, 7).Value = bji3
Sheets("统计表").Cells(10, 7).Value = bji4
Sheets("统计表").Cells(12, 7).Value = bji1 + bji2 + bji3 + bji4
Sheets("统计表").Cells(14, 7).Value = nan
Sheets("统计表").Cells(15, 7).Value = nv
Sheets("统计表").Cells(7, 8).Value = bji1fs / bji1
Sheets("统计表").Cells(8, 8).Value = bji2fs / bji2
Sheets("统计表").Cells(9, 8).Value = bji3fs / bji3
Sheets("统计表").Cells(10, 8).Value = bji4fs / bji4
Sheets("统计表").Cells(12, 8).Value = (bji1fs + bji2fs + bji3fs + bji4fs) / (bji1 + bji2 + bji3 + bji4)
Sheets("统计表").Cells(14, 8).Value = nanfs / nan
Sheets("统计表").Cells(15, 8).Value = nvfs / nv
此段代码实现将找到的记录自动写入统计表中对应的项目中。

图13 统计表生成数据
为了引导使用者快速了解本项目的各种功能,为此项目添加了一个主界面。

如图所示:
图14 主界面设计
四、实习日志
2011年12月26日星期一
今天是实习的第一天,根据个人能力和实习安排的时间我选择做“成绩管理系统”,本项目利用VBA来实现学生成绩评估的自动化。

在设计本项目之前,我首先进行了问题和需求的分析。

结合学校的情况,围绕如何分析考生的情况和如何统计总体考试情况,得出我的项目至少应具备提供单个考生信息和按教师需要的指标来分析整体的水平这两个功能。

但在设计代码前还要将系统的各个步骤进行细化。

项目在具有所需的功能的同时,作为一个系统应该是完整的体系,这就要加入其他的辅助功能来保证项目的完整。

因此在我的项目中应该考虑到存放学生信息和分数信息,要有分数录入和更改的功能,要有学生信息录入和更改的功能,要能够提供查找功能让老师可以迅速分析整体或个体进行分析,提供个性化的评估,能够对全班和整个年级进行评估。

2011年12月27 星期二
在昨天做好的分析基础上开始设计我的项目,但在编写代码之前,我首先要设计好
将要涉及到得每个工作表的框架。

以便在我编写代码时可以方便的调用这些信息。

首先做了一个“生信息表”和生分数表”如图15;学生分数表中我只放入了需要的字段。

接下来新建名为“统计表”的工作表用来分析整体考试情况。

图15 学生分数表
2011年12月28日星期三
有了前两天对本项目的认真构思和表格的设计,今天的实习内容安排为开始编写相应的代码。

此次项目的内容涉及到窗体,因此我采用先设计窗体再添加相应的功能代码的方法进行本次项目的开展。

根据项目的需要设计不同的窗体和不同的代码。

在窗体设计时本着规范美观实用的原则进行设计。

代码的设计对于我说是一个难题,因此在设计代码时多多参考书上的知识,对于不理解的地方多和同学老师交流,尽量使自己编写的代码正确完整,同时使自己加深对代码的理解。

2011年12月29日星期四
窗体的设计基本完成,今天主要工作是继续编写相关代码,在编写代码时我采用边写代码边调试的方式进行,以便有错误能及时修改。

写代码是本次实习比较一个繁琐环节,也是考验耐心的环节。

在编写代码时要做到细心因为一个字母的漏写或多写都会导致项目不能正常运行,在调试时出错是不可避免的,这就需要我静下心来仔细检查找出并修改错误的地方。

尽管如此,代码作为本次项目的不可缺少的核心内容,我还是尽心尽力的做好每一步相应的工作。

2011年12月30日星期五
繁琐的代码终于写完了,同时也宣告我的项目即将完成。

今天主要工作就是运行测试我的项目,发现问题就马上停下来进行修改调整。

通过几次的调试修正,我的代码也趋于完善。

一个完整的程序还需要主界面来引导使用者快速了解项目的功能,做好我的主界面内容,我的“成绩管理系统”就宣告完工啦。

看着自己做的系统流畅的运行,还
是有点小小的成就感。

只要认真学习,勤于思考,加上多多动手就能克服难关,按时完成任务。

五、实习体会
本次实习使我深刻体会到VBA的强大功能,VBA相比其他语言更加简单实用,利用VBA可以更轻松地实现重复的工作办公自动化,以Excel为平台,自定义Excel工具栏、菜单和界面,对数据进行复杂的操作和分析。

大大减少在Excel中进行操作所需的工作量,高效率的完成特定的任务。

这就需要掌握所学的VBA语言的相关知识,这个过程中我明白了做事要有持之以恒的品质精神和吃苦耐劳的品质,同时遇到问题要虚心向同学学习认真听取老师的意见,来使自己更深刻理解VBA,更好的掌握VBA的相关知识。

此次的实习不仅培养了我实际分析问题的能力,而且也提高了编程和动手的能力。

使我掌握了程序设计的基本技能,提高了我的实际运用VBA的能力。

2012年1月5日
实习学生:xxx
指导老师:xxx。

相关文档
最新文档