• ベストアンサー

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

Sub:実行するとそのまま処理が終わり、特に次の作業に影響しない。 Function:関数と同じように使い、そこでの戻り値をどこかに代入して利用する。 あるテキストにこの様に書いてありました。 この考え方だと、マクロをVBAに変換すると「モジュールオブジェクト」に出来るFunctionプロシージャは、Subの方が理解にしっくりくるのですど・・・ 例えば、「テーブルを開く」(マクロ)だと、ただテーブルを開いて処理を終了するだけなので、SubでVBAが出来るの方が納得するのですけど。 正直、今の認識では、本を読んでいても何となく分かったような気がするだけで、SubとFunctionの使い分けがイマイチ分かりません。 どなたか、SubとFunctionの使い分けの目安をお教えいただけないでしょうか?。 (Access VBA初心者)

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

  • ベストアンサー
回答No.1

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関数で全てを処理して簡略化してしまって いるのでしょう。

その他の回答 (2)

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.3

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

回答No.2

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

関連するQ&A