【入門編】DAO.QueryDefのSQLプロパティを動的生成する際の「文字列連結」を劇的に簡素化するヘルパークラスの設計 – Access VBA解析バイブル

スポンサーリンク

Access VBAの「文字列連結地獄」から脱出せよ:QueryDefを操るための「SQLビルダー」設計術

こんにちは。Accessの泥沼のようなコードに頭を抱えていませんか?

「マクロの記録」から卒業し、DAO(Data Access Objects)を使って`QueryDef`を操作し始めると、誰もが一度は遭遇する壁があります。それが「SQL文字列連結の迷宮」です。

‘ よくある悲劇のコード
strSQL = “SELECT FROM T_売上 WHERE 商品ID = ” & Me.txtID & ” AND 日付 BETWEEN #” & Me.txtStart & “# AND #” & Me.txtEnd & “#”

これ、一見動くように見えますが、日付の形式エラー、引用符の付け忘れ、改行が見にくいことによるデバッグの困難さ……。現場レベルでは「爆弾」以外の何物でもありません。

今日は、この煩雑な文字列連結をスマートに解決し、あなたのコードを「読みやすく、壊れにくい」ものに変える「SQLビルダー・クラス」の設計術を伝授します。

—

なぜ「文字列連結」がダメなのか?

1. 可読性の崩壊: クエリが長くなればなるほど、どこで`”`が閉じているのか分からなくなります。
2. セキュリティリスク: ユーザー入力をそのまま連結すると、SQLインジェクションの脆弱性が生まれます(※Accessファイル内完結なら限定的ですが、作法として悪いです)。
3. 保守性の欠如: 条件を一つ追加するだけで、全体の連結ロジックを書き直す羽目になります。

これらを一気に解決するのが、「SQLをパーツとして管理し、最後に結合する」というアプローチです。

—

魔法のヘルパークラス:`SqlBuilder` を作る

VBAのクラスモジュール(名前を `SqlBuilder` としてください)に、以下のコードを貼り付けてみてください。

‘ クラスモジュール: SqlBuilder
Option Compare Database
Option Explicit

Private m_Select As String
Private m_From As String
Private m_Where As Collection

Private Sub Class_Initialize()
Set m_Where = New Collection
End Sub

Public Sub SetSelect(sql As String)
m_Select = sql
End Sub

Public Sub SetFrom(sql As String)
m_From = sql
End Sub

‘ 条件をリストに追加していく(これが魔法の鍵)
Public Sub AddWhere(condition As String)
m_Where.Add condition
End Sub

‘ 最終的なSQLを生成
Public Function Build() As String
Dim sql As String
sql = “SELECT ” & m_Select & ” FROM ” & m_From

If m_Where.Count > 0 Then
sql = sql & ” WHERE ”
Dim i As Integer
For i = 1 To m_Where.Count
sql = sql & m_Where(i)
If i < m_Where.Count Then sql = sql & " AND " Next i End If Build = sql End Function ---

実践:このクラスをどう使うのか?

このクラスを使えば、先ほどの「地獄の連結」がこう変わります。

Sub UpdateQuery()
Dim builder As New SqlBuilder
Dim qdf As DAO.QueryDef

‘ SQLをパーツごとに設定
builder.SetSelect “”
builder.SetFrom “T_売上”

‘ 条件を次々に追加(可読性が段違い!)
builder.AddWhere “商品ID = ” & Me.txtID
builder.AddWhere “日付 >= #” & Format(Me.txtStart, “yyyy/mm/dd”) & “#”
builder.AddWhere “日付 <= #" & Format(Me.txtEnd, "yyyy/mm/dd") & "#" ' QueryDefに適用 Set qdf = CurrentDb.QueryDefs("Q_動的抽出") qdf.SQL = builder.Build qdf.Close MsgBox "クエリを更新しました!" End Sub ---

ここをクリアすれば、あなたは中級者!

この設計の素晴らしい点は、以下の3点に集約されます。

1. 条件の独立性: `AddWhere` を使っているので、条件の増減が非常に簡単です。`If`文で分岐して「特定のチェックボックスが入っている時だけ条件を追加する」といった制御が劇的に楽になります。
2. フォーマットの責任分担: 日付のフォーマット変換を呼び出し側で行うことで、SQL構築ロジックとデータ整形ロジックを分離できます。
3. デバッグの容易さ: `builder.Build` の直前で `Debug.Print` を入れるだけで、完成したSQLが丸見えになります。

最後に:エンジニアとしての心得

「動けばいい」というコードは、数ヶ月後の自分を苦しめます。
今回紹介した `SqlBuilder` は、ほんの小さな仕組みですが、これを導入するだけであなたのコードは「誰が読んでも理解できる資産」に変わります。

Access VBAは、正しく書けば非常にパワフルなツールです。文字列の連結に追われる日々から卒業し、データ構造とビジネスロジックを操る「設計者」の視点を持ってください。

ここをクリアしたあなたは、もう初心者ではありません。自信を持って、次の機能開発に進んでくださいね!応援しています。

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