トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)
DAOは、プログラムコードを使用してJetデータベースエンジンに直接接続して、テーブルやクエリなどのオブジェクトを作成、更新、削除するためのオブジェクトモデルとなります。
主にDAOでは以下のような操作が可能です。
- テーブル、クエリへ直接アクセスでき、追加や削除が自由にできる。
- テーブルやクエリのフィールドにもアクセスができる。
- データベースを新規に作成できる。
- その他
DAOモデルの階層構造
DAOは、複雑な階層構造になっています。基本的なオブジェクトとコレクションを紹介します。下の図は代表的なオブジェクトとコレクション類となります。これ以外にもたくさんのコレクションとオブジェクトが存在します。

- DBEngineオブジェクト
- 最上層にあるオブジェクトで、Jetエンジンを表して、これを直接操作することになります。
- Workspacesコレクション
- DBEngineオブジェクトにあるアクティブで表現可能なWorkspaceオブジェクトが含まれます。
- Workspaceオブジェクト
- 開いているデータベースに領域を提供します。
- Databasesコレクション
- Workspaceオブジェクトで開かれた、または作成されたすべての開いているDatabaseオブジェクトが含まれる。
- Databaseオブジェクト
- DAOで開かれ、または作成されたデータベースを表します。テーブルやクエリを定義したり、Recordsetオブジェクトを開く時に使用します。
- TableDefオブジェクト
- 指定されたデータベースのテーブルや保存されたテーブルの定義を表します。
- QueryDefオブジェクト
- 指定されたデータベースのクエリや作成されたクエリの定義を表します。
※ 各名称にコレクションとオブジェクトが付加されていますが、コレクションはオブジェクトを含むだけの働きだけで、メソッド、プロパティ、コレクションで構成された実体はオブジェクトが担当します。
オブジェクト変数
VBAのプログラミングとしてDAOを使用する場合、プログラム内で使う変数はオブジェクト型を定義し、これをプロパティやメソッドの対象にしてデータベースを操作します。この変数を「オブジェクト変数」と言います。
宣言方法
オブジェクト変数の宣言は、一般の変数と同じように、Dim、Static、Private、Publicステートメントのいずれかを接頭語として使用します。
※ 一般的にDimステートメントで事足ります。
【書式】 Dim オブジェクト変数名 As オブジェクト型
例)Database型のオブジェクト変数dbの宣言であれば以下のように記述します。
Dim db As Database
オブジェクト変数名はユーザが自由に指定できますが、一般的な変数名、例えばDatabase型であればdb、Recordset型であればrsなどを使うと何かと便利です。
オブジェクト変数の関連付け
オブジェクト変数は宣言しただけでは使用できません。オブジェクトを特定させるために、関連付けることが必要なので、Setステートメントを使用します。
Setステートメント
【書式】 Set オブジェクト変数 = オブジェクト
※ 代入するオブジェクトは、オブジェクト名、宣言済みのオブジェクト型変数、またはオブジェクト型を返す関数かメソッドです。
《 記述例 》
現在開いているデータベースの名前を表示するには、以下のように記述します。
Sub データベース名() Dim db As Database Set db = CurrentDb MsgBox db.Name End Sub

データベースへの参照
DAOでは、どのデータベースを参照して、処理を行うかが必要となります。参照には、カレントデータベース(現在開いているデータベース)を参照する場合と他のデータベースを参照する場合があります。
カレントデータベースを参照する
開いているデータベースを参照するには、CurrentDbメソッドを使用します。
CurrentDbメソッド
【書式】 Set オブジェクト変数 = CurrentDb
CurrentDbメソッドは、Setステートメントと組み合わせて、データベース変数に開いているデータベースへの参照を代入することができます。データベース名が記述しなくても、VBコードからカレントデータベースにアクセスすることができます。
《 記述例 》
Sub カレントデータベース名表示() Dim db As Database, DBname Set db = CurrentDb DBname = db.Name MsgBox DBname End Sub
【留意点】
CurrentDbメソッドは、オブジェクト型を代入するものなので、他のオブジェクト型を指定しているとエラーになります。
以下のような記述は間違っています。
Dim rs As Recordset Set rs = CurrentDb
他のデータベースを参照する
他のAccessファイルを参照する場合は、OpenDatabaseメソッドを使用します。この時にDAO機能を使うことになります。
OpenDatabaseメソッド
【書式】 Set オブジェクト変数 = OpenDatabase(ファイル名[,オプション][,権限モード][,接続情報])
- ファイル名:既存のファイル名
- オプション:共有(False)、排他(True)モードの設定。省略した場合は共有モード
- 権限モード:読み取り/書き込み権限モードはFalse、読み取り専用権限モードはTrue。省略した場合は、読み取り/書き込み権限モード
- 接続情報:パスワードを含む様々な接続情報を設定
《 記述例 》
Dドライブのaccessフォルダ内のVBA練習.accdbファイルを参照するには以下のように記述します。
Sub 外部データベース参照() Dim db As Database Set db = OpenDatabase("D:\access\VBA練習.accdb") MsgBox db.Name End Sub

《 記述例 》
DAOの標準的な記述方法で、Dドライブのaccessフォルダ内のVBA練習.accdbファイルの参照とそのファイルのサイズを求めるには以下のように記述します。
Sub ファイル名とサイズ表示() On Error GoTo Error_jump Dim db As DAO.Database Dim fileName As String Dim fileSize As Long Set db = OpenDatabase("D:\access\VBA練習.accdb") fileName = db.Name fileSize = FileLen(fileName) \ 1000 MsgBox fileName & vbNewLine & _ "ファイル容量:" & Format(fileSize, "#,##0") & "KB" db.Close Set db = Nothing Exit Sub Error_jump: MsgBox Err.Number & ":" & Err.Description End Sub