朋友们好,今天和大家分享一道数据排列的题目。涉及到的函数都很简单,但却着实把我给绕晕了。
题目共有两问,是这样的:
题目要求将左侧的多列数据转换成右侧的单列数据。研究了半天,我终于搞明白了数据提取的规则。
源数据中4行为一组,每一组中的数据提取完毕后才能提取下一组中的数据。
每一组中先行后列提取。
第二问恰好和第一问相反,需要将多单列数据改写成多列的格式。
这类题目,我们总是要用到MOD函数、INT函数、ROW函数和INDEX函数的。
01
单列转多列
先看第一问。
想要达到第一问的效果,INDEX函数的第一参数是A2:D17,第二参数和第三参数应该是下面的样子:
这其实就是将文字版的提取规则用数字形式表达了出来。那么如何实现上面的效果呢?
在单元格F1中输入下列公式,并向下拖曳即可。
=INDEX(A$2:D$17,4*(INT((ROW(A1)-1)/16))+MOD(ROW(A1)-1,4)+1,MOD(INT((ROW(A1)-1)/4),4)+1)
这道题目,主要就是如何构建INDEX函数的第二参数和第三参数。
4*(INT((ROW(A1)-1)/16))+MOD(ROW(A1)-1,4)+1
这部分实现了第二参数。它需要以16为周期循环。
在第一个周期中,以1、2、3、4来循环;
在第二个周期中,以5、6、7、8来循环
...
当ROW(A1)小于等于16时,4*(INT((ROW(A1)-1)/16))的结果是0,MOD(ROW(A1)-1,4)+1按1、2、3、4循环。
当ROW(A1)小于等于32时,4*(INT((ROW(A1)-1)/16))的结果是4,MOD(ROW(A1)-1,4)+1按1、2、3、4循环,整个部分按5、6、7、8循环。
当ROW(A1)小于等于48时,4*(INT((ROW(A1)-1)/16))的结果是8,MOD(ROW(A1)-1,4)+1按1、2、3、4循环,整个部分按9、10、11、12循环。
...
MOD(INT((ROW(A1)-1)/4),4)+1
这部分实现了第三参数。由于第三参数只需要按照1、1、1、1、2、2、2、2、3、3、3、3、4、4、4、4来循环,因此这部分 相对也比较简单,不再赘述了。
INDEX(A$2:D$17,4*(INT((ROW(A1)-1)/16))+MOD(ROW(A1)-1,4)+1,MOD(INT((ROW(A1)-1)/4),4)+1)
最终,INDEX函数依次返回答案。
02
多列转单列
第二个问题。
在第二问中,源数据处在一列中,仍以16为周期。第一个周期中,4个数值为一组,依次排到前4行的4列中。第二个周期中,仍以4个数值为一组,依次排到5-8行的4列中。后面依次排列。
因此,INDEX函数的第二参数的效果应该是下面这样子的:
首先,公式写成这个样子
16*MOD(INT((ROW(A1)-1)/4),4)
MOD(INT((ROW(A1)-1)/4),4)按照0、1、2、3循环,乘以16后按照0、16、32、48来循环。
接下来,再通过COLUMN函数,来实现列方向上的效果。
16*MOD(INT((ROW(A1)-1)/4),4)+MOD((ROW(A1)-1),4)+1+4*(COLUMN(A1)-1)
下来我们一起来看看如何书写这个公式吧。
在单元格C2中输入下列公式,并向下向右拖曳即可。
=INDEX($A$2:$A$65,16*MOD(INT((ROW(A1)-1)/4),4)+MOD((ROW(A1)-1),4)+1+4*(COLUMN(A1)-1))
小伙伴们,你们能自己解析一下这个公式吗?记得给我留言哦!
好了,我终于绕出来了!
本期内容练习文件提取方式:
通过百度网盘分享的文件:转换表格为单列.xlsx
链接:https://pan.baidu.com/s/19xEM6Blt7uviQFJmbx9UKA?pwd=d6vf
提取码:d6vf