ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 一分两率计算各班各学科平均分、合格率、优秀率

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-11-21 15:00 | 显示全部楼层
对,只能先用公式提取前面几张表,最后用VBA生成教师个人分析表

TA的精华主题

TA的得分主题

发表于 2021-11-21 15:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhuql2921 发表于 2021-11-21 15:00
对,只能先用公式提取前面几张表,最后用VBA生成教师个人分析表

新贴子里已经有老师开始解答了。复杂问题适宜由易到难、逐步解决的办法。给你建议过了,抛弃以前所有的代码和公式,从头做起,提供最原始的数据,然后一步一步提出你的需求,VBA代码根据总表就能计算出后面各种统计表,各班成绩表是否必须?另一个教师任课表必须提供,学生符号从哪里获得?

TA的精华主题

TA的得分主题

发表于 2021-11-21 16:14 | 显示全部楼层
可能还是和老师讲的样,条件太多了,没有通用的VBA,如果每次写代码就繁了

TA的精华主题

TA的得分主题

发表于 2021-11-22 09:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhuql2921 发表于 2021-11-21 16:14
可能还是和老师讲的样,条件太多了,没有通用的VBA,如果每次写代码就繁了

你讲的通用性准确地来说应该是适应性,如果原始数据表格和结果表格设计得科学合理,代码的适应性还是有保障的。

TA的精华主题

TA的得分主题

发表于 2022-11-28 12:11 | 显示全部楼层
求助大神,如何实现班级一率两分的汇总呢?

Book1.rar

36.93 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2022-11-28 14:41 | 显示全部楼层
Sub test()
  Dim r%, i%
  Dim arr, brr
  Dim d As Object
  Set d = CreateObject("scripting.dictionary")
  Set d1 = CreateObject("scripting.dictionary")
  Set dcs = CreateObject("scripting.dictionary")
  With Worksheets("基本参数")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    c = .Cells(1, .Columns.Count).End(xlToLeft).Column
    arr = .Range("a1").Resize(r, c)
    For j = 2 To UBound(arr, 2)
      Set dcs(arr(1, j)) = CreateObject("scripting.dictionary")
      For i = 2 To UBound(arr)
        dcs(arr(1, j))(arr(i, 1)) = arr(i, j)
      Next
    Next
  End With
  
  With Worksheets("原始成绩")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    c = .Cells(2, .Columns.Count).End(xlToLeft).Column
    arr = .Range("a2").Resize(r - 1, c)
    For j = 4 To UBound(arr, 2) - 1
      If Not dcs.exists(arr(1, j)) Then
        MsgBox "请在[基本参数]表中设置[" & arr(1, j) & "]有关参数!"
        Exit Sub
      End If
    Next
    For j = 4 To UBound(arr, 2) - 1
      Set d(arr(1, j)) = CreateObject("scripting.dictionary")
      For i = 2 To UBound(arr)
        If Not d(arr(1, j)).exists(arr(i, 1)) Then
          ReDim brr(1 To 9)
          brr(1) = arr(i, 1)
        Else
          brr = d(arr(1, j))(arr(i, 1))
        End If
        brr(2) = brr(2) + 1
        brr(3) = brr(3) + arr(i, j)
        If arr(i, j) >= dcs(arr(1, j))("合格") Then
          brr(5) = brr(5) + 1
        End If
        If arr(i, j) >= dcs(arr(1, j))("优秀") Then
          brr(7) = brr(7) + 1
        End If
        d(arr(1, j))(arr(i, 1)) = brr
      Next
    Next
  End With
  With Worksheets("一分两率")
    .Cells.Clear
    For Each aa In d.keys
      d1.RemoveAll
      arr = Application.Transpose(Application.Transpose(d(aa).items))
      ReDim brr(1 To UBound(arr, 2))
      brr(1) = "合计"
      For i = 1 To UBound(arr)
        For Each x In Array(2, 3, 5, 7)
          brr(x) = brr(x) + arr(i, x)
        Next
        If arr(i, 2) <> 0 Then
          arr(i, 4) = Round(arr(i, 3) / arr(i, 2), 2)
          arr(i, 6) = Round(arr(i, 5) / arr(i, 2), 4) * 100
          arr(i, 8) = Round(arr(i, 7) / arr(i, 2), 4) * 100
        End If
        d1(arr(i, 4)) = d1(arr(i, 4)) + 1
      Next
      If brr(2) <> 0 Then
        brr(4) = Round(brr(3) / brr(2), 2)
        brr(6) = Round(brr(5) / brr(2), 4) * 100
        brr(8) = Round(brr(7) / brr(2), 4) * 100
      End If
      
      nn = 1
      kk = d1.keys
      For k = 0 To UBound(kk)
        mm = Application.Large(kk, k + 1)
        ss = d1(mm)
        d1(mm) = nn
        nn = nn + ss
      Next
      For i = 1 To UBound(arr)
        arr(i, 9) = d1(arr(i, 4))
      Next
      r = .Cells(.Rows.Count, 1).End(xlUp).Row
      If r > 1 Then
        r = r + 4
      End If
      With .Cells(r, 1)
        .Value = "初一级(" & aa & ")"
        .Resize(1, 9).Merge
        With .Font
          .Name = "宋体"
          .Size = 18
          .Bold = True
        End With
      End With
      .Cells(r + 1, 1).Resize(1, 9) = Array("班级", "人数", "总分", "平均分", "合格人数", "合格率", "优秀人数", "优秀率", "排名")
      .Cells(r + 2, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
      .Cells(r + 2 + UBound(arr), 1).Resize(1, UBound(brr)) = brr
      r1 = .Cells(.Rows.Count, 1).End(xlUp).Row
      With .Range(.Cells(r + 1, 1), .Cells(r1, 9))
        .Borders.LineStyle = xlContinuous
      End With
    Next
    With .UsedRange
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlCenter
    End With
  End With
End Sub

TA的精华主题

TA的得分主题

发表于 2022-11-28 14:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jacking03 于 2022-11-28 15:15 编辑
jacking03 发表于 2022-11-28 12:11
求助大神,如何实现班级一率两分的汇总呢?

已经在论坛中找到褚老师写的代码,稍微修改一下可以用,把教师的一分两率也整合了一下。请大神再帮忙把班级一分两率的任课老师完善下,谢谢!

Book1.rar

51.61 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2022-11-28 15:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修改好了。

Book1.rar

51.78 KB, 下载次数: 33

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-28 16:32 | 显示全部楼层

非常完美,谢谢褚老师!

TA的精华主题

TA的得分主题

发表于 2022-12-8 20:22 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如果分数栏为空,就不统计,只计算实考人数就好,要怎么修改
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 02:41 , Processed in 0.049078 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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