Access VBAを掌握せよ:QueryDefの「隠し属性」でクエリ管理を芸術の域へ
こんにちは。Accessの迷宮を攻略し、自動化の先にある「保守性の高いシステム」を目指すあなたへ。
これまで、クエリをただの「データ抽出ツール」として使っていませんでしたか? 「クエリ名が `クエリ1`、`クエリ2` と増え続け、何のためのSQLか誰も分からなくなる」……そんな泥沼に陥った経験があるなら、今日がその脱却の日です。
今回は、Accessの隠し芸である`QueryDef`オブジェクトのプロパティ活用術をお伝えします。ここをマスターすれば、Accessファイルは単なるデータベースから、自己管理能力を備えた「システム」へと進化します。
—
1. なぜ「隠し属性」が必要なのか?
Accessのクエリ(QueryDef)は、実はただSQLを保存するだけの箱ではありません。VBAからアクセスすることで、「メタデータ」を付与できる多機能な器になります。
例えば、`Description`(説明)プロパティや、ユーザー定義のプロパティを使えば、「このクエリは誰が作ったのか?」「どの処理で使われているのか?」といった情報を、クエリそのものに埋め込めるのです。
これにより、「このクエリを削除しても大丈夫?」という恐怖から解放されます。
—
2. 魔法のコード:Descriptionプロパティを操る
まずは、クエリに「説明文」をプログラムから注入する方法を見てみましょう。
Sub SetQueryDescription()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
‘ 対象のクエリを指定
Set qdf = db.QueryDefs(“qry_売上集計_2023”)
‘ Descriptionプロパティを設定(存在しない場合は作成して設定)
On Error Resume Next
qdf.Properties(“Description”) = “用途:月次売上レポート用 / 作成者:開発課 佐藤 / 最終更新:2023-10-27”
‘ もしプロパティ自体が存在しなければ新しく追加する
If Err.Number = 3270 Then
qdf.Properties.Append qdf.CreateProperty(“Description”, dbText, “初期設定値”)
qdf.Properties(“Description”) = “用途:月次売上レポート用…”
End If
On Error GoTo 0
Debug.Print “クエリの説明を更新しました。”
End Sub
【ここがポイント!】
- エラーハンドリング: プロパティが未定義の状態でアクセスするとエラーになります。`Err.Number = 3270`(プロパティが見つかりません)を捕捉して動的に作成するのが、ベテランの流儀です。
- メタデータの威力: これをやっておけば、後から「このクエリ、何だっけ?」となった際、コード一行で全クエリの用途を一覧出力するツールが作れます。
—
3. さらに上へ:カスタムプロパティで「管理」を自動化
`Description`だけでなく、独自の名前でプロパティを追加することも可能です。例えば「作成者」「バージョン」「重要度」など。
‘ 特定のカスタムプロパティを付与する関数
Sub AddCustomProperty(qdfName As String, propName As String, propValue As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs(qdfName)
On Error Resume Next
‘ プロパティの値を更新
qdf.Properties(propName) = propValue
‘ なければ追加
If Err.Number = 3270 Then
qdf.Properties.Append qdf.CreateProperty(propName, dbText, propValue)
End If
End Sub
これを活用すれば、「重要度:高」のクエリだけを抽出してバックアップする、なんていう自動管理ツールも夢ではありません。
—
4. 陥りやすい罠:クエリの「動的SQL」とパラメーター
QueryDefを使いこなす上で、避けて通れないのがパラメータークエリの動的生成です。よくある失敗は、毎回 `DoCmd.RunSQL` を使い、SQL文字列をベタ書きしてしまうこと。これは保守性の敵です。
正しい作法はこれです。
1. テンプレートとなるクエリ(QueryDef)を用意する。
2. `qdf.Parameters` を通じて値を流し込む。
Sub ExecuteDynamicQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs(“qry_売上抽出”)
‘ パラメーターに値をセット(SQLを文字列結合しないのがコツ!)
qdf.Parameters(“[Forms]![frm_Menu]![txt_StartDate]”) = #10/1/2023#
‘ クエリ実行
qdf.Execute dbFailOnError
Set qdf = Nothing
End Sub
【なぜこれが最強なのか?】
- SQLインジェクション対策: 文字列結合を避け、パラメーター経由にすることでセキュリティと安定性が飛躍的に向上します。
- コンパイルの効率: Accessはパラメーター化されたクエリの実行計画をキャッシュするため、実行速度が安定します。
—
まとめ:あなたはもう「ただのユーザー」ではない
今回紹介した技術は、Access VBAの「中級」から「上級」への登竜門です。
- Descriptionで履歴を管理する
- カスタムプロパティでメタデータを付与する
- パラメータークエリを正しく活用する
これらを守るだけで、あなたの書くAccessアプリケーションは、数年後もメンテナンス可能な「資産」に変わります。コードを書き終えたら、ぜひクエリのプロパティを覗いてみてください。そこにあなたのエンジニアとしての足跡が、美しく刻まれているはずです。
「ここが難しいな」と感じる部分があれば、いつでも聞いてください。焦らず、一歩ずつ、そのAccessの可能性を解き放っていきましょう!
