ByValキーワードの使い方と注意点

VBAにおける関数やサブルーチンの引数は、デフォルトでByRef(参照渡し)となっています。
つまり、引数に渡された変数のメモリアドレスを直接参照するため、サブルーチン内で引数の値を変更すると、元の変数の値も変更されます。

一方で、ByValキーワードを使用することで、引数を値渡しすることができます。
つまり、引数に渡された変数のコピーが作成され、サブルーチン内で引数の値を変更しても、元の変数の値は変更されません。

ByValキーワードの使い方

ByValキーワードを使用するには、関数やサブルーチンの引数の前に「ByVal」を指定します。例えば、以下のサブルーチンでは、引数をByValで渡しています。

このサブルーチンでは、引数に渡されたメッセージをメッセージボックスに表示するだけであり、引数の値を変更することはありません。
そのため、引数をByValで渡すことが適切です。

ByValキーワードの注意点

ByValキーワードを使用する場合でも、参照型の引数を渡す場合は注意が必要です。
参照型の引数をByValで渡すと、引数に渡された変数のコピーが作成されるため、元の変数の値は変更されません。
しかし、コピーされた変数自体は、引数に渡された変数と同じメモリアドレスを参照しているため、サブルーチン内でコピーされた変数の値を変更すると、元の変数の値も変更される可能性があります。

また、ByValキーワードを使用すると、引数の値を変更することができなくなるため、サブルーチン内で引数の値を変更する必要がある場合は、ByRefキーワードを使用する必要があります。

まとめ

VBAのByValキーワードは、関数やサブルーチンで引数を値渡しするために使用されます。ByValを使用すること

で、引数に渡された変数の値を変更することができなくなるため、引数の値を変更したくない場合や、引数が参照型であっても値渡ししたい場合に適しています。
ただし、参照型の引数を渡す場合は、注意が必要です。

ByRefとByValの使い分けは、引数の値を変更する必要がある場合はByRefを、変更しない場合はByValを使用するということが基本です。
ただし、参照型の引数を渡す場合は、引数の値を変更しない場合でもByRefを使用する必要がある場合があります。

サンプルコード

このサンプルコードでは、まずnum1に10、num2に20を代入します。
次に、AddNumbersByValサブルーチンを呼び出し、num1とnum2をByValで渡します。

AddNumbersByValサブルーチンでは、num1にnum2を加算するだけであり、num2を2倍するという処理も行います。
num1はByValで渡されているため、サブルーチン内でnum1を変更しても、元の変数の値は変わりません。
一方、num2はByValで渡されていないため、サブルーチン内でnum2を変更すると、元の変数の値も変更されます。

最後に、TestByValサブルーチン内でnum1とnum2の値を表示します。
この結果、num1は10のままであり、num2は40になっていることが確認できます。

コメント

  1. RUNA より:

    引数が、二つとも「ByVal」で渡しているようですが?