ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VBA中使用工作表排序的方法

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-4-8 09:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可不可以通过这个方法给数组排序呢?

TA的精华主题

TA的得分主题

发表于 2014-4-8 09:10 | 显示全部楼层
本帖最后由 Zamyi 于 2014-4-8 09:12 编辑
香川群子 发表于 2014-3-21 14:47
如果排序key参数不止3个,那么在VBA中也可以如下处理:呵呵。


不妨就三个Key比较,会得到不同的结果。要做到三个Key以上的排序,参看我的帖子:二维数组排序。

TA的精华主题

TA的得分主题

发表于 2014-5-11 22:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-13 22:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
似乎没有解释“OrderCustom”,是留的悬念吗?
以前全靠录制和有道了,另外就是反得的测试……
早知有此帖就得心应手多了……
前一段研究分班时,还是这个问题……

TA的精华主题

TA的得分主题

发表于 2014-8-14 06:53 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-14 08:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 香川群子 于 2014-8-14 08:44 编辑
aoe1981 发表于 2014-8-13 22:56
似乎没有解释“OrderCustom”,是留的悬念吗?
以前全靠录制和有道了,另外就是反得的测试……
早知有此帖 ...

OrderCustom 是按照自定义序列排序,一般不用。

自定义序列排序应用方面,有很多代码,需要单独开帖说明。
对于一般初级爱好者来说,尚无必要。


下面是相关的一些代码,你有兴趣就慢慢研究吧:

CustomListCheck

    arr = WorksheetFunction.Transpose([a1:a20])
    '事先在工作表中生成 A1,A2……A20 的自定义排序关键词。 如 【张三、李四、大头、小眼、……】
    '然后读入VBA数组、并转为一维数组arr

    n = Application.GetCustomListNum(arr)
    '检查该数组对应的自定义序列是否之前已经写入Excel自定义排序List中
   
    If n Then MsgBox "Exists !" Else MsgBox "Not Exists !"
    '如果返回数值n则已经存在,否则就是尚不存在。

…………………………

    '下面是添加自定义序列的语句
'方法-1,直接引用工作表单元格区域:
    Application.AddCustomList listArray:=Range("A1:A20")
    '直接引用工作表单元格区域中的自定义序列、添加到Excel自定义序列List表中去。
    '该自定义序列读入程序以后,将永远保存在Excel数据中,除非你删除它。
   
     n = Application.GetCustomListNum(arr)
    '添加完成后读取该自定义序列在List表中的序号,以便排序时调用
   
    '调用自定义序列的排序:
    Range("G1:G20").Sort Key1:=Range("G1"), Order1:=xlAscending, Header:= _
            xlGuess, OrderCustom:=13, MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, DataOption1:=xlSortNormal
   
    'OrderCustom:=13
    '第13个序列,就是添加后的自定义序列在List中的序号。    '注意,如果你从来没有在Excel中添加过自定义序列,那么新增的自定义序列会从n=12开始,并需按OrderCustom:=13调用
    '这是因为,Excel已经默认建立了11个自定义序列。(或许版本不同、操作系统不同会有所不同,这个我不保证正确。)
    '而如果之前你已经添加过自定义序列,且没有删除而保存至今,则需要根据实际n值、按OrderCustom:= n + 1调用
   
'方法-2, 把VBA一维数组中的内容添加到Excel自定义序列List表中去。
    'VBA新添自定义序列:
    arr = WorksheetFunction.Transpose([A1:A20)])
    '这一句只是为了模拟得到VBA内存数组内容。
    '实际可以直接利用任何方式得到的VBA一维数组arr的内容,作为自定义序列
    '这就大大提高了可在代码中任意使用自定义序列的好处。

    Application.AddCustomList listArray:=arr '直接把VBA一维数组内容作为自定义序列添加
    n = Application.GetCustomListNum(arr)  '查找返回该数组对应内容在自定义序列List中的序号
   
    '使用新添序列排序:
    Range("Q1:Q20").Sort Key1:=Range("Q2"), OrderCustom:=n + 1 '必须要加1后才可使用
    '我个人猜测是因为List查询时,默认排序模式=1,而之后的自定义List序号都要顺延1位调用。所以要n+1后才能正确调用。
………………

    '下面是检查Excel中已有自定义序列,并详细列出所有自定义序列内容。
        For i = 1 To Application.CustomListCount
            listArray = Application.GetCustomListContents(i)
            For j = LBound(listArray) To UBound(listArray)
                Worksheets("sheet1").Cells(j, i).Value = listArray(j)
            Next
        Next
   
…………
    '查找自定义序列在List中的序号,并从List中删除这个序列
    n = Application.GetCustomListNum(arr)
    Application.DeleteCustomList n

…………
呵呵。



评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-14 08:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
补充,自定义序列的元素个数有限制,似乎不能大于675,超过无效。(2003版测试)







TA的精华主题

TA的得分主题

发表于 2015-7-9 18:51 | 显示全部楼层
香川老师:
      实战运用中,我真的用到了Sorts方法,但是录制宏实现的。不过我会根据参数的英文意思估摸着,把多余的参数删除,经过几次测试,就知道哪些多余,哪些不多余了。
.Range(Cells(3, 2), Cells(House_R, 3)).Sort Key1:=.Range("B3"), Header:=xlNo, OrderCustom:=1
由于不是太长,也没去想最后一个OrderCustom能不能忽略。

      运用中我遇到几个问题,向老师求证一下:
1、如果排序的工作表是整表隐藏的,Sort方法无效;
2、如果隐藏工作表显示出来但不是当前工作表的话,Sort方法同样无效。

请问是这样吗?
因为绕不开上面的两个问题,
所以我的代码就多写了几行,
就是把表显示并激活为当前表格,
排序完成后,
再隐藏表格,
再激活回程序运行前的那张表。

如果我求证的两个问题不对的话,那请问如何修改我的语句。上面那一句。

TA的精华主题

TA的得分主题

发表于 2015-8-19 15:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
是否有让整个工作表内所有表格按A列的数字顺序排序,而B-Z列的内容根据A列排序而变化的写法呢?
如果我用数据-排序,有一个扩展到整个工作表的选项
在VBA里如何界定呢?
我现在的做法是把B-Z列清空内容,从新生成数据,感觉很浪费时间
希望老师不吝赐教

TA的精华主题

TA的得分主题

发表于 2015-9-5 16:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,谢谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-8 14:50 , Processed in 0.025907 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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