LWP | 転置と回転はどこが違うか
転置と回転はどこが違うか
TakiLibで、表の配置と配列の次元を見比べる
ストーリー
「この表、縦向きに並べ直したいんだ」。シャケもんの相談に、アユさんが「行と列を交換したいのですか?」と問い返します。形を変えるだけなら同じに見えても、値の並びは同じとは限りません。
アユさんが位置の変わり方を整理し、シャケもんがTakiLibの使い方につなぐ説明用の物語です。図1〜4は、行・列とも添字の下限が1の二次元配列を使います。
1 縦向きにしたい。それは転置?

図1|転置では、元の行が列になり、元の列が行になる。
2 90度回転は、並びが違う

図2|同じ形の配列でも、A〜Fの位置を追うと違いが分かる。
3 180度では、両方が反転

図3|回転数の符号と、値の移動先をセットで見る。
4 左90度の後、上下を入れ替える

図4|この2行3列の例では、左90度回転と上下反転で転置と同じ配置になる。
5 一列の転置は、次元にも注意

図5|値が横に並ぶことと、二次元配列で返ることは別。
まとめ
転置は行と列の交換、回転は向きを変える操作です。欲しい形だけでなく、値の順序まで確認して使い分けます。TakiLibではarrTransposeとarrRotateを使えますが、一行・一列を扱うときは戻り値の次元にも注意が必要です。
今回の仕掛け
arrRotateの回転数1は反時計回り90度、2は180度、-1は時計回り90度です。a_vflipは回転後の上下反転、a_hflipは左右反転を指定します。図では文字自体を回さず、配列要素の位置だけを移しています。
arrTransposeは、通常の複数行・複数列の表ではarrRotateと上下反転を組み合わせます。一行・一列などでは別の分岐を通るため、全入力で同じ内部処理とは限りません。
a_wsf_compatibleの既定値はTrueです。転置結果が横一行の場合、互換モードでは一次元へ変換されます。Falseを指定すると、その一次元化を行わず二次元の結果を受け取れます。以下のサンプルでは、二次元のまま扱う意図を明示してFalseを指定します。
今回のソースコードのサンプル
サンプルコード TakiLibの転置と左90度回転を比べる
01 |
|
|---|---|
02 |
|
03 |
|
04 |
|
05 |
|
06 |
|
07 |
|
08 |
|
09 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
### 関数とコードの説明
arrTransposeが転置後の配列、arrRotateが指定回数の回転後の配列を返します。x_transposedとx_rotatedで受け取り、行ごとに「転置 | 左90度回転」の順で表示します。元配列の内容を書き換える例ではありません。
入力・準備
TakiLib Ver 3.5.4を導入したWindows版Excelのブックを使います。同じVBAプロジェクトの別の標準モジュールへ全文を貼り付け、Test_Mainを実行します。TakiLib本体と依存処理が必要です。結果はVBEのイミディエイトウィンドウへ表示され、シートには書き込みません。
結果
原ソースの位置計算から予測される出力は、1行目がAD | CF、2行目がBE | BE、3行目がCF | ADです。中央の行は同じでも、最初と最後の行が違います。今回はこのサンプルをExcelで実行していません。
読むポイント
同じx_inputを二つの関数に渡し、結果を比較しています。回転数を2や-1へ変えると配列の形・配置も変わるため、出力側の行数・列数も合わせて変更してください。特に180度回転は2行3列になり、この3行固定の表示ループをそのまま使えません。
出典メモ
TakiLib Ver 3.5.4、taki3libUTF8.basのarrRotateとarrTranspose。2026年9月12日に関数本体・引数・位置計算を照合しました。図1〜4とサンプルの結果はソース読解による説明です。
元資料TK-024「転置と回転はどこが違うか」。2026年9月9日のWindows版Excel 16.0 Build 20326.0で、2行1列の数値配列について、既定の転置が一次元、False指定が二次元で値20を保持する限定確認が記録されています。図5はその記録と原ソースに基づきます。
この説明は通常の値を持つ配列が対象です。オブジェクト要素や、任意の添字下限・空配列を含む全条件で同じ扱いになるとは限りません。
Copyright © 2026 LWP 山中 一弘
本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。
