私自身の経験としても、混乱していた部分ですが、よく一般的には「Subプロシージャは値を返さない」、「Functionプロシージャは値を返す」という説明があります。
■SubとFunctionの連携で値をやり取り
上記でSubプロシージャの「テスト」を実行するとFunctionプロシージャの「テストの結果」が呼び出され値を返します。
要は先ほどの説明通りで、「Subプロシージャは値を返さない」、「Functionプロシージャは値を返す」というわけです。
ただし、これも先ほど話した通り、VBA全般やSubを理解していればわかるかもしれませんが、そうでない場合「分かったような、分かってないような・・」という感じの人もいるかと思いますがいかがでしょうか?
実はFunction以外にも値を返す方法があります。厳密には「返す」という表現は当てはまらないかもしれませんが、同じような方法があります。ここがFunctionの分かりにくい部分の一つだと思います。
■方法1:(グローバル)変数を使う
これはグローバルでなくても、モジュールレベルの変数でも可能です。
以下の方法だと値を返すFunctionプロシージャを必要としません。
モジュール先頭に変数を宣言すれば、上記のプロシージャの例と同じように変数strに同じ値が格納されます。
■方法2:値参照でプロシージャをコールする
この方法は「Sub テスト結果」プロシージャをコールするときに引数として変数strを渡します。詳しい説明は省略しますが、この方法でも「SubとFunctionの連携で値をやり取り」の例と同じメッセージボックスが表示されます。
このようにFunctionを使わなくても値を使いまわす方法はあり、実際に方法1の「グローバル変数」でのやり取りは、よく見かける方法です。
(この方法は変数の数が増えてくると管理が煩雑になり、混乱しやすいのでおススメしませんが)
個人的にはFunctionを意図的に使うことで「値を返す」ことが明示的にわかりやく、後でプログラム全体を見たときに管理がしやすくなると思います。
いずれにしても、こうしてみると、Subプロシージャを少しだけ分かっている人から見ると、Functionを使う場面が想定しづらくイメージも湧きにくいかもしれません。
そして、下記のようにしたいと思います。
繰り返しますが、Functionプロシージャは値を返します。この「返す」という仕組みを使って消費税を返します。どこに返すのか?それはセルにです。
最初に「消費税プロシージャ」を見てください。
(※分かりやすく説明するために小数点や変数の型などは一切無視しています)
消費税を求める式は「金額 × 0.05」ですね。それを上記で言うと1行で、そのまんまです。
これで「消費税を求める関数」が出来上がりました。そして次にそれをExcelのシート上で使ってみたいと思います。
今回の消費税を求めるプロシージャでは引数「金額」を使いました。この引数の意味も下記の図から感覚的にわかってもらえるかと思いますがいかがでしょうか?
上記のようにFunctionプロシージャの先頭の「プロシージャ名(引数)」がそのまま関数ボックスに表示されます。
そして、通常の関数を使う方法と同様にセルをセットします。
結果は独自で作成したFunctionプロシージャである「消費税」プロシージャが正しく動作しました。
このようにFunctionプロシージャは関数そのものです。これで「値を返す」と言う意味が分かったと思いますがいかがでしょうか?
実際にはセルに直接Functionプロシージャを入れるパターンよりもSubプロシージャとの連携で使う方が圧倒的に多いと思います。
そこで、今回を例を実際にSubから読んだときにどのような使い方になるのかを見てください。
End Function
上記はプログラム上でのやり取りでセルに埋め込むのとは違うため、「=消費税()」の部分を「str = 消費税(400)」で対応しています。
ただし、セルには値が表示されずに、変数strに消費税額が返されます。
そこでさらにセルに結果を書き込むように細工しました。
Range(“C6”).Value = str
上記がそれに当たります。
Functionの「値を返す」意味がこれで分かったでしょうか?
通常はSubプロシージャから色々勉強を始めると思うので、Subが慣れたころからFunctionの習得を始めるといいかもしれません。
頻繁に登場するわけでもないため、慣れるまでが面倒かもしれませんが、使えるようになるとプログラムの可読性(読みやすさ)を考慮して使うのもいいと思います。
ちなみに、Functionを文字通り関数として使う場合は、この独自の関数が記述されているブックを予め起動しておくことが必要です。あるいはアドインやPersonal.xls(b)などに入れておく必要があり、個人で使う分にはまだしも、複数のPC等で使う場合には使い勝手が良いとはいえず注意が必要です。