■プロシージャ「データベース接続テスト」の作成

 では、以上の順序でコードを記述してゆきましょう。コードの作成は、ExcelのVBEditorを使用して行ないます。
ExcelからVBEditorを起動し、プロジェクトに標準モジュールを追加します。そして、次のSubプロシージャを作成します。
Sub データベース接続テスト()
End Sub
プロシージャの先頭で、4つの変数を宣言します。
Dim WSP As Workspace   ―
Dim DB As Database     ―
Dim TBL As Recordset   ―
Dim Fname As String    ―
作成するワークスペースを格納するオブジェクト変数
開いたデータベースファイルをオブジェクトとして取得するためのオブジェクト変数
開いたテーブルを格納するオブジェクト変数
データベースファイル名を格納する変数

操作対象のデータベースファイル名を、フルパスで変数に格納します。データベースファイルは、現在作業中のブックと同じフォルダに格納していますので、そのパス名をWorkbookオブジェクトのPathプロパティで取得し、データベースファイル名と結合して変数「Fname」に格納します。

Fname = ActiveWorkbook.Path & "¥Club.mdb"
 次に、データベースを操作するためのセッションとなる新しいワークスペースを作成します。ここでは、Accessのデータベースファイルが操作対象なので、Jetデータベースでワークスペースを作成します。
 ワークスペースを作成するには、DBEngineオブジェクトのCreateWorkspaceメソッドを使用します(書式1)。

書式1:CreateWorkspaceメソッドの書式
 Set オブジェクト変数 = CreateWorkspace(name, user, password, type) 
 
 name
 作成されるWorkspaceオブジェクトの名前を指定
 
 user
 このワークスペースのユーザー名を設定
 
 password
 ワークスペースに設定するパスワード文字列を指定
 
 type
 省略可能。作成するワークスペースの種類を指定。Jetワークスペースを
 作成する場合は「dbUseJet」を、ODBCDirectワークスペースを作成す
 る場合は「dbUseODBC」という定数を指定する。 

 ここでは、第一引数(name)と第三引数(password)は指定せず「""」をセットします。また、第二引数(user)のユーザー名には必ず「admin」を設定してください。
 第四引数(type)は、Jetワークスペースを作成するので、「dbUseJet」をセットします。

Set WSP = CreateWorkspace("", "admin", "", dbUseJet)
 CreateWorkspaceメソッドによってワークスペースが作成されると、メソッドはWorkspaceオブジェクトを返してきますので、これをSetステートメントを使ってオブジェクト変数に格納しておきます。
 以降、ワークスペース内での操作は、すべてこのオブジェクトが保有するプロパティとメソッド、そして下層のオブジェクトを使用して行なうことになります。

 ワンポイントアドバイス
 ファイル名の前に、パス名とファイル名を区切る記号「¥」を付けるのを忘れないように。

ワークスペースが作成できたら、このセッションの中で操作対象のデータベースファイルを開きます。これは、WorkspaceオブジェクトのOpenDatabaseメソッドを使用します(書式2)。

書式2:OpenDatabaseメソッドの書式
 Set オブジェクト変数 = Workspace.OpenDatabase (dbname, options, 
              readonly, connect)
 
 Workspace
 セッションとなるWorkspaceオブジェクトを指定

 dbname
 操作対象のデータベースのファイル名を指定。パス名を含めることも可能
 
 options
 省略可能。Jetワークスペースでは開くデータベースに対するアクセス権を設定
 ⇒True:排他モードでデータベースを開く
 ⇒False (既定値) :共有モードでデータベースを開く
 
 read-only
 省略可能。データベースを読み取り専用で開く場合は、「True」を設定し、読み取り/ 
 書き込みで開く場合は、「False」を設定
 
 connect
 省略可能。パスワードを含むさまざまな接続情報を指定 

 メソッドの対象オブジェクトに、今作成したWorkspaceオブジェクトを指定します。また、メソッドの最初の引数にデータベースファイル名を、第二引数にデータベースファイルを共有モードで開く「False」をセットし、メソッドを実行します。

Set DB = WSP.OpenDatabase(Fname, False)
 無事データベースファイルを開くことができると、OpenDatabaseメソッドは開いたデータベースファイルをDatabaseオブジェクトとして返してきますので、Setステートメントを用いてオブジェクト変数「DB」に格納しておきます。

続いて、今度はデータベース内のテーブルを開きます。この操作は、DatabaseオブジェクトのOpenRecordsetメソッドを使用します(書式3)。

