トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)
テーブルの作成
DAOでテーブルとフィールドを作成するには、コレクションとオブジェクトの定義付けを覚えておく必要があります。

図の階層構造を見ると、テーブルはTableDefsコレクション、フィールドはFieldsコレクションで管理され、テーブルを作成するにはこれらのコレクションにオブジェクトを追加することになります。
テーブルを1つ作成するには、TableDefオブジェクトを作成してTableDefsコレクションに追加します。同様に、フィールドを1つ作成するには、Fieldオブジェクトを作成してFieldsコレクションに追加します。
テーブルはフィールドで構成されるので、少なくても1つ以上のフィールドを作成することになります。そして、各オブジェクトのコレクションへの追加は、低い方から順番に行っていきます。
◆ テーブル作成手順
- テーブルの本体となるTableDefオブジェクトを作成する
- Fieldオブジェクトを作成する
- FieldオブジェクトをFieldsコレクションに追加する
- TableDefオブジェクトをTableDefsコレクションに追加する
- これ以降はNewAddメソッドなどを使用して、新規レコードを作成する
《 記述例 》
テーブル「商品マスタ」を作成します。フィールドは「No」、「商品名」、「単価」の3つを作成して、データ型、フィールドサイズも指定します。次のように記述します。
Sub テーブル作成() On Error GoTo Error_go Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim flNo As DAO.Field Dim flName As DAO.Field Dim flPrice As DAO.Field Set db = CurrentDb() Set tbdef = db.CreateTableDef("商品マスタ") Set flNo = tbdef.CreateField("No", dbText, 3) Set flName = tbdef.CreateField("商品名", dbText, 50) Set flPrice = tbdef.CreateField("単価", dbInteger) tbdef.Fields.Append flNo tbdef.Fields.Append flName tbdef.Fields.Append flPrice db.TableDefs.Append tbdef MsgBox "商品マスタテーブルが作成されました" db.Close: Set db = Nothing Exit Sub Error_go: If Err.Number = 3010 Then db.TableDefs.Delete "商品マスタ" Resume Else MsgBox Err.Number & ":" & Err.Description End If Exit Sub End Sub
このプロシージャを実行すると作成した旨のメッセージが表示されます。

データベースを更新(F5キーを押す)すると、テーブルが新規に作成されていることが確認できます。

「商品マスタ」テーブルをデザインビューで開くと、それぞれのデータ型やフィールドサイズも指定された設定内容であることが確認できます。

- ※ CreateFieldメソッド
- フィールド作成時に使用して、設定値までも指定できます。
- ※ Appendメソッド
- 作成したオブジェクト(テーブルやフィールド)をそれぞれのコレクションに追加する時に使用します。Appendメソッドを実行することで作成が完了します。
- ※ エラーコード3010
- テーブルを作成する際に、同名のテーブルが既に存在する場合はこのエラー番号が発生します。
インデックスの作成
DAOでインデックスは、Indexesコレクションで管理されています。検索時にはインデックスを作成することですばやく実行できます。また、Seekメソッドを使用する際は、必ず検索対象となるフィールドにはインデックスを作成しておく必要があります。
インデックスを作成することは、1つ以上のFieldオブジェクトを持つIndexオブジェクトを作成してIndexesコレクションに追加することになります。

