HI,大家好,我是星光
今天给大家分享的表格技巧是两个工作中比较常用的新函数:
TOROW/TOCOL
它们的作用分别是将数据源转换为单行row或单列col的结构。
这么直白的描述似乎很正经很枯燥?打个响指,还是举两个例子吧。
丨 案例1
如下图所示的数据,A:C列包含了多列的人名,需要转换为单列。
在没有这两个函数的低版本Excel/WPS中,这类问题需要使用复杂的嵌套函数,例如,E2单元格输入公式向下复制填充:
=OFFSET($A$1,INT(ROW(A3)/3),MOD(ROW(A3),3))&""
当然,你也可以用基操/透视表/PQ/VBA等解法,这些解法我们之前做过一篇总结推文:「多列转单列解法总结」TOCOL中的COL是COLUMN的缩写,也就是列的意思,它的作用是将数据源转换为单列结构。
基本语法如下:
=TOCOL(
区域或数组,
是否忽略空白/错误值,
转换的方向是行还是列
)
一共有3个参数,第1参数是必需的,表示数据源,第2和第3参数可选,其中第2参数用于设置对空白或者错误值的处理方式,第3参数设置转换的优先方向,先行后列或先列后行。
如下图所示的数据为例,依然需要将多列数据转单列,只不过数据源中包含了空白单元格,转换后的结果需要忽略这些空白单元格。
参考公式如下:
第2参数设置为1,表示忽略空白值。
TOCOL公式默认是按照先行后列的方向转换数据,如果你需要先列后行,可以将第3参数设置成一个非0的数字,一般是设置为1。
先列后行的转换方向👆
丨 案例2
打个响指,接下来,看一个稍微复杂的案例。
如下图所示的数据,左侧是一张二维成绩表,需要转换成右侧一维表的样式。
什么是二维表什么是一维表?两者之间有何优劣?为什么要将二维表转换为一维表?……我们在之前的推文「二维表和一维表」详细讲解过了,像我这么懒的人,这里就不重复了。
这类问题最简单的方法是使用PQ,不过如果你使用的是WPS,又需要返回一个动态更新的结果的话…………那函数也挺好的。
=LET(
_姓名,TOCOL(IF((B2:D6>0)+1,A2:A6)),
_科目,TOCOL(IF((B2:D6>0)+1,B1:D1)),
_数值,TOCOL(B2:D6),
_结果,HSTACK(_姓名,_科目,_数值),
_结果
)
这条公式将值区域转换为单列结构,这是你已经知道的——别说你这就忘了。
_姓名,TOCOL(IF((B2:D6>0)+1,A2:A6))
这条公式返回和成绩数量对应的单列的姓名。其中IF((B2:D6>0)+1,A2:A6)部分,if的判断条件是和姓名区域同等尺寸的数值1,也就根据成绩返回对应的姓名,结果如下:
然后使用TOCOL函数将IF返回的结果转换为单列结构即可。
科目部分是相同的计算方法,最后使用HSTACK函数将姓名、科目和成绩~3列数据合并成一个二维数组。
如果你使用的表格的版本是Excel 365的话,使用GROUPBY函数可能是更好的解决方案。
=GROUPBY(
A2:A6,
B2:D6,
IF({1,0},LAMBDA(x,@x),TOCOL(B1:D1)),
0,0
)
GROUPBY函数是微软近期推出的一个新函数,我们前几天发过相关教程,感兴趣的朋友可以阅读→_→「GROUPBY」
……
最后再提一下TOROW函数,它的作用是将数据源转换为单行结构,参数与用法和TOCOL都极其相似,你会用TOCOL,自然就会用TOROW,所以这里咱们就提一下,提完了,再见。
⏩需要系统学习Excel,却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道