VisualBasic(VB)にSubとFunctionってあるよな。その違いがわかるか。どちらもよく使うものをまとめたもので似ているな。なぜSubとFunctionがあるのか、VBの元になったBASICからの変化や使い分けをプログラマでもあるライターのwoinaryと一緒に解説していきます。

ライター/woinary

某社で社内向け業務システムの開発、運用を30年近くやっていたシステム屋さん。現在はフリーランス。ガジェットやゲーム、ラノベが大好きなおっさんです。

SubとFunctionの違いは?

image by iStockphoto

VisualBasic(VB)にはSubとFunctionというものがあります。どちらも何かの動作をする命令文をまとめて名前をつけたものです。呼び出す際に引数というものを渡すことで処理をします。

この2つの違いをざっくり説明すると、呼び出し元に処理した結果を戻すかどうかです。なぜ両方あるのか、どういう違いがあるのかを説明していきます。

Sub:呼び出し元に何も返さないサブプロシージャ

Subとはサブプロシージャの略です。プログラムのまとまりのことを色々な呼び方をしますが、プロシージャと呼ぶことがあります。プログラムの中で最初に実行されるものがメインプロシージャ、そこから呼び出されるものがサブプロシージャです。サブプロシージャからさらに別のサブプロシージャを呼ぶこともあります。

このサブプロシージャを呼び出すときには情報を渡すことが可能です。それが引数。しかし、呼び出したサブプロシージャから呼び出し元に対して何かを戻すことはできません

Function:呼び出し元に結果を返す関数

FunctionもSubと似ています。しかしSubと異なり呼び出し元に結果を戻すことが可能です。これが関数。例えば2つの数字を引数として呼び出し、その計算結果を戻すことができます。この戻すものが「戻り値」です。結果を返すので「返り値」と呼ぶこともあります。

VisualBasic.NETでSubとFunctionを使った例が以下です。MySubでは引数の「5」を画面に表示します。MyFuncでは2つの引数2と8の和を戻して、メインプロシージャでそれを表示。この結果を戻すかどうかがSubとFunctionの違いです。

Module Program
   ' メインプロシージャ
   Sub Main(args As String())
      MySub(5) ' サブプロシージャMySubを呼び出し、「5」を表示

      Console.WriteLine(MyFunc(2, 8)) ' 関数MyFuncを呼び出し、2と8を足した「10」を表示
   End Sub

   ' サブプロシージャ
   Private Sub MySub(ByVal number As Integer)
      Console.WriteLine(number)
   End Sub

   ' 関数
   Private Function MyFunc(ByVal number1 As Integer, ByVal number2 As Integer) As Integer
      MyFunc = number1 + number2
   End Function
End Module

\次のページで「VBの元になったBASIC言語」を解説!/

VBの元になったBASIC言語

image by iStockphoto

Visual Basic(VB)は1991年にマイクロソフトが公開しました。しかし、それ以前からマイクロソフトはBASICというプログラミング言語を独自にカスタマイズしたMS-BASICを公開しています。また、1985年にはQuickBASICを公開しました。VBはMS-BASICやQuickBASICを元に開発した新しい言語です。

そのため、VBにはMS-BASICやQuickBASICの影響を受けている部分も多くあります。SubとFuncitonがあるのもその名残りとも言えるのです。

よく使うものをまとめたサブルーチン

MS-BASICでは関数というものはなく、VBで言うSubしかありませんでした。それがサブルーチンです。プログラムの最初に実行される部分をメインルーチン、そこから呼ばれる部分をサブルーチンと呼びました。サブルーチンからサブルーチンを呼ぶこともあります。VBのプロシージャと同じですね。

この頃はサブルーチンの名前や引数もなく、行番号を指定して実行し、終わったら元の所に戻るという仕組みです。今のSubプロシージャや関数と比べると使いにくいものでした。

BASICから生まれ変わったVisualBasic

冒頭で説明したように、1991年にMS-BASICやQuickBASICを元にVisual Basic(VB)が登場します。BASICのオリジナルは1960年代の古い言語でした。VBは今では当たり前になった構造化プログラミングだけでなく、オブジェクト指向プログラミングに近い考え方まで導入したもの。Basicという名前は残っていますが生まれ変わった新しい言語です。

また元々はWindowsのアプリケーションを作るためのものでしたが、様々な派生版が登場します。例えば、Excelなどに内蔵されているVisualBasic for Application(VBA)コマンドプロンプトで動くVB Script(VBS)などです。これらは細かい違いはありますが、プログラムの書き方は似ているので、同じように書くことができます。さらに強化されたVisual Basic.NETが最新版です。

サブルーチンと関数、ポイントは戻り値

VBになるまでの経緯や派生VBも見てきましたが、SubとFunctionの考え方はどれも同じです。BASICには元々サブルーチンというものがありました。サブルーチンは呼び出すだけで結果を返すような仕組みはありません。その名残りがSubプロシージャです。

その後、VBが登場した際、他の言語の考え方が導入されます。その1つが関数SubとFunctuionは似ていますが成り立ちが違うのです。サブルーチン由来で何も戻さないSubと、他の言語から取り入れた関数由来のFunciton。戻り値の有無がポイントになります。

他の言語ではどうなっている?

