- 締切済み
ExcelVBAでピボットテーブルの値を取得したい
ExcelVBAでグループ化したピボットテーブルからグループ化した内容を取得したいのですが、うまくいきません。詳しい方いらっしゃったらご教示をお願いしたいです。 具体的に言うと、下記ピボットテーブルの行ヘッダの場合、「グループ1-1」を指定したら「分類1」と「分類2」だけを取得したいです。 分類 ----------------------------- + グループ1 + グループ1-1 分類1 分類2 + グループ1-2 分類3 分類4
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
既にpivotテーブルの集計結果があり、 その中から 「グループ2-2」の下階層の行たち 添付のサンプル画像で言えば、 A6:B7を取得したいということなんですね? サンプル画像なら2行ですが、 実際は行数が変動しますでしょうから 第2階層がブレイクする行を特定する必要が出てきます。 少なくとも私には、これを特定することができません。 先に述べましたように、 pivotテーブルを介する必要はなく 後記コードで取得ができます。 よかったら参考にしてください。 なお、画像の左から1,2つ目が集計元ブック 3つ目が集計ブックの集計テーブル(ダイジェスト版)です。 Sub xxx() Dim SQL As String Dim cn As Object Dim rs As Object Dim i As Long Const tgBook = "C:\work\SQL対象sampleブック.xlsx" 'SQL全文を組み立て SQL = "" SQL = SQL & "SELECT" & vbCrLf SQL = SQL & "[1階層目分類],[2階層目分類],[3階層目分類],count([3階層目分類]) as [数]" & vbCrLf SQL = SQL & "FROM [" & "Sheet4" & "$A1:Z50000]" & vbCrLf SQL = SQL & "WHERE (([1階層目分類] = 'Group2') and ([2階層目分類] = 'Group2-2'))" & vbCrLf SQL = SQL & "group by [1階層目分類],[2階層目分類],[3階層目分類]" & vbCrLf 'SQLを実行 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open tgBook rs.Open SQL, cn '結果セットを出力 With ThisWorkbook.Sheets("集計結果") .Cells.ClearContents '出力先クリアー For i = 0 To (rs.Fields.Count - 1) '列名を出力 .Cells(1, i + 1).Value = rs.Fields(i).Name Next .Cells(2, 1).CopyFromRecordset rs End With '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub
- HohoPapa
- ベストアンサー率65% (455/693)
課題となるものは ・私の掲示した画面のA1:B2を表示する ・VBAでこのA1:B2をコントロールする ・VBAでこのA3:B6の分類と値を取得する ということになりますか? まず、A1:B2を表示する設定は、添付画像個所の赤囲みの設定です。 もし、ゴールが、 >グループや分類のうち、特定の項目だけを抽出したダイジェスト版。 ならば、あえてpivotテーブルを介する必要はない むしろ、介在させると、VBAの実装が複雑になり 私だったらやりません。 テーブルの構造と >グループや分類のうち、特定の項目だけを抽出したダイジェスト版。 の仕様を説明してもらえれば、 >●集計元ブック(このブックが多数あります) >・データシート から、直接 >グループや分類のうち、特定の項目だけを抽出したダイジェスト版。 をVBAで作成するサンプルコードを提示できるんじゃないかと思います。
- HohoPapa
- ベストアンサー率65% (455/693)
期待していることがよくわからないんです。 既に添付画像のようなピボットテーブルがあって、 このテーブルをVBAで制御したいということですか? それとも、 データの一覧(リスト)があって、 ピボットテーブルを介することなく、ここから 第一階層、第二階層の条件を指定して 第三階層ごとのごとの合計表をVBAで作成したいですか? 後者であれば、リストの構造を紹介してもらえれば SQLをつかったサンプルなコードを紹介することが可能と思います。
補足
どちらかというと前者だと思います。 説明がわかりにくくて申し訳ないです。 ●集計元ブック(このブックが多数あります) ・データ ・ピボットテーブルがあるシート・・・① →データシートから作成。 分類を特定条件でグループ化。 グループ化はピボットテーブルの機能を使用。 貼り付けていただいた画像の右側のような感じですが、 上の絞り込み条件?の部分がないのと、 グループが下の表に含まれています。 その結果が質問に書いた表になります。 ●集計ブック(1つしかありません) ・集計テーブル(ダイジェスト版)・・・② →集計元ブックのピボットテーブルから グループや分類のうち、特定の項目だけを抽出した ダイジェスト版。 集計元ブックがなくても開けるよう、 非ピボットテーブルにしたい。 があり、①から②を作成するVBAを作成しています。 ①のピボットテーブルが質問に記載したようなレイアウトになっており、うまくグループ/分類の情報が取得したいのです。 ※書き忘れていましたが、環境はOffice Professional Plus 2016(永続版)です。 ※補足で画像が貼れれば、サンプルを貼った方が速そうですが、 文字欄しかなさそうですね...
補足
ゴールは、下記シート全てを作成することです。 ●集計元ブック(このブックが多数あります) ・集計テーブル(複数あるデータシートの全てを集計) ●集計ブック(1つしかありません) ・集計テーブル(ダイジェスト版) 集計元のピボットテーブルでデータシートを集計してある必要があり、列は変わりませんが行がよく変わるので、ピボットテーブルを選択しています。