Access VBAを極める:DAO.QueryDefとADO.Commandの「賢い使い分け」でシステムを堅牢にする
こんにちは。業務自動化の世界へようこそ。
Accessで「もっと速く、もっと安全に」データを扱いたいと願うあなたへ、今回はDAO.QueryDefとADO.Commandという、二つの強力な武器の使い分けについてお話しします。
多くの初学者が「とりあえず動けばいい」とSQLを文字列結合で直書きしてしまい、後からバグや速度低下に苦しみます。この記事を読み終える頃には、あなたは「なぜそれを使うのか」を自信を持って語れるエンジニアの視点を得ているはずです。
—
1. DAO.QueryDef:Accessの「専用設計図」
DAO(Data Access Objects)は、Accessと一心同体です。`QueryDef`は、Accessの「クエリデザイン」画面で作ったクエリをVBAから操るためのオブジェクトです。
なぜDAO.QueryDefを使うのか?
- 高速性: Accessエンジンに最適化されているため、ローカルテーブルの操作において右に出るものはいません。
- 実行計画のキャッシュ: 一度コンパイルされたクエリはエンジン内で最適化され、実行速度が安定します。
実装のポイント:パラメータークエリ
SQLを文字列結合してはいけません(セキュリティリスクと構文エラーの元です)。`Parameters`コレクションを使いましょう。
‘ DAOによるクエリ実行の例
Sub RunQueryDef()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
‘ クエリ定義を取得
Set qdf = db.QueryDefs(“qry_売上集計”)
‘ パラメーターを安全にセット
qdf.Parameters(“[Forms]![frm_Main]![txtStartDate]”) = #2023/04/01#
‘ 結果をレコードセットとして開く
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
‘ … ここで処理 …
rs.Close: Set rs = Nothing: Set qdf = Nothing
End Sub
—
2. ADO.Command:外部世界への「汎用パスポート」
ADO(ActiveX Data Objects)は、Access以外のデータベース(SQL Server, Oracle, Azure等)と会話するための共通言語です。
なぜADO.Commandを使うのか?
- 汎用性: 接続先が変わってもコードの根本は変わりません。
- 高度な制御: トランザクション制御や非同期通信など、大規模システムに必要な機能を備えています。
実装のポイント:SQLインジェクション対策
外部DBと繋ぐ際、パラメータを`Command`オブジェクトに渡すことで、悪意のあるSQL注入を物理的にシャットアウトします。
‘ ADOによる外部DB接続とパラメーター利用
Sub RunADOCommand()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Set conn = New ADODB.Connection
conn.Open “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;Integrated Security=SSPI;”
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandText = “SELECT FROM Sales WHERE SalesDate >= ?”
.CommandType = adCmdText
‘ パラメーターを安全に追加(型を明示)
.Parameters.Append .CreateParameter(“Date”, adDate, adParamInput, , #2023/04/01#)
Dim rs As ADODB.Recordset
Set rs = .Execute
End With
‘ … 処理終了後クリーンアップ …
End Sub
—
3. どちらを使うべきか?判断基準の決定版
現場で迷わないための「判断チャート」を頭に入れておきましょう。
| 比較項目 | DAO.QueryDef | ADO.Command |
| :— | :— | :— |
| 主な用途 | Access内テーブル/クエリ操作 | 外部DB、SQL Server連携 |
| パフォーマンス | Access内なら最高速 | ネットワーク越しならこちら |
| 安全性 | パラメータ化で安全 | パラメータ化で安全 |
| 学習コスト | 低い(Access機能と直結) | やや高い(接続設定等が必要) |
結論:使い分けの極意
1. Access内のデータを触るなら、迷わずDAO.QueryDefです。標準機能の恩恵を最大限に受けられます。
2. 将来的にSQL Server等へ移行する予定がある、または外部システムと連携するなら、最初からADO.Commandを使いましょう。
—
最後に:エンジニアとしての心得
初学者が陥りやすい最大の罠は、「SQL文字列を`&`で繋ぎ合わせて生成すること」です。これはコードの可読性を下げ、セキュリティホールを量産します。
今回紹介した「パラメーター」を使う手法は、最初は少し手間だと感じるかもしれません。しかし、「入力値は信用しない」というプロの鉄則をコードに落とし込むことが、あなたの書くシステムを「ただのプログラム」から「堅牢な資産」へと変貌させます。
ここをクリアしたあなたは、もう初心者ではありません。次は、この知識を武器に、誰からも文句を言わせない美しいシステムを構築してください。応援しています!
