VLOOKUP是Excel里被问得最多的函数。但VLOOKUP有一个天生的短板:它只能返回找到的第一个匹配项。当你要查的数据有多个匹配结果时,VLOOKUP就直接哑火了。
比如要给“销售一部”发奖金,但销售一部有15个人。VLOOKUP只能找到第一个,剩下14个人只能手动找。几千行的表,手动找一遍就够折腾了。
这就是“一对多查询”的场景。FILTER函数的出现,让这个问题有了最简单直接的解法。
一、FILTER的基本语法
FILTER的语法非常简单:
=FILTER(要返回的范围, 条件, [如果为空返回什么])
三个参数都不复杂:
- 返回范围:你想从哪个区域取值
- 条件:判断条件,返回TRUE或FALSE
- 可选参数:找不到结果时显示什么,不写就返回#CALC!错误
关键机制是:FALSE的行会被跳过,TRUE的行会全部返回。
二、一对多查询的基础写法
最简单的写法是:
=FILTER(B2:B100, A2:A100="销售一部")
A列是部门,B列是姓名。这个公式会返回A列等于“销售一部”的所有姓名,全部自动溢出到下方单元格。数据源增加了,结果自动跟着变;数据源减少了,结果自动缩回来。
如果找不到匹配项,可以加第三个参数兜底:
=FILTER(B2:B100, A2:A100="销售一部", "没有找到")
三、多条件查询:AND和OR
一对多查询如果只有单条件,用高级筛选也能凑合。但FILTER真正的优势是在多条件时依然保持同样的简洁度。
AND关系(同时满足) :用*连接
=FILTER(C2:C100, (A2:A100="销售一部")*(B2:B100="经理"))
筛选销售一部且职位是经理的人员。
OR关系(满足任一即可) :用+连接
=FILTER(C2:C100, (A2:A100="销售一部")+(A2:A100="销售二部"))
筛选销售一部或销售二部的所有人。
四、实战:工资条批量生成
一个实际场景:按部门批量生成工资条。工资数据表中有部门、姓名、工资三列,现在要把每个部门的人员名单和工资分别提取出来。
在某个空单元格输入:
=FILTER(A2:C20, A2:A20="销售一部")
结果自动溢出三列:姓名、部门、工资,全部对齐。再换个部门名,结果自动刷新。
配合数据验证下拉菜单,选部门 → 自动出工资条,全程不用再动公式。
五、与SORT组合:直接排好序
FILTER返回的结果默认是按原始数据顺序。如果想按某个字段排序,可以和SORT函数组合:
=SORT(FILTER(A2:C100, A2:A100="销售一部"), 2, 1)
先筛选销售一部,再按第2列升序排列。
六、与UNIQUE组合:动态去重下拉菜单
更高级的组合是FILTER加上UNIQUE和SORT,一次性生成去重排序的部门名单:
=SORT(UNIQUE(FILTER(A2:A100, A2:A100<>"")))
从A列筛选非空的所有部门,去重后按字母/拼音排序,自动溢出到下方。这个组合可以用作数据验证的源,每次数据更新后下拉菜单自动刷新——不用手动重新定义名称范围,也不用VBA。
七、与传统方法的对比
方法 | 操作路径 | 能否自动更新 |
VLOOKUP | 只能返回第一个,无法一对多 | 能,但无意义 |
高级筛选 | 每次重新点击筛选 | 否 |
数据透视表 | 需手动刷新 | 是(需手动) |
FILTER函数 | 一个公式 | 是(自动) |
八、常用搭配速查
=FILTER(A2:D100, B2:B100="已完成") -- 单条件
=FILTER(A2:D100, (C2:C100>5000)*(D2:D100="是")) -- 多条件AND
=FILTER(A2:D100, (A2:A100="北京")+(A2:A100="上海")) -- 多条件OR
=FILTER(B2:B100, ISNUMBER(SEARCH("经理", D2:D100))) -- 包含文本
=SORT(FILTER(A2:D100, C2:C100>5000), 3, -1) -- 筛选+排序九、要点提醒
- FILTER的结果是动态数组,需要有足够的空白单元格接收溢出结果,否则会报#SPILL错误
- 条件中的等号是=,不是==,和Python、JS等编程语言不一样
- 如果你用的是Excel 2021之前的版本,FILTER可能不可用,可以考虑用Power Query作为替代方案
回到开头那个问题:VLOOKUP做不到的事,FILTER一个公式全解决了。多条件、自动更新、溢出结果、组合排序——在“一对多查询”这个场景里,FILTER确实是封神级别的存在。

