ExcelVBA课程设计实习报告.pdf
课程设计实习报告四川化工职业技术学院题目成绩管理系统系别信息工程系班级计算机应用技术姓名xXXXXxx 学号 21 起止时间12 月 26 日-1 月 6 日20112012年目录一、实习目的.1二、实习内容.1三、实习过程.1(一)实习准备.1(二)表格和窗体的设计.2(三)代码设计.6四、实习日志.22五、实习体会.24 20112012 学年 Excel VBA 实习报告-1-VBA 是 Ofice 中广泛使用的宏语言,使用宏可以增强 Word、Excel 等办公软件的自动化能力,使用户更高效地完成特定任务。Excel 处理对象多为数据,使用VBA 可以使繁琐和枯燥的工作变得简单易行。本学期的学习使我对VBA 有了深刻的认识,掌握VBA 的一些操作方法,本次的实习使我对VBA 的实际运用又有了进一步的了解。一、实习目的掌握 VBA 程序设计语言的基础知识,并开发一个基于数据库的高效办公应用系统,通过实习能达到利用VBA 编程思想和技巧,实现各种高效自动化办公应用,能建立友好的图形用户界面,能正确地进行数据库服务器和数据库中数据的操作。二、实习内容题目:(项目二)成绩管理系统本项目利用 VBA 实现学生成绩评估的自动化,使学校提高对考生成绩分析的效率,从而提高学校考试系统的自动化。三、实习过程(一)实习准备在任何程序设计时,都需要有缜密的设计思路。本次是“成绩管理系统”,结合学校的实际情况,首先对问题和需求进行分析,其次对项目的功能进行分析。得出项目设计流程图 20112012 学年 Excel VBA 实习报告-2-(二)表格和窗体的设计在开始编写代码前,需要设计好需要的每个工作表的框架,以便调用。首先设计了学生信息表,在第二行中一次输入编号、姓名、性别、班级字段,如图2。设计学生分数表用来录入学生的考试成绩,涉及字段为:编号、姓名、数学、英语、语文、物理、化学、生物、体育、总分;如图 1。设计统计学生整体情况的统计表;如图 3图 1 学生分数信息表学生成绩管理系统信息录入与更新学生考试情况分析学生信息录入学生分数信息录入学生整体考试情况学生个体考试情况学生成绩的打印退出系统 20112012 学年 Excel VBA 实习报告-3-图 2 学生信息表图 3 统计表 20112012 学年 Excel VBA 实习报告-4-本次实习涉及到窗体,我采用先设计窗体再编写代码的方式。添加与更新学生信息窗体,添加与更新学生分数信息窗体,如图所示。图 4 添加与更新学生信息窗体图 5 添加与更新学生分数信息窗体 20112012 学年 Excel VBA 实习报告-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 20112012 学年 Excel VBA 实习报告-6-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 20112012 学年 Excel VBA 实习报告-7-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 所示 20112012 学年 Excel VBA 实习报告-8-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 当需要删除学生信息时,如果没有输入学生的条件编号或者姓名,将弹出提示输入删除条件的对话框;当输入了学生的编号或姓名,将弹出确认删除的信息框。如下图所示:20112012 学年 Excel VBA 实习报告-9-图 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 20112012 学年 Excel VBA 实习报告-10-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 20112012 学年 Excel VBA 实习报告-11-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 20112012 学年 Excel VBA 实习报告-12-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)20112012 学年 Excel VBA 实习报告-13-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 该段代码用来实现通过输入学生的编号或姓名来找到相应的分数信息。效果如图:20112012 学年 Excel VBA 实习报告-14-图 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 End If tempY=tempY+1 Wend If(tempflag)Then MsgBox 没有找到该学生,vbOKOnly,查找失败!End If End Function 该段代码通过分数信息来找到相应的学生。单击“确定”按钮后将弹出确认对话框询问是否要查找该生,单击“取消”将查询下一条符合筛选规则的记录,单击“确定”按钮将选中有该姓名的记录,如果没有需要的信息将显示查找失败的内容。如图所示:20112012 学年 Excel VBA 实习报告-16-图 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 20112012 学年 Excel VBA 实习报告-17-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)20112012 学年 Excel VBA 实习报告-18-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)20112012 学年 Excel VBA 实习报告-19-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 20112012 学年 Excel VBA 实习报告-20-此段代码实现在学生信息表中循环查找记录和循环查找分数记录。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 统计表生成数据 20112012 学年 Excel VBA 实习报告-21-为了引导使用者快速了解本项目的各种功能,为此项目添加了一个主界面。如图所示:图 14 主界面设计四、实习日志2011年 12 月 26 日星期一今天是实习的第一天,根据个人能力和实习安排的时间我选择做“成绩管理系统”,本项目利用 VBA 来实现学生成绩评估的自动化。在设计本项目之前,我首先进行了问题和需求的分析。结合学校的情况,围绕如何分析考生的情况和如何统计总体考试情况,得出我的项目至少应具备提供单个考生信息和按教师需要的指标来分析整体的水平这两个功能。但在设计代码前还要将系统的各个步骤进行细化。项目在具有所需的功能的同时,作为一个系统应该是完整的体系,这就要加入其他的辅助功能来保证项目的完整。因此在我的项目中应该考虑到存放学生信息和分数信息,要有分数录入和更改的功能,要有学生信息录入和更改的功能,要能够提供查找功能让老师可以迅速分析整体或个体进行分析,提供个性化的评估,能够对全班和整个年级进行评估。2011年 12 月 27 星期二在昨天做好的分析基础上开始设计我的项目,但在编写代码之前,我首先要设计好 20112012 学年 Excel VBA 实习报告-22-将要涉及到得每个工作表的框架。以便在我编写代码时可以方便的调用这些信息。首先做了一个“生信息表”和生分数表”如图 15;学生分数表中我只放入了需要的字段。接下来新建名为“统计表”的工作表用来分析整体考试情况。图 15 学生分数表2011年 12 月 28 日星期三有了前两天对本项目的认真构思和表格的设计,今天的实习内容安排为开始编写相应的代码。此次项目的内容涉及到窗体,因此我采用先设计窗体再添加相应的功能代码的方法进行本次项目的开展。根据项目的需要设计不同的窗体和不同的代码。在窗体设计时本着规范美观实用的原则进行设计。代码的设计对于我说是一个难题,因此在设计代码时多多参考书上的知识,对于不理解的地方多和同学老师交流,尽量使自己编写的代码正确完整,同时使自己加深对代码的理解。2011年 12 月 29 日星期四窗体的设计基本完成,今天主要工作是继续编写相关代码,在编写代码时我采用边写代码边调试的方式进行,以便有错误能及时修改。写代码是本次实习比较一个繁琐环节,也是考验耐心的环节。在编写代码时要做到细心因为一个字母的漏写或多写都会导致项目不能正常运行,在调试时出错是不可避免的,这就需要我静下心来仔细检查找出并修改错误的地方。尽管如此,代码作为本次项目的不可缺少的核心内容,我还是尽心尽力的做好每一步相应的工作。2011年 12 月 30 日星期五繁琐的代码终于写完了,同时也宣告我的项目即将完成。今天主要工作就是运行测试我的项目,发现问题就马上停下来进行修改调整。通过几次的调试修正,我的代码也趋于完善。一个完整的程序还需要主界面来引导使用者快速了解项目的功能,做好我的主界面内容,我的“成绩管理系统”就宣告完工啦。看着自己做的系统流畅的运行,还 20112012 学年 Excel VBA 实习报告-23-是有点小小的成就感。只要认真学习,勤于思考,加上多多动手就能克服难关,按时完成任务。五、实习体会本次实习使我深刻体会到VBA 的强大功能,VBA 相比其他语言更加简单实用,利用 VBA 可以更轻松地实现重复的工作办公自动化,以Excel 为平台,自定义Excel 工具栏、菜单和界面,对数据进行复杂的操作和分析。大大减少在Excel 中进行操作所需的工作量,高效率的完成特定的任务。这就需要掌握所学的VBA 语言的相关知识,这个过程中我明白了做事要有持之以恒的品质精神和吃苦耐劳的品质,同时遇到问题要虚心向同学学习认真听取老师的意见,来使自己更深刻理解VBA,更好的掌握 VBA 的相关知识。此次的实习不仅培养了我实际分析问题的能力,而且也提高了编程和动手的能力。使我掌握了程序设计的基本技能,提高了我的实际运用VBA 的能力。2012 年 1 月 5 日实习学生:xxx 指导老师:xxx