大学综合测评中,使用VBA代码自动完成EXCEL成绩表

       更新:2014-04-18       下午

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

前言
  1. 我们在校大学生,每年都会评奖学金。而参考指标就是综合测评成绩。综合测评中,期末成绩又是最主要的部分。
  2. 一般每个大学教务系统都会生成一份原始成绩表,然后一级级下发到学习委员手中。而要计算出同学们的学业基本分,是要做很多EXCEL处理和计算工作的。
  3. 我担任过两年学习委员,这方面比较有经验,所以就写了一个宏,让成绩表的制作工作,基本由计算机程序直接完成。这样能大大提高效率。
  4. 本文主要目的:整理成果,方便日后维护、共享代码;留给我校,以后担任学习委员的学弟学妹,在制作综合测评成绩表时,可以使用我的程序增加效率;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

代码

       History:    (代码修改历史记录列表)

       1.  Date:2013/10/6

       Modification:部分注释错别字,解释错误的改动

       2.  Date:2013/10/10

       Modification:科目名称超过15个字用8号字体

       3.  Date:2013/10/21

       Modification:运行完后,弹出友情提示窗口

Sub 成绩表()
'Author:代号4101 首次发布:2013/10/6

    Dim 行范围, 列范围, 有效范围, 计数, i, j, title, 总学分, logo, str

    '去掉获得学分为0的行
    i = 4
    While Cells(i, 4) <> ""
        If Cells(i, 4) = 0 Then
            Rows(i).Delete Shift:=xlUp
        Else
            i = i + 1
        End If
    Wend
    行范围 = i + 1 '这里有中间计算过程,算出的是最终确立的,最后条数据的行号
    
    '完成行的确定
    title = Cells(1, 1)
    Rows(2).Delete Shift:=xlUp
    Rows(2).Insert Shift:=xlDown
    Rows("4:5").Insert Shift:=xlDown
    
    '删除第一列与第四列
    Columns(1).Delete Shift:=xlToLeft
    Columns(3).Delete Shift:=xlToLeft
    
    '去掉含不计入综测的科目
    有效范围 = 2 * (i - 3) / 3
    j = 3
    While Cells(3, j) <> ""
        计数 = 0
        For i = 6 To 行范围
            If Len(Cells(i, j)) Then
                计数 = 计数 + 1
            End If
        Next
        '①成绩比例小于2/3 ②形势与政策、专业导论等只分合格与不合格的不计入(该处采用不严密的算法,但出错,即定位的6位同学都没有出现“合格”字眼几乎是不可能事件)
        If (计数 < 有效范围) Then
            Columns(j).Delete Shift:=xlToLeft
        ElseIf (Mid(Cells(6, j), 1, 2) = "合格") Or (Mid(Cells(10, j), 1, 2) = "合格") Or (Mid(Cells(20, j), 1, 2) = "合格") Then
            Columns(j).Delete Shift:=xlToLeft
        ElseIf (Mid(Cells(25, j), 1, 2) = "合格") Or (Mid(Cells(28, j), 1, 2) = "合格") Or (Mid(Cells(30, j), 1, 2) = "合格") Then
            Columns(j).Delete Shift:=xlToLeft
        Else
            j = j + 1
        End If
    Wend
    列范围 = j - 1
    Range(Cells(1, 1), Cells(1, 列范围)).FormulaR1C1 = title '有个标题会没掉的BUG,不知道问题在哪,所以在此处补充回来
    
    '提取出第三行的科目类型、科目名称、学分数据
    Dim 第一个位置, 第二个位置, 长度    '找出斜杆的位置
    For j = 3 To 列范围
        i = 1
        Cells(3, j).Select
        While Mid(ActiveCell, i, 1) <> "/"
            i = i + 1
        Wend
        第一个位置 = i
        i = i + 1
        While Mid(ActiveCell, i, 1) <> "/"
            i = i + 1
        Wend
        第二个位置 = i
        长度 = Len(ActiveCell)
        Cells(2, j) = Mid(ActiveCell, 第一个位置 + 1, 第二个位置 - 第一个位置 - 1)
        Cells(4, j) = Mid(ActiveCell, 第二个位置 + 1, 长度 - 第二个位置)
        Cells(3, j) = Left(ActiveCell, 第一个位置 - 1)
    Next
    
    '下面是列交换,先按科目类别名降序排序,再按学分降序排序,完成列的交换
    Range(Cells(2, 3), Cells(行范围, 列范围)).Select
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(2, 3), Cells(2, 列范围)), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(4, 3), Cells(4, 列范围)), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range(Cells(2, 3), Cells(行范围, 列范围))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
    
    '第二行类别名相同合并
    i = 3
    While i <= 列范围
        j = i + 1
        While Cells(2, j) = Cells(2, i)
            Cells(2, j).Clear
            j = j + 1
        Wend
        If j = i + 1 Then
            Cells(2, i).MergeCells = False
        Else
            Range(Cells(2, i), Cells(2, j - 1)).MergeCells = True
        End If
        i = j
    Wend
    
    '所有缺数据的地方用0分填充,考察课文本转为数值成绩
    For i = 6 To 行范围
        For j = 3 To 列范围
            Cells(i, j).Select
            If Len(ActiveCell) = 0 Then
                Cells(i, j) = "0"
            Else
                Select Case ActiveCell
                    Case "优秀"
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、特色 本作品采用EXCEL 公式+VBA制作,既可根据你平时使用EXCEL的习惯和方式操作充分发挥EXCEL的功能,又能利用本作品提高效率。 ※※※※二、主要功能 1、在原始成绩表自动按你要求的统计科目生成总分、平均分、班级排名、年级排名等。 2、查询:查询条件多样,可按姓名查询、按班级查询(分班);按某学科(含总分)某分数段查询;按班内名次(年级名次)段查询(如某班前XX名、年级前XX-XX名)等,各种查询条件还可自由组合。对查询结果,可按某关键字排序后显示,如按班级排名升序可组合出某班全部或班前XX名、年级前XX名排名等,按年级排名升序可组合出年级前XX名排名或全部排名等。 3、统计:根据班级和科目(含总体)按统计范围自动实时生成各项指标(参考人数、平均分、及格人数、及格率、优生人数、优生率、差生人数、差生率等)、各分数段人数统计、年级前XX名在各班分布等。 4、成绩册和成绩条:实时自动按班生成成绩册和成绩条。 ※※※※三、操作指南   第一步:在总表输入、导入、复制粘贴或在记录单逐条录入原始成绩(第一行为如下形式) 学号 ∣ 数学 ∣ 总分 ∣ 学号 ∣ 语文 ∣ 班级 ∣ 英语 ∣ 姓名 ∣ 政治 ∣ 历史 ∣ 物理 ∣ 化学 ∣ …… "  1、其各列位置不固定   2、班级列必须包含   3、可以任意增加删除科目   4、可以任意增加删除辅助列如:学号、年级、座位号等"   第二步 :设置 "  1、打开设置工作表进行设置   2、包括考试名称和统计科目的设置   3、具体设置方法表内的批注已经说明"   第三步:点击控制条上的各个按钮进行相应统计 其,分班成绩册和成绩单、统计分别以VBA和公式两种方式制作,这两种方式各有特点,供你选择:公式方式的优点是当条件变化(如所选班级、科目变化)时显示结果随之实时变化,除非公式被破坏或者刚从其它表册转入本功能你才需要重新点击按钮;VBA方式每次改变条件后必须点击相应按钮才能刷新结果,但对结果你可随意进行各种操作。如果你觉得窗体有可能遮住结果,窗体可移动,可关闭,以便在EXCEL按你熟悉的方式操作。另总表还提供了按班级排序、填入总分、平均分、计算班级排名、年级排名、分数超限检查等多种自动化功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值