ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 考试成绩分析求助

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-31 15:42 | 显示全部楼层
zopey 发表于 2018-10-31 15:01
按班级 统计各科成绩

谢谢您在百忙中帮我做这个文件,这个附件是您检查过 没问题的那个附件吗?》

TA的精华主题

TA的得分主题

发表于 2018-10-31 15:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
熊文来 发表于 2018-10-31 15:42
谢谢您在百忙中帮我做这个文件,这个附件是您检查过 没问题的那个附件吗?》

代码部分 我检查过了没有大问题,能够一键运行。
至于统计数据是否可用,需要你要在报表建立公式 检查。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-31 18:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zopey 发表于 2018-10-31 15:53
代码部分 我检查过了没有大问题,能够一键运行。
至于统计数据是否可用,需要你要在报表建立公式 检查。 ...

程序有点小问题 可以加你QQ和你沟通吗?

TA的精华主题

TA的得分主题

发表于 2018-10-31 21:25 | 显示全部楼层
本帖最后由 zopey 于 2018-10-31 21:31 编辑


2007--2010
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=excel 12.0;Data Source=" & ThisWorkbook.FullName

2003
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=excel 8.0;Data Source=" & ThisWorkbook.FullName

TA的精华主题

TA的得分主题

发表于 2018-10-31 22:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-11-1 11:32 | 显示全部楼层
有时间想试一试看会不会做的,但有的地方看不明白。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-1 12:12 | 显示全部楼层
xiaoqiang17 发表于 2018-11-1 11:32
有时间想试一试看会不会做的,但有的地方看不明白。

文件里有说明,确实要理解我这文件的意图 是要花点时间。不明白的地方和我留言。我每天都会不定时进来的。

TA的精华主题

TA的得分主题

发表于 2018-11-1 13:31 | 显示全部楼层
'类似的这帖子你发过。只写了第一个问题的代码,后面2个问题理解起来太费劲,,,

'假设A、B、C列有序,如果无序先手动排序没必要拿代码来排序

'正排名应该为降序排名,你这怎么是升序的。如果确实是这样修改rank函数的上一行:false<->true

Option Explicit

Sub test()
  Dim arr, pos, i, j, k, temp
  pos = Array(6, 7, 8, 9) '语文数学英语总分列号
  With Sheets("起点成绩")
    arr = .Range("a2:s" & .Cells(Rows.Count, "c").End(xlUp).Row + 1)
    For i = 1 To UBound(arr, 1) - 1: arr(i, 19) = i: Next '辅助列写入序号
    temp = arr
    Call msort(arr, temp, 2, UBound(arr, 1) - 1, 2, True) '年级升序(所有校区)
    For i = 1 To UBound(arr, 1) - 1
      For j = i To UBound(arr, 1) - 1
        If arr(j, 2) <> arr(j + 1, 2) Then '按年级分段
          For k = 0 To UBound(pos) '正排名
            Call msort(arr, temp, i, j, pos(k), False) '降序
            Call rank(arr, i, j, pos(k), pos(k) + UBound(pos) + 1)
          Next
          For k = 0 To UBound(pos) '倒排名
            Call msort(arr, temp, i, j, pos(k), True) '升序
            Call rank(arr, i, j, pos(k), pos(k) + (UBound(pos) + 1) * 2)
          Next
          i = j: Exit For
        End If
    Next j, i
    Call msort(arr, temp, 1, UBound(arr, 1) - 1, 19, True) '按辅助列恢复原序
    For i = 1 To UBound(arr, 1) - 1 '按班级中总分正排名
      For j = i To UBound(arr, 1) - 1
        If arr(j, 3) <> arr(j + 1, 3) Then '按班级分段
          Call msort(arr, temp, i, j, 9, False) '班级总分降序
          Call rank(arr, i, j, 9, 18)
          i = j: Exit For
        End If
    Next j, i
    Call msort(arr, temp, 1, UBound(arr, 1) - 1, 19, True) '按辅助列恢复原序
    .[a2].Resize(UBound(arr, 1) - 1, UBound(arr, 2) - 1) = arr
  End With
End Sub

Function rank(arr, first, last, key, col) '美式排名
  Dim i, j, m
  m = 1: arr(first, col) = 1
  For i = first + 1 To last
    m = m + 1
    arr(i, col) = IIf(arr(i, key) = arr(i - 1, key), arr(i - 1, col), m)
  Next
End Function

Function msort(arr, temp, first, last, key, order)
  Dim i As Long, j As Long, k As Long, kk As Long, mid As Long
  If first <> last Then
    mid = Int((first + last) / 2)
    msort arr, temp, first, mid, key, order
    msort arr, temp, mid + 1, last, key, order
    i = first: j = mid + 1: k = first
    While i <= mid And j <= last
      If arr(i, key) > arr(j, key) Xor order Then
        For kk = 1 To UBound(arr, 2): temp(k, kk) = arr(i, kk): Next
        k = k + 1: i = i + 1
      Else
        For kk = 1 To UBound(arr, 2): temp(k, kk) = arr(j, kk): Next
        k = k + 1: j = j + 1
      End If
    Wend
    While i <= mid
      For kk = 1 To UBound(arr, 2): temp(k, kk) = arr(i, kk): Next
      k = k + 1: i = i + 1
    Wend
    While j <= last
      For kk = 1 To UBound(arr, 2): temp(k, kk) = arr(j, kk): Next
      k = k + 1: j = j + 1
    Wend
    For i = first To last
      For j = 1 To UBound(arr, 2)
        arr(i, j) = temp(i, j)
    Next j, i
  End If
End Function

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-1 14:15 | 显示全部楼层
一把小刀闯天下 发表于 2018-11-1 13:31
'类似的这帖子你发过。只写了第一个问题的代码,后面2个问题理解起来太费劲,,,

'假设A、B、C列有序, ...

大侠 我主要是要是解决问题2  三率那张表。有空帮我看看 谢谢

TA的精华主题

TA的得分主题

发表于 2018-11-1 14:58 | 显示全部楼层
熊文来 发表于 2018-11-1 14:15
大侠 我主要是要是解决问题2  三率那张表。有空帮我看看 谢谢

你这第二个问题看得我头都大了一圈也没看懂,就算看得懂估计也是一个重体力活。可以简化表格这样才会有人来帮你,,,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 08:09 , Processed in 0.044531 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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