ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 拆分总成绩表中的数据到各班各学科

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-11 13:32 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
拆分总成绩表中的数据到各班各学科

          如何将 <总成绩表> 中的成绩,按以班级、以学科,并按表格中的顺序,一一对应到位。(其中语文、数学两表各三栏,每栏25行;英语表为两栏,每栏40行)。 谢谢 !




成绩表.rar

11.94 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2018-7-11 13:35 | 显示全部楼层
透视表拆分应该可以满足你的要求。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-11 14:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
beta402 发表于 2018-7-11 13:35
透视表拆分应该可以满足你的要求。

谢谢你的回复 !

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-11 14:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
gfs57 发表于 2018-7-11 14:50
谢谢你的回复 !

  我发的附件只是部分数据,实际上学生数有几千人,班级上百个。所以希望能用 VBA 来完成。谢谢

TA的精华主题

TA的得分主题

发表于 2018-7-11 15:01 | 显示全部楼层
  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("a1:e" & r)
  9.   End With
  10.   For i = 2 To UBound(arr)
  11.     If Not d.exists(arr(i, 2)) Then
  12.       Set d(arr(i, 2)) = CreateObject("scripting.dictionary")
  13.     End If
  14.     For j = 3 To 5
  15.       If Not d(arr(i, 2)).exists(arr(1, j)) Then
  16.         m = 1
  17.         ReDim brr(1 To 3, 1 To m)
  18.       Else
  19.         brr = d(arr(i, 2))(arr(1, j))
  20.         m = UBound(brr, 2) + 1
  21.         ReDim Preserve brr(1 To 3, 1 To m)
  22.       End If
  23.       brr(1, m) = m
  24.       brr(2, m) = arr(i, 1)
  25.       brr(3, m) = arr(i, j)
  26.       d(arr(i, 2))(arr(1, j)) = brr
  27.     Next
  28.   Next
  29.   For Each aa In d.keys
  30.     For Each bb In d(aa).keys
  31.       arr = d(aa)(bb)
  32.       ReDim brr(1 To UBound(arr, 2), 1 To UBound(arr))
  33.       For i = 1 To UBound(arr)
  34.         For j = 1 To UBound(arr, 2)
  35.           brr(j, i) = arr(i, j)
  36.         Next
  37.       Next
  38.       On Error Resume Next
  39.       Set ws = Worksheets(aa & "班" & bb)
  40.       If Err Then
  41.         Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  42.         ws.Name = aa & "班" & bb
  43.       End If
  44.       On Error GoTo 0
  45.       With Worksheets(aa & "班" & bb)
  46.         .Cells.Clear
  47.         With .Range("a1")
  48.           .Value = "成绩表"
  49.           .Resize(1, IIf(bb <> "英语", 9, 6)).Merge
  50.           With .Font
  51.             .Size = 18
  52.             .Name = "黑体"
  53.           End With
  54.         End With
  55.         .Range("a2") = "学校"
  56.         .Range("b2") = "胜利小学"
  57.         If bb <> "英语" Then
  58.           .Range("e2") = bb & "科"
  59.           .Range("h2") = aa & "班"
  60.         Else
  61.           .Range("d2") = bb & "科"
  62.           .Range("f2") = aa & "班"
  63.         End If
  64.         For j = 1 To IIf(bb <> "英语", 3, 2)
  65.           .Cells(3, j * 3 - 2).Resize(1, 3) = Array("座号", "姓名", bb)
  66.         Next
  67.         .Range("a4").Resize(UBound(brr), UBound(brr, 2)) = brr
  68.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  69.         n = 4
  70.         For i = IIf(bb <> "英语", 29, 44) To r Step IIf(bb <> "英语", 25, 40)
  71.           .Cells(i, 1).Resize(IIf(bb <> "英语", 25, 40), 3).Cut Destination:=.Cells(4, n)
  72.           n = n + 3
  73.         Next
  74.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  75.         c = .Cells(3, .Columns.Count).End(xlToLeft).Column
  76.         With .Range("a3").Resize(r - 2, c)
  77.           .Borders.LineStyle = xlContinuous
  78.           .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
  79.         End With
  80.         For j = 4 To c Step 3
  81.           With .Cells(3, j).Resize(r - 2, 1).Borders(xlEdgeLeft)
  82.             .LineStyle = xlContinuous
  83.             .Weight = xlMedium
  84.           End With
  85.         Next
  86.         With .UsedRange
  87.          .HorizontalAlignment = xlCenter
  88.          .VerticalAlignment = xlCenter
  89.         End With
  90.       End With
  91.     Next
  92.   Next
  93. End Sub
复制代码

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-7-11 15:02 | 显示全部楼层
详见附件。

成绩表.rar

23.33 KB, 下载次数: 62

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-11 16:02 | 显示全部楼层

下午好 !

  衷心感谢你的回复!首先被你上百行的代码吓到了,短短时间写了这么多,还调试过了,佩服佩服!完全达到我想要的效果,就因为单位这台电脑运行不了代码,我得回家后再动手试试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-11 16:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
gfs57 发表于 2018-7-11 16:02
下午好 !

  衷心感谢你的回复!首先被你上百行的代码吓到了,短短时间写了这么多,还调试过了,佩 ...

  刚才又细看了一下,原表中已有的东西是不需要我们填写的。我们只要填写学生姓名及各科目成绩即可。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-11 16:12 | 显示全部楼层
gfs57 发表于 2018-7-11 16:05
  刚才又细看了一下,原表中已有的东西是不需要我们填写的。我们只要填写学生姓名及各科目成绩即可。

  哦对啦:语文科,只需填写:学生姓名 + 语文成绩;
      数学科,只需填写:      数学成绩;
      英语科,只需填写:      英语成绩。
  这样的话,代码好修改吗?再次感谢 !

TA的精华主题

TA的得分主题

发表于 2018-7-11 16:46 | 显示全部楼层
gfs57 发表于 2018-7-11 16:12
  哦对啦:语文科,只需填写:学生姓名 + 语文成绩;
      数学科,只需填写:      数学 ...

不要座号了?修改起来挺麻烦的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 06:10 , Processed in 0.064987 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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