使用公式将工作表一列中的重复项依次移动到一行中。具体如下图所示,到工作表:
转换为工作表:
可以看到,在Data工作表中,A列有些名称出现一次,有些出现两次,有些出现三次,但是B列有不同的数据.
现在,我们需要根据名称将data工作表中的数据转换为一行数据,即把与每个名称相关的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+回车完成输入。结果如下图所示:
将单元格B2向右下方拖动,将公式复制到B2:E4区域,得到所需结果,如下图所示:
公式思维
将数据工作表的列A中的值与列A中的值进行比较。如果它们相等,则获取数据工作表中值所在行的行号。然后根据得到的行号在Data工作表的B列找到对应的值,放在这个单元格中。如果没有找到,则为空。
公式分析
数据!$A$2:$A$7=$A2将单元格A2的值与Data工作表的A列的值进行比较,因为前3行都相等,所以结果为:{ TRUE真;真;假;假;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} .
COLUMNS($B2:B2)返回当前单元格和B2单元格之间的列数,因为当前单元格在B2,所以它返回1。该值作为SMALL函数的参数,得到第kth个最小值,即需要的数据个数,从而得到data工作表中A列值对应的行号。在本例中,SMAll({ 1;2;3;假;假;FALSE},1).返回第一个最小值,即1。
然后,这个值被用作INDEX函数的参数:INDEX (data!$B$2:$B$7,1),获取数据工作表B列对应行的数据,即数据工作表B2单元格中的数据。
IFERROR函数用于在未找到数据时用空值填充单元格,而不是显示错误值。
总结
个人认为这个例子对于理解数组公式特别有用,值得反复练习和思考。
通过类比,这个例子也可以作为查找重复值的参考方法。