VBAのプロシージャの呼び出しは、一貫性がなくて慣れないうちは混乱するでしょう。特に引数をかっこで囲んだり、囲まなかったりするので余計に混乱します。か囲まないかこの記事では呼び出し方法を整理してマスターできるようにしたいと思います。
初めにSubプロシージャ呼び出し方を次に一覧します。
呼び出し方 | 説明 |
---|---|
Subプロシージャ名 引数1, 引数2 | 引数をかっこで囲まない。 |
Call Subプロシージャ名(引数1, 引数2) | Callステートメントを使う場合はかっこで囲む。 |
Functionプロシージャは次の通りです。
呼び出し方 | 説明 |
---|---|
Functionプロシージャ名 引数1, 引数2 | 戻り値を使用しない場合は、引数をかっこで囲まない。 |
Call Functionプロシージャ名(引数1, 引数2) | 戻り値を使用しない場合は、Callステートメント使って 呼び出すこともできる。引数はかっこで囲む。 |
Functionプロシージャ名(引数1, 引数2) | 戻り値を使用する場合は、引数をかっこで囲む。 |
この後は、それぞれの呼び出し方を注意点や実例を交えながら説明します。
Subプロシージャを呼び出す
Subプロシージャを別のプロシージャから呼び出すには、プロシージャ名と必要な引数を記述します。Callステートメントは必須ではありませんが、使用する場合は引数をかっこで囲む必要があります。
プロシージャ名 引数リスト
Call プロシージャ名(引数リスト)
引数が複数ある場合はカンマ(,)で区切って指定します。
Sub main()
addAndMsg 3, 5
End Sub
Sub addAndMsg(foo, bar)
MsgBox foo + bar
End Sub
Functionプロシージャを呼び出す
Functionプロシージャ(関数)で戻り値を使用する場合、引数をかっこで囲んで呼び出す必要があります。
変数 = プロシージャ名(引数リスト)
Set 変数 = プロシージャ名(引数リスト)
戻り値が使用しない場合は、Subプロシージャと同じ方法で呼び出すことも出来ます。
次の例は戻り値を直接MsgBox関数の引数に渡しています。
Sub main()
MsgBox add(3, 5)
End Sub
Function add(foo, bar)
add = foo + bar
End Function
引数の渡し方
引数はかっこで囲んだり、囲まなかったりしますが引数のリストの指定の方法に違いはありません。ここでは引数リストの仕方を解説します。
SubプロシージャやFunctionプロシージャに渡す引数のリストは、カンマ(,)で区切って指定します。引数を渡す順序は定義の順序通りに渡す必要があります。
例えば、MsgBox関数には1つ目の引数にメッセージ文字列、3つ目の引数としてダイアログボックスのタイトルを指定できます。2つ目の引数は省略可能ですが、省略した場合でもカンマは2つ必要です。
Sub sample()
MsgBox "マクロ実行中です。", , "インフォメーション"
End Sub
名前付き引数
名前付き引数を使うと、必要な引数だけ、そして定義とは異なる順序でも引数を渡すことができます。名前付き引数は引数名との後ろに「:=」を記述し、その後に値を指定します。
引数名1:=値1, 引数名2:=値2, ...
前述のMsgBoxを呼び出す例を、名前引数を使って呼び出すと次のようになります。
Sub sample()
MsgBox Prompt:="マクロ実行中です。", Title:="インフォメーション"
End Sub
このように必要な引数だけを渡して呼び出すことが出来ます。
まとめ
プロシージャの呼び出し方法は複数ありますが、いろいろな呼び出し方を混在させると混乱のもととなります。自分なりに首尾一貫した呼び出し方法を選択しましょう。