VBA(Visual Basic for Applications)はMicrosoft Officeに搭載されている言語(DSL?)である.
VBAの情報源として,VBA言語リファレンスとVBA Language Specificationという文書がある.
ここではCall文(Call Statement)の書式について解説します.
以下の定義が同じモジュールにあるものとします.
Sub test0()
End Sub
Sub test1(a)
End Sub
Sub test2(a, b)
End Sub
次の12通りの呼び出しが有効であるかどうかを考えてみます.
test0
test0()
Call test0
Call test0()
test1 1
test1(1)
Call test1 1
Call test1(1)
test2 1, 2
test2(1, 2)
Call test2 1, 2
Call test2(1, 2)
この内の4.はVBEでは入力できない.イミディエイトを使うと入力でき,実行もできることがわかる.
各パターン解説
言語リファレンスのCallステートメントの説明によると,次のようにわかる.
Callキーワードを省略したら()を付けてはいけない.
1と5と9はCallキーワードと()がないので,実行できる.
2と10はコンパイルエラー.
意外なことに,6は実行できる.
Callキーワードがある場合は()が必要
4は入力できないので,8と12は実行できる.
3 7 11は全てコンパイルエラーになる.
6はなぜ大丈夫なのか?
test1(1)
引数が1つのため,第1引数の式が(1)
と解釈されているようです.
Language Specificationよりわかること
call-statement = "Call" (simple-name-expression / member-access-expression / index-expression / with-expression)
call-statement =/ (simple-name-expression / member-access-expression / with-expression) argument-list
5.4.2.1 Call Statement
Callをつけた場合はindex-expressionが使えることになっています.index-expressionでは()に引数を記入します.
一方,Callをつけない場合はargument-listを使って引数を指定しています.