用filter实现单条件返回多条记录,核心是把源数据区域传给 array 参数,判断逻辑传给 include 参数;做多对多查询的话,要先把多个条件转成行数完全一致的true/false数组,再用乘号、加号或者 xmatch 组合起来。下面的操作都基于microsoft 365版本的excel,如果你用的是wps或者旧版excel,得先确认软件本身支持filter函数再往下走。
我们拿大家最常用的订单、地区、客户表来拆解,不会把FILTER当成普通的筛选按钮泛泛讲,直接拆成4步实操:先理清楚源数据和条件、做一对多查询、做多对多查询、提前留好空结果、排序的处理入口。
第一步:先把源数据和条件区分开
源数据区域要保持连续,字段名统一放在第一行;条件区别塞在源数据中间,最好放在表格右侧或者上方,方便公式直接引用。这张示例左侧是待筛选的原始列表,右侧是FILTER的返回区域,公式栏里能看到 =FILTER(...) 已经把数据源和判断条件分开写了。

自己建表的时候,先把源数据整理成类似 A2:D20 这样连续的订单区域,把“地区”“客户”“商品”这类要填的条件放在 F2:H2 区域就行。除非数据量特别小,不然别直接把整列塞进公式,全列引用会拖慢动态数组的计算速度。
第二步:用FILTER完成一对多查询
一对多查询就是单个条件匹配出所有符合的行,比如要查出所有“地区=华东”的订单。公式直接写 =FILTER(A2:D20,C2:C20=G2,"无符合记录") 就行。其中 A2:D20 是你要返回的整块数据,C2:C20=G2 会逐行判断地区是不是等于条件单元格,符合要求的行直接一次性溢出到右侧的结果区。

这类公式根本不用往下拖拽复制,只要在结果区左上角的单元格输入一次,Excel就会自动把多行结果展开。要是结果区下方还留着旧内容,Excel会直接报 #SPILL! 错误,把溢出范围内的多余内容清空再重新计算就好。
第三步:把多个条件组合成多对多查询
多对多查询有两种常用写法:多个单值条件要求同时满足,直接用乘号代表AND逻辑;单个字段允许多个候选值,用 XMATCH 或者 COUNTIF 生成对应的匹配数组。比如要查“地区在H2:H4列表内,同时客户在I2:I3列表内”的所有订单,公式可以写成 =FILTER(A2:D20,ISNUMBER(XMATCH(C2:C20,H2:H4))*ISNUMBER(XMATCH(B2:B20,I2:I3)),"无符合记录")。

乘号的作用是要求每一行必须同时满足两个判断逻辑。要做“地区是华东或华南”这种同字段多选的需求,直接写 =FILTER(A2:D20,ISNUMBER(XMATCH(C2:C20,H2:H4)),"无符合记录") 就行。如果只是两个固定值的或逻辑,也可以用加号组合:(C2:C20="华东")+(C2:C20="华南"),只要最终生成的数组行数和源数据完全对应就没问题。
第四步:给空结果、排序和去重留处理口
if_empty 不是没用的装饰参数,实际做查询表的时候,一旦没有符合条件的记录,直接让公式返回空白或者提示文字,比页面凭空跳出 #CALC! 要稳得多。如果需要结果按金额从高到低排序,直接把FILTER套进SORT函数里就行:=SORT(FILTER(A2:D20,ISNUMBER(XMATCH(C2:C20,H2:H4)),"无符合记录"),4,-1)。

要是返回结果里可能有重复的客户,再在外层套个 UNIQUE 函数:=UNIQUE(FILTER(B2:B20,ISNUMBER(XMATCH(C2:C20,H2:H4)),"无符合记录"))。写这类嵌套公式的时候,建议先把FILTER单独跑通,再一层层包SORT、UNIQUE,别一开始就把所有函数堆在一起,出问题很难排查。
FILTER函数语法和参数
FILTER的完整语法是:
=FILTER(array, include, [if_empty])
| 参数 | 是否必填 | 作用 | 写法提醒 |
|---|---|---|---|
array |
必填 | 要返回的数据区域 | 可以是一列、多列或整块表格,行数要和include参数的数组完全对应 |
include |
必填 | 筛选判断数组 | 每一行返回TRUE/FALSE,或者1/0;多条件可以用 *、+、XMATCH 组合 |
if_empty |
可选 | 没有匹配记录时显示的内容 | 可以写 "无符合记录" 或者 "",避免空结果直接抛出 #CALC! 错误 |
容易出错的位置
出 #CALC! 错误,大多是没匹配到结果又没写 if_empty 参数;出 #SPILL! 错误,基本都是结果溢出区域被已有内容挡住了;出 #VALUE! 错误,常见原因是 array 和 include 两个区域的行数对不上。要是公式返回了不该出现的行,直接选中 include 那一段参数按F9,临时查看生成的TRUE/FALSE数组,核对每一行的判断逻辑是不是对齐了。
做多对多查询最容易写错的就是条件列表的方向。XMATCH(C2:C20,H2:H4) 是把每一行的地区拿到条件列表里匹配,要是写反成 XMATCH(H2:H4,C2:C20),生成的数组行数就和订单表对不上,FILTER根本没法逐行筛选。
扩展示例:把查询表做成可改条件的模板
如果H2:H4是可以自由选择的地区列表,I2:I3是可以自由选择的客户列表,订单表固定在 A2:D20,可以直接把公式写死成:
=FILTER(A2:D20,ISNUMBER(XMATCH(C2:C20,H2:H4))*ISNUMBER(XMATCH(B2:B20,I2:I3)),"无符合记录")
之后只要改条件区的内容,完全不用动公式。要按金额降序就往外层加 SORT,要只返回客户名就把 array 参数改成 B2:B20,要去掉重复客户再多套一层 UNIQUE。这也是FILTER做对多、多对多查询最省心的地方:条件区改了,溢出的结果会自动跟着刷新。


















