ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何进行分类统计?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-17 20:09 | 显示全部楼层
ykcbf1100 发表于 2024-7-17 20:07
你用他的代码就行了。忽略我的代码。

我看两个都很好,想学学,我尝试加入弹出对话框输入要统计名次,但是弹出对话框后,统计就出问题。Sub test()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
   
    ' 弹出对话框让用户输入名次段,以逗号分隔
    Dim inputMcd As String
    inputMcd = InputBox("请输入名次段,以逗号分隔", "输入名次段", "11000,19000")
   
    ' 将输入的名次段转换为数组
    Dim mcd As Variant
    mcd = Split(inputMcd, ",")
   
    ' 将名次段数组的元素转换为整数
    Dim i As Integer
    For i = LBound(mcd) To UBound(mcd)
        mcd(i) = CInt(mcd(i))
    Next i
   
    arr = Sheets("原始数据").[a1].CurrentRegion
    Set d = CreateObject("scripting.dictionary")
    Set d2 = CreateObject("scripting.dictionary")
   
    For j = 3 To UBound(arr, 2)
        If arr(1, j) <> "名次" Then
            d(arr(1, j)) = j
        End If
    Next
   
    For m = 0 To UBound(mcd)
        mc = mcd(m)
        For i = 2 To UBound(arr)
            bj = arr(i, 2)
            If Not d2.exists(bj) Then Set d2(bj) = CreateObject("scripting.dictionary")
            If Not d2(bj).exists(mc) Then Set d2(bj)(mc) = CreateObject("scripting.dictionary")
            For Each k In d.keys
                If arr(i, 4) <= mc Then
                    If arr(i, d(k) + 1) <= mc Then
                        d2(bj)(mc)(k) = d2(bj)(mc)(k) + 1
                    End If
                End If
            Next
        Next
    Next
   
    Set sh = Sheets("统计结果")
    sh.UsedRange = ""
    sh.UsedRange.UnMerge
    sh.[a1] = "班级"
    sh.[b1] = "名次段"
    sh.[c1].Resize(1, d.Count) = d.keys
   
    Dim hb As Range
    ksh = 2
    i = 2: j = 0
    For Each bj In d2.keys
        sh.Cells(i, 1) = bj
        For Each mc In d2(bj).keys
            sh.Cells(i, 2) = mc
            If hb Is Nothing Then
                Set hb = sh.Cells(i, 1)
            Else
                Set hb = Union(hb, sh.Cells(i, 1))
            End If
            For j = 3 To d.Count + 3
                sh.Cells(i, j) = d2(bj)(mc)(sh.Cells(1, j).Value)
            Next
            i = i + 1
        Next
        hb.Merge
        hb.HorizontalAlignment = xlCenter
        Set hb = Nothing
    Next
   
    sh.Range(sh.Cells(1, 1), sh.Cells(i - 1, d.Count + 2)).Borders.Weight = xlThin
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "OK!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-7-18 09:07 | 显示全部楼层
lion118 发表于 2024-7-17 17:02
您好,您这个代码运行不了。谢谢。

不好意思,忘了字典还是前期引用,这回应该没问题了
Sub test()
Set d = CreateObject ("scripting.dictionary")
Set dd = CreateObject ("scripting.dictionary")
With Sheets("原始数据")
arr = .UsedRange
For i = 3 To UBound(arr, 2)
    If arr(1, i) <> "名次" Then
        d(arr(1, i)) = i + 1
    End If
Next i
ls = d.Items
For i = 2 To UBound(arr)
    dd(arr(i, 2)) = ""
Next i
bj = dd.Keys
For j = 0 To UBound(ls)
    For i = 0 To UBound(bj)
        n = WorksheetFunction.CountIfs(.Columns(2), bj(i), .Columns(ls(j)), "<11000")
        m = WorksheetFunction.CountIfs(.Columns(2), bj(i), .Columns(ls(j)), "<19000")
        If n <> 0 Then Sheets("统计结果").Cells(2 + 2 * i, 3 + j) = n
        If m <> 0 Then Sheets("统计结果").Cells(3 + 2 * i, 3 + j) = m
    Next i
Next j
End With
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 03:29 , Processed in 0.035874 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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