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は、正しく書けば非常にパワフルなツールです。文字列の連結に追われる日々から卒業し、データ構造とビジネスロジックを操る「設計者」の視点を持ってください。
ここをクリアしたあなたは、もう初心者ではありません。自信を持って、次の機能開発に進んでくださいね!応援しています。
