ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 多Key数组排序(分类、统计、重复处理)-自定义函数

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-18 15:30 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 yjh_27 于 2014-1-29 12:51 编辑

'****************************************************************
'功能:    对二维数组按第L列(多列多次)排序
'函数名:  YjhSort
'参数1:   a          待排序数组
'参数2:   s          排序方式,多列(次)以“,”分隔。可省略,默认为:1 升序
'                     asc或a       升序,按字符排序  大写(忽略大小写)
'                     非 asc a     降序,按字符排序  大写(忽略大小写)
'                     1            升序,按数值排序
'                     非 1 0       降序,按数值排序
'                       1;R;n      对数字按n位取舍(n=2,保留2位小时)
'                     L或Len       按长度排序  L1或Lenasc或La     升序
'                                             非 L1或Lenasc或La   降序
'                     SL;sl1;sl2   按照sl1固定长度进行排序,截取或扩充(扩充符号sl2,可省略,默认为:" ") ,升降序同前
'                     Sp;s1;n      按照s1符号分列 取第n个进行排序,n从0开始。升降序同前。
'                     S;s1;s2;p1   按照s1和s2两符号中间的 进行排序,p1见下一条。升降序同前。
'                     P;p1         含p1(可为"")的排至最后(a升序)或最前(非a降序)。P须位于“;”前、p1位于尾部
'                     P或Pin       按拼音排序 P1或Pinasc或Pa     升序
'                                             非 P1或Pinasc或Pa   降序
'                     0            不排序,用于(合并单元格)分组,本次不排序
'                     R            随机
'
'参数3:   L          排序列,多列以“,”分隔。可省略,默认为:1
'                     u;n          本列按自定义序列排序,n 自定义列号
'                     S            本列字符串的字符顺序是反向的(倒卷的)
'                     R;n          本列处理重复(如:1,2R 为第2列处理重复)  后面的排序将被忽略(已为唯一,无需再排)
'                        n=1           仅唯一
'                        n=2           仅多重(保留一个)
'                        n=3           去重复  默认
'                     c; n         本列分类统计  后面的排序将被忽略,只进行统计。
'                                  输出各列为:1 分类细项;2 统计项(见n说明);最后  分类大项
'                        n=0           全部     以下各项,以","分隔
'                        n=1           计数
'                        n=2           平均         字符项(参数2指定)返回""
'                        n=3           合计  默认   字符项(参数2指定)返回"|"连接的各合计子项
'                        n=4           合计子项     返回合计n=3的最小项
'                        n=5           合计子项     返回合计n=3的最大项
'                        n=6           合计子项     返回合计n=3的首项
'                        n=7           合计子项     返回合计n=3的末项
'
'
'参数4:   L0         不参与排序列(各次),可省略,默认为:""
'                     W            返回排序位数组(需置于首位)
'参数5:   m          参与排序列起始行,可省略,默认为:LBound(a, 1)
'参数6:   n          参与排序列结束行,可省略,默认为:UBound(a, 1)
'参数7:   hz         指定行数 成组排序,可省略,默认为: 1。
'                     为0时不固定行数(合并单元格),本列排序
'参数8:   hzi        行组参与排序行,可省略,默认为: 1。1<=hzi<=hz
'参数9:   st         第二列后按S型(升序、降序交叉)排序,可省略,默认为:False
'参数10:  user       自定义序列,可省略,默认为:""
'返回值:  多列排序的数组
'使用方法:arr = YjhSort(A)
'

一维数组也可应用

应用案例
筛选出不同的日期 从近到远排列[求助]
关于VBA特殊排序的紧急求助
请教各位高人:关于在数组里对日期排序的问题?

【已解决】按照两个特殊符号中间的数字排序[求助] 排序问题
[求助] 表格排序转换

如何快速删除一部车同一个人同一天重复的刷卡记录  12L


求平均值   12L
求救!!数组公式:两张表,如何求不同日期,人员的总产量   10L
http://club.excelhome.net/thread-1091107-1-1.html


求修改按业务员销售汇总表  12L
http://club.excelhome.net/thread-1091486-1-1.html

在总表中求出某一个班总分前十五个学生语文学科的人 均 分  16L
http://club.excelhome.net/thread-1090709-1-1.html

如何用VBA把重复数据按重复次数分类,并删除掉重复项只留一个?
http://club.excelhome.net/thread-1091678-1-1.html

