【入門編】動的SQLのデバッグを効率化する「SQL出力ログ」の自動生成ツール – Access VBA解析バイブル

スポンサーリンク

こんにちは!Access VBAの海原へようこそ。
マクロの記録ボタン頼みだった日々から抜け出し、「自分の手でシステムをコントロールしたい!」と一歩を踏み出したあなたへ。

今回は、Access開発の現場で避けて通れない「動くSQLの組み立て」、そしてその最大の壁である「あれ?なんで動かないの?」を秒速で解決する極意をお伝えします。

ここをクリアすれば、エラーメッセージに怯える必要はもうありません。優しく、そして本質的なテクニックを一緒に紐解いていきましょう!

—

1. なぜ動的SQLのデバッグはこれほど難しいのか?

Access VBAでフォームの入力内容に合わせて、WHERE句やJOIN句をカチャカチャと組み立てる「動的SQL」。非常に強力ですが、初学者の多くがこんな壁にぶつかります。

  • 「構文エラーです」と言われるけれど、どこが間違っているのか分からない。
  • 変数(`strName` など)を埋め込んだつもりが、文字列のクォーテーション(`’`)が抜けていて大惨事。
  • イミディエイトウィンドウに出力してみても、長すぎて全体像が見えない。

動かないSQLと格闘して、気づけば1時間が経過していた……なんて経験はありませんか?

この苦しみを根本から断ち切るためにプロの現場で使われているのが、「SQL出力ログの自動生成ツール(関数)」です。

—

2. 魔法のデバッグ関数:`DebugPrintSQL` の全貌

複雑な文字列結合職人になる必要はありません。生成されたSQLを「一発で綺麗な形にして、いつでも確認できるようにする」専用の関数を、あなたのVBAの武器庫に加えましょう。

以下のコードを、標準モジュールにそのまま貼り付けてみてください。

Option Compare Database
Option Explicit

‘ =========================================================================
‘ 模範的アーキテクトが贈る:動的SQLデバッグ&実行支援モジュール
‘ =========================================================================

Public Sub ExecuteDynamicQuerySample()
‘ — 【シチュエーション】 —
‘ 画面の検索条件(テキストボックス等)から値を受け取ったと仮定
Dim inputKeyword As String
Dim inputStatus As Integer

inputKeyword = “鈴木”
inputStatus = 1

‘ — 【SQLの動的構築】 —
Dim sql As String
sql = “SELECT FROM T_Employees ” & _
“WHERE DeleteFlg = 0 ”

‘ キーワードが入力されている場合のみ条件を追加
If inputKeyword <> “” Then
‘ ※文字列型はシングルクォーテーションで囲むのが鉄則!
sql = sql & “AND EmployeeName LIKE ‘%” & inputKeyword & “%’ ”
End If

‘ ステータス条件の追加
sql = sql & “AND StatusID = ” & inputStatus & ” ”

‘ =====================================================================
‘ ★ ここが本日のハイライト:SQL出力ログの自動生成
‘ =====================================================================
Call WriteSqlLog(sql, “社員検索クエリ”)

‘ — 【QueryDefを使った安全な実行への布石】 —
‘ ここで実際にQueryDefオブジェクトにSQLを流し込んだり、
‘ CurrentDb.OpenRecordset(sql) を実行することになります。

MsgBox “SQLのログ出力が完了しました!イミディエイトウィンドウを確認してください。”, vbInformation, “成功”
End Sub

‘ =========================================================================
‘ 【共通関数】SQLを整形してイミディエイトウィンドウとファイルに出力する
‘ =========================================================================
Public Sub WriteSqlLog(ByVal targetSql As String, Optional ByVal logTitle As String = “SQL Log”)

Dim fso As Object
Dim ts As Object
Dim logFilePath As String
Dim formattedTime As String

formattedTime = Format(Now, “yyyy-mm-dd hh:nn:ss”)

