派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

VBA カッコはどういうときに付けるの?

こんにちは。
派犬事務員のコロ子です。

f:id:SNegishi:20210622222607p:plain
梅雨ですね

実は今ノンプロ研のVBA初級講座でティーチングアシスタント(TA)をしている。前回、中級講座のTAでもテンパったけど、初級講座でも受講生からの鋭い質問にテンパっている。

先日はカッコの付け方についての質問があった。

メッセージボックスで
MsgBox "派犬", vbOKOnly ←実行できる
MsgBox ("派犬",vbOKOnly) ←エラーになる
どうしてカッコを付けるとエラーになるのですか?

うわ~(汗)めちゃめちゃいい質問。

なんとなく雰囲気で戻り値を受ければいいのは分かる。
でも、どうしてカッコが要らないのかは答えに詰まる。
似たようなので
Workbooks.Open
これもいつもカッコが要るのか要らないのかあやふやで、エラーが出たらカッコを取る、みないなことをしている。
長年なんとなく放置した問題についに向かい合う時がきた。

Office TANAKAのサイトでは下記のようなルールだといっている。

返り値を何かに使うときは、引数を括弧で囲まなければなりません。
返り値を何かに使わないときは、引数を括弧で囲ってはいけません。これが、VBAにおける括弧のルールです。

なるほどー。ルールなのかー。
でも、何でもカッコをつければ戻り値が戻るとは思えない。
いったいどんなときにカッコをつければいいのだろう。

オブジェクトブラウザを見てみる

VBEエディタでF2キーを押すとライブラリ一覧が表示される。
f:id:SNegishi:20210624223505p:plain
MsgBoxを検索して下のを見てみると説明が書いてある。
f:id:SNegishi:20210624223722p:plain
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