Excel精英培训网

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

[已解决]VBA计算人数

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

工作簿里有16个分小学的工作表,还有6个一至六年级汇总表,比如一年级汇总表,是对16个小学一年级的数据按XX小学XX年班汇总的,请用VBA完成各年级汇总工作表里考试人数、计分人数的结果。
1、考试人数:该班成绩单上的人数
2、计分人数:该班成绩单人数的90%,比如某班考试人数为32人,去掉10%=3.2,进一法取值4,计分人数就是28人。
3、公式里涉及工作表标签名的在对应B列单元格里都有,让B列单元格替换工作表标签,下拉即自动查找相应的工作表,不再手动修改公式里的工作表标签。
按钮1是自动生成各年级汇总表里A列数据的。 新建文件夹.rar (303.81 KB, 下载次数: 19)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2014-7-21 09:02 | 显示全部楼层
回复

使用道具 举报

发表于 2014-7-21 11:00 | 显示全部楼层
  1. Sub 汇总()
  2.     Dim arr, x&, dk, k%
  3.     Dim sh As Worksheet
  4.     Dim d As Object
  5.     Set d = CreateObject("scripting.dictionary")
  6.     For Each sh In Worksheets
  7.         If Not sh.Name Like "*汇总*" Then
  8.             r = sh.[c65536].End(3).Row
  9.             arr = sh.Range("a1:e" & r)
  10.             For x = 1 To UBound(arr)
  11.                 If arr(x, 1) Like "*年*" Then bj = arr(x, 1)         '班级名
  12.                 If Len(arr(x, 5)) > 0 And IsNumeric(arr(x, 5)) Then   '判断第5列为数值,则累计加1
  13.                     xkey = sh.Name & bj          '字典key为学校+年班
  14.                     d(xkey) = d(xkey) + 1
  15.                 End If
  16.             Next
  17.         End If
  18.     Next
  19.    
  20.     For Each sh In Worksheets
  21.         If sh.Name Like "*汇总*" Then
  22.             r = sh.[c65536].End(3).Row
  23.             sh.Range("d2:e" & r).ClearContents
  24.             brr = sh.Range("a1:e" & r)
  25.             For x = 2 To UBound(brr)
  26.                 brr(x, 4) = d(brr(x, 1))
  27.                 brr(x, 5) = brr(x, 4) - Round(brr(x, 4) * 0.1 + 0.49999, 0)
  28.             Next
  29.             sh.[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
  30.         End If
  31.     Next
  32. End Sub
复制代码
回复

使用道具 举报

发表于 2014-7-21 11:01 | 显示全部楼层    本楼为最佳答案   
各学校里面的表式有点不一致。可以对照运算结果自己调一下,关键是“*年*班”都要在第1列。

VBA成绩单.rar

304.95 KB, 下载次数: 24

评分

参与人数 1 +3 收起 理由
武林长风 + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-7-21 11:49 | 显示全部楼层
咱也写了个:
  1. Sub suhz()
  2. For Each sh In Worksheets
  3.     If sh.Name Like "*汇总*" Then
  4.         rng = sh.Range("B3", sh.Cells(sh.Cells(sh.Rows.Count, "A").End(3).Row, "C"))
  5.         ReDim arr(1 To UBound(rng), 1 To 2)
  6.         For i = 1 To UBound(rng)
  7.             n = 0
  8.             With Sheets(rng(i, 1))
  9.                 Set d = .Range("A:A").Find(rng(i, 2), , , 1)
  10.                 If Not d Is Nothing Then
  11.                     Set s = d.Offset(1, 1).End(4)
  12.                     arr(i, 1) = s.Offset(, -1)
  13.                     arr(i, 2) = arr(i, 1) - Application.Ceiling(arr(i, 1) * 0.1, 1)
  14.                 End If
  15.             End With
  16.         Next
  17.         sh.Range("D3").Resize(UBound(arr), 2) = arr
  18.     End If
  19. Next
  20. End Sub
复制代码
VBA成绩单1.zip (396.08 KB, 下载次数: 8)

评分

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

查看全部评分

回复

使用道具 举报

发表于 2014-7-22 10:41 | 显示全部楼层
重新编了一下代码,各汇总表里的年班自动生成。原来是根据已有的年班汇总的,有疏漏。
  1. Sub 汇总()
  2.     Dim arr, x&, dk, k%
  3.     Dim sh As Worksheet
  4.     Dim d As Object
  5.     Set d = CreateObject("scripting.dictionary")
  6.     For Each sh In Worksheets
  7.         If Not sh.Name Like "*汇总*" Then
  8.             r = sh.[c65536].End(3).Row
  9.             arr = sh.Range("a1:e" & r)
  10.             For x = 1 To UBound(arr)
  11.                 If arr(x, 1) Like "*年*" Then bj = arr(x, 1)         '班级名
  12.                 If Len(arr(x, 5)) > 0 And IsNumeric(arr(x, 5)) Then   '判断第5列为数值,则累计加1
  13.                     xkey = sh.Name & bj          '字典key为学校+年班
  14.                     d(xkey) = d(xkey) + 1
  15.                 End If
  16.             Next
  17.         End If
  18.     Next
  19.    
  20.     dk = d.keys: dt = d.items
  21.     ReDim crr(1 To d.Count, 1 To 5)
  22.     For Each sh In Worksheets
  23.         If sh.Name Like "*汇总*" Then
  24.         sh.Range("a2:e1000").ClearContents
  25.         n = 0
  26.         For i = 0 To UBound(dk)
  27.             xkey = dk(i)
  28.             If Left(sh.Name, 2) = Mid(xkey, 3, 2) Then
  29.                 n = n + 1
  30.                 crr(n, 1) = xkey
  31.                 crr(n, 2) = Left(xkey, 2)
  32.                 crr(n, 3) = Mid(xkey, 3)
  33.                 crr(n, 4) = dt(i)
  34.                 crr(n, 5) = crr(n, 4) - Round(crr(n, 4) * 0.1 + 0.49999, 0)
  35.             End If
  36.         Next
  37.         sh.[a2].Resize(n, 5) = crr
  38.         End If
  39.     Next
  40. End Sub
复制代码
回复

使用道具 举报

发表于 2014-7-22 10:43 | 显示全部楼层
请看附件。各汇总表中左侧是自动生成的年班汇总,右侧是原来给定的年班汇总。

VBA成绩单.rar

309.25 KB, 下载次数: 11

回复

使用道具 举报

 楼主| 发表于 2014-7-22 12:20 | 显示全部楼层
grf1973 发表于 2014-7-22 10:43
请看附件。各汇总表中左侧是自动生成的年班汇总,右侧是原来给定的年班汇总。

谢谢您,真负责任!{:2812:}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 08:18 , Processed in 0.555993 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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