‘ 1. イミディエイトウィンドウへの出力(視認性を高める装飾付き)
Debug.Print “==================================================”
Debug.Print ” 【” & logTitle & “】 出力日時: ” & formattedTime
Debug.Print “==================================================”
Debug.Print targetSql
Debug.Print “==================================================”
Debug.Print “” ‘ 空行

‘ 2. さらに確実な記録として、デスクトップのテキストファイルに自動保存する
On Error GoTo ErrorHandler
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 保存先:デスクトップに「AccessSqlLog.txt」というファイルを作る
logFilePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\AccessSqlLog.txt”

‘ 存在しない場合は新規作成、存在する場合は追記(ForAppending = 8)
Set ts = fso.OpenTextFile(logFilePath, 8, True)

ts.WriteLine “————————————————–”
ts.WriteLine “[” & logTitle & “] ” & formattedTime
ts.WriteLine targetSql
ts.WriteLine “————————————————–”
ts.WriteLine “”
ts.Close

Set ts = Nothing
Set fso = Nothing
Exit Sub

ErrorHandler:
‘ ログ出力の失敗でメインの処理を止めないためのフェイルセーフ
Debug.Print “※ログファイルへの書き込みに失敗しました: ” & Err.Description
End Sub

—

3. コードの意味を噛み砕く:ここがポイント!

上記のコードで、初学者のあなたが「おっ!」と気づいてほしいポイントを3つに絞って解説します。

① 文字列結合の罠を防ぐスペース(`& _` と `” “`)

SQLを複数行に分けるとき、行の末尾に半角スペース(`”WHERE DeleteFlg = 0 “` のように後ろ側)を入れていますか?
これがないと、VBAが結合したときに `WHERE DeleteFlg = 0AND…` のように単語がくっついてしまい、一発で構文エラーになります。ログ出力機能があれば、この「スペース抜け」が一目瞭然になります。

② イミディエイトウィンドウを「作品のキャンバス」にする

`Debug.Print` は単なる文字出力ではありません。上下に `=====` の罫線を引くことで、大量のログの中に埋もれてしまっても、「あ、これが今実行したSQLだ!」と瞬時に視認できるようになります。

③ エラーで落ちない「フェイルセーフ」なファイル出力

ログを残そうとして、ファイルが開かれていたためにエラーでプログラム全体が止まったら本末転倒です。`On Error GoTo ErrorHandler` を仕込み、「ログ書き込みに失敗しても、システムの業務は止めない」というプロの気配りを実装しています。

—

4. ありがちなエラーと、その鮮やかな処方箋

動的SQLを書く上で、必ずと言っていいほど直面するエラーと対策をまとめておきます。

  • エラー例:型が一致しません(実行時エラー 13)
  • 原因: 数値型のフィールドに対して、文字列型の変数や空っぽのデータをそのまま結合してしまっている。
  • 対策: `Nz(inputStatus, 0)` などを使って、Nullを安全なデフォルト値に変換してからSQLに組み込みましょう。
  • エラー例:構文エラー (演算子が見つかりません)…
  • 原因: 文字列変数(例: `鈴木’s Bar` など、シングルクォーテーションが含まれる場合)がそのままSQLに組み込まれ、SQLの構文がバグっている。
  • 対策: 出力されたログ(`AccessSqlLog.txt`)をコピーして、そのままAccessの「クエリデザイン(SQLビュー)」に貼り付けて実行してみてください。Access自身が「このあたりの文法がおかしいよ」とピンポイントで教えてくれます。

—

まとめ:ここをクリアすれば、Access VBAはバッチリ!

動的SQLのデバッグは、いわば「暗闇の中を手探りで歩くようなもの」です。しかし、今回紹介したような「自分専用のライト(SQL出力ログ自動生成ツール)」を一つ持っておくことで、暗闇は一瞬で明るい開発ルームに変わります。

「エラーが出たら、まずはログを見る」
この習慣が身についた瞬間から、あなたはもう初学者ではありません。自信を持って、より高度なデータベース設計へと進んでください。

あなたのAccessライフが、より快適でクリエイティブなものになりますように!

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