Access VBAを掌握せよ:DAOとADOXを融合させた「テーブル構造の完全同期」エンジンの構築
こんにちは。Accessという広大な海を渡る皆さんの船を、より速く、より頑丈にするためのガイド役です。
Access開発において、避けて通れないのが「本番環境と開発環境のズレ」という悪夢です。開発中にフィールドを一つ増やしただけで、現場のPCではエラーの嵐……なんて経験はありませんか?
今回は、DAOの「圧倒的な速度」と、ADOXの「柔軟な構造操作」を掛け合わせ、テーブル定義を自動で同期する「完全同期エンジン」の設計思想を伝授します。これさえ理解すれば、Access開発のレベルは一気に「プロフェッショナル」の領域へ押し上げられます。
—
1. なぜDAOとADOXを使い分けるのか?
Accessには「テーブルを触る」ための2つの強力な武器があります。
- DAO (Data Access Objects): Accessの心臓部。ネイティブなため「読み取り」が爆速。しかし、テーブル定義の細かな変更(インデックスの追加や外部キー制約など)は少し苦手。
- ADOX (Microsoft ADO Ext. for DDL and Security): データベースの「設計図」を書き換えるための言語。テーブルや列の追加・削除といった「DDL(データ定義言語)」操作において極めて柔軟。
「読むのはDAO、書く(変える)のはADOX」。これが、トラブルを最小限に抑える最強の黄金律です。
—
2. テーブル同期エンジンの心臓部:コード実装
以下のコードは、開発元となる「マスタDB」のテーブル定義を調べ、実行環境のテーブルと比較して不足しているフィールドを自動で追加する同期エンジンの骨子です。
‘ 必要な参照設定: Microsoft DAO 3.6 Object Library / Microsoft ADO Ext. x.x for DDL and Security
Sub SyncTableStructure(strSourceDB As String, strTargetDB As String, strTableName As String)
Dim dbSource As DAO.Database, dbTarget As DAO.Database
Dim tblSource As DAO.TableDef, tblTarget As DAO.TableDef
Dim fld As DAO.Field
Dim cat As New ADOX.Catalog
Dim col As New ADOX.Column
‘ 1. DAOで高速に構造を読み取る
Set dbSource = DBEngine.OpenDatabase(strSourceDB)
Set dbTarget = DBEngine.OpenDatabase(strTargetDB)
Set tblSource = dbSource.TableDefs(strTableName)
Set tblTarget = dbTarget.TableDefs(strTableName)
‘ 2. ADOXの準備(接続先をターゲットDBに設定)
cat.ActiveConnection = dbTarget.Connection
‘ 3. フィールドの比較と同期
For Each fld In tblSource.Fields
‘ ターゲット側にフィールドが存在するかチェック
If Not FieldExists(tblTarget, fld.Name) Then
Debug.Print “フィールド追加中: ” & fld.Name
‘ ADOXでフィールド定義を構築
col.Name = fld.Name
col.Type = fld.Type ‘ データ型の同期
‘ フィールド追加を実行
cat.Tables(strTableName).Columns.Append col
End If
Next fld
‘ 終了処理(リソースの解放は職人の嗜み)
dbSource.Close: dbTarget.Close
Set cat = Nothing
End Sub
‘ フィールドの存在確認用ヘルパー関数
Function FieldExists(tdf As DAO.TableDef, strFieldName As String) As Boolean
Dim f As DAO.Field
For Each f In tdf.Fields
If f.Name = strFieldName Then FieldExists = True: Exit Function
Next
End Function
—
3. ここをクリアすれば一人前!陥りやすいエラーの正体
このコードを実装する際、初心者が必ずと言っていいほど躓くのが以下の2点です。
① 参照設定の壁
ADOXを使うには、VBAエディタの「ツール」→「参照設定」から 「Microsoft ADO Ext. 2.8 for DDL and Security」 にチェックを入れる必要があります。これがないと「ユーザー定義型は定義されていません」というエラーで止まります。
② テーブルのロック
同期中にテーブルがフォーム等で開かれていると、構造変更は拒絶されます。同期処理の前には必ず `DoCmd.CloseDatabase` やフォームのクローズ処理を噛ませ、「誰もそのテーブルに触れていない状態」を強制的に作るのが、現場で生き残るエンジニアの作法です。
—
4. 最後に:プロフェッショナルへの道
今回のコードは「フィールドの追加」に特化していますが、応用すれば「インデックスの同期」や「リレーションシップの再構築」まで自動化可能です。
「マクロの記録」ボタンに頼る段階を卒業し、自分の手でDAOやADOXを操れるようになると、Accessは単なる「事務用ソフト」から、「高速な業務アプリケーション基盤」へと変貌します。
ここを理解できた皆さんは、もう立派な自動化エンジニアの卵です。恐れずにコードを書き換え、自分の業務を自分自身でハックしてください。応援しています!
