ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求助各位大神,教师积分计算

[复制链接]

TA的精华主题

TA的得分主题

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

完美,再次感谢禇老师!!!

TA的精华主题

TA的得分主题

发表于 2024-6-22 19:13 来自手机 | 显示全部楼层
留下脚印学习了。

TA的精华主题

TA的得分主题

发表于 2024-6-22 20:09 来自手机 | 显示全部楼层
简单说下步骤:  字典记录学校-科目-教师的全部分数,求平均,存入学校-科目字典用于排名,同时记录教师的人数。最后计算排名,输出积分,排名等信息

TA的精华主题

TA的得分主题

发表于 2024-6-22 22:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-23 02:31 | 显示全部楼层
image.png 类设计

Cteacher类
  1. Public info As Object
  2. Private Sub Class_Initialize()
  3.     Set info = CreateObject("Scripting.Dictionary")
  4.     info("序号") = 0
  5.     info("学校") = ""
  6.     info("姓名") = ""
  7.     info("任教科目数") = 0
  8.     info("总积分") = 0
  9.     Set info("任教信息") = CreateObject("Scripting.Dictionary")
  10. End Sub

  11. Private Sub Class_Terminate()
  12.     Set info = Nothing
  13. End Sub
复制代码

Csubject类
  1. Public info As Object
  2. Private Sub Class_Initialize()
  3.     Set info = CreateObject("Scripting.Dictionary")
  4.     info("年级") = 0
  5.     info("科目") = ""
  6.     info("排名") = 0
  7.     info("积分") = 0
  8.     info("输出序号") = 0
  9.     info("任教班级数") = 0
  10.     info("任教班级分数") = "" '串接
  11.     info("任教班级均分") = 0
  12.     info("同级同科教师数量") = 0
  13.     info("同级同科教师均分") = "" '串接
  14. End Sub
  15. Public Sub GetAverage()
  16.     info("任教班级均分") = Round(Application.Evaluate(info("任教班级分数")) / info("任教班级数"), 2)
  17. End Sub
  18. Public Sub GetScore()
  19.     '积分计算
  20.     info("积分") = Round((info("同级同科教师数量") - info("排名") + 1) / info("同级同科教师数量") * 6, 2)
  21. End Sub
  22. Public Sub GetRank()
  23.     'Debug.Print info("任教班级均分")
  24.     xxx = Split(info("同级同科教师均分"), "+")
  25.     'Stop
  26.     info("排名") = CustomRank(Round(Val(info("任教班级均分")), 2), Split(info("同级同科教师均分"), "+"))
  27. End Sub
  28. Private Function CustomRank(ByVal n As Variant, ByVal ar As Variant) As Integer
  29.     Set d = CreateObject("Scripting.Dictionary")
  30.     For Each a In ar
  31.         k = Round(Val(a), 2)
  32.         d(k) = d(k) + 1
  33.     Next
  34.     For Each k In d.keys
  35.         If k > n Then
  36.             Count = Count + d(k)
  37.         End If
  38.     Next k
  39.     CustomRank = Count + 1
  40. End Function
  41. Private Sub Class_Terminate()
  42.     Set info = Nothing
  43. End Sub
复制代码


