是否有公式将列中的数据转换为矩阵或行? 并转换为/到其他组合?
更复杂的情况怎么样:将宽度为W的矩阵重新整形为宽度N * W?
有一些相似或相关的问题。 我已经回答了其中一些,标有*。 我不断更新此列表,因为添加了新的类似(或相同)问题:
Formatting Data: Columns to Rows *
Move content from 1 column to 3 columns *
how to split one column into two columns base on conditions in EXCEL *
writing a macro to transpose 3 columns into 1 row
Excel VBA transpose with characters
Mathematical transpose in excel
How do transform a "matrix"-table to one line for each entry in excel
Convert columns with multiple rows of data to rows with multiple columns in Excel.
How to use VBA to reshape data in excel *
Sorting three columns into six, sorted horizontally by surname using excel *
divide data in one column into more column in excel
Move data from multiple columns into single row *
有些答案似乎是可升级的"更具包容性的东西。 这可能吗?
要转换为/的样本格式为:
列
1
2
3
4
5
6
7
...
行
1 2 3 4 5 6 7 ...
矩阵(这里有4列的跨度)
1 2 3 4
5 6 7 8
...
答案 0 :(得分:20)
这个想法是在这里给出一些可能会对上面列出的问题进行微调的东西,这也可以作为未来相关问题的参考。
要使用的基本功能是INDEX
或OFFSET
。参考该图,将在明确的示例之后给出每个的优点和缺点。它显示了几个具有已定义名称的范围(在下面的斜体中)。
所有定义的名称都可以用对相应单元格的直接绝对引用来替换。
<强> 1。列到矩阵
span (在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。矩阵到列
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))
两个公式都向下复制。
INDEX
和OFFSET
之间存在相同的差异。
第3。矩阵排
由于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(...
适用于这种情况,它应该作为数组公式输入(使用 ctrl + shift + 输入)。 Nevertheles,it might be desirable to avoid array formulas。
<强> 5/6。行到列/矩阵
沿着这些方向很容易获得。 例如, col_data_top 包含
=OFFSET(row_data_left,0,ROW()-ROW(col_data_top))
并复制下来。
<强> 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))
并复制到合适的目标范围。
<强> 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))
现在我们想要将矩阵重塑为更窄的矩阵: 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)))