配列のコピーはコピー先が動的配列であれば代入が可能

配列には2種類あります。配列の要素数を事前に指定する静的配列と、処理中に要素数が変わる動的配列です。

コピー先の配列が静的配列か動的配列かでコピーの仕方は異なります。

コピー先が静的配列の場合は各要素をループで設定しなければなりません。

コピー先が動的配列の場合は各要素をループで設定できますが、代入による設定も可能です。

なお、VBAの場合は値渡しでのコピーになります。参照渡しではありません。関数でByRefの参照渡しにしていても代入時には値渡しで設定されます。


注意点

先にも書きましたが、配列のコピーを代入で行う場合、コピー先の配列はar()のように要素数を設定しない動的配列にしなければなりません。

私が実際にコードを書く場合は動的配列での代入を行うことがほとんどです。理由はラクだからです。

よほどの場合でない限り、コピー先を静的配列にしなければならないことはないと思いますので、通常は動的配列を利用して代入でのコピーで問題ないと思います。


数値配列の代入コピー

Variant型のar1という要素数が4の静的配列とar2という動的配列を用意し、ar1の各要素に数値または文字列が設定されたあとでar2に代入でコピーしてその内容をイミディエイトウインドウに出力しています。

Variant型のため暗黙の型変換を行っているためエラーは発生せず正常に処理されます。

実行結果
0
1
2
3


Object型変数やユーザー定義型配列の代入コピー

Object型の変数をコピーする場合も代入で行います。

ここではセルを示すオブジェクト型であるRangeクラスオブジェクトを利用しています。コードには書いていませんがユーザー定義型の配列もオブジェクト変数と同様の書き方が可能です。

オブジェクト型のため各要素にセットする場合はSetステートメントが必要ですが、先のコードと同様に配列のコピーは代入で行います。

ミスしやすいのは代入の部分ではなく、オブジェクト型へのコピーのSetの付け忘れの方が多いかもしれませんね。

実行結果
A1
A2
A3
A4


静的配列のコピー(ループでの各要素のコピー)

コピー先を要素数を指定している静的配列にする場合は代入でのコピーが出来ません。

そのためループによる設定を行うことになります。

実行結果
0
1
2
3