0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Access VBAにおけるADOとDAOの違い

Last updated at Posted at 2025-07-30

Microsoft Access では、VBAを用いてデータベースとやり取りする方法として「ADO(ActiveX Data Objects)」と「DAO(Data Access Objects)」の2つのライブラリを使用するやり方があります。それぞれの違いや使用シーンを正しく理解することで、より効率的な開発が可能になります。本記事では、ADOとDAOの違い、概要、使い分けのポイントを解説します。

補足:上記のライブラリを用いなくても DoCmdオブジェクト を利用して、ある程度データベース操作を行うことができます。
しかし、複数のレコードをレコード単位で条件分岐して更新を行うなど、細かなデータベース操作を行うには上記のライブラリを使用する必要があります。
さらに、ADOには、Access以外のデータベースを共通の方法で操作できるという大きなメリットがあります。

基本的な両者の違い

項目 DAO ADO
対象データベース Access向け 多様なDBに対応
主な用途 Accessアプリ内部処理 外部DB(SQL Serverなど)との接続
パフォーマンス Accessファイル内部に対して高速 外部接続やSQL処理で高速
接続方式 CurrentDbなどに直接接続 ConnectionStringを使用しOLE DB経由で接続

DAO(Data Access Objects)とは

DAOは、Microsoft Accessのネイティブなデータアクセスライブラリであり、JetエンジンやACE(Access Connectivity Engine)に最適化されたオブジェクトモデルです。

特徴

  • Access(.mdb/.accdb)に最適化されている

  • 速度が速い

  • データベース構造(テーブル、クエリ、インデックス)へのアクセスが容易

  • Access専用のオブジェクト(TableDef, QueryDefなど)が豊富

主なオブジェクト

  • Database / DAO.Database

  • Recordset / DAO.Recordset

  • TableDef, QueryDef

サンプルコード

Function SampleDao(val As Variant)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT * FROM 顧客", dbOpenSnapshot)

    Do While Not rs.EOF
        Debug.Print rs!氏名
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Function

ADO(ActiveX Data Object)とは

ADOは、OLE DBを利用した汎用的なデータアクセス技術です。SQL Server、Oracle、Excelファイルなど、様々なデータソースへのアクセスが可能です。

特徴

  • データソースに依存しない汎用性

  • クエリ実行や接続管理が柔軟

  • Access以外の外部DBとの接続に強い

  • コーディングスタイルが簡潔

主なオブジェクト

  • Recordset / ADODB.Recordset

  • Connection

  • Command

サンプルコード

Function SampleAdo(val As Variant)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\データ\sample.accdb;"

    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM 顧客", cn, adOpenStatic

    Do While Not rs.EOF
        Debug.Print rs.Fields("氏名").Value
        rs.MoveNext
    Loop

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Function

DAOとADOの使い分け

DAOを使うべきケース

  • Access のローカルデータベースを操作する場合

  • フォームやレポートのデータ操作が中心

  • テーブルやクエリの構造を操作したい場合

ADOを使うべきケース

  • SQL ServerやOracleなど外部DBと接続する場合

  • ExcelやCSVなどの外部ファイルをADO経由で扱う場合

  • 複数のデータソースを統合するアプリケーションを開発する場合

使い分け一覧表

状況 推奨
Access単体で開発 DAO
外部DB(SQL Serverなど)と接続 ADO
複数のDBを切り替える ADO(柔軟性高)
Access内部の高速処理 DAO(軽量で高速)

ADOとDAOの同時使用時の注意点

2つのライブラリを同じシステムで同時に使う場合は、Recordsetなど同じ名前のオブジェクトが数多く存在するので、その場合は完全修飾名を使い明示的に宣言する必要があります(例:DAO.Recordset, ADODB.Recordset)。

もし、Dim RS As Recordset のように完全修飾名を用いずに記述してしまうと、参照設定で優先順位が上位にあるオブジェクトライブラリの、Recordsetオブジェクトとして認識されます。優先順位は、「参照設定」ダイアログボックスのリストボックスで、上にあるライブラリファイルほど優先して参照されます。

どちらのオブジェクトであるかを明示的に宣言するには、以下のように記述します。

Dim RS As ADODB.Recordset

または

Dim RS As DAO.Recordset

オブジェクト名の前に「ADODB」と記述されたオブジェクトはADOのオブジェクト、「DAO」と記述されたオブジェクトはDAOのオブジェクトとして認識されます。

まとめ

ADOは、Accessに限らず、Microsoft SQL Serverなどの外部のデータベースに接続できる汎用性のあるオブジェクトを提供し、データベースの種類が異なっても同じ手法でレコードを操作できるという利点があります。レコード操作の他にトランザクションの管理など行うことができますが、テーブルやクエリを作成する機能はなく、その場合はADOXというADOの拡張機能を別途使用する必要があります。

DAOは、Jetデータベースエンジンに直接接続するため、単体のAccessシステムを操作するケースに適しています。また、DAOにはテーブルやクエリを作成する機能があります。その他、レコードセットの操作やトランザクションの管理など、ADOで行うことのできる処理の多くを実行することが可能です。

Accessでの開発効率を上げるためにも、両者の特性を理解し、場面ごとに最適な技術を選択することが重要です。

参考文献

  • VBA エキスパート 公式テキスト 「Access VBA スタンダード」 武藤 玄
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?