Цикл по элементам, которые были отфильтрованы - PullRequest
2 голосов
/ 12 марта 2019

Я пытаюсь скопировать значения данных сводной таблицы в другой лист, но потому что я делаю фильтрацию в сводной таблице, которая «скрывает» несколько меток строк, когда я перебираю сводные элементы поля сводок в метке строки она повторяется несколько раз больше, чем на самом деле. Чтобы проиллюстрировать мою проблему, вот код, который я использую.

Sub Prob()
Dim Ptable1 as PivotTable
Dim PField as PivotField
Dim PField2 as PivotField
Dim NumOfPItem as Long
Dim PItem as PivotItem
Dim aCell as Range

Set Ptable1 = ActiveSheet.PivotTables("PivotTable1")

With Ptable1.PivotFields("DataCol5")
    .CurrentPage = "12/2/2018"
End With

PField = Ptable1.PivotFields("DataCol1")
NumOfPItem = PField.PivotItems.Count

For each PItem in PField.PivotItems
   'Some code to get a cell reference in another worksheet

   'and then some code to copy the value from the pivot table to cells.
   aCell.Offset(0,1).Value = PField2.PivotItems("XX01").DataRange.Cells(PItem.Position,1)
Next PItem
End Sub

Я только что приготовил что-то простое, чтобы оно охватило основную проблему, с которой я столкнулся.

enter image description here

Нефильтрованная сводная таблица:

enter image description here

Полевые мероприятия:

enter image description here

Это сводная таблица после ее фильтрации.

enter image description here

Я пробовал циклически проходить по элементам сводки, которые были видны, используя свойство PivotItems.Visible, но все элементы были видны, следовательно, проходили циклически по всем имеющимся элементам сводки. Ведущий к моему следующему скриншоту.

enter image description here

Как видно, все элементы выбираются таким образом, что при циклическом просмотре всех «видимых» элементов сводки из поля сводки он будет проходить через нее 5 раз, поскольку имеется 5 различных элементов. Тем не менее, в этом примере, после того, как я выполню некоторую фильтрацию, у меня останется всего одна метка строки, поэтому она должна зацикливаться только один раз для того, что присутствует в сводной таблице. Что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019
Sub Solution()
Dim Ptable1 as PivotTable
Dim PField as PivotField
Dim PField2 as PivotField
Dim NumOfRows as Long
Dim PItem as PivotItem
Dim aCell as Range
Dim PFRng as Range
Dim i as long

Set Ptable1 = ActiveSheet.PivotTables("PivotTable1")

With Ptable1.PivotFields("DataCol5")
    .CurrentPage = "12/2/2018"
End With

PField = Ptable1.PivotFields("DataCol1")
PFRng = PField.DataRange
NumOfRows = PFRng.Rows.Count

For i = 1 to NumOfRows
   'Some code to get a cell reference in another worksheet

   'and then some code to copy the value from the pivot table to cells.
   aCell.Offset(0,1).Value = PField2.PivotItems("XX01").DataRange.Cells(i,1)
Next i
End Sub

Я нашел решение. Вместо того чтобы циклически проходить по каждому элементу сводки, найденному в поле сводки, я просто получаю диапазон данных поля сводки, проверяю, сколько строк находится в диапазоне данных, а затем перебираю его, начиная с 1 до последней строки. Таким образом, мне не придется беспокоиться о том, что является видимым. Я могу использовать «i» вместо позиции элемента поворота, чтобы получить значения в той же строке, но в разных полях.

0 голосов
/ 12 марта 2019

Вы должны увидеть, если pivotitem виден.Кроме того, я заметил, что вы используете PI, это может сбивать с толку как PI, так что, возможно, стоит изменить это.

Вот пример

Sub x()

Dim p As PivotTable
Dim pf As PivotField
Dim pit As PivotItem

Set p = ActiveSheet.PivotTables(1)
Set pf = p.PivotFields("Name")

For Each pit In pf.PivotItems
    Debug.Print pit.Visible
Next pit

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