括弧が必要な場合


意外と理解していない人が多いようなので、これも書いておきます。次のコードで、正しいのはどちらでしょう。

Sub Sample1()
    Dim re As Long
    re = MsgBox "保存しますか?", vbYesNo
End Sub
Sub Sample2()
    Dim re As Long
    re = MsgBox("保存しますか?", vbYesNo)
End Sub

正しいのは下のSample2です。上のSample1は実行するまでもなく「re = MsgBox "保存しますか?"」の行でEnterキーを押した段階で

というエラーになります。

このように、関数やメソッドなどは、引数を括弧で囲まなければいけない場合と、囲まなくてもいい場合があります。そのルールは簡単です。返り値を使用するときは括弧をつけなければならず、返り値を使用しないケースでは括弧をつけなくてもいいんです。

上のコードは、MsgBoxで表示した[はい]ボタンと[いいえ]ボタンのうち、どちらのボタンがクリックされたかを変数reに格納しています。つまり、MsgBoxの返り値を使用しているわけです。たとえば次のようにMsgBoxの返り値を使用しない場合は、引数を括弧で囲む必要はありません。

Sub Sample1()
    MsgBox "保存しました"
End Sub

ただし、返り値を使用しない場合は、引数を括弧で囲むことも許されています。次のコードはエラーにならず正常に動作します。

Sub Sample1()
    MsgBox ("保存しました")
End Sub

ややこしいですね。こうした「括弧は必須でないけど、括弧で囲んでもいい」というルールが、この『括弧はどんなときに必要か問題』を理解しにくくしているんです。ですから、余計なことは忘れてください。次の2点だけを、しっかりと覚えてください。

  • 返り値を使用するとき → 括弧をつけなければならない
  • 返り値を使用しないとき → 括弧をつけてはならない

括弧が必要なケースと、括弧が不要なケースを、いくつかお見せします。

Sub Sample3()
    ''返り値を使用しない
    Workbooks.Open "C:\Book1.xls"
End Sub

Sub Sample4()
    ''返り値を使用する(開いたブックをオブジェクト変数に格納する)
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Book1.xls")
End Sub
Sub Sample5()
    ''返り値を使用しない
    Range("A:A").Find "tanaka"
End Sub

Sub Sample6()
    ''返り値を使用する(見つかったセルを選択する)
    Range("A:A").Find("tanaka").Activate
End Sub
Sub Sample7()
    ''返り値を使用しない
    Worksheets.Add After:=ActiveSheet
End Sub

Sub Sample8()
    ''返り値を使用する(挿入したワークシートの名前を変更する)
    Worksheets.Add(After:=ActiveSheet).Name = "tanaka"
End Sub

Sample5は、実際には意味がありませんけど、まぁそれはそれとして。