打印等Excel的功能。
基础资料:设置教师姓名、学期名称、班级名称和课程名称等基础资料。
学期初始化:每学期使用之前,使用该模块设置当前学期名称,以及设计本学期各班级授课教师等内容。
学生:本模块主要管理学生名单,包括分发空表、导入学生资料,以及手工输入学生资料等功能。
成绩:本模块包括分发学生空表、导入学生成绩和手工输入成绩等功能,实现对成绩的录入输出。
查询:可以按学生学号或姓名查询成绩,也可以按班级名称查看班级成绩表。 模块功能如图1—2所示,
设计工作表格学生成绩管理系统设计菜单设计窗体基础资料使用列表框控件学期初始化使用多列列表框使用Exit For使用文件系统处理学生名单使用动态数组使用文件系统处理学生成绩判断工作表存在用VBA删除单元格成绩查询用VBA粘贴数据
图1—2 系统模块图
1.2 关键技术
基于Excel VBA的编程语言特点,对于该系统的设计主要运用了文件对象集合和动态数组的操作两方面的内容,下面对这两个关键技术做具体说明。 1.2.1 文件对象集合
在处理文件时,VBA使用File System Object (FSO) 对象模型,该模型提供了一个基于对象的工具来处理文件夹和文件。FSO对象模型使应用程序能够创建、改变、移动和删除文件夹,或者检测是否存在指定的文件夹。FSO对象文件模型也能获取关于文件夹的信息,诸如名称、创建日期或最近修改日期等。常用的FSO对象有下面几种:
3
(1)FSO对象模型,File System Object对象提供对计算机文件系统的访问。用FSO对象模型
编程首先需要使用Create Object方法创建一个File System Object对象。语法格式如下:
Set fso=Create Object(“Scripting.” File System Object)
(2)Folder对象,Folder对象提供对一个文件夹所有属性的访问。使用File System Object对象的Get Folder方法将返回一个和指定路径中文件夹相对应的Folder对象。 (3)File对象,File对象提供对文件所有属性的访问。 1.2.2 动态数组
所谓动态数组,是指数组的元素个数在程序运行过程中可随时改变。在VBA中使用动态数组需要两个步骤。
步骤1:在过程级声明一个没有维数下标(带空圆括号)的数组。
步骤2:在能确定数组维数下标时,使用ReDim语句定义数组的维数下标。具体语法格式如下: ReDim [Preserve] varname(subscripts)[As type] [,varname(subscripts)[As type]]? 其中:Preserve为可选参数,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
Varname是必需的,指定变量的名称,它应该是前面已经定义过的数组。
2 设计菜单
在Excel中,通过菜单驱动方式来调用各模块,只需要定义菜单名及选择该菜单时将调用的宏代码即可。
2.1 设计菜单结构
执行该系统的程序后,将隐藏Excel原有菜单,只显示自定义设计的菜单。菜单结构图如2—1所示。
图2—1 自定义菜单结构图
每一个菜单都有对应的下拉菜单,通过对下拉菜单的操作实现所需要的功能,其中基础资料和查询下拉菜单结构分别如图2—2,2—3所示。
图2—2 基础资料菜单结构图
4
图2—3 查询菜单结构图
2.2 设计菜单代码
各管理菜单都需要通过相应的代码才能实现其操作,下面将具体对自定义菜单的代码实现进行说明。 2.2.1定义菜单
Excel的VBA环境中没有提供菜单设计器,因此,只有通过输入代码的方式来定义菜单。定义图2—1所示菜单的部分代码如下:
Sub MyBar_Menu() '建立自定义菜单 Dim MyBar As CommandBar On Error Resume Next
Application.CommandBars(\成绩管理\’删除自定义菜单“成绩管理” Set MyBar = CommandBars.Add(Name:=\成绩管理\
MenuBar:=True, temporary:=True, Position:=msoBarTop) '建立\系统\菜单,提供系统打印、保存等功能的自定义菜单
Set MyBar1 = MyBar.Controls.Add(Type:=msoControlPopup) ’建立一个下拉菜单 MyBar1.Caption = \系统(&S) \’设置菜单标题为“系统” Set MyBar11 = MyBar1.Controls.Add(Type:=msoControlButton) With MyBar11
.Caption = \保存(&S)\’设置菜单项的标题为“保存” .Style = msoButtonIconAndCaption
.FaceId = \’设置菜单项的图标 .OnAction = \’设置单击该菜单时调用的子过程 End With 程序说明:
各菜单项的定义代码类似,可采用复制再进行修改的方法来快速录入。程序首先使用语句Application.CommandBars(“成绩管理”).Delete删除名称为“成绩管理”的自定义菜单。程序中通过名称MyBar,MyBar1,MyBar11来判断菜单的结构,其中MyBar为主菜单条,MyBar1为每主菜单条中的菜单项,MyBar11为下拉菜单中的菜单项。创建MyBar菜单条后,通过执行MyBar 对象Controls集合的Add方法可为其添加菜单项,通过指定菜单项的类型为msoControlPopup,定义该菜单为下拉菜单。运用相同原理创建MyBar1的下拉菜单。无论是添加菜单项,还是下拉菜单项,都是调用对象的Add方法。 2.2.2 删除自定义菜单
当系统执行结束时,应当将Excel恢复到最初的状态,需要将自定义菜单删除,并显示Excel的默认菜单。删除自定义菜单的子过程如下:
Sub MyBarDelete() '删除自定义菜单 On Error Resume Next ’设置错误处理 Application.CommandBars(\成绩管理\’删除自定义菜单 Application.DisplayFormulaBar = True ’显示编辑栏 On Error GoTo 0 ’取消错误处理
Application.CommandBars(\’显示标准工具栏
5
Application.CommandBars(\’显示格式工具栏
Application.CommandBars(\’显示系统默认菜单 End Sub 2.2.3 设计菜单调用的子过程
用户单击选择菜单项时,将调用对应的子过程来完成相应的功能,具体步骤有:
步骤a:系统菜单主要调用Excel提供的功能,如保存、打印预览、打印等。其代码如下: Sub SaveSys()
ActiveWorkbook.save ’调用系统的保存方法保存工作簿 End Sub
Sub ExitSys()
ActiveWorkbook.save
Application.Quit ’退出Excel End Sub
Sub 打印预览()
ActiveWindow.SelectedSheets.PrintPreview '打印预览 End Sub Sub 打印()
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ’打印此工作表 End Sub
步骤b:除系统菜单外,其他菜单需要编写子过程来完成相应的功能,其中部分子过程只需要将对应的窗体显示出来即可。下面是部分子过程的代码,其他子过程将在后面逐步完善。 Sub 设置当前学期()
frmDqxq.Show ’显示当前学期窗体 End Sub
Sub 课程安排()
frmBjkc.Show ’显示课程安排窗体 End Sub
Sub 设置教师姓名()
frmJsxm.Show ’显示教师信息窗体 End Sub
Sub 设置学期() frmXq.Show End Sub
Sub 设置班级名称() frmNjmc.Show End Sub
Sub 设置课程名称() frmKcmc.Show End Sub
Sub 输入学生资料() '手工方式输入学生资料 Sheets(\学生总表\ Sheets(\学生总表\End Sub
Sub 输入成绩() '手工方式输入成绩
frmCjb.Show '显示一个窗体,让用户选择班级
6
End Sub
Sub 生成班级成绩表()
frmBjcj.Show ’显示班级成绩表窗体 End Sub
2.3 工作簿事件
当打开工作簿时,需对其进行初始化操作(包括隐藏工具栏,显示自定义菜单等),完成这些功能的代码应放置在工作簿的Open事件中。当工作簿关闭时,在BeforeClose事件中编写代码实现恢复Excel的操作,可分为下面几步完成:
(1) 通过工作簿的Open事件完成调用自定义菜单、隐藏工具栏等设置。其部分代码如下:
Private Sub Workbook_Open()
Application.ScreenUpdating = False ’关闭屏幕更新
Application.Cursor = xlDefault ’设置光标为默认图标 Application.Caption = \学生成绩管理系统\ ActiveWindow.Caption = \
Application.CommandBars(\屏蔽右键工具栏 Application.CommandBars(\ Application.CommandBars(\ Application.DisplayFormulaBar = False Application.DisplayStatusBar = True
ActiveWindow.DisplayWorkbookTabs = False '隐藏工作表标签 HideBar MyBar_Menu
Sheets(\主界面\’设置主界面的滚动区域 Sheets(\主界面\
Application.ScreenUpdating = True End Sub
(2) 在运行完本段程序后,应恢复Excel的初始设置。可在BeforeClose事件中编写如下代
码完成这些功能:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Caption = \’设置应用程序的标题为初始值 MyBarDelete ShowBar
Application.CommandBars(\ Me.save ’保存工作簿 End Sub
(3) 在上面的两段事件过程中,调用了HideBar和ShowBar两个子过程,需运用到下列的代
码: Sub HideBar()
Application.CommandBars(1).Enabled = False ’禁止工具栏 Application.CommandBars(3).Visible = False ’隐藏工具栏 Application.CommandBars(4).Visible = False
End Sub
Sub ShowBar()
Application.CommandBars(1).Enabled = True
7