Indexオブジェクトを作成するには、TableDefオブジェクトのCreateIndexメソッドを使用し、インデックスを構成するフィールドの作成は、IndexオブジェクトのCreateFieldメソッドを使用します。
オブジェクトのコレクションへの追加は、階層の低い方から順番に行います。また、IndexオブジェクトのCreateFieldメソッドは、TableDefオブジェクトのCreateFieldメソッドとは異なります。(引数が違う)そして、各コレクションにAppendメソッドを使用して追加して完了します。
◆ インデックスの作成手順
新規テーブル作成時にインデックスも作成する手順は以下の通りになります。
- テーブルの本体となるTableDefオブジェクトを作成する
- Fieldオブジェクトを作成する
- FieldオブジェクトをFieldsコレクションに追加する
- Indexオブジェクトを作成する
- インデックスを構成するFieldオブジェクトを作成する
- Fieldオブジェクトを、IndexオブジェクトのFieldコレクションに追加する
- IndexオブジェクトをTableDefオブジェクトのIndexesコレクションに追加する
- TableDefオブジェクトをTableDefsコレクションに追加する
- これ以降はNewAddメソッドなどを使用して、新規レコードを作成する
基本的には、Indexオブジェクトを作成した後に、Indexesコレクションに追加することになります。
《 記述例 》
先ほどのテーブル作成のプロシージャにインデックスを追加する記述は以下のようになります。
Sub テーブルとインデックス作成() On Error GoTo Error_go Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim flNo As DAO.Field Dim flName As DAO.Field Dim flPrice As DAO.Field Dim Idx As DAO.Index Set db = CurrentDb() Set tbdef = db.CreateTableDef("商品マスタ") Set flNo = tbdef.CreateField("No", dbText, 3) Set flName = tbdef.CreateField("商品名", dbText, 50) Set flPrice = tbdef.CreateField("単価", dbInteger) tbdef.Fields.Append flNo tbdef.Fields.Append flName tbdef.Fields.Append flPrice Set Idx = tbdef.CreateIndex("idx_No") Set flNo = Idx.CreateField("No") Idx.Fields.Append flNo tbdef.Indexes.Append Idx db.TableDefs.Append tbdef MsgBox "商品マスタテーブルが作成されました" db.Close: Set db = Nothing Exit Sub Error_go: If Err.Number = 3010 Then db.TableDefs.Delete "商品マスタ" Resume Else MsgBox Err.Number & ":" & Err.Description End If Exit Sub End Sub
動作を実行すると、「商品マスタ」テーブルが作成されます。そのテーブルをデザインビューで開き、インデックスを確認すると[No]フィールドにインデックスが設定されていることが確認できます。

クエリの作成
DAOでクエリを管理しているのは、QueryDefsコレクションになります。クエリを作成するには、このコレクションにQueryDefオブジェクトを追加することになります。

クエリの基になるテーブルがデータベースに存在しないとクエリは作成できません。そして、このテーブルを基にしてSQLを作成し、CreateQueryDefメソッドを使用してクエリを作成します。
テーブルと同様に、作成したオブジェクトをコレクションに追加する時は、階層の低い方から順番に行います。
◆ クエリの作成手順
- QueryDefオブジェクトを作成する
- QueryDefsコレクションに追加する
テーブル作成では、Appendメソッドを使用してオブジェクトをコレクションに追加しましたが、クエリではCreateQueryDefメソッドにクエリ名とSQLを引数すると、これを実行した段階で即座にQueryDefsコレクションに新規クエリが追加されます。
《 記述例 》
テーブル「T_商品リスト」を基にして、ID、商品名、そして単価(税抜)と表示させるクエリを作成するには次のように記述します。
Sub クエリ作成() On Error GoTo Error_go Dim db As DAO.Database Dim rs As DAO.Recordset Dim qryDef As DAO.QueryDef Dim mySQL As String Dim strData As String Set db = CurrentDb() mySQL = "SELECT ID,商品名,[単価] & '(税抜)'AS 税抜単価 FROM T_商品リスト;" Set qryDef = db.CreateQueryDef("", mySQL) Set rs = qryDef.OpenRecordset() Do Until rs.EOF strData = strData & vbNewLine & rs!ID & ":" & rs!商品名 & ":\" & rs!税抜単価 rs.MoveNext Loop MsgBox strData rs.Close: Set rs = Nothing db.Close: Set db = Nothing Exit Sub Error_go: MsgBox Err.Number & ":" & Err.Description Exit Sub End Sub
動作を確認すると、テーブルから3つのフィールドを取り出して、単価に税抜という文字を付加した結果を表示するメッセージとなります。

ここでは、CreateQueryDefメソッドでSQLを用いた一時的なクエリを作成しています。
これでDAOに関する紹介を終わります。コレクション、オブジェクト、メソッドは、いろいろとありますが、まずは基本的な操作の手順と階層構造を覚えていくことが大事です。また、Access2000、2002ではADOが初期設定となっています。DAOとADOの間には互換性がないので、DAOを利用する場合は必ず「参照設定」でDAOが使えるようにチェックを入れておいてください。