ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 学生成绩按年级人数比例赋等级

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-5 19:32 | 显示全部楼层
yynrzwh 发表于 2024-5-5 18:58
一个学校就一个年级?你也没有年级列

多年级会更复杂呀。感谢你们的支持!

TA的精华主题

TA的得分主题

发表于 2024-5-5 20:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你的要求是按年级人数比例判断等级,
现在年级都确定不了。

TA的精华主题

TA的得分主题

发表于 2024-5-6 11:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Option Explicit

  2. 'https://club.excelhome.net/thread-1691405-1-1.html

  3. Sub test1() '纯个人练习,可以分校分年级处理,但没有年级信息,这里当作同一年级
  4.   
  5.   Dim data, per, num() As Long
  6.   Dim i As Long, j As Long, x As Long, y As Long
  7.   Dim cnt As Long, pos As Long, col As Long, sum_ As Long
  8.   
  9.   per = Application.Rept(Worksheets("分值表").Range("B8:F8").Value, 1)
  10.   ReDim num(LBound(per) To UBound(per))
  11.   
  12.   data = Worksheets("原始成绩").Range("A1").CurrentRegion.Offset(1).Value
  13.   ReDim Preserve data(1 To UBound(data), 1 To UBound(data, 2) + 1)
  14.   
  15.   col = 2
  16.   For j = 4 To UBound(data, 2) - 1
  17.     col = col + 1
  18.     For i = 1 To UBound(data) - 1
  19.       data(i, col) = Replace(data(i, j), "缺考", "")
  20.     Next
  21.   Next
  22.   col = col + 2
  23.   data(1, col - 1) = "总分"
  24.   For i = 2 To UBound(data) - 1
  25.     data(i, col - 1) = ""
  26.     data(i, col) = UBound(data) - i   '最后一列写入降序序号,便于后面排序恢复原来顺序
  27.   Next
  28.   
  29.   QuickSort data, 2, UBound(data) - 1, 1, col, 1, False  '按校排序,若有序则不用
  30.   For j = 4 To col - 2
  31.     pos = 1
  32.     For i = pos + 1 To UBound(data) - 1
  33.       If data(i, 1) <> data(i + 1, 1) Then  '判断学校
  34.         cnt = 0
  35.         sum_ = 0
  36.         QuickSort data, pos + 1, i, 1, col, j, True   '同一校内年级成绩降序
  37.         For y = pos + 1 To i
  38.           If Len(data(y, j)) Then cnt = cnt + 1 Else Exit For  '计算有成绩人数
  39.         Next
  40.         For x = LBound(num) To UBound(num)
  41.           num(x) = per(x) * cnt     '计算有成绩人数内 各等级 人数,总数可能多也可能少(概率大于多)
  42.           '用四舍五入 可能导致人数变多,这里四舍六入五单双 也可能导致人数变多,后面有处理
  43.           sum_ = sum_ + num(x)
  44.         Next
  45.         If sum_ < cnt Then num(UBound(num)) = num(UBound(num)) + (cnt - sum_) '可能人数变少时加在最后一个等级中
  46.         For x = LBound(num) To UBound(num) '按 各等级 人数 写入相应等级
  47.           For y = pos + 1 To pos + num(x)
  48.             data(y, j) = Chr(x + 64)
  49.             data(y, col - 1) = data(y, col - 1) & Chr(x + 64)
  50.             pos = pos + 1
  51.             cnt = cnt - 1
  52.             If cnt = 0 Then Exit For '处理可能 人数多于有效成绩数
  53.           Next
  54.         Next
  55.         pos = i
  56.       End If
  57.     Next
  58.   Next
  59.   
  60.   QuickSort data, 2, UBound(data) - 1, 1, col, col, True  '按写入的序号降序排序,恢复原来顺序
  61.   With Worksheets("成绩等级(效果)").Range("A2")
  62.     .CurrentRegion.Offset(1).Clear 'Contents
  63.     With .Resize(UBound(data) - 1, col - 1)
  64.       .Borders.LineStyle = xlContinuous
  65.       .HorizontalAlignment = xlCenter
  66.       .Font.Name = "宋体"
  67.       .Font.Size = 10
  68.       .Value = data
  69.     End With
  70.   End With
  71.   
  72.   Beep
  73. End Sub

  74. Function QuickSort(ar, u As Long, d As Long, l As Long, r As Long, pCol As Long, Optional Flag As Boolean = True)
  75.   Dim t As Long, b As Long, x As Long, pivot, swap
  76.   t = u
  77.   b = d
  78.   pivot = ar((u + d) \ 2, pCol)
  79.   While t <= b
  80.     If Flag Then        'Order by number Descending
  81.       Do
  82.         If ar(t, pCol) > pivot Then t = t + 1 Else Exit Do
  83.       Loop While t < d
  84.       Do
  85.         If ar(b, pCol) < pivot Then b = b - 1 Else Exit Do
  86.       Loop While b > u
  87.     Else                'Order by text Ascending
  88.       Do
  89.         If StrComp(ar(t, pCol), pivot, vbTextCompare) = -1 Then t = t + 1 Else Exit Do
  90.       Loop While t < d  'vbTextCompare 1  vbBinaryCompare 0
  91.       Do
  92.         If StrComp(pivot, ar(b, pCol), vbTextCompare) = -1 Then b = b - 1 Else Exit Do
  93.       Loop While b > u
  94.     End If
  95.     If t < b Then
  96.       For x = l To r
  97.         swap = ar(t, x): ar(t, x) = ar(b, x): ar(b, x) = swap
  98.       Next
  99.       t = t + 1: b = b - 1
  100.     Else
  101.       If t = b Then t = t + 1: b = b - 1
  102.     End If
  103.   Wend
  104.   If t < d Then QuickSort ar, t, d, l, r, pCol, Flag
  105.   If b > u Then QuickSort ar, u, b, l, r, pCol, Flag
  106. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-7 09:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub test()
  2.     Dim r%, i%
  3.     Dim arr, brr(), crr()
  4.     Dim rng As Range
  5.     Application.ScreenUpdating = False
  6.     Application.DisplayAlerts = False
  7.     With Worksheets("分值表")
  8.         Set rng = .Columns(1).Find(what:="等级", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlPrevious)
  9.         fz = rng.Offset(0, 1).Resize(3, 5)
  10.     End With
  11.     For j = 2 To UBound(fz, 2)
  12.         fz(2, j) = fz(2, j) + fz(2, j - 1)
  13.     Next
  14.     With Worksheets("原始成绩")
  15.         .AutoFilterMode = False
  16.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  17.         c = .Cells(2, .Columns.Count).End(xlToLeft).Column
  18.         arr = .Range("a3").Resize(r - 2, c)
  19.     End With
  20.     ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  21.     For i = 1 To UBound(arr)
  22.         brr(i, 1) = arr(i, 1)
  23.         brr(i, 2) = arr(i, 2)
  24.         brr(i, 3) = arr(i, 4)
  25.     Next
  26.     For j = 5 To UBound(arr, 2)
  27.         m = 0
  28.         For i = 1 To UBound(arr)
  29.             If IsNumeric(arr(i, j)) Then
  30.                 m = m + 1
  31.                 ReDim Preserve crr(1 To m)
  32.                 crr(m) = arr(i, j)
  33.             End If
  34.         Next
  35.         If m > 0 Then
  36.             For k = 1 To UBound(fz, 2)
  37.                 fz(3, k) = Application.Round(Application.Large(crr, UBound(crr) * fz(2, k)), 2)
  38.             Next
  39.         End If
  40.         For i = 1 To UBound(arr)
  41.             If IsNumeric(arr(i, j)) Then
  42.                 For q = 1 To UBound(fz, 2)
  43.                     If arr(i, j) >= fz(3, q) Then
  44.                         brr(i, j - 1) = fz(1, q)
  45.                         brr(i, 8) = brr(i, 8) & brr(i, j - 1)
  46.                         Exit For
  47.                     End If
  48.                 Next
  49.             End If
  50.         Next
  51.     Next
  52.     With Worksheets("成绩等级(效果)")
  53.         .UsedRange.Offset(2, 0).Clear
  54.         .Range("a3").Resize(UBound(brr), UBound(brr, 2)) = brr
  55.     End With
  56. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-5-7 09:06 | 显示全部楼层
参与一下。

成绩赋等级(测试).rar

38.06 KB, 下载次数: 31

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-7 09:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

太感谢了,昨天看到了你几年前回复的一个帖子,麻烦有时间的时候能否看看,名次分布改为各科的,谢谢!
https://club.excelhome.net/thread-1584527-1-1.html

TA的精华主题

TA的得分主题

发表于 2024-5-7 09:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hbszls 发表于 2024-5-7 09:37
太感谢了,昨天看到了你几年前回复的一个帖子,麻烦有时间的时候能否看看,名次分布改为各科的,谢谢!
...

模拟结果传上来。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-7 10:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chxw68 发表于 2024-5-7 09:43
模拟结果传上来。

这是你前几年回复的一个帖子,以前是以总分做的名次分布,现在想改为各科目的名次分布。谢谢!

成绩分析表(名次分布).rar

95.83 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-5-7 11:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修改好了。

成绩分析表(名次分布).rar

94.47 KB, 下载次数: 16

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-7 15:03 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 07:28 , Processed in 0.046427 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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