请教下面这种情况该如何写sql排序代码,各位高手SOS
http://club.excelhome.net/thread-1091700-1-1.html

求VBA代码---大神教我
http://club.excelhome.net/thread-1091538-1-1.html

对比a列和b列,找出相同的数据并删除,并将剩下的显示在c列和d列
http://club.excelhome.net/thread-1091077-1-1.html

用vba求全年工资和   9L
http://club.excelhome.net/thread-1091904-1-1.html

请教一个找差异的问题    (按绝对值排序)
http://club.excelhome.net/thread-1092024-1-1.html

求助,如何能将多个内容汇总在同一单元格里,且列出大值
http://club.excelhome.net/thread-1092153-1-1.html





补充内容 (2014-2-5 17:53):
统计姓名的出现次数用VBA怎么写?
http://club.excelhome.net/thread-1092690-1-1.html


补充内容 (2014-2-6 15:07):
按标准提取信息
http://club.excelhome.net/thread-1092486-1-1.html
48 L   自定义序列

补充内容 (2014-2-10 18:57):
相同帐号的正负值抵消,如何提高VBA执行速度?
http://club.excelhome.net/thread-1093541-1-1.html
23L   27L   绝对值排序应用

补充内容 (2014-2-13 22:33):
请下载8L 更新

多Key数组排序V0.rar

76.01 KB, 下载次数: 290

记录不用下载。请下载最后的

多Key数组排序V0.rar

79.78 KB, 下载次数: 197

增加分列,改进不重复

多Key数组排序V01a.rar

156.33 KB, 下载次数: 232

增加分类统计

多Key数组排序V01b.rar

160.49 KB, 下载次数: 253

增加自定义序列

多Key数组排序V01c (1).rar

187.57 KB, 下载次数: 259

修正统计

多Key数组排序V01d (1).rar

172.04 KB, 下载次数: 594

增加绝对值

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-19 14:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 yjh_27 于 2014-1-24 21:40 编辑

精简版本  
'****************************************************************
'功能:    对二维数组按第L列(多列)排序
'函数名:  YjhSort0
'参数1:   a          待排序数组
'参数2:   s          排序方式,多列以“,”分隔。可省略,默认为:1 升序
'                     asc或a          升序,按字符排序
'                     0 、非 asc a    降序,按字符排序
'                     1         升序,按数值排序
'                     非 1 0    降序,按数值排序
'                     L或Len  按长度排序  L1或Lenasc或La     升序
'                                         非 L1或Lenasc或La   降序
'
'参数3:   L          排序列,多列以“,”分隔。可省略,默认为:1
'参数4:   m          参与排序列起始行,可省略,默认为:LBound(a, 1)
'参数5:   n          参与排序列结束行,可省略,默认为:UBound(a, 1)
'返回值:  多列排序的数组
'使用方法:arr = YjhSort0(A)
'



应用案例
求:将区域中各数字每隔3行为一小组按出现次数升序排序的vba程序

行排序(转置后用本自定义函数排序,再转置输出。此方法同样适用1L)


[求助] 取满足条件的平均值

首先是语文先按降序排列,然后取所有的考生的40%统计出各学校语文的人数作为分子,分
http://club.excelhome.net/thread-1090336-1-1.html










补充内容 (2014-3-16 18:38):
应用实例

用代码根据三项指标值的选出最优组和最劣组-改进
http://club.excelhome.net/thread-1103367-1-1.html     9L

多Key数组排序(精简).rar

26.47 KB, 下载次数: 437

TA的精华主题

TA的得分主题

发表于 2014-2-11 10:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-2-11 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参数看上去挺复杂的……不知道采用何种排序算法、和工作表排序比效率如何?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 13:17 | 显示全部楼层
本帖最后由 yjh_27 于 2014-2-11 13:28 编辑
香川群子 发表于 2014-2-11 11:35
参数看上去挺复杂的……不知道采用何种排序算法、和工作表排序比效率如何?

排序 核心 是 Zamyi 大侠的。我只是扩展应用。
效率比我原来所用的排序高很多。

很复杂的排序要求大多可一次完成。
如:相同帐号的正负值抵消,如何提高VBA执行速度?
http://club.excelhome.net/thread-1093541-1-1.html
23L   27L   绝对值排序应用就是:1 按账号  2 按金额绝对值 3 按金额   排序   将正负值抵消项目排在一起在判断。


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 13:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如何用VBA解决这个排序问题,请高手们帮忙!
http://club.excelhome.net/thread-1093436-1-1.html

