工作中,有时候我们需要把某个部门的人员信息单独调用出来,有些人会说,直接筛选不就可以了吗?如果只是想单纯的查看个人信息,直接用筛选确实更快捷。

我们今天要讲的是,办公室人员在填写文件审批单时,拟稿的部门涉及多个,我们要根据选择的部门,用数据有效性列出这个部门的人员,如图1,我们选择人事部后,拟稿人这里只显示人事部的人员姓名,以此类推。

图1

系统共有2个表册,第一个表为“员工基本信息”,主要内容有员工姓名、部门等;第二个表为“部门人员”,主要实现上述功能。

下面我们依次讲解。

一、增加辅助列处理员工基本信息里重复显示的部门

首先看图2,因为一个部门一般不可能只有一个人,所以一人显示一次部门的话,会重复显示,这时候我们需要增加辅助列,用函数把重复的部门进行去重,然后自定义名称,在第二表用“数据有效性”进行调用。

图2

此例,我们要用IFERROR、INDEX、MATCH、COUNTIF函数组合,计算出某列单元格不重复的值,然后用IFERROR函数隐藏错误值。

IFERROR函数:如果计算结果为错误值则显示指定的值。

方法:IFERROR(计算结果,如果计算结果为错误值显示指定的值)

INDEX函数:返回表或区域中的值或值的引用。

常用方法:INDEX(返回哪个区域的值,在第几行或第几列)

MATCH函数:返回指定数值在指定数组区域中的位置。

常用方法:MATCH(需要查找的值,在哪里查找,精准查找还是模糊查找)

COUNTIF函数:对指定区域中符合条件的单元格进行计数。

用法:COUNTIF(区域,条件)

下面,在E3单元格输入函数:

=IFERROR(INDEX($C$3:$C$22,MATCH(0,COUNTIF(E$2:E2,$C$3:$C$22),0)),"")

图3

公式讲解:

COUNTIF(E$2:E2,$C$3:$C$22)

在$C$3:$C$22区域内查找E$2:E2出现的次数,返回的是数组。

MATCH(0,COUNTIF(E$2:E2,$C$3:$C$22),0)

在上面产生的数组中查找第一个为0的位置。

INDEX($C$3:$C$22,MATCH(0,COUNTIF(E$2:E2,$C$3:$C$22),0))

上述第一个为0的位置反馈到$C$3:$C$22区域内的值,如果没有则返回空值。

我们刚才说过,一个部门一般不可能只有一个人,所以复制到最后一行时,去重后中间或后面的单元格值就会出现错误值,我们只需要用IFERROR函数即可解决,如果显示的值为错误值,那我们就让他显示为空值,在EXCEL函数中空值的表示方法直接用""即可。

函数输入结束后,如果直接按回车键,将无法显示正确结果,因为这是数组公式,所以要按Ctrl+Alt+Enter键结束,然后拖动复制到最后一行,这样就得到了图2所示的效果。

二、在“部门人员”表调用部门名称并列出人员信息

第一步:设置“有效性”调用去重后的部门

图4

图5

选择B2单元格,在“数据”选项卡下找到“有效性”,打开对话框,在“设置”功能组“有效性条件”—“允许”选择“序列”,其他默认,在“来源”下方输入:=基本信息!$E$3:$E$10(表示“基本信息”表辅助列E列去重后的部门数据),然后确定即可点击鼠标选择切换部门。

第二步:用函数列出选择部门的所有人员信息

此例,我们要利用INDEX+SMALL+IF函数实现一对多查询,计算出某列单元格不重复的值。

在B3单元格输入函数:=INDEX(基本信息!B:B,SMALL(IF(基本信息!$C$3:$C$22=$B$2,ROW(基本信息!$C$3:$C$22),2^10),ROW(1:1))),按Ctrl+Alt+Enter键结束,然后拖动复制到最后一行。

公式讲解:

IF函数:返回一个一维数组。

用法:IF(条件,符合条件,不符合条件)。

IF(基本信息!$C$3:$C$22=$B$2,ROW(基本信息!$C$3:$C$22),2^10)

如果B2单元格值与“基本信息”表C列值相同,则反馈“基本信息”表C列单元格的行号,如果为假,则返回2^10,表示2的10次方行,所以IF函数最终返回值要么是指定单元格的行号,要么是2的10次方行(数据量较大时要具体分析)。

SMALL函数:返回数组中第N个最小值。

用法:SMALL(数组区域,N)。

此处将IF函数返回的数组作为SMALL的第一参数,返回数组中第ROW(1:1)个最小值,即第一个最小值,往下复制公式得到ROW(2:2),将第一步产生的数组中符合条件的行号从最小的开始连续输出,以此类推,所以SMALL函数最终返回的是IF函数里的行号。

至此,我们的操作就完成了,选择不同的部门,部门下方将列出本部门所有人员姓名,如果还需要其他信息,按照上面的方法操作即可。

图6

图7

提示:如出现0值,可在公式最后写&"",主要是为了避免0值得出现,也可将公式嵌套到IFERROR中