VBAで他のプロシージャを呼ぶときに、配列は絶対にByVal(値渡し)にはできないと思い込んでいる方もいらっしゃるようです。
配列は基本的にはByRef(参照渡し)でしか定義できませんけれど、Variantを使えば値渡しすることも(一応)可能です。
配列を値渡しにするサンプルマクロ
以下のように、呼ばれるほうのプロシージャの仮引数をVariantで定義してやれば、配列を値渡しできます。
Dim arr(1 To 3) As Long
Dim i As Long
For i = LBound(arr) To UBound(arr)
arr(i) = i * 5
Next i
Stop
Call 値渡しでヨバレル(arr())
Stop
End Sub
Private Sub 値渡しでヨバレル(ByVal ARY As Variant)
Dim i As Long
For i = LBound(ARY) To UBound(ARY)
ARY(i) = ARY(i) * 100
Next i
Stop
End Sub
サンプルマクロの実行結果
Subプロシージャ「配列を引数にしてヨブ」を実行すると、For~Nextループを抜けた直後のStopステートメントで一時停止します。
このときにローカルウィンドウで配列arrを確認すると、下図のような状態であることがわかります。
配列arrの中身を確認したら、ショートカット[F5]で再度実行します。
Subプロシージャ「値渡しでヨバレル」が呼ばれ、For~Nextループに入る前のStopステートメントで一時停止します。ここで配列ARYを確認すると、下図のとおり、先のarrと同じであることがわかります。
再度[F5]で実行すると、For~Nextループ後のStopステートメントで一時停止しますから、ARYを確認すると、下図のようにそれぞれ100倍されていることがわかります。
もう一度[F5]で実行するとSubプロシージャ「配列を引数にしてヨブ」に戻り、Callステートメント後のStopで一時停止します。
このときの配列arrは下図のとおり、Subプロシージャ「値渡しでヨバレル」を呼ぶ前と同じままです。
もし参照渡しが行われていたならば、Subプロシージャ「値渡しでヨバレル」のARYと同じ値になっているはずですが、そうはなっていません。
大きな配列を値渡しにする場合は、どれくらいのメモリを積んだパソコンで、そのプロシージャを実行するのかを確認しておかないと怖いと感じますが、上述程度の配列ならば問題ないでしょう。
配列の参照渡しを確認する
そもそも配列が参照渡しになるということをご存知ない方は、以下のようなSubプロシージャを作ってみてください。
Dim i As Long Stop
For i = LBound(ARY) To UBound(ARY)
ARY(i) = ARY(i) * 100
Next i
Stop
End Sub
上記のSubプロシージャで、仮引数ARYの「ByRef」を「ByVal」にした場合、いきなり構文エラーが発生して、配列は基本的には値渡しにできないことを確認しましょう。
またSubプロシージャ「配列を引数にしてヨブ」を、
Dim arr(1 To 3) As Long
Dim i As Long
For i = LBound(arr) To UBound(arr)
arr(i) = i * 5
Next i
Stop
Call 参照渡しでヨバレル(arr())
Stop
End Sub
のように変更して実行すると、arrの中身がARYと同じになることも確認しておきましょう。
最終更新日時:2019-04-29 11:24
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を値渡しするには