
似乎每个人都认识至少1个与磊哥重名的,平常倒也还好,但是在公司里有重名员工的时候,就得小心做表的时候别弄错了。尤其是刚开始玩公式的朋友,一个VLOOKUP公式甩过去,交上去领导发现有对不上的(比如奖金什么的,员工B拿了A一样的奖金),哦吼,小心挨骂哦。
举个例子,要查询个别员工的相关信息,重名的就另起一行。我们来看看怎么操作。

01
函数公式初阶玩家:辅助列是好东西
不就是重名嘛,造一个辅助列,让名字不重复不就得了。
插入A列,命名为“*姓名”,用*以示为辅助列,也与原标题字段名进行区分。
A2=C2&COUNTIF(C$2:C2,C2)

这里COUNTIF(C$2:C2,C2)下拉复制之后就变成了COUNTIF(C$2:C3,C3)、…、COUNTIF(C$2:C21,C21)等等,计数的起始单元格被$锁定了,就不会变化(绝对引用),而结束单元格在一直增加(相对引用),所以计数的结果就会有1、2、3等情况,实现了重名的人自动编号效果。于是就有了“郭*辉1、郭*辉2、郭*辉3”这种。
完全不重复的姓名列有了,剩下的交给VLOOKUP。
查找的员工姓名“郭*辉”固定在I2单元格,怎么实现“郭*辉1、郭*辉2、郭*辉3”这种效果用在VLOOKUP里呢?
【知识点】这里就要说到ROW和COLUMN函数了,一个是行,一个是列,给它们一个A1看看?ROW(A1)=1,ROW(A2)=2,同样的COLUMN(A1)=1,COLUMN(B1)=2。我们常用ROW和COLUMN来获取序列数字完善公式。比如,$I$2&ROW(A1)就是“郭*辉1”。

H2=IFERROR(VLOOKUP($I$2&ROW(A1),$A:$E,COLUMN(B1),FALSE),"")
//IFERROR(内容,"")的意思是内容出错的话,就显示空白
*该公式等同于IFERROR(VLOOKUP("郭*辉1",$A:$E,2,FALSE),"")
右拉复制后,
I2=IFERROR(VLOOKUP($I$2&ROW(B1),$A:$E,COLUMN(C1),FALSE),"")
*该公式等同于IFERROR(VLOOKUP("郭*辉1",$A:$E,3,FALSE),"")
看到了吧,我们就可以用这种方式实现一个公式通用在几个单元格里,方便拖拽复制。好的,再下拉复制公式。
配上附有由内而外写公式的全过程动图:

看看最终效果:

当然,最后觉得辅助列碍眼可以隐藏起来,或者像磊哥这样把它组合起来,需要的时候点开就行了。
02
被逼无奈:不给加辅助列
*这部分磊哥写细一点,很多人是刚接触数组公式等,理解上会有点难度,我尽量分解说慢一点,注意看动图并模仿操作。
遇到要求不允许改动表格结构的话,辅助列就不能加了。别怕,想想构造辅助列的目的是什么?不就是为了让姓名不重复吗?对于重名的姓名来说,有没有什么是不一样的?筛选后就发现了,原来行号不一样。

试一下,在E2写上公式
=IF($B$2:$B$21=J2,ROW($B$2:$B$21),"")
意思是,对于$B$2:$B$21这个区域,如果其中有单元格等于J2,就返回这个单元格的行号,否则留空。于是得到了2、12、17三个行号,就可以用INDEX函数来引用了。
//此为数组公式,低版本EXCEL录入后,要按组合键Ctrl+Shift+Enter完成输入

直接改公式
E2=IFERROR(INDEX($B$1:$B$21,IF($B$2:$B$21=J2,ROW($B$2:$B$21),""),),""),得到了3个名字。过程看动图:

*INDEX第三参数为1表示所选区域的第一列,不写就默认是1(别忘了逗号)
*注意INDEX第一参数$B$1:$B$21中是从1开始的,这是因为后面IF返回的是行号2,如果第一参数还是$B$2:$B$21的话,那就会返回$B$2:$B$21区域中第2个单元格,即B3的值,不是返回B2了。
名字有了,但是中间有很多空格,不能用啊。没事,引荐一个函数SMALL,它与MIN有点亲戚关系。MIN是求最小值,SMALL是求第几小值,举个例子,SMALL($O$4:$O$7,3)意思是$O$4:$O$7区域中第3小的值,也就是7。SMALL配上ROW和COLUMN就非常能打。

将刚才的E2公式修改为
=SMALL(IF($B$2:$B$21=J2,ROW($B$2:$B$21),""),ROW(1:10)),得到的行号连续了。这里用到10个行号值ROW(1:10),一般也不会有10个重名的吧?够用了。
//注意:数组公式,低版本要用组合键,以下不再提示

再加上INDEX和IFERROR:

所以,可以直接用在查询区了(要绝对引用锁定J2单元格)。把E2的公式剪切到J5,左拉到I5,将INDEX后面第一个$B$1:$B$21改成$A$1:$A$21就能查部门了。性别和工号也可以这么做。

还可以这么改:I5的INDEX中改大区域,并将第三参数改成COLUMN(A1),然后就可以右拉复制到工号列,实现公式通用了
I5=IFERROR(INDEX($A$1:$D$21,SMALL(IF($B$2:$B$21=$J$2,ROW($B$2:$B$21),""),ROW(1:10)),COLUMN(A1)),"")

03
高版本EXCEL福利:公式更短更好用
前面两个部分这么写也是受EXCEL版本限制,对于EXCEL2021/MICROSOFT365来说就没必要这样了。有更好的公式。
I5=FILTER($A$2:$D$21,$B$2:$B$21=J2)

你看,一个公式就搞定了。由于EXCEL2021/MICROSOFT365支持溢出,所以数组公式直接写了回车就能用,不需要组合键了。
FILTER函数用法:FILTER(筛选区域,筛选条件,如果一个满足条件的都没有返回什么)。举个例子:

所以,I5公式最好改成=FILTER($A$2:$D$21,$B$2:$B$21=J2,""),当J2为空时,查询表就也显示为空了。
本篇,我们把常用的一对多查询重名员工并多行显示的公式做了介绍,请大家动手练习。下篇,我们来研究如何实现这种一对多查询:
