利用宏实现成绩登记表
2010-03-26 00:00:00 来源:WEB开发网4.设计自定义过程Score_Statistic宏,Score_Statistic的主要功能如下:
从表格的单元格中取出学生的3项成绩调用Convert_Int函数进行数据转换;根据课程性质和总成绩构成的百分比计算期末总成绩;对学生的4项成绩进行格式处理:低于60分加框,考试课程期末总成绩低于45分加阴影、考查课总成绩以5级等第表示、缺考的成绩不作处理;根据期末总成绩进行各分数段人数累计;统计期末总成绩低于45分的人数;Score_Statistic的参数为为待处理的单元格的行列号。
四、操作过程
进入Word打开待处理的成绩登记表,确定考试性质、输入学生各项成绩的分数或等第、输入总成绩构成比例后,鼠标左击图3中的“成绩统计”按钮,即可进行成绩自动处理。
经过处理以后的成绩表如图4、图5和图6所示。
查看原图(大图)
图4 处理以后的考试课程成绩表
查看原图(大图)
图5 处理以后的考查课程成绩表
图6 成绩分布
五、源代码
`alculate宏代码
Private Sub calculate()
Dim number_of_stu As Integer, i As Integer, j As Integer
Dim student_id As String
Dim fraction As Single
exam_or_check = ThisDocument.OptionButton1.Value
proportion(1) = Val(ThisDocument.Tables(1).Cell(33, 2).Range.Text)
proportion(2) = Val(ThisDocument.Tables(1).Cell(33, 4).Range.Text)
proportion(3) = Val(ThisDocument.Tables(1).Cell(33, 6).Range.Text)
If proportion(1) + proportion(2) + proportion(3) <> 100 Then
MsgBox "平时成绩:实验成绩:期末成绩三项之和不等于100", vbOKOnly, message_title
Exit Sub
End If
number_of_stu = 0
For i = 1 To 7: grade_proportion(1, i) = 0: grade_proportion(2, i) = 0: Next '成绩分布初始化
For i = 1 To 25
ThisDocument.Tables(1).Cell(i + 1, 4).Range.Font.Size = 9 '设置字号
ThisDocument.Tables(1).Cell(i + 1, 5).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 6).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 7).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 4).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
'设置对齐方式
ThisDocument.Tables(1).Cell(i + 1, 5).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
ThisDocument.Tables(1).Cell(i + 1, 6).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
ThisDocument.Tables(1).Cell(i + 1, 7).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
student_id = Trim(ThisDocument.Tables(1).Cell(i + 1, 2).Range.Text) '取学号
If Len(student_id) > 2 Then '计算成绩表左侧成绩
number_of_stu = number_of_stu + 1
Call Score_Statistic(i, 4)
End If
ThisDocument.Tables(1).Cell(i + 1, 11).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 12).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 13).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 14).Range.Font.Size = 9
ThisDocument.Tables(1).Cell(i + 1, 11).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
ThisDocument.Tables(1).Cell(i + 1, 12).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
ThisDocument.Tables(1).Cell(i + 1, 13).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
ThisDocument.Tables(1).Cell(i + 1, 14).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
student_id = Trim(ThisDocument.Tables(1).Cell(i + 1, 9).Range.Text) '取学号
If Len(student_id) > 2 Then '计算成绩表右侧成绩
number_of_stu = number_of_stu + 1
Call Score_Statistic(i, 11)
End If
Next i
If number_of_stu = 0 Then MsgBox "没有学生成绩数据", vbExclamation + vbOKOnly, message_title: Exit Sub
'计算成绩分布
fraction = 100
For i = 1 To 7
If grade_proportion(1, i) > 0# Then
grade_proportion(2, i) = Round(grade_proportion(1, i) / number_of_stu * 100, 1)
If i < 7 Then fraction = fraction - grade_proportion(2, i): j = i '考试课程卷面成绩<45
`不用调整百分比
Else
grade_proportion(2, i) = 0
End If
Next
'百分比调整为100%
If Abs(fraction) >= 0.05 Then grade_proportion(2, j) = Round(grade_proportion(2, j) + fraction, 1)
For i = 1 To 7
ThisDocument.Tables(1).Cell(31, i + 1).Range.Text = grade_proportion(1, i)
ThisDocument.Tables(1).Cell(32, i + 1).Range.Text = grade_proportion(2, i)
Next
MsgBox "成绩登记完毕,请检查", vbOKOnly, message_title
End Sub
更多精彩
赞助商链接