Excel TOCOL函数将范围转换为单列

  • Share This
Michael Brown

用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文件)

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.