皆様こんにちは、ノグチです。
エクセルのピボットテーブル、便利ですよね。
ちょっとした集計表ならピボットテーブルで十分!というケースも多いかと思います。
でも、時々ピボットテーブルの更新をするのを忘れて、「あれ?数値がおかしい…」なんて思ってしまうこと、ありませんか?
あるいは、「シートの値を更新したら、自動的にピボットテーブルも更新してくれないかなあ」と思ったりしませんか?
そんな時は、VBAを使うと便利ですよ!
VBAでピボットテーブルを更新する2通りの方法
まず、VBAでピボットテーブルを更新する方法は、以下の2つがあります。
- PivotCacheオブジェクトのRefreshメソッドで更新する
- PivotTableオブジェクトのRefreshTableメソッドで更新する
上記2つのメソッドとも、手動でピボットテーブルの「更新」をクリックした時と同様、ピボットテーブルを更新してくれるメソッドです。
では、2つの違いや記述方法を見ていきましょう。
PivotCacheオブジェクトのRefreshメソッド
Refreshメソッドの記述方法
まずはPivotCacheオブジェクトのRefreshメソッド。
このメソッドは、ピボットテーブルのデータソースをもう一度読み込んで、ピボットテーブルの値を更新してくれます。
記述方法はこちら。
Refreshメソッドの使用例
記述例はこんな感じです。
Sub Pivot_Refresh With ActiveSheet .PivotTables("ピボットテーブル1").PivotCache.Refresh End With End Sub
シート上にある「ピボットテーブル1」というピボットテーブルを更新する、というコードです。
PivotTableオブジェクトのRefreshTableメソッド
RefreshTableメソッドの記述方法
お次はPivotTableオブジェクトのRefreshTableメソッド。
こちらもピボットテーブルを更新してくれるメソッドです。
上でご紹介したRefreshメソッドとの大きな違いは、返り値があるということ。
ピボットテーブルの更新ができればTrue、そうでなければFalseの返り値をBoolean型で返してくれます。
記述方法はこちら。
RefreshTableメソッドの使用例
このメソッドは返り値を返してくれるので、ピボットテーブルを更新できたことを前提とした処理をさせたい場合は、このメソッドを使って、「返り値がTrueだったら」という記述ができますね。
例えばこんな風に。
Sub Refresh_by_RefreshTable Dim blnRefresh as Boolean blnrefresh = .PivotTables("ピボットテーブル1").RefreshTable If blnRefresh = True Then MsgBox "更新しました!" End If End Sub
Worksheets.Changeイベントでピボットテーブルを自動更新させる
ピボットテーブルをVBAで更新する方法をご紹介したところで、今回の主題である、ピボットテーブルを自動更新する方法を考えていきましょう。
ピボットテーブルを更新したいタイミングは、データソース範囲内の値が変更されたときですよね。
ということは、ワークシート上の値が変更されたということなので、Worksheets.Changeイベントを使えば、自動更新ができますね。
ということで、こちらのピボットテーブルを、Worksheets.Changeイベントと、PivotCacheオブジェクトのRefreshメソッドを組み合わせて、ピボットテーブルを自動更新させてみましょう。
A~C列のデータを、F~G列の「売上」というピボットテーブルにまとめています。
ピボットテーブルを自動更新させるコード
上記のワークシートが更新された時に、「売上」ピボットテーブルを自動更新させるコードがこちら。
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False With ActiveSheet .PivotTables("売上").PivotCache.Refresh End With Application.EnableEvents = True End Sub
Worksheet.Changeイベント内で、PivotCacheオブジェクトのRefreshメソッドを使ってピボットテーブルを更新させています。
EnableEventsプロパティの設定を忘れずに
上のコードには、ApplicationオブジェクトのEnableEventsプロパティが入っていますね。
これは、エクセルが、VBAで実行するピボットテーブルの更新をシートの更新とみなしてしまうようで、Worksheet.Changeイベント内がRefresh処理のコードだけでは、こんなエラーになってしまうのです。
その為、EnableEventsプロパティを使って一旦イベント実行をOFFにし、Worksheet.Changeイベントでやりたいことが終わったら再度イベントが実行されるようにONにしています。
EnableEventsプロパティについはこちらの記事で紹介していますので、併せてご覧ください。
ピボットテーブルの自動更新
では、上のコードを保存して、ピボットテーブルを自動更新させてみましょう。
更新されたことがわかりやすいように、表の1行目にある2019年8月1日の「すいか」レコードの売上を100,000に変更してみると…
この通り、ピボットテーブルが自動的に更新されましたね。
関係ないセルの変更でもピボットテーブルが更新されてしまう
さて、ここまでピボットテーブルの自動更新についてご紹介してきましたが、ここでご紹介したコードだと、ピボットテーブルのデータソース範囲外のセルを更新しても、ピボットテーブルの更新が実行されてしまいます。
データソース範囲以外が変更されたことでピボットテーブルの更新が実行されても、ピボットテーブルの値自体には影響はありません。
しかし、実行する必要のない処理はできるだけ省きたいもの。
データソースが更新された時のみ、ピボットテーブルを更新させる方法は無いものか…
大丈夫、ちゃんと方法がありますよ。
その方法は、次回の記事でご紹介していきます。
最後に
今回は、PivotTableオブジェクトのRefreshTableメソッドと、PivotCacheオブジェクトのRefreshメソッドという2つのメソッドのご紹介と、Worksheet.Changeイベントと組み合わせて、ピボットテーブルを自動更新させる方法をご紹介しました。
次回の記事では、ピボットテーブルのデータソース範囲が変更された場合のみ、ピボットテーブルを更新する方法をご紹介していきます。
それでは、最後までお読みいただきありがとうございました!