Accessでお仕事 クラス モジュールを使ったプログラミング

クラス モジュールを使ったプログラミング

Access 2000 には、標準モジュールおよびクラス モジュールの、2 種類のモジュールがあります。Access 95 では、フォームまたはレポートと関連付けられた場合にのみ、クラス モジュールが存在しました。Access 97 では、データベース ウィンドウの [モジュール] タブにも存在しました。

クラス モジュールを使ったカスタム オブジェクトの作成

クラス モジュールを使って、独自のオブジェクトの定義を作成できます。クラス モジュールを保存するときの名前が、カスタム オブジェクトの名前になります。クラス モジュール内で定義したパブリックの Sub および Function プロシージャは、そのオブジェクトのカスタム メソッドになります。パブリックの Property LetProperty Get、および Property Set プロシージャは、そのオブジェクトのプロパティになります。

クラス モジュール内でプロシージャを定義した後は、そのクラスの新規インスタンスを作成することによって、新規オブジェクトを作成できるようになります。クラスの新規オブジェクトを作成するには、そのクラスで定義された型の変数を宣言します。たとえば、クラスの名前が [ABasicClass] の場合、次の方法でその新規オブジェクトを作成します。

Dim abc As New ABasicClass

この宣言を含んだコードを実行すると、Visual Basic は、新規インスタンスを作成します。したがって、変数 abc を使って、そのメソッドおよびプロパティを適用することができるようになります。たとえば、[ListNames] という名前のカスタム メソッドを定義すると、次のようにしてそれを適用できます。

abc.ListNames

フォーム クラスの既定のインスタンスの作成

ユーザー インターフェイスから、または Visual Basic からにかかわらず、フォーム ビューでフォームを開いて、そのフォームのクラス モジュールのインスタンスを作成します。つまり、オブジェクトが存在するメモリ内の領域を指定し、組み込みのオブジェクトに対してと同じように、コードでそのメソッドを呼び出し、プロパティに値を設定、または値を取得できます。これは、プレビューでレポートを開いた場合にも当てはまります。

Visual Basic のコードでフォームを参照する場合は、通常、そのフォームのクラスの既定のインスタンスで作業を行います。フォームのクラスには、唯一の既定のインスタンスがあります。また、Visual Basic で、同じフォームのクラスの複数のインスタンスを作成することもできます。フォームのクラスの複数のインスタンスを作成する場合は、既定以外のインスタンスを作成します。

フォームの既定のインスタンスを作成するには、次の 4 つの方法があります。ユーザー インターフェイスを使う方法、DoCmd オブジェクトの OpenForm メソッドを実行する方法、フォーム ビューで CreateForm メソッドを呼び出して新規フォームへ切り替える方法、または、既定のインスタンスを参照する Form 型の変数を作成するために Visual Basic を使う方法の 4 つで、既存のフォームを開くことができます。次の例では、[社員] フォームを開き、そのフォームを指す Form オブジェクト変数を示しています。

Dim frm As Form
DoCmd.OpenForm "社員"
Set frm = Forms!社員

Access では、1 つのステップでフォームを開き、そのフォームのメソッドまたはプロパティ、またはコントロールの 1 つを参照することができるショートカットも用意されています。次の例のようにして、フォームのクラス モジュールを参照します。

Form_社員.Visible = True
Form_社員.Caption = "新入社員"

このコードを実行すると、フォームがすでに開いてない場合には、Access によってフォーム ビューで [社員] フォームが開かれ、フォームの標題に "新入社員" が設定されます。このフォームは、明示的に "Visible/可視 " プロパティ に True (-1) が設定されるまで、表示されません。このコードを呼び出すプロシージャの実行が終了すると、フォームのこのインスタンスは破壊されます。つまり、フォームは閉じられます。

[社員] フォームがデザイン ビューで開かれているときにこのコードを実行すると、実行時エラーが発生します。フォームはフォーム ビューで開くか、まったく開かないかのどちらかにする必要があります。

この構文を使ってフォームのプロパティまたはコントロールの 1 つを変更する場合は、フォームのインスタンスが破壊されると、変更内容も失われます。フォーム ビューでフォームのプロパティの設定値を変更すると、変更内容は常に失われます。プロパティは、デザイン ビューで変更し、フォームと共に変更内容を保存する必要があります。

フォームの既定以外の複数インスタンスの作成

一度にフォームの複数のインスタンスを表示する場合は、フォームのクラスの既定以外の複数のインスタンスを作成できます。たとえば、社員およびその社員の管理者のレコードを同時に表示する場合があります。[社員] フォームのクラスから、社員のレコードを表示するために 1 つのインスタンス、管理者のレコードを表示するためにもう 1 つのインスタンスを作成できます。

Visual Basic でフォームのクラスの新しい既定以外のインスタンスを作成するには、型がフォーム クラス モジュールの名前の変数を宣言します。変数の宣言に、キーワード New を含める必要があります。たとえば、次のコードは、[社員] フォームの新規インスタンスを作成し、それを型が Form の変数に割り当てます。

Dim frm As New Form_社員

フォームの既定以外のインスタンスは、明示的に "Visible/可視" プロパティが設定されるまで表示されません。

このインスタンスを作成するプロシージャが実行を終えると、変数をモジュール レベル変数として宣言していないと、インスタンスはメモリから削除されます。モジュール レベルの変数は、[実行] メニューの [リセット] コマンドまたはツールバーの (リセット) でリセットされるまでその値を保持するので、変数がモジュール レベルの変数として宣言されていれば、フォームは開いたままになります。

設定したプロパティは、フォームのクラスのこのインスタンスに反映されますが、フォームと共に保存されません。また、フォームのクラスの新規インスタンスは、フォームがデザイン ビューで開かれた場合には作成できません。

フォームのクラスの既定以外のインスタンスは、Forms コレクションで名前によって参照することはできません。インデックス番号によってのみ参照できます。フォームの既定以外の複数のインスタンスを作成できるため、各インスタンスが同じ名前です。したがって、Forms コレクション内に同じ名前の複数のフォームが存在する可能性があり、インデックス番号以外にそれぞれを区別する方法はありません。