配列の行列入れ替え(Transpose関数)

配列の行列入れ替えについて、知識が曖昧なまま使っていた。
確認してみよう。
f:id:Infoment:20200810225439p:plain

ワークシートでは、コピーしたものの行と列を入れ替えて貼り付けが出来る。

f:id:Infoment:20200810230110g:plain

これをマクロの記録で見てみると、こうだ。

Sub Macro1()
    Selection.Copy
    Range("D2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
End Sub

この中で重要なのは、この部分。これが、行列を入れ替えさせている。

Transpose:=True

では、一次元の配列をマクロでひっくり返す場合はどうか。今回は、
二回ひっくり返してみる。

Sub Test()
    ' 元の配列。
    ' indexがどう変化するかを確認するため、
    ' 敢えてインデックスを3~4としている。
    Dim arr1(3 To 4) As Variant
        arr1(3) = 1
        arr1(4) = 2
    
    ' ひっくり返し、一回目。
    Dim arr2 As Variant
        arr2 = WorksheetFunction.Transpose(arr1)
    
    ' ひっくり返し、二回目。
    Dim arr3 As Variant
        arr3 = WorksheetFunction.Transpose(arr2)
End Sub

すると、以下のことが分かった。

  • 1回目 2行1列の二次元配列に変換
  • 2回目 再び一次元配列に。ただし、インデックスが1始まりに

f:id:Infoment:20200810231707p:plain

では、2行1列の二次元配列を二回ひっくり返したらどうか。

Sub Test2()
    ' 元の配列。
    ' indexがどう変化するかを確認するため、
    ' 今回も中途半端なところからインデックスを開始。
    Dim arr1(3 To 4, 2 To 2) As Variant
        arr1(3, 2) = 1
        arr1(4, 2) = 2
    
    ' ひっくり返し、一回目。
    Dim arr2 As Variant
        arr2 = WorksheetFunction.Transpose(arr1)
    
    ' ひっくり返し、二回目。
    Dim arr3 As Variant
        arr3 = WorksheetFunction.Transpose(arr2)
End Sub

結果は、以下のとおり。

  • 1回目 インデックスが1始まりの一次元配列に
  • 2回目 再び二次元配列に。ただし、インデックスが1始まりに

f:id:Infoment:20200810231634p:plain

最後に、1行2列の二次元配列ではどうか。

Sub Test3()
    ' 元の配列。
    Dim arr1(3 To 3, 2 To 3) As Variant
        arr1(3, 2) = 1
        arr1(3, 3) = 2
    
    ' ひっくり返し、一回目。
    Dim arr2 As Variant
        arr2 = WorksheetFunction.Transpose(arr1)
    
    ' ひっくり返し、二回目。
    Dim arr3 As Variant
        arr3 = WorksheetFunction.Transpose(arr2)
End Sub

結果は、以下のとおり。

  • 1回目 2行1列の二次元配列に
  • 2回目 一次元配列に。二次元配列には戻らない。

f:id:Infoment:20200810232407p:plain

インデックスが1始まりに矯正されることについては、使用状況によって良し悪しあるかも。
(個人的には、この方が都合の良い場面が多い気がします)。

参考まで。