【VBAスタンダード対策】処理を繋ぐ「プロシージャ呼び出し」を攻略!
一つの大きな処理(Main)から、特定の役割を持つ別の処理(Sub)を実行することを「呼び出し」と言います。VBAでは、Callキーワードを使う方法と、省略する方法の2通りがありますが、それぞれ記述の「構造」が異なります。
1. 問題:他のSubプロシージャを呼び出す正確な記述
【 問題 】 引数 val を受け取るSubプロシージャ Update を呼び出す際、VBAの構文(フォーマット)として不適切なものはどれでしょうか?
Dim val As Integer : val = 100
' --- ここで Update を呼び出す ---
End Sub
Sub Update(n As Integer)
MsgBox n
End Sub
① Call Update(val)
② Update val
③ Call Update val
④ Update(val) (※引数が1つの場合、動作はするが非推奨の構造)
2. 正解:呼び出しの構造(Callとカッコの有無)に関する正解
正解: ③ Call Update val
3. 解説:呼び出しによって「制御」が移る構造
VBAでは、別のSubを呼ぶ際に「Callを使うならカッコで囲む」「Callを使わないならスペースで繋ぐ」という鉄則があります。どちらの方法でも正しく呼び出せますが、記述を混ぜることはできません。
Mainプロシージャ Updateプロシージャ
+-------------------+ +-------------------+
| Sub Main() | | Sub Update(n) |
| [処理1] | | |
| Call Update(v) --|---(呼出)---> [引数nの処理] |
| [処理2] <--------|---(復帰)--- End Sub |
| End Sub | +-------------------+
+-------------------+
[ 2通りの正しいフォーマット ]
★ パターA(Callあり):Call Update(val)
★ パターB(Callなし):Update val
※ Callを使うと「今から別のSubを呼び出す」という意図が明確になり、構造が分かりやすくなります。
1. ここが試験に出る!: 試験では「Callを書かずにカッコを付ける」という誤用が狙われます。特に引数が2つ以上ある場合(例:Call Calc(a, b))において、Callを抜いて Calc(a, b) と書くと構文エラーになります。この「連動性」を正確に把握しましょう。
2. エンジニアの視点: Java 17などモダンな言語では常にカッコが必要ですが、VBAは「文(Statement)」として呼び出す形式を継承しています。大規模な開発では、後から見た人が「どこで外部Subへ飛んでいるか」を一目で判断できるよう、Callを明示的に付ける構造が推奨されることが多いです。
4. まとめ
「Callを使うならカッコ、使わないならスペース」。この呼び出し構造をマスターすることで、複雑に絡み合うマクロの動きを正確に制御できるようになります。減数分裂において情報がリレーされるように、VBAも正確な呼び出しによって、一つの大きな目的(業務自動化)を達成するのです。