Метка строки TGL в сводной таблице фильтруется с помощью пользовательского фильтра, как показано на рисунке ниже.

Что мне нужно, так это код vba, чтобы узнать, какое значение критерия отфильтровано TGL. (В данном случае значение критерия — «1 января 2022 года»), поэтому мне не нужно запускать макрос с избыточным кодом, например sub test1 ниже:
Sub test1()
Dim dt As String
dt = Format(DateAdd("m", -2, Format("01/" & Month(Date) & "/" & Year(Date))), "dd-mmmm-yyyy")
With ActiveSheet.PivotTables("ptHarga").PivotFields("TGL")
.ClearAllFilters
.PivotFilters.Add Type:=xlAfterOrEqualTo, Value1:=dt
End With
End Sub
Хотя меня это не задевает, но sub test1 снова и снова фильтрует TGL по одним и тем же критериям, хотя предыдущее состояние TGL уже отфильтровано по этим критериям.
Итак, я делаю подпрограмму, в которой используется IF.... :
Sub test2()
Dim dtNow As Date
dtNow = Format(DateAdd("m", 1, Format("01/" & Month(Date) & "/" & Year(Date))), "dd-mmm-yyyy")
With ActiveSheet.PivotTables("ptHarga").PivotFields("TGL")
For Each pit In .PivotItems
If DateDiff("m", CDate(pit), dtNow) = 3 Then Call test1: Exit For
Next
End With
End Sub
В подтесте 2 dtNow используется только для предположения, что макрос запускается в апреле 2022 года. если разница в месяце составляет 3 месяца от любого элемента сводки TGL, то пришло время изменить критерии на «1-февраль-2022» (вызовите test1).
Я также пробовал другой саб, используя application.min, без цикла.
Sub test3()
Dim dtNow As Date
dtNow = Format(DateAdd("m", 1, Format("01/" & Month(Date) & "/" & Year(Date))), "dd-mmm-yyyy")
With ActiveSheet.PivotTables("ptHarga").PivotFields("TGL")
.ClearAllFilters
If DateDiff("m", CDate(Application.Min(.DataRange)), dtNow) = 3 Then Call test1
End With
End Sub
Из любопытства, мой вопрос :
Есть ли код, который может напрямую получить значение критерия в текущем отфильтрованном TGL поля сводной таблицы?
Будем очень признательны за любой ответ.
Заранее благодарю.


Например:
Dim pt As PivotTable, pf As PivotField
Set pt = ActiveSheet.PivotTables(1)
With pt.PivotFields("Date").PivotFilters(1)
Debug.Print "Type", .FilterType
Debug.Print "Value1", .Value1
End With
См.: https://docs.microsoft.com/en-us/office/vba/api/excel.pivotfilter
Это именно то, что я ищу. Большое спасибо, Тим Уильямс. (и спасибо за ссылку).