配列のコピーはコピー先が動的配列であれば代入が可能
配列には2種類あります。配列の要素数を事前に指定する静的配列と、処理中に要素数が変わる動的配列です。
コピー先の配列が静的配列か動的配列かでコピーの仕方は異なります。
コピー先が静的配列の場合は各要素をループで設定しなければなりません。
コピー先が動的配列の場合は各要素をループで設定できますが、代入による設定も可能です。
なお、VBAの場合は値渡しでのコピーになります。参照渡しではありません。関数でByRefの参照渡しにしていても代入時には値渡しで設定されます。
注意点
先にも書きましたが、配列のコピーを代入で行う場合、コピー先の配列はar()のように要素数を設定しない動的配列にしなければなりません。
私が実際にコードを書く場合は動的配列での代入を行うことがほとんどです。理由はラクだからです。
よほどの場合でない限り、コピー先を静的配列にしなければならないことはないと思いますので、通常は動的配列を利用して代入でのコピーで問題ないと思います。
数値配列の代入コピー
Variant型のar1という要素数が4の静的配列とar2という動的配列を用意し、ar1の各要素に数値または文字列が設定されたあとでar2に代入でコピーしてその内容をイミディエイトウインドウに出力しています。
Variant型のため暗黙の型変換を行っているためエラーは発生せず正常に処理されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub ListCopy() Dim ar1(3) Dim ar2() Dim i ar1(0) = 0 ar1(1) = 1 ar1(2) = "2" ar1(3) = "3" '// 配列の代入 ar2 = ar1 For i = 0 To UBound(ar2) Debug.Print ar2(i) Next End Sub |
実行結果
0
1
2
3
Object型変数やユーザー定義型配列の代入コピー
Object型の変数をコピーする場合も代入で行います。
ここではセルを示すオブジェクト型であるRangeクラスオブジェクトを利用しています。コードには書いていませんがユーザー定義型の配列もオブジェクト変数と同様の書き方が可能です。
オブジェクト型のため各要素にセットする場合はSetステートメントが必要ですが、先のコードと同様に配列のコピーは代入で行います。
ミスしやすいのは代入の部分ではなく、オブジェクト型へのコピーのSetの付け忘れの方が多いかもしれませんね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub ListCopyObject() Dim ar1(3) As Range Dim ar2() As Range Dim i Set ar1(0) = Range("A1") Set ar1(1) = Range("A2") Set ar1(2) = Range("A3") Set ar1(3) = Range("A4") '// 配列の代入 ar2 = ar1 For i = 0 To UBound(ar2) Debug.Print ar2(i).Address(False, False) Next End Sub |
実行結果
A1
A2
A3
A4
静的配列のコピー(ループでの各要素のコピー)
コピー先を要素数を指定している静的配列にする場合は代入でのコピーが出来ません。
そのためループによる設定を行うことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub StaticListCopy() Dim ar1(3) Dim ar2(3) Dim i ar1(0) = 0 ar1(1) = 1 ar1(2) = "2" ar1(3) = "3" '// 配列のコピーを要素ごとに行う For i = 0 To UBound(ar1) ar2(i) = ar1(i) Next For i = 0 To UBound(ar2) Debug.Print "[" & ar2(i) & "]" Next End Sub |
実行結果
0
1
2
3