比如我们有一个数据表,是横向填写的,每5行为一轮,现在需要将其整合为列的形式,这里介绍两个公式来实现转化:
一,简单公式
1,使用TOROW(B1:I20,3,1)将数据部分(不要A列)转为一列,第2个参数为3,屏蔽后面的空白单元格,第3个参数为1,按列转化
2,使用wraprows函数加参数5将其转化为5列的二维数组:WRAPROWS(TOROW(B1:I20,3,1),5),此时数据部分已经转化完成
3,再用vstack函数将表头和数据部分联结起来,注意表头为竖向的5行,所以要用transpose函数转置
完整公式为:VSTACK(TRANSPOSE(A1:A5),WRAPROWS(TOROW(B1:I20,3,1),5))
二,复杂公式
其实有了上面的简单公式能解决问题,就不需要复杂写法了,不过这里面用到reduce函数和lambda函数,就顺便介绍一下,算是多了解一下reduce函数的用法
1,每5行数据为一个块,案例所示就是4块,先考虑将这4块联结起来,公式为:REDUCE("",SEQUENCE(COUNTA(A1:A25)/5),LAMBDA(x,y,HSTACK(x,TRIMRANGE(OFFSET(A1,(y-1)*5,1,5,8)))))
使用reduce函数建立一个循环,循环次数为:SEQUENCE(COUNTA(A1:A25)/5),即1、2、3、4
以左上角单元格为基准,使用offset函数开始获取每个块的数据,行偏移量分别为0、5、10、15,列偏移固定为1,高度为5行,宽度为8即最大列数。考虑到每个块的列数不一样,所以嵌套了trimrange函数把空白部分去掉
使用hstack函数将每次循环结果进行联结
2,由于初始值为空值,还需要用drop函数把首列结果去掉
3,此时已经将4个数据块联结完成,再使用hstack函数将表头和数据块联结,完成数据整合
4,最后用transpose函数将结果进行转置
完整公式为:
TRANSPOSE(HSTACK(A1:A5,DROP(REDUCE("",SEQUENCE(COUNTA(A1:A25)/5),LAMBDA(x,y,HSTACK(x,TRIMRANGE(OFFSET(A1,(y-1)*5,1,5,8))))),,1)))
仔细看会发现两个公式得到的结果并不完全相同,公式1的结果是竖向联结,公式2的结果是横向联结,比较符合日常习惯