こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SubとFunctionの使い分け方。(Access VBA)

Sub:実行するとそのまま処理が終わり、特に次の作業に影響しない。
Function:関数と同じように使い、そこでの戻り値をどこかに代入して利用する。
あるテキストにこの様に書いてありました。

この考え方だと、マクロをVBAに変換すると「モジュールオブジェクト」に出来るFunctionプロシージャは、Subの方が理解にしっくりくるのですど・・・
例えば、「テーブルを開く」(マクロ)だと、ただテーブルを開いて処理を終了するだけなので、SubでVBAが出来るの方が納得するのですけど。

正直、今の認識では、本を読んでいても何となく分かったような気がするだけで、SubとFunctionの使い分けがイマイチ分かりません。

どなたか、SubとFunctionの使い分けの目安をお教えいただけないでしょうか?。
(Access VBA初心者)

投稿日時 - 2007-06-14 10:42:59

QNo.3083464

困ってます

質問者が選んだベストアンサー

VBAは詳しくないですが、VBの一般的な話として。

一言で言ってしまえば、そのテキストに書かれている事で
事足りてしまうと言えば、そうです。
Subは戻り値が無く、Functionは戻り値があります。
基本的に、戻り値が欲しい場合、または関数の結果を
何かに使いたい際にはFunctionを使います。
例えば、関数の処理が成功したかどうかを確認して、
エラー処理の分岐を行いたいときには、

Function xxx As Boolean

としておいて、失敗したときはFalseを返すように関数を記述し、
関数を呼ぶロジックでは

If xxx = False Then
(エラー処理)
End If

と するとか。
パブリック変数等を使って結果をやり取りすることも可能では
ありますが、基本的に美しくありません。
また、前述のとおりFunction関数は 結果が返されます。
すなわちFunction関数が呼ばれて、Functionから戻ってきた際には、
それは何らかの値になっていると見ていいのです。
上の If xxx = False Then という書き方も、まさにそうですし
(Functionを変数であるかのように記述できる)、下のようなことも
もちろん可能です。
i = MyGetValue1(a, b) * MyGetValue2(c, d)
(MyGetValue1, MyGetValue2 はそれぞれFunction関数で、
 数値を返すと仮定)
うまく使えば、コードを かなりスッキリさせられますよ。

対して、Subは言われるとおり「投げっ放し」の関数です。
Functionである必要がないVBAマクロもFunctionになってしまうのであれば、
恐らく「Functionでも、戻り値を『使わなければいけない』わけではない」
ので、汎用的(?)なFunction関数で全てを処理して簡略化してしまって
いるのでしょう。

投稿日時 - 2007-06-14 13:33:56

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

実際問題としては、
(1) ほとんどの Function が Sub でも書ける
(2) 多くの Sub が Function でも書ける
ので、
迷ったら、コインを振って決めても構いません。
しかし、実は課題ごとに明白な優劣があります。
それは、少し経験を積めば、自然に分かります。まあ、プログラムが動くんでしたら、最初はどっちでもいいと思いますよ。

投稿日時 - 2007-06-15 13:45:41

ANo.2

こんばんは
例えばエクスプローラを使用してファイルを削除する場合、確認のメッセージボックスが表示され、利用者の返答にもとづいてその後の処理が実行されますよね。あの仕組みはFunctionでないと実現できません。
お分かりいただけたでしょうか。

投稿日時 - 2007-06-14 21:01:51

あなたにオススメの質問