SubとFunctionの違いとは?ポイントは戻り値?BASIC言語の変化や使い分けもプログラマーがわかりやすく解説
サブルーチンと関数の細かい違い
image by iStockphoto
ざっくりとSubとFuncitonの違いは戻り値の有無と説明しました。しかし、細かな差異は他にもあります。そこで、もう少し深掘りしましょう。例えば、昔のBASICではサブルーチンの中で処理した内容をどうやって呼び出し元に伝えたのでしょうか。
スコープってなに?変数の有効範囲
変数とは何かの値を入れるための箱のようなものです。例えば、会社や駅のロッカーを想像してみてください。自分のロッカーには自分の荷物を入れて鍵をかけることができます。ところが、昔のBASICでは変数はどこからでも参照、変更できました。つまり、ロッカーで言えば鍵がない状態。誰でも自分のロッカーを覗くことができてしまいます。
それでは困るので、現在主流のプログラミング言語では変数の有効範囲があります。鍵の有無や誰に合鍵を渡すかをコントロールできるのです。それを「スコープ」と呼びます。その中でどこからでもアクセスできるスコープが「グルーバル変数」や「大域変数」です。これなら戻り値が不要ですね。ロッカーで言えば共用ロッカーのようなものです。ただ、共用ロッカーに貴重品は置けないですね。グローバル変数も使い方に注意が必要です。
変更しても大丈夫?参照渡しと値渡し
グローバル変数を使わなくてもSubプロシージャや関数で呼び出し元とやり取りをする方法があります。そのポイントは引数。実は引数はプロシージャや関数に値を渡すだけではないのです。VBでは引数での引数の扱いを指定できます。それが値渡し(ByVal)と参照渡し(ByRef)です。何も指定しないと値渡しになります。
引数で何かの値(箱の中身)を渡すのが値渡しです。この引数をプロシージャや関数の中で変更したとしても呼び出し元には影響しません。一方、参照渡しでは値ではなくて変数そのものを渡します。つまり、箱そのものを渡すのでプロシージャや関数で内容を変更すると、その中身も変ってしまうのです。この参照渡しを使うことで、プロシージャや関数から戻り値のように結果を返すことができます。戻り値は1つしか使えませんが、引数の参照渡しではいくつでも使うことができるのです。
Excelのボタンやセルで使いたい
Excelで使うVBAではSubとFunctionに別の違いがあります。Excelではスプレッドシートにボタンなどの部品を置くことができますよね。このボタンを押すことでVBAのプログラムを呼び出すことができます。その呼び出せるものはFunctionだけ。Subプロシージャは呼び出せません。例えばボタンを押したらメッセージを表示するなどの特に結果が必要でないものでも、Functionしか使えないのです。Excelで部品からVBAを呼び出す際は注意してください。
セルの中から呼び出すことができるのもFunctionだけです。セルの中で使う場合には何かの結果が戻ってこないと意味がないですよね。だからFunctonしか使えないのです。
こちらの記事もおすすめ
3分でわかるスプレッドシートとエクセルの違い!ショートカットキーや関数・変換方法の違いなどを雑学好きライターが詳しくわかりやすく解説
結局、どちらを使うべき?
ポイントは戻り値の有無なので、戻り値が必要ならFunctionで不要ならSubという使い分けが必要です。ただ、Functionだけを使うという考え方もあります。例えば、最初は戻り値がないつもりでSubを使ったけど後から必要になってFunctionに変えるという場合も。それなら最初からFunctionを使おうという考え方もあります。
ただし、混乱してしまうのでSubとFunctionは正しく使い分けたほうがよいです。戻り値が必要かどうかを考えて使い分けるようにしましょう。
\次のページで「戻り値を返さないSubと返すFunction」を解説!/