忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】処理を繋ぐ「プロシージャ呼び出し」を攻略!

一つの大きな処理(Main)から、特定の役割を持つ別の処理(Sub)を実行することを「呼び出し」と言います。VBAでは、Callキーワードを使う方法と、省略する方法の2通りがありますが、それぞれ記述の「構造」が異なります。

1. 問題:他のSubプロシージャを呼び出す正確な記述

【 問題 】 引数 val を受け取るSubプロシージャ Update を呼び出す際、VBAの構文(フォーマット)として不適切なものはどれでしょうか?

Sub Main()
    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も正確な呼び出しによって、一つの大きな目的(業務自動化)を達成するのです。



PR

【VBAスタンダード対策】マクロの絶対終端「End Sub」の構造を攻略!

VBAのプロシージャは、Sub 名前 で始まり、必ず End Sub で終わるという一対の構造(ペア)で成立します。この「終わり」を示す記述が正確でないと、プログラムの範囲が確定できず、構造エラーとなります。

1. 問題:プロシージャを完結させる正確な記述

【 問題 】 以下のSubプロシージャにおいて、プロシージャの範囲を適切に終了させ、一つの構造として完結させるために ( A ) に入る正確な記述はどれでしょうか?

Sub Sample()
    MsgBox "処理を実行します"
( A )

① EndSub   ② Exit Sub   ③ End Sub   ④ End

2. 正解:プロシージャの終端フォーマットに関する正解

正解: ③ End Sub

3. 解説:なぜ「End Sub」という構造が必要なのか?

VBAにおいて、Sub(開始)に対応する終端は、End(キーワード)+ 半角スペース + Sub(キーワード)という特定の単語の組み合わせでなければなりません。この物理的な「閉じ」があることで、初めて一つの独立したプログラムとして認識されます。

[ End Sub の構造的絶対ルール ]
一対の原則:Sub で開始したプロシージャは、必ず End Sub で閉じなければなりません。
スペースの重要性:EndSub のようにスペースを抜かすと、コンパイラは終端として認識できず、エラーになります。
メモリの解放:この行に到達した瞬間に、そのプロシージャ内だけで使われていた変数(ローカル変数)はすべて破棄されます。

[ 他の選択肢との構造的な違い ]
Exit Sub:途中で抜ける「動作」であり、プロシージャという建物の「壁(終端)」の役割は持っていません。
End:プログラム全体を強制停止する命令であり、プロシージャを閉じるための構文ではありません。

1. ここが試験に出る!: VBAスタンダード試験では、コードの穴埋め形式でこの「End Sub」を正確に記述させることがあります。特に、Function プロシージャ(End Function)との混同や、単語間のスペースの有無は、構文の正確性を問うスタンダードレベルでは非常に重要なチェックポイントです。
2. エンジニアの視点: VBAでは明示的に「End(終わり) Sub(サブプロシージャ)」と言葉で記述します。この「出口」を明確に定義することが、予期せぬ動作を防ぎ、論理的な構造を持った「いけいけ」なマクロを作成する大前提となります。


4. まとめ

「Sub 名前」で開けたら、最後は「End Sub」で締める。この一対のフォーマットを正確に守ることが、VBAにおける「構造」の正解です。減数分裂が細胞分裂のサイクルを正しく完遂するように、VBAも End Sub という終止符によって、一つの処理を安全に終わらせ、次のステップへと確実に繋いでいくのです。