14.DBアクセス基本クラスの作成
ここからが、やっとAccess VBAプログラミングの本編です。まずは、コネクションやSQLの実行などデータベースを扱うための基本的な機能だけを集めたクラスモジュール「MDBAccess」を作成しましょう。

クラスモジュールは通常のモジュール(標準モジュール)と違い、変数の型へ指定しオブジェクトとして使います。また、クラスモジュールを使うと「他のアプリケーションに流用するのが超簡単」というメリットがあります。
クラスモジュール「MDBAccess」に実装する内容
クラスモジュールに実装する内容は次の通りです。どの機能も、データベースを扱うための基本的な機能です。

クラスモジュール名称
MDBAccess
プロシージャ名
種別
用途
Class_Initialize
コンストラクタ
このプロシージャは、クラスのインスタンスを作成したとき(Dim clsDB As New MDBAccessなど)に自動的に実行される特殊なSubプロシージャです。データベースを扱うための前処理であるコネクション処理はこのプロシージャへ記述します。
Class_Terminate
デストラクタ
このプロシージャは、クラスのインスタンスを破棄したとき(オブジェクト変数にNothingをセットしたとき)に自動的に実行される特殊なSubプロシージャです。データベースのクローズと、レコードセットのクローズ、またデータベース用オブジェクト変数のクリアなどの終了処理はこのプロシージャへ記述します。
ExecSelect
メソッド
レコードセットを返すSQL(SELECT命令)を実行するためのFunctionプロシージャです。
ExecSQL
メソッド
INSERT、UPDATE、DELETEなどレコードセットを返さないSQLを実行するためのFunctionプロシージャです。
BeginTrans
メソッド
トランザクションの開始処理を行うためのSubプロシージャです。
Commit
メソッド
トランザクションを終了し、データベースへの更新を反映するためのSubプロシージャです。
Rollback
メソッド
トランザクションを終了し、データベースへの更新を破棄するためのSubプロシージャです。
GetRS
プロパティ(GET)
作成したレコードセットを取り出すためのプロパティプロシージャです。
クラスモジュールの新規作成とクラスモジュール名の設定
まずはクラスモジュールを新規作成し、クラスモジュール名を「MDBAccess」に変更してください。もし、クラスモジュールの新規作成方法や名前の設定方法が分からない…という場合でも安心!ここにクラスモジュールを新規作成する手順と名前を変更する方法(別ウィンドウで開きます)があります。
コネクションオブジェクト変数とレコードセットオブジェクト変数の宣言
最初に、コネクションオブジェクト変数とレコードセットオブジェクト変数の宣言を行ってしまいます。この2つの変数は、クラスモジュール内の全てのプロシージャから使えるようにするので、(Geleral)(Declarations)で宣言してください。ちなみに、どちらの変数もこのクラス内だけで使えればOKなので、変数宣言時はPrivateを付けておきましょう。

変数名
データ型
有効範囲
用途
objADOCON
ADODB.Connection
クラスモジュール内
コネクションオブジェクト
objADORS
ADODB.Recordset
クラスモジュール内
レコードセットオブジェクト

とりあえず自力で作成してみてください。ちなみに、答え合わせと、どうしても自力ではキビシイ…という場合はこちらのVBAコードの記述例(別ウィンドウで開きます)をどうぞ。
プロシージャ「Class_Initialize」の作成
まずは、Class_Initializeを作成してみましょう。このプロシージャでは、データベースを扱うための前処理(コネクション処理)を実行します。

Class_Initializeを作成するときは、Visual Basic Editorでオブジェクトを「Class」、プロシージャを「Initialize」にします。


すると、プロシージャの枠が作成されます。あとは、ここへコネクション処理を行うVBAコードを記述しましょう。記述するVBAコードは、ADODB.Connection型の変数「objADOCON」へ、コネクション情報(Application.CurrentProject.Connection)をセットするだけの簡単な内容です。

 ■プロシージャ「Class_Initialize」の作成例
Private Sub Class_Initialize()

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    Set objADOCON = Application.CurrentProject.Connection

End Sub
 ※これは、Access VBAです。
プロシージャ「Class_Terminate」の作成
次に、Class_Terminateを作成してみましょう。このプロシージャでは、データベースの後処理(コネクションの解放とレコードセットのクローズ処理)を実行します。

Class_Terminateを作成するときは、Visual Basic Editorでオブジェクトを「Class」、プロシージャを「Terminate」にします。


すると、プロシージャの枠が作成されます。あとは、ここへレコードセットのクローズとコネクションのクローズ、それとオブジェクト変数をクリアするVBAコードを記述しましょう。

ただし、レコードセット変数は、常にオープン状態にあるとは限りません(理由は考えてみよう!)。もし、レコードセットが閉じているときにCloseメソッドを実行すると、実行時エラーでVBAコードが一時停止してしまいます。そこで、レコードセットの状態にかかわらずVBAコードが実行されるようにOn Error Resume Nextを宣言しているのがポイントです。

 ■プロシージャ「Class_Terminate」の作成例
Private Sub Class_Terminate()

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    On Error Resume Next

    objADOCON.Close
    objADORS.Close

    Set objADOCON = Nothing
    Set objADORS = Nothing

End Sub
 ※これは、Access VBAです。
