ピボットテーブルで集計した数値は、表のままでも十分便利ですが、グラフにするとひと目で傾向がつかめるようになります。ピボットテーブルを毎回手動でグラフ化していると、データが更新されるたびに作り直す手間がかかってしまいます。
この記事では、既に作成済みのピボットテーブルからVBAでピボットグラフ(PivotChart)を自動作成する方法と、ピボットテーブルを更新したときにグラフも連動して最新の状態を保つ仕組みを解説します。
ピボットグラフとは
ピボットグラフは、通常のグラフとは異なり、元になっているピボットテーブルと連動して動くグラフです。ピボットテーブルのデータを更新(リフレッシュ)すると、グラフ側も自動的に最新のデータに切り替わります。フィールドの絞り込み(フィルター)を変更した場合も、グラフの表示がそのまま連動します。
VBAでピボットグラフを作成するには、グラフの参照元(SetSourceData)にピボットテーブルの範囲を指定するだけです。これだけで、Excelが自動的に通常のグラフではなくピボットグラフとして扱ってくれます。
準備:対象のピボットテーブルを確認する
この記事では、「集計」シートに「売上集計」という名前のピボットテーブルが既に作成済みであることを前提とします。ピボットテーブルの名前は、ピボットテーブル上で右クリック→「ピボットテーブルオプション」から確認・変更できます。
VBAコード:ピボットテーブルからピボットグラフを自動作成する
Sub CreatePivotChartFromPivotTable()
Dim ws As Worksheet
Dim pt As PivotTable
Dim chartObj As ChartObject
Set ws = ThisWorkbook.Worksheets("集計")
Set pt = ws.PivotTables("売上集計")
'同名のグラフが既にあれば削除してから作り直す(再実行対応)
On Error Resume Next
ws.ChartObjects("売上グラフ").Delete
On Error GoTo 0
Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=20, Width:=450, Height:=300)
chartObj.Name = "売上グラフ"
With chartObj.Chart
.SetSourceData Source:=pt.TableRange1
.ChartType = xlColumnClustered
.HasTitle = True
.ChartTitle.Text = "月別売上集計"
End With
MsgBox "ピボットグラフを作成しました。", vbInformation
End Sub
ポイントは SetSourceData Source:=pt.TableRange1 の部分です。参照元にピボットテーブルの範囲を渡すことで、通常のグラフではなくピボットテーブルと連動したピボットグラフが作成されます。再実行してもエラーにならないよう、同名のグラフが既にある場合は事前に削除する処理を入れています。
グラフの種類やタイトルを変更する
ChartType プロパティを変更すれば、棒グラフ以外の形式にも簡単に切り替えられます。よく使うグラフの種類は次のとおりです。
xlColumnClustered:集合縦棒グラフxlLine:折れ線グラフxlPie:円グラフ
例えば、月別の推移を見たい場合は折れ線グラフの方が適しているため、次のように変更します。
chartObj.Chart.ChartType = xlLine
ピボットテーブル更新時にグラフを最新化する
ピボットグラフは、ピボットテーブルのキャッシュ(PivotCache)を更新すると自動的に表示が最新化されます。データソースに新しい行を追加した場合は、次のようにキャッシュを更新するだけでグラフも連動します。
Sub RefreshPivotAndChart()
Dim ws As Worksheet
Dim pt As PivotTable
Set ws = ThisWorkbook.Worksheets("集計")
Set pt = ws.PivotTables("売上集計")
pt.PivotCache.Refresh
End Sub
また、ユーザーが手動でピボットテーブルを更新した際に、グラフのデータラベル表示など一部の書式がリセットされてしまうことがあります。そのようなケースでは、シートモジュールに Worksheet_PivotTableUpdate イベントを実装しておくと、更新のたびに書式を自動で再設定できます。
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
If Target.Name = "売上集計" Then
Me.ChartObjects("売上グラフ").Chart.SeriesCollection(1).HasDataLabels = True
End If
End Sub
このコードは「集計」シートのシートモジュールに貼り付けます。ピボットテーブルが更新されるたびに実行され、データラベルの表示設定を維持してくれます。
実行時に注意したいポイント
- ピボットテーブル名やグラフ名(
ChartObjects("売上グラフ")の部分)は、実際のシート上の名前と完全に一致させる必要があります。名前が異なるとエラーになるため、事前に確認しておきましょう。 SetSourceDataで参照元に指定するのは、ピボットテーブルのTableRange1(フィルターエリアを除いた本体部分)です。TableRange2(フィルターエリアを含む全体)を指定するとエラーになる場合があるため注意してください。- ピボットテーブルのレイアウトを大きく変更した場合、連動しているグラフの表示もそれに合わせて変わります。想定と異なる見た目になっていないか、更新後は一度確認する習慣をつけましょう。
まとめ
この記事では、既存のピボットテーブルからSetSourceDataを使ってピボットグラフを自動作成する方法と、ピボットテーブル更新時にグラフの書式を維持するWorksheet_PivotTableUpdateイベントの活用方法を紹介しました。
集計データをグラフ化する作業をマクロに任せておけば、データが増えるたびに手作業でグラフを作り直す必要がなくなります。月次レポートや売上分析など、定期的に更新する集計表にぜひ組み込んでみてください。


コメント