【ExcelVBA・マクロ】ピボットテーブルのタイムライン(Timeline)をVBAで操作する方法|期間フィルタを自動設定【コピペOK】

ExcelVBA

ピボットテーブルで日付データを集計しているとき、「今月分だけ」「今四半期だけ」のように期間を絞り込みたい場面は多いはずです。手動で日付フィールドのフィルタを操作してもよいのですが、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 を使います。TimelineStateSlicerCache のプロパティとして取得できます。

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 に指定できる定数は xlTimelineLevelDaysxlTimelineLevelMonthsxlTimelineLevelQuartersxlTimelineLevelYears の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.Add2Slicers.Add は、引数名を明示的に指定する(Source:= のような書き方をする)と実行時エラーになる場合があります。上記サンプルのように位置引数(カンマ区切り)で渡すのが安全です。
  • Excelのバージョン依存:タイムライン機能自体がExcel 2013以降の機能のため、古いバージョンのExcelでは xlTimeline 定数やタイムライン関連のプロパティが使用できません。

まとめ

タイムラインはVBAから見るとSlicerCacheType = xlTimelineSlicerCacheとして扱われ、SetFilterDateRangeで期間指定、TimelineViewState.Levelで表示単位の切り替え、ClearManualFilterでフィルタ解除ができます。日付データの多いピボットレポートに組み込めば、期間別の集計・切り替えをワンクリックで自動化できるようになります。ぜひ実務のマクロに活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました