ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 这样的高难度成绩分析可能只有求助老师们了

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-20 18:21 来自手机 | 显示全部楼层
辛玛 发表于 2020-7-20 18:15
谢谢老师指教

select 班级,avg(政治),avg(语文) from 学生成绩明细表 group by 班级

平均分用 avg就行,及格分数线还是60分?
SRC_20200720_182013.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-20 18:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 辛玛 于 2020-7-20 19:06 编辑
zpy2 发表于 2020-7-20 18:21
select 班级,avg(政治),avg(语文) from 学生成绩明细表 group by 班级

平均分用 avg就行,及格分数线 ...

谢谢老师。及格分数线不是固定的,是按照与考人数的60%的学生最低分为及格分,优秀分数线,关爱分数线,这些数据chxw68老师已经用代码求出来了。

TA的精华主题

TA的得分主题

发表于 2020-7-20 19:31 | 显示全部楼层
三率分析代码
  1. Sub test3()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Application.ScreenUpdating = False
  6.   Application.DisplayAlerts = False
  7.   Set d = CreateObject("scripting.dictionary")
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   Set d2 = CreateObject("scripting.dictionary")
  10.   Call pub
  11.   For Each ws In Worksheets(Array("七年级", "八年级", "九年级"))
  12.     With ws
  13.       Set d(ws.Name) = CreateObject("scripting.dictionary")
  14.       r = .Cells(.Rows.Count, 1).End(xlUp).Row
  15.       c = .Cells(2, .Columns.Count).End(xlToLeft).Column
  16.       arr = .Range("a2").Resize(r - 1, c)
  17.       For i = 2 To UBound(arr)
  18.         For j = 5 To UBound(arr, 2)
  19.           arr(i, j) = Val(arr(i, j))
  20.         Next
  21.       Next
  22.       d1(ws.Name) = .Range("e2").Resize(1, c - 4)
  23.       ls = 2 + (UBound(arr, 2) - 4) * 6
  24.       For i = 2 To UBound(arr)
  25.         bj = arr(i, 1) & arr(i, 2)
  26.         If Not d(ws.Name).exists(bj) Then
  27.           ReDim brr(1 To ls)
  28.           brr(1) = bj
  29.           For j = 5 To UBound(arr, 2)
  30.             n = (j - 4) * 6 - 3
  31.             If d_js.exists(bj) Then
  32.               If d_js(bj).exists(arr(1, j)) Then
  33.                 brr(n + 4) = d_js(bj)(arr(1, j))
  34.               End If
  35.             End If
  36.           Next
  37.         Else
  38.           brr = d(ws.Name)(bj)
  39.         End If
  40.         brr(2) = brr(2) + 1
  41.         For j = 5 To UBound(arr, 2)
  42.           n = (j - 4) * 6 - 3
  43.           If Len(arr(i, j)) <> 0 Then
  44.             brr(n) = brr(n) + arr(i, j)
  45.             If d_3f.exists(ws.Name) Then
  46.               If d_3f(ws.Name).exists(arr(1, j)) Then
  47.                 If arr(i, j) >= d_3f(ws.Name)(arr(1, j))("及格分") Then
  48.                   brr(n + 1) = brr(n + 1) + 1
  49.                 End If
  50.                 If arr(i, j) >= d_3f(ws.Name)(arr(1, j))("关爱分") Then
  51.                   brr(n + 2) = brr(n + 2) + 1
  52.                 End If
  53.               End If
  54.             End If
  55.           End If
  56.           d(ws.Name)(bj) = brr
  57.         Next
  58.       Next
  59.     End With
  60.   Next
  61.   On Error Resume Next
  62.   Worksheets("各科三率").Delete
  63.   On Error GoTo 0
  64.   Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  65.   With ws
  66.     .Name = "各科三率"
  67.     i1 = 1
  68.     For Each aa In d.keys
  69.       bt = d1(aa)
  70.       With .Cells(i1, 1)
  71.         .Value = aa & "成绩分析"
  72.         .Resize(1, 2 + UBound(bt, 2) * 6).Merge
  73.         With .Font
  74.           .Name = "微软雅黑"
  75.           .Size = 18
  76.         End With
  77.       End With
  78.       With .Cells(i1 + 1, 1)
  79.         .Value = "科目"
  80.         .Resize(1, 2).Merge
  81.       End With
  82.       .Cells(i1 + 2, 1).Resize(1, 2) = Array("学校班级", "与考人数")
  83.       n = 3
  84.       For j = 1 To UBound(bt, 2)
  85.         With .Cells(i1 + 1, n)
  86.           .Value = bt(1, j)
  87.           .Resize(1, 6).Merge
  88.         End With
  89.         .Cells(i1 + 2, n).Resize(1, 6) = Array("平均分", "及格率", "关爱率", "三率合计", "科任教师", "排名")
  90.         n = n + 6
  91.       Next
  92.       ReDim crr(1 To d(aa).Count, 1 To 2 + UBound(bt, 2) * 6)
  93.       ReDim drr(1 To 2 + UBound(bt, 2) * 6)
  94.       drr(1) = "区平均"
  95.       m = 0
  96.       For Each bb In d(aa).keys
  97.         brr = d(aa)(bb)
  98.         m = m + 1
  99.         For j = 1 To UBound(brr)
  100.           crr(m, j) = brr(j)
  101.         Next
  102.         drr(2) = drr(2) + brr(2)
  103.         For k = 3 To UBound(brr) Step 6
  104.           For j = 1 To 4
  105.             drr(k + j - 1) = drr(k + j - 1) + brr(k + j - 1)
  106.           Next
  107.         Next
  108.       Next
  109.       For i = 1 To UBound(crr)
  110.         If Len(crr(i, 2)) <> 0 And crr(i, 2) <> 0 Then
  111.           For j = 3 To UBound(crr, 2) Step 6
  112.             crr(i, j) = Round(crr(i, j) / crr(i, 2), 2)
  113.             crr(i, j + 1) = Round(crr(i, j + 1) / crr(i, 2), 4)
  114.             crr(i, j + 2) = Round(crr(i, j + 2) / crr(i, 2), 4)
  115.             crr(i, j + 3) = Round(crr(i, j) * 0.4 + crr(i, j + 1) * 0.4 * 100 + crr(i, j + 2) * 0.2 * 100, 2)
  116.           Next
  117.         End If
  118.       Next
  119.       For j = 3 To UBound(crr, 2) Step 6
  120.         d2.RemoveAll
  121.         For i = 1 To UBound(crr)
  122.           If Len(crr(i, j + 3)) <> 0 Then
  123.             d2(crr(i, j + 3)) = d2(crr(i, j + 3)) + 1
  124.           End If
  125.         Next
  126.         nn = 1
  127.         kk = d2.keys
  128.         For k = 0 To UBound(kk)
  129.           mm = Application.Large(kk, k + 1)
  130.           ss = d2(mm)
  131.           d2(mm) = nn
  132.           nn = nn + ss
  133.         Next
  134.         For i = 1 To UBound(crr)
  135.           If Len(crr(i, j + 3)) <> 0 Then
  136.             crr(i, j + 5) = d2(crr(i, j + 3))
  137.           End If
  138.         Next
  139.       Next
  140.       If Len(drr(2)) <> 0 And drr(2) <> 0 Then
  141.         For j = 3 To UBound(crr, 2) Step 6
  142.           drr(j) = Round(drr(j) / drr(2), 2)
  143.           drr(j + 1) = Round(drr(j + 1) / drr(2), 4)
  144.           drr(j + 2) = Round(drr(j + 2) / drr(2), 4)
  145.           drr(j + 3) = Round(drr(j) * 0.4 + drr(j + 1) * 0.4 * 100 + drr(j + 2) * 0.2 * 100, 2)
  146.         Next
  147.       End If
  148.       .Cells(i1 + 3, 1).Resize(1, UBound(drr)) = drr
  149.       .Cells(i1 + 4, 1).Resize(UBound(crr), UBound(crr, 2)) = crr
  150.       With .Cells(i1 + 1, 1).Resize(2 + 1 + UBound(crr), UBound(crr, 2))
  151.         .Borders.LineStyle = xlContinuous
  152.         .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
  153.         With .Font
  154.           .Name = "微软雅黑"
  155.           .Size = 11
  156.         End With
  157.       End With
  158.       i1 = i1 + 2 + UBound(crr) + 2
  159.     Next
  160.     c = .UsedRange.Find(what:="*", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlPrevious).Column
  161.     For j = 3 To c Step 6
  162.       .Columns(j + 1).Resize(, 2).NumberFormatLocal = "0.00%"
  163.     Next
  164.     With .UsedRange
  165.       .HorizontalAlignment = xlCenter
  166.       .VerticalAlignment = xlCenter
  167.     End With
  168.     .UsedRange.EntireColumn.AutoFit
  169.   End With
  170.   Application.ScreenUpdating = True
  171.   MsgBox "各科三率计算完毕!"
  172. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-7-20 19:32 | 显示全部楼层
