ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 分类排序问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-24 16:21 | 显示全部楼层
lzybones 发表于 2015-11-24 16:03
谢谢老师!正是我要的结果!但研究了半天,还是没搞明白怎么做到的,没法举一反三,留下来慢慢琢磨吧

我说一下我的思路
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

1、红色部分建立数组ARR1(1 To 3, 1 To C),把字节为3的编号和次数写入ARR1(1 ,C)和ARR1(2,C),同时把对应的字节为5的内容写进ARR2,并数组镶套数组ARR1(3,C)=ARR2
2、蓝色部分用排序法根据次数从大到小排序ARR1
3、红紫色部分把ARR1内容写入工作表,其中绿色部分用排序法根据次数从大到小排序ARR2并写入工作表

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-24 17:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
39660519 发表于 2015-11-24 16:21
我说一下我的思路
Sub 分类排序()
Range("E3:F" & Rows.Count) = ""

多谢老师的解释,分段运行后总算明白了,关键在于那个数组嵌套数组,第一次接触,有点理解不了

TA的精华主题

TA的得分主题

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

非常感谢,虽然缺少数据块内的排序,但思路很清晰,一眼就能看懂,结合7楼,也能实现结果

TA的精华主题

TA的得分主题

发表于 2015-11-24 20:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 百度不到去谷歌 于 2015-11-24 20:08 编辑
lzybones 发表于 2015-11-24 14:55
可能没写明白,左边的只是一个类别名称,需要按右边的次数大小来排序

早说按右边啊 那么辅助列改为 row()*10^5+B3下拉降序

TA的精华主题

TA的得分主题

发表于 2015-11-25 16:39 | 显示全部楼层
百度不到去谷歌 发表于 2015-11-24 20:01
早说按右边啊 那么辅助列改为 row()*10^5+B3下拉降序

也不能全按右边,这样3字节的字段就排到下面去了。期待更好的公式解答。

TA的精华主题

TA的得分主题

发表于 2015-11-25 18:49 | 显示全部楼层
t13564865256 发表于 2015-11-25 16:39
也不能全按右边,这样3字节的字段就排到下面去了。期待更好的公式解答。

3字节的字段,你的要求是如何排?

TA的精华主题

TA的得分主题

发表于 2015-11-26 08:59 | 显示全部楼层
hlly888 发表于 2015-11-25 18:49
3字节的字段,你的要求是如何排?

不是我的要求啊,楼主发的贴。我只是看看公式能不能解决而已。
一楼里面楼主都模拟了结果图了。我觉得表述的够清楚了。连文字说明都不需要。

TA的精华主题

TA的得分主题

发表于 2015-11-26 10:07 | 显示全部楼层
本帖最后由 问山8828680 于 2015-11-26 10:34 编辑

拖火车
INDEX(A:A,MAX(IF(LARGE(SUMIF($A$3:$A$12,LEFT($A$3:$A$12,3),$B$3:$B$12)+$B$3:$B$12%%,ROW(A1))=SUMIF($A$3:$A$12,LEFT($A$3:$A$12,3),$B$3:$B$12)+$B$3:$B$12%%,ROW($A$3:$A$12))))

TA的精华主题

TA的得分主题

发表于 2015-11-27 08:41 | 显示全部楼层

稍稍

本帖最后由 香川群子 于 2015-11-27 08:53 编辑
t13564865256 发表于 2015-11-25 16:39
也不能全按右边,这样3字节的字段就排到下面去了。期待更好的公式解答。


总结一下,排序规则应为:
① 以右边次数对大类进行降序排序…… 109(66)>105(44)>108(31)
② 每个大类中的子项也按次数进行降序排序……略。

如需使用辅助列公式,一定是需要数组函数。呵呵。

稍稍看了看,公式有了:
  1. =TEXT(SUM(IF(LEFT(A$3:A$12,3)=LEFT(A3,3),B$3:B$12)),"0000")&TEXT(B3,"0000")
复制代码
其中,区域范围A$3:A$12和B$3:B$12根据实际情况改。
数值文本化位数"0000"也根据实际需求改即可。

原理,取A列大类前三位对应的B列次数总合计Sum结果,文本化后拼接在B列次数之前,即可。
注意,Sum结果是实际大类总和的2倍(小类合计+大类)

效果如下:
Pic.png



TA的精华主题

TA的得分主题

发表于 2015-11-27 10:26 | 显示全部楼层
香川群子 发表于 2015-11-27 08:41
总结一下,排序规则应为:
① 以右边次数对大类进行降序排序…… 109(66)>105(44)>108(31)
② 每个大 ...

防止次数相同混项
  1. =TEXT(SUM(IF(LEFT(A$3:A$12,3)=LEFT(A3,3),B$3:B$12)),"0000")&LEFT(A3,3)&TEXT(B3,"0000")
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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