ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 分类排序问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-24 13:46 | 显示全部楼层 |阅读模式
需要先把大类(三位数字)排序,再把三位数字下面的小类(五位数字)排序
123.png

排序.zip

7.05 KB, 下载次数: 53

TA的精华主题

TA的得分主题

发表于 2015-11-24 14:31 | 显示全部楼层
辅助列left(A2,3)&text(b2,"0000")
下拉 辅助列降序

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-24 14:36 | 显示全部楼层
百度不到去谷歌 发表于 2015-11-24 14:31
辅助列left(A2,3)&text(b2,"0000")
下拉 辅助列降序

这样只是大类里的小类排序了,还需要先排序大类,比如:大类(109)>大类(105)>大类(108)

TA的精华主题

TA的得分主题

发表于 2015-11-24 14:38 | 显示全部楼层
本帖最后由 百度不到去谷歌 于 2015-11-24 14:39 编辑
lzybones 发表于 2015-11-24 14:36
这样只是大类里的小类排序了,还需要先排序大类,比如:大类(109)>大类(105)>大类(108)

你试过了再说好么
1090043
1080031
难道109不会排在前面?你105排在108前面 就不知道是什么逻辑了 如果是完全自定义的逻辑 只能另外做辅助列

TA的精华主题

TA的得分主题

发表于 2015-11-24 14:42 | 显示全部楼层
百度不到去谷歌 发表于 2015-11-24 14:38
你试过了再说好么
1090043
1080031

他的要求不是按照类别排序,是类别旁边的那排小数字排序。表格公式是很难做到的。

TA的精华主题

TA的得分主题

发表于 2015-11-24 14:45 | 显示全部楼层
想了一下,发现VBA实现起来也挺麻烦的。好像需要重新写入新表。还方便点。可能还要建立数组辅助列。

TA的精华主题

TA的得分主题

发表于 2015-11-24 14:53 | 显示全部楼层
Sub 分类排序()
Range("E3:F" & Rows.Count) = ""
Dim ARR, ARR1(), ARR2(), BM, CS
A = Cells(Rows.Count, "A").End(3).Row
ARR = Range("A3:B" & A)
A = UBound(ARR)
For B = 1 To A
    BM = ARR(B, 1)
    CS = ARR(B, 2)
    If Len(BM) = 3 Then
        C = C + 1
        D = 0
        ReDim Preserve ARR1(1 To 3, 1 To C)
        ARR1(1, C) = BM
        ARR1(2, C) = CS
    Else
        D = D + 1
        If D = 1 Then
            ReDim ARR2(1 To 2, 1 To 1)
        Else
            ARR2 = ARR1(3, C)
        End If
        ReDim Preserve ARR2(1 To 2, 1 To D)
        ARR2(1, D) = BM
        ARR2(2, D) = CS
        ARR1(3, C) = ARR2
    End If
Next B
For A = UBound(ARR1, 2) - 1 To 1 Step -1
    For B = 1 To A
        If ARR1(2, B) < ARR1(2, B + 1) Then
            For C = 1 To 3
                GDZ = ARR1(C, B)
                ARR1(C, B) = ARR1(C, B + 1)
                ARR1(C, B + 1) = GDZ
            Next C
        End If
    Next B
Next A
For A = 1 To UBound(ARR1, 2)
    B = Cells(Rows.Count, "E").End(3).Row + 1
    Cells(B, "E") = ARR1(1, A)
    Cells(B, "F") = ARR1(2, A)
    ARR2 = ARR1(3, A)
    For C = UBound(ARR2, 2) - 1 To 1 Step -1
        For D = 1 To C
            If ARR2(2, D) < ARR2(2, D + 1) Then
                GDZ1 = ARR2(1, D)
                GDZ2 = ARR2(2, D)
                ARR2(1, D) = ARR2(1, D + 1)
                ARR2(2, D) = ARR2(2, D + 1)
                ARR2(1, D + 1) = GDZ1
                ARR2(2, D + 1) = GDZ2
            End If
        Next D
    Next C
    B = Cells(Rows.Count, "E").End(3).Row + 1
    Cells(B, "E").Resize(UBound(ARR2, 2), 2) = WorksheetFunction.Transpose(ARR2)
Next A
End Sub

排序.zip

9.21 KB, 下载次数: 42

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-24 14:55 | 显示全部楼层
百度不到去谷歌 发表于 2015-11-24 14:38
你试过了再说好么
1090043
1080031

可能没写明白,左边的只是一个类别名称,需要按右边的次数大小来排序

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-24 16:03 | 显示全部楼层
39660519 发表于 2015-11-24 14:53
Sub 分类排序()
Range("E3:F" & Rows.Count) = ""
Dim ARR, ARR1(), ARR2(), BM, CS

谢谢老师!正是我要的结果!但研究了半天,还是没搞明白怎么做到的,没法举一反三,留下来慢慢琢磨吧

TA的精华主题

TA的得分主题

发表于 2015-11-24 16:17 | 显示全部楼层
按数据块排序.rar

按数据块排序.rar

15.84 KB, 下载次数: 53

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

本版积分规则

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

GMT+8, 2024-11-15 06:59 , Processed in 0.063221 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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