使用公式将工作表内一列中的重复项依次移到一行中。具体如下图所示,要将工作表:

将列数据转换为行数据

转换成工作表:

将列数据转换为行数据

可以看出,在“数据”工作表中,列A中有些姓名出现1次,有些出现2次,有些出现3次,但在列B中有不同的数据。

现在,需要将“数据”工作表中的数据转换成基于姓名的一行数据,即将与每个姓名相关的列B中的数据放置到单独的一行中。

使用数组公式来解决。在单元格B2中输入公式:

=IFERROR(INDEX(数据!$B$2:$B$7,SMALL(IF(数据!$A$2:$A$7=$A2,ROW(数据!$A$2:$A$7)-ROW(数据!$A$2)+1),COLUMNS($B2:B2))),””)

按Ctrl+Shift+Enter组合键完成输入。结果如下图所示:

将列数据转换为行数据

将单元格B2向右向下拖动,将公式复制到B2:E4区域后获得所需结果,如下图所示:

将列数据转换为行数据

公式思路

将列A中的值与“数据”工作表列A中的值相比较,如果相等则获取“数据”工作表中该值所在行的行号,然后根据获取的行号在“数据”工作表列B中找到相应的值并放置在本单元格中,如果没找到则为空。

公式解析

数据!$A$2:$A$7=$A2将单元格A2的值与“数据”工作表列A的值比较,因为前3行都相等,因此结果为:{TRUE;TRUE;TRUE;FALSE;FALSE;FALSE}。

ROW(数据!$A$2:$A$7)-ROW(数据!$A$2)+1获取一个值为1至6的数组:{1;2;3;4;5;6}。

IF(数据!$A$2:$A$7=$A2,ROW(数据!$A$2:$A$7)-ROW(数据!$A$2)+1)的结果为数组{1;2;3;FALSE;FALSE;FALSE}。

COLUMNS($B2:B2)返回当前单元格与B2单元格相间隔的列数,因为当前单元格就在B2,因此返回1。该数值用来作为SMALL函数的参数,获取第k个最小值,即需要第几人数据,从而获取列A值在“数据”工作表中对应的行号。本例中为SMALL({1;2;3;FALSE;FALSE;FALSE},1)。返回第1个最小值,即1。

然后,该值用作INDEX函数的参数:INDEX(数据!$B$2:$B$7,1),获取“数据”工作表列B中相应行的数据,即“数据”工作表单元格B2中的数据。

IFERROR函数用来在没有找到数据时给单元格填充空值,而不是显示错误值。

小结

个人觉得这个例子对于理解数组公式特别有用,值得反复练习与琢磨。

举一反三,本示例也可以用作查找重复值的参考方法。

发表回复