ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 高考成绩上线VBA解决(感谢褚老师和小刀老师)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-1 15:24 | 显示全部楼层 |阅读模式
本帖最后由 vvw123 于 2018-12-2 20:10 编辑

用公式处理,慢,工作表大,请大侠用VBA指点指点。
根据分数线填充对应等级,
例如理科生:总分620,那么上线就是“前X名”,该生语文100,那么语文的上线就是“重点”,

成绩分析高中版.rar

42.16 KB, 下载次数: 78

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-1 16:11 | 显示全部楼层
条件不够,理科班级排是指仅在理科班还是在所有班级里级排,看了一下这问题非常繁琐,,,

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 16:17 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-12-1 16:11
条件不够,理科班级排是指仅在理科班还是在所有班级里级排,看了一下这问题非常繁琐,,,

感谢帮助,级排是指理科类班级排名。因为文理分科,相同科目的语文,英语,数学三科试卷都不同,都分文理了。文科类还考政治,历史,地理。理科类考物理化学生物。

TA的精华主题

TA的得分主题

发表于 2018-12-1 17:05 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("设置")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a2:g" & r)
  9.     vs = [{"专科","本科","重点","前X名","第一名"}]
  10.   End With
  11.   For i = 2 To UBound(arr)
  12.     If Not d.exists(arr(i, 1)) Then
  13.       Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  14.     End If
  15.     Select Case arr(i, 2)
  16.       Case "物理", "政治"
  17.         km = "物政"
  18.       Case "化学", "历史"
  19.         km = "化历"
  20.       Case "生物", "地理"
  21.         km = "生地"
  22.       Case "理数", "文数"
  23.         km = "数学"
  24.       Case "理综", "文综"
  25.         km = "综合"
  26.       Case Else
  27.         km = arr(i, 2)
  28.     End Select
  29.     d(arr(i, 1))(km) = Array(arr(i, 7), arr(i, 6), arr(i, 5), arr(i, 4), arr(i, 3))
  30.   Next
  31.   With Worksheets("成绩表")
  32.     r = .Cells(.Rows.Count, 3).End(xlUp).Row
  33.     .Range("o4:ag" & r).ClearContents
  34.     arr = .Range("a2:ag" & r)
  35.     For i = 3 To UBound(arr)
  36.       If d.exists(arr(i, 3)) Then
  37.         For j = 7 To 13
  38.           If d(arr(i, 3)).exists(arr(1, j)) Then
  39.             brr = d(arr(i, 3))(arr(1, j))
  40.             n = Application.Match(arr(i, j), brr)
  41.             If Not IsError(n) Then
  42.               arr(i, j * 2 + 7) = vs(n)
  43.             End If
  44.           End If
  45.         Next
  46.       End If
  47.     Next
  48.     .Range("a2").Resize(UBound(arr), UBound(arr, 2)) = arr
  49.   End With
  50. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-1 17:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
只写了上线代码,不知道结果正确与否,级排没看懂意思。

成绩分析高中版.rar

61.77 KB, 下载次数: 40

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 17:09 来自手机 | 显示全部楼层
chxw68 发表于 2018-12-1 17:06
只写了上线代码,不知道结果正确与否,级排没看懂意思。

谢谢褚老师,今天小红花只有一分,明天再送上。

TA的精华主题

TA的得分主题

发表于 2018-12-1 17:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
vvw123 发表于 2018-12-1 17:09
谢谢褚老师,今天小红花只有一分,明天再送上。

你详细说明一下级排是怎么排的?

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-1 17:22 | 显示全部楼层
本帖最后由 一把小刀闯天下 于 2018-12-1 17:24 编辑
vvw123 发表于 2018-12-1 16:17
感谢帮助,级排是指理科类班级排名。因为文理分科,相同科目的语文,英语,数学三科试卷都不同,都分文理 ...

'褚老师写了上线代码,我正好写了个排名,上线看上去晕,那就不写了,,,

