Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4141|回复: 11

[已解决]如何制作多次考试成绩单

[复制链接]
发表于 2012-1-8 13:34 | 显示全部楼层 |阅读模式
多次考试成绩表在一工作簿中或几个工作簿中,最后在一张表中出现多次考试的成绩单,如示例,示例中是4次考试,我希望通过VBA实现随便多少次考试最后都能在最后的成绩单中反映出来
最佳答案
2012-1-8 17:18
不晓得字典,那就改一下:
Sub test()
Dim d , ar1(), ar2(), artmp(), sht As Worksheet
Set d = CreateObject("scripting.Dictionary")

shtc = Worksheets.Count
ReDim ar2(1 To 30000, 1 To 26)
artmp = Sheet1.[a1:y1].Value
For Each sht In Worksheets
   If sht.Name <> "成绩单" Then
      i% = sht.[a65536].End(xlUp).Row
      ar1 = sht.Range("a2:y" & i).Value
      t = t% + 1
      For i = 1 To UBound(ar1)
        If Not d.Exists(ar1(i, 1)) Then d(ar1(i, 1)) = d.Count * shtc + 1
        For i2 = 1 To 25
           If t = 1 Then ar2(d(ar1(i, 1)), i2) = artmp(1, i2)
           ar2(d(ar1(i, 1)) + t, i2) = ar1(i, i2)
        Next
        ar2(d(ar1(i, 1)) + t, 26) = sht.Name
      Next
   End If
Next
Sheets("成绩单").Cells.Clear
Sheets("成绩单").[a1].Resize(d.Count * shtc + t, 26) = ar2
End Sub

23.rar

67.47 KB, 下载次数: 76

发表于 2012-1-8 14:04 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2012-1-8 15:23 | 显示全部楼层
LQ200601 发表于 2012-1-8 14:04
最后的成绩单中反映出来

???????????????????????????????
回复

使用道具 举报

发表于 2012-1-8 16:50 | 显示全部楼层
用了字典,请引用:
Sub test()
Dim d As New Dictionary, ar1(), ar2(), artmp(), sht As Worksheet
shtc = Worksheets.Count
ReDim ar2(1 To 30000, 1 To 26)
artmp = Sheet1.[a1:y1].Value
For Each sht In Worksheets
   If sht.Name <> "成绩单" Then
      i% = sht.[a65536].End(xlUp).Row
      ar1 = sht.Range("a2:y" & i).Value
      t = t% + 1
      For i = 1 To UBound(ar1)
        If Not d.Exists(ar1(i, 1)) Then d(ar1(i, 1)) = d.Count * shtc + 1
        For i2 = 1 To 25
           If t = 1 Then ar2(d(ar1(i, 1)), i2) = artmp(1, i2)
           ar2(d(ar1(i, 1)) + t, i2) = ar1(i, i2)
        Next
        ar2(d(ar1(i, 1)) + t, 26) = sht.Name
      Next
   End If
Next
Sheets("成绩单").Cells.Clear
Sheets("成绩单").[a1].Resize(d.Count * shtc + t, 26) = ar2
End Sub
回复

使用道具 举报

 楼主| 发表于 2012-1-8 17:07 | 显示全部楼层
djyjysxxs 发表于 2012-1-8 16:50
用了字典,请引用:
Sub test()
Dim d As New Dictionary, ar1(), ar2(), artmp(), sht As Worksheet

能帮忙做个文件让我测试一下,本人对VBA才入门,对字典不懂。
我测试没成功。
回复

使用道具 举报

发表于 2012-1-8 17:18 | 显示全部楼层    本楼为最佳答案   
不晓得字典,那就改一下:
Sub test()
Dim d , ar1(), ar2(), artmp(), sht As Worksheet
Set d = CreateObject("scripting.Dictionary")

