【入門編】QueryDefのSQLプロパティを動的に書き換える際の「構文エラー」をVBAで事前検知するバリデーター作成 – Access VBA解析バイブル

スポンサーリンク

【Access VBA】実行時エラーを撲滅せよ!動的SQLの「構文バリデーター」構築術

こんにちは。Accessの迷宮を探索する皆さんの道標として、今日は少し「玄人好み」の話をしましょう。

Accessでシステムを構築していると、必ずぶつかる壁があります。それは「動的にSQLを組み立てる」という行為です。画面の条件に合わせて`WHERE`句を変えたり、対象テーブルを切り替えたり。便利ですが、一文字のタイポ(打ち間違い)でシステム全体が停止するリスクを孕んでいますよね。

今日は、そのSQLを「実行する前」に、Access自身に「これ、文法的に正しい?」と問いかけるバリデーターの作り方を伝授します。

—

1. なぜ「実行時エラー」が起きるのか?

VBAで`QueryDef`を使ってSQLを書き換える時、多くの人はこう書きます。

‘ 悪い例:ただ文字列を繋いでいるだけ
qdf.SQL = “SELECT FROM T_売上 WHERE 年月 = ” & strDate

これ、一見動くようですが、`strDate`の中身が空だったり、予約語が含まれていたりすると、実行した瞬間に「構文エラー」でプログラムがクラッシュします。
「実行してみないと正しいか分からない」という状態は、プロの現場では許されません。

—

2. 構文バリデーターの核心:DAO.QueryDefの「テスト」能力

実はAccessのDAO(Data Access Objects)には、SQLを実際に実行せずに「構文チェックだけを行う」という隠れた(?)機能があります。それが`db.CreateQueryDef(“”, SQL文)`です。

このメソッドで一時的なクエリを作成しようとすると、もしSQLが間違っていれば、その瞬間にAccessがエラーを投げてくれます。 これを逆手に取るのです。

実装コード:SQLバリデーター関数

以下のコードを標準モジュールにコピーしてください。これがあなたの防波堤になります。

”’

”’ SQLの構文が正しいか事前にチェックする関数
”’

”’ チェックしたいSQL文字列 ”’ True:正しい / False:間違い
Public Function IsValidSQL(ByVal sqlText As String) As Boolean
Dim db As DAO.Database
Dim qdf As DAO.QueryDef

Set db = CurrentDb

On Error Resume Next ‘ エラーが発生しても止めない

‘ 名前を空文字にすることで、一時的なクエリとして評価させる
‘ これにより、DBに保存せずに構文チェックだけが走る
Set qdf = db.CreateQueryDef(“”, sqlText)

If Err.Number = 0 Then
‘ エラーなし=構文は正常
IsValidSQL = True
qdf.Close
Else
‘ エラーあり=構文不正
IsValidSQL = False
End If

On Error GoTo 0 ‘ エラー制御を元に戻す
End Function

—

3. このロジックの「凄み」を理解する

このコードのポイントは3つあります。

1. `db.CreateQueryDef(“”, sqlText)`:
第1引数を空文字にすることで、データベースウィンドウにゴミを残さず、メモリ上だけでSQLの解析処理を行わせています。非常に軽量でスマートな手法です。
2. `On Error Resume Next` の正しい使い方:
通常、エラーを無視するのは危険ですが、ここでは「構文が正しいか否かを知る」という目的のために、あえてエラーをキャッチしに行っています。
3. オブジェクトの解放:
`qdf.Close` を忘れずに行うことで、メモリリークを防いでいます。伝説のエンジニアは、たとえ一時的なオブジェクトであっても、使い終わったら必ず掃除をするものです。

—

4. 実践:バリデーターをどう組み込むか

実際の業務コードでは、以下のように活用します。

Public Sub UpdateQuerySample()
Dim mySQL As String
mySQL = “SELECT FROM T_売上 WHERE 担当者 = ‘田中'”

‘ 実行前にチェック!
If IsValidSQL(mySQL) Then
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs(“Q_MyQuery”)
qdf.SQL = mySQL
qdf.Close
MsgBox “更新成功!”
Else
MsgBox “SQLに構文エラーがあるようです。確認してください。”
End If
End Sub

—

最後に:一歩先のエンジニアへ

今回の手法を身につければ、もう「動かしてみるまで怖い」という感覚からは解放されます。

初心者のうちは「コードが動くこと」を目指しますが、中級者以上のエンジニアは「エラーが起きない仕組みを作ること」を考えます。このバリデーターは、あなたの作ったアプリケーションを「止まらないシステム」へと変える第一歩です。

まずは、あなたのプロジェクトにある動的SQLの箇所に、このバリデーターを差し込んでみてください。コードの品格が、グッと上がりますよ。

ここをクリアしたあなたは、もうAccess VBAの基礎をしっかりと掴んでいます。次はぜひ、パラメータークエリを使った、よりセキュアな設計に挑戦してみてくださいね!応援しています。

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