行列反転(Transpose)
Excel VBAで「行と列を入れ替えたい(転置したい)」ときに便利なのが Transpose(転置)処理 です。初心者向けに、コード例とテンプレートをかみ砕いて説明します。
基本の考え方
- WorksheetFunction.Transpose を使うと、配列やRangeを簡単に転置できる。
- 用途:
- 行列を入れ替える(例:縦のリストを横に並べる)。
- 配列を転置して別の処理に使う。
- 注意点:
Transposeは最大 65,536 要素までしか扱えない。- 二次元配列を転置すると「行数と列数が入れ替わる」。
テンプレ1:Rangeを転置して別の場所に貼り付け
Sub Transpose_Range()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim src As Range: Set src = ws.Range("A1:A5") ' 縦のリスト
Dim dst As Range: Set dst = ws.Range("C1") ' 横に出力開始セル
dst.Resize(1, src.Rows.Count).Value = WorksheetFunction.Transpose(src.Value)
End Sub
VB- ポイント: 縦のリスト(A1:A5)を横方向(C1:G1)に転置。
テンプレ2:二次元配列を転置
Sub Transpose_Array()
Dim arr As Variant
arr = Range("A1:C3").Value ' 3行×3列の二次元配列
Dim arrT As Variant
arrT = WorksheetFunction.Transpose(arr)
' 転置結果をシートに書き戻す
Range("E1").Resize(UBound(arrT, 1), UBound(arrT, 2)).Value = arrT
End Sub
VB- ポイント: 3×3の配列を転置すると「行と列が入れ替わる」。
テンプレ3:一次元配列を転置して横→縦に変換
Sub Transpose_1DArray()
Dim arr As Variant
arr = Array("りんご", "みかん", "バナナ")
' 横配列を縦に
Dim arrT As Variant
arrT = WorksheetFunction.Transpose(arr)
' 縦方向に出力
Range("A1").Resize(UBound(arrT, 1), 1).Value = arrT
End Sub
VB- ポイント: 一次元配列を転置すると「縦配列」になる。
テンプレ4:行列反転を自作(大規模対応)
Function MyTranspose(arr As Variant) As Variant
Dim r As Long, c As Long
Dim arrT() As Variant
ReDim arrT(1 To UBound(arr, 2), 1 To UBound(arr, 1))
For r = 1 To UBound(arr, 1)
For c = 1 To UBound(arr, 2)
arrT(c, r) = arr(r, c)
Next c
Next r
MyTranspose = arrT
End Function
Sub Example_MyTranspose()
Dim v As Variant
v = Range("A1:C5").Value
Dim vT As Variant
vT = MyTranspose(v)
Range("E1").Resize(UBound(vT, 1), UBound(vT, 2)).Value = vT
End Sub
VB- ポイント:
WorksheetFunction.Transposeの制限を超える場合は自作関数で対応可能。
例題で練習
'例1:縦リストを横に転置
Sub Example1()
Transpose_Range
End Sub
'例2:二次元配列を転置
Sub Example2()
Transpose_Array
End Sub
'例3:一次元配列を縦に転置
Sub Example3()
Transpose_1DArray
End Sub
'例4:大規模配列を自作関数で転置
Sub Example4()
Example_MyTranspose
End Sub
VB初心者向けポイント
- Transposeは便利: Rangeや配列を簡単に行列反転できる。
- 制限に注意: 65,536要素までしか扱えない。大規模は自作関数で。
- 一次元配列も転置可能: 横→縦、縦→横に変換できる。
- 出力はResizeで調整: 転置後のサイズに合わせて書き戻す。
