Фильтры столбцов сводной таблицы с изменением исходных данных - PullRequest
1 голос
/ 26 июня 2019

Я создал макрос, который подключается к SAP, делает свое дело, получает ответ и записывает его в электронную таблицу.Проблема в том, что прежде чем скрипт сможет это сделать, мне нужно иметь данные по кластерам.

Для понимания у меня есть список клиентов с их кодами, и я создал мастер-ключ для каждого из них,потому что прежде, чем я введу его в SAP, мне нужно отфильтровать клиентов по кодам мастер-ключа, которые равны, поэтому SAP примет это.Но в исходном файле у меня будет несколько кодов мастер-ключа.

Я сделал сводную таблицу и поместил мастер-ключ в столбцы, чтобы видеть код клиента по мастер-ключу.

Имея это в виду, я фильтрую по основному ключу, и у меня есть для него конкретные коды клиентов, и теперь я могу отправить его в SAP.И повторите для всех мастер-ключей в файле.Эта информация будет меняться каждый раз из отдела продаж, поэтому мастер-ключи также будут меняться каждый раз.

Что мне нужно сделать, так это получить все мастер-ключи из файла (сделано) и место, где я 'Я застрял, используйте его, чтобы скрыть и показать по одному внутри цикла.Например (MK обозначает Мастер Ключ):

Customer MK1 MK2 MK3 MK4
   X      1
   Y          1
   Z          1
   A      1

Поэтому я фильтрую MK1, получаю код клиента для него, запускаю SAP, возвращаюсь к сводной таблице, фильтрую следующий существующий код, получаю код клиента,запустить SAP и повторить все заново.

If Range("A2") <> "" Then

    Range("A1").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(-1, 1).Select
    Range(Selection, Selection.End(xlUp)).FillDown

    FILTRO2 = ActiveCell

    Range("A1").Select

            Do While ActiveCell <> ""

                FILTRO = ActiveCell

                Sheets("Dinâmica").Activate

                ActiveWorkbook.RefreshAll

                With ActiveSheet.PivotTables("Tabela dinâmica2").PivotFields("Chave")
                    .PivotItems(Split(FILTRO2.Value, ",")).Visible = False
                    .PivotItems(FILTRO).Visible = True
                End With

Как видно из кода выше, я зашел в тупик.Не работает вообще.

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете переключить каждую отдельную «мастер-клавишу», видимую с помощью Pivotitem.Visible.
Обратите внимание, что всегда должен оставаться видимым хотя бы 1 стержень.

Получающиеся в результате видимые «клиенты» могут быть прочитаныот PivotField.DataRange, который представляет все видимые ключевые точки этого основного поля.Вы можете обращаться к этому диапазону ячейка за ячейкой или присваивать его значение массиву.

Private Sub FilterMasterkeys()
    Dim pt As PivotTable
    Dim pfCustomer As PivotField
    Dim pfMasterkey As PivotField
    Dim i As Long
    Dim c As Range ' a cell

    Set pt = ActiveWorkbook.Sheets("Dinâmica").PivotTables("Tabela dinâmica2")
    pt.RefreshTable

    Set pfCustomer = pt.RowFields(1)
    Set pfMasterkey = pt.ColumnFields("Chave")

    ' hide all masterkeys except first
    pfMasterkey.PivotItems(1).Visible = True
    For i = 2 To pfMasterkey.PivotItems.Count
        pfMasterkey.PivotItems(i).Visible = False
    Next i

    ' set each masterkey visible and get corresponig customers
    For i = 1 To pfMasterkey.PivotItems.Count - 1
        pfMasterkey.PivotItems(i).Visible = True
        Debug.Print "Masterkey " & pfMasterkey.PivotItems(i).Caption & " is used by ",
        For Each c In pfCustomer.DataRange.Cells
            Debug.Print c.Value,
        Next c
        Debug.Print

        pfMasterkey.PivotItems(i + 1).Visible = True
        pfMasterkey.PivotItems(i).Visible = False
    Next i

    ' get the last one also
    Debug.Print "Masterkey " & pfMasterkey.PivotItems(i).Caption & "is used by ",
    For Each c In pfCustomer.DataRange.Cells
        Debug.Print c.Value,
    Next c
    Debug.Print

End Sub

Если вам нужны все соответствующие клиенты в качестве массива, используйте это после переключения следующего видимого мастер-ключа:

Dim arrCustomers() As Variant
arrCustomers = pfCustomer.DataRange.Value
...