Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9996|回复: 24

[已解决]从“总成绩”表中提取各科全级前20名学生成绩信息

[复制链接]
发表于 2014-11-28 12:49 | 显示全部楼层 |阅读模式
要求(vba实现):从“总成绩”表中提取各科(包括“总分”)全级前20名学生成绩信息(包括考号、姓名、班级、班级名次、年级名次)
最佳答案
2014-12-1 10:13
  1. Sub 取前20名()
  2.     Dim xRng As Range
  3.     Set d = CreateObject("scripting.dictionary")
  4.     km = Sheet2.[a3]      '科目
  5.     Set xRng = Sheet1.[a1:m1].Find(km)    '找到科目在总成绩表中的对应列
  6.     If Not xRng Is Nothing Then
  7.         c = xRng.Column
  8.     Else
  9.         MsgBox "无对应科目,请重新选择"
  10.         Exit Sub
  11.     End If
  12.     With Sheet1
  13.         maxr = .[a65536].End(3).Row   '总成绩表最大行
  14.         arr = .Range("a1:m" & maxr)      '总成绩表读入数组
  15.         ReDim brr(1 To maxr, 1 To 2)       'brr为级次、班次表
  16.         Set xRng = .Range(.Cells(2, c), .Cells(maxr, c))      '科目列所有成绩列(用于计算级次)
  17.         For i = 2 To maxr        '字典d保存科目列对应各班的所有成绩(用于计算班次)
  18.             bj = arr(i, 3)
  19.             If Not d.exists(bj) Then Set d(bj) = .Cells(i, c) Else Set d(bj) = Union(d(bj), .Cells(i, c))
  20.         Next
  21.         For i = 2 To maxr
  22.             bj = arr(i, 3): cj = arr(i, c)
  23.             brr(i, 1) = Application.WorksheetFunction.Rank(cj, xRng)          '级次
  24.             brr(i, 2) = Application.WorksheetFunction.Rank(cj, d(bj))         '班次
  25.         Next
  26.         .Range("n1:o" & maxr) = brr        '第14列级次,第15列班次
  27.         .Range("a2:o" & maxr).Sort key1:=.Cells(2, 14)     '按级次排序
  28.         crr = .Range("a1:o" & maxr)      '排序后读入数组crr
  29.         ReDim drr(2 To 21, 1 To 6)      'drr为最终显示结果的数组
  30.         For i = 2 To 21
  31.             drr(i, 1) = crr(i, 1): drr(i, 2) = crr(i, 2): drr(i, 3) = crr(i, 3)      '考号、姓名、班级
  32.             drr(i, 4) = crr(i, c): drr(i, 5) = crr(i, 15): drr(i, 6) = crr(i, 14)      '成绩、班次、级次
  33.         Next
  34.         Sheet2.[c3:h22] = drr
  35.         .UsedRange.ClearContents
  36.         .Range("a1:m" & maxr) = arr       '总成绩表恢复原序
  37.     End With
  38. End Sub

  39. Private Sub Worksheet_Change(ByVal Target As Range)
  40.     With Target
  41.         If .Row < 3 Or .Row > 22 Or .Column > 1 Then Exit Sub
  42.     End With
  43.     Call 取前20名
  44. End Sub
复制代码

各科全级前20名.rar

36.11 KB, 下载次数: 53

要求(vba实现):从“总成绩”表中提取各科(包括“总分”)全级前20名学生成绩信息(包括考号、姓名、班级 ...

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-11-28 13:49 | 显示全部楼层
能技巧不函数,能函数不VBA。这个用排序就可以了,为什么用VBA?
回复

使用道具 举报

发表于 2014-11-28 15:03 | 显示全部楼层
335290-VBA-各科全级前20名.rar (42.17 KB, 下载次数: 66)
回复

使用道具 举报

 楼主| 发表于 2014-11-28 16:02 | 显示全部楼层
那么的帅 发表于 2014-11-28 15:03

帅  师傅  ,    这没分科目啊           只有“总分”    看到不到   语文 、  数学    、英语  等等   前20名信息啊
回复

使用道具 举报

发表于 2014-11-28 16:04 | 显示全部楼层
fanyixiao123 发表于 2014-11-28 16:02
帅  师傅  ,    这没分科目啊           只有“总分”    看到不到   语文 、  数学    、英语  等等    ...

只看到一个20名,不知道各科 分表如何显示?

回复

使用道具 举报

 楼主| 发表于 2014-11-28 16:10 | 显示全部楼层
那么的帅 发表于 2014-11-28 16:04
只看到一个20名,不知道各科 分表如何显示?

麻烦你了,那就用函数算了
回复

使用道具 举报

 楼主| 发表于 2014-11-28 16:11 | 显示全部楼层
1091126096 发表于 2014-11-28 13:49
能技巧不函数,能函数不VBA。这个用排序就可以了,为什么用VBA?

呵呵,很崇拜vba
回复

使用道具 举报

 楼主| 发表于 2014-11-28 16:15 | 显示全部楼层
1091126096 发表于 2014-11-28 13:49
能技巧不函数,能函数不VBA。这个用排序就可以了,为什么用VBA?

给我弄个函数的吧,师傅,简单易懂点的
回复

使用道具 举报

发表于 2014-11-28 16:22 | 显示全部楼层
fanyixiao123 发表于 2014-11-28 16:02
帅  师傅  ,    这没分科目啊           只有“总分”    看到不到   语文 、  数学    、英语  等等    ...

335290-VBA-各科全级前20名-1.rar (43.54 KB, 下载次数: 49)
回复

使用道具 举报

发表于 2014-11-28 16:56 | 显示全部楼层
是要一张表生成所有科目及总分的前20名吧,原表复制若干次?用函数可能比较难,尤其是班名的确定。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 10:27 , Processed in 0.415472 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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