Access VBAの真髄:`DoCmd.OpenReport`でレポートを自在に操る「WhereCondition」の魔法
こんにちは。現場で泥臭い自動化からアーキテクチャ設計まで手がけているエンジニアです。
Accessを使っていて、「特定の顧客だけ」「今月の売上だけ」といった条件でレポートを出したい時、クエリを毎回書き換えたり、条件用のフォームを作ってクエリ側で参照させたりしていませんか?
実は、レポートの元となるクエリをいじる必要はありません。 VBAから「この条件で出して!」と命令するだけで、レポートは魔法のように姿を変えてくれます。これがAccess VBAにおける動的フィルタリングの極意、`DoCmd.OpenReport`の`WhereCondition`引数です。
ここをマスターすれば、あなたのAccessは「単なる集計ツール」から「柔軟な業務アプリケーション」へと進化します。
—
なぜ「クエリの書き換え」はNGなのか?
初学者が陥りやすいのが、「出力したい条件に合わせて、クエリのSQL文をVBAで書き換える」というアプローチです。
- 保守性が最悪: クエリが複数ある場合、管理が破綻します。
- 実行時エラーの温床: SQLの構文ミス(引用符の付け忘れなど)が多発します。
- 非効率: Accessはクエリのコンパイルにリソースを割きます。毎回クエリを書き換えるのは、エンジンをかけ直して車を動かすようなものです。
一方で、`WhereCondition`を使う方法は、「レポートという窓」を通して「必要なデータだけを覗く」というイメージです。元データ(クエリ)には一切触れません。安全かつスマートなアプローチです。
—
実践:DoCmd.OpenReportの書き方
まずは、基本形を見てみましょう。
‘ ボタンクリック時などに実行する例
Private Sub btnPrint_Click()
Dim strWhere As String
‘ フィルタ条件を文字列として組み立てる
‘ 顧客IDが 101 のデータだけを抽出する例
strWhere = “CustomerID = 101”
‘ レポートを開く
‘ acViewPreview: プレビュー表示
‘ acViewNormal: 即印刷
DoCmd.OpenReport “rptSales”, acViewPreview, , strWhere
End Sub
コードの解説
- 第1引数 (“rptSales”): 開きたいレポートの名前です。
- 第4引数 (strWhere): ここが今回の主役です。SQLの`WHERE`句の「WHERE」を除いた部分を文字列として渡します。
—
現場で役立つ「変数を扱う」テクニック
実務では、固定値ではなく「画面で選択した値」を使いますよね。ここが一番のつまずきポイントです。「変数の値」と「文字列」を正しく結合する必要があります。
数値型の場合
Dim targetID As Long
targetID = Me.txtInputID.Value ‘ 画面上のテキストボックスから取得
‘ 条件式: “CustomerID = ” & targetID
DoCmd.OpenReport “rptSales”, acViewPreview, , “CustomerID = ” & targetID
文字列型の場合(ここが最重要!)
文字列には必ずシングルクォーテーション(’)で囲むというルールがあります。
Dim targetName As String
targetName = Me.txtInputName.Value
‘ 条件式: “CustomerName = ‘山田太郎'” の形を作る
‘ & “‘” & ターゲット & “‘” で囲むのが鉄則です
DoCmd.OpenReport “rptSales”, acViewPreview, , “CustomerName = ‘” & targetName & “‘”
—
陥りやすいエラーと回避策
エンジニアとして、皆さんがよく直面する壁を先回りして教えます。
1. 「抽出されずに全件表示されてしまう」
`WhereCondition`の条件式にタイポ(綴り間違い)があると、Accessは親切心で(あるいは無言で)条件を無視して全件表示することがあります。
- 対策: `Debug.Print strWhere` を入れて、イミディエイトウィンドウで条件式が正しく作られているか必ず確認してください。
2. 「Null値が含まれる場合のエラー」
抽出条件の変数が空(Null)のままコードが走ると、SQL構文が崩れてエラーになります。
- 対策: `If Len(Me.txtInput.Value & “”) > 0 Then` のように、値が存在する場合だけ条件式を組み立てるガード節を入れてください。
3. 「日付型の扱い」
日付型は `#` で囲む必要があります。
- 対策: `… “SalesDate = #” & Format(Me.txtDate, “yyyy/mm/dd”) & “#”` という形式を徹底しましょう。
—
まとめ:ここをクリアすれば「脱・初心者」
今回ご紹介した `WhereCondition` は、Access開発における「動的制御」の第一歩です。
1. クエリは固定する(レポートの定義は変更しない)
2. VBAでWHERE句の文字列を組み立てる
3. 引用符(’ や #)のルールを守る
この3点を守るだけで、あなたのコードは劇的に安定し、保守が楽になります。まずは手元のフォームにあるボタンに、このコードを一つ仕込んでみてください。画面の向こうでレポートが狙い通りのデータを表示した瞬間、きっとAccess VBAの面白さが分かるはずです。
何か分からないことがあれば、いつでも聞いてくださいね。応援しています!
