Проблема сортировки макросов Excel, из-за которой переменная, которая обычно автоматически фильтрует таблицу, приводит к появлению всех пробелов, если обновлена ​​сводная таблица, на которой она основана - PullRequest
0 голосов
/ 03 мая 2019

У меня есть рабочий лист, который содержит ячейку для государства и ячейку для года с частными подпрограммами, которые будут фильтровать таблицу при вводе значения.Фильтр состояния работает путем автофильтрации по переменной состояния.Переменная 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

Если ячейка состояния и год заполнены, а год удален, сводная таблица должна быть сброшена для отображения всех лет, тогда должен быть вызван фильтр состояний, чтобы основная таблица показывала только строки для этого состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...