ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

【Access VBA】テーブルのデータを思い通りに加工する方法(後編)

バッチ処理を使ってAccessテーブルのデータを加工する方法について解説しています。

前編ではRun SQLメソッドを連鎖させてバッチ処理を行うプログラミングを解説しました。
前編はこちらから読めます。

https://sys-daddy.com/access_vba_batch_processing_1/

後半にあたる今回は、 コードマスタテーブルに格納した SQL文を活用してバッチ処理を行う方法について解説します。

コードマスタを作り上げるのは大変ですが、一度作ってしまえばコードを直接触ることはありません。
本記事ではマスタテーブルの編集画面に始まり、テーブルの構成やVBAコード、処理の流れについて解説していきます。

これらの情報は実務でそのまま使える方法ですが、他のサイトでもあまり書かれていない貴重なものです。
本記事の最後までをしっかり学習し、Accessを便利にカスタマイズしていきましょう。

プログラムを実行するサンプルコードは以下のリンクからダウンロードしてください。

≫ サンプルデータベース(Batch_Processing.accdb)

コードマスタ編集画面の解説

フォーム「F00更新用SQLマスタM」を開きます。

サブフォームにコードマスタテーブルのデータが表示されています。

編集ボタンをクリックすると、選んだレコードの単票フォームが起動します。

起動した単票フォームの画面です。
ここでSQL文の編集を行えます。

クエリの実行順番も単票フォームで入れ替えることができます。

中間テーブルを起動する場合は、中間物の名前と種類を入力します。
中間生成物は「WT(ワークテーブル)」や「WQ(ワーククエリ)」から始めると分かりやすいです。

サンプルデータベースでは実装していませんが、SQL文だけでは処理しきれない動きはプロシージャ名の指定で実現できます
そのときは「Pro実行」にチェックを入れます。

マスタテーブルの構成

マスタテーブルのフィールド名は以下のとおりですが、あくまでも一例です。

フィールド名内容
IDただの番号(特に意味なし)
動作処理内容を明記(備考のようなもの)
SQL文実際に処理するSQL文やプロシージャ名
中間物名称中間テーブルやクエリの名称
起動時起動時に作動するものはチェック(Yes/No型)
起動時順番処理の順番
中間作成物中間生成物の種類を選択(テーブル、クエリ)
Pro実行実行するプロシージャ名(Yes/No型)

上の構成がベストではありませんので、フィールド名は必要に応じて調整してください。

この構成で工夫したところは、中間生成物とプロシージャ実行の2点です。
実際にバッチ処理の流れを組み立ててみると分かりますが、アクションクエリ(更新・追加)だけでは希望どおりの出力テーブルを作りきれないこともあります。
中間クエリや中間テーブルを使えば、より複雑な計算も可能です。
さらに条件分岐や繰り返しが必要な場合は、プロシージャを使った処理が便利です。

バッチ処理を実行するコード

コードマスタを使ったバッチ処理のコードは下の通りです。

Private Sub バッチ集計2_Click()
    
    Dim SQL_DAO_KS As String
    Dim DB_KS As DAO.Database
    Dim RS_KS As DAO.Recordset
    Dim Qdf As QueryDef
    
    'コードマスタを実行順に並べ替え
    SQL_DAO_KS = "SELECT * FROM T09更新用SQLマスタ WHERE 起動時 = Yes ORDER BY 起動時順番;"
    Set DB_KS = CurrentDb()
    Set RS_KS = DB_KS.OpenRecordset(SQL_DAO_KS)
    
    RS_KS.MoveFirst
    
    '順番に処理
    Do Until RS_KS.EOF
        If RS_KS.Fields(6).Value = "クエリ" Then  '中間クエリの作成
            If ExtQry(RS_KS.Fields(3).Value) = False Then
                Set Qdf = CurrentDb.CreateQueryDef(RS_KS.Fields(3).Value, RS_KS.Fields(2).Value)
                Set Qdf = Nothing
            End If
        ElseIf RS_KS.Fields(6).Value = "テーブル" Then  '中間テーブルの作成
            If ExtTbl(RS_KS.Fields(3).Value) = False Then
                DB_KS.Execute RS_KS.Fields(2).Value
            End If
        ElseIf RS_KS.Fields(7).Value = True Then  'プロシージャの実行
            Run RS_KS.Fields(2).Value
        Else
            DB_KS.Execute RS_KS.Fields(2).Value  'SQLを実行
        End If
        RS_KS.MoveNext
    Loop
    
    RS_KS.Close: Set RS_KS = Nothing
    DB_KS.Close: Set DB_KS = Nothing
    
    '中間クエリとテーブルの削除
    SQL_DAO_KS = "SELECT * FROM T09更新用SQLマスタ WHERE 起動時 = Yes AND 中間物名称 Is Not Null ORDER BY 起動時順番;"
    Set DB_KS = CurrentDb()
    Set RS_KS = DB_KS.OpenRecordset(SQL_DAO_KS)

    RS_KS.MoveFirst
    Do Until RS_KS.EOF
        If RS_KS.Fields(6).Value = "クエリ" Then
            CurrentDb.QueryDefs.Delete RS_KS.Fields(3).Value
        Else
            CurrentDb.TableDefs.Delete RS_KS.Fields(3).Value
        End If
        RS_KS.MoveNext
    Loop
    RS_KS.Close: Set RS_KS = Nothing
    DB_KS.Close: Set DB_KS = Nothing

    Me.F04月別カテゴリ集計DS.SourceObject = "F04月別カテゴリ集計DS"

End Sub

長めのコードですが、大まかには3つの処理に分かれます。

  1. コードマスタを実行順に並べ替える
  2. 出力テーブルの作成
  3. 中間生成物の削除

15~35行までの出力テーブルの作成処理では4つに分岐させています。

  • 中間クエリ作成 → CreateQueryDefメソッド
  • 中間テーブル作成 → Executeメソッド
  • プロシージャ実行 → Runメソッド
  • SQLを実行 → Executeメソッド

37~52行までは中間生成物を削除する処理です。

コードマスタで処理できる方法を確立すると、VBAコードの書き換えが不要になるので、メンテナンス性をかなり上げることができます。

まとめ

以上、コードマスタでバッチ処理を行う方法について解説しました。

コードマスタを使ったバッチ処置は、テーブルの書き換えだけで制御を変えることができるのでぜひ覚えておきたい方法です。
また、コードの手直しによるバグ発生のリスクを下げられるので、Accessシステムの安定運用につながります。

本記事のようなバッチ処理で行う方法以外にも、コードマスタを使える場面があります。
少しずつでもいいので、コードマスタに使い慣れておくのが大事です。