VBAオジサンのらくがき帳

#11 プロシージャのパラメータについての補足

2021-03-13 00:00:00

パラメータについて補足説明をします。プログラミングになれていない方にはややこしく感じるかもしれませんので、こんな機能があるのかというくらいでの認識でも構わないです。

ByRefとByVal

Sub ByRefTest(ByRef i as Integer)
  i = i + 1
End Sub

Sub ByValTest(ByVal i as Integer)
  i = i + 1
End Sub

変数iが1だとして下の関数呼び出しをすると、呼び出した後iの値は2に変わります。

ByRefTest i

同じように変数iが1だとして下の関数呼び出しをすると、呼び出した後iの値は変わらず1です。

ByValTest i

VBAのデフォルトではパラメータの定義はByRefとなっています。ByRefで定義されている関数、サブプロシージャに渡す変数の値をへんこうされたくない場合は、下のように引数を()で囲むとByValと同じように渡すことができます。

ByRefTest (i)

Optional(省略可能なパラメータ)

下のようにパラメータを定義することにより、引数を渡さずにプロシージャの呼び出しができます。引数を渡さなかったときにはここに指定した値が使われます

Sub OptionalTest(Optional i As Integer = 1)

名前による引数渡し

Optionalパラメータを複数もつプロシージャに対して、一部の引数だけ指定するには、カンマをつかった位置による方法と、引数に名前を指定して渡す方法が可能です。例えば下のようにパラメータが設定されていた場合。

Sub ParamNameTest(Optional param1 As Integer = 1, _
        Optional param2 As Integer = 1, Optional param3 As Integer = 1)

下の2行はどちらも同じ結果となります。

ParamNameTest 0, , 0
ParamNameTest param1:=0, param3:=0

私は順番による指定を使うことが多いですが、どちらを使ってもよいというケースがほとんどだと思います。たくさんの引数の中で指定する必要があるものが少ない場合には名前による引数渡しが有効かもしれません。マクロの記憶で生成されるコードでは、名前付きの引数が使われることが多いので、場合によっては生成されたコードを順番による指定に書き換えた方が読みやすくなるケースがあります。