shtc = Worksheets.Count
ReDim ar2(1 To 30000, 1 To 26)
artmp = Sheet1.[a1:y1].Value
For Each sht In Worksheets
   If sht.Name <> "成绩单" Then
      i% = sht.[a65536].End(xlUp).Row
      ar1 = sht.Range("a2:y" & i).Value
      t = t% + 1
      For i = 1 To UBound(ar1)
        If Not d.Exists(ar1(i, 1)) Then d(ar1(i, 1)) = d.Count * shtc + 1
        For i2 = 1 To 25
           If t = 1 Then ar2(d(ar1(i, 1)), i2) = artmp(1, i2)
           ar2(d(ar1(i, 1)) + t, i2) = ar1(i, i2)
        Next
        ar2(d(ar1(i, 1)) + t, 26) = sht.Name
      Next
   End If
Next
Sheets("成绩单").Cells.Clear
Sheets("成绩单").[a1].Resize(d.Count * shtc + t, 26) = ar2
End Sub
回复

使用道具 举报

 楼主| 发表于 2012-1-8 22:28 | 显示全部楼层
本帖最后由 jhhkh 于 2012-1-8 22:43 编辑
djyjysxxs 发表于 2012-1-8 17:18
不晓得字典,那就改一下:
Sub test()
Dim d , ar1(), ar2(), artmp(), sht As Worksheet


此贴不给最佳答案给谁?!可以说太完美了!速度快,又用不着考虑人名或分数的顺序!
有两个问题:
1.考号本来是文本格式但在成绩单中变成了数值型了,有没有办法变成文本格式
2.高难度(我这么认为,嘻嘻),现在如果第一张成绩表中如果有一人没参加考试,本张表中就没有他的名字和成绩,经测试在成绩单中就没有这名学生的全部成绩,这与实际不符的,能否这样:保留他参加考试的成绩
回复

使用道具 举报

发表于 2012-1-9 01:51 | 显示全部楼层
本帖最后由 djyjysxxs 于 2012-1-9 01:53 编辑

那就改一下
Sub test()
Dim d, ar1(), ar2(), artmp(), sht As Worksheet
Set d = CreateObject("scripting.Dictionary")
shtc = Worksheets.Count
ReDim ar2(1 To 30000, 1 To 26)
artmp = Sheet1.[a1:y1].Value
For Each sht In Worksheets
   If sht.Name <> "成绩单" Then
      i% = sht.[a65536].End(xlUp).Row
      ar1 = sht.Range("a2:y" & i).Value
      t = t% + 1
      For i = 1 To UBound(ar1)
        If Not d.Exists(ar1(i, 1)) Then d(ar1(i, 1)) = d.Count * shtc + 1
        For i2 = 1 To 25
           If ar2(d(ar1(i, 1)), i2) = "" Then ar2(d(ar1(i, 1)), i2) = artmp(1, i2)
           ar2(d(ar1(i, 1)) + t, i2) = ar1(i, i2)
        Next
        ar2(d(ar1(i, 1)) + t, 26) = sht.Name
      Next
   End If
Next
Sheets("成绩单").Cells.Clear
Sheets("成绩单").[a1].Resize(d.Count * shtc + t).NumberFormatLocal = "@"
Sheets("成绩单").[a1].Resize(d.Count * shtc + t, 26) = ar2
End Sub

回复

使用道具 举报

 楼主| 发表于 2012-1-9 13:04 | 显示全部楼层
djyjysxxs 发表于 2012-1-9 01:51
那就改一下
Sub test()
Dim d, ar1(), ar2(), artmp(), sht As Worksheet

我说的不是这个学生成绩为空,而是当某个学生在第一张表中没有出现,例如在第一次考试由于没参加所以就没有他的姓名,而后三场考试都参加了,或者某个学生是后转学来的因些在第一张表中当然不能出现,根据程序测试的结果,他的后面的成绩是不能出现的,根本没有他后来的的考试成绩。
有办法吗?谢谢!
回复

使用道具 举报

发表于 2012-1-9 20:03 | 显示全部楼层
jhhkh 发表于 2012-1-9 13:04
我说的不是这个学生成绩为空,而是当某个学生在第一张表中没有出现,例如在第一次考试由于没参加所以就没 ...

你仔细看了没有?说了改嘛肯定就有了三。
你所说的情况,到最尾巴上去看看他在不在嘛
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-24 13:15 , Processed in 0.689219 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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