web-dev-qa-db-ja.com

Excel:列/行/行列間でデータを変換するための数式

列のデータを行列または行に変換する数式はありますか?そして、他の組み合わせから/に変換するには?

さらに複雑なケースについてはどうでしょう。幅Wのマトリックスを幅N * Wに再形成しますか?

類似または関連する質問がいくつかあります。 *のマークが付いたもののいくつかに回答しました。類似の(または同等の)新しい質問が追加されると、このリストを更新し続けます。

データのフォーマット:列から行へ *

コンテンツを1列から3列に移動 *

Excelの条件に基づいて1つの列を2つの列に分割する方法 *

列を1行に転置するマクロを書く

文字を含むExcel VBA転置

Excelでの数学的転置

「マトリックス」テーブルをExcelのエントリごとに1行に変換する方法

Excelでデータの複数の行を持つ列を複数の列を持つ行に変換します。

VBAを使用してExcelでデータを再構成する方法 *

列を6列に並べ替え、Excelを使用して姓で水平にソート *

1つの列のデータをExcelの複数の列に分割する

データを複数の列から単一の行に移動する *

いくつかの答えは、より包括的なものに「アップグレード可能」であるように見えます。それは可能ですか?

変換元/変換先のサンプル形式は次のとおりです。

カラム

1
2
3
4
5
6
7
...

1   2   3   4   5   6   7   ...

マトリックス(ここでは4列のスパン)

1   2   3   4
5   6   7   8
...
10
sancho.s

ここでのアイデアは、上記の質問への小さな適応で使用される可能性のあるものをここに与えることです。これは、将来の関連する質問の参照としても役立つ可能性があります。

使用する必須の関数はINDEXまたはOFFSETです。各図の長所と短所は、図を参照して、明示的な例の後に示されます。定義された名前を持ついくつかの範囲を示します(以下のitalics)。定義された名前はすべて、対応するセルへの直接的な絶対参照に置き換えることができます。

enter image description here

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には、ベース参照として使用されるセルが1つだけで済むという利点があります(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))

両方の式は下方にコピーされます。 INDEXOFFSETにも同じ違いがあります。

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+enter)。 Nevertheles、 配列式を避けることが望ましいかもしれません

5/6。行/列/マトリックス

これらの線に沿って入手することは非常に簡単です。例えば。、 col_data_top 含む

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

コピーします。

7。行列の転置

入る matrix_data3 (図には示されていません)の転置 matrix_data2、使用する必要があるのは1つだけです matrix_data3_top_left、式で

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

適切なターゲット範囲にコピーされます。

8。マトリックスの変形

マトリックスをより広いものに再形成したい: matrix_data4N4行とM4列(width4)、に matrix_data5N5=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_data4N4行とM4列(width4)、に matrix_data6N6=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)))
20
sancho.s