这个排序要求特殊。用数组下标解决。在此记录。

TA的精华主题

TA的得分主题

发表于 2014-2-11 15:24 | 显示全部楼层
很多排序问题,可以通过设计辅助列写入公式,然后按公式计算结果来进行工作表排序。

至于相当复杂的要求,还是专门定制宏代码比较好。

…………
没想到楼主整理了那么多的复杂排序案例,真是了不起!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-4 14:40 | 显示全部楼层
本帖最后由 yjh_27 于 2014-4-15 20:49 编辑

'功能:对二维数组按第L列(多列多次)排序
'函数名:YjhSort

各参数以“,”分隔,
    参数2、参数3、排序关键字(多列多次)以“,”分隔。个数应一致
    子参数“;”分隔
    参数4、统计排名关键字(多列多次)以“,”分隔。
'参数1:a待排序数组
'参数2:s排序方式,多列(次)以“,”分隔。可省略,默认为:"a",升序
'asc或a 升序,按字符排序(忽略大小写)(默认)
'非 asc a  降序,按字符排序(忽略大小写)
'1
升序,按数值排序
'非 1 0
降序,按数值排序
' 
1;R;n
对数字按n位取舍(n=2,保留2位小时)
'0 不排序,用于(合并单元格)分组,本次不排序
以上参数可不在首位,与下列参数组合
'L;n或Len;n
按长度排序
  
L1或Lenasc或La
升序
' 
非 L1或Lenasc或La
降序
  
n=0
按字符数 Len排序(可省略,默认)
  
n=1
按字节数 LenB排序
'SL;sl1;sl2
按照sl1固定长度处理字符后进行排序,sl1≠0(=0返回错误)
    升降序同前
' 
sl1>0
截取或扩充(扩充符号sl2,可省略,默认为:" ")
' 
sl1<0
忽略长度≠- sl1 所在行
'Sp;s1;n 按照s1符号分列 取第n个进行排序,n从0开始。
    升降序同前。
'S;s1;s2;p1按照s1和s2两符号中间的 进行排序,p1见下一条。
    升降序同前。
'P;n;p1
含p1(可为"")的排至最后(a升序)
                     或最前(非a降序)。
' 
P须位于“;”前(第一子参数尾)
    p1位于尾部(最末子参数)
    n控制输出数组(可省略,默认为:0)
' 
n=0
输出数组行数不变(默认)
' 
n=1
输出数组行数变,忽略含p1所在行
'P或Pin
按拼音排序
 
P1或Pinasc或Pa
升序
' 
非 P1或Pinasc或Pa
降序
'R 随机(乱序)
'
'参数3:L排序列,多列以“,”分隔。可省略,默认为:1
'u;n;p
本列按自定义序列(参数10)排序,n
    u0:全相同  u1(默认):前面相同 u2:含自定义
  
n
自定义序列 列号(默认首列)
' 
p=0
不在自定义序列的排尾(默认),输出数组行数不变
' 
p=1
不在自定义序列的排除,输出数组行数变
  
p=2
在自定义序列的排尾,输出数组行数不变
  
p=3
在自定义序列的排除,输出数组行数变
  
p=4
区间,已排序(升序)
  
p=5
区间,已排序(降序)
  
p=6
最接近,已排序
  
p=7
区间,未排序
  
p=8
最接近,未排序
'A本列数值按绝对值排序
    A须位于“;”前(第一子参数尾)
'S 本列字符串的字符顺序是反向的(倒卷的)
'R;n本列处理重复(如:1,2R 为第2列处理重复)
    后面的排序将被忽略(已为唯一,无需再排)
'n=1仅唯一
'n=2仅多重(保留一个)
'n=3去重复(默认)
'
'参数4:L0不参与排序列(各次),可省略,默认为:""
W返回排序位一维数组:W(1)返回排序第1的a数组行数。(需置于首位)
'c,L;Z;n;V C 返回分类统计二维数组(需置于首位)。
    L 统计列(默认 1)
    Z 统计分组(排序)位(默认 最大)
    n 输出选择(默认 3)
    V 统计项类型(默认 1:数值型、0或字母:字符型)
    输出各列为:1 分类细项;
               2 统计项(见n说明);
               ……
               最后  分类大项
