ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 统计每科前十名数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-5-20 15:35 | 显示全部楼层 |阅读模式

总成绩表中统计出每科前十名学生的信息。有并列全部取。

单科前十名.zip

59.57 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2022-5-20 16:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  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 d = CreateObject("scripting.dictionary")
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   With Worksheets("成绩")
  10.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  11.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  12.     arr = .Range("a1").Resize(r, c)
  13.   End With
  14.   mc = Application.InputBox(prompt:="请问要取前多少名?", Title:="操作提示", Default:=10, Type:=1)
  15.   If mc > UBound(arr) - 1 Then
  16.     mc = UBound(arr) - 1
  17.   End If
  18.   For j = 3 To UBound(arr, 2)
  19.     fs = Application.Large(Application.Index(arr, 0, j), mc)
  20.     For i = 2 To UBound(arr)
  21.       If arr(i, j) >= fs Then
  22.         If Not d.exists(arr(1, j)) Then
  23.           m = 1
  24.           ReDim brr(1 To 4, 1 To m)
  25.         Else
  26.           brr = d(arr(1, j))
  27.           m = UBound(brr, 2) + 1
  28.           ReDim Preserve brr(1 To 4, 1 To m)
  29.         End If
  30.         brr(1, m) = arr(i, 1)
  31.         brr(2, m) = arr(i, 2)
  32.         brr(3, m) = arr(i, j)
  33.         d(arr(1, j)) = brr
  34.       End If
  35.     Next
  36.   Next
  37.   For Each aa In d.keys
  38.     brr = d(aa)
  39.     ReDim crr(1 To UBound(brr, 2), 1 To UBound(brr))
  40.     For i = 1 To UBound(brr)
  41.       For j = 1 To UBound(brr, 2)
  42.         crr(j, i) = brr(i, j)
  43.       Next
  44.     Next
  45.     d1.RemoveAll
  46.     For i = 1 To UBound(crr)
  47.       d1(crr(i, 3)) = d1(crr(i, 3)) + 1
  48.     Next
  49.     nn = 1
  50.     kk = d1.keys
  51.     For k = 0 To UBound(kk)
  52.       mm = Application.Large(kk, k + 1)
  53.       ss = d1(mm)
  54.       d1(mm) = nn
  55.       nn = nn + ss
  56.     Next
  57.     For i = 1 To UBound(crr)
  58.       crr(i, 4) = d1(crr(i, 3))
  59.     Next
  60.     d(aa) = crr
  61.   Next
  62.   With Worksheets("结果")
  63.     .UsedRange.Offset(1, 0).Clear
  64.     r1 = 2
  65.     For Each aa In d.keys
  66.       brr = d(aa)
  67.       With .Cells(r1, 1)
  68.         .Value = aa
  69.         .Resize(UBound(brr), 1).Merge
  70.       End With
  71.       .Cells(r1, 2).Resize(UBound(brr), UBound(brr, 2)) = brr
  72.       .Cells(r1, 2).Resize(UBound(brr), UBound(brr, 2)).Sort key1:=.Cells(r1, 5), order1:=xlAscending, Header:=xlNo
  73.       With .Cells(r1, 1).Resize(UBound(brr), 1 + UBound(brr, 2))
  74.         .Borders.LineStyle = xlContinuous
  75.         With .Font
  76.           .Name = "微软雅黑"
  77.           .Size = 11
  78.         End With
  79.       End With
  80.       r1 = r1 + UBound(brr)
  81.     Next
  82.     With .UsedRange
  83.       .HorizontalAlignment = xlCenter
  84.       .VerticalAlignment = xlCenter
  85.     End With
  86.   End With
  87.   
  88.   With Worksheets("结果1")
  89.     .Cells.Clear
  90.     n = 1
  91.     For Each aa In d.keys
  92.       brr = d(aa)
  93.       With .Cells(1, n)
  94.         .Value = aa
  95.         .Resize(1, 4).Merge
  96.       End With
  97.       .Cells(2, n).Resize(1, 4) = Array("班级", "姓名", "成绩", "排名")
  98.       .Cells(3, n).Resize(UBound(brr), UBound(brr, 2)) = brr
  99.       .Cells(3, n).Resize(UBound(brr), UBound(brr, 2)).Sort key1:=.Cells(3, n + 3), order1:=xlAscending, Header:=xlNo
  100.       With .Cells(1, n).Resize(2 + UBound(brr), UBound(brr, 2))
  101.         .Borders.LineStyle = xlContinuous
  102.         With .Font
  103.           .Name = "微软雅黑"
  104.           .Size = 11
  105.         End With
  106.       End With
  107.       n = n + 5
  108.     Next
  109.     With .UsedRange
  110.       .HorizontalAlignment = xlCenter
  111.       .VerticalAlignment = xlCenter
  112.     End With
  113.   End With
  114. End Sub
