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 ・・・新着記事一覧を見る

WshNetwork(ネットワークドライブの割り当て等)|VBA技術解説(2025-04-09)
TRANSLATE関数(翻訳) DETECTLANGUAGE関数(言語識別)|エクセル入門(2025-04-08)
QRコード、バーコード作成の覚え書き|エクセル関数応用(2025-04-05)
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.条件分岐(Select Case)|VBA入門




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


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



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