Фильтрация сводной таблицы для указанных значений ячеек c выдает ошибку - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над этим VBA-сценарием Excel, который фильтрует сводную таблицу с указанными c значениями в данном поле сводной таблицы. Тем не менее, мне нужно, чтобы это было более динамично c. Каждый раз, когда мой макрос фильтрует что-то, чего нет в текущем поле Pivot, я получаю сообщение об ошибке. Не могли бы вы, ребята, помочь мне найти решение, которое могло бы обойти эту ошибку?

У меня есть следующий код фильтрации, который прекрасно работает, когда все данные .PivotItems присутствуют в данных, но это меняется от данных к данным, и я не может вводить это вручную каждый раз, чтобы иметь то же самое, что и в данных:

With ActiveSheet.PivotTables("PivotTable3").PivotFields("Dispute ")
        '.PivotItems("CA - Carriage").Visible = False
        '.PivotItems("Credit").Visible = False
        .PivotItems("DOC - Documentation issue").Visible = False
        .PivotItems("Paid").Visible = False
        .PivotItems("Promise to pay").Visible = False
        '.PivotItems("QQ - Quantity Query").Visible = False
        .PivotItems("SR - Sales Related").Visible = False
        .PivotItems("(blank)").Visible = False
        .PivotItems("PT - Payment Terms").Visible = False
        .PivotItems("payment in advance").Visible = False
        .PivotItems("Bancrupcy").Visible = True
        .PivotItems("PO - Purchase Order").Visible = False
        .PivotItems("RT - Returns").Visible = False
        .PivotItems("to be reconcilied").Visible = False
        .PivotItems("Dispute - Resolved").Visible = False
        .PivotItems("Follow up ").Visible = False
        .PivotItems("escalation").Visible = False
    End With

Допустим, ".PivotItems (" escalation "). Visible = False" не присутствует в данных на этот раз, макрос затем выдает ошибку при попытке отфильтровать его. Я думаю, что это глупое решение для фильтрации VBA, оно далеко не надежно. Можете ли вы помочь мне найти более элегантное решение для этого?

Должно быть решение, которое просто предоставляет ".PivotItems", который я хочу показать в фильтре и игнорировать остальные, но до сих пор я не мог точно определить, что Google Мне нужно.

Заранее спасибо!

1 Ответ

0 голосов
/ 14 апреля 2020

вы можете использовать массив для хранения (и) искомых полей и повторения по ним:

Dim fields As Variant, field As Variant

fields = Array("field1", "field2", "field8")' <-- name of the fields you want to hide
With ActiveSheet.PivotTables("PivotTable3").PivotFields("Dispute ")
    For Each field In fields
        .PivotItems(field).Visible = False
    Next
End With

Редактировать после разъяснений ОП

или, если вы уже знаете поля, которые вы хочу быть видимым:

Dim fieldsIWantToShowForSure As Variant
fieldsIWantToShowForSure = Array("field1", "field2", "field8")

Dim pvtIt As PivotItem
With ActiveSheet.PivotTables("PivotTable3").PivotFields("Dispute ")
    For Each pvtIt In .PivotItems
        If IsError(Application.Match(pvtIt.Name, fieldsIWantToShowForSure, 0)) Then pvtIt.Visible = False
    Next
End With
...