模块代码
  1. Public Sub 又长又臭啊2()
  2.     Dim d, d2
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     Set d2 = CreateObject("Scripting.Dictionary") 'array(人数,均分字符)
  5.     Dim wb As Workbook, sht As Worksheet
  6.     Dim t As cTeacher
  7.     Dim s As cSubject
  8.     Set wb = Application.ThisWorkbook
  9.     Set sht = wb.Worksheets("数据")
  10.     With sht
  11.         eRow = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
  12.         ecol = .Cells(4, .Columns.Count).End(xlToLeft).Column
  13.         For j = 5 To ecol
  14.             If .Cells(3, j).Value <> "" Then
  15.                 sbj = .Cells(3, j).Value
  16.                 For i = 5 To eRow
  17.                     If .Cells(i, 1).Value <> "" Then sch = .Cells(i, 1).Value
  18.                     If .Cells(i, j).Value <> "" Then
  19.                         tch = .Cells(i, j).Value
  20.                         gra = .Cells(i, 2).Value
  21.                         key1 = gra & sbj
  22.                         If Not d2.Exists(key1) Then
  23.                             d2(key1) = Array(1, 0, "|" & key1 & tch & "|")
  24.                         Else
  25.                             ar = d2(key1)
  26.                             If InStr(ar(2), "|" & key1 & tch & "|") = 0 Then
  27.                                 ar(0) = ar(0) + 1
  28.                                 ar(2) = ar(2) & "|" & key1 & tch & "|"
  29.                             End If
  30.                             d2(key1) = ar
  31.                         End If
  32.                         If Not d.Exists(tch) Then
  33.                             Set t = New cTeacher
  34.                             t.info("学校") = sch
  35.                             t.info("姓名") = tch
  36.                             t.info("序号") = d.Count + 1
  37.                             Set s = New cSubject
  38.                             s.info("年级") = gra
  39.                             s.info("科目") = sbj
  40.                             s.info("任教班级数") = 1
  41.                             s.info("任教班级分数") = .Cells(i, j + 1).Value
  42.                             Set t.info("任教信息")(key1) = s
  43.                             Set d(tch) = t
  44.                             '做一系列判断
  45.                         Else
  46.                             Set t = d(tch) '取出老师
  47.                             If Not t.info("任教信息").Exists(key1) Then
  48.                                 Set s = New cSubject
  49.                                 s.info("年级") = gra
  50.                                 s.info("科目") = sbj
  51.                                 s.info("任教班级数") = 1
  52.                                 s.info("任教班级分数") = .Cells(i, j + 1).Value
  53.                                 Set t.info("任教信息")(key1) = s
  54.                             Else
  55.                                 Set s = t.info("任教信息")(key1)
  56.                                 s.info("任教班级数") = s.info("任教班级数") + 1
  57.                                 s.info("任教班级分数") = s.info("任教班级分数") & "+" & .Cells(i, j + 1).Value
  58.                                 Set t.info("任教信息")(key1) = s
  59.                             End If
  60.                             Set d(tch) = t
  61.                         End If
  62.                     End If
  63.                 Next i
  64.             End If
  65.         Next j
  66.     End With
  67.     'Stop
  68.     For Each tch In d
  69.         Set t = d(tch)
  70.         t.info("任教科目数") = t.info("任教信息").Count
  71.         For Each sb In t.info("任教信息")
  72.             Set s = t.info("任教信息")(sb)
  73.             s.info("同级同科教师数量") = d2(sb)(0)
  74.             s.GetAverage
  75.             ar = d2(sb)
  76.             ar(1) = ar(1) & "+" & s.info("任教班级均分") '均分送入公共字典
  77.             d2(sb) = ar
  78.             'Set t.info("任教信息")(sb) = s
  79.         Next sb
  80.         'Set d(tch) = t
  81.     Next tch
  82.     For Each tch In d
  83.         Set t = d(tch)
  84.         mysum = 0
  85.         For Each sb In t.info("任教信息")
  86.             Set s = t.info("任教信息")(sb)
  87.             ar = d2(sb)
  88.             s.info("同级同科教师均分") = ar(1)
  89.             s.GetRank
  90.             s.GetScore
  91.             mysum = mysum + s.info("积分")
  92.         Next sb
  93.         t.info("总积分") = mysum / t.info("任教科目数")
  94.     Next tch
  95.     '------------------------------------------------------------输出结果
  96.     Set sht = wb.Worksheets("结果")
  97.     With sht
  98.         .UsedRange.Offset(3).Clear
  99.         r = 3
  100.         For Each tch In d
  101.             Set t = d(tch)
  102.             For Each sb In t.info("任教信息")
  103.                 Set s = t.info("任教信息")(sb)
  104.                 t.info("输出序号") = t.info("输出序号") + 1
  105.                 If t.info("输出序号") = 1 Then
  106.                     r = r + 1  '新起一行
  107.                     '左侧输出
  108.                     sht.Cells(r, 1).Value = t.info("序号")
  109.                     sht.Cells(r, 2).Value = t.info("学校")
  110.                     sht.Cells(r, 3).Value = t.info("姓名")
  111.                 End If
  112.                 c = 3 + (t.info("输出序号") - 1) * 5 + 1
  113.                 sht.Cells(r, c).Value = s.info("年级")
  114.                 sht.Cells(r, c + 1).Value = s.info("科目")
  115.                 sht.Cells(r, c + 2).Value = s.info("同级同科教师数量")
  116.                 sht.Cells(r, c + 3).Value = s.info("排名")
  117.                 sht.Cells(r, c + 4).Value = s.info("积分")
  118.             Next sb
  119.             sht.Cells(r, 24).Value = t.info("总积分")
  120.         Next tch
  121.         With .Range("a3").CurrentRegion
  122.             .Borders.LineStyle = 1
  123.             .HorizontalAlignment = 3
  124.         End With
  125.     End With
  126. End Sub
复制代码

效果
240623 023044.gif

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-23 16:24 | 显示全部楼层

虽然是看不懂,但还是感谢大师的帮助。

TA的精华主题

TA的得分主题

发表于 2024-6-24 12:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
WPS里的JSA练习一下——


微信截图_20240624121740.png

QQ截图20240624121454.png


20240624_积分.rar

53.52 KB, 下载次数: 4

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 18:32 , Processed in 0.047346 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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