【入門編】複雑な抽出条件を「JSON形式」で保存し、QueryDefのパラメータに変換して実行する仕組み – Access VBA解析バイブル

スポンサーリンク

Access VBAを掌握する:JSONで操る「動的クエリ」の極意

こんにちは。現場で泥臭いシステム改修から、大規模なアーキテクチャ設計までを渡り歩いてきたエンジニアです。

Accessを使っていると、必ずぶつかる壁があります。「検索条件が増えるたびに、クエリを何個も作るの?」という非効率な悩みです。今日は、「JSONで検索条件を保持し、QueryDefでスマートに実行する」という、中級者へのステップアップに最適な技術を伝授します。

マクロの記録から脱却し、エンジニアとしての「設計力」を身につけましょう。

—

なぜ「JSON」と「QueryDef」なのか?

初心者のうちは、SQL文を文字列結合でガチガチに組み立てがちです。しかし、それでは「インジェクション攻撃」のリスクがあり、コードもスパゲッティ状態になります。

  • JSONの利点: 複雑な条件(期間、キーワード、カテゴリ等)を一つの文字列として構造化して保持できる。
  • QueryDefの利点: 「テンプレート(設計図)」としてクエリを保存し、パラメータだけを入れ替えるため、実行計画が最適化され、動作が高速になる。

これらを組み合わせることで、「検索ロジックと画面ロジックを完全に分離した、保守性の高いシステム」が完成します。

—

1. 検索条件のJSONイメージ

まずは、検索条件をどうJSONにするか。以下のような形式を想定します。

{
“customer_name”: “株式会社%”,
“start_date”: “2023-01-01”,
“min_price”: 1000
}

2. 実装のステップ:VBAでの解析と適用

Access標準ではJSON解析機能がないため、シンプルに`Split`や`Replace`で取り出すか、VBA-JSONライブラリ(`JsonConverter`)を使うのが定石ですが、今回は依存関係を最小限にするため、考え方の核となる部分を示します。

ステップ1:QueryDefのテンプレートを作る

まず、Accessのクエリデザイナで以下のようなSQLを保存しておきます。名前は `qsel_SearchData` としましょう。

PARAMETERS [p_name] Text(255), [p_date] DateTime, [p_price] Long;
SELECT FROM T_Sales
WHERE CustomerName LIKE [p_name]
AND SaleDate >= [p_date]
AND Price >= [p_price];

ステップ2:VBAでパラメータを注入する

ここが本日の心臓部です。

Public Sub ExecuteDynamicSearch(jsonString As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef

‘ 簡易的なJSON解析(本来はJsonConverter等を使用推奨)
‘ ここではデモのため、特定の値を取り出したと仮定します
Dim targetName As String: targetName = “株式会社%”
Dim targetDate As Date: targetDate = #1/1/2023#
Dim targetPrice As Long: targetPrice = 1000

Set db = CurrentDb
Set qdf = db.QueryDefs(“qsel_SearchData”)

‘ パラメータの注入(ここが重要!)
‘ 文字列結合でSQLを作るのではなく、定義済みクエリの引数を埋める
qdf.Parameters(“p_name”) = targetName
qdf.Parameters(“p_date”) = targetDate
qdf.Parameters(“p_price”) = targetPrice

‘ 実行して結果をフォームやレポートに渡す
DoCmd.OpenQuery “qsel_SearchData”

Set qdf = Nothing
Set db = Nothing
End Sub

—

3. 陥りやすいエラーと対策

初心者が現場でよくやる「失敗」を先回りして解説します。

1. データ型の不一致:

  • JSONはすべて「文字列」として扱われがちです。VBAに渡した際、`CDate()` や `CLng()` で明示的に型変換しないと、Accessは「型が一致しません」と悲鳴を上げます。

2. パラメータ名の不一致:

  • QueryDefで定義したパラメータ名と、VBA側で指定した名前が1文字でも違うとエラーになります。`PARAMETERS`句は必ず正確に書きましょう。

3. オブジェクトの解放忘れ:

  • `Set qdf = Nothing` を忘れると、メモリが徐々に食いつぶされます。小さなアプリなら問題ありませんが、長期稼働するシステムでは致命的です。

—

先輩エンジニアからのアドバイス

ここまでできれば、あなたはもう「Accessマクロを動かすだけの人」ではありません。

「検索条件をJSONで持っておけば、あとで画面の検索条件が増えても、VBAのロジックを変えずにJSONの項目を増やすだけで対応できる」――この拡張性への意識こそが、真のエンジニアへの第一歩です。

まずは、このコードをコピーして、ご自身の環境で `qsel_SearchData` を作るところから始めてみてください。何かわからないことがあれば、またいつでも聞きに来てくださいね。応援しています!

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