在Excel中转换列/行为数组:WRAPCOLS & WRAPROWS函数

  • Share This
Michael Brown

将一列或一行的数值转化为二维数组的最快方法是使用WRAPCOLS或WRAPROWS函数。

自Excel诞生之初,它就非常善于计算和分析数字。 但操作数组历来是个难题。 动态数组的引入使数组公式的使用变得简单了许多。 而现在,微软发布了一组新的动态数组函数来操作和重新塑造数组。 本教程将教你如何使用两个这样的函数。WRAPCOLS和WRAPROWS,将一列或一行瞬间转化为一个二维数组。

    Excel WRAPCOLS函数

    Excel中的WRAPCOLS函数根据每行指定的数值数量,将一行或一列的数值转化为二维数组。

    该语法有以下参数。

    WRAPCOLS(vector, wrap_count, [pad_with])。

    在哪里?

    • 向量 (required) - 源一维数组或范围。
    • 包裹数 (required) - 每一列的最大数值。
    • 垫_用 (可选) - 如果没有足够的项目来填充最后一列,则要填充的值。 如果省略,缺少的值将被填充为#N/A(默认)。

    例如,要将范围B5:B24改为二维数组,每列有5个值,公式为:。

    =wraprows(b5:b24, 5)

    你在任何一个单元格中输入公式,它就会自动溢出到所需的多个单元格中。 在WRAPCOLS输出中,数值是垂直排列的,从上到下,依据是 包裹数 数值达到后,就开始新的一列。

    Excel的WRAPROWS函数

    Excel中的WRAPROWS函数根据你指定的每行的数值数量,将一行或一列的数值转换成一个二维数组。

    语法如下。

    WRAPROWS(vector, wrap_count, [pad_with])。

    在哪里?

    • 向量 (required) - 源一维数组或范围。
    • 包裹数 (必填)--每行的最大值数。
    • 垫_用 (可选) - 如果没有足够的项目来填充,则用最后一行来填充的值。 默认是#N/A。

    例如,要将范围B5:B24转换为每行有5个值的二维数组,其公式为:。

    =wraprows(b5:b24, 5)

    你在溢出区的左上角单元格中输入公式,它就会自动填充所有其他单元格。 WRAPROWS函数将数值水平排列,从左到右,基于 包裹数 在达到计数后,它开始一个新的行。

    可提供WRAPCOLS和WRAPROWS

    这两个功能只在Excel for Microsoft 365(Windows和Mac)和Excel for web中可用。

    在早期版本中,你可以使用传统的更复杂的公式来进行列到数组和行到数组的转换。 在本教程中,我们将进一步详细讨论替代解决方案。

    提示:要进行反向操作,即把一个二维数组改为单列或单行,请分别使用TOCOL或TOROW函数。

    如何在Excel中把列/行转换为范围--实例

    现在你已经掌握了基本用法,让我们仔细看看几个更具体的案例。

    设置每列或每行的最大值数

    根据你的原始数据的结构,你可能会发现它适合被重新排列成列(WRAPCOLS)或行(WRAPROWS)。 无论你使用哪种函数,它是 包裹数 参数,决定了每一列/行的最大数值。

    例如,要将范围B4:B23转换成一个二维数组,使每一列最多拥有10个值,请使用这个公式。

    =wrapcols(b4:b23, 10)

    要按行重新排列同一范围,使每行最多有4个值,其公式为:。

    =wraprows(b4:b23, 4)

    下面的图片显示了这种情况的样子。

    在结果数组中对缺失的值进行填充

    如果没有足够的值来填满结果范围的所有列/行,WRAPROWS和WRAPCOLS将返回#N/A错误,以保持二维数组的结构。

    要改变默认行为,你可以为可选的 垫_用 争论。

    例如,要将范围B4:B21转换为最多5个值的二维数组,如果没有足够的数据填充,则用破折号填充最后一行,使用这个公式。

    =wraprows(b4:b21, 5, "-")

    为了用零长度的字符串(空白)替换缺失的值,公式为:。

    =wraprows(b4:b21, 5, "" )

    请将结果与默认行为(D5中的公式)进行比较,其中 垫_用 是省略的。

    将多行合并为二维范围

    要将几个独立的行合并成一个二维数组,首先要用HSTACK函数将这些行水平堆叠起来,然后用WRAPROWS或WRAPCOLS包住这些值。

    例如,要将3行(B5:J5, B7:G7和B9:F9)的数值合并成列,每列包含10个数值,公式为:。

    =wrapcols(hstack(b5:j5, b7:g7, b9:f9), 10)

    要将多行的数值合并到一个二维范围内,每行包含5个数值,公式采用这种形式。

    =wraprows(hstack(b5:j5, b7:g7, b9:f9), 5)

    将多个列合并为二维阵列

    要将几个列合并成一个二维范围,首先要用VSTACK函数将它们垂直堆叠起来,然后将这些值包成行(WRAPROWS)或列(WRAPCOLS)。

    例如,要将3列(B5:J5, B7:G7和B9:F9)的数值合并成一个二维范围,每一列包含10个数值,公式为:。

    =wrapcols(hstack(b5:j5, b7:g7, b9:f9), 10)

    要将相同的列组合成一个二维范围,每行包含5个值,请使用这个公式。

    =wraprows(hstack(b5:j5, b7:g7, b9:f9), 5)

    对数组进行包装和排序

    如果源范围的值是随机的,而你希望输出的值是排序的,那么就按这个方法操作。

    1. 用SORT函数对初始数组进行你想要的排序。
    2. 向WRAPCOLS或WRAPROWS提供排序后的数组。

    例如,要将范围B4:B23包成行,每行4个值,并将所得范围从A到Z排序,可构建这样一个公式。

    =wraprows(sort(b4:b23), 4)

    要把同一范围包成列,每列有10个值,并按字母顺序对输出进行排序,公式是:。

    =wrapcols(sort(b4:b23), 10)

    结果看起来如下。

    提示:要将所得数组中的数值排列成 降序 ,设置第三个参数( 排序_顺序 )的SORT函数为-1。

    适用于Excel 365 - 2010的WRAPCOLS替代品

    在不支持WRAPCOLS函数的旧版Excel中,你可以建立自己的公式,将一维数组中的值包装成列。 这可以通过同时使用5个不同的函数来实现。

    WRAPCOLS是将一行转换为二维范围的替代方法。

    IFERROR(IF(ROW(A1)> n , "", INDEX( 行_范围 , , 行(a1)+(列(a1)-1)*。 n )), "")

    WRAPCOLS是将一个列转换为二维范围的替代方案。

    IFERROR(IF(ROW(A1)> n , "", INDEX( 列_范围 ,行(a1)+(列(a1)-1)*。 n )), "")

    在哪里? n 是每一列的最大值数。

    在下图中,我们使用以下公式将一个单行范围(D4:J4)变成一个三行数组。

    =IFERROR(IF(ROW(A1)>3, "", INDEX($D$4:$J$4, , ROW(A1) + (COLUMN(A1)-1)*3)), " ")

    而这个公式将一个单列范围(B4:B20)变成了一个五行数组。

    =IFERROR(IF(ROW(A1)>5, "", INDEX($B$4:$B$20, ROW(A1) + (COLUMN(A1)-1)*5)), " ")

    上述解决方案模仿了类似的WRAPCOLS公式,产生了相同的结果。

    =wrapcols(d4:j4, 3, "" )

    =wrapcols(b4:b20, 5, "" )

    请记住,与动态数组WRAPCOLS函数不同,传统的公式遵循一个公式一个单元格的方法。 因此,我们的第一个公式被输入到D8,并向下复制3行,向右复制3列。 第二个公式被输入到D14,向右复制5行,4列。

    这些公式是如何工作的

    在这两个公式的核心,我们使用了INDEX函数,根据行号和列号从提供的数组中返回一个值。

    INDEX(array, row_num, [column_num])

    由于我们处理的是单行数组,我们可以省略 行数_num 参数,所以它默认为1。 诀窍是让 col_num 下面是我们如何做到这一点的。

    行(a1)+(列(a1)-1)*3)

    ROW函数返回A1引用的行号,是1。

    COLUMN函数返回A1引用的列号,也是1,减去1后变成0。 而用0乘以3后得到0。

    然后,你将ROW返回的1和COLUMN返回的0相加,得到1的结果。

    这样一来,目标区左上角单元格(D8)中的INDEX公式就经历了这种转换。

    index($d$4:$j$4, ,row(a1) + (column(a1)-1)*3))

    变化,以

    index($d$4:$j$4, ,1)

    并返回指定数组第一列的值,即D4中的 "Apples"。

    当公式被复制到D9单元格时,相对的单元格引用根据行和列的相对位置而改变,而绝对的范围引用保持不变。

    index($d$4:$j$4,, row(a2)+(column(a2)-1)*3))

    变成了。

    index($d$4:$j$4,, 2+(1-1)*3))

    成为。

    index($d$4:$j$4,, 2))

    并返回指定数组第二列的值,即E4中的 "Apricots"。

    IF函数检查行数,如果它大于你指定的行数(在我们的例子中是3),返回一个空字符串(""),否则就是INDEX函数的结果。

    IF(ROW(A1)>3, "", INDEX(...))

    最后,IFERROR函数修复了#REF!错误,该错误在公式被复制到超过实际需要的单元格时发生。

    第二个公式是将一列转换为2D范围,其工作原理相同。 不同的是,你使用ROW+COLUMN组合来计算出 行数_num 的参数。 col_num 参数在这种情况下是不需要的,因为源数组中只有一列。

    适用于Excel 365 - 2010的WRAPROWS替代品

    在Excel 2019年及以前的版本中,要将一维数组中的值包装成行,可以使用以下替代WRAPROWS函数的方法。

    将一个行转化为二维范围。

    IFERROR(IF(COLUMN(A1)> n , "", INDEX( 行_范围 , , 列(a1)+(行(a1)-1)* n )), "")

    将某一列改为2D范围。

    IFERROR(IF(COLUMN(A1)> n , "", INDEX( 列_范围 ,列(a1)+(行(a1)-1)*。 n )), "")

    在哪里? n 是每行的最大数值数。

    在我们的示例数据集中,我们使用以下公式将一个单行范围(D4:J4)转换为一个三列范围。 该公式落在D8单元格,然后被复制到3列和3行。

    =IFERROR(IF(COLUMN(A1)>3, "", INDEX($D$4:$J$4, , COLUMN(A1)+(ROW(A1)-1)*3), "")

    要将一个1列范围(B4:B20)重塑为5列范围,在D14中输入下面的公式,并将其拖过5列4行。

    =IFERROR(IF(COLUMN(A1)>5, "", INDEX($B$4:$B$20, COLUMN(A1)+(ROW(A1)-1)*5), "")

    在Excel 365中,同样的结果可以通过同等的WRAPCOLS公式来实现。

    =wraprows(d4:j4, 3, "" )

    =wraprows(b4:b20, 5, "" )

    这些公式是如何工作的

    本质上,这些公式的工作原理与前面的例子一样。 不同之处在于你如何确定 行数_num col_num INDEX函数的坐标。

    index($d$4:$j$4,, column(a1)+(row(a1)-1)*3))

    为了获得目标区域(D8)中左上角单元格的列号,你使用这个表达式。

    列(a1)+(行(a1)-1)*3)

    改为。

    1+(1-1)*3

    并给出了1。

    因此,下面的公式返回指定数组第一列的值,即 "苹果"。

    index($d$4:$j$4,, 1)

    到目前为止,结果和前面的例子是一样的。 但让我们看看在其他单元格中会发生什么...

    在D9单元格中,相对的单元格引用改变如下。

    index($d$4:$j$4,, column(a2)+(row(a2)-1)*3))

    因此,该公式转化为。

    index($d$4:$j$4,, 1+(2-1)*3))

    成为。

    index($d$4:$j$4,, 4))

    并返回指定数组中第4列的值,即G4中的 "Cherries"。

    IF函数检查列数,如果它大于你指定的列数,则返回一个空字符串(""),否则就是INDEX函数的结果。

    IF(COLUMN(A1)>3, "", INDEX(...))

    作为点睛之笔,IFERROR防止#REF!错误出现在 "额外 "的单元格中,如果你将公式复制到比实际需要更多的单元格中。

    WRAPCOLS或WRAPROWS功能不工作

    如果你的Excel中没有 "包裹 "功能,或者导致错误,很可能是以下原因之一。

    #NAME? 错误

    在Excel 365中,可能会出现#NAME? 错误,因为你拼错了函数的名称。 在其他版本中,它表示不支持这些函数。 作为一种变通方法,你可以使用WRAPCOLS替代物或WRAPROWS替代物。

    #VALUE!错误

    如果出现了#VALUE错误 向量 参数不是一个一维数组。

    #NUM!错误

    如果发生#NUM错误,则 包裹数 值为0或负数。

    #SPILL!错误

    大多数情况下,#SPILL错误表明没有足够的空白单元格来溢出结果。 清除邻近的单元格,它就会消失。 如果错误持续存在,请查看#SPILL在Excel中的含义以及如何修复它。

    这就是如何在Excel中使用WRAPCOLS和WRAPROWS函数将一维范围转换为二维数组的方法。 感谢你的阅读,希望下周在我们的博客上见到你!

    供下载的实践工作手册

    WRAPCOLS和WRAPROWS函数--示例(.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.