一招解决多行多列变一列的问题
前言
你是不是也有过类似的经历,将表格设计成横向格式,给统计和分析带来很大的不方便,其实正确的姿势是第二个,正确的表格应有标题和记录组成,不应该合并单元格,每一列具有相同的属性,每一行代表一条完整的记录。
一旦做成第一种格式,如何快速转换成第二个格式呢?
1列出项目组成员
A9=INDIRECT(TEXT(SMALL(IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536),ROW(A1)),"R0C000"),0)&""
按CTRL+SHIFT+ENTER三键结束,下拉填充公式
解释:
IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536)
如果$B$2:$F$4区域的单元格内容不为空,则等于该单元格的行号乘以1000加上该单元格的列号,否则等于65536。
如:D2不为空,则返回2*1000+4=2004;E2为空值,则返回值为65536
此结果为包含一组数的数组{2002,2003,2004,65536,65536;3002,3003,3004,3005,65536;4002,4003,4004,4005,4006}
SMALL(IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536),ROW(A1))
取第一个最小的值,如果下拉则顺序取,第二个,第三个最小的,依次类推。
TEXT(SMALL(IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536),ROW(A1)),"R0C000")
将第一个最小的值,变成文本格式,格式为“R0C000”,如:2001变成文本格式为:R2C001
INDIRECT(TEXT(SMALL(IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536),ROW(A1)),"R0C000"),0)
返回地址为R2C001单元格的值,即第二行第一列的值,引用格式为R1C1格式。
A9=INDIRECT(TEXT(SMALL(IF($B$2:$F$4<>"",ROW($B$2:$F$4)*1000+COLUMN($B$2:$F$4),65536),ROW(A1)),"R0C000"),0)&""
为了防止出现0值,将结果与空值连接,变成空文本格式
CTRL+SHIFT+ENTER三键结束,形成数组公式
2列出项目名称
B9=INDEX($A$1:$A$4,MIN(IF(ISNUMBER(FIND(A9,$B$2:$F$4,1)),ROW($B$2:$F$4),65536)))
按CTRL+SHIFT+ENTER三键结束,下拉填充公式
解释:
FIND(A9,$B$2:$F$4,1))
在$B$2:$F$4区域的单元格中查找A9的值,返回该值在某个单元格出现的位置,如果能查找到,则返回具体数值,查找不到返回错误值,此结果仍然是一个数组
{1,#VALUE!,#VALUE!,#VALUE!,#VALUE!;#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!;#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!}
IF(ISNUMBER(FIND(A9,$B$2:$F$4,1)),ROW($B$2:$F$4),65536)
判断FIND的返回值,如果是数字,返回该单元格的行号,否则返回65536
{2,65536,65536,65536,65536;65536,65536,65536,65536,65536;65536,65536,65536,65536,65536}
MIN(IF(ISNUMBER(FIND(A9,$B$2:$F$4,1)),ROW($B$2:$F$4),65536))
取返回数组的最小值,此时为2
INDEX($A$1:$A$4,MIN(IF(ISNUMBER(FIND(A9,$B$2:$F$4,1)),ROW($B$2:$F$4),65536)))
从$A$1:$A$4区域中检索出第二个值,即为A2的值“三国”
CTRL+SHIFT+ENTER三键结束,形成数组
知识点
如果你自以为学会了几个函数就感觉不得了了,其实你的路还很长,加油吧,朋友!
ROW\COLUMN
IF
SMALL
TEXT
INDIRECT
FIND
MIN
ISNUMBER
MIN
INDEX
&""
CTRL+SHIFT+ENTER
END