Application.CommandBars(3).Visible = True Application.CommandBars(4).Visible = True
End Sub
3 各功能模块设计及相应窗体
应用计算机进行信息处理时,需要将手工数据进行编码或规范化,以方便计算机快速查找。由于系统相对繁琐,整体设计出现问题不方便查找改错。基于模块化设计的优点,内聚高、外聚少,出错很容易查找,每一个模块自我包含、自我实现,方便管理。但模块的存在与划分必须以系统平台的整体功能作为前提,做到有层次感、结构感和整体性。
3.1 基础资料模块设计
基础资料模块的设计包含其窗体的设计及相应的代码实现,这里只用到教师的姓名,窗体界面只需录入教师姓名即可,并将删除、保存功能统一在一个窗体方便管理。 3.1.1 窗体设计
窗体界面如图3—1所示。
图3—1 教师名称窗体
在“教师名称”窗体中,左边放置一个列表框,显示教师姓名,单击“添加”按钮将文本框中输入的内容添加到列表框中;选中列表框中的项目后,单击“删除”按钮可删除该项。为了方便管理,将“增加”“删除”等功能都集中于一个窗体,并设有“保存”功能。设置“增加”按钮的Default属性为True,则在该窗体中按Enter键时,将触发该按钮的单击事件;设置“退出”按钮的Cancel属性为True,按Esc键时,将触发该按钮的单击事件。 3.1.2 代码设计
该窗体的代码首先将已有教师的资料显示出来,然后通过对窗体上控件的操作,可完成数据的添加、删除、修改等操作。
首先,在窗体中设置一个模块级变量bSave,当对数据进行了修改(增加或删除),就设置该变量为True,表示需要保存数据。
Dim bSave As Boolean ’保存数据标志
其次,在窗体初始化时,将“基础数据”表中的教师名称添加到列表框中,可通过一下代码实现:
Private Sub UserForm_Initialize()
Dim intRow As Integer, i As Integer
8
With Sheets(\基础数据\
intRow = .[A65536].End(xlUp).Row If intRow < 3 Then Exit Sub For i = 3 To intRow
ListBox1.AddItem .Cells(i, 1) Next End With End Sub
单击“增加”按钮时,将文本框中的内容添加到列表框中。 Private Sub cmdAdd_Click()
Dim i As Integer, strXm As String strXm = Trim(txtXm.Value) If strXm = \
MsgBox \请输入教师姓名!\学生成绩管理系统\ Exit Sub End If
For i = 0 To ListBox1.ListCount - 1 If ListBox1.List(i) = strXm Then
MsgBox \已有教师:“\”的数据!\ vbInformation + vbOKOnly, \学生成绩管理系统\ Exit Sub End If Next
ListBox1.AddItem strXm txtXm.SetFocus txtXm.Value = \ bSave = True End Sub
程序首先对文本框中输入的内容进行判断,如果为空就返回,不添加内容。并对输入的内容比较,如列表框中已有相同的内容,则不添加;若有新的数据添加到列表框后,应将bSave变量置为True,表示有数据需要保存。
“删除”按钮代码:
Private Sub cmdDel_Click()
If ListBox1.ListIndex >= 0 Then ’如果选择了列表框中的项目 ListBox1.RemoveItem ListBox1.ListIndex ’删除选中的项目 bSave = True ’设置需要保存的标志 End If End Sub
“保存”按钮功能实现代码: Private Sub cmdSave_Click() Dim i As Integer
With Sheets(\基础数据\
If ListBox1.ListCount <= 0 Then Exit Sub ’如果列表中没内容,则退出 For i = 0 To ListBox1.ListCount – 1 ’将列表框中的内容逐步写到工作表中 .Cells(i + 3, 1) = ListBox1.List(i) Next End With
bSave = False ’清楚需要保存标志
9
End Sub
“退出”按钮功能实现:
Private Sub cmdQuit_Click() If bSave Then
If MsgBox(\新增加的教师姓名还未保存。\是否保存?\
vbQuestion + vbYesNo + vbDefaultButton1, \学生成绩管理系统\= vbYes Then cmdSave_Click End If End If
Unload Me ’释放窗体 End Sub
单击“退出”按钮时,程序将判断bSave变量,如果其值为True,则表示有数据需要被修改而没有保存,将弹出消息提示,让用户选择是否存盘。
3.2 学期初始化模块设计
同样,学期初始化模块也应具有其操作窗体界面,但对其课程的安排需对课程和教师姓名同时进行管理,其代码相对繁琐,下面在保存功能方面有具体说明。 3.2.1 当前学期设置
通过该子模块设置系统当前操作的学期,后面的课程安排、导入成绩、查询成绩都以此为基础,不再处理其他学期的资料。设置代码与前面所用代码基本相同,并相对简单,这里不做详细的介绍。其窗口界面如图3—2所示。
图3—2 当前学期设置窗体
3.2.2 班级课程安排
班级课程安排模块用来设置各班本学期的课程及任课老师,为后面创建成绩分发表提供数据。窗体界面我们设置左边列表框的ColumnCount属性为2,即列表框显示两列,分别显示课程名称和授课教师姓名。如图3—3所示。
10
图3—3 班级课程安排窗体
代码方面,前面的下拉菜单、增加、删除功能实现已在基础资料模块窗体设计中进行了详细说明,这里只对课程设置的保存功能做下详细介绍,其保存工作流程图如图3—4所示:
开始在“班级课程表”中查找班级找到?是删除本学期原有数据添加本学期课程安排数据结束否添加本学期课程安排数据 图 3—4 保存流程图 完成该功能的代码如下:
Private Sub cmdSave_Click()
Dim i As Integer, j As Integer
Dim intColumn As Integer, intRow As Integer '班级课程表中的行数 With Sheets(\班级课程表\
intColumn = .[IV1].End(xlToLeft).Column ’获取班级课程表的数据列数 For i = 1 To intColumn Step 3
If .Cells(1, i) = strBj Then Exit For ’在班级课程表中查找班级 Next
If i > intColumn Then '班级课程表中没有该班 i = intColumn + 3 .Cells(1, i) = strBj .Cells(2, i) = \学期\ .Cells(2, i + 1) = \课程\ .Cells(2, i + 2) = \教师\
11
intRow = 3
Else '班级课程表中已有该班 intRow = .Cells(65536, i).End(xlUp).Row End If
If intRow > 3 Then '删除原有数据
For j = intRow To 3 Step -1
If .Cells(j, i) = strXq Then .Range(.Cells(j, i), .Cells(j, i + 2)).Delete Shift:=xlShiftUp End If Next
intRow = .Cells(65536, i).End(xlUp).Row + 1 '重新获取数据行 End If
For j = 0 To ListBox1.ListCount – 1 '将新增或修改后的数据保存 .Cells(j + intRow, i) = strXq ’当前学期 .Cells(j + intRow, i + 1) = ListBox1.List(j, 0) '课程
.Cells(j + intRow, i + 2) = ListBox1.List(j, 1) '授课教师 Next End With
bSave = False ’清楚保存标志 End Sub 程序说明:
(1) 在For循环中,执行完循环退出时,其循环变量的值将大于终值;如果循环为执行
完,遇到Eixt For语句退出时,其循环变量的值将小于终值。本程序利用这一特点来判断在循环内是否找到对应的班级。 (2) 在Excel中,删除单元格数据时,将弹出对话框让用户选择单元格的移动方式。在
VBA中,可以通过Delete方法的Shift参数来选择该项,常数xlShiftUp表示下方单元格上移。 (3) 通过列表框的List(row,col)属性访问列表框中的各项数据,这时将列表框作
为一个表格,通过行和列进行访问。
3.3 学生名单处理模块设计
学生名册的数据量非常大,如果全部由教务处进行处理,工作量巨大,而且容易出现错误,效率极低。通过设计相应的功能模块,由各班班主任报送Excel数据,然后导入系统中进行处理。本模块提供分发空表、导入学生资料和输入学生资料三项功能。这里主要描述导入学生资料的功能流程,如图3—5所示:
12