🏆 递归 | 列交集「每年都获奖」的优秀员工!
一、效果展示
输入多年度获奖名单,1 个公式自动筛选出每一年都上榜的员工,无需手动对比、无需辅助列,纯函数一键出结果!
表格
二、核心公式(直接复制可用)
excel
=LET(TT,LAMBDA(A,B,C,
IF(C>COLUMNS(B),A,
TT(TOCOL(IF(A=TOROW(INDEX(B,,C),3),A,SB),3),B,C+1))),
TT(B5:B13,B5:F13,1))
三、公式逐行拆解(含专业术语 + 递归回溯逻辑)
1. 外层 LET 函数:自定义递归函数封装
excel
IF(C>COLUMNS(B),A,...)
LET 函数:WPS 动态数组核心函数,用于封装自定义递归函数TT,简化公式结构,避免重复计算。
核心参数定义:
A:当前待筛选的员工名单(递归过程中动态更新,逐步缩小范围)
B:完整的多年度获奖名单表(B5:F13,全程不变)
C:当前遍历的年份列号(从 1 到 COLUMNS (B),用于逐年筛选)
最后TT(B5:B13,B5:F13,1):递归入口,以 2021 年名单为初始名单,从第 1 列(2021 年)开始逐年筛选。
2. TT 函数:递归筛选核心(逐年交集运算)
excel
LAMBDA(A,B,C,
IF(C>COLUMNS(B),A,
TT(TOCOL(IF(A=TOROW(INDEX(B,,C),3),A,SB),3),B,C+1) ))
这是整个公式的核心,依托递归回溯思想,对每年的获奖名单做逐列交集运算,最终保留所有年份都出现的员工。
(1)递归终止条件
excel
IF(C>COLUMNS(B),A,...)
当遍历列号C大于总列数COLUMNS(B)(即遍历完所有年份),停止递归,返回最终筛选后的名单(所有年份都获奖的员工)。
核心意义:递归出口,避免无限递归,输出最终结果。
(2)递归筛选逻辑(逐年交集)
excel
TT(TOCOL(IF(A=TOROW(INDEX(B,,C),3),A,SB),3),B,C+1)
逐行拆解每一步的运算逻辑:
INDEX(B,,C):提取第C列(当前年份)的完整获奖名单
TOROW(...,3):将列数据转为横向数组,用于后续匹配
IF(A=TOROW(...),A,SB):遍历当前名单A,判断员工是否在当前年份名单中
若存在:保留该员工(返回A)
若不存在:返回空值SB(WPS 专属空值,等同于"")
TOCOL(...,3):过滤空值,得到当前年份筛选后的新名单(仅保留同时出现在上一年名单和当前年份名单的员工)
TT(...,B,C+1):递归调用自身,用新名单作为新的A参数,列号C+1,进入下一年份的筛选
四、完整运行过程明细(递归回溯 + 逐年交集,对应案例分步拆解)
以案例中2021-2025获奖名单为例,完整拆解运行逻辑:
第 1 轮递归(初始调用:TT(2021名单, 总表, 1))
初始名单A:{"娃娃鱼","腿腿","铁蛋儿","赵骄阳","腿腿","郝云翳","帅万剑","李九月"}
当前列C=1(2021 年),C ≤ 5(总列数),执行筛选:
提取 2021 年名单,转为横向数组
匹配初始名单,过滤后名单不变(初始名单就是 2021 年名单)
递归调用:TT(2021名单, 总表, 2),进入 2022 年筛选
第 2 轮递归(TT(2021名单, 总表, 2))
当前列C=2(2022 年),执行筛选:
提取 2022 年名单:{"赵骄阳","锦李","郝云翳","李九月","赵亮亮","铁蛋儿"}
匹配 2021 名单,仅保留同时出现在 2022 年的员工:{"铁蛋儿","赵骄阳","郝云翳","李九月"}
递归调用:TT(新名单, 总表, 3),进入 2023 年筛选
第 3 轮递归(TT(2022筛选后名单, 总表, 3))
当前列C=3(2023 年),执行筛选:
提取 2023 年名单:{"娃娃鱼","腿腿","郭家才","铁蛋儿","赵骄阳"}
匹配上一轮名单,仅保留同时出现在 2023 年的员工:{"铁蛋儿","赵骄阳"}
递归调用:TT(新名单, 总表, 4),进入 2024 年筛选
第 4 轮递归(TT(2023筛选后名单, 总表, 4))
当前列C=4(2024 年),执行筛选:
提取 2024 年名单:{"李大卫","腿腿","赵骄阳","郝云翳","李九月","锦李","铁蛋儿","帅万剑","腿腿"}
匹配上一轮名单,铁蛋儿、赵骄阳均在 2024 年名单中,名单不变
递归调用:TT(名单, 总表, 5),进入 2025 年筛选
第 5 轮递归(TT(2024筛选后名单, 总表, 5))
当前列C=5(2025 年),执行筛选:
提取 2025 年名单:{"戴知雪","娃娃鱼","郭家才","铁蛋儿","李大卫","赵骄阳"}
匹配上一轮名单,铁蛋儿、赵骄阳均在 2025 年名单中,名单不变
递归调用:TT(名单, 总表, 6),进入下一轮
第 6 轮递归(递归终止)
当前列C=6,C > 5(总列数),触发终止条件
返回最终名单:{"铁蛋儿","赵骄阳"},自动溢出显示,全流程结束
五、使用步骤
整理数据:按「年份列、员工行」格式整理获奖名单,确保表头为年份(如 2021-2025)
输入公式:在空白单元格(如 H5)粘贴完整公式,按回车确认
获取结果:公式自动执行递归筛选,一键输出所有年份都获奖的员工名单
六、关键知识点 & 避坑指南
✅ 适用版本
必须是 WPS 365 / WPS 2021 及以上版本(需支持动态数组函数簇:LAMBDA、LET、TOCOL、TOROW、INDEX、TAKE 等)
低版本 WPS/Excel(如 Excel 2019 及以下)不支持,公式会直接报错
✅ 核心原理复盘
递归回溯 + 逐年交集:通过LAMBDA递归,对每一年的名单做交集运算,逐步缩小范围,最终保留所有年份都出现的员工
动态数组运算:TOCOL/TOROW实现行列转换,IF实现条件匹配,SB实现空值过滤,全流程基于动态数组,一键溢出结果
容错处理:SB错误值、TOCOL(...,3)过滤错误值,确保公式在空单元格、重复名单场景下稳定运行
⚠️ 避坑注意事项
名单规范:员工姓名必须完全一致(如 “铁蛋儿” 不能写成 “铁蛋”),否则会匹配失败
溢出错误(#SPILL!):公式所在单元格下方需预留足够空白空间,避免溢出报错
空值处理:名单中的空单元格会自动被过滤,不影响最终结果
列号遍历:公式自动从第 1 列遍历到最后一列,无需手动指定年份数量,适配任意多年度名单
七、拓展用法(进阶延伸,提升帖子价值)
多条件筛选:修改公式,可实现「连续 3 年获奖」「任意 3 年获奖」等自定义条件筛选
反向筛选:调整IF逻辑,一键找出「从未获奖」「仅 1 年获奖」的员工
多部门统计:结合GROUPBY函数,按部门分别统计每年都获奖的员工
动态年份范围:将列号改为单元格引用,实现「自定义年份区间」筛选(如 2022-2024)
数据去重:在初始名单中嵌套UNIQUE函数,自动去除同一年份的重复获奖记录
八、总结
该公式是HR / 行政部门员工评优的纯函数终极解决方案,依托LAMBDA递归回溯、动态数组交集运算,实现了「多年度获奖名单一键筛选」,替代了传统的手动对比、VLOOKUP 匹配、数据透视表等复杂操作。
核心价值在于:
零代码:纯函数实现,无需编程基础
全自动:自动逐年筛选、自动去重、自动输出结果
高兼容:适配任意年份数量、任意名单长度
易维护:修改名单数据,公式自动更新结果
掌握这个公式,不仅能解决员工评优的核心痛点,更能深入理解递归回溯、交集运算、动态数组等 WPS 高阶函数的核心逻辑,举一反三解决更多办公自动化难题!