增加了三分分析的代码。

成绩分析.rar

351.83 KB, 下载次数: 21

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-20 19:38 来自手机 | 显示全部楼层
zpy2 发表于 2020-7-20 18:21
select 班级,avg(政治),avg(语文) from 学生成绩明细表 group by 班级

平均分用 avg就行,及格分数线 ...

select rowid,姓名,语文,(select count(*)+1 from 学生成绩明细表 as a where cast(a.语文 as long)>cast(b.语文 as long)) 排名 from 学生成绩明细表 b order by cast(语文 as long) desc limit 531,1

这个60%排名的及格分的确难度系数大的,sql不是很方便,一条只能算一个。。。。
SRC_20200720_193505.png
SRC_20200720_193444.png
SRC_20200720_193733.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-20 19:47 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-20 19:48 | 显示全部楼层
zpy2 发表于 2020-7-20 19:38
select rowid,姓名,语文,(select count(*)+1 from 学生成绩明细表 as a where cast(a.语文 as long)>cast ...

谢谢老师,辛苦了

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-20 20:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-7-20 20:46 | 显示全部楼层
班级排名统计代码
  1. Sub test4()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Application.ScreenUpdating = False
  6.   Application.DisplayAlerts = False
  7.   Set d = CreateObject("scripting.dictionary")
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   Set d2 = CreateObject("scripting.dictionary")
  10.   Call pub
  11.   For Each ws In Worksheets(Array("七年级", "八年级", "九年级"))
  12.     With ws
  13.       Set d(ws.Name) = CreateObject("scripting.dictionary")
  14.       r = .Cells(.Rows.Count, 1).End(xlUp).Row
  15.       c = .Cells(2, .Columns.Count).End(xlToLeft).Column
  16.       d1(ws.Name) = .Range("e2").Resize(1, c - 4)
  17.       arr = .Range("a2").Resize(r - 1, c + 1)
  18.       arr(1, UBound(arr, 2)) = "全科"
  19.       For i = 2 To UBound(arr)
  20.         For j = 5 To UBound(arr, 2) - 1
  21.           arr(i, j) = Val(arr(i, j))
  22.           arr(i, UBound(arr, 2)) = arr(i, UBound(arr, 2)) + arr(i, j)
  23.         Next
  24.       Next
  25.       
  26.       ls = 8
  27.       For i = 2 To UBound(arr)
  28.         bj = arr(i, 1) & arr(i, 2)
  29.         If Not d(ws.Name).exists(bj) Then
  30.           ReDim brr(1 To ls)
  31.           brr(1) = bj
  32.         Else
  33.           brr = d(ws.Name)(bj)
  34.         End If
  35.         brr(2) = brr(2) + 1
  36.         jgkm = 0
  37.         yxkm = 0
  38.         For j = 5 To UBound(arr, 2) - 1
  39.           If Len(arr(i, j)) <> 0 Then
  40.             brr(3) = brr(3) + arr(i, j)
  41.           End If
  42.           If d_3f.exists(ws.Name) Then
  43.             If d_3f(ws.Name).exists(arr(1, j)) Then
  44.               If arr(i, j) >= d_3f(ws.Name)(arr(1, j))("及格分") Then
  45.                 jgkm = jgkm + 1
  46.               End If
  47.             End If
  48.             If InStr("语文数学英语物理", arr(1, j)) <> 0 Then
  49.               If d_3f(ws.Name).exists(arr(1, j)) Then
  50.                 If arr(i, j) >= d_3f(ws.Name)(arr(1, j))("优秀分") Then
  51.                   yxkm = yxkm + 1
  52.                 End If
  53.               End If
  54.             End If
  55.           End If
  56.         Next
  57.         If jgkm = UBound(arr, 2) - 5 Then
  58.           brr(4) = brr(4) + 1
  59.         End If
  60.         If yxkm = IIf(ws.Name = "七年级", 3, 4) Then
  61.           brr(6) = brr(6) + 1
  62.         End If
  63.         If d_3f.exists(ws.Name) Then
  64.           If d_3f(ws.Name).exists("全科") Then
  65.             If arr(i, UBound(arr, 2)) >= d_3f(ws.Name)("全科")("关爱分") Then
  66.               brr(5) = brr(5) + 1
  67.             End If
  68.           End If
  69.         End If
  70.         d(ws.Name)(bj) = brr
  71.       Next
  72.     End With
  73.   Next
  74.   On Error Resume Next
  75.   Worksheets("班级排名").Delete
  76.   On Error GoTo 0
  77.   Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  78.   With ws
  79.     .Name = "班级排名"
  80.     With .Range("a1")
  81.       .Value = "班级排名"
  82.       .Resize(1, 24).Merge
  83.       With .Font
  84.         .Name = "微软雅黑"
  85.         .Size = 18
  86.       End With
  87.     End With
  88.     n = 1
  89.     For Each aa In d.keys
  90.       d2.RemoveAll
  91.       bt = d1(aa)
  92.       With .Cells(2, n)
  93.         .Value = aa
  94.         .Resize(1, 8).Merge
  95.       End With
  96.       .Cells(3, n).Resize(1, 8) = Array("学校班级", "与考" & vbLf & "人数", "平均" & vbLf & "分", "全科" & vbLf & "合格率", "关爱" & vbLf & "率", IIf(aa = "七年级", "三科", "四科") & vbLf & "优秀率", "四率" & vbLf & "合计", "排名")
  97.       ReDim crr(1 To d(aa).Count, 1 To 8)
  98.       ReDim drr(1 To 8)
  99.       drr(1) = "区平均"
  100.       m = 0
  101.       For Each bb In d(aa).keys
  102.         brr = d(aa)(bb)
  103.         m = m + 1
  104.         For j = 1 To UBound(brr)
  105.           crr(m, j) = brr(j)
  106.         Next
  107.         For j = 2 To 6
  108.           drr(j) = drr(j) + brr(j)
  109.         Next
  110.       Next
  111.       For i = 1 To UBound(crr)
  112.         If Len(crr(i, 2)) <> 0 And crr(i, 2) <> 0 Then
  113.           crr(i, 3) = Round(crr(i, 3) / crr(i, 2) / UBound(bt, 2), 2)
  114.           crr(i, 4) = Round(crr(i, 4) / crr(i, 2), 4)
  115.           crr(i, 5) = Round(crr(i, 5) / crr(i, 2), 4)
  116.           crr(i, 6) = Round(crr(i, 6) / crr(i, 2), 4)
  117.           crr(i, 7) = Round(crr(i, 3) * 0.3 + crr(i, 4) * 0.3 * 100 + crr(i, 5) * 0.2 * 100 + crr(i, 6) * 0.2 * 100, 2)
  118.           d2(crr(i, 7)) = d2(crr(i, 7)) + 1
  119.         End If
  120.       Next
  121.       nn = 1
  122.       kk = d2.keys
  123.       For k = 0 To UBound(kk)
  124.         mm = Application.Large(kk, k + 1)
  125.         ss = d2(mm)
  126.         d2(mm) = nn
  127.         nn = nn + ss
  128.       Next
  129.       For i = 1 To UBound(crr)
  130.         If Len(crr(i, 7)) <> 0 Then
  131.           crr(i, 8) = d2(crr(i, 7))
  132.         End If
  133.       Next
  134.       If Len(drr(2)) <> 0 And drr(2) <> 0 Then
  135.         drr(3) = Round(drr(3) / drr(2) / UBound(bt, 2), 2)
  136.         drr(4) = Round(drr(4) / drr(2), 4)
  137.         drr(5) = Round(drr(5) / drr(2), 4)
  138.         drr(6) = Round(drr(6) / drr(2), 4)
  139.         drr(7) = Round(drr(3) * 0.3 + drr(4) * 0.3 * 100 + drr(5) * 0.2 * 100 + drr(6) * 0.2 * 100, 2)
  140.         d2(drr(7)) = d2(drr(7)) + 1
  141.       End If
  142.       .Cells(4, n).Resize(1, UBound(drr)) = drr
  143.       .Cells(5, n).Resize(UBound(crr), UBound(crr, 2)) = crr
  144.       With .Cells(2, n).Resize(2 + 1 + UBound(crr), UBound(crr, 2))
  145.         .Borders.LineStyle = xlContinuous
  146.         .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
  147.         With .Font
  148.           .Name = "微软雅黑"
  149.           .Size = 11
  150.         End With
  151.       End With
  152.       n = n + 8
  153.     Next
  154.     c = .UsedRange.Find(what:="*", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlPrevious).Column
  155.     For j = 1 To c Step 8
  156.       .Columns(j + 3).Resize(, 3).NumberFormatLocal = "0.00%"
  157.     Next
  158.     With .UsedRange
  159.       .HorizontalAlignment = xlCenter
  160.       .VerticalAlignment = xlCenter
  161.     End With
  162.     .UsedRange.EntireColumn.AutoFit
  163.   End With
  164.   Application.ScreenUpdating = True
  165.   MsgBox "各科三率计算完毕!"
  166. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2020-7-20 20:47 | 显示全部楼层
增加了班级排名代码。其他的楼主也没样表,不知道怎么写了。

成绩分析.rar

356.63 KB, 下载次数: 14

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

本版积分规则

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

GMT+8, 2024-11-21 20:54 , Processed in 0.039004 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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