基本的なサブフォームから始めて、それに基づいて構築された他の3つのサブフォームがあり、それぞれが基本的なサブフォームにいくつかの異なる要素を追加している例がかなりあります。これは、サブフォームごとにコードページがあり、繰り返しが多いことを意味します。共通の要素を別のモジュールに入れて、各サブフォームに関連する追加のコードだけをコードページに残しても大丈夫ですか?これにパフォーマンスの問題はありますか?
3 に答える
簡単な答え、はい、そうしてください。各フォーム間で繰り返されるコードを分割してください。
長い答えですが、繰り返されるコードを別のモジュールまたはクラスに引き出すことは、私の意見では、それを行うためのより良い方法です。
クラスを使用すると、コードがより管理しやすくなり、保守が容易になります。複数の場所で類似しているコードがある場合、場所ごとにコードを変更する必要があるため、メンテナンスがより困難になります。1つの場所に配置すると、管理と保守が容易になります。
利点のリストはChicago Access Users Group (CAUG) talk - "Class Modules in Access"
:から取られました
Advantages of using classes/objects:
- let's you create more complex objects than tables or queries provide
alone
- using classes within classes let's you restrict function visibility
- class methods & attributes are more descriptive than module's
function list alone
- let's you use Intellisense for more efficient coding
- no "ambiguous name" errors with multiple copies of the same class
module
- can copy class modules without worry of creating ambiguous function
names
- static variables are implicit in class objects, and so are easier to
manage
- isolating access layers within wrapper classes promote
portability/maintainability
- better support for separation of UI/business logic/data access =
n-tier development
- promotes modular thinking in analysis, design
- easier to adapt many publicly-available object models to Access apps
- prepares you for transition to .NET and other fully object-oriented
architectures
質問を理解している場合は、はい、標準のコードモジュールに移動することで、一定量のコードを一元化できます。これを行うにはおそらく多くの方法がありますが、より良い方法の1つは、フォームオブジェクトを関数に渡すことです。次に例を示します。
Private Sub Form_BeforeUpdate(Cancel As Integer)
If ValidateContact = False Then Cancel = True
End Sub
'This code goes in a standard code module not associated with any form
Public Function ValidateContact(ByRef frm as Form) as Boolean
Dim bValid as Boolean
bValid = True
If Nz(frm!FirstName, "") = "" Then
MsgBox "First Name cannot be blank."
bValid = False
ElseIf Nz(frm!LastName, "") = "" Then
MsgBox "Last Name cannot be blank."
bValid = False
End If
ValidateContact = bValid
End Function
また、私が正しく理解していれば、少なくとも明示的にではなく、クラスモジュール/クラスオブジェクトの使用についての質問はまったくありません。(実際、Accessで作成するコードのすべてのビットは、ほとんどの場合暗黙的にクラスオブジェクトを使用しています。)別のSOユーザーは、AccessでClassオブジェクトを使用する利点についてすでにすばらしい回答を投稿しているので、説明しません。それについてはもっと。実際、標準のコードモジュールは基本的にシングルトンクラスであり、クラスオブジェクトのようにインスタンス化する必要はありません。シングルトン/標準コードモジュールが好まれる理由はいくつかありますが、それ以外の理由がない限り、関数を呼び出す方が簡単です。ただし、約4つ以上の引数を持つ関数を作成していることに気付いた場合は、
質問の最後の部分について、「これにパフォーマンスの問題はありますか?」
私が知っている2つの結果があります:
- フォームの読み込み時間
- メモリ使用
架空の例として、タブコントロールを備えたフォームがあるとします。そのタブコントロールには10ページが含まれ、各ページにはサブフォームが含まれています。これらのサブフォームに同じVBAコードのコピーが含まれている場合は、サブフォームごとにその共通コードを再度読み込む必要があります。これには時間がかかり、メモリ使用量が増加します。
共通コードを標準モジュールに移動してサブフォームから参照する場合は、一度だけロードする必要があります...フォームのロード時間とメモリ消費の両方を削減します。
したがって、最終的な結果として、検討しているアプローチによってアプリケーションの応答性が向上する可能性があります...これにより、ユーザーの満足度が高まる可能性があります。
ただし、そのアプローチで目立ったパフォーマンスの向上が見られない場合でも、共通コードのコピーを1つだけ維持する必要があるため、とにかくそれを行います。