VBAで取得している配列をTranspose関数で行列を入れ替えて、
セル範囲へ一括貼り付けをよく使います。
配列からの一括転記にすると処理がかなり高速化されます。
しかしこのTranspose関数を使えば良いのか使わなくていいのか、
2回使わないといけないのかで迷ってしまいます。
迷うというか理解していないので、実際にマクロを走らせて結果を見て
使用回数を決定するというダメっぷり。
ということで今回は配列の並び方の種類について調べてみました。
配列の種類
大きく分けると次の3種類に別れます。
・一次元配列:var(0)
・多次元配列:var(0,0)
・多段階配列(ジャグ配列):var(0)(0)
名前の後ろのvar~はVBEのローカルウィンドウで配列がどのように記載されているかを示しています。
Transposeの使用で悩むのは「多次元配列」と「多段階配列(ジャグ配列)」の区別がついていなかったからなんですね。
配列の状態が多次元配列の状態の時にセルへの一括転記が可能です。
一次元配列
列が1列しかない配列。
特に指定をしない場合にはこの配列になります。
列が1列しかない場合でもVBEで確認したときにvar(0,0)となっている場合は
後述する多次元配列になっています。
var = range("A1:A4").valueというように一括でVariant型変数に取り込むと
1列でも多次元配列になります。
以下のようなデータを次のマクロで配列に取り込んでみました。
Sub ArrayTest1()
Dim Var(3) As Variant
Dim myRng As Range
Dim n As Long
For Each myRng In Range("A1:A4")
Var(n) = myRng.Value
n = n + 1
Next
End Sub
この時の配列をVBEで見るとこの様になっています。
イメージとしてはこんな感じでしょうか。
多次元配列
同じように以下のデータを次のマクロで配列に取り込んでみました。
Sub ArrayTest2()
Dim Var As Variant
Var = Range("A1:B4").Value
End Sub
VBEで見るとこの様になっています。
基本的に配列の添字は0から始まるが、
セル範囲を一括でVariant型変数へ取り込むと、添字の最小値が1になるようです。
※配列にTranspose関数を使用しても、添字の開始が1からに変更されます。
この多次元配列の場合のみセル範囲へ一括転記が可能です。
イメージはこんな感じでしょうか
多段階配列(ジャグ配列)
多次元配列と似ていますが、配列の中に配列を取り込んでいるものを多段階配列(ジャグ配列)といいます。
多次元配列の時と同じ例のデータを次は以下のマクロで配列に取り込みます。
Sub ArrayTest3()
Dim Var(3) As Variant
Dim myRng As Range
Dim n As Long
For Each myRng In Range("A1:A4")
Var(n) = Array(myRng.Value, myRng.Offset(, 1).Value)
n = n + 1
Next
End Sub
VBEで確認すると以下のようになっています。
配列の種類の項で説明しましたが、多次元配列ではvar(0,0)となっていた要素が
多段階配列ではvar(0)(0)となっています。
この状態ではセル範囲への一括転記は正しく行われません。
この例では配列の中の配列の要素数が全て同じになっていますが、異なる要素数を設定することも出来ます。
イメージはこんな感じでしょうか。
まとめ
一口に配列と言っても色々な状態の配列があることがわかりました。
状態の違いを正しく認識することで上手に配列を扱えるようになるのではないでしょうか。
次回は配列の行列並び替えについて調べてみたいと思います。
おまけ
一次元配列のイメージを表すのによく、横向きに箱を並べる図が出てくるんだけど、
二次元配列のイメージを表す際には、一次元目の向きが縦になってるんだよな。
Excelのイメージと合わせるなら一次元配列のイメージも縦方向ではなかろうかと、
今回悶々としている間に思った次第。