ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求教:如何通过VBA将成绩录入汇总表分拆成各班各科成绩单?谢谢!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-22 21:48 | 显示全部楼层 |阅读模式
求教:如何通过VBA将成绩录入汇总表分拆成各班各科成绩单?谢谢!
我发的附件只是部分数据,实际上学生数有几千人,班级上百个。所以希望能用 VBA 来完成。谢谢

2018秋五年级第一次月考成绩表.zip

62.01 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2019-1-22 21:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你这是要按B列班序号分表,还是按C列班级分表

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-22 21:57 | 显示全部楼层
micch 发表于 2019-1-22 21:55
你这是要按B列班序号分表,还是按C列班级分表

按C列班级分表,谢谢!

TA的精华主题

TA的得分主题

发表于 2019-1-22 22:56 | 显示全部楼层
如果是根据录入表,生成其他的表,那工作量就大多了,因为那些统计数据太零碎了。

如果假设各个分表已经做好格式,只是把所有人姓名和分数分到对应的表当中还容易一些,

TA的精华主题

TA的得分主题

发表于 2019-1-22 23:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
很简单得问题   楼主是位老师吧  
1  求助要求不明白  结果是拆分成工作簿   还是放在原工作簿中
2  建议以后求助的同时  也上传想要实现的效果模拟附件
3  就像你所教的小学生一样  你想让学生画一个葫芦  你得先说明要求  再拿出一个实际的葫芦  学生才能照着画  否则学生画出的结果就是  有些像梨  有些像桃子......因为有些学生没见过真正的葫芦

TA的精华主题

TA的得分主题