'自己测试一下
Option Explicit

Sub test()
  Dim arr, i, j, k, temp, pos, a, b
  With Sheets("成绩表")
    arr = .Range("c4:ah" & .Cells(Rows.Count, "c").End(xlUp).Row + 1)
  End With
  temp = arr
  For i = 1 To UBound(arr, 1) - 1: arr(i, 32) = i: Next
  pos = Array(12, 13, 5, 18, 6, 20, 7, 22, 8, 24, 9, 26, 10, 28, 11, 30) '级排
  Call msort(arr, temp, 1, UBound(arr, 1) - 1, 1, UBound(arr, 2), 1, False) '类别降序
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 1) <> arr(j + 1, 1) Then
        For k = 0 To UBound(pos) Step 2
          Call msort(arr, temp, i, j, 1, UBound(arr, 2), pos(k), False) '同类别年级指定科目降序
          Call rank(arr, i, j, pos(k), pos(k + 1)) '指定科目排名
        Next
        Call msort(arr, temp, i, j, 1, UBound(arr, 2), 3, True) '同类别按班级升序
        For a = i To j
          For b = a To j
            If arr(b, 1) <> arr(b + 1, 1) Or arr(b, 3) <> arr(b + 1, 3) Then
              Call msort(arr, temp, a, b, 1, UBound(arr, 2), 12, False) '同类别班级总分降序
              Call rank(arr, a, b, 12, 14) '总分班排
              a = b: Exit For
            End If
        Next b, a
        i = j: Exit For
      End If
  Next j, i
  Call msort(arr, temp, 1, UBound(arr, 1) - 1, 1, UBound(arr, 2), 32, True) '恢复
  Sheets("成绩表").[c4].Resize(UBound(arr, 1) - 1, UBound(arr, 2) - 1) = arr
End Sub

Function rank(arr, first, last, key, col)
  Dim i, j, m
  m = 1: arr(first, col) = 1
  For i = first + 1 To last
    m = m + 1
    arr(i, col) = IIf(arr(i, key) = arr(i - 1, key), arr(i - 1, col), m)
  Next
End Function

Function msort(arr, temp, first, last, left, right, key, order)
  Dim i As Long, j As Long, k As Long, kk As Long, mid As Long
  If first <> last Then
    mid = Int((first + last) / 2)
    msort arr, temp, first, mid, left, right, key, order
    msort arr, temp, mid + 1, last, left, right, key, order
    i = first: j = mid + 1: k = first
    While i <= mid And j <= last
      If arr(i, key) > arr(j, key) Xor order Then
        For kk = left To right: temp(k, kk) = arr(i, kk): Next
        k = k + 1: i = i + 1
      Else
        For kk = left To right: temp(k, kk) = arr(j, kk): Next
        k = k + 1: j = j + 1
      End If
    Wend
    While i <= mid
      For kk = left To right: temp(k, kk) = arr(i, kk): Next
      k = k + 1: i = i + 1
    Wend
    While j <= last
      For kk = left To right: temp(k, kk) = arr(j, kk): Next
      k = k + 1: j = j + 1
    Wend
    For i = first To last
      For j = left To right
        arr(i, j) = temp(i, j)
    Next j, i
  End If
End Function

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 17:28 | 显示全部楼层
一把小刀闯天下 发表于 2018-12-1 17:22
'褚老师写了上线代码,我正好写了个排名,上线看上去晕,那就不写了,,,

'自己测试一下

谢谢老师,今天小红花送完了,明天再送。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 17:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chxw68 发表于 2018-12-1 17:22
你详细说明一下级排是怎么排的?

谢谢褚老师,是这样排的:所有同类的排名,例如:所有理科的作为一类来排名,
公式是这样的:
  1. =SUM(($C$4:$C$999=$C4)*(N$4:N$999<>"")*(N$4:N$999>N4))+1
复制代码

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

本版积分规则

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

GMT+8, 2024-5-5 02:59 , Processed in 0.052016 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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