Digital_Neko

フリーランスプログラマー

参照渡しと値渡しを攻略しよう Excel-VBA

今回は、「参照渡し」、「値渡し」についてです。マクロ制作にも馴れて来ると、参照渡し、値渡しという言葉をちらほら耳にするようになると思います。まず、「参照渡し」、「値渡し」を理解するには、主記憶装置(メモリ)とアドレスの知識が多少必要になります。

主記憶装置(メモリ)は、一定の区画事に番号が割り振られています。そして、この番号を指定することで任意の場所を読み書きする事ができます。この番号のことをアドレス(または番地)と呼びます。

アドレスを頭に入れた所で、「参照渡し」を体感する「サブルーチン」と「メインプログラム」を下記に示します。

サブルーチン
Sub Kakeru(ByRef a As Integer, ByRef b As Integer, ByRef c As Integer)
c = a * b
End Sub

メインプログラム
Sub myMain()
Dim num As Integer
Call Kakeru(2, 3, num)
MsgBox num
End Sub

ここでメインプログラムから呼び出す側の引数を、「実引数」と言います。また実引数に対してサブルーチンに書かれた引数を、「仮引数」と呼びます。具体的には、サブルーチンの「a、b、c」が仮引数、メインプログラムの「2、3、num」 が実引数となります。

参照渡しでは、実引数で指定した変数の値が格納されている主記憶装置のアドレス(番地)を渡します。仮引数は、実引数と同じアドレスを参照するので、サブルーチン内で「c」の値が計算されると、メインプロブラム側の変数の値(num)が変更されます。つまり、サブルーチン内のcとメインプログラムのnumは同じアドレスを参照しているので、num(c=a*bの計算結果)は6になります。

これで、メインプログラム内でnumの値を利用する事ができます。ここで引数名は一致する必要はないですが、引数の数は一致する必要があることに注意してください。ByRefは省略可能です。

値渡しでは実引数で指定した変数の値が、コピーして渡されます。呼び出された側(サブルーチン)で、仮引数の値を変更しても、呼び出した側(メインプログラム)の変数は変化しません。またサブルーチンからメインプログラムに値を戻すこともできません。サンプルプログラムは下記となります。

サブルーチン
Sub Kakeru(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer)
c = a * b
End Sub

メインプログラム
Sub myMain()
Dim num As Integer
num = 1
Call Kakeru(2, 3, num)
MsgBox num
End Sub

メインプログラムの変数は変化しないので、結果は1と表示されます。「参照渡し」と「値渡し」を使えると、マクロ制作がさらに楽しくなります。上記が参考になれば嬉しいです。