- ベストアンサー
マクロを使用してピボットテーブルを作成する方法
- ピボットテーブルを作成するためのマクロの使い方を教えてください。
- ピボットテーブルを作成するための条件や手順について詳しく教えてください。
- 別シートとリンクさせて、まとめる科目に基づいたピボットテーブルを作成する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
徒然なるままに作成してみました。シート名などご希望とは異なりますが、もし使ってみようという気になられたら、怪しげな英語で変数名をつけてありますので、参考にしていただき、ご自分で修正してください。 元データの変化への動的な対応がお望みなので、その分だけ分かりにくくなっているとは思います。 XL2000のコードですので、他の環境での動作は不明です。他の環境への対応、解説、メンテナンスはできません。 Sub test() Dim columnIndex() As String Dim targetRange As Range, destRange As Range, pivotRange As Range Dim myRow As Range Dim dataSheet As Worksheet, criteriaSheet As Worksheet Dim tempSheet As Worksheet, pivotSheet As Worksheet Dim i As Long, j As Long With ThisWorkbook '元データのシート、フィルタオプションの抽出条件のシート Set dataSheet = .Sheets("Sheet1"): Set criteriaSheet = .Sheets("Sheet2") 'ピボット用に整形したデータのシート、ピボット出力用のシート Set tempSheet = .Sheets("Sheet3"): Set pivotSheet = .Sheets("Sheet4") End With 'フィルタオプションで、目的の科目のデータ以外を隠す '抽出条件シートに A1 科目、A2 国語、A3 英語という様にいれておく。 Set targetRange = dataSheet.Range("a1").CurrentRegion If dataSheet.FilterMode = True Then dataSheet.ShowAllData targetRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ criteriaSheet.Range("A1").CurrentRegion, Unique:=False 'データベースのレコード形式のデータに整形 tempSheet.Cells.Clear Set destRange = tempSheet.Range("a1") ReDim columnIndex(1 To targetRange.Columns.Count - 2) For i = 1 To targetRange.Columns.Count - 2 columnIndex(i) = targetRange.Cells(1).Offset(0, i + 1).Value Next i For j = 1 To targetRange.Rows.Count Set myRow = targetRange.Rows(j) If j = 1 Then With destRange .Value = myRow.Cells(1) .Offset(0, 1).Value = myRow.Cells(2) .Offset(0, 2).Value = "試験" .Offset(0, 3).Value = "点数" End With Set destRange = destRange.Offset(1, 0) Else '隠されたデータは整形出力しない If myRow.EntireRow.Hidden = False Then For i = 1 To UBound(columnIndex) With destRange .Value = myRow.Cells(1) .Offset(0, 1).Value = myRow.Cells(2) .Offset(0, 2).Value = columnIndex(i) .Offset(0, 3).Value = myRow.Cells(2 + i) End With Set destRange = destRange.Offset(1, 0) Next i End If End If Next j Set pivotRange = tempSheet.Range("a1").CurrentRegion Call makepivot(pivotRange, pivotSheet) End Sub Sub makepivot(dataRange As Range, destSheet As Worksheet) Dim dataRangeAddress As String Dim pivotTableName As String pivotTableName = "ピボットテーブル1" dataRangeAddress = dataRange.Parent.Name & "!" & dataRange.Address(ReferenceStyle:=xlR1C1) destSheet.Activate destSheet.Cells.Clear destSheet.Parent.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ dataRangeAddress).CreatePivotTable TableDestination:=Range("A3"), _ TableName:=pivotTableName With destSheet.PivotTables(pivotTableName) .SmallGrid = False .PivotFields("生徒").Orientation = xlRowField .PivotFields("試験").Orientation = xlColumnField .PivotFields("科目").Orientation = xlColumnField .PivotFields("点数").Orientation = xlDataField .ColumnGrand = False .RowGrand = False .PivotFields("試験").Subtotals = Array( _ False, False, False, False, False, False, False, False, False, False, False, False) End With End Sub 参考URL http://pvttbl.blog23.fc2.com/
その他の回答 (2)
- ookami1969
- ベストアンサー率14% (137/953)
マクロだ何だと言う前に もうちょっと Excelを勉強された方が良いのではないでしょうか? ピボットで行がいくつ増えてもいいように範囲選択しておけば「更新」をクリックするだけで 増えた分も集計されるのは ご存知でしょうか? また ピボットの各項目に▽が付いていて「科目」から「国語」と「英語」だけ抽出する方法があるという事をご存知でしょうか? 「科目」が何百もあるなら面倒なのも分かりますが解決方法をマクロに求めるのは ちょっと違うと思いますよ? 僕ならシートを3枚使い「データテーブル用」「ピボット用」「集計用」とします。 (実際に今の業務では そのようにしています) それでも不都合が出て来たら科目毎にブックを分けるとか、方法はあると思いますが 今回のケースでは「マクロ」は違うと思います。 「ピボット」の意味をご存知ですか? バスケの「ピボット」と同じ意味ですよ。 「何かを軸に色々な方向へ」というニュアンスです。
お礼
ご教授、ご回答ありがとうございます。 確かに勉強不足で理解していない事も多く、ご指摘の通りです。 職場の年配のパソコンに苦手意識のある方にも、ボタンひとつでデータの処理ができるものが何とかできないかと思い、このように質問させていただきました。 ピボットテーブルの使い方も参考にさせていただきます。 どうもありがとうございました。
- popuplt
- ベストアンサー率38% (31/81)
>ピボットデーブルをマクロで作成したいのですが 質問の意図がよくわからないのですが・・・。 「ピボットテーブルはリスト形式になったものを集計する」という機能です。 質問の元データはすでにテーブルデータですので、ピボットテーブルで作成したいものを作るのは、困難ではないのでしょうか。 他にも方法はあると思いますが、 ピボットテーブルを使うなら元データをリスト形式にする。 マクロを使うなら「ピボットテーブルをマクロで」とこだわらない。 など考え方を変えてはいかがでしょうか。
お礼
わかりにくい質問で申し訳ありません。 多いとは言えない知識の中で考えたもので、これ以外に選択が思い浮かびませんでした。これからさらに勉強していきたいと思います。 ありがとうございました。
お礼
早速の丁寧なご回答どうもありがとうございました。 一つ一つ内容を確認しながら、勉強させていただきました。 手元にある参考書で意味を確かめながらなのでかなり理解に時間はかかりましたが、コメントを加えてくださっていたので内容把握の手助けになりました。 作っていただいたものはまさにこう出来たら、と思う理想通りのものです。 実務用にほんの少し手を加えるだけで大幅に効率化が図れそうです。 本当にどうもありがとうございました。 心より感謝いたします。