VBではSubとFunctionは似ているけど違うものだと説明してきました。それでは他のプログラミング言語ではどうなのでしょう。実はVBのように別扱いになっている言語はあまりありません

他のプログラミング言語では関数しかないものが多いです。そのような言語ではSubのような値を返さないものはどうするのでしょう。答えは「値がない」という特別なものを返すのです。それが「void(ヴォイド)」。voidとは英語で中身がないとか空っぽという意味。関数は何か返さなければいけないので「何もない」を返すというわけです。そういう意味ではVBの考え方はわかりやすいですね。

\次のページで「サブルーチンと関数の細かい違い」を解説!/

サブルーチンと関数の細かい違い

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しか使えないのです。

結局、どちらを使うべき?

ポイントは戻り値の有無なので、戻り値が必要ならFunctionで不要ならSubという使い分けが必要です。ただ、Functionだけを使うという考え方もあります。例えば、最初は戻り値がないつもりでSubを使ったけど後から必要になってFunctionに変えるという場合も。それなら最初からFunctionを使おうという考え方もあります。

ただし、混乱してしまうのでSubとFunctionは正しく使い分けたほうがよいです。戻り値が必要かどうかを考えて使い分けるようにしましょう。

\次のページで「戻り値を返さないSubと返すFunction」を解説!/

戻り値を返さないSubと返すFunction

FunctionとSubは似ていますが、戻り値の有無が使い分けのポイントです。それぞれ由来があり考え方も違います。どちらかに無理にまとめるのではなく、戻り値が必要かどうかを十分に考えて使い分けが必要です。他のプログラミング言語にはない考え方なので混乱するかもしれませんが、よく考えて使い分けるのがVB理解の第一歩になります。

" /> SubとFunctionの違いとは?ポイントは戻り値?BASIC言語の変化や使い分けもプログラマーがわかりやすく解説 – ページ 2 – Study-Z
IT・プログラミング雑学

SubとFunctionの違いとは?ポイントは戻り値?BASIC言語の変化や使い分けもプログラマーがわかりやすく解説

VBの元になったBASIC言語

image by iStockphoto

Visual Basic(VB)は1991年にマイクロソフトが公開しました。しかし、それ以前からマイクロソフトはBASICというプログラミング言語を独自にカスタマイズしたMS-BASICを公開しています。また、1985年にはQuickBASICを公開しました。VBはMS-BASICやQuickBASICを元に開発した新しい言語です。

そのため、VBにはMS-BASICやQuickBASICの影響を受けている部分も多くあります。SubとFuncitonがあるのもその名残りとも言えるのです。

よく使うものをまとめたサブルーチン

MS-BASICでは関数というものはなく、VBで言うSubしかありませんでした。それがサブルーチンです。プログラムの最初に実行される部分をメインルーチン、そこから呼ばれる部分をサブルーチンと呼びました。サブルーチンからサブルーチンを呼ぶこともあります。VBのプロシージャと同じですね。

この頃はサブルーチンの名前や引数もなく、行番号を指定して実行し、終わったら元の所に戻るという仕組みです。今のSubプロシージャや関数と比べると使いにくいものでした。

BASICから生まれ変わったVisualBasic

冒頭で説明したように、1991年にMS-BASICやQuickBASICを元にVisual Basic(VB)が登場します。BASICのオリジナルは1960年代の古い言語でした。VBは今では当たり前になった構造化プログラミングだけでなく、オブジェクト指向プログラミングに近い考え方まで導入したもの。Basicという名前は残っていますが生まれ変わった新しい言語です。

また元々はWindowsのアプリケーションを作るためのものでしたが、様々な派生版が登場します。例えば、Excelなどに内蔵されているVisualBasic for Application(VBA)コマンドプロンプトで動くVB Script(VBS)などです。これらは細かい違いはありますが、プログラムの書き方は似ているので、同じように書くことができます。さらに強化されたVisual Basic.NETが最新版です。

サブルーチンと関数、ポイントは戻り値

VBになるまでの経緯や派生VBも見てきましたが、SubとFunctionの考え方はどれも同じです。BASICには元々サブルーチンというものがありました。サブルーチンは呼び出すだけで結果を返すような仕組みはありません。その名残りがSubプロシージャです。

その後、VBが登場した際、他の言語の考え方が導入されます。その1つが関数SubとFunctuionは似ていますが成り立ちが違うのです。サブルーチン由来で何も戻さないSubと、他の言語から取り入れた関数由来のFunciton。戻り値の有無がポイントになります。

他の言語ではどうなっている?

VBではSubとFunctionは似ているけど違うものだと説明してきました。それでは他のプログラミング言語ではどうなのでしょう。実はVBのように別扱いになっている言語はあまりありません

他のプログラミング言語では関数しかないものが多いです。そのような言語ではSubのような値を返さないものはどうするのでしょう。答えは「値がない」という特別なものを返すのです。それが「void(ヴォイド)」。voidとは英語で中身がないとか空っぽという意味。関数は何か返さなければいけないので「何もない」を返すというわけです。そういう意味ではVBの考え方はわかりやすいですね。

\次のページで「サブルーチンと関数の細かい違い」を解説!/

次のページを読む
1 2 3 4
Share: