Table of contents
将一列或一行的数值转化为二维数组的最快方法是使用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)
对数组进行包装和排序
如果源范围的值是随机的,而你希望输出的值是排序的,那么就按这个方法操作。
- 用SORT函数对初始数组进行你想要的排序。
- 向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文件)。