Excel:在列/行/matrix之间转换数据的公式

有没有公​​式将列中的数据转换为matrix或行? 并从其他组合转换?

那么更复杂的情况是什么呢?重塑一个宽度为W的matrix为宽度为N * W?

有几个相似或相关的问题。 我已经回答了其中的一些,标有*。 我不断更新这个列表,因为添加了新的类似(或相等)的问题:

格式化数据:列到行 *

将内容从1列移动到3列 *

如何根据EXCEL中的条件将一列分成两列 *

写一个macros将3列转换为1行

Excel VBA转换与字符

math转置在Excel中

Excel中的每个条目如何将“matrix” – 表格转换为一行

将具有多行数据的列转换为Excel中具有多列的行。

如何使用VBA重塑excel中的数据 *

将三列sorting为六列,使用excel水平排列姓氏 *

将excel中的一列中的数据分成多列

将数据从多列移动到单行 *

其中一些答案似乎是“可升级的”,以涵盖更多的东西。 那可能吗?

要从/转换的样本格式是:

1 2 3 4 5 6 7 ... 

 1 2 3 4 5 6 7 ... 

matrix(在这里有4列的跨度)

 1 2 3 4 5 6 7 8 ... 

这个想法是在这里给出一些可能适用于上面列出的问题的小改动,也可以作为未来相关问题的参考。

要使用的基本function是INDEXOFFSET 。 参照这个数字,每个例子的优缺点都会经过明确的例证。 它显示了几个范围和他们定义的名字(在下面用斜体表示 )。 所有定义的名称可以被直接的绝对引用replace为相应的单元格。

在这里输入图像描述

1.列到matrix

跨度 (在C1中)给出了列数。 然后matrix_data_top_left (这里是D1)包含

 =INDEX(col_data,(ROW()-ROW(matrix_data_top_left))*span+(COLUMN()-COLUMN(matrix_data_top_left)+1),1) 

然后将其复制到matrix_data的其余部分。 请注意,复制到D5中也会出现错误,因为生成的公式引用col_data (A1:A16)之外的单元格。 在matrix_data2_top_left (I1)中获得相同的结果

 =OFFSET(col_data_top,(ROW()-ROW(matrix_data2_top_left))*span+(COLUMN()-COLUMN(matrix_data2_top_left)),0) 

并且类似地拷贝到matrix_data2中 。 请注意,也复制到I5返回0 ,而不是一个错误。

OFFSET的优点是只需要一个单元格作为基础参考( col_data_top ),因此用其他数据扩展源数据范围不需要重新定义公式中的源数据范围,只需要复制粘贴到扩大目标范围。 另一方面,使用INDEX扩展源数据范围需要先在公式中进行更新(如果明确使用,则更改范围),然后复制粘贴到扩展目标范围。 使用一个定义的名字对于这个目的更加通用,因为在这里重新定义col_data就足够了(并且可以在扩展目标范围之后完成)。 由于这个相同的属性, INDEX提供了一种对源范围的自动边界检查,而OFFSET没有。

2.matrix到列

col_data2_top包含

 =INDEX(matrix_data2,INT((ROW()-ROW(col_data2_top))/span)+1,MOD(ROW()-ROW(col_data2_top),span)+1) 

col_data3_top

 =OFFSET(matrix_data2_top_left,INT((ROW()-ROW(col_data3_top))/span),MOD(ROW()-ROW(col_data3_top),span)) 

两个公式都向下复制。 INDEXOFFSET存在相同的区别。

3.matrix行

由于OFFSET不给出错误,其余的公式将使用它。 沿着上面所示的线适应INDEX是很容易的。 row_data_left包含

 =OFFSET(matrix_data_top_left,INT((COLUMN()-COLUMN(row_data_left))/span),MOD(COLUMN()-COLUMN(row_data_left),span)) 

然后复制到右侧。

4.列到行

row_data2_left包含

 =OFFSET(col_data_top,COLUMN()-COLUMN(row_data2_left),0) 

再次复制到右侧。

PS:公式=TRANSPOSE(...适用于这种情况,它应该作为数组公式input(使用Ctrl + Shift + Enter )Nevertheles, 可能需要避免数组公式 。

5/6。 行到列/matrix

沿着这条路线很容易获得。 例如, col_data_top包含

 =OFFSET(row_data_left,0,ROW()-ROW(col_data_top)) 

并抄下来。

7.matrix转置

为了得到matrix_data3 (图中未示出) matrix_data2的转置,只需要使用matrix_data3_top_left ,用公式

 =OFFSET(matrix_data2_top_left,COLUMN()-COLUMN(matrix_data3_top_left),ROW()-ROW(matrix_data3_top_left)) 

并复制到合适的目标范围。

8.matrix重塑

我们想要将一个matrix变换成一个更宽的matrix: matrix_data4 ,带有N4行和M4列( width4 ),换成matrix_data5N5 = N4 / R行和M5 = M4xR列( 宽度5 ), Rrep5 )重复(matrix未显示在图中)然后使用

 =OFFSET(matrix_data4_top_left,(ROW()-ROW(matrix_data5_top_left))*rep5+INT((COLUMN()-COLUMN(matrix_data5_top_left))/width4),MOD((COLUMN()-COLUMN(matrix_data5_top_left)),width4)) 

现在我们想把一个matrix变换成一个更窄的matrix: matrix_data4 ,其中N4行和M4列( width4 ),变成matrix_data6N6 = N4xS行, M6 = M4 / S列( width6 ), Ssplit6 )分裂(matrix未显示在图中)然后使用

 =OFFSET(matrix_data4_top_left,INT((ROW()-ROW(matrix_data6_top_left))/split6),MOD((ROW()-ROW(matrix_data6_top_left)),split6)*width4+(COLUMN()-COLUMN(matrix_data6_top_left)))