Milkのメモ帳

日々の思いつきを忘れないようにのメモ用です。

Milkのメモ帳

【VBA】Sub/Functionプロシージャの違いと使い方【Excelマクロ】


f:id:maxminkun:20170920204913p:plain

こんにちは。Milkです。
VBAを最近使うのですが、今一歩理解が出来ていないところがあったのでまとめます。

今回とりあげるのは以下の点です。

  • SubプロシージャとFunctionプロシージャの違い

になります。

2種類の関数が定義出来る

これはかなり不思議だったのですが、VBAでは2種類の関数定義が出来るようです。

それは、「Subプロシージャ」と「Functionプロシージャ」

簡単に違いを説明するとこうなります。

  • Subプロシージャ:戻り値がない
  • Functionプロシージャ:戻り値を返せる

となります。

excelvba.pc-users.net

少し細かく見ていきましょう。

Subプロシージャ

簡単なテストプログラムを書きました。

表示されない場合はこちらをどうぞ
Subプロシージャ例1 · GitHub

引数を持たない「MainSub」から動作を始めます。

Call関数で呼び出す

ここで、Call関数を使って、「TestSub」プロシージャを呼び出します。

Call Subプロシージャ名(引数, 引数)

結果は戻さない(戻り値がない)ので、処理結果はTestSubプロシージャからExcelに出力することにしました。

f:id:maxminkun:20170920211204p:plain

Call関数を利用しないで呼び出す

また、Subプロシージャの呼び出し方で、Call関数を使わない方法もあります。

その場合は、

Subプロシージャ名 引数, 引数, 引数 '引数の数に応じてカンマで区切る

となります。

これも簡単なプログラムを組みました。

結果は以下のようになります。

f:id:maxminkun:20170920212311p:plain


正しく動いていることが確認出来ますね。

Functionプロシージャ

これに対し、戻り値(計算結果を得る)を返す機能が備わっているのが、Functionプロシージャです。

表示されない場合はこちらをどうぞ
Functionプロシージャ例1 · GitHub

VBA特有なのは、戻り値の返し方です。

Functionプロシージャ名に対して、戻り値を代入します。

今回は呼び出し側で、Excelに出力指定を行いました。

f:id:maxminkun:20170920213943p:plain

戻り値を受け取る

ここで気をつけなければならない点があります。

()の形で引数を渡した場合は、必ず戻り値を受け取らなければなりません。

よって呼び出し方は以下のようになります。

変数 = Functionプロシージャ名(引数, 引数)

戻り値を受け取らずに呼び出す

また、引数を受け取らない方法もあります。

表示されない場合はこちらをどうぞ
Functionプロシージャ例2 · GitHub

この場合は、変数に代入するのではなく、SubプロシージャのCall関数を使わないパターンと同様な利用の仕方をします。

結果は以下です。

f:id:maxminkun:20170920215026p:plain


Functionプロシージャ名 引数, 引数, 引数 '引数の数に応じてカンマで区切る

さいごに

詳しくは、MSDN(Microsoftの関数利用一覧)に書かれています。

Sub プロシージャと Function プロシージャの呼び出し

どのように使い分けるかですが、やはり「戻り値を受け取るか、受け取らないか」で利用するのがスッキリすると思います。

また、Functionプロシージャだけ存在すると、マクロ実行に表示されません。

f:id:maxminkun:20170920220003p:plain


このことからも、Subプロシージャが制御のプログラム(メイン関数)として利用され、一部の機能の処理を受け持つのがFunctionプロシージャと言う位置づけなのでしょう。

VBAも利用すると、あれこれ不思議なことが出てきますね(;・∀・)

それでは、今回はこの辺で。

adios!!