VBA・SQL|Accessで複数テーブルを合体するUNION ALLの使い方

エクセルVBA VBAでSQL



AccessをVBAで自動化する際に、複数テーブルを合体する方法を知りたいという質問がきます。

VBAを使ってSQLで、複数のテーブルを合体するには「UNION ALL」を使います。

UNION ALLは複数テーブルをつなげてレコードを結合するクエリです。

今回は、以下のことについてお伝えしていきます。

  • UNION ALLを使ってAccessの複数テーブルを合体、レコードを結合する。
  • 3つ以上のテーブルを合体する方法。
  • UNION ALLとUNION の違い

実際に職場で運用中のサンプルコード(一部)も紹介していきますね☆



AccessでVBAを使って複数テーブルを合体するにはUNION ALLを使う

複数テーブルを合体するにはクエリUNION ALLを使います。

ネットなどでテーブルの合体について調べると、サイトによって「UNION ALL」と「UNION」が混在しています。

「UNION ALL」と「UNION」の違いについては以下のとおりです。

「UNION ALL」と「UNION」の違い

「UNION ALL」と「UNION」の違いは、重複行の扱いです。

  • UNION ALL → 重複行を除外しない
  • UNION → 重複行を除外する

つまり、テーブルを合体する際に、重複行を除外されたくないなら「UNION ALL」を。

テーブル合体の際に重複行を除外してほしいのなら「UNION」を使います。

今回は重複行を残す前提ですので、UNION ALLを使っています。

※重複行を除外させたい場合は「UNION ALL」を「UNION」に置き換えてください。

Accessで3つ以上の複数テーブルを合体させるサンプルコード

今回サンプルで使用するのは見易さや応用できることを想定して便宜上1つのテーブルで操作していますが、複数のテーブルの場合でも記載方法は何も変わりません。

「FROM テーブル名」のところを抽出元のテーブルに書き換えれば問題ありません。

今回は3つのテーブルを1つのテーブルに合体させます。

  • テーブル1:「作業日」「工事名1」
  • テーブル2:「作業日」「工事名2」
  • テーブル3:「作業日」「工事名3」
  • 合体後のテーブル「hoe」:「作業日」「工事(工事名1・工事名2・工事名3が合体したもの)」

また、合体後のテーブル「hoe」はあらかじめAccess上で準備しておく必要はありません。

テーブル「hoe」がなければ自動的に作成されます。

【実行前】

【3つ以上の複数テーブルを合体させるサンプルコード】

vSQL = "SELECT * INTO hoe from ("    ’合体後のテーブル名は「hoe」

vSQL = vSQL & "SELECT 作業日,工事名1 AS 工事 "  ’フィールド「工事名1」を合体後は「工事」にする
vSQL = vSQL & "FROM 作業集計 "  ’テーブル名を記載する

vSQL = vSQL & "Union ALL "
vSQL = vSQL & "SELECT 作業日,工事名2 AS 工事 "  ’フィールド「工事名2」を合体後は「工事」にする
vSQL = vSQL & "FROM 作業集計 "  ’テーブル名を記載する

vSQL = vSQL & "Union ALL "
vSQL = vSQL & "SELECT 作業日,工事名3 AS 工事 "  ’フィールド「工事名3」を合体後は「工事」にする
vSQL = vSQL & "FROM 作業集計 "  ’テーブル名を記載する

vSQL = vSQL & ");"

【実行結果】

テーブルhoeに、作業日が合体し、さらに工事名1~3のフィールドが「工事」フィールドで合体していることがわかります。

テーブルが4つ以上になった場合は、UNION ALL 以降のコードを書き足していけば問題ありません。

また、テーブルが2つの場合には、上記コードの2回目に出現するUNION以降のコードを削除することで実行できます。

複数テーブルを合体させるときの注意点

VBA実行時に、合体元のAccessファイルが開いており、テーブルが編集中の状態であると実行時エラーになってしまいます。

また、テーブルの重複エラーなど無用なエラー回避のため、VBA実行前にあらかじめ合体後に作成される予定のテーブルを削除するのがオススメです。

【あらかじめテーブルhoeを削除するコード】

On Error Resume Next
Dim sSql As String
sSql = "DROP TABLE hoe,hoe2,hoe3;"
On Error GoTo 0

これを実行前に入れることで、テーブルhoeがあれば削除し、無くてもエラーになりません。

まとめ

今回はVBAを使ってSQLでAccessの複数テーブルを合体させる方法についてお伝えしてきました。

VBAを使ってSQLで、複数のテーブルを合体するには「UNION ALL」を使います。

また、3つ以上の複数テーブルを合体するには、UNION ALL~以降の処理を増やして記載します。【※記事内サンプルコード参照】

また、「UNION ALL」と「UNION」の違いは、重複行の扱いです。

  • UNION ALL → 重複行を除外しない
  • UNION → 重複行を除外する

テーブルを合体する際に、重複行を除外されたくないなら「UNION ALL」を。

テーブル合体の際に重複行を除外してほしいのなら「UNION」を使います。

VBAを使ったSQLでは複数のテーブルを扱うことがよくある話ですので、ぜひ参考にしていただければと思います。




VBAでSQL
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~

コメント

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