你现在的位置:
函数FILTER根据条件筛选数据
一、函数概述
FILTER 是 Excel 365 和 Excel 2021 引入的动态数组函数,用于根据指定条件筛选数据范围,并返回符合条件的所有行或列。筛选结果会自动溢出到相邻单元格,无需手动下拉填充 。
核心优势:
- ✅ 动态数组:结果自动扩展,数据更新时自动刷新
- ✅ 多条件支持:可同时应用多个 AND/OR 条件
- ✅ 灵活返回:可返回整行、特定列或重新排序后的结果
- ✅ 错误处理:内置空值提示参数,避免 #N/A 错误
二、语法结构
=FILTER(
array, ← 必需:要筛选的数据范围
include, ← 必需:筛选条件(布尔表达式)
[if_empty] ← 可选:无匹配时返回的内容(默认 #CALC!)
)
三、参数详解
| 参数 | 必需 | 说明 | 示例 |
|---|---|---|---|
| array | 是 | 要筛选的数据范围(表、区域或数组) | A2:D100 或 TableDiv |
| include | 是 | 布尔条件,TRUE 的行被保留 | B2:B100="销售部" |
| if_empty | 否 | 无匹配时的返回值 | "无数据" 或 0 |
四、核心逻辑:AND 与 OR 运算
FILTER 函数通过数学运算符实现逻辑组合 :
| 逻辑 | 运算符 | 原理 | 示例 |
|---|---|---|---|
| AND(且) | * 乘号 | TRUE*TRUE=1(保留),其他组合=0(排除) | (条件1)*(条件2) |
| OR(或) | + 加号 | TRUE+FALSE=1(保留),FALSE+FALSE=0(排除) | (条件1)+(条件2) |
原理说明:布尔值 TRUE/FALSE 参与数学运算时自动转为 1/0。乘法要求所有条件为 1 才保留,加法只需任一条件为 1 即保留 。
五、实用示例
示例 1:单条件筛选(基础用法)
场景:筛选”销售部”的所有员工
=FILTER(A2:D20, B2:B20="销售部", "未找到")
- 在 B2:B20 中查找”销售部”
- 返回 A2:D20 对应的整行数据
- 无匹配时显示”未找到”
示例 2:多条件 AND 筛选(同时满足)
场景:筛选”Productivity”部门 且 “Finance”部门的员工
=FILTER(TableDiv, (TableDiv[Division]=G1) * (TableDiv[Department]=G2))
*表示 AND 逻辑- 两个条件必须同时为 TRUE 才保留
三条件 AND(部门+地区+薪资):
=FILTER(TableDiv,
(TableDiv[Division]=G1) *
(TableDiv[Department]=G2) *
(TableDiv[Yearly Salary]>G3)
)
示例 3:多条件 OR 筛选(满足其一)
场景:筛选”Game”部门 或 “Utility”部门的员工
=FILTER(TableDiv, (TableDiv[Division]=G1) + (TableDiv[Division]=G2))
+表示 OR 逻辑- 任一条件为 TRUE 即保留
示例 4:混合条件(AND + OR)
场景:筛选(”Game”或”Utility”部门)且 薪资 > 80000
=FILTER(TableDiv,
((TableDiv[Division]=G1) + (TableDiv[Division]=G2)) *
(TableDiv[Yearly Salary]>G3)
)
- 注意括号:OR 条件需用括号包裹,确保先计算 OR 再与 AND 条件相乘
示例 5:返回特定列(配合 CHOOSECOLS)
场景:筛选后只返回”姓名”和”年薪”两列,并按年薪降序
=SORT(
CHOOSECOLS(
FILTER(TableDiv,
((TableDiv[Division]=G1) + (TableDiv[Division]=G2)) *
(TableDiv[Yearly Salary]>G3)
),
2, 4 ← 返回第2列(姓名)和第4列(年薪)
),
2, -1 ← 按第2列降序
)
示例 6:配合 UNIQUE 去重
场景:筛选特定区域的产品,并去除重复项
=UNIQUE(FILTER(Sales_Data[Product], Sales_Data[Region]=B4))
- 先筛选,再去重,返回唯一产品列表
示例 7:配合 SORT 排序
场景:筛选后自动排序
=SORT(FILTER(A2:D20, B2:B20="销售部"), 4, -1)
- 筛选销售部数据
- 按第4列(如销售额)降序排列
示例 8:复杂业务场景(库存预警)
场景:筛选库存低于安全库存的产品,并按库存量降序
=LET(
rawData, A2:G100,
filtered, FILTER(rawData, INDEX(rawData,,3) < 安全库存),
SORT(filtered, 2, -1) ← 按库存量降序
)
示例 9:一对多查询(超级查找)
场景:根据客户名称查找所有订单记录
=FILTER(A2:D100, B2:B100="张三", "无订单记录")
- 返回”张三”的所有订单行
- 传统 VLOOKUP 只能返回第一条,FILTER 返回全部
示例 10:日期筛选(按月筛选)
场景:筛选 2024 年 1 月的记录
=FILTER(A2:D100, TEXT(A2:A100,"YYYY-MM")="2024-01")
- 用 TEXT 函数将日期转为”年-月”格式再比较
六、注意事项
| 注意点 | 说明 |
|---|---|
| 版本要求 | 需 Excel 365、Excel 2021 或 Excel 网页版;旧版 .xls 格式不支持 |
| #SPILL! 错误 | 结果区域被占用时显示,需清空下方单元格 |
| #CALC! 错误 | 无匹配结果且未设置 if_empty 参数时显示 |
| 动态数组特性 | 结果自动溢出,不可在区域内插入内容 |
| 条件格式 | 返回的数组需配合其他函数(如 CHOOSECOLS、SORT)进一步处理 |
| 性能优化 | 大数据量时避免整列引用(如 A:A),建议用具体范围(如 A2:A10000) |
七、FILTER 函数组合技巧
| 组合函数 | 用途 | 示例 |
|---|---|---|
| UNIQUE | 筛选后去重 | =UNIQUE(FILTER(...)) |
| SORT | 筛选后排序 | =SORT(FILTER(...), 2, -1) |
| CHOOSECOLS | 筛选后选列 | =CHOOSECOLS(FILTER(...), 1, 3) |
| XLOOKUP | 多条件查找 | =XLOOKUP(..., FILTER(...)) |
| LET | 简化复杂公式 | =LET(f, FILTER(...), SORT(f, 2)) |
| TEXTJOIN | 合并筛选结果 | =TEXTJOIN(",", , FILTER(...)) |
八、FILTER vs 传统筛选对比
| 特性 | 传统自动筛选 | FILTER 函数 |
|---|---|---|
| 结果位置 | 在原数据位置 | 可放置到任意位置 |
| 动态更新 | 需手动刷新 | 自动刷新 |
| 多条件 | 界面操作 | 公式化灵活组合 |
| 结果复用 | 难以引用 | 可作为其他函数输入 |
| 数据完整性 | 隐藏行 | 不破坏原数据 |

发表回复