【入門編】QueryDefのSQLを「外部テキストファイル」で管理する:ソースコードとクエリの分離による保守性向上 – Access VBA解析バイブル

スポンサーリンク

こんにちは。Accessという巨大な迷宮を、よりスマートに、よりプロフェッショナルに攻略しようとしているあなたへ。

VBAのコードの中に、数行にも及ぶ複雑なSQL文を「文字列」として埋め込んでいませんか? そのやり方、今日で卒業しましょう。SQLをコードの中に書くのは、いわば「家の壁に直接マジックで家具の設計図を描く」ようなもの。修正のたびに壁を塗り直していては、メンテナンスなどできるはずもありません。

今日は、SQLを「外部テキストファイル」に追い出し、VBAから呼び出すという「ソースコードとロジックの分離」という、中級者への登竜門を解説します。

—

なぜ、SQLを「外部ファイル」に出す必要があるのか?

理由はたった一つ。「再コンパイルのコストをゼロにするため」です。

VBAのコード内にSQLを書くと、SQLを一文字修正するだけでプロジェクト全体をコンパイルし直す必要があります。しかし、テキストファイルであれば、メモ帳で中身を書き換えて保存するだけで完了です。

また、複雑なSQLをVBAの `””`(ダブルクォーテーション)で囲んで連結し続けるのは、読みづらいし、カンマやスペースのミスでバグを誘発する温床になります。外部ファイル化は、「保守性」という名の武器を手に入れる行為なのです。

—

1. 準備:SQLを格納するテキストファイルを作る

まず、Accessのデータベースファイルと同じフォルダに `sql` というフォルダを作り、その中に `GetSalesData.sql` というテキストファイルを作成してください。中身はシンプルなSQLで構いません。

GetSalesData.sql

SELECT ID, 商品名, 金額
FROM T_売上テーブル
WHERE 処理日 BETWEEN [開始日] AND [終了日]

—

2. 実装:VBAで外部ファイルを読み込み、QueryDefに流し込む

ここが核心です。VBAからこのファイルを読み込み、Accessの「クエリ定義(QueryDef)」としてSQLをセットするコードを書きます。

Public Sub UpdateQueryFromExternalFile()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim filePath As String
Dim sqlContent As String
Dim fileNum As Integer

‘ 1. SQLファイルのパスを指定
filePath = CurrentProject.Path & “\sql\GetSalesData.sql”

‘ 2. ファイルの中身を全読み込み
fileNum = FreeFile
Open filePath For Input As #fileNum
sqlContent = Input$(LOF(fileNum), fileNum)
Close #fileNum

‘ 3. クエリ定義の更新(存在しなければ作成)
Set db = CurrentDb
On Error Resume Next
Set qdf = db.QueryDefs(“qry_外部SQL”)
If Err.Number <> 0 Then
Set qdf = db.CreateQueryDef(“qry_外部SQL”)
End If
On Error GoTo 0

‘ 4. SQLをセットし、パラメータを設定可能にする
qdf.SQL = sqlContent
qdf.Close

MsgBox “クエリ定義を外部ファイルから更新しました。”, vbInformation
End Sub

—

3. 運用:パラメータークエリとして実行する

ここまで準備すれば、もうSQLを書き換える必要はありません。あとは、このクエリを呼び出す際にパラメータを渡すだけです。

Public Sub RunDynamicQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset

Set db = CurrentDb
Set qdf = db.QueryDefs(“qry_外部SQL”)

‘ パラメータを指定(クエリ内の[開始日]などに代入)
qdf.Parameters(“[開始日]”) = #2023/01/01#
qdf.Parameters(“[終了日]”) = #2023/12/31#

‘ 結果セットを開く
Set rs = qdf.OpenRecordset
‘ … ここで rs を使った処理を行う …

rs.Close
qdf.Close
End Sub

—

初学者が陥りやすい「落とし穴」

1. 文字コードの罠

VBAの `Open` ステートメントは、基本的に「Shift-JIS」を前提としています。もしSQLファイルに特殊文字(Unicode)が含まれる場合、文字化けします。必要に応じて `ADODB.Stream` オブジェクトを使ってUTF-8で読み込む工夫が必要です。

2. クエリ定義の「SQLプロパティ」の制約

`QueryDef.SQL` に代入する際、SQL内に `””` が含まれるとエラーになります。しかし、テキストファイルであればその心配はありません。ただし、SQLの構文ミスは `qdf.SQL = …` を実行した瞬間にエラーが出るため、必ずSQL単体でクエリビルダーでの動作確認を済ませておきましょう。

—

最後に:なぜ「伝説」を目指すのか

今回学んだ「ソースとロジックの分離」は、単なるテクニックではありません。「自分の書いたコードが、将来の自分や仲間にどう扱われるか」を想像するエンジニアの第一歩です。

SQLを外に出すことで、あなたは「Accessの画面でポチポチとクエリを編集する人」から、「SQLという資産を管理し、VBAというエンジンで駆動させるエンジニア」に進化しました。

この手法を極めれば、Accessの運用保守コストは劇的に下がります。ぜひ、あなたの現場の「長すぎるVBA」を整理することから始めてみてください。応援しています!

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