VBAコード解説

【エクセルVBA初心者講座】引数について|別のプロシージャへの引数の受け渡し

引数の受け渡し

今回はVBAで用いる引数(ひきすう)について説明します。

VBAでは引数を様々な場面で使用することがありますが、今回は「プロシージャが受け取る引数」に焦点を当てていきたいと思います。

プロシージャの基礎や、プロシージャの呼び出しについては以下の記事をぜひ参考にしてみてください。

関連記事
プロシージャとcallステートメント
【エクセルVBA初心者講座】別のプロシージャを呼び出すCallステートメント

続きを見る

それでは早速引数について見ていきましょう!

プロシージャの引数とは

プロシージャから別のプロシージャを呼び出すときには、呼び出し先のプロシージャにデータを渡すことができます。

この呼び出し先のプロシージャに渡すデータのことを引数と呼びます。

引数の指定方法

プロシージャが引数を受け取る際の構文は以下の通りです。

Sunプロシージャ、Functionプロシージャどちらにしても、プロシージャ名の後ろに受け取る引数名を括弧で指定します。

  • Sub プロシージャ名 (引数)
  • Function プロシージャ名 (引数)

また、引数として受け取る値のデータ型を指定することも可能です。

以下のSubプロシージャでは整数型の引数Aを受け取り、Functionプロシージャでは文字列型の引数Bを受け取ります。

  • Sub プロシージャ名 (A as Integer)
  • Function プロシージャ名 (B as String)

プロシージャへの引数の受け渡しの例

別のプロシージャに引数を渡す際の例を紹介します。

Sub Test1()
    Call Test2("こんにちは")
End Sub

Sub Test2(A As String)
    MsgBox A
End Sub

上記のVBAの記述ではSubプロシージャ「Test1」からSubプロシージャ「Test2」を呼び出します。

その際にTest2は文字数型の引数Aを受け取ります。

同時に、Test1はTest2の引数に文字列「こんにちは」を渡します。

Test2は、受け取った引数Aに「こんにちは」が入り、処理が実行された結果以下のメッセージボックスが表示されます。

VBAの実行結果
実行結果

引数を指定しなかった場合

先程のプロシージャTest1で引数を指定しなかった場合の実行結果を見てみましょう。

Sub Test1()
    Call Test2()
End Sub

Sub Test2(A As String)
    MsgBox A
End Sub

この場合の実行結果はエラーになります

なぜなら、呼び出し先のプロシージャは必ず一つの引数を受け取らなければいけないからです。

呼び出し元のTest1が引数を指定しないでTest2を呼び出したり、定義した引数の型とは異なるタイプの引数を渡した場合には、マクロがエラーになるので注意しましょう。

VBAの実行結果
実行結果がエラーの場合

参照渡しと値渡し

変数の引数の渡し方には参照渡し値渡しと呼ばれる方法があります。

「こんにちは」という文字列や「10」というような数値を直接呼び出し先のプロシージャに渡すのではなく、変数自体を引数に渡すときには少し方法を考える必要があります。

それぞれどのような方法なのか見ていきましょう!

参照渡し

参照渡しは変数そのものを呼び出し先のプロシージャに渡す方法です。

それでは例を用いてみていきましょう。

以下の例では呼び出し元のプロシージャTest3で変数Aに「20」を代入し、その変数Aを呼び出し先のTest4の引数に渡しています。

そしてTest4では受け取った引数×10をしています。

Sub Test3()
    Dim A As Long
    A = 20
    Call Test4(A)
    MsgBox A
End Sub

Sub Test4(B As Long)

    B = B * 10

End Sub

このVBAの実行結果はこのようになります。

変数Aが10倍された「200」がMsgBoxで表示されます。

VBAの実行結果
Test3の実行結果

このように変数そのものが引数として渡される方法が参照渡しです。

値渡し

値渡しは変数の値だけを呼び出し先のプロシージャに渡す方法です。

それでは例を用いてみていきましょう。

以下は先程の参照渡しの例と同様の構文ですが、Test4の引数の定義にByvalというワードを追加しています。

Sub Test3()
    Dim A As Long
    A = 20
    Call Test4(A)
    MsgBox A
End Sub

Sub Test4(Byval B As Long)

    B = B * 10

End Sub

このVBAの実行結果は以下のようになります。

参照渡しの時とは異なり、もとの変数A「20」がMsgBoxで表示されます。

これはTest4には変数の値だけを渡したため、Test4で受け取った数値を変更したとしてもそれはTest4の中だけの話で、Test3の変数Aには影響がないためです。

VBAの実行結果
Test3の実行結果

このように引数に値だけを渡す方法が参照渡しです。

参照渡しと値渡しの違い

結局違いは何なの?

参照渡しではTest4の引数の定義が「B as long」、値渡しでは「Byval B as long」となっています。

Byvalの意味は引数として受け取る変数は値渡しで受け取るという意味です。

参照渡しの例のコードでは引数の定義に何も指定されていませんが、引数を参照渡しで受け取る場合はByRefとつけるのが基本ルールとなっています。

※ByRefとByValのどちらも指定しない場合は、「参照渡し」になります。

Sub Test3()
    Dim A As Long
    A = 20
    Call Test4(A)
    MsgBox A
End Sub

Sub Test4(ByRef B As Long)
    B = B * 10
End Sub
VBAの実行結果
Test3の実行結果

引数を使わない方法

モジュールレベル変数を利用することで、複数のプロシージャ間で値を共有することも可能です。

この場合、引数を使用する必要はありません。

モジュールレベル変数のついては以下の記事を参考にしてみてください。

関連記事
変数の有効範囲と有効期間
【エクセルVBA初心者講座】変数の利用方法|モジュールレベル変数とパブリック変数とは

続きを見る

引数の受け渡しのおさらい

観察する人

「参照渡し」と「値渡し」は名前だけ聞くと難しそうですが、考え方はシンプルです。

  • 引数を変えると変数も変わるものが参照渡し(ByRef:省略可能)
  • 引数を変えても変数は変わらないのが値渡し(ByVal:省略不可)

それぞれ使い方によって結果が異なりますので、ケースバイケースでうまく使い分けることを意識していきましょう!

関連記事
本の階段を登る男性
【エクセル マクロ/VBA】初心者が独学勉強するための本|おすすめ2冊を紹介

続きを見る

-VBAコード解説