' n=0全部       以下各项,以","分隔
' n=1计数
' n=2平均        字符项(参数2指定)返回""
' n=3合计  默认  字符项(参数2指定)返回"|"连接的各合计子项
' n=4合计子项   返回合计n=3的最小项
' n=5合计子项   返回合计n=3的最大项
' n=6合计子项   返回合计n=3的首项
' n=7合计子项   返回合计n=3的末项
R,L;Z;n;k  或RankingR  返回排名二维数组(需置于首位)。未参加排名的返回0
    L 排名列(默认 1) 正数(升序)、负数(降序)、0 按分组不再排序
    Z 排名分组(排序)位(默认 最大)
    n 输出选择(默认 0)
    k 名次差值(默认 0)
n=0参数5:m 至参数6:n(默认)
n=11 至 n-m+1,无并列名次
n=21 至 n-m+1,并列名次(差值不大于k,为并列)。西式排名
n=31顺排,并列名次(差值不大于k,为并列)。中式排名
n=11 12 13不按分组排名次。其他同n=1 2 3
'参数5:m参与排序列起始行,可省略,默认为:LBound(a,1)
'参数6:n参与排序列结束行,可省略,默认为:UBound(a,1)
'参数7:hz指定行数 成组排序,可省略,默认为: 1。
    为0时不固定行数(合并单元格),本列排序
   为-1时分段排序
'
'参数8:hzi行组参与排序行,可省略,默认为: 1。
    1<=hzi<=hz
'参数9:st第二列后按S型(升序、降序交叉)排序,可省略,默认为:False
'参数10:user自定义序列,可省略,默认为:""
'返回值:多列排序的数组


参数说明如上

本次更新:
用自定义序列分类,并完善分类统计


应用实例:
老师请帮忙:根据要求统计数量
http://club.excelhome.net/thread-1109362-1-1.html

按照3级汇总,然后写进批注
http://club.excelhome.net/thread-1109540-1-1.html


补充分段排序方式,来源:
分段排序问题
http://club.excelhome.net/thread-1109069-1-1.html



模糊查找汇总        
http://club.excelhome.net/thread-1111390-1-1.html
在表18



固定行数分类汇总求和
http://club.excelhome.net/thread-1111714-1-1.html


如何根据姓名和日期取不重复数
http://club.excelhome.net/thread-1111777-1-1.html


