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确实是封神级别的存在。