偶来试着回答一下:实例问题看起来比较简单,其本质是个列转行的问题,只是结果展示依然以列来标识而已。以下的回答适用于excel的行转列处理。
1、简单的行列转换,使用Excel提供的复制—>选择性粘贴—>转置即可。这种适用于关键列中的没有相同数据的,如:
2、复杂一点的,使用Excel提供公式来解决:
A、确定新的列头,比如题目中的A1/A2/A3是新的列头:
-复制原有数据列,粘贴到任意空白位置,删除重复项,得到没有重复值的列头
-将新的列头值从列转为行(参考1中的步骤)
B、第二步需要做的是基于新的列头的值(如“A1”),查找原来的数据中,与“A1”相匹配的值,如“asd”,并把“asd”填到“A1”的下方;为了方便演示,偶将数据整理成如下形式,下面将使用Excle的行列标引来表示公式:
写公式前的提醒:最后使用数组公式(有大括号包起来),写好公式后使用Ctrl+Shift+Enter完成输入,分步解读中直接说明逻辑
C、现在在D2格子中开始一步一步写公式:
-在B1:B5中查找D1,使用if公式,如果相等,则返回BI:B5的行号,否则任意返回一个值(尽量大一点,方便后面使用small函数):if($B$1:$B$5=D$1,row($B$1:$B$5),1000)
对D2来说,上述公式返回的值为:{1,1000,1000,1000,1000}
-用small函数将if函数得到的一串值进行升序排列,并和B1对应的行号做对比,锁定对应的行号:small(if($B$1:$B$5=D$1,row($B$1:$B$5),1000),row(B1))
对D2来说,上述公式返回的值为:small({1,1000,1000,1000,1000},1)=1
-基于上一步找到的行号,在A1:A5中查找对应的值,使用index函数:
index($A$1:$A$5,small(if($B$1:$B$5=D$1,row($B$1:$B$5),1000),row(B1)))
对D2来说,上述公式返回的值为:index($A$1:$A$5,1)=asd
D、基于C步骤的解读,可以看到最终D2的公式为:{=index($A$1:$A$5,small(if($B$1:$B$5=D$1,row($B$1:$B$5),1000),row(B1)))}
其中{}是录入公式结束后,按Ctrl+Shift+Enter得到的:
E、拖拽光标填充剩下的格子,自动得到计算结果。对于#REF!部分,使用“查找和选择”中的定位功能,定位后直接删除就可以:
F、对于上述过程,可以使用Excel自带的“公式求值”功能完成每一步的检查:
End.