【Excel VBA】SubプロシージャとFunctionプロシージャの呼び出し方

VBAのプロシージャの呼び出し方には、いくつかの方法があり慣れないうちは混乱します。特に引数をかっこで囲んだり、囲まなかったりするので余計に混乱します。この記事ではプロシージャの呼び出し方法を整理してマスターできるようにしたいと思います。

目次

プロシージャの呼び出し方

Subプロシージャの呼び出し方は次の2通りの方法があります。

呼び出し方説明
Subプロシージャ名 引数1, 引数2引数をかっこで囲まない。
Call Subプロシージャ名(引数1, 引数2)Callステートメントを使う。この場合はかっこで囲む。
Subプロシージャの呼び出し方

Functionプロシージャは次の3通りです。

呼び出し方説明
Functionプロシージャ名 引数1, 引数2戻り値を使用しない場合、引数をかっこで囲まない。
Call Functionプロシージャ名(引数1, 引数2)戻り値を使用しない場合はCallステートメント使って
呼び出すこともできる。引数はかっこで囲む。
Functionプロシージャ名(引数1, 引数2)戻り値を使用する場合、引数をかっこで囲む。
Functionプロシージャの呼び出し方

この後は、それぞれの呼び出し方を注意点や実例を交えながら説明します。

Subプロシージャを呼び出す

Subプロシージャを他のプロシージャから呼び出すには、プロシージャ名と必要な引数を記述します。Callステートメントは必須ではありませんが、使用する場合は引数をかっこで囲む必要があります。

プロシージャ名 引数リスト
Call プロシージャ名(引数リスト)

引数が複数ある場合はカンマ(,)で区切って指定します。

Sub main()
    addAndMsg 3, 5
End Sub

Sub addAndMsg(foo, bar)
    MsgBox foo + bar
End Sub

Functionプロシージャを呼び出す

Functionプロシージャ(関数)で戻り値を使用する場合、引数をかっこで囲んで呼び出す必要があります。

変数 = プロシージャ名(引数リスト)
Set 変数 = プロシージャ名(引数リスト)

Functionプロシージャがオブジェクトを返す場合は、オブジェクト変数に代入するためにSetステートメントが必要です。

戻り値を使用しない場合は、Subプロシージャと同じ方法で呼び出すことも出来ます。

次の例は戻り値を直接MsgBox関数の引数に渡しています。

Sub main()
    MsgBox add(3, 5)
End Sub

Function add(foo, bar)
    add = foo + bar
End Function

引数の渡し方

引数はかっこで囲んだり、囲まなかったりしますが引数のリストの指定の方法に違いはありません。代表的な渡し方を紹介します。ほとんどの場合はこれだけ知っていれば大丈夫です。

位置引数で渡す

引数のリストはカンマ(,)で区切って指定しますが、引数を渡す順序はプロシージャの定義の順序通りに渡す必要があります。引数の位置が決まっているので位置引数と呼ばれます。

例えば、MsgBox関数には1つ目の引数にメッセージ文字列、3つ目の引数としてダイアログボックスのタイトルを指定します。2つ目の引数は省略可能してますが、省略する場合でもカンマは2つ必要です。

Sub sample()
    MsgBox "マクロ実行中です。", , "インフォメーション"
End Sub

名前付き引数

引数が多数あるプロシージャで必要な引数だけ渡したい場合、名前付き引数を使うと便利です。名前付き引数を使うと必要な引数だけ、そしてプロシージャの定義とは異なる順序で引数を渡すことができます。

名前付き引数は、引数名の後ろに「:=」を記述し、その後に値を指定します。

引数名1:=値1, 引数名2:=値2, ...

前述のMsgBoxを呼び出す例を、名前引数を使って呼び出すと次のようになります。

Sub sample()
    MsgBox Prompt:="マクロ実行中です。", Title:="インフォメーション"
End Sub

まとめ

プロシージャの呼び出し方法は複数ありますが、いろいろな呼び出し方を混在させると混乱のもととなります。自分なりに首尾一貫した呼び出し方法を選択しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
目次