トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)

VBA_Access

DAO

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