07 排序筛选¶
VBA 排序方法¶
在 Excel VBA 里排序是数据处理的基本操作之一,而最常用也是最“参数最多”的方法就是:
Range("A1:D100").Sort
这看起来简单,但它的参数多达 14 个,很多初学者看见就懵。本文将 逐个参数解释 + 多种案例代码 + 常见坑点总结,一步步带你掌握它的用法。(也可以参考微软官方文档对它的说明:微软学习)
一、Range.Sort 是什么?¶
Range.Sort 是 Excel VBA 中用于对某个区域按指定条件排序的方法。简单来说,它可以:
- 按 单个字段排序
- 按 多个字段排序(最多 3 层)
- 控制是否有表头、排序方向、排序方式(比如中文拼音/笔画)
- 对文本和数字的处理方式做出控制
其完整语法如下(为了方便理解,我按语义分组展示):
其中:
- expression = 要排序的 Range 区域
- Key1~3 = 排序关键字(最多 3 个)
- Order1~3 = 每个关键字的排序顺序
二、逐个参数详细解释¶
(1) Key1 / Order1 — 主排序关键字段及顺序
表示:以 B 列为主排序字段,按升序排列(小 → 大,A → Z)。Key1 必须是一个 Range 对象,不是列号、也不是字符串。
(2)Key2 / Order2 — 第二排序字段(可选)
当 Key1 排序后出现相同的数据,再按 Key2 进行排序。比如我们想按成绩降序,如果成绩相同,再按姓名升序:
Key3 / Order3 — 第三排序字段也可以选择使用,但是最多支持三个层级排序,另外需要注意的是在Key2 和 Order2中间有一个Type参数,是对透视表使用的,我们一般不会用到,写的时候注意隔开。
(3)Header — 是否有表头(非常关键)
xlYes:有表头,第一行不参与排序xlNo:无表头,全表参与排序xlGuess:让 Excel 自动判断(不推荐,因为有可能会猜错)
(4) Orientation — 排序方向
默认是按列排序,也就是:Orientation:=xlTopToBottom,一般我们对行排序比较少,如果非要使用,则可以按这种方式书写:Orientation:=xlLeftToRight,这样就是横向排序。
(5)MatchCase — 是否区分大小写
MatchCase:=True代表区分大小写,而MatchCase:=False:表示不区分(这个是默认值),通常在英文字母排序时才有意义。
(6)SortMethod — 排序方法(对中文有用)
其他的参数,比如OrderCustom自定义顺序,DataOption1/2/3定义文本排序方式都用的比较少,所以这里不展开介绍
三、最实用的排序案例代码¶
01 单列升序排序:比如A列是姓名列,我们按姓名升序排序。
SortMethod方法,来定义排序的方式
Orientation:
四、常见坑 & 必知注意事项¶
1.没有指定 Header 导致误判:不写 Header 时,Excel 可能误判第一行为数据而参与排序。
2.只对列排序不包含其它列 → 容易产生数据错位! 例如错误写法:
4.数字文本排序结果怪异:如果某列既有文本数字又有数字,排序可能不按“数值大小,需要先统一格式。
5.超过三层排序就用 Sort 对象更灵活:如果需要 4+ 层排序,建议用新式的 SortFields 方法替代如下,因为 Range.Sort 一次最多三个关键字,并且参数杂乱,所以 Excel 提供了更现代的排序 API:
SetRange设置的区域有效。
VBA筛选方法¶
在 Excel VBA 中,AutoFilter 是进行条件筛选最常用、也是最基础的方法之一。它很贴近日常 Excel 操作,几乎所有“像人手点筛选一样”的需求,都可以通过 AutoFilter 实现。
一、AutoFilter 的基本作用¶
AutoFilter 用于对 列表 / 表格区域 按指定条件进行筛选,效果等同于: Excel → 数据 → 筛选 → 下拉筛选条件,特点是:
- 不改变原数据结构
- 支持文本 / 数值 / 日期 / 颜色 / 动态筛选
- 可多列叠加筛选
- 语法相对简洁,适合 80% 的业务场景
语法可以表示为下式,通常我们只会用到前 1~4 个参数:
Range.AutoFilter(
Field,Criteria1,Operator,Criteria2,SubField,VisibleDropDown)
尤其是SubField参数,一般在透视表里用,所以我们这里不作介绍
二、参数详解(逐一拆解)¶
(1) Field —— 筛选列编号
比如Field := 1, 表示第几列,这个第几列是 从筛选区域的最左列开始计数,第一列为 1,而不是 Excel 的列号,比如下面这句话表示对 C 列进行筛选:
(2) Criteria1 —— 筛选条件 1(最重要)
Criteria1 的写法非常灵活,常见形式如下:
- 等于某个值:可以写作
Criteria1:="张三"或者Criteria1:=100等 - 比较运算(必须是字符串):例如
Criteria1:=">80"、Criteria1:="<=100"或者Criteria1:="<>0"等 - 支持通配符筛选(文本):例如
Criteria1:="张*"或者Criteria1:="*有限公司" - 数组筛选(多值 OR):等价于 Excel 中勾选多个值,如下
(3) Operator —— 运算关系
1.xlAnd 和 xlOr这两种情况,分别表示 和(同时满足)与或(满足其一)的关系,比如筛选 60~90 分之间的成绩:
xlAnd 和 xlOr的情况下我们才会用到Criteria2
2.xlFilterValues(多选值筛选),比如同时筛选北京和上海:
3.Top / Bottom 系列(数值排行)
具体是前百分之几或者是前几个,根据Criteria1来进行赋值,其他支持的情况如下表
| Operator | 说明 | Operator | 说明 |
|---|---|---|---|
| xlTop10Items | 前 N 个 | xlTop10Percent | 前 N% |
| xlBottom10Items | 后 N 个 | xlBottom10Percent | 后 N% |
4.颜色筛选:主要包括xlFilterCellColor(筛选单元格颜色) 和 xlFilterFontColor(筛选字体颜色)两种方式
1 2 3 4 5 6 | |
5.动态筛选(xlFilterDynamic):这是 AutoFilter 最容易被忽略、但非常强大的功能,比如我们筛选高于平均值的数据
常见枚举值可参考下面这张表,参数可以自己修改,比如xlFilterAllDatesInPeriodApril将April改成June就是6月:
| Criteria1 | 说明 | Criteria1 | 说明 |
|---|---|---|---|
| xlFilterAboveAverage | 高于平均值 | xlFilterBelowAverage | 低于平均值 |
| xlFilterToday | 今天 | xlFilterThisMonth | 本月 |
| xlFilterThisYear | 本年 | xlFilterAllDatesInPeriodApril | 4 月 |
(4)VisibleDropDown —— 是否显示筛选箭头:VisibleDropDown:=True显示,否则不显示,默认是显示的,所以一般不写
三、常见实用代码段¶
1.AutoFilter 可以多次调用,筛选会叠加,例如下面这样等价于 “城市 = 北京” 并且 “成绩 > 80”
ShowAllData方法
3.判断是否开启了自动筛选,可以用下面这段代码:
4.完全关闭筛选功能,直接设置AutoFilterMode = False 即可
本期系统给大家介绍了VBA的排序和筛选功能,基本能够涵盖工作中80%以上的应用场景