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データベースでワークスペースを作成します。書式1:CreateWorkspaceメソッドの書式
|
ここでは、第一引数(name)と第三引数(password)は指定せず「""」をセットします。また、第二引数(user)のユーザー名には必ず「admin」を設定してください。
第四引数(type)は、Jetワークスペースを作成するので、「dbUseJet」をセットします。
Set WSP = CreateWorkspace("", "admin", "", dbUseJet)
CreateWorkspaceメソッドによってワークスペースが作成されると、メソッドはWorkspaceオブジェクトを返してきますので、これをSetステートメントを使ってオブジェクト変数に格納しておきます。
![]() |
ファイル名の前に、パス名とファイル名を区切る記号「¥」を付けるのを忘れないように。 |
ワークスペースが作成できたら、このセッションの中で操作対象のデータベースファイルを開きます。これは、WorkspaceオブジェクトのOpenDatabaseメソッドを使用します(書式2)。
書式2:OpenDatabaseメソッドの書式
|
メソッドの対象オブジェクトに、今作成したWorkspaceオブジェクトを指定します。また、メソッドの最初の引数にデータベースファイル名を、第二引数にデータベースファイルを共有モードで開く「False」をセットし、メソッドを実行します。
Set DB = WSP.OpenDatabase(Fname, False)
無事データベースファイルを開くことができると、OpenDatabaseメソッドは開いたデータベースファイルをDatabaseオブジェクトとして返してきますので、Setステートメントを用いてオブジェクト変数「DB」に格納しておきます。
続いて、今度はデータベース内のテーブルを開きます。この操作は、DatabaseオブジェクトのOpenRecordsetメソッドを使用します(書式3)。
書式3:OpenRecordsetメソッドの書式
|
Databaseオブジェクトのメソッドを使用しますので、操作対象にDatabaseオブジェクトを格納している変数「DB」を指定します。メソッドの第一引数にテーブル名である「会員名簿」を指定し、第二引数にはAccessのデータベースファイルを指定します。ここではテーブルタイプなので、定数「dbOpenTable」を指定してメソッドを実行します。
Set TBL = DB.OpenRecordset("会員名簿", dbOpenTable)
メソッドが実行され、テーブルを開くことができると、メソッドは開いたテーブルを「Recordset」オブジェクトとして返してきます。これをSetステートメントでオブジェクト変数「TBL」に格納しておきます。
テーブルに格納されているフィールドデータは、Recordsetオブジェクトの1階層下のFieldsコレクションオブジェクトで取り扱います。このオブジェクトのCountプロパティを使用すると、テーブルに作成されているフィールドの個数を把握できます。
このコードでは、上位の操作対象のオブジェクトに、Recordsetオブジェクトを格納しているオブジェクト変数「TBL」を指定し、続いてRecordsetオブジェクトのFieldsプロパティでFieldsコレクションオブジェクトを指定したのちに、Countプロパティを記述します。
必ず、上位のオブジェクトに、アクセスしたいフィールドが格納されているテーブルをRecordsetオブジェクトで指定してください。
TBL.Fields.Count
また、Recordsetオブジェクトの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