ピボットテーブルで日付データを集計しているとき、「今月分だけ」「今四半期だけ」のように期間を絞り込みたい場面は多いはずです。手動で日付フィールドのフィルタを操作してもよいのですが、Excel 2013以降で使える「タイムライン」機能を使うと、スライダー感覚で直感的に期間を絞り込めます。
この記事では、このタイムラインをVBAから操作する方法を、新規作成・期間指定・表示単位の切り替え・フィルタ解除まで、実践的なサンプルコード付きで解説します。
タイムラインの正体は「SlicerCache」
VBAの世界では、タイムラインは見た目こそスライサーと異なりますが、内部的には SlicerCache オブジェクトの一種として扱われます。SlicerCache.SlicerCacheType プロパティが xlTimeline になっているものがタイムライン、xlSlicer になっているものが通常のスライサーです。
つまり、タイムラインを操作するコードは「スライサー操作の延長線上」にあると考えると理解しやすくなります。
タイムラインを新規作成する
ピボットテーブルの日付フィールドに対してタイムラインを新規作成するには、SlicerCaches.Add2 メソッドの第4引数に xlTimeline を指定します。
Sub CreatePivotTimeline()
Dim pvt As PivotTable
Dim slc As SlicerCache
Dim sli As Slicer
Set pvt = ActiveSheet.PivotTables(1)
Set slc = ActiveWorkbook.SlicerCaches.Add2(pvt, "受注日", , xlTimeline)
Set sli = slc.Slicers.Add(ActiveSheet, , "受注日タイムライン", "受注日")
End Sub
Add2 の引数は「対象のピボットテーブル」「日付フィールド名」「名前(省略可)」「キャッシュの種類」の順です。名前を省略する場合でも、カンマの位置はそのまま残しておく必要があります。Slicers.Add で実際にワークシート上へ配置し、名前とキャプションを指定しています。
表示期間を指定する
作成済みのタイムラインに対して、表示する期間をコードから直接指定するには TimelineState.SetFilterDateRange を使います。TimelineState は SlicerCache のプロパティとして取得できます。
Sub SetTimelineToThisQuarter()
Dim slc As SlicerCache
For Each slc In ActiveWorkbook.SlicerCaches
If slc.SlicerCacheType = xlTimeline Then
slc.TimelineState.SetFilterDateRange StartDate:=DateSerial(2026, 7, 1), EndDate:=DateSerial(2026, 9, 30)
Exit For
End If
Next slc
End Sub
ブック内にタイムラインが複数ある場合は名前で判定したいところですが、SlicerCacheType で絞り込んでから処理すれば、通常のスライサーを誤って操作する心配がありません。月初・月末の日付を DateSerial で動的に組み立てれば、「先月分だけ表示する」といった処理も自動化できます。
表示単位(日・月・四半期・年)を切り替える
タイムラインは、日・月・四半期・年の単位で表示を切り替えられるのが特徴です。この単位は Slicer.TimelineViewState.Level プロパティで操作します。
Sub SetTimelineLevelToMonth()
Dim slc As SlicerCache
Dim sli As Slicer
For Each slc In ActiveWorkbook.SlicerCaches
If slc.SlicerCacheType = xlTimeline Then
For Each sli In slc.Slicers
sli.TimelineViewState.Level = xlTimelineLevelMonths
Next sli
End If
Next slc
End Sub
Level に指定できる定数は xlTimelineLevelDays・xlTimelineLevelMonths・xlTimelineLevelQuarters・xlTimelineLevelYears の4種類です。月次レポートでは月単位、年間サマリーでは四半期・年単位に切り替える、といった使い分けができます。
フィルタを解除して全期間を表示する
絞り込みを解除して全期間のデータを表示し直したい場合は、SlicerCache.ClearManualFilter メソッドを使います。
Sub ClearTimelineFilter()
Dim slc As SlicerCache
For Each slc In ActiveWorkbook.SlicerCaches
If slc.SlicerCacheType = xlTimeline Then
slc.ClearManualFilter
End If
Next slc
End Sub
レポートを作り直す前や、別の期間で再集計したい前処理として組み込んでおくと便利です。
注意点
- 対象フィールドは日付型のみ:タイムラインは日付・時刻型のフィールドにしか設定できません。文字列として日付が入力されているセルでは
Add2の実行時にエラーになるため、事前に日付型になっているか確認しましょう。 - 名前付き引数でエラーになることがある:
SlicerCaches.Add2やSlicers.Addは、引数名を明示的に指定する(Source:=のような書き方をする)と実行時エラーになる場合があります。上記サンプルのように位置引数(カンマ区切り)で渡すのが安全です。 - Excelのバージョン依存:タイムライン機能自体がExcel 2013以降の機能のため、古いバージョンのExcelでは
xlTimeline定数やタイムライン関連のプロパティが使用できません。
まとめ
タイムラインはVBAから見るとSlicerCacheType = xlTimelineのSlicerCacheとして扱われ、SetFilterDateRangeで期間指定、TimelineViewState.Levelで表示単位の切り替え、ClearManualFilterでフィルタ解除ができます。日付データの多いピボットレポートに組み込めば、期間別の集計・切り替えをワンクリックで自動化できるようになります。ぜひ実務のマクロに活用してみてください。


コメント