#14_2 引数付きサブルーチン
引数付きサブルーチンの特徴
前回学んだサブルーチンは、引数を与えないで動作する関数でした。一方で、マクロの途中で何かの入力(引数)を与え、その入力に応じた出力(戻り値)を利用したいというケースが多々有ります。
例として、次のマクロをみてください。
「実引数」と「仮引数」
サブルーチンに対して引数を渡したい時には、次のようにCallステートメントを用いて記述します。
Call サブルーチン名(引数1, 引数2)
ここで、サブルーチンに引き渡す変数を「実引数」と呼ぶので合わせて覚えておきましょう。
一方で、呼び出されたサブルーチンは、以下に示すように親マクロから受け取った引数はサブルーチン名横のカッコで囲んで受け取ります。
Sub サブルーチン名(引数1 As データ型, 引数2 As データ型)
ここで、サブルーチンが受け取る変数を「仮引数」と呼びます。この「仮引数」と「実引数」は同じ名称を使わないのが鉄則ですが、引数の数とデータ型は揃える必要があります。
マクロを呼び出すルール
さて、EXCEL VBAでは同じブック内であれば、たとえ異なるモジュール間であっても自由にマクロを呼び出すことができます。
また、Privateキーワードを使うことで異なるモジュールからマクロを呼び出せないようにすることもできます。すでにこのPrivateキーワードはイベントマクロで見たことがあると思いますが、要するに他のモジュールのマクロから呼び出されないようにする宣言だったのです。
Privateキーワードをつけたマクロはシート上の「フォームコントロール」のボタンや、図形オブジェクトには登録できません。
Callを使わないとどうなるか
実は、サブルーチンを呼び出す際にはCallステートメントを必ずしも使う必要はありません。次のような形でもサブルーチンに引数を渡して実行することができます。
サブルーチン名 引数1, 引数2
しかし、このような記述がマクロの中にあると、VBAのキーワードなのかサブルーチンなのかが判別しづらい場合が多いです。さらに間違えて次のように記述したとしましょう。
サブルーチン名(引数1, 引数2)
この場合でもエラーは出ないのですが、引数の渡し方が通常の「参照渡し」ではなく「値渡し」になってしまいます。
この2つの渡し方の違いは次の章で詳しく解説します。