ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请帮忙做个统计成绩表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-21 21:01 | 显示全部楼层 |阅读模式
月考在即,请各位老师帮个大忙,用VBA解决我们年段成绩统计问题,感谢万分。

成绩统计分析1.rar

31.38 KB, 下载次数: 35

TA的精华主题

TA的得分主题

发表于 2018-3-21 21:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
工作量不小!

TA的精华主题

TA的得分主题

发表于 2018-3-21 21:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯嗯 太复杂了

TA的精华主题

TA的得分主题

发表于 2018-3-21 21:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-21 21:27 | 显示全部楼层
建议二维表转成一维表,然后用数据透视表做

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-21 21:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
辛苦各位老师,大家齐心协力帮下忙,我们老师的电脑太旧了,运行起公式就和蜗牛一样啊!

TA的精华主题

TA的得分主题

发表于 2018-3-21 22:28 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Application.ScreenUpdating = False
  6.   Application.DisplayAlerts = False
  7.   Set d = CreateObject("scripting.dictionary")
  8.   With Worksheets("成绩输入")
  9.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  10.     arr = .Range("a2:l" & r)
  11.   End With
  12.   ReDim brr(1 To UBound(arr), 1 To 7)
  13.   For i = 1 To UBound(arr)
  14.     brr(i, 1) = arr(i, 1)
  15.     For j = 4 To UBound(arr, 2)
  16.       brr(i, 2) = brr(i, 2) + arr(i, j)
  17.     Next
  18.     For j = 4 To 6
  19.       brr(i, 4) = brr(i, 4) + arr(i, j)
  20.     Next
  21.     brr(i, 4) = brr(i, 4) + arr(i, 8) * 0.6 + arr(i, 9) * 0.4
  22.     brr(i, 3) = brr(i, 4)
  23.     For Each y In Array(7, 10, 11, 12)
  24.       If arr(i, y) >= 85 Then
  25.         brr(i, 3) = brr(i, 3) + 5
  26.       ElseIf arr(i, y) >= 75 Then
  27.         brr(i, 3) = brr(i, 3) + 2
  28.       End If
  29.     Next
  30.   Next
  31.   For j = 2 To 4
  32.     d.RemoveAll
  33.     For i = 1 To UBound(arr)
  34.       d(brr(i, j)) = d(brr(i, j)) + 1
  35.     Next
  36.     nn = 1
  37.     kk = d.keys
  38.     For k = 0 To UBound(kk)
  39.       mm = Application.Large(kk, k + 1)
  40.       ss = d(mm)
  41.       d(mm) = nn
  42.       nn = nn + ss
  43.     Next
  44.     For i = 1 To UBound(arr)
  45.       brr(i, j + 3) = d(brr(i, j))
  46.     Next
  47.   Next
  48.   d.RemoveAll
  49.   For j = 5 To 7
  50.     If Not d.exists(j) Then
  51.       Set d(j) = CreateObject("scripting.dictionary")
  52.     End If
  53.     For i = 1 To UBound(brr)
  54.       If Not d(j).exists(brr(i, 1)) Then
  55.         ReDim crr(1 To 24)
  56.         crr(1) = brr(i, 1)
  57.         crr(2) = "班"
  58.       Else
  59.         crr = d(j)(brr(i, 1))
  60.       End If
  61.       n = Application.Match(brr(i, j), Array(0, 16, 31, 46, 61, 76, 91, 106, 121, 136, 151, 181, 211, 241, 271, 301, 331, 361, 401, 451, 501, 551, 601))
  62.       If Not IsError(n) Then
  63.         crr(n + 2) = crr(n + 2) + 1
  64.       End If
  65.       d(j)(brr(i, 1)) = crr
  66.     Next
  67.   Next
  68.   
  69.   For Each aa In d.keys
  70.     ReDim brr(1 To d(aa).Count, 1 To 24)
  71.     m = 0
  72.     For Each bb In d(aa).keys
  73.       m = m + 1
  74.       crr = d(aa)(bb)
  75.       For j = 4 To UBound(crr)
  76.         crr(j) = crr(j) + crr(j - 1)
  77.       Next
  78.       For j = 1 To UBound(crr)
  79.         brr(m, j) = crr(j)
  80.       Next
  81.     Next
  82.     d(aa) = brr
  83.   Next
  84.    
  85.   q = 0
  86.   With Worksheets("班总分排名")
  87.     .Cells.Clear
  88.     m = 1
  89.     For Each aa In d.keys
  90.       q = q + 1
  91.       brr = d(aa)
  92.       With .Cells(m, 1)
  93.         .Value = "九年级第一次月考" & Application.Choose(q, "班级总分", "加权A总分", "加权B总分") & "排名表"
  94.         .Resize(1, 24).Merge
  95.         With .Font
  96.           .Size = 20
  97.           .Bold = True
  98.         End With
  99.       End With
  100.       .Cells(m + 1, 1).Resize(1, 24) = [{" 前若干名","","15名","30名","45名","60名","75名","90名","105名","120名","135名","150名","180名","210名","240名","270名","300名","330名","360名","400名","450名","500名","550名","600名"}]
  101.       .Cells(m + 2, 1).Resize(UBound(brr), UBound(brr, 2)) = brr
  102.       With .Cells(m + 1, 1).Resize(UBound(brr) + 1, 24)
  103.         .Borders.LineStyle = xlContinuous
  104.       End With
  105.       m = m + UBound(brr) + 3
  106.     Next
  107.     With .UsedRange
  108.       .HorizontalAlignment = xlCenter
  109.       .VerticalAlignment = xlCenter
  110.     End With
  111.   End With
  112.   Application.ScreenUpdating = True
  113.   MsgBox "数据统计完毕!"
  114. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-21 22:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最近很忙,只写了班总分排名统计,算是抛砖引玉吧。

