ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba按字典多条件统计分组班级平均分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-19 00:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
近百万数据没问题啊

TA的精华主题

TA的得分主题

发表于 2022-11-19 07:14 来自手机 | 显示全部楼层
·遁去的一· 发表于 2022-11-19 00:02
近百万数据没问题啊

是的,并且还与电脑配置也有关系,考虑不周,用词不妥,误会chxw68了。再次感谢chxw68!

TA的精华主题

TA的得分主题

发表于 2022-11-19 12:17 | 显示全部楼层
chxw68 发表于 2022-11-18 17:25
代码速度太慢,故删除。

测试数据量大,还与我电脑用了多年配置早就过时有很大关系,表述欠妥,引起误解了,对不起啊!已经很好解决我的求助了。借用您的签名,请多包涵。

TA的精华主题

TA的得分主题

发表于 2025-12-11 15:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lcmphy 于 2025-12-11 16:43 编辑
非常感谢您的帮助!一直在用您当时因误会根据15楼附件写好又删除的代码,可以在参考人数后加一列各班最高分么?最高分不需要排名,接下来的平均分与平均分排名继续保留,同样适合多个组别、多个班级、多个科目。
原有代码如下:
Sub test()
    Dim r%, i%
    Dim arr, brr
    Dim d As Object
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    With Worksheets("sheet1")
        r = .Cells(.Rows.Count, 1).End(xlUp).Row
        c = .Cells(1, .Columns.Count).End(xlToLeft).Column
        arr = .Range("a1").Resize(r, c)
    End With
    For j = 7 To UBound(arr, 2)
        If Application.Count(Application.Index(arr, 0, j)) <> 0 Then
            Set d(arr(1, j)) = CreateObject("scripting.dictionary")
            For i = 2 To UBound(arr)
                If Len(arr(i, j)) <> 0 Then
                    If Not d(arr(1, j)).exists(arr(i, 1)) Then
                        Set d(arr(1, j))(arr(i, 1)) = CreateObject("scripting.dictionary")
                    End If
                    If Not d(arr(1, j))(arr(i, 1)).exists(arr(i, 3)) Then
                        ReDim brr(1 To 5)
                        brr(1) = arr(i, 1)
                        brr(2) = arr(i, 3)
                    Else
                        brr = d(arr(1, j))(arr(i, 1))(arr(i, 3))
                    End If
                    brr(3) = brr(3) + 1
                    brr(4) = brr(4) + arr(i, j)
                    d(arr(1, j))(arr(i, 1))(arr(i, 3)) = brr
                End If
            Next
        End If
    Next
    With Worksheets("统计")
        .Cells.Clear
        n = 1
        For Each aa In d.keys
            With .Cells(1, n)
                .Value = aa
                .Resize(1, 5).Merge
                With .Font
                    .Name = "微软雅黑"
                    .Size = 11
                    .Bold = True
                End With
            End With
            With .Cells(2, n).Resize(1, 5)
                .Value = Array("科类", "班级", "参考人数", "平均分", "排名")
                .Borders.LineStyle = xlContinuous
                .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
                With .Font
                    .Name = "微软雅黑"
                    .Size = 11
                    .Bold = True
                End With
            End With
            r = 3
            For Each bb In d(aa).keys
                d1.RemoveAll
                ReDim crr(1 To d(aa)(bb).Count + 1, 1 To 5)
                crr(UBound(crr), 2) = "合计"
                m = 0
                For Each cc In d(aa)(bb).keys
                    brr = d(aa)(bb)(cc)
                    m = m + 1
                    For j = 1 To UBound(brr)
                        crr(m, j) = brr(j)
                    Next
                    For j = 3 To 4
                        crr(UBound(crr), j) = crr(UBound(crr), j) + brr(j)
                    Next
                Next
                For i = 1 To UBound(crr)
                    If Len(crr(i, 3)) <> 0 And crr(i, 3) <> 0 Then
                        crr(i, 4) = Application.Round(crr(i, 4) / crr(i, 3), 2)
                    End If
                Next
                For i = 1 To UBound(crr) - 1
                    If Len(crr(i, 4)) <> 0 Then
                        d1(crr(i, 4)) = d1(crr(i, 4)) + 1
                    End If
                Next
                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(crr) - 1
                    If Len(crr(i, 4)) <> 0 Then
                        crr(i, 5) = d1(crr(i, 4))
                    End If
                Next
                With .Cells(r, n).Resize(UBound(crr), UBound(crr, 2))
                    .Value = crr
                    .Borders.LineStyle = xlContinuous
                    .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
                    With .Font
                        .Name = "微软雅黑"
                        .Size = 11
                    End With
                End With
                .Cells(r, n).Resize(UBound(crr), 1).Merge
                r = r + UBound(crr)
            Next
            n = n + 6

        Next
        With .UsedRange
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    End With

End Sub

TA的精华主题

TA的得分主题

发表于 2025-12-11 17:16 | 显示全部楼层
lcmphy 发表于 2025-12-11 15:57
非常感谢您的帮助!一直在用您当时因误会根据15楼附件写好又删除的代码,可以在参考人数后加一列各班最高分 ...

不要好意思,是19楼的附件。

TA的精华主题

TA的得分主题

发表于 2025-12-11 17:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
修改好了。

联考成绩表.rar

504.75 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-12-11 20:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-16 03:19 , Processed in 0.020360 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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