Excel精英培训网

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

[已解决]VBA计算各科总分

[复制链接]
发表于 2014-7-21 12:06 | 显示全部楼层 |阅读模式
本帖最后由 武林长风 于 2014-7-23 20:35 编辑

修改一年级汇总里的按钮1达到下列要求:
1、考试人数:该班成绩单上的人数
2、计分人数:该班成绩单人数的90%,比如某班考试人数为32人,去掉10%=3.2,进一法取值去掉4人,计分人数就是28人。
3、公式里涉及工作表标签名的在对应B列单元格里都有,让B列单元格替换工作表标签,下拉即自动查找相应的工作表,不再手动修改公式里的工作表标签。
4、各科总分:比如数学,去掉该科成绩排在后面的10%的学生成绩,如该班32人,计分人数为28人,则总分计算数学科前28人的成绩之和。
其中1、2已通过按钮1完成,您只要修改代码帮我完成一年级汇总表到六年级汇总表就万分感谢了,剩下的表我用函数完成。 新建文件夹.rar (302.77 KB, 下载次数: 25)
发表于 2014-7-21 12:35 | 显示全部楼层
都6年级了,自己还是在基础表上下功夫吧,不要说这是领导发来的,没必要学。
回复

使用道具 举报

 楼主| 发表于 2014-7-21 12:36 | 显示全部楼层
gdw831001 发表于 2014-7-21 12:35
都6年级了,自己还是在基础表上下功夫吧,不要说这是领导发来的,没必要学。

6年级是时间的事,无奈1
回复

使用道具 举报

 楼主| 发表于 2014-7-21 12:38 | 显示全部楼层
gdw831001 发表于 2014-7-21 12:35
都6年级了,自己还是在基础表上下功夫吧,不要说这是领导发来的,没必要学。

和你们年轻人比不了啊~~~
回复

使用道具 举报

发表于 2014-7-21 12:38 | 显示全部楼层
武林长风 发表于 2014-7-21 12:36
6年级是时间的事,无奈1

把你的基础表搞好,可能直接用透视表就可以解决了
回复

使用道具 举报

 楼主| 发表于 2014-7-21 12:40 | 显示全部楼层
gdw831001 发表于 2014-7-21 12:38
把你的基础表搞好,可能直接用透视表就可以解决了

版主建议我发到VBA版求助,用VBA吧。
回复

使用道具 举报

 楼主| 发表于 2014-7-21 12:53 | 显示全部楼层
表格的样式不规范,我也没办法,想做个模板,以后还能用。
回复

使用道具 举报

 楼主| 发表于 2014-7-21 14:26 | 显示全部楼层
这个问题好难,请版主帮忙做一下吧。
回复

使用道具 举报

发表于 2014-7-21 14:33 | 显示全部楼层
本帖最后由 baksy 于 2014-7-21 15:29 编辑

函数解决
1. 辅助列设定:在“张小”工作表的J4单元格复制以下公式
=IF(N(A4)>0,OFFSET(A4,-(A4+1),),"")
复制J4单元格粘贴到整个J列
复制“张小”工作表的J列粘贴到各个学校工作表的J列。
2. 统计表公式
一年级汇总工作表的D3:G3单元格复制以下公式
D3=COUNTIF(INDIRECT(B3&"!J1:J1500"),C3)
E3=INT(D3*0.9)
F3=SUM(LARGE(IF(INDIRECT(B3&"!J1:J1500")=C3,INDIRECT(B3&"!E1:E1500")),ROW(OFFSET(A$1,,,E3))))
G3=SUM(LARGE(IF(INDIRECT(B3&"!J1:J1500")=C3,INDIRECT(B3&"!F1:F1500")),ROW(OFFSET(A$1,,,E3))))
其中F3和G3公式为三键回车( 公式复制后,点一下公式编辑栏的任意位置,先按住 shift、ctrl 两个键,然后敲enter键。)
全部下拉。

*注:部分学校的数据格式需要调整(没必要的空格等)
         其他年级的参考一年级统计表。

评分

参与人数 1 +3 收起 理由
武林长风 + 3 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-7-22 16:46 | 显示全部楼层
  1. Sub 汇总()
  2.     Dim arr, x&, dk, k%
  3.     Dim sh As Worksheet, xRng As Range
  4.     Dim d As Object
  5.     Set d = CreateObject("scripting.dictionary")
  6.     Set d1 = CreateObject("scripting.dictionary")
  7.     For Each sh In Worksheets
  8.         If Not sh.Name Like "*汇总*" Then
  9.             r = sh.[c65536].End(3).Row
  10.             arr = sh.Range("a1:i" & r)
  11.             For x = 1 To UBound(arr)
  12.                 If arr(x, 1) Like "*年*" And InStr(arr(x, 1), "成绩单") = 0 Then bj = arr(x, 1)  '班级名
  13.                 If Len(arr(x, 4)) > 0 And IsNumeric(arr(x, 4)) Then   '判断第5列为数值,则累计加1
  14.                     xkey = sh.Name & bj          '字典key为学校+年班
  15.                     d(xkey) = d(xkey) + 1
  16.                 End If
  17.             Next
  18.             
  19.             For x = 1 To UBound(arr)
  20.                 If arr(x, 1) Like "*年*" And InStr(arr(x, 1), "成绩单") = 0 Then
  21.                     bj = arr(x, 1)
  22.                     xkey = sh.Name & bj   '学校+年班
  23.                     n = d(xkey): m = n - Round(n * 0.1 + 0.49999, 0)   '班级的总人数,计分人数
  24.                     a = x + 2       '分数开始行
  25.                 ElseIf Len(arr(x, 4)) > 0 And IsNumeric(arr(x, 4)) Then   '判断第5列为数值,则累计总分
  26.                     For j = 5 To 9          '各学科分数所在列
  27.                         If Len(arr(a - 1, j)) > 0 Then          '表示学科非空
  28.                             Set xRng = sh.Cells(a, j).Resize(n, 1)    '该年班、学科所在的区域
  29.                             kk = xkey & Left(arr(a - 1, j), 2)
  30.                             fs = Val(arr(x, j))
  31.                             If fs > 0 Then If Application.WorksheetFunction.Rank(fs, xRng) < m Then d1(kk) = d1(kk) + fs    '前m名算总分
  32.                         End If
  33.                     Next
  34.                 End If
  35.             Next
  36.         End If
  37.     Next
  38.    
  39.     dk = d.keys: dt = d.items
  40.     ReDim crr(1 To d.Count, 1 To 10)
  41.     For Each sh In Worksheets
  42.         If sh.Name Like "*汇总*" Then
  43.         sh.Range("a3:j1000").ClearContents
  44.         n = 0
  45.         For i = 0 To UBound(dk)
  46.             xkey = dk(i)
  47.             If Left(sh.Name, 2) = Mid(xkey, 3, 2) Then
  48.                 n = n + 1
  49.                 crr(n, 1) = xkey
  50.                 crr(n, 2) = Left(xkey, 2)
  51.                 crr(n, 3) = Mid(xkey, 3)
  52.                 crr(n, 4) = dt(i)
  53.                 crr(n, 5) = crr(n, 4) - Round(crr(n, 4) * 0.1 + 0.49999, 0)
  54.                 For j = 6 To 10
  55.                     kk = xkey & Left(sh.Cells(2, j), 2)
  56.                     crr(n, j) = d1(kk)
  57.                 Next
  58.             End If
  59.         Next
  60.         sh.[a3].Resize(n, 10) = crr
  61.         End If
  62.     Next
  63. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:42 , Processed in 0.337331 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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