【入門編】QueryDefの「隠し属性」を活用したシステム管理術 – Access VBA解析バイブル

スポンサーリンク

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の可能性を解き放っていきましょう!

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