ExcelマクロVBAサンプル集 | ADOでマスタ付加と集計(SQL) | Excelマクロの実用サンプル、エクセルVBA集と解説



最終更新日:2016-09-08

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


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

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

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


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

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

シート「顧客マスタ」


シート「支店マスタ」


シート「データ」


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

シート「集計表」


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

シート「データ」に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に慣れている人なら、他の方法より、はるかに簡単で、解り易いのではないでしょうか。

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

シート「クロス集計」


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

これを、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文のエラー発生時に、エラーメッセージを見て問題解決できなくなりますので。

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




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

ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの出力(書き出し)方法

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

Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)
ファイルの一覧取得・削除(File)|Google Apps Script入門(1月24日)
フォルダの一覧取得・作成・削除(Folder)|Google Apps Script入門(1月24日)
フォルダとファイルを扱う(DriveApp)|Google Apps Script入門(1月24日)
スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)
画像のトリミング(PictureFormat,Crop)|ExcelマクロVBAサンプル集(12月27日)
シート保護|Google Apps Script入門(12月24日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.変数とデータ型(Dim)|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.VBAのFindメソッドの使い方には注意が必要です|ExcelマクロVBA技術解説



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

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


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

    ↑ PAGE TOP