ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 各科排名、各班各科前N名、年级各科前N名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-7 12:19 | 显示全部楼层 |阅读模式
求助各位大佬:求各科排名、各班各科前N名、年级各科前N名

求助:计算各科年名班名及取各班各科前N名20230407.zip

363.77 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2023-4-7 12:45 | 显示全部楼层
一个浩大的工程,
九门,五门,四门,三门如何定义??

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-7 13:31 | 显示全部楼层
总分怎么算的不用考虑,就当它是门学科名。成绩表中有什么字段名就计算下名次就行了。

TA的精华主题

TA的得分主题

发表于 2023-4-7 14:56 | 显示全部楼层
sunshuangzhong 发表于 2023-4-7 13:31
总分怎么算的不用考虑,就当它是门学科名。成绩表中有什么字段名就计算下名次就行了。

描述一下口径吧,年名,班名啥的?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-7 15:10 | 显示全部楼层
过会我来重新上传下真实的模拟结果。年名就是在所有学生中的排名,班名就是在班级里的排名

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-7 15:30 | 显示全部楼层
上传真实模拟结果

求助:计算各科年名班名及取各班各科前N名20230408.zip

289.53 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2023-4-7 16:24 | 显示全部楼层
工作量确实很大。可以用数据库方法生成中间表,包括各科班名、年名。然后通过考号匹配把排名表。
全要用字典的话代码会很长。
360截图20230407162124379.jpg
360截图20230407162153394.jpg

求助:计算各科年名班名及取各班各科前N名20230407.rar

346.93 KB, 下载次数: 15

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-7 16:29 | 显示全部楼层
思路是对于每个科目,按班级+得分(倒序)排序,未参加考试的不计入排名。
同一班级的,从上往下数即得班名
年级排名用rank函数即可。

TA的精华主题

TA的得分主题

发表于 2023-4-7 16:49 | 显示全部楼层
grf1973 发表于 2023-4-7 16:24
工作量确实很大。可以用数据库方法生成中间表,包括各科班名、年名。然后通过考号匹配把排名表。
全要用字 ...

新手最爱用数组循环加字典,因为所有的教程里都是这么教的;
祝您生活愉快

TA的精华主题

TA的得分主题

发表于 2023-4-7 18:06 | 显示全部楼层
排名代码。
  1. Sub test()
  2.     Dim r%, i%
  3.     Dim arr, brr
  4.     Dim d As Object
  5.     Application.ScreenUpdating = False
  6.     Application.DisplayAlerts = False
  7.     Set d1 = CreateObject("scripting.dictionary")
  8.     Set d2 = CreateObject("scripting.dictionary")
  9.     Set d3 = CreateObject("scripting.dictionary")
  10.     With Worksheets("成绩")
  11.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  12.         c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  13.         arr = .Range("a1").Resize(r, c)
  14.     End With
  15.     ReDim brr(1 To UBound(arr), 1 To (UBound(arr, 2) - 5) * 3)
  16.     For j = 6 To UBound(arr, 2)
  17.         n = j * 3 - 17
  18.         brr(1, n) = arr(1, j) & "年名"
  19.         brr(1, n + 1) = arr(1, j) & "文理名"
  20.         brr(1, n + 2) = arr(1, j) & "班名"
  21.         d1.RemoveAll
  22.         d2.RemoveAll
  23.         d3.RemoveAll
  24.         For i = 2 To UBound(arr)
  25.             If Len(arr(i, j)) <> 0 Then
  26.                 d1(arr(i, j)) = d1(arr(i, j)) + 1
  27.                 If Not d2.exists(arr(i, 5)) Then
  28.                     Set d2(arr(i, 5)) = CreateObject("scripting.dictionary")
  29.                 End If
  30.                 d2(arr(i, 5))(arr(i, j)) = d2(arr(i, 5))(arr(i, j)) + 1
  31.                 If Not d3.exists(arr(i, 2)) Then
  32.                     Set d3(arr(i, 2)) = CreateObject("scripting.dictionary")
  33.                 End If
  34.                 d3(arr(i, 2))(arr(i, j)) = d3(arr(i, 2))(arr(i, j)) + 1
  35.             End If
  36.         Next
  37.         nn = 1
  38.         kk = d1.keys
  39.         For k = 0 To UBound(kk)
  40.             mm = Application.Large(kk, k + 1)
  41.             ss = d1(mm)
  42.             d1(mm) = nn
  43.             nn = nn + ss
  44.         Next
  45.         For Each aa In d2.keys
  46.             nn = 1
  47.             kk = d2(aa).keys
  48.             For k = 0 To UBound(kk)
  49.                 mm = Application.Large(kk, k + 1)
  50.                 ss = d2(aa)(mm)
  51.                 d2(aa)(mm) = nn
  52.                 nn = nn + ss
  53.             Next
  54.         Next
  55.         For Each aa In d3.keys
  56.             nn = 1
  57.             kk = d3(aa).keys
  58.             For k = 0 To UBound(kk)
  59.                 mm = Application.Large(kk, k + 1)
  60.                 ss = d3(aa)(mm)
  61.                 d3(aa)(mm) = nn
  62.                 nn = nn + ss
  63.             Next
  64.         Next
  65.         For i = 2 To UBound(arr)
  66.             If Len(arr(i, j)) <> 0 Then
  67.                 brr(i, n) = d1(arr(i, j))
  68.                 brr(i, n + 1) = d2(arr(i, 5))(arr(i, j))
  69.                 brr(i, n + 2) = d3(arr(i, 2))(arr(i, j))
  70.             End If
  71.         Next
  72.     Next
  73.     With Worksheets("排名")
  74.         .Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr
  75.         .Cells(1, UBound(arr, 2) + 1).Resize(UBound(brr), UBound(brr, 2)) = brr
  76.         With .Range("a1").Resize(UBound(arr), UBound(arr, 2) + UBound(brr, 2))
  77.             .Borders.LineStyle = xlContinuous
  78.             With .Font
  79.                 .Name = "微软雅黑"
  80.                 .Size = 10
  81.             End With
  82.             .HorizontalAlignment = xlCenter
  83.             .VerticalAlignment = xlCenter
  84.         End With
  85.         .Columns(1).Resize(, UBound(arr, 2) + UBound(brr, 2)).AutoFit
  86.             
  87.     End With
  88.     Application.ScreenUpdating = True
  89.    
  90. End Sub
复制代码

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 18:38 , Processed in 0.033645 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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