【入門編】DAOとADOの使い分け:ローカルテーブル操作と外部DB連携の最適解 – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へようこそ:DAOとADOを使い分ける「極意」

こんにちは。Accessという広大な庭を管理するエンジニアの皆さん。
「Accessを使っているけれど、DAOやADOといった用語で混乱している」「なんとなくコードをコピペしているけれど、なぜ使い分ける必要があるのかわからない」……そんな悩みを持っていませんか?

今日は、Access VBAというエンジニアの登竜門において、「なぜDAOとADOが存在し、どう使い分けるのが正解なのか」という本質についてお話しします。ここを理解すれば、あなたのコードは劇的に速く、そして壊れにくくなります。

—

1. DAOとADO:二つの「橋」の役割

Accessには、データを操るための「道具」が2種類あります。

  • DAO (Data Access Objects): Accessという「お城」の専属執事。Accessの内部テーブルを操作するのに特化しており、空気のように軽く、速い。
  • ADO (ActiveX Data Objects): 外部の「異国」と繋がるための外交官。SQL ServerやExcelなど、Access以外の外部データベースと対話する際に真価を発揮します。

なぜ「DAOは内部、ADOは外部」なのか?

DAOはAccessのエンジン(ACE/Jet)と直接対話します。いわば「身内」なので、オーバーヘッド(無駄な処理)が極めて少なく、ローカルテーブルの操作においては圧倒的な速度を誇ります。
一方、ADOは汎用的な規格(OLE DB)を使って繋がるため、柔軟性は高いですが、ローカルテーブルに対しては「わざわざ遠回りしている」状態になり、効率が悪くなるのです。

—

2. 実践:ローカルテーブル操作(DAO)

まずは、Access内のテーブルにデータを書き込むコードを見てみましょう。DAOを使うのが鉄則です。

Sub UpdateLocalTable()
‘ DAOのライブラリ(Microsoft Office XX.X Access database engine Object Library)が必要
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb ‘ 現在のAccessデータベースを指す

‘ テーブルを「編集可能」な形式で開く
Set rs = db.OpenRecordset(“T_売上明細”, dbOpenDynaset)

rs.AddNew ‘ 新規レコードの作成
rs!商品名 = “最高級キーボード”
rs!単価 = 25000
rs.Update ‘ 変更を確定(これがないと保存されません)

‘ 資源の解放はプロの義務。必ず閉じてメモリを空にする
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

ここがポイント:
`rs.Update`を忘れると、苦労して書いたデータは消えてしまいます。また、最後に`Nothing`を代入してメモリを解放するのは、Accessを軽快に保つための「大人のマナー」です。

—

3. 実践:SQL Server連携(ADO)

次に、SQL Serverなどの外部DBへ接続するコードです。ここではADOを使います。

Sub ConnectToServer()
‘ ADOのライブラリ(Microsoft ActiveX Data Objects X.X Library)が必要
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String

Set conn = New ADODB.Connection
‘ 接続文字列:サーバー名やデータベース名を指定
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;Integrated Security=SSPI;”
conn.Open

strSQL = “SELECT FROM T_ServerTable WHERE 状態 = ‘未処理'”

Set rs = New ADODB.Recordset
rs.Open strSQL, conn, adOpenStatic, adLockReadOnly

‘ データを取得してイミディエイトウィンドウに表示
If Not rs.EOF Then
Debug.Print rs!顧客名
End If

‘ 後処理:開いた順序と逆順で閉じるのが鉄則
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub

ここがポイント:
外部通信はネットワークの不調などで失敗することがあります。実務では、必ず`On Error GoTo`でエラーハンドリングを行い、接続が切れたら適切にメッセージを出す仕組みを組み込んでください。

—

4. トランザクション処理:データを守る「魔法の枠組み」

どちらを使うにしても、複数のデータを操作する際は「トランザクション」が必須です。
「Aさんの残高を減らしたけど、Bさんの入金処理でエラーになった」という事態を防ぐための、「全部成功か、全部無効か」を制御する仕組みです。

‘ DAOでの例
db.BeginTrans
‘ 複数の処理
‘ もしエラーが発生したら…
‘ db.Rollback (全部取り消す)
‘ 正常終了なら…
‘ db.CommitTrans (全部確定する)

—

最後に:なぜこれを知る必要があるのか

初学者のうちは「動けばいい」と考えがちです。しかし、DAOとADOの使い分けを意識するだけで、あなたのツールは「重くて落ちるツール」から「高速で安定した業務基盤」に生まれ変わります。

  • ローカルならDAO: 執事を呼ぶ。
  • 外部ならADO: 外交官を呼ぶ。

このシンプルなルールを胸に、ぜひ今日の業務からコードを書き換えてみてください。あなたが書くその1行が、明日誰かの業務時間を劇的に短縮するかもしれないのですから。

また何か壁にぶつかったら、いつでもここへ戻ってきてください。応援していますよ!

タイトルとURLをコピーしました