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行が、明日誰かの業務時間を劇的に短縮するかもしれないのですから。
また何か壁にぶつかったら、いつでもここへ戻ってきてください。応援していますよ!
