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` を作るところから始めてみてください。何かわからないことがあれば、またいつでも聞きに来てくださいね。応援しています!