プロシージャ「ExecSelect」の作成
今度は、Functionプロシージャ「ExecSelect」を作成してみましょう。このプロシージャでは、SQLを実行しレコードセット変数(objADORS)へ保存する処理を行います。また、実行するSQLは引数で受け取り、プロシージャの戻り値にはSQLの実行結果をTrue(実行できた)、またはFalse(実行できなかった)で返します。

ExecSelectを作成するときは、Class_TerminateEnd Subの下へそのまま入力してください。また、これ以降では全て同じように最後に作成したプロシージャの後ろへ新しいプロシージャを作成します。


このプロシージャでのポイントは、SQLが実行できたか・できなかったかを判定する部分です。Executeメソッドを実行したときに、SQLに誤り(SQLエラー)がある場合や、データベースに何らかの異常が発生すると(Executeメソッドで)「実行時エラー」が発生してしまうからです。

そこで、SQLやデータベースの状態にかかわらずとりあえずExecuteメソッドを実行し、コネクションオブジェクト(objADOCON)のErrors.Countプロパティの値を調べ、0であればSQLは正常に実行できているためExecuteの戻り値はTrueを返し、何らかのエラー(ここではSQLエラーとコネクション異常を想定)が発生したときはExecuteの戻り値には初期値のFalseを返すようにしています。

なお、実行時エラーのコントロールはお馴染みのOn Error Resume NextOn Error GoTo 0です。ただし、エラー制御を行うときは、想定以外のエラーにも反応してしまうことに注意してください。

 ■プロシージャ「ExecSelect」の作成例
Public Function ExecSelect(SQL As String) As Boolean

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    ExecSelect = False

    On Error Resume Next

    Set objADORS = objADOCON.Execute(SQL)

    'SQLを実行時の結果を判定
    If objADOCON.Errors.Count = 0 Then
       ExecSelect = True
    End If

    On Error GoTo 0

End Function
 ※これは、Access VBAです。
 ※2007/01/30:仕様変更
プロシージャ「ExecSQL」の作成
次に作成するのは、Functionプロシージャ「ExecSQL」です。このプロシージャは、レコードセットを返さないSQLを実行するためのプロシージャで、基本的にはExecSelectとほぼ同じです。なので、特に説明はいらないでしょう。

参考までに、ExecSelectとの違いは「レコードセットの保存を行わない」です。

 ■プロシージャ「ExecSQL」の記述例
Public Function ExecSQL(SQL As String) As Boolean

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    ExecSQL = False

    On Error Resume Next

    Call objADOCON.Execute(SQL)

    'SQLを実行時の結果を判定
    If objADOCON.Errors.Count = 0 Then
       ExecSQL = True
    End If

    On Error GoTo 0

End Function
 ※これは、Access VBAです。
 ※2007/01/30:仕様変更
プロシージャ「BeginTrans」、「Commit」、「Rollback」の作成
お次は、トランザクション制御系のプロシージャです。これらのプロシージャでは、単にメソッドを実行するだけなので、特に説明はいらないでしょう。3つまとめて、サクっと作ってみて下さい。

 ■プロシージャ「BeginTrans」の作成例
Public Sub BeginTrans()

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    objADOCON.BeginTrans

End Sub
 ※これは、Access VBAです。

 ■プロシージャ「Commit」の作成例
Public Sub Commit()

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    objADOCON.CommitTrans

End Sub
 ※これは、Access VBAです。

 ■プロシージャ「Rollback」の作成例
Public Sub Rollback()

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    objADOCON.RollbackTrans

End Sub
 ※これは、Access VBAです。
プロパティプロシージャ「GetRS」の作成
最後は、レコードセット取り出しようのプロシージャ「GetRS」の作成です。このプロシージャで行う処理は、レコードセットオブジェクト変数「objADORS」に保存しているレコードセットを、プロシージャの戻り値として返すだけです。

ちなみに、このプロシージャは「プロパティプロシージャ」という、クラスモジュール独特のプロシージャです。このプロシージャは、最終的にはプロパティとして使用できるようになります。さらに、このプロパティは「読み取り専用プロパティProperty Get)」です。

 ■プロシージャ「GetRS」の作成例
Public Property Get GetRS() As ADODB.Recordset

    '14.DBアクセス基本クラスの作成
    '記述先:クラスモジュール「MDBAccess」

    Set GetRS = objADORS

End Property
 ※これは、Access VBAです。
保存の前に確認しよう
ここまでの内容でエラーがないかを確認してみてください。確認する方法は、Visual Basic Editorで[デバッグ]−[mdbプロジェクト名のコンパイル]を選択します。

これを行うと、記述したVBAコードにエラーがあったときに、そのエラーを指摘してくれます。もし、記述したVBAコードにエラーが見つかったら修正しておきましょう。
そして保存…
クラスモジュールの作成が終わったら必ず保存してください。保存の方法は、ご存じの通りをクリックし、ダイアログでクラスモジュール名を入力。最後に[OK]をクリックします。ただし、クラスモジュールを作成したときにクラスモジュール名を設定しておいたので、ダイアログには「MDBAccess」と入っていると思います。

保存を行ったら、いったんVisual Basic Editorを閉じ「15.登録処理の作成」へ進みましょう!

Copyright(C) 1999-2006 結城圭介。 All rights reserved