意外と理解していない人が多いようなので、これも書いておきます。次のコードで、正しいのはどちらでしょう。
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は、実際には意味がありませんけど、まぁそれはそれとして。