私はAccessをしばらく使用していて、SubよりもFunctionの明らかな利点を理解していますが、結果として値を返すことができるので、なぜSubを使用する必要があるのかわかりません機能。結局、私が間違っていない限り。関数は潜水艦ができるすべてのことをすることができますか?
注:私はSubとFunctionの両方を使用する方法を完全に知っているので、それらがどのように機能するかの説明を探しません。
主な違いは戻り値だけではありません。サブクラスのMSILコードは値が返されない場合の方がはるかに短いため、サブクラスは関数(少なくとも.netでは)より高速であるようです。そのため、値が返されない場合の全体的なサブルーチンの方が高速です。すばらしいソース(.netについての話)を見つけたので、それについてさらに読みたいと思います- 関数とサブルーチン
パフォーマンスの点では、これは重要な問題ではありません。
主な違いは、ユーザー定義関数はコード内の式で使用できますが、サブルーチンでは使用できないことです。
これは本当にここでの違いの巨大なエベレスト山です。
この違いは実際にはAccessに限定されていませんが、ユーザー定義関数の作成をサポートしていると考えることができるすべてのプログラミング言語とシステムに当てはまる傾向があります。
定義された関数を使用する主な利点は多数ありますが、最も基本的な問題は、そのような関数を式で使用できることです。
たとえば、フォーム上のボタンのクリック時設定では、通常、そのボタンに1つのVBA [イベントコード]ルーチンをアタッチできます。
ただし、次のようにプロパティシートに式を配置することもできます。
=MyUserFunction()
上記は便利なヒントです。フォーム上の10個のコントロールを強調表示し、上記の式を入力して、これらの10個のボタンに上記の関数を割り当てただけです。あなたはサブで上記を行うことはできません。
もう1つの重要な違いは、フォームまたはレポートのテキストボックスのデータソース(式)として関数を使用できることです(これも、サブではできません)。
もう1つの大きな違いは、SQLでこれらの関数を使用できることです。クエリの各行に対してコードを「実行」できるため、これは本当に素晴らしい機能です。これは、SQLの機能と機能を拡張できることを意味します。
また、VBA変数を返すパブリック関数を作成してクエリで使用できるため、このアイデアを使用してSQLクエリで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式でサブルーチンを使用することはできません。
さらに興味深いのは、AccessでリボンにカスタムXMLを使用する場合、 "on action"属性にfunction()式を使用すると、リボンのコールバックの必要性を回避できます。さらに良いのは、リボンが現在の形式でこれらのfunctions()を呼び出すことです。リボンのコールバックで行う必要があるようなパブリックコードモジュールではありません。
おそらく、違いについて別の10ページ以上を入力することもできますが、それは冗長になり始めると思います。ここでは、凝縮して表示されたくありません。
したがって、VBAまたは実際のほとんどのプログラミング言語でのsubとfunctionの基本的な違いはまったく同じです。
また、Accessやほぼすべてのプログラミング言語で関数を使用する利点もほとんど同じです。たとえば、t-sql(スカラー)でユーザー定義関数を定義できます。この場合も、t-sql関数のいずれかでそのt-sql関数を自由に使用できます。また、SQLサーバー用に作成して使用することを要求することもできます。
したがって、これはサブルーチンと関数の基本的で単純な違いです。コンピューターコードを記述した人なら、ほぼすべてのプログラミング言語で、サブルーチンと関数の上記の重要で有用な違いをすぐに理解できると思います。
確かではありませんが、サブルーチンの変数はサブルーチンの作成時に定義され、メモリの場所を参照してアクセスされるため、サブルーチンは関数よりも高速だと思います。関数は、アクセスされるたびにメモリ空間を割り当てる必要があります。
サブルーチンは呼び出しコードの変数を変更し、関数はそれらをそのまま残します。したがって、サブルーチンは変更されたいくつかの情報を呼び出しコードに提供できます(配列を含む変数の数だけ変更)が、関数は、渡された値に対して一度に1つの回答しか提供できません。この違いのため、サブルーチン内の変数がその値を変更しないことが重要な場合は、その値をサブルーチン自体の内部で定義された一時変数に割り当てる必要があります。
FWIW(私の理論;)-
これを理解するために現実の世界を考えてみましょう。
あなたが何かをやりたいとしましょう。これには(少なくとも)2つの方法があります。
最初の方法では、ヘルパーに情報のリクエストを送信します。ヘルパーはあなたのために情報を返します。つまり、すべての情報があなたに戻って来て、もしあれば次に何をすべきかを決定しています。これは、集中管理された環境です。これはvbaの「機能」の本質です
2番目の方法では、作業を個別のタスクに分割し、ヘルパーに責任を割り当ててタスクを完了させます。つまり、実際の作業は、単に情報を収集するのではなく、ヘルパーによってここで実行されます。これはVBAの「サブ」の本質です。
コードが壊れた場合の対処法を考えてください。関数呼び出しでは、失敗の原因を探すために中央のコマンドに集中します。サブコールでは、各サブの作業に出くわして、彼らが何を間違っていたかを見つけなければなりません。
もちろん、目的を台無しにして、関数が機能し、サブメンバーが情報を取得するようにすることはできますが、それがうまくいかない場合は本当に混乱します!ああ、それはできません。このリンクを読んでください- http://www.cpearson.com/Excel/differen.htm は、Excelがセルの値を変更する関数とセルから呼び出されるサブルーチンを禁止していることを示しています。
はい、関数は値を返す単なるSubです。
イベントは常にサブオブジェクトであり、関数ではないことに注意してください。ただし、MS Accessでは、イベントのプロパティとして使用したいときに関数を作成すると便利です。
On Close: = MyCloseFunction()
サブルーチンは値 ByRef を返すことができます。
少なくともExcelでは他のOfficeアプリのように、もう1つの違いが見つかりました。 VBプログラムを起動するボタンを追加してリボンをカスタマイズする場合は、[コマンドの選択]ドロップダウンメニューでマクロを選択すると、コードではSubsが一覧表示されますが、関数は表示されません.Public Functionと同様に、Private Subもカスタマイズリボン選択から非表示になることに注意してください。
要約すると、これらはリボンのボタンとして追加できます:Sub、Public Sub
そして、これらは追加できません:関数、パブリック関数、プライベート関数、プライベートサブ