以下では、「VBAでDAO vs ADO:両者の違いと使い分けのガイド」をテーマに、Microsoft Accessで利用される2つのデータアクセスオブジェクト(DAOとADO)の特徴や長所・短所を整理します。Access初心者は「どっちを使えばいいの?」と迷う場面が多いため、業務シナリオや接続先DBに応じて適切な手法を選ぶためのポイントを紹介します。
1. DAOとADOの概要
1.1 DAO (Data Access Objects)
Accessに深く組み込まれた 伝統的なオブジェクトモデル
Accessのネイティブエンジン(Jet/ACE)と相性が良く、ローカルテーブル(.accdb/.mdb)を操作する際に最適
CurrentDb や DBEngine といったキーワードで始まるオブジェクト操作が代表的
SQL Serverや他DBへのリンクテーブル操作も一応できるが、本来はAccessのデータベースを扱うため に設計された
メリット
Accessとの親和性が高く、ローカルテーブル やクエリ 処理が簡潔
軽量で、VBAとの組み合わせ においてサンプルが豊富
オブジェクト階層(Database → Recordset → Field )が分かりやすい
デメリット
DAO単体 で外部DB(特に非Jet)に直接接続するのは得意でない (リンクテーブルを介する形が多い)
ODBC直結できるが、ADOに比べ拡張性やパラメータ処理機能が限られる
Microsoftの公式推奨は、Access(ACE)にはDAO、他DBにはADO が基本
1.2 ADO (ActiveX Data Objects)
汎用的なデータアクセス技術 で、OLE DBプロバイダを通じてSQL Server, Oracle, MySQL などに直接接続可能
ADODB.Connection , ADODB.Recordset などオブジェクトを生成して操作
Access以外のVBA(Excel, Word)やVB6/VBScriptでも共通的に使われるため、広い互換性 が特徴
メリット
主要DBMS(SQL Server, Oracle, MySQL, PostgreSQL等)に直接接続 しやすい
パラメータクエリ(cmd.Parameters.Append
)など安全なSQL実行 をしやすい
ステートメントレベルのトランザクション や高度な機能(プロパティ設定)を活用可能
デメリット
Access固有の機能 (ローカルテーブルの情報やクエリ定義)との親和性が低い
DAOほどAccess内のオブジェクト (CurrentDb, Linked Tableなど)と簡単に連携できない
学習コスト:ADOは汎用性が高い分、設定プロパティが豊富で初心者はとっつきにくい
2. 主な違いのまとめ表
項目 DAO ADO 本来の用途 AccessのJet/ACEエンジン操作 汎用DB接続(ODBC/ OLE DB) Accessとの親和性 高 (CurrentDb 等でローカルDB操作) 低 (ローカルテーブル直接操作は苦手) リンクテーブル(ODBC先) 可能だが設定が少ない ADO.Connection で直接接続 パラメータ化クエリ DAO.QueryDef.Parameters ADODB.Command.Parameters 初心者向け ローカルDB操作なら簡単 外部DB操作ならこちら推奨 大規模DB操作 SQL Server等へのリンクで可能 直接サーバーと通信、設定柔軟 VB, Excelなど他環境 Access専用傾向が強い Office全般・VBScriptなどでも共通利用 バージョン/レガシー状況 Accessで引き続き推奨(ACE) MDAC/ADOは継続だが.NetADOへ移行の波
3. 使い分けガイド
3.1 DAOを使うシナリオ
Accessファイル内のテーブル、クエリ を操作する主な業務
例:Set db = CurrentDb : Set rs = db.OpenRecordset("tbl顧客")
ローカルフォームで入力されたデータをすぐINSERT/UPDATE
DAOのRecordset
でレコード移動→編集→Update する操作がシンプル
リンクテーブル を通してSQL Serverなどを扱う場合も、基本はDAOで事足りる(ただしパフォーマンスやパラメータクエリに限界がある)
3.2 ADOを使うシナリオ
SQL ServerやOracle, MySQL等に直接接続
DSNレス接続文字列でcn.Open "Provider=SQLOLEDB;..."
など
ストアドプロシージャ 呼び出しやパラメータ化 されたクエリを柔軟に実行
cmd.Parameters.Append cmd.CreateParameter(...)
Excel/Wordなど他のOfficeアプリ やVBScript でも同じような形で使えるため、汎用性 が高い
詳細な接続プロパティ (Timeout, CursorLocation, LockTypeなど)を制御する必要がある場合
4. 実装コード例:DAOとADOの比較
4.1 DAOでローカルテーブル読み書き
Public Sub DAO_Example() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("tbl顧客", dbOpenDynaset) ' レコード移動 + 読み取り rs.MoveFirst Debug.Print rs!顧客名 ' 新規レコード追加 rs.AddNew rs!顧客名 = "新顧客" rs!住所 = "東京都..." rs.Update rs.Close Set rs = Nothing Set db = Nothing End Sub
シンプルにOpenRecordset
でAccessテーブルを操作。Accessの内部DB に最適
4.2 ADOでSQL Serverに直接接続
Public Sub ADO_Example() Dim cn As Object ' ADODB.Connection Dim rs As Object ' ADODB.Recordset Dim strConn As String ' DSNレス接続例 (SQL Server) strConn = "Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=MyDB;" & _ "User ID=sa;Password=xxx;" Set cn = CreateObject("ADODB.Connection") cn.Open strConn Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT 顧客ID, 顧客名 FROM dbo.顧客", cn, 1, 3 ' adOpenKeyset, adLockOptimistic Do Until rs.EOF Debug.Print rs("顧客ID"), rs("顧客名") rs.MoveNext Loop rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
SQL Server へ直に接続し、Recordset を取得
ローカルAccessテーブルではなく、サーバーDB を対象に自由にSQLを発行可能
5. 注意点:ADOとDAOの混在使用
Accessアプリ内でDAO はローカルテーブル用、ADO はSQL Server用というふうに併用することはあり得る
ただしDAO.Recordset とADODB.Recordset は異なる型 なので代入互換性がない
「OpenRecordset」のシンタックスも微妙に違うため、同じコード で両方やろうとすると混乱しがち
一般に1つのプロジェクト では、ローカルエンジン操作はDAO、外部DBはADOと割り切る方が保守しやすい
6. エラー処理とパフォーマンス面】
DAO
Accessフォームでのバインドがスムーズ。CurrentDb などが簡単
ただし大規模アクセスや複雑JOINは苦手 → リンクテーブルに頼る、あるいはSQL Server移行
ADO
レコードセットをサーバー側で処理させ、CursorTypeやLockTypeを細かく設定可能
パラメータクエリ でSQLインジェクションを防ぎ、パフォーマンスを上げられる
イベントやプロパティが豊富で大量データ にも対応しやすい
7. まとめ:VBAでDAO vs ADOの使い分け
DAO :
Access(ACE/Jet)ローカルテーブル やクエリを操作する場合にシンプル・高速
フォーム/レポートのバインドやリンクテーブルを扱う場合にも基本はDAO
ADO :
外部DB接続 (SQL Server, Oracle, MySQL等)に強い
パラメータ化クエリ やストアドプロシージャ を呼び出す場面で真価を発揮
混在 :
小規模だが一部データはSQL Serverから取得 → DAOでローカル操作、ADOでサーバー操作を切り替えることも
設計を明確にし、違いを理解したうえで使い分ける
AccessのVBAでは、DAO がネイティブ でAccess固有 の操作に向き、ADO は汎用DB接続 に向くのが大きな特徴です。業務要件に合わせて適切な手法を選択・組み合わせし、スムーズで安定したデータアクセス を実現していきましょう。
関連記事
本記事を参考に、「ローカルならDAO」 「外部DBならADO 」という基本方針を把握しつつ、自分のアプリ に合ったベストプラクティス を探ってみてください。
ABOUT ME
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。
ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。
元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。
みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。
月30万の高配当投資も行っています。最新の銘柄情報もお届けしていきます。