私はしばらく Access を使用してきましたが、Sub よりも Function の明らかな利点は理解していますが、結果として値を返すことができるため、なぜ Sub を使用する必要があるのか わかりません機能。結局のところ、私が間違っていない限り。関数は Subs ができるすべてのことを実行できますか?
注: Sub と Function の両方の使用方法を十分に認識しているため、それらがどのように機能するかについての説明は求めていません。
パフォーマンスに関しては、これはここでは重要な問題ではありません。
主な違いは、ユーザー定義関数はコード内の式で使用できるのに対し、サブルーチンは使用できないことです。
これは本当に大きな違いのエベレストです。
この違いは実際には Access に限定されたものではなく、ユーザー定義関数の作成をサポートしていると私が考えることができるすべてのプログラミング言語とシステムに当てはまる傾向があります。
定義済み関数を使用する主な利点は多数ありますが、最も基本的な問題は、そのような関数を式で使用できることです。
たとえば、フォーム上のボタンのクリック設定では、通常、そのボタンに 1 つの VBA [イベント コード] ルーチンを関連付けることができます。
ただし、次のようにプロパティ シートに式を配置することもできます。
=MyUserFunction()
上記は便利なヒントです。フォーム上の 10 個のコントロールを強調表示し、上記の式を入力すると、上記の機能をそれらの 10 個のボタンに割り当てることができるからです。サブでは上記のことはできません。
もう 1 つの重要な違いは、関数をフォームまたはレポートのテキスト ボックスのデータ ソース (式) として使用できることです (サブルーチンではこれを行うことはできません)。
もう 1 つの大きな違いは、これらの関数を SQL で利用できることです。クエリの行ごとにコードを「実行」できるため、これは本当に素晴らしい機能です。これは、SQL の能力と機能を拡張できることを意味します。
また、このアイデアを使用して、SQL クエリで VBA 変数を表示することもできます。VBA 変数を返すパブリック関数を作成するだけで、これをクエリで使用できますが、クエリで VBA 変数を使用することはできません。
そして、この SQL の拡張により無限のアイデアが開かれます。
ToMorrow() というパブリック関数を作成できます
Public Function Tomorrow() as date
Tomorrow() = date() + 1
End Function.
クエリビルダーで、次のように移動できます。
Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers
また、次のようなカスタム変換を行うこともできます。
Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse.
上記の毎日の気温の読み取り値は華氏で表示される可能性があり、摂氏というパブリック関数を次のように定義するだけです。
Public Function Celsius(Temperature As Variant) As Variant
Celsius = (Temperature * 1.8) + 32
End Function
上記の関数は単純ですが、温度と湿度に基づいて植木鉢の上の水分を決定する複雑なアルゴリズムを処理する複雑なレコード セットを実行できます。
したがって、そのようなパブリック関数を定義すると、重要な概念は、そのような関数を式として VBA コードで使用できるだけでなく、SQL を含む十分に驚くべき方法で使用できるということです。
したがって、コードでも、次のように移動できます。
If MyCustomfucntion(SomeVar) = lngTestValue then
繰り返しますが、VBA 式では sub を使用できません。
さらに興味深いのは、Access のリボンにカスタム XML を使用する場合、"on action" 属性に function() 式を使用すると、リボン コールバックの必要性を回避できることです。さらに良いのは、リボン コールバックで行う必要があるようなパブリック コード モジュールではなく、リボンが現在のフォームでこれらの functions() を呼び出すことです。
違いについては、おそらくさらに 10 ページ以上入力できますが、それは冗長になり始めると思います。
したがって、VBA または実際にはほとんどのプログラミング言語での sub と function の基本的な違いはほとんど同じです。
また、Access またはほぼすべてのプログラミング言語で関数を使用する利点もほとんど同じです。たとえば、ユーザー定義関数を t-sql (スカラー) で定義できます。また、その t-sql 関数を任意の t-sql コードで自由に使用したり、SQL サーバー用に作成して使用するクワイアでさえ自由に使用したりできます。
したがって、これはサブルーチンと関数の基本的で単純な違いであり、コンピューター コードをほぼすべてのプログラミング言語で記述したことがある人は、上記のサブルーチンと関数の重要で有用な違いをすぐに理解できると思います。
主な違いは戻り値だけではありません。値が返されない場合、subs の MSIL コードははるかに短いため、subs は関数より (少なくとも .net では) 高速であるようです。そのため、値が返されない場合、サブ全体が高速になります。ああ、私はちょうどそれのための素晴らしいソースを見つけました(.netについて話します)、おそらくあなたはそれについてさらに読みたいと思います-関数とサブルーチン
はい、関数は値を返す単なるサブです。
絶対的な確信はありませんが、サブルーチンの変数はサブルーチンの作成時に定義され、メモリの場所を参照してアクセスされるため、サブルーチンは関数よりも高速だと思います。関数は、アクセスされるたびにメモリ空間を割り当てる必要があります。
サブルーチンは呼び出しコードの変数を変更し、関数はそれらをそのまま残します。そのため、サブルーチンは呼び出し元のコードにいくつかの変更された情報を提供できます (配列を含む変数と同じ数の変更) が、関数は渡された値に対して一度に 1 つの応答しか提供できません。この違いのため、サブルーチン内の変数がその値を変更しないことが重要な場合は、サブルーチン自体で定義された一時変数に値を割り当てる必要があります。
FWIW(私の理論;)-
これを理解するために現実世界を考えてみましょう。
何かを成し遂げたいとしましょう。これを行うには(少なくとも)2つの方法があります。
最初の方法は、ヘルパーに情報のリクエストを送信すると、ヘルパーが情報を返してきます。つまり、すべての情報があなたに戻ってきて、次に何をすべきかを決定しています。これは集中管理された環境です。これがvbaの「関数」の本質です
2 番目の方法は、作業を個別のタスクに分割し、ヘルパーにタスクを完了する責任を割り当てます。つまり、情報を収集するだけではなく、実際の作業はここでヘルパーによって実行されます。これがvbaの「サブ」の本質です。
コードが壊れた場合の対処法を考えてみましょう。関数呼び出しでは、中央のコマンドに集中して失敗の理由を探します。サブ呼び出しでは、各サブの仕事に出くわし、彼らが何を間違えたのかを見つけなければなりません。
もちろん、目的を台無しにして機能を機能させ、潜水艦が情報を取得するだけにすることもできますが、それは物事が壊れたときに本当に混乱するだけです! ああ、でもそれはできません。このリンクを読んでください- http://www.cpearson.com/excel/differen.htm、Excelはセル値を変更する関数とセルから呼び出されるサブルーチンを禁止していると述べています。
イベントは常にサブであり、関数ではないことに注意してください。ただし、MS Access では、関数をイベントのプロパティとして使用する場合に関数を作成すると便利です。
On Close: = MyCloseFunction()
Sub は値ByRefを返すことができます。