ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6445|回复: 35

[求助] 求助:用VBA提取数据并进行排名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-4-19 17:26 | 显示全部楼层 |阅读模式
需求:选择考试年级后,点击【统计成绩】按钮,根据所选的年级,以“mb”为模板,新建一个工作表,并命名为“成绩总表(一年级),新建工作表代码已经写好了,接着获取工作表“原始成绩”中的年级数据,按mb需要的内容进行统计。


备注:一、二年级只考语文、数学,三—六年级考所有科目。因此当选择的是一、二年级时,要删除“英语、科学、品德”三科的统计。
具体请看附件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-19 18:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wuchengde 于 2019-4-19 18:13 编辑

补传附件,希望各位高手帮忙解决,非常感谢!

XX中心考试各学校成绩表(2).rar

39.83 KB, 下载次数: 49

TA的精华主题

TA的得分主题

发表于 2019-4-19 18:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wuchengde 发表于 2019-4-19 18:11
补传附件,希望各位高手帮忙解决,非常感谢!

论坛类似成绩处理的帖子实在太多了,不知道楼主搜索了没有?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-19 20:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不知道为什么 发表于 2019-4-19 18:17
论坛类似成绩处理的帖子实在太多了,不知道楼主搜索了没有?

我已经搜了很多的了,然后尝试改了很多次,可是都达不到效果,才来请求帮助的!
本论坛的几个相似的帖子如下:http://club.excelhome.net/thread-1215025-1-1.html
http://club.excelhome.net/thread-689873-1-1.html
http://club.excelhome.net/thread-1353197-1-1.html
还有其他论坛的帖子、百度的问答,都看了,但由于对字典的的使用和排名方式不太熟悉,所做不出我想要的效果啊!

还请各位多多帮助。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-19 20:10 | 显示全部楼层
Sheets.Add
ActiveSheet.Name = s
Sheets(s).Activate
Cells.clear
If Sheets(r).[g2] = "中国式排名" Then fs = 1 Else fs = 2
arr = Sheets(r).[a1].CurrentRegion
For i = 4 To UBound(arr)
    d(arr(i, 3)) = d(arr(i, 3)) & i & ","
Next
k = d.keys: t = d.items
brr = Sheets(r).[a4].Resize(UBound(arr) - 3, UBound(arr, 2))
With Sheets("基本信息设置")
    [a1] = .Range("d2") & .Range("d3") & .Range("d4") & .Range("d5") & .Range("d6") & "成绩统计表"
End With
For j = 1 To 4
    Cells(2, j) = arr(3, j)                                             '标题前四列
    Cells(3, j).Resize(UBound(brr), 1) = Application.Index(brr, 0, j)   '前四列基本信息
Next
For j = 5 To UBound(arr, 2)
    Cells(2, 3 * j - 10) = arr(3, j)                                                 '科目标题
    Call bp(j, fs)
    Cells(2, 3 * j - 8) = arr(3, j) & vbLf & "班排"                                          '班排标题
    Cells(3, 3 * j - 10).Resize(UBound(brr), 1) = Application.Index(brr, 0, j)       '原成绩数据
    Call np(j, fs)
    Cells(2, 3 * j - 9) = arr(3, j) & vbLf & "年排"                                         '年排标题
    Cells(3, 3 * j - 9).Resize(UBound(brr), 1) = [bc1].Resize(UBound(brr), 1).Value  '年排数据
Next
[ba:bc].clear
Myc = [iv2].End(xlToLeft).Column
Cells(2, Myc + 1) = "进退" & vbLf & "情况"

'计算进退情况
Dim carr
If Len(ss) <> 0 Then
    With Sheets(ss)
        ssrr = .Range("a1").CurrentRegion
    End With
    With Sheets(s)
        srr = .Range("a1").CurrentRegion
        ReDim carr(1 To UBound(srr) - 2, 1 To 1)
        For m = 1 To UBound(srr) - 2
            For n = 3 To UBound(ssrr)
                If .Cells(m + 2, 1) = Sheets(ss).Cells(n, 1) Then
                    carr(m, 1) = Sheets(ss).Cells(n, UBound(ssrr, 2) - 2) - .Cells(m + 2, UBound(srr, 2) - 2)
                    Exit For
                Else
                    carr(m, 1) = "-"
                End If
            Next n
        Next m
        .Cells(3, UBound(srr, 2)).Resize(UBound(carr), 1) = carr
    End With
Else
    With Sheets(s)
        srr = .Range("a1").CurrentRegion
        ReDim carr(1 To UBound(srr) - 2, 1 To 1)
        .Cells(3, UBound(srr, 2)).Resize(UBound(carr), 1) = "-"
    End With
End If

