【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文字列
”’
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の基礎をしっかりと掴んでいます。次はぜひ、パラメータークエリを使った、よりセキュアな設計に挑戦してみてくださいね!応援しています。