请老师编写程序,把各单位的奖金在下面空白行小计一下并列在H、I、J列处(见H、I、J列
http://club.excelhome.net/thread-1111318-1-1.html
41L


补充内容 (2014-4-20 14:11):
求助随机排列
http://club.excelhome.net/thread-1114286-1-1.html


补充内容 (2014-4-22 16:21):
求高手,用电信息筛选整理~
http://club.excelhome.net/thread-1114356-1-1.html


补充内容 (2014-5-18 21:14):
求大神写段代码实现自动仿真运算及结果输出         随机排序
http://club.excelhome.net/thread-1122343-1-1.html

多Key数组排序V03 (3).rar

209.26 KB, 下载次数: 259

多Key数组排序(精简).rar

21.95 KB, 下载次数: 190

图书目录汇总统计1.rar

77.39 KB, 下载次数: 155

应用实例

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-13 22:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 yjh_27 于 2014-2-26 21:23 编辑

'****************************************************************
'功能:    对二维数组按第L列(多列多次)排序
'函数名:  YjhSort
'参数1:   a          待排序数组
'参数2:   s          排序方式,多列(次)以“,”分隔。可省略,默认为:1 升序
'                     asc或a       升序,按字符排序  大写(忽略大小写)
'                     非 asc a     降序,按字符排序  大写(忽略大小写)
'                     1            升序,按数值排序
'                     非 1 0       降序,按数值排序
'                       1;R;n      对数字按n位取舍(n=2,保留2位小时)
'                     L或Len       按长度排序  L1或Lenasc或La     升序
'                                             非 L1或Lenasc或La   降序
'                     SL;sl1;sl2   按照sl1固定长度进行排序,sl1≠0(=0返回错误),
'                        sl1>0         截取或扩充(扩充符号sl2,可省略,默认为:" ") ,升降序同前
'                        sl1<0         忽略长度≠- sl1 所在行
'                     Sp;s1;n      按照s1符号分列 取第n个进行排序,n从0开始。升降序同前。
'                     S;s1;s2;p1   按照s1和s2两符号中间的 进行排序,p1见下一条。升降序同前。
'                     P;n;p1       含p1(可为"")的排至最后(a升序)或最前(非a降序)。
'                                   P须位于“;”前、p1位于尾部、n控制输出数组(可省略,默认为:0)
'                        n=0           输出数组行数不变(默认)
'                        n=1           输出数组行数变,忽略含p1所在行
'                     P或Pin       按拼音排序 P1或Pinasc或Pa     升序
'                                             非 P1或Pinasc或Pa   降序
'                     0            不排序,用于(合并单元格)分组,本次不排序
'                     R            随机
'
'参数3:   L          排序列,多列以“,”分隔。可省略,默认为:1
'                     u;n;p        本列按自定义序列(参数10)排序,n 自定义序列 列号(默认首列)
'                         p=0          不在自定义序列的排尾(默认),输出数组行数不变
'                         p=1          不在自定义序列的排除,输出数组行数变
'                     A            本列数值按绝对值排序
'                     S            本列字符串的字符顺序是反向的(倒卷的)
'                     R;n          本列处理重复(如:1,2R 为第2列处理重复)  后面的排序将被忽略(已为唯一,无需再排)
'                        n=1           仅唯一
'                        n=2           仅多重(保留一个)
'                        n=3           去重复  默认
'                     c; n         本列分类统计  后面的排序将被忽略,只进行统计。
'                                  输出各列为:1 分类细项;2 统计项(见n说明);最后  分类大项
'                        n=0           全部     以下各项,以","分隔
'                        n=1           计数
'                        n=2           平均         字符项(参数2指定)返回""
'                        n=3           合计  默认   字符项(参数2指定)返回"|"连接的各合计子项
'                        n=4           合计子项     返回合计n=3的最小项
'                        n=5           合计子项     返回合计n=3的最大项
'                        n=6           合计子项     返回合计n=3的首项
'                        n=7           合计子项     返回合计n=3的末项
'
'
'参数4:   L0         不参与排序列(各次),可省略,默认为:""
'                     W            返回排序位数组(需置于首位)
'参数5:   m          参与排序列起始行,可省略,默认为:LBound(a, 1)
'参数6:   n          参与排序列结束行,可省略,默认为:UBound(a, 1)
'参数7:   hz         指定行数 成组排序,可省略,默认为: 1。
'                     为0时不固定行数(合并单元格),本列排序
'参数8:   hzi        行组参与排序行,可省略,默认为: 1。1<=hzi<=hz
'参数9:   st         第二列后按S型(升序、降序交叉)排序,可省略,默认为:False
'参数10:  user       自定义序列,可省略,默认为:""
'返回值:  多列排序的数组
'使用方法:arr = YjhSort(A)
'


应用案例
表格中有A和B列,当A列中有连续的相同值时,把B列的内容合并到指定的单元格。
http://club.excelhome.net/thread-1093770-1-1.html

如何用VBA合并单元格并统计合并的个数
http://club.excelhome.net/thread-1094514-1-1.html

按多个条件进行排序 18L
http://club.excelhome.net/thread-1034561-1-1.html

多条件自定义排序  16L
http://club.excelhome.net/thread-1094881-1-1.html

分别统计出右边姓名的出现次数,统计的VB语句怎么写?
http://club.excelhome.net/thread-1094904-1-1.html

如何进行统计单项统计  16L
http://club.excelhome.net/thread-1092774-1-1.html

用VBA在excel中多条件不重复排名    4L 总排名    7L校排名
http://club.excelhome.net/thread-1095390-1-1.html

请教:VBA按条件求和汇总、计数
http://club.excelhome.net/thread-1095752-1-1.html

求助,按某字段排序,但要分层进行,并子层要紧跟对应的层后显示
http://club.excelhome.net/thread-1098105-1-1.html







多Key数组排序V02b.rar

202.04 KB, 下载次数: 173

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-14 00:27 | 显示全部楼层
本帖最后由 yjh_27 于 2014-3-20 14:24 编辑

添加排名次。
应用实例
用vba求各科级次(大量数据)   4L、11L
http://club.excelhome.net/thread-1101842-1-1.html

词类排序,在线等。
http://club.excelhome.net/thread-1104024-1-1.html







补充内容 (2014-3-29 20:23):
分区间排序的问题
http://club.excelhome.net/thread-1107768-1-1.html


补充内容 (2014-4-1 20:11):
请用VBA对单元格区域进行排序
http://club.excelhome.net/thread-1108606-1-1.html

多Key数组排序V03 (1).rar

212.93 KB, 下载次数: 151

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

本版积分规则

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

GMT+8, 2024-11-22 00:50 , Processed in 0.046906 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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