VBAサンプル集
ADOでマスタ付加と集計(SQL)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013年5月以前 最終更新日:2016-09-08

ADOでマスタ付加と集計(SQL)


VBAでADOを使用し、マスターデータよりデータ付加します。


ADOではSQL文が必要になりますが、

ここではSQL文の詳細については説明を料略します。

自身の他シートから、マスタ情報を付加し、さらに、集計をします。

以下のシートになります。

シート「顧客マスタ」
Excel VBA 解説

シート「支店マスタ」
Excel VBA 解説

シート「データ」
Excel VBA 解説

上記3シートより、以下のシートを作成します。

シート「集計表」
Excel VBA 解説


手作業ですと、結構大変です、どのようにやれば良いでしょうか。

シート「データ」にVLOOKUPでマスタから名称を付加し、

その後に、ピボットを使うとかになりますでしょうか。

または、シート「データ」から、支店番号、顧客番号の重複を除いて、他シートに抽出し、

VLOOKUPとSUMIFS(SUMPRODUCT)とかでしょうか。

マクロでやるにしても、上記操作の再現とかになるでしょう。

以下のプログラムでは、ADOを使い、SQL文でこれを実現しています。


Sub test()
  Dim objCn As New ADODB.Connection
  Dim objRS As ADODB.Recordset
  Dim GYO As Long, COL As Long
  Dim strSQL As String

  With objCn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties("Extended Properties") = "Excel 8.0"
    .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
  End With
  
  strSQL = ""
  strSQL = strSQL & " SELECT S.支店番号, M2.支店名, S.顧客番号, M1.顧客名, M1.住所, S.売上合計"
  strSQL = strSQL & " FROM"
  strSQL = strSQL & " ((SELECT D.顧客番号, D.支店番号, SUM(D.売上) AS 売上合計"
  strSQL = strSQL & " FROM [データ$] AS D"
  strSQL = strSQL & " GROUP BY D.顧客番号, D.支店番号"
  strSQL = strSQL & " ) AS S"
  strSQL = strSQL & " LEFT JOIN [顧客マスタ$] AS M1"
  strSQL = strSQL & " ON S.顧客番号 = M1.顧客番号)"
  strSQL = strSQL & " LEFT JOIN [支店マスタ$] AS M2"
  strSQL = strSQL & " ON S.支店番号 = M2.支店番号"
  strSQL = strSQL & " ORDER BY S.支店番号, S.顧客番号"
  
  Set objRS = New ADODB.Recordset
  Set objRS = objCn.Execute(strSQL)
  
  With Worksheets("集計表")
    .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).ClearContents
    .Range("A2").CopyFromRecordset objRS
  End With
  
  objCn.Close
  Set objCn = Nothing
End Sub


※「参照設定」で「Microsoft ActiveX Data Objects 2.X Library」を追加して下さい。


※Excel2007以降では、
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"

こちらを使用してください。

結構長いですが、他の方法に比べれば短いと思います。

長いといっても、SQL文の作成の所だけです。

ここのブログはエクセルの解説をメインにしていますので、SQL文の詳細説明は省きます。

上記SQL文では、サブクエリーを使い「データ」を集計し、

そこに、LEFT JOINで、マスタを結合しています。

SQL文に対する知識がそれなりに必要になります。

といっても、SQL文としては、さほどの難易度ではありません、普通レベルです。

SQLに慣れている人なら、他の方法より、はるかに簡単で、解り易いのではないでしょうか。

ではもう一つ、以下のシートを作成します。

シート「クロス集計」
Excel VBA 解説

もっとも単純なピボットになります。

これを、SQLで作成します、



Sub test2()
  Dim objCn As New ADODB.Connection
  Dim objRS As ADODB.Recordset
  Dim GYO As Long, COL As Long
  Dim strSQL As String
  Dim i As Long

  With objCn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties("Extended Properties") = "Excel 8.0"
    .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
  End With

  strSQL = ""
  strSQL = strSQL & " TRANSFORM SUM(D.売上) AS 売上合計"
  strSQL = strSQL & " SELECT S.顧客名, SUM(S.売上) AS 全支店合計"
  strSQL = strSQL & " FROM"
  strSQL = strSQL & " (SELECT M1.顧客名, M2.支店名, D.売上"
  strSQL = strSQL & " FROM"
  strSQL = strSQL & " ([データ$] AS D"
  strSQL = strSQL & " LEFT JOIN [顧客マスタ$] AS M1"
  strSQL = strSQL & " ON D.顧客番号 = M1.顧客番号)"
  strSQL = strSQL & " LEFT JOIN [支店マスタ$] AS M2"
  strSQL = strSQL & " ON D.支店番号 = M2.支店番号) AS S"
  strSQL = strSQL & " GROUP BY S.顧客名"
  strSQL = strSQL & " PIVOT S.支店名"
  
  Set objRS = New ADODB.Recordset
  Set objRS = objCn.Execute(strSQL)
  
  With Worksheets("クロス集計")
    .Cells.ClearContents
    .Range("A2").CopyFromRecordset objRS
    For i = 0 To objRS.Fields.Count - 1
      Cells(1, i + 1) = objRS.Fields(i).Name
    Next
  End With
  
  objCn.Close
  Set objCn = Nothing
End Sub


クロス集計クエリです。


ACCESSをやっている人なら、一度くらいは使ったことがあるのではないでしょうか。

見出しはデータに含まれていませんので、最後にフィールド名を見出しに設定しています。

ネットでADO等で検索すると、

.Range("A2").CopyFromRecordset objRS
の部分は、objRSをループさせて、値を入れていることが多いのですが、

このように、データ全てを貼り付けるだけなら、これで十分です。

どうでしょうか、SQL文が分かる方なら、非常に簡単です。

ただし、簡単だからと言って、SQL文を知らない人が使うことは、推奨しません。

SQL文のエラー発生時に、エラーメッセージを見て問題解決できなくなりますので。

あくまで、エクセルの一つの技術としての紹介とお考えください。



同じテーマ「マクロVBAサンプル集」の記事

VBAでのCSVの扱い方まとめ
CSVの読み込み方法
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの読み込み方法(ジャグ配列)
CSVの読み込み方法(ジャグ配列)(改)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)


新着記事NEW ・・・新着記事一覧を見る

エクセル関数辞典 AI版|エクセル入門(6月10日)
生成AIと100本ノック 28本目:シートをブックに分割|生成AI活用研究(6月8日)
生成AIと脱Excelの時代:ブラックボックスと共に進む知的変革|生成AI活用研究(2025-06-08)
生成AIと100本ノック 27本目:ハイパーリンクのURL|生成AI活用研究(6月7日)
生成AIと100本ノック 26本目:ファイル一覧作成|生成AI活用研究(6月6日)
AI時代のプログラミング再考:記述の自由と知の民主化|生成AI活用研究(2025-06-06)
Excel×スプレッドシート連携:HTTP GETで学ぶGAS API設計入門|生成AI活用研究(2025-06-04)
AI×ひらめき ― 「ネタ」が飛躍する創造の増幅プロセス|生成AI活用研究(2025-06-03)
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~|生成AI活用研究(2025-06-02)
究極のVBA転記プロンプト公開!あなたの事務作業を劇的に効率化|生成AI活用研究(2025-06-02)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