3/22/2019

Excel。マクロ043。ピボットテーブルをマクロでつくってみる【Excel VBA】

Excel。マクロ043。ピボットテーブルをマクロでつくってみる

<Excel VBA:ピボットテーブル>

集計するのに便利な「ピボットテーブル」をマクロで作ることはできますか?と聞かれることがありますので、次のようなピボットテーブルをExcel VBAで作ってみましょう。

【マクロの記録だとわかりにくい】

「マクロの記録」を使った場合を確認してみましょう。

開発タブのマクロの記録をつかい、マクロを作成したものを確認してみましょう。

Sub ピボットのマクロ()
    Sheets.Add
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "R1C1:R451C6", Version:=xlPivotTableVersion15). _
        CreatePivotTable TableDestination:="Sheet3!R3C1", TableName:="ピボットテーブル2" _
        , DefaultVersion:=xlPivotTableVersion15
    Sheets("Sheet3").Select
    Cells(3, 1).Select
    With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("商品名")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("曜日")
        .Orientation = xlColumnField
        .Position = 1
    End With
    ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル2").PivotFields("金額"), "合計 / 金額", xlSum
End Sub

このように、マクロの記録で、ピボットテーブルを作るマクロを作成はできるのですが、範囲も固定されているし、シート名が固定されていたり、長い構文で、わかりにくいのも欠点ですね。

そこで、Excel VBAでつくってみると、とてもわかりやすくなります。

【Excel VBAでピボットテーブル】

まず、次のようなExcel VBA構文をつくってみます。

Sub ピボットのvba()
    Dim hani As Range
    Dim pvc As PivotCache
 
    Set hani = ActiveCell.CurrentRegion
 
    Sheets.Add
 
    Set pvc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=hani, Version:=xlPivotTableVersion15)
 
    pvc.CreatePivotTable Range("a3")
 
    With ActiveSheet.PivotTables(1)
        .PivotFields("商品名").Orientation = xlRowField
        .PivotFields("曜日").Orientation = xlColumnField
        .PivotFields("金額").Orientation = xlDataField
    End With
    Range("a3").Activate

End Sub

では、実行してみましょう。


このように、ピボットテーブルを使って集計することができました。
それでは、確認してみましょう。

最初は、変数宣言です。
Dim hani As Range
この変数は、データの範囲で使います。

Dim pvc As PivotCache
このpvcという変数に、ピボットキャッシュを格納するので、オブジェクト型のPivotCacheで宣言します。

Set hani = ActiveCell.CurrentRegion
データの範囲を変数に格納します。

Sheets.Add
新しいシートにピボットテーブルを作成しますので、シートを追加します。

ここまでが、準備ですね。ピボットテーブルを作る時のダイアログボックスとほぼ同じ内容です。

【ピボットテーブルキャッシュを作成】

Set pvc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=hani, Version:=xlPivotTableVersion15)

Createメソッドで、PivotCacheオブジェクトを取得して、pvcに代入させます。
SourceType:=xlDatabase は、どのデータからピボットテーブルを作るのかを教える必要があります。xlDatabaseは、「Exccelの表」のことです。

SourceData:=hani は、xlDatabaseのデータ元となるセル範囲を指定します。
今回は、
Set hani = ActiveCell.CurrentRegion
で、範囲選択させています。

Version:=xlPivotTableVersion15 は、ピボットテーブルのバージョンを設定します。

バージョン?と思うかもしれませんが、Excelのバージョンでピボットテーブルは変わっています。

指定しないと、Excel2003のピボットテーブルをつくるデザインになります。
Excel2003は、xlPivotTableVersion11で値は2。
Excel2010は、xlPivotTableVersion14で値は4。
Excel2013は、xlPivotTableVersion15で値は5。
と設定されています。
今回は、Excel2013で作成していますので、xlPivotTableVersion15を使用しております。なお、Excel2016は、値6で設定します。

【ピボットテーブルの作成】

pvc.CreatePivotTable Range("a3")
ピボットテーブルキャッシュを格納したオブジェクト(pvc)から、CreatePivotTableメソッドを使用して、ピボットテーブルを作成します。

Range(“a3”)は、A3を起点に作ります。省略していますが、
TableDestination:=Range("a3")と記述します。

【ピボットテーブルにフィールドを追加】


With ActiveSheet.PivotTables(1)
     .PivotFields("商品名").Orientation = xlRowField
     .PivotFields("曜日").Orientation = xlColumnField
     .PivotFields("金額").Orientation = xlDataField
End With

ActiveSheet.PivotTables(1)を行フィールド・列フィールド・値フィールドごとに記載するのは面倒なので、With~End Withで省略させます。

PivotFields("商品名").Orientation = xlRowField は、参照したいフィールド("商品名")をPivotFieldsメソッドで指定して、Orientationプロパティで、行(xlRowField)などを設定していきます。

xlRowFieldは、ROWなので行ですね。
xlColumnFieldは、Columnなので列ですね。
xlDataFieldは、Dataなので値ですね。

これで、ピボットテーブルが完成しました。

ピボットテーブルを作る時の流れですが、
最初は、ピボットテーブルキャッシュを作成
次に、ピボットテーブルの作成
最後に、ピボットテーブルにフィールドを追加

と大きく、3つの行程で作っていきます。