Excel:用于在列/行/矩阵之间转换数据的公式

san*_*ica 10 excel transpose matrix excel-formula

是否有公式将列中的数据转换为矩阵或行?并转换为/到其他组合?

更复杂的情况呢:将宽度为W的矩阵重新整形为宽度N*W?

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

格式化数据:列到行 *

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

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

编写宏来将3列转换为1行

Excel VBA转置字符

excel中的数学转置

如何将excel中每个条目的"矩阵"表格转换为一行

将包含多行数据的列转换为Excel中具有多列的行.

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

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

将一列中的数据划分为excel中的更多列

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

一些答案似乎可以"升级"到更具包容性的东西.那可能吗?

要转换为/的样本格式为:

1
2
3
4
5
6
7
...
Run Code Online (Sandbox Code Playgroud)

1   2   3   4   5   6   7   ...
Run Code Online (Sandbox Code Playgroud)

矩阵(这里有4列的范围)

1   2   3   4
5   6   7   8
...
Run Code Online (Sandbox Code Playgroud)

san*_*ica 20

我们的想法是在这里给出一些可能与上面列出的问题进行微调的东西,这些东西也可以作为未来相关问题的参考.

要使用的基本功能是INDEXOFFSET.参考该图,将在明确的示例之后给出每个的优点和缺点.它显示了几个带有定义名称的范围(下面以斜体显示).所有定义的名称都可以通过对相应单元格的直接绝对引用来替换.

在此输入图像描述

1.列到矩阵

跨度(在C1)给出的列数.然后matrix_data_top_left(此处为D1)包含

=INDEX(col_data,(ROW()-ROW(matrix_data_top_left))*span+(COLUMN()-COLUMN(matrix_data_top_left)+1),1)
Run Code Online (Sandbox Code Playgroud)

然后将其复制到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)
Run Code Online (Sandbox Code Playgroud)

并类似地复制到matrix_data2中.请注意,复制到I5也会返回0,而不是错误.

OFFSET具有仅需要一个单元用作基准引用(col_data_top)的优点,因此使用更多数据扩展源数据范围不需要重新定义公式中的源数据范围,只需复制粘贴到扩展中目标范围.另一方面,扩展源数据范围INDEX需要首先在公式中更新它(如果明确使用则更改范围),然后复制粘贴到扩展目标范围.使用定义的名称对于此目的更为通用,因为重新定义col_data就足够了(并且可以在扩展目标范围之后完成).由于这个相同的属性,INDEX提供了一种对源范围的自动边界检查,OFFSET但没有.

2.矩阵到列

col_data2_top包含

=INDEX(matrix_data2,INT((ROW()-ROW(col_data2_top))/span)+1,MOD(ROW()-ROW(col_data2_top),span)+1)
Run Code Online (Sandbox Code Playgroud)

col_data3_top

=OFFSET(matrix_data2_top_left,INT((ROW()-ROW(col_data3_top))/span),MOD(ROW()-ROW(col_data3_top),span))
Run Code Online (Sandbox Code Playgroud)

两个公式都向下复制.存在INDEXOFFSET存在相同的差异.

矩阵排

由于OFFSET没有给出错误,剩下的公式将使用它.INDEX沿着上面显示的线路进行调整很容易. row_data_left包含

=OFFSET(matrix_data_top_left,INT((COLUMN()-COLUMN(row_data_left))/span),MOD(COLUMN()-COLUMN(row_data_left),span))
Run Code Online (Sandbox Code Playgroud)

然后复制到右边.

4.列到行

row_data2_left包含

=OFFSET(col_data_top,COLUMN()-COLUMN(row_data2_left),0)
Run Code Online (Sandbox Code Playgroud)

再次复制到右边.

PS:该公式=TRANSPOSE(...适用于这种情况,它应该作为数组公式输入(带ctrl+ shift+ enter).Nevertheles,可能需要避免数组公式.

5/6.行到列/矩阵

沿着这些方向很容易获得.例如,col_data_top包含

=OFFSET(row_data_left,0,ROW()-ROW(col_data_top))
Run Code Online (Sandbox Code Playgroud)

并复制下来.

7.矩阵转置

为了获得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))
Run Code Online (Sandbox Code Playgroud)

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

8.矩阵重塑

我们想要将矩阵重新整形为更宽的矩阵: matrix_data4,N4行和M4列(width4),进入 matrix_data5,其中N5 = N4/R行,M5 = M4xR列(width5),R(rep5)数量为重复(矩阵未在图中显示)然后使用

=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))
Run Code Online (Sandbox Code Playgroud)

现在我们要将矩阵重新整形为一个较窄的矩阵: matrix_data4,N4行和M4列(width4),进入 matrix_data6,其中N6 = N4xS行,M6 = M4/S列(width6),其中S(split6)为数字分裂(矩阵未在图中显示)然后使用

=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)))
Run Code Online (Sandbox Code Playgroud)