Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を値渡しするには

配列を値渡しするには

VBAで他のプロシージャを呼ぶときに、配列は絶対にByVal(値渡し)にはできないと思い込んでいる方もいらっしゃるようです。

配列は基本的にはByRef(参照渡し)でしか定義できませんけれど、Variantを使えば値渡しすることも(一応)可能です。

[スポンサードリンク]

配列を値渡しにするサンプルマクロ

以下のように、呼ばれるほうのプロシージャの仮引数をVariantで定義してやれば、配列を値渡しできます。

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


Private Sub 値渡しでヨバレル(ByVal ARY As Variant)
 Dim i As Long

 Stop
 For i = LBound(ARY) To UBound(ARY)
  ARY(i) = ARY(i) * 100
 Next i
 Stop
End Sub

サンプルマクロの実行結果

Subプロシージャ「配列を引数にしてヨブ」を実行すると、For~Nextループを抜けた直後のStopステートメントで一時停止します。

このときにローカルウィンドウで配列arrを確認すると、下図のような状態であることがわかります。

ローカルウィンドウ・arr-1

配列arrの中身を確認したら、ショートカット[F5]で再度実行します。
Subプロシージャ「値渡しでヨバレル」が呼ばれ、For~Nextループに入る前のStopステートメントで一時停止します。ここで配列ARYを確認すると、下図のとおり、先のarrと同じであることがわかります。

ローカルウィンドウ・ARY-1

再度[F5]で実行すると、For~Nextループ後のStopステートメントで一時停止しますから、ARYを確認すると、下図のようにそれぞれ100倍されていることがわかります。

ローカルウィンドウ・ARY-2

もう一度[F5]で実行するとSubプロシージャ「配列を引数にしてヨブ」に戻り、Callステートメント後のStopで一時停止します。

このときの配列arrは下図のとおり、Subプロシージャ「値渡しでヨバレル」を呼ぶ前と同じままです。

ローカルウィンドウ・arr-2

もし参照渡しが行われていたならば、Subプロシージャ「値渡しでヨバレル」のARYと同じ値になっているはずですが、そうはなっていません。

大きな配列を値渡しにする場合は、どれくらいのメモリを積んだパソコンで、そのプロシージャを実行するのかを確認しておかないと怖いと感じますが、上述程度の配列ならば問題ないでしょう。

配列の参照渡しを確認する

そもそも配列が参照渡しになるということをご存知ない方は、以下のようなSubプロシージャを作ってみてください。

Private Sub 参照渡しでヨバレル(ByRef ARY() As Long)
 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プロシージャ「配列を引数にしてヨブ」を、

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())
 Call 参照渡しでヨバレル(arr())

 Stop
End Sub

のように変更して実行すると、arrの中身がARYと同じになることも確認しておきましょう。

最終更新日時:2019-04-29 11:24

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を値渡しするには

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.