ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-21 14:36 | 显示全部楼层 |阅读模式
工作表内单元格数据的排序,使用Range.Sort 命令。

但是后面的参数较多,新人一般采用录制宏时出来一大堆,也不知道该如何编辑。

因此,我开这一个帖子,给新人普及一下:


Range("待排序数据区域").Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3,
        Header, OrderCustom, MatchCase, Orientation, SortMethod,
        DataOption1, DataOption2, DataOption3)

其中各类型参数的意义如下:
① key1、key2、key3
这些key是排序的关键列(或行)的单元格地址,如 Range("A1")
实际只要选对列标题即可,对行数要求不敏感。

【行数要求不敏感】
即数据区域中任意行数都可以: Range("A1")、或Range("A2")、或Range("A1000")都可以。

【注意】
1. 一次Sort只能调用至多3个参数,没有key4可以使用。
2. 至少使用1个参数即可,即key2、key3可以省去不用。

【引用方法】
1. 带参数名引用,如: key1:=Range("G3")
   带参数名引用时

2. 参数位置引用,即按照上述Sort命令的参数顺序直接应用,
   如: Range("A1:I19").Sort key1:=Range("G3")  即第1位置参数即为key1


②  Order1、Order2、Order3
   这些Order是排序的顺序模式指定参数。即: A-Z升序、或Z-A降序
    参数的模式名称为:
          A-Z升序= xlAscending 或直接=1
               Z-A降序= xlDescending 或直接=2

  带参数名引用时:
  Order1:=xlAscending  或 Order1:= 1

  参数位置引用时,紧跟key后面。(但注意key2和Order2之间要隔一个Type参数)


③  Header
    即是否有标题行参数,一共有3个值:
    Header:= xlGuess=0 或xlYes=1 或 xlNo=2
    即=xlGuess、或=0时,工作表自己判断
     =xlYes、或=1时,强制第1行为列标题,即第1行【不参与排序】
     =xlNo、或=2时,强制没有列标题。即第1行【也参与排序】

  带参数名引用时:
   如: Header:= xlGuess
   
   参数位置引用时,在第7个逗号之后。
  (如果key只有1个时,要连续空6个逗号,
   如:Range("A1:I19").Sort Range("A1"), 1, , , , , , 2 (order1之后连续写6个逗号)


④ MatchCase 是否匹配大小写
    MatchCase:=False 、或=0 不区分大小写
    MatchCase:=True 、或=1 区分大小写(Case Sensitive)

⑤ Orientation 排序方向
   一般为同一列中从上到下各行进行排序:Orientation:= xlTopToBottom 、或=1
    如果是: 同一行中从左到右各列进行排序,则为:Orientation:= xlLeftToRight、或=2


⑥ SortMethod 排序方法
    按拼音排序: SortMethod:= xlPinYin 、或=1 (Use phonetic info)
    按笔画排序: SortMethod:= xlStroke、或=2


⑦ DataOption1 按数值或按文本排序
    DataOption1:= xlSortNormal


以上综合示例为:
按参数名引用:
Range("A1:I19").Sort key1:=Range("G3"), Order1:=xlAscending, _
         Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
         Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
         DataOption1:=xlSortNormal

直接按参数位置:
Range("A1:I19").Sort [G3], 1, , , , , ,0, 1, 0, 1, 1,1

或根据默认为:Range("A1:I19").Sort [G3], 1

评分

16

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-21 14:47 | 显示全部楼层
如果排序key参数不止3个,那么在VBA中也可以如下处理:
  1. Sub SortTest()
  2.     key = Array(1, 2, 4, 7, 6, 9) '事先指定排序顺序
  3.     Order = Array(1, 2, 2, 1, 2, 1) '指定各个排序key参数对应的A-Z或Z-A顺序(=1或=2)
  4.     With Range("D12:M200") '对于排序区域
  5.         For i = UBound(key) To 0 Step -1 '循环排序操作时要倒序进行
  6.             .Sort .Offset(, key(i) - 1), Order(i), , , , , , xlNo
  7.         Next
  8.     End With
  9. End Sub
复制代码
呵呵。

点评

结果会意想不到的。  发表于 2014-4-8 08:59

评分

7

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-21 14:48 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-3-21 14:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-4-2 20:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-4-3 13:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好贴,顶。
我也遇到不止这样的问题,能帮我解决吗?
http://club.excelhome.net/thread-1109073-1-3.html

TA的精华主题

TA的得分主题

发表于 2014-4-3 15:29 | 显示全部楼层
好,希望這樣的專題貼能多一些,使我們用得明白,用得得心應手

TA的精华主题

TA的得分主题

发表于 2014-4-3 15:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
录制宏因为调用的是工作表级别的sort方法 所以导致大部分人不知道range有sort方法直接使用 这个确实比录制宏的要方便的多
常常写程序的人 建议没事把range, worksheet等常用对象的帮助目录打开 依次浏览下对象属性和方法
对写程序大有好处

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-4-7 19:10 | 显示全部楼层
谢谢!和帮助文件比,更容易理解,更切合实际。还望香川老师多贴点此类,以救我等vba泥潭里的菜鸟。

TA的精华主题

TA的得分主题

发表于 2014-4-8 08:42 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-7 11:28 , Processed in 0.027459 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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