ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 从总成绩表中提取获奖名单

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-21 23:34 | 显示全部楼层 |阅读模式
本帖最后由 yellowhawk 于 2019-10-22 11:27 编辑

我想从总成绩表中按要求提取获奖名单,请各位高手指导!
总表中的L、M、N列是我筛选的辅助列。

从总成绩表中列出获奖名单.rar

22.37 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2019-10-22 08:44 | 显示全部楼层
供参考。。。。。。

从总成绩表中列出获奖名单.zip

41.56 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-22 08:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一个人还能多次获奖啊?

TA的精华主题

TA的得分主题

发表于 2019-10-22 08:56 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%, m%, x%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Dim flg As Boolean
  6.   Application.ScreenUpdating = False
  7.   Application.DisplayAlerts = False
  8.   Set d = CreateObject("scripting.dictionary")
  9.   Set d1 = CreateObject("scripting.dictionary")
  10.   With Worksheets("总表")
  11.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  12.     arr = .Range("a2:k" & r)
  13.   End With
  14.   ReDim brr(1 To UBound(arr), 1 To 3)
  15.   For i = 2 To UBound(arr)
  16.     If Len(arr(i, 11)) <> 0 Then
  17.       d(arr(i, 11)) = d(arr(i, 11)) + 1
  18.     End If
  19.   Next
  20.   nn = 1
  21.   kk = d.keys
  22.   For k = 0 To UBound(kk)
  23.     mm = Application.Large(kk, k + 1)
  24.     ss = d(mm)
  25.     d(mm) = nn
  26.     nn = nn + ss
  27.   Next
  28.   For i = 2 To UBound(arr)
  29.     If Len(arr(i, 11)) <> 0 Then
  30.       brr(i, 1) = d(arr(i, 11))
  31.     End If
  32.     n = 0
  33.     For j = 3 To 9
  34.       If Len(arr(i, j)) <> 0 Then
  35.         n = n + 1
  36.         brr(i, 2) = brr(i, 2) + arr(i, j)
  37.         If IsEmpty(brr(i, 3)) Then
  38.           brr(i, 3) = arr(i, j)
  39.         Else
  40.           If brr(i, 3) > arr(i, j) Then
  41.             brr(i, 3) = arr(i, j)
  42.           End If
  43.         End If
  44.       End If
  45.     Next
  46.     If n <> 0 Then
  47.       brr(i, 2) = Round(brr(i, 2) / n, 2)
  48.     End If
  49.   Next
  50.   d.RemoveAll
  51.   ywmax = Application.Max(Application.Index(arr, 0, 4))
  52.   For i = 2 To UBound(arr)
  53.     If brr(i, 1) <= 10 Then
  54.       If Not d.exists("一类") Then
  55.         m = 1
  56.         ReDim crr(1 To 12, 1 To m)
  57.       Else
  58.         crr = d("一类")
  59.         m = UBound(crr, 2) + 1
  60.         ReDim Preserve crr(1 To 12, 1 To m)
  61.       End If
  62.       For j = 1 To 11
  63.         crr(j, m) = arr(i, j)
  64.       Next
  65.       If brr(i, 1) = 1 Then
  66.         crr(12, m) = "学神奖"
  67.       Else
  68.         crr(12, m) = "学霸奖"
  69.       End If
  70.       d("一类") = crr
  71.     End If
  72.     For j = 3 To 9
  73.       flg = False
  74.       Select Case arr(1, j)
  75.         Case "语文"
  76.           If arr(i, j) = ywmax And arr(i, j) >= 135 Then
  77.             flg = True
  78.           End If
  79.         Case "数学", "英语"
  80.           If arr(i, j) = 120 Then
  81.             flg = True
  82.           End If
  83.         Case Else
  84.           If arr(i, j) = 100 Then
  85.             flg = True
  86.           End If
  87.       End Select
  88.       If flg Then
  89.         If Not d.exists("二类") Then
  90.           m = 1
  91.           ReDim crr(1 To 13, 1 To m)
  92.         Else
  93.           crr = d("二类")
  94.           m = UBound(crr, 2) + 1
  95.           ReDim Preserve crr(1 To 13, 1 To m)
  96.         End If
  97.         For k = 1 To 11
  98.           crr(k, m) = arr(i, k)
  99.         Next
  100.         crr(12, m) = arr(1, j) & "单科王"
  101.         crr(13, m) = j
  102.         d("二类") = crr
  103.       End If
  104.     Next
  105.     x = -1
  106.     If brr(i, 2) >= 90 And brr(i, 3) >= 80 Then
  107.       x = 1
  108.     ElseIf brr(i, 2) >= 85 And brr(i, 3) >= 70 Then
  109.       x = 2
  110.     ElseIf brr(i, 2) >= 80 And brr(i, 3) >= 60 Then
  111.       x = 3
  112.     ElseIf brr(i, 2) >= 70 And brr(i, 3) >= 60 Then
  113.       x = 4
  114.     End If
  115.     If x <> -1 Then
  116.       If Not d.exists("三类") Then
  117.         m = 1
  118.         ReDim crr(1 To 13, 1 To m)
  119.       Else
  120.         crr = d("三类")
  121.         m = UBound(crr, 2) + 1
  122.         ReDim Preserve crr(1 To 13, 1 To m)
  123.       End If
  124.       For k = 1 To 11
  125.         crr(k, m) = arr(i, k)
  126.       Next
  127.       crr(12, m) = Application.Choose(x, "一等奖", "二等奖", "三等奖", "优秀奖")
  128.       crr(13, m) = x
  129.       d("三类") = crr
  130.     End If
  131.       
  132.   Next
  133.   
  134.   With Worksheets("获奖名单")
  135.     .UsedRange.Offset(2, 0).Clear
  136.     .Select
  137.     m = 3
  138.     For Each aa In Array("一类", "二类", "三类")
  139.       If d.exists(aa) Then
  140.         crr = d(aa)
  141.         ReDim drr(1 To UBound(crr, 2), 1 To UBound(crr))
  142.         For i = 1 To UBound(crr)
  143.           For j = 1 To UBound(crr, 2)
  144.             drr(j, i) = crr(i, j)
  145.           Next
  146.         Next
  147.         Select Case aa
  148.           Case "一类"
  149.             .Cells(m, 1) = "一类:第一名为学神奖,第二至十名为学霸奖"
  150.           Case "二类"
  151.             .Cells(m, 1) = "二类:单科王,语文成绩大于135分且为第一名为单科王,其他科目为满分为才为单科王,数学、英语总分120,其他科目100,体育不计"
  152.           Case "三类"
  153.             .Cells(m, 1) = "三类:一等奖科平均分90分,最低分大于等于80的;二等奖科平85分以上,最低分70的;三等奖科平80的,最低分60;优秀奖科平70,最低分60"
  154.         End Select
  155.         With .Cells(m + 1, 1).Resize(UBound(drr), UBound(drr, 2))
  156.           .Value = drr
  157.           Select Case aa
  158.             Case "一类"
  159.               .Sort key1:=.Cells(m + 1, 11), order1:=xlDescending, Header:=xlNo
  160.             Case "二类", "三类"
  161.               .Sort key1:=.Cells(m + 1, 13), order1:=xlAscending, Header:=xlNo
  162.           End Select
  163.         End With
  164.        m = m + UBound(drr) + 1
  165.       End If
  166.     Next
  167.     .Columns(13).Clear
  168.   End With
  169.   Application.ScreenUpdating = True
  170.   MsgBox "成绩统计完毕!"
  171. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-22 08:57 | 显示全部楼层
详见附件。

从总成绩表中列出获奖名单.rar

39.18 KB, 下载次数: 27

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-22 11:22 | 显示全部楼层
约定的童话 发表于 2019-10-22 08:46
一个人还能多次获奖啊?

当然是可以的,既是学霸,也是单科王,这应该是可以的呀

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-22 11:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-22 11:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liulang0808 发表于 2019-10-22 08:44
供参考。。。。。。

非常感谢您的指导!!!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-22 11:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-22 14:36 | 显示全部楼层

刚才试了一下,如果没有参加考试的成绩为空,也会列入学霸奖中,我看了一下,原因是
    If brr(i, 1) <= 10 Then
      If Not d.exists("一类") Then
        m = 1
<=10,这里,应该还要大于0
    是否可以奖这一句 If brr(i, 1) <= 10 Then
改为:
       if brr(i,1)<=10 and brr(i,1)>0 then
   (我是初学者,错了别笑我!)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 19:12 , Processed in 0.047745 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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