Table of contents
用TOCOL函数将一个数组或范围转化为一个列的简单方法。
将数据从列转为行以及反转的能力已经在Excel中存在了相当长的时间。 但是,将一系列单元格转换为单列是一项棘手的任务。 现在,这种情况终于改变了。 微软推出了一个新函数,称为TOCOL,它可以在眨眼间完成数组到列的转换。 以下是这个新函数可以轻松解决的任务列表。
Excel TOCOL函数
Excel中的TOCOL函数将一个数组或单元格区域转换为一个单列。
该函数需要三个参数,但只有第一个参数是必需的。
TOCOL(array, [ignore], [scan_by_column])在哪里?
阵列 (required) - 一个要转换为列的数组或范围。
忽略不计 (可选) - 定义是否忽略空白或/和错误。 可以是这些值中的一个。
- 0或省略(默认)--保留所有值
- 1 - 忽略空白处
- 2 - 忽略错误
- 3 - 忽略空白和错误
逐栏扫描 (可选) - 决定是水平还是垂直扫描阵列。
- FALSE或省略(默认) - 从左到右逐行扫描阵列。
- TRUE - 从上到下逐列扫描数组。
提示。
- 要将一个数组转换为单行,请使用TOROW函数。
- 要做相反的列到数组的转换,可以使用WRAPCOLS函数按列包络,或者使用WRAPROWS函数按行包络。
- 要把一个数组从水平方向转到垂直方向,或者反过来,即把行改为列,请使用TRANSPOSE函数。
TOCOL的可用性
TOCOL是一个新功能,在Excel for Microsoft 365(Windows和Mac)和Excel for web中支持。
将范围转化为列的基本TOCOL公式
TOCOL公式的最简单形式只需要一个参数-- 阵列 例如,将一个由3列4行组成的二维数组放入一个单列中,其公式为
=TOCOL(A2:C5)
公式只在一个单元格(本例中为E2)中输入,并自动溢出到下面的单元格中。 就Excel而言,其结果被称为溢出区。
这个公式如何运作。
从技术上讲,首先将A2:C5范围转换为一个二维数组,请注意分号分隔的行和逗号分隔的列。
{"Apple","Banana","Cherry";1,0,3;4,#N/A,6;7,8,9}
TOCOL函数从左到右扫描阵列,并将其转化为一维垂直阵列。
{"Apple";"Banana";"Cherry";1;0;3;4;#N/A;6;7;8;9}
结果被放在单元格E2中,从那里溢出到下面的单元格。
如何在Excel中使用TOCOL函数--公式实例
为了更多地了解TOCOL函数的可能性以及它可以涵盖哪些任务,让我们看看一些公式的例子。
将数组转换为列,忽略空白和错误
在前面的例子中你可能已经注意到,默认的TOCOL公式保留了源数组的所有值,包括空白单元格和错误。
在生成的数组中,空单元格用0表示,这可能会相当混乱,尤其是在原始数组有0值的情况下。 解决方法是 跳过空白处 为此,你将第二个参数设为1。
=协议(a2:c5, 1)
拟 无视错误 ,将第二个参数设为2。
=协议(a2:c5, 2)
将两者都排除在外。 空白和错误 ,用3表示。 忽略不计 争论。
=协议(a2:c5, 3)
水平或垂直地扫描阵列
使用默认的 按栏目扫描 参数(FALSE或省略),TOCOL函数按行水平扫描数组。 要按列处理数值,将该参数设置为TRUE或1。 例如。
=协议(a2:c5,,true)
请注意,在这两种情况下,返回的数组大小相同,但数值的排列顺序却不同。
将多个范围合并为一列
如果你要处理几个不相邻的范围,那么你可以先在VSTACK函数的帮助下将这些范围垂直合并成一个数组,然后使用TOCOL将合并后的数组转换为一个列。
假设第一个范围是A2:C4,第二个范围是A8:C9,那么这个公式是这样的。
=协议(vstack(a2:c4, a8:c9))
这个公式演示了默认行为--从左到右水平读取组合数组,如下图E列所示。
要从上到下垂直读取数值,你要把TOCOL的第3个参数设置为TRUE。
=协议(vstack(a2:c4, a8:c9), ,true)
请注意,在这种情况下,公式首先返回两个数组中A列的值,然后是B列的值,以此类推。 原因是TOCOL扫描的是一个单一的堆叠数组,而不是原来的单独范围。
如果你的业务逻辑需要水平地而不是垂直地堆叠原始范围,那么使用HSTACK函数而不是VSTACK。
为了将后面的每个数组追加到前一个数组的右边,并横向读取合并后的数组,公式为:。
=协议(hstack(a2:c4, a8:c10))
要把后面的每个数组加到前一个数组的右边,并垂直扫描合并后的数组,公式是:。
=协议(hstack(a2:c4, a8:c10), ,true)
从一个多列范围中提取唯一的值
Excel的UNIQUE函数可以很容易地找到单列或单行中的唯一值,也可以返回唯一的行,但它不能从多列数组中提取唯一值。 解决方案是将它与TOCOL函数一起使用。
例如,要从A2:C7范围内提取所有不同的(不同的)值,公式为:。
=unique(tocol(a2:c7))
此外,你可以用SORT函数包裹上述公式,将返回的数组按字母顺序排列。
=sort(unique(tocol(a2:c7)))
如何将Excel 365中的范围转换为列 - 2010年
在不支持TOCOL函数的Excel版本中,有几种替代方法可以将单元格区域转化为一列。 这些解决方案相当棘手,但无论如何都是可行的。
要按行读取范围。
INDEX( 范围 ,商(row(a1)-1, columns( 范围 ))+1, mod(row(a1)-1, columns( 范围 ))+1)要按列读取范围。
INDEX( 范围 , mod(row(a1)-1, rows( 范围 ))+1,商(row(a1)-1, rows( 范围 ))+1)对于我们的样本数据集,公式如下。
要扫描范围 横向从左到右 :
=index($a$2:$c$5, quotient(row(a1)-1, columns($a$2:$c$5))+1, mod(row(a1)-1, columns($a$2:$c$5)) +1)
该公式等同于将第3个参数设置为FALSE或省略的TOCOL函数。
=TOCOL(A2:C5)
要扫描范围 从上到下的垂直方向 :
=index($a$2:$c$5, mod(row(a1)-1, rows($a$2:$c$5))+1, quotient(row(a1)-1, rows($a$2:$c$5)) +1)
这个公式与第3个参数设置为 "真 "的TOCOL函数相当。
=协议(a2:c5,,true)
与TOCOL不同,替代公式应该输入到你希望出现结果的每个单元格中。 在我们的例子中,公式进入单元格E2(按行)和G2(按列),然后向下复制到第13行。
如果公式被复制到超过需要的行,#REF!错误将出现在 "额外 "的单元格中。 为了防止这种情况发生,你可以像这样将公式嵌套在IFERROR函数中。
=iferror(index($a$2:$c$5, quotient(row(a1)-1, columns($a$2:$c$5))+1, mod(row(a1)-1, columns($a$2:$c$5))+1), "" )
注意,为了正确复制公式,我们使用绝对的单元格引用($A$2:$C$5)来锁定区域。 相反,你可以使用一个命名的区域。
这些公式是如何工作的
下面是对第一个按行排列单元格的公式的详细分解。
=index($a$2:$c$5, quotient(row(a1)-1, columns($a$2:$c$5))+1, mod(row(a1)-1, columns($a$2:$c$5)) +1)
我们的想法是使用INDEX函数,根据某个单元格在范围内的相对行号和列号,返回该单元格的值。
ǞǞǞ 行数 是通过这种组合来计算的。
商数(行(a1)-1, 列($a$2:$c$5))+1
QUOTIENT返回除法的整数部分。
对于 分子 你使用ROW(A1)-1,它返回一个序号,从E2(第一个输入公式的单元格)的0到E13(最后一个输入公式的单元格)的11。
ǞǞǞ 分母 brough by COLUMNS($A$2:$C$5))是常数,等于你的范围内的列数(在我们的例子中是3)。
现在,如果你检查QUOTIENT的前3个单元格(E2:E4)的结果,你会发现它等于0(因为除法的整数部分是0)。 加1后,行号是1。
对于接下来的3个单元格(E5:E5),QUOTIENT返回1,而+1操作提供行号2。 以此类推。
换句话说,公式的这一部分创建了一个重复的数字序列,如1,1,1,2,2,2,3,3,3,4,4,...每个数字重复的次数与你的范围内有多少列一样。
为了计算出 列号 ,你使用MOD功能建立一个适当的数字序列。
mod(row(a1)-1, columns($a$2:$c$5))+1
由于我们的范围内有3列(A2:C5),序列必须是1,2,3,1,2,3,...。
MOD函数返回除法后的余数。
在E2中,MOD(ROW(A1)-1, COLUMNS($A$2:$C$5))+1)
成为
MOD(1-1, 3)+1)
并返回1。
在E3中,MOD(ROW(A2)-1, COLUMNS($A$2:$C$5))+1)
成为
MOD(2-1, 3)+1)
并返回2。
在确定了行号和列号后,INDEX在获取所需值方面没有问题。
在E2中,INDEX($A$2:$C$5, 1, 1)返回引用范围的第一行和第一列的值,即从A2单元格开始。
在E3中,INDEX($A$2:$C$5, 1, 2)返回第一行和第二列的值,即从单元格B2开始。
等等。
第二个公式是按列扫描范围,工作方式类似。 不同的是,它用MOD来获得行号,用QUOTIENT来获得列号。
TOCOL功能不工作
如果TOCOL函数抛出一个错误,很可能是这些原因之一。
您的Excel中不支持TOCOL
当你遇到#NAME? 错误时,首先要检查函数名称的拼写是否正确。 如果名称正确,但错误仍然存在,说明该函数在你的Excel版本中不可用。 在这种情况下,考虑使用TOCOL的替代品。
阵列太大
一个#NUM的错误表示数组不能放入一列。 一个典型的情况是当你引用整个列或行的时候。
没有足够的空细胞
当#SPILL错误发生时,检查输入公式的那一列是否有足够的空单元格来填充结果。 如果单元格在视觉上是空白的,确保其中没有空格和其他非打印字符。 更多信息,请参阅如何在Excel中修复#SPILL错误。
这就是你如何在Excel 365中使用TOCOL函数以及早期版本中的替代解决方案,将二维数组转化为单列。 感谢你的阅读,希望下周在我们的博客上见到你!
实践工作手册
Excel TOCOL函数--公式示例(.xlsx文件)