「excel vba msgbox ( )はいるのか」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
VBA(Visual Basic for Applications)で、メッセージボックスを表示するために使うMsgBox関数で、引数を指定する括弧が必要なのか・不要なのかを疑問に感じている方による検索です。
マクロ初心者の方が躓く、代表的なポイントの一つです。
結論からお伝えするとVBAでは、MsgBox関数に限らず他の関数でも、プロパティでもメソッドでも、引数を指定する括弧の要・不要は、全部以下のルールです。戻り値を使う場合、カッコが必要
戻り値を使わない場合、カッコは不要
戻り値を使うときはカッコが必要
具体例とともに解説します。
以下のような例は括弧が必要です。
Dim ans As VbMsgBoxResult
ans = MsgBox("実行しますか?", vbYesNo)
MsgBox関数の戻り値を変数・ansに代入するという形で使っているケースです。
括弧を書かないで、
ans = MsgBox "実行しますか?", vbYesNo
とすると構文エラーになります。
以下のような例も括弧が必要です。
If MsgBox("実行しますか?", vbYesNo) = vbNo Then Exit Sub
これは変数に代入はしていませんが、MsgBox関数の戻り値を使って条件判断を行っているケースです。
これも括弧を書かないで、
If MsgBox "実行しますか?", vbYesNo = vbNo Then Exit Sub
とすると構文エラーになります。
戻り値を使う場合は、引数を括弧で括るのがVBAの文法です。
戻り値を使わないときにカッコは不要
以下の例では括弧は不要です。
MsgBox "終了しました。", vbInformation
これはMsgBox関数の戻り値を使わないで、ただメッセージを表示している例です。
引数を括弧で括って、
MsgBox("終了しました。", vbInformation)
とすると、構文エラーとなります。
第3引数まで指定したときも同じです。
MsgBox "終了しました。", vbInformation, "Sample"
引数を括弧で括って、
MsgBox("終了しました。", vbInformation, "Sample")
とすると、やっぱり構文エラーとなります。
戻り値を使わない場合は括弧で括ってはいけないのがVBAの文法です。
カッコ問題を複雑にしている例
括弧の要・不要問題を複雑にしているのは、以下の例です。
以下のような例を見かけます。
MsgBox "終了しました。"
MsgBox ("終了しました。")
MsgBox関数の引数「終了しました。」という文字列を、括弧で括っていないコードと、括っているコードです。
このどちらのコードもエラーにはなりませんが、正しいのは、括弧で括っていない、
MsgBox "終了しました。"
のほうです。戻り値を使わないで、ただメッセージボックスを表示しているだけだからです。
玉石混交のネット上は勿論のこと、非常に困ったことに、市販されている書籍でも、
MsgBox ("終了しました。")
という、本来は書かなくてもいい括弧つきのコードが紹介されてしまっていることがあります。
何らかの意図があって、あえて本来は不要な括弧を使っている著者さんもいらっしゃるとは思いますが、であるならば、その意図とVBA本来の文法をしっかりと明記するべきでしょう。
カッコを付けてもエラーにならないのはなぜ
本来は括弧をつけなくてもいいはずなのに、
MsgBox ("終了しました。")
がエラーとならないのはどうしてなのでしょうか。
この括弧は、MsgBox関数の引数を指定するための括弧とは見なされていないからです。別の括弧だから構文エラーにならないのです。
例えば、条件分岐文の、
If 60 <= tmp And tmp < 80 Then
を、以下のように書くことができます。
If (60 <= tmp) And (tmp < 80) Then
可読性を上げるために、And演算子の前後に書かれている個々の条件を、括弧で括って書くことができます。
本来、括弧をつけなくてもいい、
MsgBox ("終了しました。")
という例で括弧がついていても構文エラーとならないのは、MsgBox関数の引数を指定するための括弧ではなく、
If (60 <= tmp) And (tmp < 80) Then
の括弧と同じ括弧とみなされているのです。
そう思って、ネットや書籍で時々みかける
MsgBox ("終了しました。")
を眺めてみると、括弧なしの
MsgBox "終了しました。"
よりも読みやすいと感じる気持ちもわからないではありません。(特に必ず括弧をつけるプログラミング言語に慣れた方の場合)
ですが、VBAの文法を正しく理解しないままで、括弧の要・不要の原則をあいまいなまま、本来不要な括弧で括る癖だけつけてしまうと、あとあと苦労します。原則を理解せずに変な癖だけつけてしまうと、オブジェクト式の文法をちゃんと理解しようとした段階では苦労することになります。
VBAでは関数でも、オブジェクトのプロパティでもメソッドでも全部以下のルールです。戻り値を使う場合、カッコが必要
戻り値を使わない場合、カッコは不要
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » MsgBox関数で括弧はいるの?いらないの?