関数を呼び出すときに括弧は必要?不要?

ネットで探したコードを見ると呼び出している関数の引数に括弧が付いていたり付いてなかったりします。どう書くのが正解でしょう?

結論から書きますが、関数を呼び出す場合は必ず括弧は付けるようにした方がいいでしょう。

その理由は、関数呼び出しの書き方が全て統一され、構文エラーに悩まされずに済むことと、括弧を付けておけばCallステートメントもしくは戻り値の代入での関数呼び出しの2種類を覚えるだけで全てに対応できるからです。

このサイトで紹介しているサンプルコードも全ての関数呼び出しで括弧を付けています。

括弧を付ける場合には2種類を覚えておけばいいので、それらを以下で具体的に説明します。

戻り値を取らない場合は、Call 関数(引数) で書く

戻り値を取らない場合はCallステートメントを使うようにします。

Call 関数(引数)
Call 関数
    ‘// 引数がない場合は括弧が付けられない

関数がSubステートメントとFunctionステートメントのどちらの場合も書き方は同じで、「Call+関数+括弧」の形になります。ただし、関数に引数がない場合は括弧を引数なしで「Call TestProc()」と書いても自動的に消去され「Call TestProc」のように括弧がなくなります。

Callステートメントを使う場合は関数の引数部分に括弧を付けないと構文エラーになります。言い方を変えると、Callステートメントで構文エラーになるのは括弧がない場合のため、「あ、括弧書き忘れた」とすぐに気がつくという利点があります。

繰り返しになりますが、「Call+関数+括弧」と覚えるだけです。

戻り値を取る場合は、変数 = 関数(引数) で書く

戻り値を取る場合は代入を使います。これは関数がFunctionで定義されてある場合に限ります。

変数 = 関数(引数)
Set 変数 = 関数(引数)    ‘// 戻り値がオブジェクト変数の場合はSet+変数で受け取る

MsgBox関数はあまり使われませんが一応戻り値があります。その戻り値を取得する場合は以下のように変数で受け取ります。

この場合も関数の引数には括弧を指定します。

関数を呼び出すときに括弧のありなしパターン

上で書いた通り、関数の呼び出しでは括弧を付けた方がよい、と書いていますが、では実際にコードを書いた場合の書き方のパターンはいくつあるかというと、戻り値ありなし×カッコありなしの4パターンになります。

ただ、実際にコードを書く場合は関数の引数がなかったり1つだけだったり複数だったりと条件が変わります。

以下に8種類の書き方でMsgBox関数を呼び出していますが、5番目と6番目は構文エラーになるためコメントアウトしています。他は正常に動作します。

上のコードのNo.2は括弧は付いていますがCallステートメントがありません。でも正常に動作します。しかし、同様のCallステートメントがなく括弧があるNo.5はエラーになります。条件は同じように見えますが、結果は異なります。

No.2とNo.5を抜粋します。

これは関数の引数の括弧として解釈しているかいないかの差です。

No.2の括弧は文字列の “カッコあり” を括弧で囲っただけで関数の引数としての括弧の意味ではないため、エラーになりません。以下のように括弧を多重化しても同様にエラーになりません。このことからも関数の引数の括弧ではないことが分かります。

しかしこれはかなりプログラミングに慣れていないと分かりにくいです。そのような細かい話や経験に頼るようなコードを書くよりも、「必ず括弧を付ける」と決めておいた方が悩まずに済みます。