成绩统计分析1.rar

63.87 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-22 08:33 | 显示全部楼层
  1. Sub test2()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Application.ScreenUpdating = False
  6.   Application.DisplayAlerts = False
  7.   Set d = CreateObject("scripting.dictionary")
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   fs = [{0,60,75,85}]
  10.   dj = [{"D",0;"C",0;"B",2;"A",5}]
  11.   
  12.   With Worksheets("总分名次A")
  13.     c = .Cells(3, .Columns.Count).End(xlToLeft).Column
  14.     bt = .Range("a2").Resize(2, c)
  15.     For j = 1 To UBound(bt, 2)
  16.       If Len(bt(1, j)) <> 0 Then
  17.         d1(bt(1, j)) = j
  18.       End If
  19.     Next
  20.   End With
  21.   With Worksheets("成绩输入")
  22.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  23.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  24.     arr = .Range("a1").Resize(r, c)
  25.   End With
  26.   ReDim brr(1 To UBound(arr) - 1, 1 To UBound(bt, 2))
  27.   For j = 1 To UBound(arr, 2)
  28.     If d1.exists(arr(1, j)) Then
  29.       n = d1(arr(1, j))
  30.       For i = 2 To UBound(arr)
  31.         brr(i - 1, n) = arr(i, j)
  32.       Next
  33.     End If
  34.   Next
  35.   For j = 19 To 34 Step 5
  36.     For i = 1 To UBound(brr)
  37.       If Len(brr(i, j)) <> 0 Then
  38.         n = Application.Match(brr(i, j), fs)
  39.         If Not IsError(n) Then
  40.           brr(i, j + 3) = dj(n, 1)
  41.           brr(i, j + 4) = dj(n, 2)
  42.         End If
  43.       End If
  44.     Next
  45.   Next
  46.   
  47.   For i = 1 To UBound(brr)
  48.     For j = 4 To 16 Step 3
  49.       brr(i, 39) = brr(i, 39) + brr(i, j)
  50.     Next
  51.     For j = 19 To 34 Step 5
  52.       brr(i, 39) = brr(i, 39) + brr(i, j)
  53.     Next
  54.     For j = 4 To 10 Step 3
  55.       brr(i, 42) = brr(i, 42) + brr(i, j)
  56.     Next
  57.     brr(i, 42) = brr(i, 42) + brr(i, 13) * 0.6 + brr(i, 16) * 0.4
  58.     For j = 19 To 34 Step 5
  59.       brr(i, 42) = brr(i, 42) + brr(i, j + 4)
  60.     Next
  61.   Next
  62.   For j = 4 To 42
  63.     If Len(bt(1, j)) <> 0 Then
  64.       d.RemoveAll
  65.       d1.RemoveAll
  66.       For i = 1 To UBound(brr)
  67.         If Len(brr(i, j)) <> 0 Then
  68.           If Not d.exists(brr(i, 1)) Then
  69.             Set d(brr(i, 1)) = CreateObject("scripting.dictionary")
  70.           End If
  71.           d(brr(i, 1))(brr(i, j)) = d(brr(i, 1))(brr(i, j)) + 1
  72.           d1(brr(i, j)) = d1(brr(i, j)) + 1
  73.         End If
  74.       Next
  75.       For Each aa In d.keys
  76.         nn = 1
  77.         kk = d(aa).keys
  78.         For k = 0 To UBound(kk)
  79.           mm = Application.Large(kk, k + 1)
  80.           ss = d(aa)(mm)
  81.           d(aa)(mm) = nn
  82.           nn = nn + ss
  83.         Next
  84.       Next
  85.       nn = 1
  86.       kk = d1.keys
  87.       For k = 0 To UBound(kk)
  88.         mm = Application.Large(kk, k + 1)
  89.         ss = d1(mm)
  90.         d1(mm) = nn
  91.         nn = nn + ss
  92.       Next
  93.       For i = 1 To UBound(brr)
  94.         If Len(brr(i, j)) <> 0 Then
  95.           brr(i, j + 1) = d(brr(i, 1))(brr(i, j))
  96.           brr(i, j + 2) = d1(brr(i, j))
  97.         End If
  98.       Next
  99.     End If
  100.   Next
  101.   
  102.   With Worksheets("总分名次A")
  103.     .Range("a4").Resize(UBound(brr), UBound(brr, 2)) = brr
  104.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  105.     With .Range("a2:av" & r)
  106.       .Borders.LineStyle = xlContinuous
  107.       With .Font
  108.         .Size = 9
  109.       End With
  110.     End With
  111.     With .UsedRange
  112.       .HorizontalAlignment = xlCenter
  113.       .VerticalAlignment = xlCenter
  114.     End With
  115.   End With
  116. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-22 08:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做了总分名次A的代码。

成绩统计分析1.rar

95.35 KB, 下载次数: 5

评分

1

查看全部评分

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 19:18 , Processed in 0.048463 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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