トップページ

#14_2 引数付きサブルーチン


引数付きサブルーチンの特徴

前回学んだサブルーチンは、引数を与えないで動作する関数でした。一方で、マクロの途中で何かの入力(引数)を与え、その入力に応じた出力(戻り値)を利用したいというケースが多々有ります。

例として、次のマクロをみてください。

「実引数」と「仮引数」

サブルーチンに対して引数を渡したい時には、次のようにCallステートメントを用いて記述します。

Call サブルーチン名(引数1, 引数2)

ここで、サブルーチンに引き渡す変数を「実引数」と呼ぶので合わせて覚えておきましょう。

一方で、呼び出されたサブルーチンは、以下に示すように親マクロから受け取った引数はサブルーチン名横のカッコで囲んで受け取ります。

Sub サブルーチン名(引数1 As データ型, 引数2 As データ型)

ここで、サブルーチンが受け取る変数を「仮引数」と呼びます。この「仮引数」と「実引数」は同じ名称を使わないのが鉄則ですが、引数の数とデータ型は揃える必要があります。

マクロを呼び出すルール

さて、EXCEL VBAでは同じブック内であれば、たとえ異なるモジュール間であっても自由にマクロを呼び出すことができます。

また、Privateキーワードを使うことで異なるモジュールからマクロを呼び出せないようにすることもできます。すでにこのPrivateキーワードはイベントマクロで見たことがあると思いますが、要するに他のモジュールのマクロから呼び出されないようにする宣言だったのです。

Privateキーワードをつけたマクロはシート上の「フォームコントロール」のボタンや、図形オブジェクトには登録できません。

Callを使わないとどうなるか

実は、サブルーチンを呼び出す際にはCallステートメントを必ずしも使う必要はありません。次のような形でもサブルーチンに引数を渡して実行することができます。

サブルーチン名 引数1, 引数2

しかし、このような記述がマクロの中にあると、VBAのキーワードなのかサブルーチンなのかが判別しづらい場合が多いです。さらに間違えて次のように記述したとしましょう。

サブルーチン名(引数1, 引数2)

この場合でもエラーは出ないのですが、引数の渡し方が通常の「参照渡し」ではなく「値渡し」になってしまいます。

この2つの渡し方の違いは次の章で詳しく解説します。