VBA カッコはどういうときに付けるの?
こんにちは。
派犬事務員のコロ子です。
実は今ノンプロ研のVBA初級講座でティーチングアシスタント(TA)をしている。前回、中級講座のTAでもテンパったけど、初級講座でも受講生からの鋭い質問にテンパっている。
先日はカッコの付け方についての質問があった。
メッセージボックスで MsgBox "派犬", vbOKOnly ←実行できる MsgBox ("派犬",vbOKOnly) ←エラーになる どうしてカッコを付けるとエラーになるのですか?
うわ~(汗)めちゃめちゃいい質問。
なんとなく雰囲気で戻り値を受ければいいのは分かる。
でも、どうしてカッコが要らないのかは答えに詰まる。
似たようなので
Workbooks.Open
これもいつもカッコが要るのか要らないのかあやふやで、エラーが出たらカッコを取る、みないなことをしている。
長年なんとなく放置した問題についに向かい合う時がきた。
Office TANAKAのサイトでは下記のようなルールだといっている。
返り値を何かに使うときは、引数を括弧で囲まなければなりません。
返り値を何かに使わないときは、引数を括弧で囲ってはいけません。これが、VBAにおける括弧のルールです。
なるほどー。ルールなのかー。
でも、何でもカッコをつければ戻り値が戻るとは思えない。
いったいどんなときにカッコをつければいいのだろう。
オブジェクトブラウザを見てみる
VBEエディタでF2キーを押すとライブラリ一覧が表示される。
MsgBoxを検索して下のを見てみると説明が書いてある。
Functionとなっている。MsgBoxはFunctionプロシージャなのだ。
Functionプロシージャなので当然、戻り値がある。
他のプロシージャを呼び出すには
Callは他のSubプロシージャーやFunctionプロシージャーを呼び出すことができる。
ただし、Callを使ってFunctionプロシージャーを呼び出す場合は戻り値は破棄される。
ということはCallは呼び出すだけで戻り値はない。
Callを使って他のプロシージャを呼び出すには、引数をカッコで囲む。
Call プロシージャ名(引数1, 引数2,…)
Call は省略できる。その場合はカッコを外す。
プロシージャ名 引数1, 引数2,…
ということで、戻り値がない他のプロシージャを呼び出す書き方は上記の2通り。
MsgBoxはFunctionプロシージャだけど、vbOKOnlyなどボタンが1つで、あえて戻り値が必要ない場合は上記のどちらかの方法で呼び出す。
Callを付けるか、カッコを外すか。たまーにCallがついているのを見かけるけど、カッコを外すのが一般的なんだろう。
Call MsgBox("派犬", vbOKOnly) MsgBox "派犬", vbOKOnly
ちなみに
Workbooks.OpenのOpenもFunction
Application.RunのRunもFunction
UnloadはSub
Collectionオブジェクト.AddのAddはSub