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の読み込み方法(ジャグ配列)(改) ・CSVの出力(書き出し)方法 ・UTF-8でCSVの読み書き(ADODB.Stream) ・ADOでCSVの読み込み(SQL)
CSVの読み込み方法
・もっとも簡単かつ良くあるCSV読み込みVBAコード ・「,」「"」に対応したCSV読み込みVBAコード ・CSVをExcelブックとして開くVBA ・クエリーテーブルを使ったCSV読み込みVBAコード ・その他のCSV読み込み方法
CSVの読み込み方法(改)
実施したいこと ・ファイル名を指定し、形式をカンマ区切り、文字列で開く、その際、改行コードLF、CRLF、CRいずれにも対応、セル内の","や改行についてはカラムで区切らない。掲示板で上記のリクエストを頂きました。ということで、対応ロジックを書いてみました。
CSVの読み込み方法(改の改)
・CSVの形式について ・CSV読み込みVBAコード ・配列を使ってシートにまとめて出力する場合 ・QueryTablesを使ったCSV読み込みVBAコード ・本サイトにあるCSV関連記事一覧
CSVの読み込み方法(ジャグ配列)
・CSVの読み込み方法(改の改)での予告 ・CSV読み込みでのジャグ配列の使いどころ ・CSV読み込みVBAコード:ジャグ配列バージョン ・最後に ・本サイトにあるCSV関連記事一覧
CSVの読み込み方法(ジャグ配列)(改)
・CSV読み込みVBAコード:CSVの読み込み方法(ジャグ配列)(改) ・CSVの読み込み方法(ジャグ配列)(改)の使用例 ・本サイトにあるCSV関連記事一覧
CSVの出力(書き出し)方法
・エクセルの機能をそのまま利用します ・直接CSVを出力 ・本サイトにあるCSV関連記事一覧
UTF-8でCSVの読み書き(ADODB.Stream)
・アクティブシートの内容をUTF-8でCSV出力します ・UTF-8のCSVを読込、シートに出力します ・ADODB.Streamのメソッドとプロパティ ・本サイトにあるCSV関連記事一覧
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
VBAでADOを使用し、マスターデータを更新します。ADOではSQL文が必要になりますが、ここではSQL文の詳細については説明を料略します。自身のブックの、他シートを更新します。シート「顧客マスタ」の、A列が顧客番号、B列が顧客名で、1行目が見出しになっているものとします。
ADOでCSVの読み込み(SQL)
・CSVテストデータ ・ADOでCSV読込のVBA ・ADO使用時の注意点 ・ADOレコードセットをCSV出力 ・ADOでTSVの読み込み ・ADOでCSVの読み込みについて ・本サイトにあるCSV関連記事一覧


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

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)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


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

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




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


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


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