2026年1月24日土曜日

vbaでピボットをフィルターするならタイムラインがいい

vbaでピボットに左上隅のフィルターフィールドの項目で日付によるフィルターをかけたところ、笑えるぐらいの遅さのため、断念した。左上隅のフィルターフィールドの項目をフィルターするには、ひとつひとつの項目を表示(項目.visible=True)するのか、非表示(false)とするのかの設定しなければならない。そして、このFalse或いはTrueを設定するのに恐ろしく時間がかかるためだ。一つやるのに時間がかかる。数秒かかる。数個の商品ぐらいならば、高速処理できるが、日付を複数、非表示にするといったケースでは全く使えない。本当に使えない。

    Dim i As Long
    Dim pt As PivotTable
    Dim pf As PivotField
    Set pt = ActiveSheet.PivotTables(1)
    With pt.PivotFields("商品")  
        itemsToHide = Array("りんご", "そば", "ハンバーガー","ラーメン")
        pf.ClearAllFilters
        For i = LBound(itemsToHide) To UBound(itemsToHide)
            pf.PivotItems(itemsToHide(i)).Visible = False    'ItemsToHideの項目のみ非表示にする。
        Next i
    End With
    Set pt = Nothing
数多の試行錯誤で、辿り着いたのは、左上隅のフィルターでななく、タイムラインとPivotFilters.Add2による日付フィルターであった。こちらは、とても高速で処理してくれる。
Sub TestAddPivotFilter2()
    AddPivotFilter2("2026/01/01","2026/01/31")
End Sub
Sub AddPivotFilter2(sDate As String,eDate As String)
    Dim pt As PivotTable
    Dim pf As PivotField
    Set pt = ActiveSheet.PivotTables(1)
    With pt.PivotFields("日付")
        .ClearAllFilters 
        .PivotFilters.Add2 _
            Type:=xlDateBetween, _
            Value1:= sDate, Value2:= eDate
    End With
End Sub
あとは、ピボットテーブルの分析タブで、タイムラインを作成すればOKだ。sDate,eDateを変えるだけで自在に高速フィルターをかけることができる。 実は、空白の日付があると、それをフィルターすることができない。じゃ、どうするというと、例えば、遠い未来の日付にすることで、フィルターすることが可能となる。 空白の日付は、よく発生する。リアルワールドでは実にしばしば、発生する。何かの完了日とすれば、その処理が完了していないことを意味する空白の日付が誕生するわけだ。マイクロソフトではこの空白の日付がそのままでは、フィルターすることができない。ので、未来の日付にしておくわけだ。

0 件のコメント:

コメントを投稿