VBA — Перебор отфильтрованных данных сводной таблицы

#excel #vba

#excel #vba

Вопрос:

Исходное сообщение было удалено, поскольку изменился контекст вопроса.

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

Вот исходная таблица:

введите описание изображения здесь

Сводная таблица:

введите описание изображения здесь

Применен фильтр:

введите описание изображения здесь

Сводная таблица:

введите описание изображения здесь

Нет, когда я запускаю свой код, он не фиксирует данные, которые я вижу, которые отфильтрованы, он по-прежнему считывает ВСЮ дату для fk_new_component.

Код:

     Sub Results_06_Filter_Pivot_Table(myArray As Variant)

        Set tmpltWkbk = Workbooks("New DB.xlsm")
        Set ws1 = tmpltWkbk.Sheets("Pivot")
        Set PvtTbl = ws1.PivotTables("PivotTable")

'Array of fk_keyword unique values
        myArr = myArray

        Application.ScreenUpdating = False

        PvtTbl.ManualUpdate = True

        Set pvtField = PvtTbl.PivotFields("fk_keyword")

        With pvtField
            .Orientation = xlPageField
            .Position = 1
        End With

        PvtTbl.ManualUpdate = False

        ws1.Activate

        For i = LBound(myArr) To UBound(myArr)

            If i <> 0 Then

                pvtField.ClearAllFilters

                pvtField.CurrentPage = myArr(i)

                With ws1

                    Set compField = PvtTbl.PivotFields("fk_new_component")

                    'For Each PvtItem In PvtTbl.VisibleFields
                    For Each Pi In compField.PivotItems

                        If Pi <> "" And Pi.Visible Then

                            i = i   1
                            ReDim Preserve arrCompElements(i)
                            arrCompElements(i) = PvtItem.Name

                        End If

                    Next Pi

                End With

            End If

        Next i

        'pvtField.ClearAllFilters

        For Each pvtField In PvtTbl.PageFields
          pvtField.Orientation = xlHidden
        Next pvtField

        Application.ScreenUpdating = True

        PvtTbl.ManualUpdate = False

    End Sub
  

Комментарии:

1. Не pvtField.ClearAllFilters делает все элементы видимыми? Таким образом, проверка If Pi <> "" And Pi.Visible Then по существу становится If Pi <> "" Then

2. @Nacorid Спасибо за ответ. Я проверил, но фильтр не очищается. Фильтр по-прежнему применяется и отображает правильные данные. Также удалены Application.Screen updating = True и PivotTable.ManualUpdate = True . Инструкция очищает все существующие фильтры, но новый фильтр применяется непосредственно после.

3. Вы пробовали запускать код без строки pvtField.ClearAllFilters , я, честно говоря, не понимаю, почему он там вообще. ClearAllFilters указывает, что все примененные фильтры удалены.

4. @Nacorid да, когда вы упомянули об этом, это было первое, что я сделал — удалил это. Запустил код без этого, но все равно получил тот же результат. Что касается того, почему это там, это для того, чтобы убедиться, что в строке, где я применяю фильтр, применяется только этот фильтр. Если в таблице уже есть какие-либо другие фильтры, то это просто добавит к ним. Ну, вот как я это понимаю в любом случае… Я могу ошибаться..

5. Но где вы применяете какой-либо фильтр? Вы удаляете фильтры только с помощью pvtFiled.ClearAllFilters на каждой итерации по вашему массиву.