ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

同一学生多次成绩汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-12-31 17:17 | 显示全部楼层 |阅读模式
本帖最后由 lcmphy 于 2024-1-1 10:03 编辑

每次考试学生人数不完全相同,同一学生每次考试的学籍号、班级、姓名、性别信息等是固定的,其他信息是变动的。每次考试一个工作簿,把多次成绩放到同一个文件夹里面,在成绩汇总文件里面,通过设置参数,用VBA代码提取所有学生多次考试指定列的成绩信息。样本数据与效果见附件。谢谢

成绩汇总.rar

167.57 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-1 07:45 来自手机 | 显示全部楼层
本帖最后由 lcmphy 于 2024-1-1 10:11 编辑

准确表述可能是工作簿合并,如果合并指定列内容不方便,直接一个学生一行,所有内容包括标题行都追加到后面更好,这样合并后,只要删除不需要的列就可以了。

TA的精华主题

TA的得分主题

发表于 2024-1-1 11:01 | 显示全部楼层
这个参数设置看不懂,暂时下不了手。

文件夹可以不设置,改为手动选择,由VBA来完成。

QQ图片20240101110024.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-1 13:03 | 显示全部楼层
ykcbf1100 发表于 2024-1-1 11:01
这个参数设置看不懂,暂时下不了手。

文件夹可以不设置,改为手动选择,由VBA来完成。

设置参数麻烦,改为不需要设置参数。
每个成绩表的第3行与第4行为标题行,第5行开始为内容行,学籍号相同的是同一个学生,只占一行,直接把9月、10月多个工作簿合并到一个工作簿,不是往下追加,是往表格的右边依次追加。
QQ图片20240101125431.png

TA的精华主题

TA的得分主题

发表于 2024-1-1 15:48 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-1-1 18:17 编辑

代码更新了
  1. Sub ykcbf()   '//2024.1.1
  2.     Dim fns As New Collection
  3.     Set Fso = CreateObject("scripting.filesystemobject")
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Set d1 = CreateObject("Scripting.Dictionary")
  6.     Application.ScreenUpdating = False
  7.     Set sh = ThisWorkbook.Sheets("汇总表")
  8.     xx = [{"学籍号","班级","校名","性别"}]
  9.     xm = [{"分数","县名","校名","进步"}]
  10.     p = ThisWorkbook.Path & "\成绩"
  11.     Set ff = Fso.GetFolder(p)
  12.     Call GetFiles(ff, fns, Fso)
  13.     For Each k In fns
  14.         m = m + 1
  15.         sh.Cells(m, 1) = k(0)
  16.         sh.Cells(m, 2) = k(1)
  17.         sh.Cells(m, 3) = Val(k(1))
  18.     Next
  19.     sh.[a1].Resize(fns.Count, 3).Sort sh.[c1], 1
  20.     zrr = sh.[a1].Resize(fns.Count, 3)
  21.     c = 4
  22.     For y = 1 To UBound(zrr)
  23.         n = n + 1
  24.         Set Wb = Workbooks.Open(zrr(y, 1), 0)
  25.         With Wb.Sheets(1)
  26.             arr = .UsedRange
  27.             Wb.Close False
  28.         End With
  29.         For i = 5 To UBound(arr)
  30.             If arr(i, 1) <> Empty Then
  31.                 s = CStr(arr(i, 1))
  32.                 If Not d1.exists(s) Then
  33.                     d1(s) = Array(CStr(arr(i, 1)), CStr(arr(i, 4)), arr(i, 6), arr(i, 7))
  34.                 End If
  35.                 s = CStr(arr(i, 1)) & "|" & n
  36.                 If Not d.exists(s) Then
  37.                     d(s) = Array(arr(i, 9), arr(i, 12), arr(i, 13), arr(i, 14), n)
  38.                 End If
  39.             End If
  40.         Next
  41.     Next
  42.     t = d.items
  43.     With sh
  44.         .UsedRange.Clear
  45.         .[a1].Resize(1, 4) = xx
  46.         For x = 1 To n
  47.             .Cells(1, c + (x - 1) * 4 + 1).Resize(1, 4) = xm
  48.         Next
  49.         .Columns("A:B").NumberFormatLocal = "@"
  50.         .[a2].Resize(d1.Count, 4) = Application.Rept(d1.items, 1)
  51.         arr = .UsedRange
  52.         For i = 2 To UBound(arr)
  53.             For m = 1 To n
  54.                 k = 0
  55.                 For x = 1 To 4
  56.                     k = c + (m - 1) * 4 + x
  57.                     s = CStr(arr(i, 1)) & "|" & m
  58.                     If d.exists(s) Then
  59.                         arr(i, k) = d(s)(x - 1)
  60.                     End If
  61.                 Next
  62.             Next
  63.         Next
  64.         .Columns("A:B").NumberFormatLocal = "@"
  65.         With .UsedRange
  66.             .Value = arr
  67.             .Borders.LineStyle = 1
  68.             .HorizontalAlignment = xlCenter
  69.             .VerticalAlignment = xlCenter
  70.         End With
  71.     End With
  72.     Set d = Nothing
  73.     Set d1 = Nothing
  74.     Application.ScreenUpdating = True
  75.     MsgBox "OK!"
  76. End Sub

  77. Function GetFiles(ff, fns, Fso)
  78.     For Each f In ff.Files
  79.         If f.Name Like "*.xls*" Then
  80.             fns.Add Array(f.Path, Fso.GetBaseName(f))
  81.         End If
  82.     Next
  83. End Function
复制代码

一下。。。

复制代码

TA的精华主题

TA的得分主题

发表于 2024-1-1 15:49 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-1-1 18:16 编辑
lcmphy 发表于 2024-1-1 13:03
设置参数麻烦,改为不需要设置参数。
每个成绩表的第3行与第4行为标题行,第5行开始为内容行,学籍号相 ...

附件供参考。。。

成绩汇总.7z

123.47 KB, 下载次数: 27

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-1 17:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2024-1-1 15:49
附件供参考。。。

非常感谢!如果所有学生每次都参考,能够很好的合并所有学生的成绩;10月成绩里面的李七,8月、9月缺考没成绩,汇总的时候汇总到8月对应的成绩下面去了,这个还可以完善一下么?

TA的精华主题

TA的得分主题

发表于 2024-1-1 18:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lcmphy 发表于 2024-1-1 17:08
非常感谢!如果所有学生每次都参考,能够很好的合并所有学生的成绩;10月成绩里面的李七,8月、9月缺考没 ...

其实数据没有错,只是10月排在了前面了,正常情况下,10月比8月排在前面,排序就这样的。

TA的精华主题

TA的得分主题

发表于 2024-1-1 18:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ykcbf1100 于 2024-1-1 18:44 编辑
lcmphy 发表于 2024-1-1 17:08
非常感谢!如果所有学生每次都参考,能够很好的合并所有学生的成绩;10月成绩里面的李七,8月、9月缺考没 ...

改了一下,可以达到你的需求了。

成绩汇总.7z

123.47 KB, 下载次数: 44

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-1 18:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2024-1-1 18:07
其实数据没有错,只是10月排在了前面了,正常情况下,10月比8月排在前面,排序就这样的。

是的,刚在学校测试发现没有任何问题,我想到应该是文件排序的先后,果然您就回复了。
测试了一下,只要修改标题名称与对应的数据列数1,4,6,7,9,12,13,14,改成其他需要的列数,就可以根据需要汇总其他列的数据。
非常感谢您的帮助!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-26 17:29 , Processed in 0.050445 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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