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

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2016-09-08

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


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


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

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


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

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

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

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

シート「データ」
Excel解説

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

シート「集計表」
Excel解説


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

シート「データ」に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解説

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

これを、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サンプル集」の記事

CSVの読み込み方法
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック

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

エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.とにかく書いて見よう(Sub,End Sub)|VBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



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

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


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






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

    本文下部へ