With [a1].Resize(1, Myc + 1)
    .Merge
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
    .Font.Size = 18
    .Font.Bold = True
End With
[a1].CurrentRegion.Borders.LineStyle = 1

'对成绩进行排序
mrr = Sheets(s).[a1].CurrentRegion
Set Rng = Range("a2:az" & UBound(mrr))
'rng.Sort Key1:="考号", Order1:=xlAscending, Header:=xlYes   '以准考证号进行升序排序
Rng.Sort Key1:="总分", Order1:=xlDescending, Header:=xlYes      '以总分进行降序排序

Set d = Nothing
MsgBox "本次成绩统计已完成!" & Chr(13) & Chr(13) & "总运行时间为:" & Timer - tim & " 秒!"

End Sub

Sub np(j, fs)
'年排
Dim i&, crr, n%
[ba:bc].clear
[ba1] = 1: [ba2] = 2: [ba1:ba2].AutoFill [ba1].Resize(UBound(brr), 1)
[bb1].Resize(UBound(brr), 1) = Application.Index(brr, 0, j)
[ba1].Resize(UBound(brr), 2).Sort [bb1], 2, Header:=xlNo
crr = [ba1].Resize(UBound(brr), 2)
[bc1] = 1: n = 1
For i = 2 To UBound(crr)
    If crr(i, 2) < crr(i - 1, 2) Then
        n = n + 1
        If fs = 2 Then
            Cells(i, "bc") = i
        Else
            Cells(i, "bc") = n
        End If
    Else
        Cells(i, "bc") = Cells(i - 1, "bc").Value
    End If
Next
[ba1].Resize(UBound(brr), 3).Sort [ba1], 1, Header:=xlNo
End Sub

Sub bp(j, fs)
'班排
Dim i&, crr, aa, y&, ii&, tt, n%        'y=56               ii=57
For i = 0 To UBound(k)                  'UBound(k)=11
    [ba:bc].clear
    tt = t(i)
    tt = Left(tt, Len(tt) - 1)
    If InStr(tt, ",") Then
        aa = Split(tt, ",")
        For y = 0 To UBound(aa)
            Cells(y + 1, "ba") = aa(y)
            Cells(y + 1, "bb") = arr(aa(y), j)
        Next
        [ba1].Resize(UBound(aa) + 1, 2).Sort [bb1], 2, Header:=xlNo
        crr = [ba1].Resize(UBound(aa) + 1, 2)
        [bc1] = 1: n = 1
        For ii = 2 To UBound(crr)
            If crr(ii, 2) < crr(ii - 1, 2) Then
                n = n + 1
                If fs = 2 Then
                    Cells(ii, "bc") = ii
                Else
                    Cells(ii, "bc") = n
                End If
            Else
                Cells(ii, "bc") = Cells(ii - 1, "bc").Value
            End If
        Next
        [ba1].Resize(UBound(aa) + 1, 3).Sort [ba1], 1, Header:=xlNo
        For y = 0 To UBound(aa)
           Cells(aa(y) - 1, 3 * j - 8) = Cells(y + 1, "bc").Value
        Next
    Else
        Cells(1, "ba") = 1
        Cells(1, "bb") = brr(tt, j)
        Cells(1, "bc") = 1
        Cells(tt, 3 * j - 8) = 1
    End If
Next
End Sub

这是之前蓝版主也帮我做过一次,可是那个只是一个学校的,只有班级和年级的排名,这次这个加入各学校,我拿蓝版主的来研究半天,看不懂后面的班排和年排的代码啊。

TA的精华主题

TA的得分主题

发表于 2019-4-19 20:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-19 20:47 | 显示全部楼层
longkkkk 发表于 2019-4-19 20:41
工作量有点大啊,兄弟

哎,没办法啊,为了工作,这个只是其中的一个,其他的相对不太复杂的,我在使用低级的处理方法慢慢的做呢,只要能达到效果,管不了那么多了

TA的精华主题

TA的得分主题

发表于 2019-4-19 21:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如果只是选择一年级,是否只要计算所有一年级的学生总分、各科的各项进行排名,而对于学生的排序没有要求吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-19 21:25 | 显示全部楼层
longkkkk 发表于 2019-4-19 21:20
如果只是选择一年级,是否只要计算所有一年级的学生总分、各科的各项进行排名,而对于学生的排序没有要求吗 ...

是的,只统计所选年级的,其他不用管,排序排不排都没关系,排序我可以根据总分进行排的,要是能一起考虑进去,一起做了那更好。

TA的精华主题

TA的得分主题

发表于 2019-4-19 21:28 | 显示全部楼层
关键是这种没有规律的表格写出来的代码通用性不强呀。同是科目,语文跟其它科目不同, 科目顺序乱了判断太麻烦。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 00:48 , Processed in 0.045417 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表