2017-02-17 21 views
3

У меня сводная таблица для объединения "coverage" на "part" только для принятых деталей.Извлечение данных из сводной таблицы vba

enter image description here

Я хочу, чтобы затем извлечь "sum of coverage" на другой лист. Я написал следующий макрос:

Sub Pull_data() 
'Update the pivot table 
Sheets("Pivot").PivotTables("PivotTable2").PivotCache.Refresh 
'clear all filters 
Sheets("Pivot").PivotTables("PivotTable2").PivotFields("Accepted").ClearAllFilters 
'filters only accepted items 
Sheets("Pivot").PivotTables("PivotTable2").PivotFields("Accepted").CurrentPage = "YES" 
'get the last row of the pivot table 
Set PT = Sheets("Pivot").PivotTables("PivotTable2") 
With PT.TableRange1 
    lngLastRow = .rows(.rows.Count).Row 
End With 
For i = 4 To lngLastRow 
    'copy the coverage to destination sheet 
    NEWi = i + 10 
    Sheets("Destination").Range("G" & NEWi) = PivotTable.GetPivotData(data_field, Range("I" & i), “Coverage”) 
Next i 
End Sub 

я получаю ошибку во время выполнения «424», объект, необходимый на

Sheets("Destination").Range("G" & NEWi) = PivotTable.GetPivotData(data_field, Range("I" & i), “Coverage”) 

Какой бы правильный способ, чтобы написать эту линию?

+0

Ваш объект сводной таблицы является 'PT' и не' PivotTable' – Rory

+0

Замена ' PivotTable 'с «PT» все еще дает ошибку «ошибка времени выполнения 1004, определяемая приложением или объектно-зависимая ошибка» –

+0

@ L.Dutch вместо 'Looping' try' TableRange2' (см. Мой код ниже) –

ответ

2

Это должно быть:

Sheets("Destination").Range("G" & i + 10).Value = _ 
    pT.GetPivotData("Sum of coverage", "Part", Range("I" & i).Value).Value 

Потому что pT.GetPivotData возвращает диапазон!

Убирали код:

Sub Pull_data() 
    Dim pT As PivotTable 
    Set pT = Sheets("Pivot").PivotTables("PivotTable2") 

    With pT 
     '''Update the pivot table 
     .PivotCache.Refresh 
     '''clear all filters 
     .PivotFields("Accepted").ClearAllFilters 
     '''filters only accepted items 
     .PivotFields("Accepted").CurrentPage = "YES" 
     '''get the last row of the pivot table 
     With .TableRange1 
      lngLastRow = .Rows(.Rows.Count).Row 
      For i = .Cells(2, 1).Row To lngLastRow 
       Debug.Print "i=" & i & "|" & Sheets("Pivot").Range("I" & i).Value 
       '''copy the coverage to destination sheet 
       Sheets("Destination").Range("G" & i + 10).Value = _ 
        pT.GetPivotData("Sum of coverage", "Part", Sheets("Pivot").Range("I" & i).Value).Value 
      Next i 
     End With '.TableRange1 
    End With 'pT 
End Sub 
+0

это дает «Ошибка времени выполнения 438. Объект не поддерживает это свойство или метод –

+0

@ L.Dutch: у меня плохое опечатка! ;) – R3uK

+0

снова ошибка 438, также с использованием очищенного кода –

2

Вы могли бы попытаться скопировать весь столбец из ваших PivotTable после его фильтрованной вашим потребностям, с TableRange2, используйте Resize в одну колонку, а затем Copy и PasteSpecial xlValues к месту назначения Рабочий лист.

Если приведенный ниже код не совпадает с указанным столбцом, вы можете также использовать Offset(0,1), чтобы получить правильную позицию.

With PT 
    .TableRange2.Resize(.TableRange2.Rows.Count, 1).Copy 
    Worksheets("Destination").Range("G14").PasteSpecial xlValues '<-- start Pasting from Row 14 
End With 

Примечание: если выше код занимает столбец слева, попробуйте строку кода ниже:

.TableRange2.Resize(.TableRange2.Rows.Count, 1).Offset(, 1).Copy 
Смежные вопросы