配列の行列入れ替えについて、知識が曖昧なまま使っていた。
確認してみよう。
ワークシートでは、コピーしたものの行と列を入れ替えて貼り付けが出来る。
これをマクロの記録で見てみると、こうだ。
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始まりに
では、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始まりに
最後に、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回目 一次元配列に。二次元配列には戻らない。
インデックスが1始まりに矯正されることについては、使用状況によって良し悪しあるかも。
(個人的には、この方が都合の良い場面が多い気がします)。
参考まで。