复制代码

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-20 16:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-5-20 16:13 | 显示全部楼层

先不说结果与效率,,,

光是这114行代码,也要敲好一会儿,,
佩服,学习了!
  
9724.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-20 18:25 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
select * from 各科成绩前十名中国式品名 limit 3;

cli_one_dim~各科成绩前十名中国式排名~2;

create temp table aa as  select 属性 学科,姓 姓名,班级,数量 成绩,dense_rank() over (partition by 属性 order by 数量 desc) 排名 from 各科成绩前十名中国式排名union;


create temp table bb as  select * from aa where 排名<=10; select count(*) 行,学科,group_concat(班级),group_concat(姓名),group_concat(成绩),group_concat(排名) from bb group by 学科; select 学科,group_concat(班级||姓名||成绩||排名) 子表 from bb group by 学科;
Screenshot_2022-05-20-18-21-33-511_io.github.excel.Ninja.jpg
Screenshot_2022-05-20-18-21-26-082_io.github.excel.Ninja.jpg

TA的精华主题

TA的得分主题

发表于 2022-5-20 19:08 | 显示全部楼层
数据不大,表格规范,若后继无特殊数据处理,
就用工作表循环排下序吧:
  1. Sub TOP10D()
  2. Dim arr, ar, r, c, i, j, k, m, n
  3. Application.DisplayAlerts = False
  4. With Sheets("成绩")
  5.      r = .[A65536].End(xlUp).Row
  6.      arr = .Range("A1:K" & r)
  7.      ReDim ar(1 To UBound(arr), 1 To 5)
  8.      k = 1
  9.      ar(k, 1) = "科目": ar(k, 2) = "班级": ar(k, 3) = "姓名": ar(k, 4) = "成绩": ar(k, 5) = "名次"
  10.      For c = 3 To UBound(arr, 2)
  11.          .Range("A2:K" & r).Sort key1:=.Cells(2, c), Order1:=xlDescending, Header:=xlNo, _
  12.          OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
  13.              :=xlPinYin, DataOption1:=xlSortNormal    'xlAscending    'xlDescending
  14.          For i = 2 To 50
  15.              If .Cells(i, c) <> .Cells(i - 1, c) Then j = i - 1
  16.              If i > 11 And .Cells(i, c) <> .Cells(11, c) Then Exit For
  17.              k = k + 1
  18.              ar(k, 1) = .Cells(1, c): ar(k, 2) = .Cells(i, 1): ar(k, 3) = .Cells(i, 2): ar(k, 4) = .Cells(i, c): ar(k, 5) = j
  19.          Next
  20.      Next
  21.      .Range("A1").Resize(UBound(arr), UBound(arr, 2)) = arr     '恢复原始数据
  22. End With
  23. With Sheets("结果2")
  24.      .Cells.Clear
  25.      .Range("A1").Resize(k, UBound(ar, 2)) = ar
  26.      m = 2
  27.      For n = 2 To k
  28.          If .Cells(n, 1) <> .Cells(n + 1, 1) Then
  29.             .Range(.Cells(m, 1), .Cells(n, 1)).Merge
  30.             m = n + 1
  31.          End If
  32.      Next
  33.      .Range("A1").Resize(k, UBound(ar, 2)).Borders.LineStyle = xlContinuous
  34. Application.DisplayAlerts = True
  35. End With
  36. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-20 19:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
详见附件:
单科前十名.rar (80.91 KB, 下载次数: 18)

TA的精华主题

TA的得分主题

发表于 2022-5-20 19:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
橫向列表//
Xl0000015.rar (42.32 KB, 下载次数: 38)


评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-20 23:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
对三位老师的代码测了一下用时,准提部林老师的0.2188s ,aman1516老师的0.2656s,chxw68老师的3.8281s

TA的精华主题

TA的得分主题

发表于 2022-5-21 17:02 | 显示全部楼层
仔细研究过三位老师的代码,准提部林老师给出的结果是正确的结果。思路也非常好,化繁为简。避开复杂的二维数组排序,变二维为一维排序,这种思路对解决实际问题很有启发。还有变large排序为快速排序,还可以快一点点。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 16:00 , Processed in 0.044497 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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