excel里要按条件提取不重复数据,最方便的写法是用 unique 嵌套 filter:先用 filter 按规则筛出符合要求的所有记录,再交给 unique 自动去重。本次操作基于microsoft excel 365完成,如果你用的是wps或者老版本excel,得先确认软件支不支持这两个动态数组函数。
这个组合公式特别适合自动提取名单、商品、部门、城市这类字段,源数据新增行之后,只要你写的引用范围覆盖到了新行,结果会自动同步刷新,比手动筛选复制靠谱多了,后续维护也省事儿。
第一步:整理源数据和条件单元格
先把源数据整理成连续的区块,条件列中间不要留空列。示例里左边放的是人员和项目数据,右边单独留一个单元格填筛选条件,旁边空出位置放结果。对应公式里的 A2:B10 就是你要返回的姓名等数据的区域,C2:C10=F1 就是“项目列内容等于条件单元格值”的筛选规则。

要是只需要提取单列不重复名单,返回区域选单列就行;要同时返回姓名、部门这类多列内容,就把返回范围扩到对应列数。条件单元格最好单独放在结果区上方,之后改筛选条件的时候不用动公式。
第二步:输入 UNIQUE 和 FILTER 组合公式
点结果区域的第一个单元格直接输公式,通用结构是 =UNIQUE(FILTER(返回区域,条件区域=条件值))。比如要提取A组对应的所有不重复颜色,就写 =UNIQUE(FILTER(B5:B16,C5:C16=E4));要按指定项目提取对应姓名,就写 =UNIQUE(FILTER(A2:B10,C2:C10=F1))。

输完公式别往下拖,动态数组函数会自动把所有结果“溢出”填充到下方空白单元格,要是手动把公式复制到每一行,反而容易出重复结果,还可能把溢出区域挡住。
| 函数 | 语法 | 关键参数 | 在本题里的作用 |
|---|---|---|---|
FILTER |
FILTER(array, include, [if_empty]) |
array 是返回区域;include 是筛选条件;[if_empty] 是无结果时显示的内容。 |
先筛出符合条件的行。 |
UNIQUE |
UNIQUE(array, [by_col], [exactly_once]) |
array 是要去重的数组;[by_col] 为 TRUE 时按列比较;[exactly_once] 为 TRUE 时只保留只出现一次的值。 |
把 FILTER 返回的结果去重。 |
大部分按行提取的场景,by_col和exactly_once这两个参数都不用填。要是你的需求是“只保留整个数据里仅出现过1次的值”,再把 exactly_once 设为 TRUE;普通的去重需求保持默认就好。
第三步:给无结果情况加 IFERROR
如果条件没有匹配到任何记录,直接用FILTER会返回错误值。稳妥点的写法是在最外层套个 IFERROR,比如 =IFERROR(UNIQUE(FILTER(A2:B10,(C2:C10=G1)*(D2:D10<g2>。要多个条件同时满足的话,直接用乘号把不同的判断条件连起来就行。</g2>

上面公式里的 (C2:C10=G1)*(D2:D10<g2>,代表“项目等于指定值,同时年龄小于指定数”。每个小条件都会返回TRUE或者FALSE,相乘之后只有所有条件都满足的行,才会被FILTER保留下来。</g2>
第四步:清空溢出区域再检查公式
要是结果区域下方已经有内容,公式会直接报 #SPILL! 错误。解决方法很简单:把结果区下方被占的单元格清空,或者把整个公式挪到更空的位置就行。动态数组的溢出结果需要一整块连续的空白区域,不能被手动输入的内容、合并单元格或者其他公式挡住。

另一个高频错误是不同引用区域的行数对不上,比如返回区域写的是 A2:A100,条件区域却只写到 C2:C80,FILTER会因为两个数组尺寸不一样报错。返回区域和所有条件区域必须起始行相同、结束行也相同。
需要给结果排序的话,最外层再套个 SORT 就行:=SORT(UNIQUE(FILTER(A2:A100,B2:B100=E1)))。要实现多个条件满足任意一个就返回的效果,直接把条件用加号连起来:=UNIQUE(FILTER(A2:A100,(B2:B100=E1)+(C2:C100=F1)))。最后提交公式前记得查三件事:条件单元格里有没有多余的空格、所有引用区域的行数是不是一致、结果区有没有留够连续空白。











