こんにちは。Milkです。
VBAを最近使うのですが、今一歩理解が出来ていないところがあったのでまとめます。
今回とりあげるのは以下の点です。
- SubプロシージャとFunctionプロシージャの違い
になります。
2種類の関数が定義出来る
これはかなり不思議だったのですが、VBAでは2種類の関数定義が出来るようです。
それは、「Subプロシージャ」と「Functionプロシージャ」
簡単に違いを説明するとこうなります。
- Subプロシージャ:戻り値がない
- Functionプロシージャ:戻り値を返せる
となります。
少し細かく見ていきましょう。
Subプロシージャ
簡単なテストプログラムを書きました。
表示されない場合はこちらをどうぞ
Subプロシージャ例1 · GitHub
引数を持たない「MainSub」から動作を始めます。
Call関数で呼び出す
ここで、Call関数を使って、「TestSub」プロシージャを呼び出します。
Call Subプロシージャ名(引数, 引数)
結果は戻さない(戻り値がない)ので、処理結果はTestSubプロシージャからExcelに出力することにしました。
Call関数を利用しないで呼び出す
また、Subプロシージャの呼び出し方で、Call関数を使わない方法もあります。
その場合は、
Subプロシージャ名 引数, 引数, 引数 '引数の数に応じてカンマで区切る
となります。
これも簡単なプログラムを組みました。
結果は以下のようになります。
正しく動いていることが確認出来ますね。
Functionプロシージャ
これに対し、戻り値(計算結果を得る)を返す機能が備わっているのが、Functionプロシージャです。
表示されない場合はこちらをどうぞ
Functionプロシージャ例1 · GitHub
VBA特有なのは、戻り値の返し方です。
Functionプロシージャ名に対して、戻り値を代入します。
今回は呼び出し側で、Excelに出力指定を行いました。
戻り値を受け取る
ここで気をつけなければならない点があります。
()の形で引数を渡した場合は、必ず戻り値を受け取らなければなりません。
よって呼び出し方は以下のようになります。
変数 = Functionプロシージャ名(引数, 引数)
戻り値を受け取らずに呼び出す
また、引数を受け取らない方法もあります。
表示されない場合はこちらをどうぞ
Functionプロシージャ例2 · GitHub
この場合は、変数に代入するのではなく、SubプロシージャのCall関数を使わないパターンと同様な利用の仕方をします。
結果は以下です。
Functionプロシージャ名 引数, 引数, 引数 '引数の数に応じてカンマで区切る
最後に
詳しくは、MSDN(Microsoftの関数利用一覧)に書かれています。
Sub プロシージャと Function プロシージャの呼び出し (VBA) | Microsoft Learn
どのように使い分けるかですが、やはり「戻り値を受け取るか、受け取らないか」で利用するのがスッキリすると思います。
また、Functionプロシージャだけ存在すると、マクロ実行に表示されません。
このことからも、Subプロシージャが制御のプログラム(メイン関数)として利用され、一部の機能の処理を受け持つのがFunctionプロシージャと言う位置づけなのでしょう。
VBAも利用すると、あれこれ不思議なことが出てきますね(;・∀・)
それでは、今回はこの辺で。
adios!!