У меня есть рабочий лист, который содержит ячейку для государства и ячейку для года с частными подпрограммами, которые будут фильтровать таблицу при вводе значения.Фильтр состояния работает путем автофильтрации по переменной состояния.Переменная year фильтрует сводную таблицу, на которой основан основной рабочий лист.Он работает большую часть времени, но если уже есть значение состояния и значение года, а значение года сбрасывается, вызывается фильтр состояния, но все данные отфильтровываются из основной таблицы.
Я думал, что это происходит слишком рано после обновления сводной таблицы, на которой основаны данные, поэтому я попытался вставить команду DoEvents после обновления сводной таблицы, но это не решило проблему.В том же духе я попробовал refresh.pivotcache и refreshall.
Вот код, который я использовал:
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
ActiveSheet.DisplayPageBreaks = False
Dim pt As PivotTable, pf As PivotField, yearx As String, PTLastRow As Long
PTLastRow = Worksheets("PivotTable").Range("A" & Rows.Count).End(xlUp).Row
Set pt = Worksheets("PivotTable").PivotTables("PivotTable1")
Set pf = pt.PivotFields("Year")
yearx = Worksheets("ServiceCalls").Range("$C$2").Value
With pt
If yearx = "2019" Then
pf.ClearAllFilters
pf.PivotItems("2018").Visible = False
pf.PivotItems("2017").Visible = False
ElseIf yearx = "2018" Then
pf.ClearAllFilters
pf.PivotItems("2019").Visible = False
pf.PivotItems("2017").Visible = False
ElseIf yearx = "2017" Then
pf.ClearAllFilters
pf.PivotItems("2018").Visible = False
pf.PivotItems("2019").Visible = False
Else
pf.ClearAllFilters
End If
End With
Application.Calculation = xlCalculationAutomatic
With Worksheets("ServiceCalls")
If Len(.Range("$C$1")) = 2 Then
.ListObjects("Table1").Range.AutoFilter Field:=1
Call StateFilter
Exit Sub
Else
Range("A4" & ":" & "E" & PTLastRow).FillDown
Range("Table1[#All]").RemoveDuplicates Columns:=Array(1, 2), Header:=xlGuess
Range("D4" & ":" & "E" & PTLastRow).FillDown
End If
End With
Application.ScreenUpdating = True
ActiveSheet.DisplayPageBreaks = PageBreakState
Application.EnableEvents = True
End Sub
Sub StateFilter ()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
ActiveSheet.DisplayPageBreaks = False
Dim statex As String, PTLastRow As Long, LastStateRow As Long, where As Range
PTLastRow = Worksheets("PivotTable").Range("A" & Rows.Count).End(xlUp).Row
statex = Worksheets("ServiceCalls").Range("$C$1")
Set where = Worksheets("PivotTable").Range("A:A").Find(what:=statex, searchdirection:=xlPrevious)
LastStateRow = Mid(where.Address(0, 0), 2) + 2
With Worksheets("ServiceCalls")
If Len(.Range("$C$1")) = 2 Then
.ListObjects("Table1").Range.AutoFilter Field:=1
.Range("Table1[#All]").RemoveDuplicates Columns:=Array(1, 2), Header:=xlGuess
.Range("D4").Formula = "=CountIF(PivotTable!A:A,ServiceCalls!A4)"
.Range("E4").Formula = "=CountIFS(PivotTable!B:B,ServiceCalls!B4,PivotTable!A:A,ServiceCalls!A4)"
.Range("D4:E" & LastStateRow).FillDown
.ListObjects("Table1").Range.AutoFilter Field:=1, Criteria1:=statex
Else
.ListObjects("Table1").Range.AutoFilter Field:=1
.Range("Table1[#All]").RemoveDuplicates Columns:=Array(1, 2), Header:=xlGuess
.Range("D4").Formula = "=CountIF(PivotTable!A:A,ServiceCalls!A4)"
.Range("E4").Formula = "=CountIFS(PivotTable!B:B,ServiceCalls!B4,PivotTable!A:A,ServiceCalls!A4)"
.Range("D4:E" & PTLastRow).FillDown
End If
End With
Application.ScreenUpdating = True
ActiveSheet.DisplayPageBreaks = PageBreakState
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
Если ячейка состояния и год заполнены, а год удален, сводная таблица должна быть сброшена для отображения всех лет, тогда должен быть вызван фильтр состояний, чтобы основная таблица показывала только строки для этого состояния.