VBAで「Subプロシージャ」と「Functionプロシージャ」の違い、使い分けの説明に悩んだので、考え方のメモ。
個人的な結論として、悩んだときは全て「Functionプロシージャ」で良いになりました。
一般論としては、「Subプロシージャ」と「Functionプロシージャ」の主な違いは、次のとおりです。
「Sub」と「Function」の比較
項目 | Function | Sub |
「マクロの表示」から実行できるか (単独で実行できるか) |
× | 〇 |
戻り値があるか | 〇 | × |
ユーザー定義関数として、EXCELワークシートから使用できるか | 〇 | × |
「マクロの表示」から実行できるかというのは、Excelの画面から「マクロの表示」で、次にマクロが表示されるかどうかということ。
「Functionプロシージャ」は表示されず、実行できないのでデメリットのようにも思えます。しかし、VBAのプロシージャを分割して作成すると「表示されないことがメリット」になります。
「Private Sub」や引数付きのSubにすると、「マクロの表示」の一覧からは消えます。
これまでは、余分なプロシージャを見せたくないので、分割したプロシージャは「Private Sub」なども活用していました。
「Functionプロシージャ」にしていても、
- 「Functionプロシージャ」から「Subプロシージャ」への変更は、名前変更するだけで容易
- 「Functionプロシージャ」で戻り値がなくてもエラーにならない
です。もし「Subプロシージャ」が適切と思えるような場面になったら、その時にすればいいだけです。
「Functionプロシージャ」で、ユーザー定義関数を無駄に表示させたくないという場合は、日本語のプロシージャ名にしておけば、数式オートコンプリートで表示されることもないと思います。
(日常、プログラム開発をしない誰かに引き継ぐなら、プロシージャや変数名の日本語化は内容理解のメリットが大きいと思うので)
「Subプロシージャ」と「Functionプロシージャ」の違い、使い分けのまとめ
私は、「マクロの表示」で表示させての実行など、単独実行したい場面がない限り、「Functionプロシージャ」だけで良いという結論になりました。
もちろん、メインのプロシージャだけは、「マクロの表示」から実行したい場面が多いと思うので「Subプロシージャ」が妥当。