🏆 递归 | 列交集「每年都获奖」的优秀员工!

一、效果展示

输入多年度获奖名单,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)

逐行拆解每一步的运算逻辑:

  1. INDEX(B,,C):提取第C列(当前年份)的完整获奖名单

  1. TOROW(...,3):将列数据转为横向数组,用于后续匹配

  1. IF(A=TOROW(...),A,SB):遍历当前名单A,判断员工是否在当前年份名单中

  • 若存在:保留该员工(返回A

  • 若不存在:返回空值SB(WPS 专属空值,等同于""

  1. TOCOL(...,3):过滤空值,得到当前年份筛选后的新名单(仅保留同时出现在上一年名单和当前年份名单的员工)

  1. TT(...,B,C+1):递归调用自身,用新名单作为新的A参数,列号C+1,进入下一年份的筛选


四、完整运行过程明细(递归回溯 + 逐年交集,对应案例分步拆解)

以案例中2021-2025获奖名单为例,完整拆解运行逻辑:

第 1 轮递归(初始调用:TT(2021名单, 总表, 1)

  • 初始名单A{"娃娃鱼","腿腿","铁蛋儿","赵骄阳","腿腿","郝云翳","帅万剑","李九月"}

  • 当前列C=1(2021 年),C ≤ 5(总列数),执行筛选:

  1. 提取 2021 年名单,转为横向数组

  1. 匹配初始名单,过滤后名单不变(初始名单就是 2021 年名单)

  1. 递归调用:TT(2021名单, 总表, 2),进入 2022 年筛选

第 2 轮递归(TT(2021名单, 总表, 2)

  • 当前列C=2(2022 年),执行筛选:

  1. 提取 2022 年名单:{"赵骄阳","锦李","郝云翳","李九月","赵亮亮","铁蛋儿"}

  1. 匹配 2021 名单,仅保留同时出现在 2022 年的员工:{"铁蛋儿","赵骄阳","郝云翳","李九月"}

  1. 递归调用:TT(新名单, 总表, 3),进入 2023 年筛选

第 3 轮递归(TT(2022筛选后名单, 总表, 3)

  • 当前列C=3(2023 年),执行筛选:

  1. 提取 2023 年名单:{"娃娃鱼","腿腿","郭家才","铁蛋儿","赵骄阳"}

  1. 匹配上一轮名单,仅保留同时出现在 2023 年的员工:{"铁蛋儿","赵骄阳"}

  1. 递归调用:TT(新名单, 总表, 4),进入 2024 年筛选

第 4 轮递归(TT(2023筛选后名单, 总表, 4)

  • 当前列C=4(2024 年),执行筛选:

  1. 提取 2024 年名单:{"李大卫","腿腿","赵骄阳","郝云翳","李九月","锦李","铁蛋儿","帅万剑","腿腿"}

  1. 匹配上一轮名单,铁蛋儿赵骄阳均在 2024 年名单中,名单不变

  1. 递归调用:TT(名单, 总表, 5),进入 2025 年筛选

第 5 轮递归(TT(2024筛选后名单, 总表, 5)

  • 当前列C=5(2025 年),执行筛选:

  1. 提取 2025 年名单:{"戴知雪","娃娃鱼","郭家才","铁蛋儿","李大卫","赵骄阳"}

  1. 匹配上一轮名单,铁蛋儿赵骄阳均在 2025 年名单中,名单不变

  1. 递归调用:TT(名单, 总表, 6),进入下一轮

第 6 轮递归(递归终止)

  • 当前列C=6C > 5(总列数),触发终止条件

  • 返回最终名单:{"铁蛋儿","赵骄阳"},自动溢出显示,全流程结束


五、使用步骤

  1. 整理数据:按「年份列、员工行」格式整理获奖名单,确保表头为年份(如 2021-2025)

  1. 输入公式:在空白单元格(如 H5)粘贴完整公式,按回车确认

  1. 获取结果:公式自动执行递归筛选,一键输出所有年份都获奖的员工名单


六、关键知识点 & 避坑指南

适用版本

  • 必须是 WPS 365 / WPS 2021 及以上版本(需支持动态数组函数簇:LAMBDA、LET、TOCOL、TOROW、INDEX、TAKE 等)

  • 低版本 WPS/Excel(如 Excel 2019 及以下)不支持,公式会直接报错

核心原理复盘

  1. 递归回溯 + 逐年交集:通过LAMBDA递归,对每一年的名单做交集运算,逐步缩小范围,最终保留所有年份都出现的员工

  1. 动态数组运算TOCOL/TOROW实现行列转换,IF实现条件匹配,SB实现空值过滤,全流程基于动态数组,一键溢出结果

  1. 容错处理SB错误值、TOCOL(...,3)过滤错误值,确保公式在空单元格、重复名单场景下稳定运行

⚠️ 避坑注意事项

  1. 名单规范:员工姓名必须完全一致(如 “铁蛋儿” 不能写成 “铁蛋”),否则会匹配失败

  1. 溢出错误(#SPILL!):公式所在单元格下方需预留足够空白空间,避免溢出报错

  1. 空值处理:名单中的空单元格会自动被过滤,不影响最终结果

  1. 列号遍历:公式自动从第 1 列遍历到最后一列,无需手动指定年份数量,适配任意多年度名单


七、拓展用法(进阶延伸,提升帖子价值)

  1. 多条件筛选:修改公式,可实现「连续 3 年获奖」「任意 3 年获奖」等自定义条件筛选

  1. 反向筛选:调整IF逻辑,一键找出「从未获奖」「仅 1 年获奖」的员工

  1. 多部门统计:结合GROUPBY函数,按部门分别统计每年都获奖的员工

  1. 动态年份范围:将列号改为单元格引用,实现「自定义年份区间」筛选(如 2022-2024)

  1. 数据去重:在初始名单中嵌套UNIQUE函数,自动去除同一年份的重复获奖记录


八、总结

该公式是HR / 行政部门员工评优的纯函数终极解决方案,依托LAMBDA递归回溯、动态数组交集运算,实现了「多年度获奖名单一键筛选」,替代了传统的手动对比、VLOOKUP 匹配、数据透视表等复杂操作。

核心价值在于:

  • 零代码:纯函数实现,无需编程基础

  • 全自动:自动逐年筛选、自动去重、自动输出结果

  • 高兼容:适配任意年份数量、任意名单长度

  • 易维护:修改名单数据,公式自动更新结果

掌握这个公式,不仅能解决员工评优的核心痛点,更能深入理解递归回溯、交集运算、动态数组等 WPS 高阶函数的核心逻辑,举一反三解决更多办公自动化难题!

浙江省
浏览 139
2
7
分享
7 +1
2 +1
全部评论