【VBAスタンダード対策】SubとFunction:役割と呼び出し方の構造を攻略!
SubとFunctionは、どちらも処理をまとめる箱ですが、その「出口(出力)」の構造が決定的に異なります。どのような場面でどちらを選択すべきか、実務的な判断力を確認しましょう。
1. 問題:SubとFunctionの使い分けと構造的制約
【 問題 】 SubプロシージャとFunctionプロシージャの「使い方の違い」に関する記述として、VBAの構造上正しいものはどれでしょうか?
① Subはセル内の数式から直接呼び出して計算結果を返せるが、Functionは呼び出せない。
② Functionは呼び出し元に値を返せるが、Subは呼び出し元に値を返すことができない。
③ どちらも Call キーワードを使って呼び出す際、必ず戻り値を受け取る変数を用意しなければならない。
④ Functionプロシージャ内では、セルの値や書式を変更するなどの「動作」を記述することは一切禁止されている。
2. 正解:プロシージャの運用構造に関する正解
正解: ② Functionは呼び出し元に値を返せるが、Subは呼び出し元に値を返すことができない。
3. 解説:出口(戻り値)があるかないか、それが構造の差
Sub(サブルーチン)は「一連の動作を完遂すること」が目的であり、Function(関数)は「計算した結果を報告すること」が主な目的です。この目的の違いが、呼び出し方の構造に現れます。
■ Subプロシージャ:アクション型
・呼び出し方:Call DoAction または DoAction
・主な役割:転記、書式変更、印刷、ファイル保存など(動き中心)。
■ Functionプロシージャ:データ型
・呼び出し方:ans = GetValue()(変数への代入が基本構造)
・主な役割:複雑な計算、判定(True/False)、文字列加工など(結果中心)。
[ 選択肢の構造的ミス ]
★ ①の誤り:セルから呼び出せる(ユーザー定義関数)のは「値を返す」構造を持つFunctionだけです。
★ ④の誤り:VBAから呼び出す場合は動作可能ですが、セルから呼び出す「ユーザー定義関数」として使う場合に限り、他のセルの値を変更するなどの動作に制約がかかります。
1. ここが試験に出る!: スタンダード試験では「Subは値を返さない」という基本に加え、Functionを呼び出す際に ans = MyFunc() のように戻り値を受け取る構造が正しく書けているかが問われます。また、FunctionをSubのように Call で呼ぶことも可能ですが、その場合は戻り値が捨てられるという特殊な挙動も理解しておく必要があります。
2. エンジニアの視点: Java 17の void メソッドと、戻り値を持つメソッドの使い分けと同じですね。実務では「サイドエフェクト(状態変化)を起こすならSub」「純粋に計算だけして値を返すならFunction」と構造を分離して設計するのが、理系NEOな保守性の高いコードへの近道です。
4. まとめ
「動きを命じるSub、答えを求めるFunction」。この構造的役割の違いを理解することで、マクロの設計は劇的に整理されます。減数分裂が単なる分割ではなく「次世代へ繋ぐ情報の選別(Function的役割)」を伴うように、VBAも適切なプロシージャの選択によって、正確なデータのリレーを実現するのです。