Excel VBA: как использовать массив в качестве критериев фильтрации для сводной таблицы - PullRequest
0 голосов
/ 20 марта 2020

У меня есть отчет, который генерируется каждый месяц, который показывает нехватку и перевыполнение всех ПО, проданных в этом месяце. Я создаю макрос, который форматирует данные таким образом, чтобы показывать только то, какие накладные имели перерасход. Я построил большую часть макроса для динамической работы, но на моем пути есть только еще одна проблема. На активном листе есть 2 сводные таблицы, PivotTable1 фильтруется, чтобы отображать только счета-фактуры с перерасходами, поэтому я пошел дальше и написал код для хранения всех значений в ArrayA. Теперь мне нужно PivotField PivotTable2 ("Inv"), чтобы отобразить счета в ArrayA. Код, который у меня есть, теперь выполняется, но он просто просматривает каждый элемент Pivot в этом поле и скрывает его. Кажется, что есть проблема с тем, какое значение проверяется, когда он решает, скрывать или нет элемент Pivot или нет, или я считаю, что способ включения массива неправильный. В любом случае вот мой код:

Sub OverageArray()

Dim ArrayA() As Variant
Dim Counter As Integer
Dim RowCount As Long

Dim PT As PivotTable
Dim PTItm As PivotItem

Set PT = ActiveSheet.PivotTables("PivotTable2")

RowCount = (Range("A1048576").End(xlUp).Offset(-1, 0).Row - 3)

ReDim ArrayA(RowCount)

    'For Loop that Builds the Array
    For Counter = 0 To RowCount
        ArrayA(Counter) = Cells((Counter + 4), 1).Value
    Next

    'This Filters the Pivot Field Based on the Array's Values
    For Each PTItm In PT.PivotFields("Inv#").PivotItems
        If Not IsError(Application.Match(PTItm.Caption, ArrayA, 0)) Then ' check if current item is not in the filter array
            PTItm.Visible = True
        Else
            PTItm.Visible = False
        End If
    Next PTItm

End Sub

1 Ответ

0 голосов
/ 27 марта 2020

Хорошие новости, я смог выяснить это на своем пути.

Оказалось, что объявление ArrayA () в качестве варианта сохранило значения как целые числа, и этот код, казалось, работал только тогда, когда значения были сохранены как строки. Поэтому все, что мне нужно было сделать, это объявить ArrayA () как String вместо Variant, чтобы он сохранял все значения в виде строк вместо целых чисел.

...