書式3:OpenRecordsetメソッドの書式
 Set オブジェクト変数 = Databaseオブジェクト.OpenRecordset (source,  
             type, options, lockedits)

 source
 新しいRecordsetオブジェクトとなるテーブル名、クエリー名、またはレ
 コードを返すSQLステートメントを指定。Jetデータベースのテーブルタ
 イプのRecordsetオブジェクトの場合は、テーブル名のみを指定
 
 type
 省略可能。開くRecordsetの種類を示す以下の定数を指定
 ⇒dbOpenTable:テーブルタイプのRecordsetオブジェクト(Jetワークス
           ペースでのみ使用可)
 ⇒dbOpenDynamic:動的タイプのRecordsetオブジェクト(ODBCDirect
             ワークスペースでのみ使用可)
 ⇒dbOpenDynaset:ダイナセットタイプのRecordsetオブジェクト
 ⇒dbOpenSnapshot:スナップショットタイプのRecordsetオブジェクト
 ⇒dbOpenForwardOnly:前方スクロールタイプのRecordsetオブジェクト
 
 options
 省略可能。新しいRecordsetの特性を指定する定数の組み合わせを指定
 (指定する値については、オンラインヘルプを参照)

 Databaseオブジェクトのメソッドを使用しますので、操作対象にDatabaseオブジェクトを格納している変数「DB」を指定します。メソッドの第一引数にテーブル名である「会員名簿」を指定し、第二引数にはAccessのデータベースファイルを指定します。ここではテーブルタイプなので、定数「dbOpenTable」を指定してメソッドを実行します。

Set TBL = DB.OpenRecordset("会員名簿", dbOpenTable)
 メソッドが実行され、テーブルを開くことができると、メソッドは開いたテーブルを「Recordset」オブジェクトとして返してきます。これをSetステートメントでオブジェクト変数「TBL」に格納しておきます。
 ここまでの操作で、Accessで作成したデータベース「会員名簿」を開くことができました。あとは、「Recordset」オブジェクトのプロパティやメソッド、下層のオブジェクトを使って、テーブルに格納されているフィールドやレコードデータにアクセスする処理を行なえばいいのです。

テーブルに格納されているフィールドデータは、Recordsetオブジェクトの1階層下のFieldsコレクションオブジェクトで取り扱います。このオブジェクトのCountプロパティを使用すると、テーブルに作成されているフィールドの個数を把握できます。
 このコードでは、上位の操作対象のオブジェクトに、Recordsetオブジェクトを格納しているオブジェクト変数「TBL」を指定し、続いてRecordsetオブジェクトのFieldsプロパティでFieldsコレクションオブジェクトを指定したのちに、Countプロパティを記述します。
 必ず、上位のオブジェクトに、アクセスしたいフィールドが格納されているテーブルをRecordsetオブジェクトで指定してください。

TBL.Fields.Count
 また、RecordsetオブジェクトのRecordCountプロパティを使用すると、テーブルタイプのデータベースファイルでは、テーブルに格納されているレコードの総数を把握できます。
 対象オブジェクトにRecordsetオブジェクトを格納しているオブジェクト変数「TBL」を指定し、RecordCountプロパティを記述します。
TBL.RecordCount
 このプロシージャでは、これらのオブジェクトとプロパティを組み合わせて、開いたテーブル「会員名簿」のフィールド数とレコード数を把握し、文字列と組み合わせてワークシート「Sheet1」のセル「A1」「A2」に転送します(図5)。

図5:Accessのテーブルでは、8個のフィールドと16個のレコードがある
コードを実行するとその数字がセルに格納される

With Worksheets("Sheet1")
    Range("A1") = "フィールド数:  " & TBL.Fields.Count
    Range("A2") = "レコード数:  " & TBL.RecordCount
End With

 ワンポイントアドバイス
 Accessデータベースのアクセス権は、共有モードと排他モードの2種類を指定できます。
 共有モードは、複数のユーザーが同時にデータベースファイルにアクセスしデータの操作を行なうことができます。排他モードは、特定のユーザーがデータベースファイルを操作している間は、他のユーザーはそのデータベースファイルを操作できません。

今度は、テーブルにあるフィールド名をすべて読み出してみましょう。Fieldsコレクションオブジェクトを参照するFieldsプロパティに「()」を付けて添え字を記述すると、単体のFieldオブジェクトにアクセスできるようになります。このFieldオブジェクトが保有するNameプロパティに、フィールド名が格納されています。
 テーブルに設定されているフィールドは、先頭のフィールドの番号が「0」から始まるようになっています。フィールドの総数はすでにCountプロパティで把握していますので、フィールド数は「『Fields(0)』から『Count-1』個まで」になります。そこでFor...Nextループを使い、「0」から「Count-1」まで順番にNameプロパティの値をセルに転送します(図6)。

図6:フィールド名すべてがセルに表示される

With TBL
    For i = 0 To .Fields.Count - 1
        Cells(3, i + 1) = .Fields(i).Name
    Next
End With

これで、レコードの操作は終了です。最後にプロシージャの終了処理を作成します。まず、開いたテーブル、データベースファイル、そして作成したワークスペースを閉じます。この処理は、それぞれのオブジェクトが保有するCloseメソッドをひとつずつ実行します。ここで、閉じる順番に注意してください。順番を間違えるとプロシージャの実行はエラーになってしまいます。たとえば、ワークスペースを先に閉じてしまうと、テーブルやデータベースファイルを閉じることができません。必ず、開いた順番とは逆の順番で閉じていってください。

TBL.Close
DB.Close
WSP.Close
 これらを閉じたら、それまで使用していたオブジェクト変数に「Nothing」を代入し、変数をメモリから解放しておきます。
Set TBL = Nothing
Set DB = Nothing
Set WSP = Nothing