发表于 2019-1-22 23:40 | 显示全部楼层
假设你的分表已经做好,格式也有了,代码直接填入数据;
注意:代码结果和你模拟的结果人名顺序不同,不知道模拟结果是什么顺序。代码执行后代码生成数据会覆盖分表的【a9:p33】区域原来的数据。
如果分表没建立,可以增加一段新建分表的代码,太晚了就不写了。

  1. Sub test()
  2.     Dim i%, j%, n%, m%, x$
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set dn = CreateObject("scripting.dictionary")
  5.     arr = Sheet1.UsedRange
  6.         For i = 4 To UBound(arr)
  7.             For j = 7 To 13 Step 2
  8.                 x = Left(Right(arr(i, 3), 2), 1) & Left(arr(3, j), 1)
  9.                 d(x) = d(x) + 1
  10.                 x = x & "@" & arr(i, 4)
  11.                 dn(x) = arr(i, j)
  12.         Next j, i
  13.     Dim brr(24, 15)
  14.         For Each sh In Worksheets
  15.             x = sh.Name
  16.             If d.exists(x) Then
  17.                 ar = Filter(dn.keys, x)
  18.                 Erase brr
  19.                 For i = 0 To UBound(ar)
  20.                     n = Int(i / 25) * 4: m = i Mod 25
  21.                     brr(m, 0 + n) = i + 1
  22.                     brr(m, 1 + n) = Split(ar(i), "@")(1)
  23.                     brr(m, 2 + n) = dn(ar(i))
  24.                 Next
  25.                 Worksheets(x).[a9:p33] = brr
  26.             End If
  27.         Next
  28. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-1-23 02:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  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.   hg = [{60,22,22,40,25,29,20,22.5}]
  8.   lk = [{5.57,7.71,9,7.71,7.71,9,5.57,9,6.43,9,5.57,5.57}]
  9.   Set d = CreateObject("scripting.dictionary")
  10.   With Worksheets("成绩录入表")
  11.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  12.     arr = .Range("a3:p" & r)
  13.   End With
  14.   For i = 2 To UBound(arr)
  15.     bj = Val(Split(arr(i, 3), "(")(1))
  16.     If Not d.exists(bj) Then
  17.       Set d(bj) = CreateObject("scripting.dictionary")
  18.     End If
  19.     For j = 7 To 13 Step 2
  20.       km = Left(arr(1, j), 2)
  21.       If Not d(bj).exists(km) Then
  22.         m = 1
  23.         ReDim brr(1 To 3, 1 To m)
  24.       Else
  25.         brr = d(bj)(km)
  26.         m = UBound(brr, 2) + 1
  27.         ReDim Preserve brr(1 To 3, 1 To m)
  28.       End If
  29.       brr(1, m) = m
  30.       brr(2, m) = arr(i, 4)
  31.       brr(3, m) = arr(i, j)
  32.       d(bj)(km) = brr
  33.     Next
  34.   Next
  35.   For Each aa In d.keys
  36.     For Each bb In d(aa).keys
  37.       brr = d(aa)(bb)
  38.       ReDim crr(1 To UBound(brr, 2), 1 To UBound(brr))
  39.       For i = 1 To UBound(brr)
  40.         For j = 1 To UBound(brr, 2)
  41.           crr(j, i) = brr(i, j)
  42.         Next
  43.       Next
  44.       ReDim drr(1 To 12)
  45.       For i = 1 To UBound(crr)
  46.         drr(1) = drr(1) + 1
  47.         If Len(crr(i, 3)) <> 0 And IsNumeric(crr(i, 3)) Then
  48.           drr(2) = drr(2) + 1
  49.           drr(3) = drr(3) + crr(i, 3)
  50.           If crr(i, 3) >= 80 Then
  51.             drr(5) = drr(5) + 1
  52.           End If
  53.           If crr(i, 3) >= 60 Then
  54.             drr(7) = drr(7) + 1
  55.           Else
  56.             drr(9) = drr(9) + 1
  57.           End If
  58.           If IsEmpty(drr(11)) Then
  59.             drr(11) = crr(i, 3)
  60.           Else
  61.             If drr(11) < crr(i, 3) Then
  62.               drr(11) = crr(i, 3)
  63.             End If
  64.           End If
  65.           If IsEmpty(drr(12)) Then
  66.             drr(12) = crr(i, 3)
  67.           Else
  68.             If drr(12) > crr(i, 3) Then
  69.               drr(12) = crr(i, 3)
  70.             End If
  71.           End If
  72.         End If
  73.       Next
  74.       If Len(drr(2)) <> 0 And drr(2) <> 0 Then
  75.         drr(4) = Round(drr(3) / drr(2), 2)
  76.         drr(6) = Round(drr(5) / drr(2), 4)
  77.         drr(8) = Round(drr(7) / drr(2), 4)
  78.         drr(10) = Round(drr(9) / drr(2), 4)
  79.       End If
  80.       wjm = aa & Left(bb, 1)
  81.       On Error Resume Next
  82.       Set ws = Worksheets(wjm)
  83.       If Err Then
  84.         Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  85.         ws.Name = wjm
  86.       End If
  87.       On Error GoTo 0
  88.       With ws
  89.         .Cells.Clear
  90.         With .Range("a1")
  91.           .Value = "海城镇第二小学五年级第一次月考知识测试" & vbLf & "质  量  分  析  表"
  92.           .Resize(1, 12).Merge
  93.           With .Font
  94.             .Size = 18
  95.             .Bold = True
  96.           End With
  97.         End With
  98.         With .Range("a2")
  99.           .Value = "(2018-2019学年度第一学期)"
  100.           .Resize(1, 12).Merge
  101.         End With
  102.         .Range("a3") = "班级"
  103.         .Range("b3") = aa
  104.         .Range("e3") = "学科"
  105.         .Range("f3") = bb
  106.         With .Range("j3")
  107.           .Value = #10/1/2018#
  108.           .Resize(1, 3).Merge
  109.         End With
  110.         With .Range("a4")
  111.           .Value = "应考" & vbLf & "人数"
  112.           .Resize(2, 1).Merge
  113.         End With
  114.         With .Range("b4")
  115.           .Value = "实考" & vbLf & "人数"
  116.           .Resize(2, 1).Merge
  117.         End With
  118.         With .Range("c4")
  119.           .Value = "总分"
  120.           .Resize(2, 1).Merge
  121.         End With
  122.         With .Range("d4")
  123.           .Value = "人平" & vbLf & "均分"
  124.           .Resize(2, 1).Merge
  125.         End With
  126.         With .Range("e4")
  127.           .Value = "红  分" & vbLf & "(80-100分)"
  128.           .Resize(1, 2).Merge
  129.         End With
  130.         With .Range("g4")
  131.           .Value = "及  格" & vbLf & "(60-100分)"
  132.           .Resize(1, 2).Merge
  133.         End With
  134.         With .Range("i4")
  135.           .Value = "不及格" & vbLf & "(0-59分)"
  136.           .Resize(1, 2).Merge
  137.         End With
  138.         For j = 5 To 9 Step 2
  139.           .Cells(5, j).Resize(1, 2) = Array("人数", "%")
  140.         Next
  141.         With .Range("k4")
  142.           .Value = "最" & vbLf & "高" & vbLf & "分"
  143.           .Resize(2, 1).Merge
  144.         End With
  145.         With .Range("l4")
  146.           .Value = "最" & vbLf & "低" & vbLf & "分"
  147.           .Resize(2, 1).Merge
  148.         End With
  149.         
  150.         .Range("a6").Resize(1, 12) = drr
  151.         With .Range("a7")
  152.           .Value = "学生姓名及分数"
  153.           .Resize(1, 12).Merge
  154.         End With
  155.         For j = 1 To 10 Step 3
  156.           .Cells(8, j).Resize(1, 3) = Array("序号", "姓名", "分数")
  157.         Next
  158.         m = 9
  159.         n = 1
  160.         For i = 1 To UBound(crr)
  161.           .Cells(m, n) = crr(i, 1)
  162.           .Cells(m, n + 1) = crr(i, 2)
  163.           .Cells(m, n + 2) = crr(i, 3)
  164.           m = m + 1
  165.           If m > 33 Then
  166.             m = 9
  167.             n = n + 3
  168.           End If
  169.         Next
  170.         With .Range("a2:l33")
  171.           With .Font
  172.             .Name = "微软雅黑"
  173.             .Size = 11
  174.           End With
  175.         End With
  176.         .Range("f6,h6,j6").NumberFormatLocal = "0.00%"
  177.         For i = 1 To 7
  178.           .Rows(i).RowHeight = hg(i)
  179.         Next
  180.         .Rows("8:33").RowHeight = hg(8)
  181.         For j = 1 To UBound(lk)
  182.           .Columns(j).ColumnWidth = lk(j)
  183.         Next
  184.         With .Range("a4:l33")
  185.           .Borders.LineStyle = xlContinuous
  186.         End With
  187.         With .UsedRange
  188.           .HorizontalAlignment = xlCenter
  189.           .VerticalAlignment = xlCenter
  190.         End With
  191.       End With
  192.     Next
  193.   Next
  194. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-1-23 02:04 | 显示全部楼层

TA的精华主题

TA的得分主题

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

谢谢!您的帮助!

TA的精华主题

TA的得分主题

发表于 2019-1-23 09:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
7楼厉害了,完全用代码弄一个表格啊,我还想该做个标准分表,用复制的方式写代码呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 09:04 , Processed in 0.046548 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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